vexflow
Version:
A JavaScript library for rendering music notation and guitar tablature
1,173 lines (910 loc) • 52.5 kB
HTML
<!DOCTYPE html>
<html>
<head>
<title>factory.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>factory.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.
@author Mohit Cheppudira</p>
<h2 id="description">Description</h2>
<p>This file implements a high level API around VexFlow. It will eventually
become the canonical way to use VexFlow.</p>
<p><em>This API is currently DRAFT</em></p>
<div class='highlight'><pre>
<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> { Accidental } <span class="hljs-keyword">from</span> <span class="hljs-string">'./accidental'</span>;
<span class="hljs-keyword">import</span> { Articulation } <span class="hljs-keyword">from</span> <span class="hljs-string">'./articulation'</span>;
<span class="hljs-keyword">import</span> { Annotation } <span class="hljs-keyword">from</span> <span class="hljs-string">'./annotation'</span>;
<span class="hljs-keyword">import</span> { Formatter } <span class="hljs-keyword">from</span> <span class="hljs-string">'./formatter'</span>;
<span class="hljs-keyword">import</span> { FretHandFinger } <span class="hljs-keyword">from</span> <span class="hljs-string">'./frethandfinger'</span>;
<span class="hljs-keyword">import</span> { StringNumber } <span class="hljs-keyword">from</span> <span class="hljs-string">'./stringnumber'</span>;
<span class="hljs-keyword">import</span> { TextDynamics } <span class="hljs-keyword">from</span> <span class="hljs-string">'./textdynamics'</span>;
<span class="hljs-keyword">import</span> { ModifierContext } <span class="hljs-keyword">from</span> <span class="hljs-string">'./modifiercontext'</span>;
<span class="hljs-keyword">import</span> { MultiMeasureRest } <span class="hljs-keyword">from</span> <span class="hljs-string">'./multimeasurerest'</span>;
<span class="hljs-keyword">import</span> { Renderer } <span class="hljs-keyword">from</span> <span class="hljs-string">'./renderer'</span>;
<span class="hljs-keyword">import</span> { Stave } <span class="hljs-keyword">from</span> <span class="hljs-string">'./stave'</span>;
<span class="hljs-keyword">import</span> { StaveTie } <span class="hljs-keyword">from</span> <span class="hljs-string">'./stavetie'</span>;
<span class="hljs-keyword">import</span> { StaveLine } <span class="hljs-keyword">from</span> <span class="hljs-string">'./staveline'</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> { GlyphNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./glyphnote'</span>;
<span class="hljs-keyword">import</span> { RepeatNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./repeatnote'</span>;
<span class="hljs-keyword">import</span> { StaveConnector } <span class="hljs-keyword">from</span> <span class="hljs-string">'./staveconnector'</span>;
<span class="hljs-keyword">import</span> { System } <span class="hljs-keyword">from</span> <span class="hljs-string">'./system'</span>;
<span class="hljs-keyword">import</span> { TickContext } <span class="hljs-keyword">from</span> <span class="hljs-string">'./tickcontext'</span>;
<span class="hljs-keyword">import</span> { Tuplet } <span class="hljs-keyword">from</span> <span class="hljs-string">'./tuplet'</span>;
<span class="hljs-keyword">import</span> { Voice } <span class="hljs-keyword">from</span> <span class="hljs-string">'./voice'</span>;
<span class="hljs-keyword">import</span> { Beam } <span class="hljs-keyword">from</span> <span class="hljs-string">'./beam'</span>;
<span class="hljs-keyword">import</span> { Curve } <span class="hljs-keyword">from</span> <span class="hljs-string">'./curve'</span>;
<span class="hljs-keyword">import</span> { GraceNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./gracenote'</span>;
<span class="hljs-keyword">import</span> { GraceNoteGroup } <span class="hljs-keyword">from</span> <span class="hljs-string">'./gracenotegroup'</span>;
<span class="hljs-keyword">import</span> { NoteSubGroup } <span class="hljs-keyword">from</span> <span class="hljs-string">'./notesubgroup'</span>;
<span class="hljs-keyword">import</span> { EasyScore } <span class="hljs-keyword">from</span> <span class="hljs-string">'./easyscore'</span>;
<span class="hljs-keyword">import</span> { TimeSigNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./timesignote'</span>;
<span class="hljs-keyword">import</span> { KeySigNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./keysignote'</span>;
<span class="hljs-keyword">import</span> { ClefNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./clefnote'</span>;
<span class="hljs-keyword">import</span> { PedalMarking } <span class="hljs-keyword">from</span> <span class="hljs-string">'./pedalmarking'</span>;
<span class="hljs-keyword">import</span> { TextBracket } <span class="hljs-keyword">from</span> <span class="hljs-string">'./textbracket'</span>;
<span class="hljs-keyword">import</span> { VibratoBracket } <span class="hljs-keyword">from</span> <span class="hljs-string">'./vibratobracket'</span>;
<span class="hljs-keyword">import</span> { GhostNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./ghostnote'</span>;
<span class="hljs-keyword">import</span> { BarNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./barnote'</span>;
<span class="hljs-keyword">import</span> { TabNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./tabnote'</span>;
<span class="hljs-keyword">import</span> { TabStave } <span class="hljs-keyword">from</span> <span class="hljs-string">'./tabstave'</span>;
<span class="hljs-keyword">import</span> { TextNote } <span class="hljs-keyword">from</span> <span class="hljs-string">'./textnote'</span>;</pre></div>
<p>To enable logging for this class. Set <code>Vex.Flow.Factory.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> (Factory.DEBUG) Vex.L(<span class="hljs-string">'Vex.Flow.Factory'</span>, args); }
<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> X = Vex.MakeException(<span class="hljs-string">'FactoryError'</span>);
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setDefaults</span>(<span class="hljs-params">params = {}, defaults</span>) </span>{
<span class="hljs-keyword">const</span> default_options = defaults.options;
params = <span class="hljs-built_in">Object</span>.assign(defaults, params);
params.options = <span class="hljs-built_in">Object</span>.assign(default_options, params.options);
<span class="hljs-keyword">return</span> params;
}
<span class="hljs-keyword">export</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Factory</span> </span>{
<span class="hljs-keyword">constructor</span>(options) {
L(<span class="hljs-string">'New factory: '</span>, options);
<span class="hljs-keyword">const</span> defaults = {
<span class="hljs-attr">stave</span>: {
<span class="hljs-attr">space</span>: <span class="hljs-number">10</span>,
},
<span class="hljs-attr">renderer</span>: {
<span class="hljs-attr">context</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">elementId</span>: <span class="hljs-string">''</span>,
<span class="hljs-attr">backend</span>: Renderer.Backends.SVG,
<span class="hljs-attr">width</span>: <span class="hljs-number">500</span>,
<span class="hljs-attr">height</span>: <span class="hljs-number">200</span>,
<span class="hljs-attr">background</span>: <span class="hljs-string">'#FFF'</span>,
},
<span class="hljs-attr">font</span>: {
<span class="hljs-attr">face</span>: <span class="hljs-string">'Arial'</span>,
<span class="hljs-attr">point</span>: <span class="hljs-number">10</span>,
<span class="hljs-attr">style</span>: <span class="hljs-string">''</span>,
},
};
<span class="hljs-keyword">this</span>.options = defaults;
<span class="hljs-keyword">this</span>.setOptions(options);
}
<span class="hljs-keyword">static</span> newFromElementId(elementId, width = <span class="hljs-number">500</span>, height = <span class="hljs-number">200</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Factory({ <span class="hljs-attr">renderer</span>: { elementId, width, height } });
}
reset() {
<span class="hljs-keyword">this</span>.renderQ = [];
<span class="hljs-keyword">this</span>.systems = [];
<span class="hljs-keyword">this</span>.staves = [];
<span class="hljs-keyword">this</span>.voices = [];
<span class="hljs-keyword">this</span>.stave = <span class="hljs-literal">null</span>; <span class="hljs-comment">// current stave</span>
}
getOptions() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.options; }
setOptions(options) {
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">const</span> key <span class="hljs-keyword">of</span> [<span class="hljs-string">'stave'</span>, <span class="hljs-string">'renderer'</span>, <span class="hljs-string">'font'</span>]) {
<span class="hljs-built_in">Object</span>.assign(<span class="hljs-keyword">this</span>.options[key], options[key]);
}
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.options.renderer.elementId !== <span class="hljs-literal">null</span> || <span class="hljs-keyword">this</span>.options.renderer.context) {
<span class="hljs-keyword">this</span>.initRenderer();
}
<span class="hljs-keyword">this</span>.reset();
}
initRenderer() {
<span class="hljs-keyword">const</span> { elementId, backend, width, height, background } = <span class="hljs-keyword">this</span>.options.renderer;
<span class="hljs-keyword">if</span> (elementId === <span class="hljs-string">''</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> X(<span class="hljs-string">'HTML DOM element not set in Factory'</span>);
}
<span class="hljs-keyword">this</span>.context = Renderer.buildContext(elementId, backend, width, height, background);
}
getContext() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.context; }
setContext(context) { <span class="hljs-keyword">this</span>.context = context; <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>; }
getStave() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.stave; }
getVoices() { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.voices; }</pre></div>
<p>Returns pixels from current stave spacing.</p>
<div class='highlight'><pre> space(spacing) { <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.options.stave.space * spacing; }
Stave(params) {
params = setDefaults(params, {
<span class="hljs-attr">x</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">width</span>: <span class="hljs-keyword">this</span>.options.renderer.width - <span class="hljs-keyword">this</span>.space(<span class="hljs-number">1</span>),
<span class="hljs-attr">options</span>: {
<span class="hljs-attr">spacing_between_lines_px</span>: <span class="hljs-keyword">this</span>.options.stave.space,
},
});
<span class="hljs-keyword">const</span> stave = <span class="hljs-keyword">new</span> Stave(params.x, params.y, params.width, params.options);
<span class="hljs-keyword">this</span>.staves.push(stave);
stave.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.stave = stave;
<span class="hljs-keyword">return</span> stave;
}
TabStave(params) {
params = setDefaults(params, {
<span class="hljs-attr">x</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">width</span>: <span class="hljs-keyword">this</span>.options.renderer.width - <span class="hljs-keyword">this</span>.space(<span class="hljs-number">1</span>),
<span class="hljs-attr">options</span>: {
<span class="hljs-attr">spacing_between_lines_px</span>: <span class="hljs-keyword">this</span>.options.stave.space * <span class="hljs-number">1.3</span>,
},
});
<span class="hljs-keyword">const</span> stave = <span class="hljs-keyword">new</span> TabStave(params.x, params.y, params.width, params.options);
<span class="hljs-keyword">this</span>.staves.push(stave);
stave.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.stave = stave;
<span class="hljs-keyword">return</span> stave;
}
StaveNote(noteStruct) {
<span class="hljs-keyword">const</span> note = <span class="hljs-keyword">new</span> StaveNote(noteStruct);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) note.setStave(<span class="hljs-keyword">this</span>.stave);
note.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(note);
<span class="hljs-keyword">return</span> note;
}
GlyphNote(glyph, noteStruct, options) {
<span class="hljs-keyword">const</span> note = <span class="hljs-keyword">new</span> GlyphNote(glyph, noteStruct, options);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) note.setStave(<span class="hljs-keyword">this</span>.stave);
note.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(note);
<span class="hljs-keyword">return</span> note;
}
RepeatNote(type, noteStruct, options) {
<span class="hljs-keyword">const</span> note = <span class="hljs-keyword">new</span> RepeatNote(type, noteStruct, options);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) note.setStave(<span class="hljs-keyword">this</span>.stave);
note.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(note);
<span class="hljs-keyword">return</span> note;
}
GhostNote(noteStruct) {
<span class="hljs-keyword">const</span> ghostNote = <span class="hljs-keyword">new</span> GhostNote(noteStruct);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) ghostNote.setStave(<span class="hljs-keyword">this</span>.stave);
ghostNote.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(ghostNote);
<span class="hljs-keyword">return</span> ghostNote;
}
TextNote(textNoteStruct) {
<span class="hljs-keyword">const</span> textNote = <span class="hljs-keyword">new</span> TextNote(textNoteStruct);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) textNote.setStave(<span class="hljs-keyword">this</span>.stave);
textNote.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(textNote);
<span class="hljs-keyword">return</span> textNote;
}
BarNote(params) {
params = setDefaults(params, {
<span class="hljs-attr">type</span>: <span class="hljs-string">'single'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> barNote = <span class="hljs-keyword">new</span> BarNote(params.type);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) barNote.setStave(<span class="hljs-keyword">this</span>.stave);
barNote.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(barNote);
<span class="hljs-keyword">return</span> barNote;
}
ClefNote(params) {
params = setDefaults(params, {
<span class="hljs-attr">type</span>: <span class="hljs-string">'treble'</span>,
<span class="hljs-attr">options</span>: {
<span class="hljs-attr">size</span>: <span class="hljs-string">'default'</span>,
},
});
<span class="hljs-keyword">const</span> clefNote = <span class="hljs-keyword">new</span> ClefNote(params.type, params.options.size, params.options.annotation);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) clefNote.setStave(<span class="hljs-keyword">this</span>.stave);
clefNote.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(clefNote);
<span class="hljs-keyword">return</span> clefNote;
}
TimeSigNote(params) {
params = setDefaults(params, {
<span class="hljs-attr">time</span>: <span class="hljs-string">'4/4'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> timeSigNote = <span class="hljs-keyword">new</span> TimeSigNote(params.time);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) timeSigNote.setStave(<span class="hljs-keyword">this</span>.stave);
timeSigNote.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(timeSigNote);
<span class="hljs-keyword">return</span> timeSigNote;
}
KeySigNote(params) {
<span class="hljs-keyword">const</span> keySigNote = <span class="hljs-keyword">new</span> KeySigNote(params.key, params.cancelKey, params.alterKey);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) keySigNote.setStave(<span class="hljs-keyword">this</span>.stave);
keySigNote.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(keySigNote);
<span class="hljs-keyword">return</span> keySigNote;
}
TabNote(noteStruct) {
<span class="hljs-keyword">const</span> note = <span class="hljs-keyword">new</span> TabNote(noteStruct);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) note.setStave(<span class="hljs-keyword">this</span>.stave);
note.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(note);
<span class="hljs-keyword">return</span> note;
}
GraceNote(noteStruct) {
<span class="hljs-keyword">const</span> note = <span class="hljs-keyword">new</span> GraceNote(noteStruct);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) note.setStave(<span class="hljs-keyword">this</span>.stave);
note.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">return</span> note;
}
GraceNoteGroup(params) {
<span class="hljs-keyword">const</span> group = <span class="hljs-keyword">new</span> GraceNoteGroup(params.notes, params.slur);
group.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">return</span> group;
}
Accidental(params) {
params = setDefaults(params, {
<span class="hljs-attr">type</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> accid = <span class="hljs-keyword">new</span> Accidental(params.type);
accid.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">return</span> accid;
}
Annotation(params) {
params = setDefaults(params, {
<span class="hljs-attr">text</span>: <span class="hljs-string">'p'</span>,
<span class="hljs-attr">vJustify</span>: <span class="hljs-string">'below'</span>,
<span class="hljs-attr">hJustify</span>: <span class="hljs-string">'center'</span>,
<span class="hljs-attr">fontFamily</span>: <span class="hljs-string">'Times'</span>,
<span class="hljs-attr">fontSize</span>: <span class="hljs-number">14</span>,
<span class="hljs-attr">fontWeight</span>: <span class="hljs-string">'bold italic'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> annotation = <span class="hljs-keyword">new</span> Annotation(params.text);
annotation.setJustification(params.hJustify);
annotation.setVerticalJustification(params.vJustify);
annotation.setFont(params.fontFamily, params.fontSize, params.fontWeight);
annotation.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">return</span> annotation;
}
Articulation(params) {
params = setDefaults(params, {
<span class="hljs-attr">type</span>: <span class="hljs-string">'a.'</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'above'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> articulation = <span class="hljs-keyword">new</span> Articulation(params.type);
articulation.setPosition(params.position);
articulation.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">return</span> articulation;
}
TextDynamics(params) {
params = setDefaults(params, {
<span class="hljs-attr">text</span>: <span class="hljs-string">'p'</span>,
<span class="hljs-attr">duration</span>: <span class="hljs-string">'q'</span>,
<span class="hljs-attr">dots</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> text = <span class="hljs-keyword">new</span> TextDynamics({
<span class="hljs-attr">text</span>: params.text,
<span class="hljs-attr">line</span>: params.line,
<span class="hljs-attr">duration</span>: params.duration,
<span class="hljs-attr">dots</span>: params.dots,
});
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.stave) text.setStave(<span class="hljs-keyword">this</span>.stave);
text.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(text);
<span class="hljs-keyword">return</span> text;
}
Fingering(params) {
params = setDefaults(params, {
<span class="hljs-attr">number</span>: <span class="hljs-string">'0'</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'left'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> fingering = <span class="hljs-keyword">new</span> FretHandFinger(params.number);
fingering.setPosition(params.position);
fingering.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">return</span> fingering;
}
StringNumber(params) {
params = setDefaults(params, {
<span class="hljs-attr">number</span>: <span class="hljs-string">'0'</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'left'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> stringNumber = <span class="hljs-keyword">new</span> StringNumber(params.number);
stringNumber.setPosition(params.position);
stringNumber.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">return</span> stringNumber;
}
TickContext() {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> TickContext().setContext(<span class="hljs-keyword">this</span>.context);
}
ModifierContext() {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> ModifierContext();
}
MultiMeasureRest(params) {
<span class="hljs-keyword">const</span> multimeasurerest = <span class="hljs-keyword">new</span> MultiMeasureRest(params.number_of_measures, params);
multimeasurerest.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(multimeasurerest);
<span class="hljs-keyword">return</span> multimeasurerest;
}
Voice(params) {
params = setDefaults(params, {
<span class="hljs-attr">time</span>: <span class="hljs-string">'4/4'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> voice = <span class="hljs-keyword">new</span> Voice(params.time, params.options);
<span class="hljs-keyword">this</span>.voices.push(voice);
<span class="hljs-keyword">return</span> voice;
}
StaveConnector(params) {
params = setDefaults(params, {
<span class="hljs-attr">top_stave</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">bottom_stave</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">type</span>: <span class="hljs-string">'double'</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> connector = <span class="hljs-keyword">new</span> StaveConnector(params.top_stave, params.bottom_stave);
connector.setType(params.type).setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(connector);
<span class="hljs-keyword">return</span> connector;
}
Formatter() {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Formatter();
}
Tuplet(params) {
params = setDefaults(params, {
<span class="hljs-attr">notes</span>: [],
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> tuplet = <span class="hljs-keyword">new</span> Tuplet(params.notes, params.options).setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(tuplet);
<span class="hljs-keyword">return</span> tuplet;
}
Beam(params) {
params = setDefaults(params, {
<span class="hljs-attr">notes</span>: [],
<span class="hljs-attr">options</span>: {
<span class="hljs-attr">autoStem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">secondaryBeamBreaks</span>: [],
},
});
<span class="hljs-keyword">const</span> beam = <span class="hljs-keyword">new</span> Beam(params.notes, params.options.autoStem).setContext(<span class="hljs-keyword">this</span>.context);
beam.breakSecondaryAt(params.options.secondaryBeamBreaks);
<span class="hljs-keyword">this</span>.renderQ.push(beam);
<span class="hljs-keyword">return</span> beam;
}
Curve(params) {
params = setDefaults(params, {
<span class="hljs-attr">from</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">to</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> curve = <span class="hljs-keyword">new</span> Curve(params.from, params.to, params.options).setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(curve);
<span class="hljs-keyword">return</span> curve;
}
StaveTie(params) {
params = setDefaults(params, {
<span class="hljs-attr">from</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">to</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">first_indices</span>: [<span class="hljs-number">0</span>],
<span class="hljs-attr">last_indices</span>: [<span class="hljs-number">0</span>],
<span class="hljs-attr">text</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">options</span>: {
<span class="hljs-attr">direction</span>: <span class="hljs-literal">undefined</span>,
},
});
<span class="hljs-keyword">const</span> tie = <span class="hljs-keyword">new</span> StaveTie({
<span class="hljs-attr">first_note</span>: params.from,
<span class="hljs-attr">last_note</span>: params.to,
<span class="hljs-attr">first_indices</span>: params.first_indices,
<span class="hljs-attr">last_indices</span>: params.last_indices,
}, params.text);
<span class="hljs-keyword">if</span> (params.options.direction) tie.setDirection(params.options.direction);
tie.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(tie);
<span class="hljs-keyword">return</span> tie;
}
StaveLine(params) {
params = setDefaults(params, {
<span class="hljs-attr">from</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">to</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">first_indices</span>: [<span class="hljs-number">0</span>],
<span class="hljs-attr">last_indices</span>: [<span class="hljs-number">0</span>],
<span class="hljs-attr">options</span>: {},
});
<span class="hljs-keyword">const</span> line = <span class="hljs-keyword">new</span> StaveLine({
<span class="hljs-attr">first_note</span>: params.from,
<span class="hljs-attr">last_note</span>: params.to,
<span class="hljs-attr">first_indices</span>: params.first_indices,
<span class="hljs-attr">last_indices</span>: params.last_indices,
});
<span class="hljs-keyword">if</span> (params.options.text) line.setText(params.options.text);
<span class="hljs-keyword">if</span> (params.options.font) line.setFont(params.options.font);
line.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(line);
<span class="hljs-keyword">return</span> line;
}
VibratoBracket(params) {
params = setDefaults(params, {
<span class="hljs-attr">from</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">to</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">options</span>: {
<span class="hljs-attr">harsh</span>: <span class="hljs-literal">false</span>,
},
});
<span class="hljs-keyword">const</span> vibratoBracket = <span class="hljs-keyword">new</span> VibratoBracket({
<span class="hljs-attr">start</span>: params.from,
<span class="hljs-attr">stop</span>: params.to,
});
<span class="hljs-keyword">if</span> (params.options.line) vibratoBracket.setLine(params.options.line);
<span class="hljs-keyword">if</span> (params.options.harsh) vibratoBracket.setHarsh(params.options.harsh);
vibratoBracket.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(vibratoBracket);
<span class="hljs-keyword">return</span> vibratoBracket;
}
TextBracket(params) {
params = setDefaults(params, {
<span class="hljs-attr">from</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">to</span>: <span class="hljs-literal">null</span>,
<span class="hljs-attr">text</span>: <span class="hljs-string">''</span>,
<span class="hljs-attr">options</span>: {
<span class="hljs-attr">superscript</span>: <span class="hljs-string">''</span>,
<span class="hljs-attr">position</span>: <span class="hljs-number">1</span>,
},
});
<span class="hljs-keyword">const</span> textBracket = <span class="hljs-keyword">new</span> TextBracket({
<span class="hljs-attr">start</span>: params.from,
<span class="hljs-attr">stop</span>: params.to,
<span class="hljs-attr">text</span>: params.text,
<span class="hljs-attr">superscript</span>: params.options.superscript,
<span class="hljs-attr">position</span>: params.options.position,
});
<span class="hljs-keyword">if</span> (params.options.line) textBracket.setLine(params.options.line);
<span class="hljs-keyword">if</span> (params.options.font) textBracket.setFont(params.options.font);
textBracket.setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.renderQ.push(textBracket);
<span class="hljs-keyword">return</span> textBracket;
}
System(params = {}) {
params.factory = <span class="hljs-keyword">this</span>;
<span class="hljs-keyword">const</span> system = <span class="hljs-keyword">new</span> System(params).setContext(<span class="hljs-keyword">this</span>.context);
<span class="hljs-keyword">this</span>.systems.push(system);
<span class="hljs-keyword">