vexflow
Version:
A JavaScript library for rendering music notation and guitar tablature
1,009 lines (763 loc) • 39.7 kB
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> =></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>) =></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>) =></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>) =></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>) =></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>) =></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>) =></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>) =></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> =></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 && 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> =></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> =></span> note.accid || <span class="hljs-literal">null</span>);
accids.forEach(<span class="hljs-function">(<span class="hljs-params">accid, i</span>) =></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 < dots; i++) note.addDotToAll();
<span class="hljs-keyword">this</span>.commitHooks.forEach(<span class="hljs-function"><span class="hljs-params">fn</span> =></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> =></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> =></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 && <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>