UNPKG

vexflow

Version:

A JavaScript library for rendering music notation and guitar tablature

1,173 lines (910 loc) 52.5 kB
<!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">