UNPKG

vexflow

Version:

A JavaScript library for rendering music notation and guitar tablature

1,009 lines (763 loc) 39.7 kB
<!DOCTYPE html> <html> <head> <title>easyscore.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="public/stylesheets/normalize.css" /> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div class="container"> <div class="page"> <div class="header"> <h1>easyscore.js</h1> <div class="toc"> <h3>Table of Contents</h3> <ol> <li> <a class="source" href="accidental.html"> accidental.js </a> </li> <li> <a class="source" href="annotation.html"> annotation.js </a> </li> <li> <a class="source" href="articulation.html"> articulation.js </a> </li> <li> <a class="source" href="barnote.html"> barnote.js </a> </li> <li> <a class="source" href="beam.html"> beam.js </a> </li> <li> <a class="source" href="bend.html"> bend.js </a> </li> <li> <a class="source" href="boundingbox.html"> boundingbox.js </a> </li> <li> <a class="source" href="boundingboxcomputation.html"> boundingboxcomputation.js </a> </li> <li> <a class="source" href="canvascontext.html"> canvascontext.js </a> </li> <li> <a class="source" href="clef.html"> clef.js </a> </li> <li> <a class="source" href="clefnote.html"> clefnote.js </a> </li> <li> <a class="source" href="crescendo.html"> crescendo.js </a> </li> <li> <a class="source" href="curve.html"> curve.js </a> </li> <li> <a class="source" href="dot.html"> dot.js </a> </li> <li> <a class="source" href="easyscore.html"> easyscore.js </a> </li> <li> <a class="source" href="element.html"> element.js </a> </li> <li> <a class="source" href="factory.html"> factory.js </a> </li> <li> <a class="source" href="formatter.html"> formatter.js </a> </li> <li> <a class="source" href="fraction.html"> fraction.js </a> </li> <li> <a class="source" href="frethandfinger.html"> frethandfinger.js </a> </li> <li> <a class="source" href="ghostnote.html"> ghostnote.js </a> </li> <li> <a class="source" href="glyph.html"> glyph.js </a> </li> <li> <a class="source" href="glyphnote.html"> glyphnote.js </a> </li> <li> <a class="source" href="gracenote.html"> gracenote.js </a> </li> <li> <a class="source" href="gracenotegroup.html"> gracenotegroup.js </a> </li> <li> <a class="source" href="gracetabnote.html"> gracetabnote.js </a> </li> <li> <a class="source" href="index.html"> index.js </a> </li> <li> <a class="source" href="keymanager.html"> keymanager.js </a> </li> <li> <a class="source" href="keysignature.html"> keysignature.js </a> </li> <li> <a class="source" href="keysignote.html"> keysignote.js </a> </li> <li> <a class="source" href="modifier.html"> modifier.js </a> </li> <li> <a class="source" href="modifiercontext.html"> modifiercontext.js </a> </li> <li> <a class="source" href="multimeasurerest.html"> multimeasurerest.js </a> </li> <li> <a class="source" href="music.html"> music.js </a> </li> <li> <a class="source" href="note.html"> note.js </a> </li> <li> <a class="source" href="notehead.html"> notehead.js </a> </li> <li> <a class="source" href="notesubgroup.html"> notesubgroup.js </a> </li> <li> <a class="source" href="ornament.html"> ornament.js </a> </li> <li> <a class="source" href="parser.html"> parser.js </a> </li> <li> <a class="source" href="pedalmarking.html"> pedalmarking.js </a> </li> <li> <a class="source" href="raphaelcontext.html"> raphaelcontext.js </a> </li> <li> <a class="source" href="registry.html"> registry.js </a> </li> <li> <a class="source" href="renderer.html"> renderer.js </a> </li> <li> <a class="source" href="repeatnote.html"> repeatnote.js </a> </li> <li> <a class="source" href="smufl.html"> smufl.js </a> </li> <li> <a class="source" href="stave.html"> stave.js </a> </li> <li> <a class="source" href="stavebarline.html"> stavebarline.js </a> </li> <li> <a class="source" href="staveconnector.html"> staveconnector.js </a> </li> <li> <a class="source" href="stavehairpin.html"> stavehairpin.js </a> </li> <li> <a class="source" href="staveline.html"> staveline.js </a> </li> <li> <a class="source" href="stavemodifier.html"> stavemodifier.js </a> </li> <li> <a class="source" href="stavenote.html"> stavenote.js </a> </li> <li> <a class="source" href="staverepetition.html"> staverepetition.js </a> </li> <li> <a class="source" href="stavesection.html"> stavesection.js </a> </li> <li> <a class="source" href="stavetempo.html"> stavetempo.js </a> </li> <li> <a class="source" href="stavetext.html"> stavetext.js </a> </li> <li> <a class="source" href="stavetie.html"> stavetie.js </a> </li> <li> <a class="source" href="stavevolta.html"> stavevolta.js </a> </li> <li> <a class="source" href="stem.html"> stem.js </a> </li> <li> <a class="source" href="stemmablenote.html"> stemmablenote.js </a> </li> <li> <a class="source" href="stringnumber.html"> stringnumber.js </a> </li> <li> <a class="source" href="strokes.html"> strokes.js </a> </li> <li> <a class="source" href="svgcontext.html"> svgcontext.js </a> </li> <li> <a class="source" href="system.html"> system.js </a> </li> <li> <a class="source" href="tables.html"> tables.js </a> </li> <li> <a class="source" href="tabnote.html"> tabnote.js </a> </li> <li> <a class="source" href="tabslide.html"> tabslide.js </a> </li> <li> <a class="source" href="tabstave.html"> tabstave.js </a> </li> <li> <a class="source" href="tabtie.html"> tabtie.js </a> </li> <li> <a class="source" href="textbracket.html"> textbracket.js </a> </li> <li> <a class="source" href="textdynamics.html"> textdynamics.js </a> </li> <li> <a class="source" href="textnote.html"> textnote.js </a> </li> <li> <a class="source" href="tickable.html"> tickable.js </a> </li> <li> <a class="source" href="tickcontext.html"> tickcontext.js </a> </li> <li> <a class="source" href="timesignature.html"> timesignature.js </a> </li> <li> <a class="source" href="timesignote.html"> timesignote.js </a> </li> <li> <a class="source" href="tremolo.html"> tremolo.js </a> </li> <li> <a class="source" href="tuning.html"> tuning.js </a> </li> <li> <a class="source" href="tuplet.html"> tuplet.js </a> </li> <li> <a class="source" href="vex.html"> vex.js </a> </li> <li> <a class="source" href="vibrato.html"> vibrato.js </a> </li> <li> <a class="source" href="vibratobracket.html"> vibratobracket.js </a> </li> <li> <a class="source" href="voice.html"> voice.js </a> </li> <li> <a class="source" href="voicegroup.html"> voicegroup.js </a> </li> </ol> </div> </div> <p><a href="http://vexflow.com">VexFlow</a> - Copyright (c) Mohit Muthanna 2010.</p> <p>This class implements a parser for a simple language to generate VexFlow objects.</p> <div class='highlight'><pre> <span class="hljs-comment">/* eslint max-classes-per-file: "off" */</span> <span class="hljs-keyword">import</span> { Vex } <span class="hljs-keyword">from</span> <span class="hljs-string">'./vex'</span>; <span class="hljs-keyword">import</span> { StaveNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./stavenote'</span>; <span class="hljs-keyword">import</span> { Parser } <span class="hljs-keyword">from</span> <span class="hljs-string">'./parser'</span>; <span class="hljs-keyword">import</span> { Articulation } <span class="hljs-keyword">from</span> <span class="hljs-string">'./articulation'</span>;</pre></div> <p>To enable logging for this class. Set <code>Vex.Flow.EasyScore.DEBUG</code> to <code>true</code>.</p> <div class='highlight'><pre><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">L</span>(<span class="hljs-params">...args</span>) </span>{ <span class="hljs-keyword">if</span> (EasyScore.DEBUG) Vex.L(<span class="hljs-string">'Vex.Flow.EasyScore'</span>, args); } <span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> X = Vex.MakeException(<span class="hljs-string">'EasyScoreError'</span>); <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Grammar</span> </span>{ <span class="hljs-keyword">constructor</span>(builder) { <span class="hljs-keyword">this</span>.builder = builder; } begin() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.LINE; } LINE() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.PIECE, <span class="hljs-keyword">this</span>.PIECES, <span class="hljs-keyword">this</span>.EOL], }; } PIECE() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.CHORDORNOTE, <span class="hljs-keyword">this</span>.PARAMS], <span class="hljs-attr">run</span>: <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> <span class="hljs-keyword">this</span>.builder.commitPiece(), }; } PIECES() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.COMMA, <span class="hljs-keyword">this</span>.PIECE], <span class="hljs-attr">zeroOrMore</span>: <span class="hljs-literal">true</span>, }; } PARAMS() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.DURATION, <span class="hljs-keyword">this</span>.TYPE, <span class="hljs-keyword">this</span>.DOTS, <span class="hljs-keyword">this</span>.OPTS], }; } CHORDORNOTE() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.CHORD, <span class="hljs-keyword">this</span>.SINGLENOTE], <span class="hljs-attr">or</span>: <span class="hljs-literal">true</span>, }; } CHORD() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.LPAREN, <span class="hljs-keyword">this</span>.NOTES, <span class="hljs-keyword">this</span>.RPAREN], <span class="hljs-attr">run</span>: <span class="hljs-function">(<span class="hljs-params">state</span>) =&gt;</span> <span class="hljs-keyword">this</span>.builder.addChord(state.matches[<span class="hljs-number">1</span>]), }; } NOTES() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.NOTE], <span class="hljs-attr">oneOrMore</span>: <span class="hljs-literal">true</span>, }; } NOTE() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.NOTENAME, <span class="hljs-keyword">this</span>.ACCIDENTAL, <span class="hljs-keyword">this</span>.OCTAVE], }; } SINGLENOTE() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.NOTENAME, <span class="hljs-keyword">this</span>.ACCIDENTAL, <span class="hljs-keyword">this</span>.OCTAVE], <span class="hljs-attr">run</span>: <span class="hljs-function">(<span class="hljs-params">state</span>) =&gt;</span> <span class="hljs-keyword">this</span>.builder.addSingleNote(state.matches[<span class="hljs-number">0</span>], state.matches[<span class="hljs-number">1</span>], state.matches[<span class="hljs-number">2</span>]), }; } ACCIDENTAL() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.ACCIDENTALS], <span class="hljs-attr">maybe</span>: <span class="hljs-literal">true</span>, }; } DOTS() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.DOT], <span class="hljs-attr">zeroOrMore</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">run</span>: <span class="hljs-function">(<span class="hljs-params">state</span>) =&gt;</span> <span class="hljs-keyword">this</span>.builder.setNoteDots(state.matches[<span class="hljs-number">0</span>]), }; } TYPE() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.SLASH, <span class="hljs-keyword">this</span>.MAYBESLASH, <span class="hljs-keyword">this</span>.TYPES], <span class="hljs-attr">maybe</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">run</span>: <span class="hljs-function">(<span class="hljs-params">state</span>) =&gt;</span> <span class="hljs-keyword">this</span>.builder.setNoteType(state.matches[<span class="hljs-number">2</span>]), }; } DURATION() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.SLASH, <span class="hljs-keyword">this</span>.DURATIONS], <span class="hljs-attr">maybe</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">run</span>: <span class="hljs-function">(<span class="hljs-params">state</span>) =&gt;</span> <span class="hljs-keyword">this</span>.builder.setNoteDuration(state.matches[<span class="hljs-number">1</span>]), }; } OPTS() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.LBRACKET, <span class="hljs-keyword">this</span>.KEYVAL, <span class="hljs-keyword">this</span>.KEYVALS, <span class="hljs-keyword">this</span>.RBRACKET], <span class="hljs-attr">maybe</span>: <span class="hljs-literal">true</span>, }; } KEYVALS() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.COMMA, <span class="hljs-keyword">this</span>.KEYVAL], <span class="hljs-attr">zeroOrMore</span>: <span class="hljs-literal">true</span>, }; } KEYVAL() { <span class="hljs-keyword">const</span> unquote = <span class="hljs-function">(<span class="hljs-params">str</span>) =&gt;</span> str.slice(<span class="hljs-number">1</span>, <span class="hljs-number">-1</span>); <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.KEY, <span class="hljs-keyword">this</span>.EQUALS, <span class="hljs-keyword">this</span>.VAL], <span class="hljs-attr">run</span>: <span class="hljs-function">(<span class="hljs-params">state</span>) =&gt;</span> <span class="hljs-keyword">this</span>.builder.addNoteOption(state.matches[<span class="hljs-number">0</span>], unquote(state.matches[<span class="hljs-number">2</span>])), }; } VAL() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">expect</span>: [<span class="hljs-keyword">this</span>.SVAL, <span class="hljs-keyword">this</span>.DVAL], <span class="hljs-attr">or</span>: <span class="hljs-literal">true</span>, }; } KEY() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[a-zA-Z][a-zA-Z0-9]*'</span> }; } DVAL() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'["][^"]*["]'</span> }; } SVAL() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">"['][^']*[']"</span> }; } NOTENAME() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[a-gA-G]'</span> }; } OCTAVE() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[0-9]+'</span> }; } ACCIDENTALS() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'bbs|bb|bss|bs|b|db|d|##|#|n|\\+\\+-|\\+-|\\+\\+|\\+|k|o'</span> }; } DURATIONS() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[0-9whq]+'</span> }; } TYPES() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[rRsSxX]'</span> }; } LPAREN() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[(]'</span> }; } RPAREN() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[)]'</span> }; } COMMA() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[,]'</span> }; } DOT() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[.]'</span> }; } SLASH() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[/]'</span> }; } MAYBESLASH() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[/]?'</span> }; } EQUALS() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'[=]'</span> }; } LBRACKET() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'\\['</span> }; } RBRACKET() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'\\]'</span> }; } EOL() { <span class="hljs-keyword">return</span> { <span class="hljs-attr">token</span>: <span class="hljs-string">'$'</span> }; } } <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Builder</span> </span>{ <span class="hljs-keyword">constructor</span>(factory) { <span class="hljs-keyword">this</span>.factory = factory; <span class="hljs-keyword">this</span>.commitHooks = []; <span class="hljs-keyword">this</span>.reset(); } reset(options = {}) { <span class="hljs-keyword">this</span>.options = { <span class="hljs-attr">stem</span>: <span class="hljs-string">'auto'</span>, <span class="hljs-attr">clef</span>: <span class="hljs-string">'treble'</span>, }; <span class="hljs-keyword">this</span>.elements = { <span class="hljs-attr">notes</span>: [], <span class="hljs-attr">accidentals</span>: [], }; <span class="hljs-keyword">this</span>.rollingDuration = <span class="hljs-string">'8'</span>; <span class="hljs-keyword">this</span>.resetPiece(); <span class="hljs-built_in">Object</span>.assign(<span class="hljs-keyword">this</span>.options, options); } getFactory() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.factory; } getElements() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.elements; } addCommitHook(commitHook) { <span class="hljs-keyword">this</span>.commitHooks.push(commitHook); } resetPiece() { L(<span class="hljs-string">'resetPiece'</span>); <span class="hljs-keyword">this</span>.piece = { <span class="hljs-attr">chord</span>: [], <span class="hljs-attr">duration</span>: <span class="hljs-keyword">this</span>.rollingDuration, <span class="hljs-attr">dots</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">type</span>: <span class="hljs-literal">undefined</span>, <span class="hljs-attr">options</span>: {}, }; } setNoteDots(dots) { L(<span class="hljs-string">'setNoteDots:'</span>, dots); <span class="hljs-keyword">if</span> (dots) <span class="hljs-keyword">this</span>.piece.dots = dots.length; } setNoteDuration(duration) { L(<span class="hljs-string">'setNoteDuration:'</span>, duration); <span class="hljs-keyword">this</span>.rollingDuration = <span class="hljs-keyword">this</span>.piece.duration = duration || <span class="hljs-keyword">this</span>.rollingDuration; } setNoteType(type) { L(<span class="hljs-string">'setNoteType:'</span>, type); <span class="hljs-keyword">if</span> (type) <span class="hljs-keyword">this</span>.piece.type = type; } addNoteOption(key, value) { L(<span class="hljs-string">'addNoteOption: key:'</span>, key, <span class="hljs-string">'value:'</span>, value); <span class="hljs-keyword">this</span>.piece.options[key] = value; } addNote(key, accid, octave) { L(<span class="hljs-string">'addNote:'</span>, key, accid, octave); <span class="hljs-keyword">this</span>.piece.chord.push({ key, accid, octave }); } addSingleNote(key, accid, octave) { L(<span class="hljs-string">'addSingleNote:'</span>, key, accid, octave); <span class="hljs-keyword">this</span>.addNote(key, accid, octave); } addChord(notes) { L(<span class="hljs-string">'startChord'</span>); <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> (notes[<span class="hljs-number">0</span>]) !== <span class="hljs-string">'object'</span>) { <span class="hljs-keyword">this</span>.addSingleNote(notes[<span class="hljs-number">0</span>]); } <span class="hljs-keyword">else</span> { notes.forEach(<span class="hljs-function"><span class="hljs-params">n</span> =&gt;</span> { <span class="hljs-keyword">if</span> (n) <span class="hljs-keyword">this</span>.addNote(...n); }); } L(<span class="hljs-string">'endChord'</span>); } commitPiece() { L(<span class="hljs-string">'commitPiece'</span>); <span class="hljs-keyword">const</span> { factory } = <span class="hljs-keyword">this</span>; <span class="hljs-keyword">if</span> (!factory) <span class="hljs-keyword">return</span>; <span class="hljs-keyword">const</span> options = { ...this.options, ...this.piece.options }; <span class="hljs-keyword">const</span> { stem, clef } = options; <span class="hljs-keyword">const</span> autoStem = stem.toLowerCase() === <span class="hljs-string">'auto'</span>; <span class="hljs-keyword">const</span> stemDirection = !autoStem &amp;&amp; stem.toLowerCase() === <span class="hljs-string">'up'</span> ? StaveNote.STEM_UP : StaveNote.STEM_DOWN;</pre></div> <p>Build StaveNotes.</p> <div class='highlight'><pre> <span class="hljs-keyword">const</span> { chord, duration, dots, type } = <span class="hljs-keyword">this</span>.piece; <span class="hljs-keyword">const</span> keys = chord.map(<span class="hljs-function"><span class="hljs-params">note</span> =&gt;</span> note.key + <span class="hljs-string">'/'</span> + note.octave); <span class="hljs-keyword">const</span> note = factory.StaveNote({ keys, duration, dots, type, clef, <span class="hljs-attr">auto_stem</span>: autoStem, }); <span class="hljs-keyword">if</span> (!autoStem) note.setStemDirection(stemDirection);</pre></div> <p>Attach accidentals.</p> <div class='highlight'><pre> <span class="hljs-keyword">const</span> accids = chord.map(<span class="hljs-function"><span class="hljs-params">note</span> =&gt;</span> note.accid || <span class="hljs-literal">null</span>); accids.forEach(<span class="hljs-function">(<span class="hljs-params">accid, i</span>) =&gt;</span> { <span class="hljs-keyword">if</span> (accid) note.addAccidental(i, factory.Accidental({ <span class="hljs-attr">type</span>: accid })); });</pre></div> <p>Attach dots.</p> <div class='highlight'><pre> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; dots; i++) note.addDotToAll(); <span class="hljs-keyword">this</span>.commitHooks.forEach(<span class="hljs-function"><span class="hljs-params">fn</span> =&gt;</span> fn(options, note, <span class="hljs-keyword">this</span>)); <span class="hljs-keyword">this</span>.elements.notes.push(note); <span class="hljs-keyword">this</span>.elements.accidentals.concat(accids); <span class="hljs-keyword">this</span>.resetPiece(); } } <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setId</span>(<span class="hljs-params">{ id }, note</span>) </span>{ <span class="hljs-keyword">if</span> (id === <span class="hljs-literal">undefined</span>) <span class="hljs-keyword">return</span>; note.setAttribute(<span class="hljs-string">'id'</span>, id); } <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setClass</span>(<span class="hljs-params">options, note</span>) </span>{ <span class="hljs-keyword">if</span> (!options.class) <span class="hljs-keyword">return</span>; <span class="hljs-keyword">const</span> commaSeparatedRegex = <span class="hljs-regexp">/\s*,\s*/</span>; options.class .split(commaSeparatedRegex) .forEach(<span class="hljs-function"><span class="hljs-params">className</span> =&gt;</span> note.addClass(className)); } <span class="hljs-keyword">export</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EasyScore</span> </span>{ <span class="hljs-keyword">constructor</span>(options = {}) { <span class="hljs-keyword">this</span>.setOptions(options); <span class="hljs-keyword">this</span>.defaults = { <span class="hljs-attr">clef</span>: <span class="hljs-string">'treble'</span>, <span class="hljs-attr">time</span>: <span class="hljs-string">'4/4'</span>, <span class="hljs-attr">stem</span>: <span class="hljs-string">'auto'</span>, }; } set(defaults) { <span class="hljs-built_in">Object</span>.assign(<span class="hljs-keyword">this</span>.defaults, defaults); <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>; } setOptions(options) { <span class="hljs-keyword">this</span>.options = { <span class="hljs-attr">factory</span>: <span class="hljs-literal">null</span>, <span class="hljs-attr">builder</span>: <span class="hljs-literal">null</span>, <span class="hljs-attr">commitHooks</span>: [ setId, setClass, Articulation.easyScoreHook, ], <span class="hljs-attr">throwOnError</span>: <span class="hljs-literal">false</span>, ...options }; <span class="hljs-keyword">this</span>.factory = <span class="hljs-keyword">this</span>.options.factory; <span class="hljs-keyword">this</span>.builder = <span class="hljs-keyword">this</span>.options.builder || <span class="hljs-keyword">new</span> Builder(<span class="hljs-keyword">this</span>.factory); <span class="hljs-keyword">this</span>.grammar = <span class="hljs-keyword">new</span> Grammar(<span class="hljs-keyword">this</span>.builder); <span class="hljs-keyword">this</span>.parser = <span class="hljs-keyword">new</span> Parser(<span class="hljs-keyword">this</span>.grammar); <span class="hljs-keyword">this</span>.options.commitHooks.forEach(<span class="hljs-function"><span class="hljs-params">commitHook</span> =&gt;</span> <span class="hljs-keyword">this</span>.addCommitHook(commitHook)); <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>; } setContext(context) { <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.factory) <span class="hljs-keyword">this</span>.factory.setContext(context); <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>; } parse(line, options = {}) { <span class="hljs-keyword">this</span>.builder.reset(options); <span class="hljs-keyword">const</span> result = <span class="hljs-keyword">this</span>.parser.parse(line); <span class="hljs-keyword">if</span> (!result.success &amp;&amp; <span class="hljs-keyword">this</span>.options.throwOnError) { <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> X(<span class="hljs-string">'Error parsing line: '</span> + line, result); } <span class="hljs-keyword">return</span> result; } beam(notes, options = {}) { <span class="hljs-keyword">this</span>.factory.Beam({ notes, options }); <span class="hljs-keyword">return</span> notes; } tuplet(notes, options = {}) { <span class="hljs-keyword">this</span>.factory.Tuplet({ notes, options }); <span class="hljs-keyword">return</span> notes; } notes(line, options = {}) { options = { <span class="hljs-attr">clef</span>: <span class="hljs-keyword">this</span>.defaults.clef, <span class="hljs-attr">stem</span>: <span class="hljs-keyword">this</span>.defaults.stem, ...options }; <span class="hljs-keyword">this</span>.parse(line, options); <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.builder.getElements().notes; } voice(notes, voiceOptions) { voiceOptions = { <span class="hljs-attr">time</span>: <span class="hljs-keyword">this</span>.defaults.time, ...voiceOptions }; <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.factory.Voice(voiceOptions).addTickables(notes); } addCommitHook(commitHook) { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.builder.addCommitHook(commitHook); } }</pre></div> <div class="fleur">h</div> </div> </div> </body> </html>