vexflow
Version:
A JavaScript library for rendering music notation and guitar tablature
2,052 lines • 123 kB
HTML
<!DOCTYPE html>
<html>
<head>
<title>tables.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>tables.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="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="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>
<div class='highlight'><pre>
<span class="hljs-comment">/* eslint-disable key-spacing */</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> { Fraction } <span class="hljs-keyword">from</span> <span class="hljs-string">'./fraction'</span>;
<span class="hljs-keyword">import</span> { Glyph } <span class="hljs-keyword">from</span> <span class="hljs-string">'./glyph'</span>;
<span class="hljs-keyword">const</span> Flow = {
<span class="hljs-attr">STEM_WIDTH</span>: <span class="hljs-number">1.5</span>,
<span class="hljs-attr">STEM_HEIGHT</span>: <span class="hljs-number">35</span>,
<span class="hljs-attr">STAVE_LINE_THICKNESS</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">RESOLUTION</span>: <span class="hljs-number">16384</span>,
<span class="hljs-attr">DEFAULT_NOTATION_FONT_SCALE</span>: <span class="hljs-number">39</span>,
<span class="hljs-attr">DEFAULT_TABLATURE_FONT_SCALE</span>: <span class="hljs-number">39</span>,
<span class="hljs-attr">SLASH_NOTEHEAD_WIDTH</span>: <span class="hljs-number">15</span>,</pre></div>
<p>HACK:
Since text origins are positioned at the baseline, we must
compensate for the ascender of the text. Of course, 1 staff space is
a very poor approximation.</p>
<p>This will be deprecated in the future. This is a temporary solution until
we have more robust text metrics.</p>
<div class='highlight'><pre> TEXT_HEIGHT_OFFSET_HACK: <span class="hljs-number">1</span>,
<span class="hljs-comment">/* Kerning (DEPRECATED) */</span>
IsKerned: <span class="hljs-literal">true</span>,
};
Flow.clefProperties = <span class="hljs-function"><span class="hljs-params">clef</span> =></span> {
<span class="hljs-keyword">if</span> (!clef) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArgument'</span>, <span class="hljs-string">'Invalid clef: '</span> + clef);
<span class="hljs-keyword">const</span> props = Flow.clefProperties.values[clef];
<span class="hljs-keyword">if</span> (!props) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArgument'</span>, <span class="hljs-string">'Invalid clef: '</span> + clef);
<span class="hljs-keyword">return</span> props;
};
Flow.clefProperties.values = {
<span class="hljs-string">'treble'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">0</span> },
<span class="hljs-string">'bass'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">6</span> },
<span class="hljs-string">'tenor'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'alto'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">3</span> },
<span class="hljs-string">'soprano'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">1</span> },
<span class="hljs-string">'percussion'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">0</span> },
<span class="hljs-string">'mezzo-soprano'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">2</span> },
<span class="hljs-string">'baritone-c'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">5</span> },
<span class="hljs-string">'baritone-f'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">5</span> },
<span class="hljs-string">'subbass'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">7</span> },
<span class="hljs-string">'french'</span>: { <span class="hljs-attr">line_shift</span>: <span class="hljs-number">-1</span> },
};
<span class="hljs-comment">/*
Take a note in the format "Key/Octave" (e.g., "C/5") and return properties.
The last argument, params, is a struct the currently can contain one option,
octave_shift for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).
*/</span>
Flow.keyProperties = <span class="hljs-function">(<span class="hljs-params">key, clef, params</span>) =></span> {
<span class="hljs-keyword">if</span> (clef === <span class="hljs-literal">undefined</span>) {
clef = <span class="hljs-string">'treble'</span>;
}
<span class="hljs-keyword">const</span> options = { <span class="hljs-attr">octave_shift</span>: <span class="hljs-number">0</span> };
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> params === <span class="hljs-string">'object'</span>) {
Vex.Merge(options, params);
}
<span class="hljs-keyword">const</span> pieces = key.split(<span class="hljs-string">'/'</span>);
<span class="hljs-keyword">if</span> (pieces.length < <span class="hljs-number">2</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArguments'</span>, <span class="hljs-string">`Key must have note + octave and an optional glyph: <span class="hljs-subst">${key}</span>`</span>);
}
<span class="hljs-keyword">const</span> k = pieces[<span class="hljs-number">0</span>].toUpperCase();
<span class="hljs-keyword">const</span> value = Flow.keyProperties.note_values[k];
<span class="hljs-keyword">if</span> (!value) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArguments'</span>, <span class="hljs-string">'Invalid key name: '</span> + k);
<span class="hljs-keyword">if</span> (value.octave) pieces[<span class="hljs-number">1</span>] = value.octave;
<span class="hljs-keyword">let</span> octave = <span class="hljs-built_in">parseInt</span>(pieces[<span class="hljs-number">1</span>], <span class="hljs-number">10</span>);</pre></div>
<p>Octave_shift is the shift to compensate for clef 8va/8vb.</p>
<div class='highlight'><pre> octave += <span class="hljs-number">-1</span> * options.octave_shift;
<span class="hljs-keyword">const</span> base_index = (octave * <span class="hljs-number">7</span>) - (<span class="hljs-number">4</span> * <span class="hljs-number">7</span>);
<span class="hljs-keyword">let</span> line = (base_index + value.index) / <span class="hljs-number">2</span>;
line += Flow.clefProperties(clef).line_shift;
<span class="hljs-keyword">let</span> stroke = <span class="hljs-number">0</span>;
<span class="hljs-keyword">if</span> (line <= <span class="hljs-number">0</span> && (((line * <span class="hljs-number">2</span>) % <span class="hljs-number">2</span>) === <span class="hljs-number">0</span>)) stroke = <span class="hljs-number">1</span>; <span class="hljs-comment">// stroke up</span>
<span class="hljs-keyword">if</span> (line >= <span class="hljs-number">6</span> && (((line * <span class="hljs-number">2</span>) % <span class="hljs-number">2</span>) === <span class="hljs-number">0</span>)) stroke = <span class="hljs-number">-1</span>; <span class="hljs-comment">// stroke down</span></pre></div>
<p>Integer value for note arithmetic.</p>
<div class='highlight'><pre> <span class="hljs-keyword">const</span> int_value = <span class="hljs-keyword">typeof</span> (value.int_val) !== <span class="hljs-string">'undefined'</span>
? (octave * <span class="hljs-number">12</span>) + value.int_val
: <span class="hljs-literal">null</span>;
<span class="hljs-comment">/* Check if the user specified a glyph. */</span>
<span class="hljs-keyword">let</span> code = value.code;
<span class="hljs-keyword">let</span> shift_right = value.shift_right;
<span class="hljs-keyword">if</span> (pieces.length > <span class="hljs-number">2</span> && pieces[<span class="hljs-number">2</span>]) {
<span class="hljs-keyword">const</span> glyph_name = pieces[<span class="hljs-number">2</span>].toUpperCase();
<span class="hljs-keyword">const</span> note_glyph = Flow.keyProperties.note_glyph[glyph_name];
<span class="hljs-keyword">if</span> (note_glyph) {
code = note_glyph.code;
shift_right = note_glyph.shift_right;
}
}
<span class="hljs-keyword">return</span> {
<span class="hljs-attr">key</span>: k,
octave,
line,
int_value,
<span class="hljs-attr">accidental</span>: value.accidental,
code,
stroke,
shift_right,
<span class="hljs-attr">displaced</span>: <span class="hljs-literal">false</span>,
};
};
Flow.keyProperties.note_values = {
<span class="hljs-string">'C'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-literal">null</span> },
<span class="hljs-string">'CN'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'n'</span> },
<span class="hljs-string">'C#'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'#'</span> },
<span class="hljs-string">'C##'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'##'</span> },
<span class="hljs-string">'CB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">-1</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'b'</span> },
<span class="hljs-string">'CBB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">-2</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'bb'</span> },
<span class="hljs-string">'D'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-literal">null</span> },
<span class="hljs-string">'DN'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'n'</span> },
<span class="hljs-string">'D#'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'#'</span> },
<span class="hljs-string">'D##'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'##'</span> },
<span class="hljs-string">'DB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'b'</span> },
<span class="hljs-string">'DBB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">1</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'bb'</span> },
<span class="hljs-string">'E'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-literal">null</span> },
<span class="hljs-string">'EN'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'n'</span> },
<span class="hljs-string">'E#'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'#'</span> },
<span class="hljs-string">'E##'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'##'</span> },
<span class="hljs-string">'EB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'b'</span> },
<span class="hljs-string">'EBB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'bb'</span> },
<span class="hljs-string">'F'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-literal">null</span> },
<span class="hljs-string">'FN'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'n'</span> },
<span class="hljs-string">'F#'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'#'</span> },
<span class="hljs-string">'F##'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">7</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'##'</span> },
<span class="hljs-string">'FB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'b'</span> },
<span class="hljs-string">'FBB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'bb'</span> },
<span class="hljs-string">'G'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">7</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-literal">null</span> },
<span class="hljs-string">'GN'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">7</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'n'</span> },
<span class="hljs-string">'G#'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">8</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'#'</span> },
<span class="hljs-string">'G##'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">9</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'##'</span> },
<span class="hljs-string">'GB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'b'</span> },
<span class="hljs-string">'GBB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'bb'</span> },
<span class="hljs-string">'A'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">9</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-literal">null</span> },
<span class="hljs-string">'AN'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">9</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'n'</span> },
<span class="hljs-string">'A#'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">10</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'#'</span> },
<span class="hljs-string">'A##'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">11</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'##'</span> },
<span class="hljs-string">'AB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">8</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'b'</span> },
<span class="hljs-string">'ABB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">5</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">7</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'bb'</span> },
<span class="hljs-string">'B'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">11</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-literal">null</span> },
<span class="hljs-string">'BN'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">11</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'n'</span> },
<span class="hljs-string">'B#'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">12</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'#'</span> },
<span class="hljs-string">'B##'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">13</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'##'</span> },
<span class="hljs-string">'BB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">10</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'b'</span> },
<span class="hljs-string">'BBB'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">9</span>, <span class="hljs-attr">accidental</span>: <span class="hljs-string">'bb'</span> },
<span class="hljs-string">'R'</span>: { <span class="hljs-attr">index</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">int_val</span>: <span class="hljs-number">9</span>, <span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span> }, <span class="hljs-comment">// Rest</span>
<span class="hljs-string">'X'</span>: {
<span class="hljs-attr">index</span>: <span class="hljs-number">6</span>,
<span class="hljs-attr">accidental</span>: <span class="hljs-string">''</span>,
<span class="hljs-attr">octave</span>: <span class="hljs-number">4</span>,
<span class="hljs-attr">code</span>: <span class="hljs-string">'v3e'</span>,
<span class="hljs-attr">shift_right</span>: <span class="hljs-number">5.5</span>,
},
};
Flow.keyProperties.note_glyph = {
<span class="hljs-comment">/* Diamond */</span>
<span class="hljs-string">'D0'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v27'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-0.5</span> },
<span class="hljs-string">'D1'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v2d'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-0.5</span> },
<span class="hljs-string">'D2'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v22'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-0.5</span> },
<span class="hljs-string">'D3'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v70'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-0.5</span> },
<span class="hljs-comment">/* Triangle */</span>
<span class="hljs-string">'T0'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v49'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-2</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">-4</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'T1'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v93'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0.5</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">-4</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'T2'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v40'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0.5</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">-4</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'T3'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v7d'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0.5</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">-4</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">4</span> },
<span class="hljs-comment">/* Cross */</span>
<span class="hljs-string">'X0'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v92'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-2</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'X1'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v95'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-0.5</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'X2'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v3e'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0.5</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">4</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'X3'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v3b'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">-2</span>, <span class="hljs-attr">stem_up_y_offset</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">stem_down_y_offset</span>: <span class="hljs-number">2</span> },
<span class="hljs-comment">/* Square */</span>
<span class="hljs-string">'S1'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd3'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0</span> },
<span class="hljs-string">'S2'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd2'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0</span> },
<span class="hljs-comment">/* Rectangle */</span>
<span class="hljs-string">'R1'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd5'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0</span> },
<span class="hljs-string">'R2'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd4'</span>, <span class="hljs-attr">shift_right</span>: <span class="hljs-number">0</span> },
};
Flow.integerToNote = <span class="hljs-function"><span class="hljs-params">integer</span> =></span> {
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> (integer) === <span class="hljs-string">'undefined'</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArguments'</span>, <span class="hljs-string">'Undefined integer for integerToNote'</span>);
}
<span class="hljs-keyword">if</span> (integer < <span class="hljs-number">-2</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArguments'</span>, <span class="hljs-string">`integerToNote requires integer > -2: <span class="hljs-subst">${integer}</span>`</span>);
}
<span class="hljs-keyword">const</span> noteValue = Flow.integerToNote.table[integer];
<span class="hljs-keyword">if</span> (!noteValue) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArguments'</span>, <span class="hljs-string">`Unknown note value for integer: <span class="hljs-subst">${integer}</span>`</span>);
}
<span class="hljs-keyword">return</span> noteValue;
};
Flow.integerToNote.table = {
<span class="hljs-number">0</span>: <span class="hljs-string">'C'</span>,
<span class="hljs-number">1</span>: <span class="hljs-string">'C#'</span>,
<span class="hljs-number">2</span>: <span class="hljs-string">'D'</span>,
<span class="hljs-number">3</span>: <span class="hljs-string">'D#'</span>,
<span class="hljs-number">4</span>: <span class="hljs-string">'E'</span>,
<span class="hljs-number">5</span>: <span class="hljs-string">'F'</span>,
<span class="hljs-number">6</span>: <span class="hljs-string">'F#'</span>,
<span class="hljs-number">7</span>: <span class="hljs-string">'G'</span>,
<span class="hljs-number">8</span>: <span class="hljs-string">'G#'</span>,
<span class="hljs-number">9</span>: <span class="hljs-string">'A'</span>,
<span class="hljs-number">10</span>: <span class="hljs-string">'A#'</span>,
<span class="hljs-number">11</span>: <span class="hljs-string">'B'</span>,
};
Flow.tabToGlyph = <span class="hljs-function">(<span class="hljs-params">fret, scale = <span class="hljs-number">1.0</span></span>) =></span> {
<span class="hljs-keyword">let</span> glyph = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">let</span> width = <span class="hljs-number">0</span>;
<span class="hljs-keyword">let</span> shift_y = <span class="hljs-number">0</span>;
<span class="hljs-keyword">if</span> (fret.toString().toUpperCase() === <span class="hljs-string">'X'</span>) {
<span class="hljs-keyword">const</span> glyphMetrics = <span class="hljs-keyword">new</span> Glyph(<span class="hljs-string">'v7f'</span>, Flow.DEFAULT_TABLATURE_FONT_SCALE).getMetrics();
glyph = <span class="hljs-string">'v7f'</span>;
width = glyphMetrics.width;
shift_y = -glyphMetrics.height / <span class="hljs-number">2</span>;
} <span class="hljs-keyword">else</span> {
width = Flow.textWidth(fret.toString());
}
<span class="hljs-keyword">return</span> {
<span class="hljs-attr">text</span>: fret,
<span class="hljs-attr">code</span>: glyph,
<span class="hljs-attr">getWidth</span>: <span class="hljs-function"><span class="hljs-params">()</span> =></span> width * scale,
shift_y,
};
};
Flow.textWidth = <span class="hljs-function"><span class="hljs-params">text</span> =></span> <span class="hljs-number">7</span> * text.toString().length;
Flow.articulationCodes = <span class="hljs-function"><span class="hljs-params">artic</span> =></span> Flow.articulationCodes.articulations[artic];
Flow.articulationCodes.articulations = {
<span class="hljs-string">'a.'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v23'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">true</span> }, <span class="hljs-comment">// Staccato</span>
<span class="hljs-string">'av'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v28'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">true</span> }, <span class="hljs-comment">// Staccatissimo</span>
<span class="hljs-string">'a>'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v42'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">true</span> }, <span class="hljs-comment">// Accent</span>
<span class="hljs-string">'a-'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v25'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">true</span> }, <span class="hljs-comment">// Tenuto</span>
<span class="hljs-string">'a^'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'va'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Marcato</span>
<span class="hljs-string">'a+'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v8b'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Left hand pizzicato</span>
<span class="hljs-string">'ao'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v94'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Snap pizzicato</span>
<span class="hljs-string">'ah'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vb9'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Natural harmonic or open note</span>
<span class="hljs-string">'a@a'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v43'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Fermata above staff</span>
<span class="hljs-string">'a@u'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v5b'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Fermata below staff</span>
<span class="hljs-string">'a|'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v75'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Bow up - up stroke</span>
<span class="hljs-string">'am'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v97'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Bow down - down stroke</span>
<span class="hljs-string">'a,'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vb3'</span>, <span class="hljs-attr">between_lines</span>: <span class="hljs-literal">false</span> }, <span class="hljs-comment">// Choked</span>
};
Flow.accidentalCodes = <span class="hljs-function"><span class="hljs-params">acc</span> =></span> Flow.accidentalCodes.accidentals[acc];
Flow.accidentalCodes.accidentals = {
<span class="hljs-string">'#'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v18'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'##'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v7f'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'b'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v44'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-2</span> },
<span class="hljs-string">'bb'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v26'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-2</span> },
<span class="hljs-string">'n'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v4e'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'{'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v9c'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'}'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v84'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'db'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v9e'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'d'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vab'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">0</span> },
<span class="hljs-string">'bbs'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v90'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'++'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v51'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'+'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v78'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'+-'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v8d'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'++-'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v7a'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'bs'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vb7'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'bss'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v39'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'o'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd0'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'k'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd1'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> },
<span class="hljs-string">'ashs'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd6'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> }, <span class="hljs-comment">// arabic sharp half sharp</span>
<span class="hljs-string">'afhf'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vd7'</span>, <span class="hljs-attr">parenRightPaddingAdjustment</span>: <span class="hljs-number">-1</span> }, <span class="hljs-comment">// arabic flat half flat</span>
};
Flow.accidentalColumnsTable = {
<span class="hljs-number">1</span>: {
<span class="hljs-attr">a</span>: [<span class="hljs-number">1</span>],
<span class="hljs-attr">b</span>: [<span class="hljs-number">1</span>],
},
<span class="hljs-number">2</span>: {
<span class="hljs-attr">a</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>],
},
<span class="hljs-number">3</span>: {
<span class="hljs-attr">a</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>],
<span class="hljs-attr">b</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>],
<span class="hljs-attr">second_on_bottom</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>],
},
<span class="hljs-number">4</span>: {
<span class="hljs-attr">a</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">2</span>],
<span class="hljs-attr">b</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>],
<span class="hljs-attr">spaced_out_tetrachord</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>],
},
<span class="hljs-number">5</span>: {
<span class="hljs-attr">a</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">5</span>, <span class="hljs-number">4</span>, <span class="hljs-number">2</span>],
<span class="hljs-attr">b</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">4</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>],
<span class="hljs-attr">spaced_out_pentachord</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>],
<span class="hljs-attr">very_spaced_out_pentachord</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>],
},
<span class="hljs-number">6</span>: {
<span class="hljs-attr">a</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>, <span class="hljs-number">4</span>, <span class="hljs-number">2</span>],
<span class="hljs-attr">b</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>],
<span class="hljs-attr">spaced_out_hexachord</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">2</span>],
<span class="hljs-attr">very_spaced_out_hexachord</span>: [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>],
},
};
Flow.ornamentCodes = <span class="hljs-function"><span class="hljs-params">acc</span> =></span> Flow.ornamentCodes.ornaments[acc];
Flow.ornamentCodes.ornaments = {
<span class="hljs-string">'mordent'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v1e'</span> },
<span class="hljs-string">'mordent_inverted'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v45'</span> },
<span class="hljs-string">'turn'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v72'</span> },
<span class="hljs-string">'turn_inverted'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v33'</span> },
<span class="hljs-string">'tr'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v1f'</span> },
<span class="hljs-string">'upprall'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v60'</span> },
<span class="hljs-string">'downprall'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'vb4'</span> },
<span class="hljs-string">'prallup'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v6d'</span> },
<span class="hljs-string">'pralldown'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v2c'</span> },
<span class="hljs-string">'upmordent'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v29'</span> },
<span class="hljs-string">'downmordent'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v68'</span> },
<span class="hljs-string">'lineprall'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v20'</span> },
<span class="hljs-string">'prallprall'</span>: { <span class="hljs-attr">code</span>: <span class="hljs-string">'v86'</span> },
};
Flow.keySignature = <span class="hljs-function"><span class="hljs-params">spec</span> =></span> {
<span class="hljs-keyword">const</span> keySpec = Flow.keySignature.keySpecs[spec];
<span class="hljs-keyword">if</span> (!keySpec) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadKeySignature'</span>, <span class="hljs-string">`Bad key signature spec: '<span class="hljs-subst">${spec}</span>'`</span>);
}
<span class="hljs-keyword">if</span> (!keySpec.acc) {
<span class="hljs-keyword">return</span> [];
}
<span class="hljs-keyword">const</span> notes = Flow.keySignature.accidentalList(keySpec.acc);
<span class="hljs-keyword">const</span> acc_list = [];
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i < keySpec.num; ++i) {
<span class="hljs-keyword">const</span> line = notes[i];
acc_list.push({ <span class="hljs-attr">type</span>: keySpec.acc, line });
}
<span class="hljs-keyword">return</span> acc_list;
};
Flow.keySignature.keySpecs = {
<span class="hljs-string">'C'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-literal">null</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">0</span> },
<span class="hljs-string">'Am'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-literal">null</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">0</span> },
<span class="hljs-string">'F'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">1</span> },
<span class="hljs-string">'Dm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">1</span> },
<span class="hljs-string">'Bb'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">2</span> },
<span class="hljs-string">'Gm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">2</span> },
<span class="hljs-string">'Eb'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">3</span> },
<span class="hljs-string">'Cm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">3</span> },
<span class="hljs-string">'Ab'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'Fm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'Db'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">5</span> },
<span class="hljs-string">'Bbm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">5</span> },
<span class="hljs-string">'Gb'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">6</span> },
<span class="hljs-string">'Ebm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">6</span> },
<span class="hljs-string">'Cb'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">7</span> },
<span class="hljs-string">'Abm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'b'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">7</span> },
<span class="hljs-string">'G'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">1</span> },
<span class="hljs-string">'Em'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">1</span> },
<span class="hljs-string">'D'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">2</span> },
<span class="hljs-string">'Bm'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">2</span> },
<span class="hljs-string">'A'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">3</span> },
<span class="hljs-string">'F#m'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">3</span> },
<span class="hljs-string">'E'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'C#m'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">4</span> },
<span class="hljs-string">'B'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">5</span> },
<span class="hljs-string">'G#m'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">5</span> },
<span class="hljs-string">'F#'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">6</span> },
<span class="hljs-string">'D#m'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">6</span> },
<span class="hljs-string">'C#'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">7</span> },
<span class="hljs-string">'A#m'</span>: { <span class="hljs-attr">acc</span>: <span class="hljs-string">'#'</span>, <span class="hljs-attr">num</span>: <span class="hljs-number">7</span> },
};
Flow.unicode = {</pre></div>
<p>Unicode accidentals</p>
<div class='highlight'><pre> <span class="hljs-string">'sharp'</span>: <span class="hljs-built_in">String</span>.fromCharCode(<span class="hljs-built_in">parseInt</span>(<span class="hljs-string">'266F'</span>, <span class="hljs-number">16</span>)),
<span class="hljs-string">'flat'</span>: <span class="hljs-built_in">String</span>.fromCharCode(<span class="hljs-built_in">parseInt</span>(<span class="hljs-string">'266D'</span>, <span class="hljs-number">16</span>)),
<span class="hljs-string">'natural'</span>: <span class="hljs-built_in">String</span>.fromCharCode(<span class="hljs-built_in">parseInt</span>(<span class="hljs-string">'266E'</span>, <span class="hljs-number">16</span>)),</pre></div>
<p>Major Chord</p>
<div class='highlight'><pre> <span class="hljs-string">'triangle'</span>: <span class="hljs-built_in">String</span>.fromCharCode(<span class="hljs-built_in">parseInt</span>(<span class="hljs-string">'25B3'</span>, <span class="hljs-number">16</span>)),</pre></div>
<p>half-diminished</p>
<div class='highlight'><pre> <span class="hljs-string">'o-with-slash'</span>: <span class="hljs-built_in">String</span>.fromCharCode(<span class="hljs-built_in">parseInt</span>(<span class="hljs-string">'00F8'</span>, <span class="hljs-number">16</span>)),</pre></div>
<p>Diminished</p>
<div class='highlight'><pre> <span class="hljs-string">'degrees'</span>: <span class="hljs-built_in">String</span>.fromCharCode(<span class="hljs-built_in">parseInt</span>(<span class="hljs-string">'00B0'</span>, <span class="hljs-number">16</span>)),
<span class="hljs-string">'circle'</span>: <span class="hljs-built_in">String</span>.fromCharCode(<span class="hljs-built_in">parseInt</span>(<span class="hljs-string">'25CB'</span>, <span class="hljs-number">16</span>)),
};
Flow.keySignature.accidentalList = <span class="hljs-function">(<span class="hljs-params">acc</span>) =></span> {
<span class="hljs-keyword">const</span> patterns = {
<span class="hljs-string">'b'</span>: [<span class="hljs-number">2</span>, <span class="hljs-number">0.5</span>, <span class="hljs-number">2.5</span>, <span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1.5</span>, <span class="hljs-number">3.5</span>],
<span class="hljs-string">'#'</span>: [<span class="hljs-number">0</span>, <span class="hljs-number">1.5</span>, <span class="hljs-number">-0.5</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2.5</span>, <span class="hljs-number">0.5</span>, <span class="hljs-number">2</span>],
};
<span class="hljs-keyword">return</span> patterns[acc];
};
Flow.parseNoteDurationString = <span class="hljs-function"><span class="hljs-params">durationString</span> =></span> {
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> (durationString) !== <span class="hljs-string">'string'</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">const</span> regexp = <span class="hljs-regexp">/(\d*\/?\d+|[a-z])(d*)([nrhms]|$)/</span>;
<span class="hljs-keyword">const</span> result = regexp.exec(durationString);
<span class="hljs-keyword">if</span> (!result) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">const</span> duration = result[<span class="hljs-number">1</span>];
<span class="hljs-keyword">const</span> dots = result[<span class="hljs-number">2</span>].length;
<span class="hljs-keyword">let</span> type = result[<span class="hljs-number">3</span>];
<span class="hljs-keyword">if</span> (type.length === <span class="hljs-number">0</span>) {
type = <span class="hljs-string">'n'</span>;
}
<span class="hljs-keyword">return</span> {
duration,
dots,
type,
};
};
Flow.parseNoteData = <span class="hljs-function"><span class="hljs-params">noteData</span> =></span> {
<span class="hljs-keyword">const</span> duration = noteData.duration;</pre></div>
<p>Preserve backwards-compatibility</p>
<div class='highlight'><pre> <span class="hljs-keyword">const</span> durationStringData = Flow.parseNoteDurationString(duration);
<span class="hljs-keyword">if</span> (!durationStringData) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">let</span> ticks = Flow.durationToTicks(durationStringData.duration);
<span class="hljs-keyword">if</span> (ticks == <span class="hljs-literal">null</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">let</span> type = noteData.type;
<span class="hljs-keyword">if</span> (type) {
<span class="hljs-keyword">if</span> (!(type === <span class="hljs-string">'n'</span> || type === <span class="hljs-string">'r'</span> || type === <span class="hljs-string">'h'</span> || type === <span class="hljs-string">'m'</span> || type === <span class="hljs-string">'s'</span>)) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
} <span class="hljs-keyword">else</span> {
type = durationStringData.type;</pre></div>
<p>If we have keys, try and check if we’ve got a custom glyph</p>
<div class='highlight'><pre> <span class="hljs-keyword">if</span> (noteData.keys !== <span class="hljs-literal">undefined</span>) {
<span class="hljs-keyword">const</span> result = noteData.keys[<span class="hljs-number">0</span>].split(<span class="hljs-string">'/'</span>);</pre></div>
<p>We have a custom glyph specified after the note eg. /X2</p>
<div class='highlight'><pre> <span class="hljs-keyword">if</span> (result && result.length === <span class="hljs-number">3</span>) {
type = result[<span class="hljs-number">2</span>]; <span class="hljs-comment">// Set the type to the custom note head</span>
}
}
<span class="hljs-keyword">if</span> (!type) {
type = <span class="hljs-string">'n'</span>;
}
}
<span class="hljs-keyword">const</span> dots = noteData.dots ? noteData.dots : durationStringData.dots;
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> (dots) !== <span class="hljs-string">'number'</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">let</span> currentTicks = ticks;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i < dots; i++) {
<span class="hljs-keyword">if</span> (currentTicks <= <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
currentTicks = currentTicks / <span class="hljs-number">2</span>;
ticks += currentTicks;
}
<span class="hljs-keyword">return</span> {
<span class="hljs-attr">duration</span>: durationStringData.duration,
type,
dots,
ticks,
};
};</pre></div>
<p>Used to convert duration aliases to the number based duration.
If the input isn’t an alias, simply return the input.</p>
<p>example: ‘q’ -> ‘4’, ‘8’ -> ‘8’</p>
<div class='highlight'><pre>Flow.sanitizeDuration = <span class="hljs-function"><span class="hljs-params">duration</span> =></span> {
<span class="hljs-keyword">const</span> alias = Flow.durationAliases[duration];
<span class="hljs-keyword">if</span> (alias !== <span class="hljs-literal">undefined</span>) {
duration = alias;
}
<span class="hljs-keyword">if</span> (Flow.durationToTicks.durations[duration] === <span class="hljs-literal">undefined</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Vex.RERR(<span class="hljs-string">'BadArguments'</span>, <span class="hljs-string">`The provided duration is not valid: <span class="hljs-subst">${duration}</span>`</span>);
}
<span class="hljs-keyword">return</span> duration;
};</pre></div>
<p>Convert the <code>duration</code> to an fraction</p>
<div class='highlight'><pre>Flow.durationToFraction = <span class="hljs-function"><span class="hljs-params">duration</span> =></span> <span class="hljs-keyword">new</span> Fraction().parse(Flow.sanitizeDuration(duration));</pre></div>
<p>Convert the <code>duration</code> to an number</p>
<div class='highlight'><pre>Flow.durationToNumber = <span class="hljs-function"><span class="hljs-params">duration</span> =></span> Flow.durationToFraction(duration).value();</pre></div>
<p>Convert the <code>duration</code> to total ticks</p>
<div class='highlight'><pre>Flow.durationToTicks = <span class="hljs-function"><span class="hljs-params">duration</span> =></span> {
duration = Flow.sanitizeDuration(duration);
<span class="hljs-keyword">const</span> ticks = Flow.durationToTicks.durations[duration];
<span class="hljs-keyword">if</span> (ticks === <span class="hljs-literal">undefined</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">return</span> ticks;
};
Flow.durationToTicks.durations = {
<span class="hljs-string">'1/2'</span>: Flow.RESOLUTION * <span class="hljs-number">2</span>,
<span class="hljs-string">'1'</span>: Flow.RESOLUTION / <span class="hljs-number">1</span>,
<span class="hljs-string">'2'</span>: Flow.RESOLUTION / <span class="hljs-number">2</span>,
<span class="hljs-string">'4'</span>: Flow.RESOLUTION / <span class="hljs-number">4</span>,
<span class="hljs-string">'8'</span>: Flow.RESOLUTION / <span class="hljs-number">8</span>,
<span class="hljs-string">'16'</span>: Flow.RESOLUTION / <span class="hljs-number">16</span>,
<span class="hljs-string">'32'</span>: Flow.RESOLUTION / <span class="hljs-number">32</span>,
<span class="hljs-string">'64'</span>: Flow.RESOLUTION / <span class="hljs-number">64</span>,
<span class="hljs-string">'128'</span>: Flow.RESOLUTION / <span class="hljs-number">128</span>,
<span class="hljs-string">'256'</span>: Flow.RESOLUTION / <span class="hljs-number">256</span>,
};
Flow.durationAliases = {
<span class="hljs-string">'w'</span>: <span class="hljs-string">'1'</span>,
<span class="hljs-string">'h'</span>: <span class="hljs-string">'2'</span>,
<span class="hljs-string">'q'</span>: <span class="hljs-string">'4'</span>,</pre></div>
<p>This is the default duration used to render bars (BarNote). Bars no longer
consume ticks, so this should be a no-op.</p>
<p>TODO(0xfe): This needs to be cleaned up.</p>
<div class='highlight'><pre> <span class="hljs-string">'b'</span>: <span class="hljs-string">'256'</span>,
};
Flow.durationToGlyph = <span class="hljs-function">(<span class="hljs-params">duration, type</span>) =></span> {
duration = Flow.sanitizeDuration(duration);
<span class="hljs-keyword">const</span> code = Flow.durationToGlyph.duration_codes[duration];
<span class="hljs-keyword">if</span> (code === <span class="hljs-literal">undefined</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
<span class="hljs-keyword">if</span> (!type) {
type = <span class="hljs-string">'n'</span>;
}
<span class="hljs-keyword">let</span> glyphTypeProperties = code.type[type];
<span class="hljs-keyword">if</span> (glyphTypeProperties === <span class="hljs-literal">undefined</span>) {</pre></div>
<p>Try and get it from the custom list of note heads</p>
<div class='highlight'><pre> <span class="hljs-keyword">const</span> customGlyphTypeProperties = Flow.keyProperties.note_glyph[type.toUpperCase()];</pre></div>
<p>If not, then return with nothing</p>
<div class='highlight'><pre> <span class="hljs-keyword">if</span> (customGlyphTypeProperties === <span class="hljs-literal">undefined</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}</pre></div>
<p>Otherwise set it as the code_head value</p>
<div class='highlight'><pre> glyphTypeProperties = {
<span class="hljs-attr">code_head</span>: customGlyphTypeProperties.code,
<span class="hljs-attr">stem_up_y_offset</span>: customGlyphTypeProperties.stem_up_y_offset,
<span class="hljs-attr">stem_down_y_offset</span>: customGlyphTypeProperties.stem_down_y_offset,
};
}
<span class="hljs-keyword">return</span> Vex.Merge(Vex.Merge({}, code.common), glyphTypeProperties);
};
Flow.durationToGlyph.duration_codes = {
<span class="hljs-string">'1/2'</span>: {
<span class="hljs-attr">common</span>: {
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'v53'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">stem_up_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">stem_down_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">tabnote_stem_up_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">tabnote_stem_down_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Breve note</span>
code_head: <span class="hljs-string">'v53'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Breve note harmonic</span>
code_head: <span class="hljs-string">'v59'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Breve note muted -</span>
code_head: <span class="hljs-string">'vf'</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Breve rest</span>
code_head: <span class="hljs-string">'v31'</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/5'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0.5</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Breve note slash -</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'1'</span>: {
<span class="hljs-attr">common</span>: {
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'v1d'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">stem_up_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">stem_down_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">tabnote_stem_up_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">tabnote_stem_down_extension</span>: -Flow.STEM_HEIGHT,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Whole note</span>
code_head: <span class="hljs-string">'v1d'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Whole note harmonic</span>
code_head: <span class="hljs-string">'v46'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Whole note muted</span>
code_head: <span class="hljs-string">'v92'</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">-3</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Whole rest</span>
code_head: <span class="hljs-string">'v5c'</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'D/5'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0.5</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Whole note slash</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'2'</span>: {
<span class="hljs-attr">common</span>: {
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'v81'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Half note</span>
code_head: <span class="hljs-string">'v81'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Half note harmonic</span>
code_head: <span class="hljs-string">'v2d'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Half note muted</span>
code_head: <span class="hljs-string">'v95'</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">-3</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Half rest</span>
code_head: <span class="hljs-string">'vc'</span>,
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">-0.5</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Half note slash</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'4'</span>: {
<span class="hljs-attr">common</span>: {
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'vb'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Quarter note</span>
code_head: <span class="hljs-string">'vb'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Quarter harmonic</span>
code_head: <span class="hljs-string">'v22'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Quarter muted</span>
code_head: <span class="hljs-string">'v3e'</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">-3</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Quarter rest</span>
code_head: <span class="hljs-string">'v7c'</span>,
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">-0.5</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">1.5</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">1.5</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Quarter slash</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'8'</span>: {
<span class="hljs-attr">common</span>: {
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'vb'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">beam_count</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">code_flag_upstem</span>: <span class="hljs-string">'v54'</span>,
<span class="hljs-attr">code_flag_downstem</span>: <span class="hljs-string">'v9a'</span>,
<span class="hljs-attr">stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Eighth note</span>
code_head: <span class="hljs-string">'vb'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Eighth note harmonic</span>
code_head: <span class="hljs-string">'v22'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Eighth note muted</span>
code_head: <span class="hljs-string">'v3e'</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Eighth rest</span>
code_head: <span class="hljs-string">'va5'</span>,
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">-0.5</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">1.0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">1.0</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Eight slash</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'16'</span>: {
<span class="hljs-attr">common</span>: {
<span class="hljs-attr">beam_count</span>: <span class="hljs-number">2</span>,
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'vb'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">code_flag_upstem</span>: <span class="hljs-string">'v3f'</span>,
<span class="hljs-attr">code_flag_downstem</span>: <span class="hljs-string">'v8f'</span>,
<span class="hljs-attr">stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_up_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">tabnote_stem_down_extension</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Sixteenth note</span>
code_head: <span class="hljs-string">'vb'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Sixteenth note harmonic</span>
code_head: <span class="hljs-string">'v22'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Sixteenth note muted</span>
code_head: <span class="hljs-string">'v3e'</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Sixteenth rest</span>
code_head: <span class="hljs-string">'v3c'</span>,
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">-0.5</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">1.0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">2.0</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Sixteenth slash</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'32'</span>: {
<span class="hljs-attr">common</span>: {
<span class="hljs-attr">beam_count</span>: <span class="hljs-number">3</span>,
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'vb'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">code_flag_upstem</span>: <span class="hljs-string">'v47'</span>,
<span class="hljs-attr">code_flag_downstem</span>: <span class="hljs-string">'v2a'</span>,
<span class="hljs-attr">stem_up_extension</span>: <span class="hljs-number">9</span>,
<span class="hljs-attr">stem_down_extension</span>: <span class="hljs-number">9</span>,
<span class="hljs-attr">tabnote_stem_up_extension</span>: <span class="hljs-number">8</span>,
<span class="hljs-attr">tabnote_stem_down_extension</span>: <span class="hljs-number">5</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Thirty-second note</span>
code_head: <span class="hljs-string">'vb'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Thirty-second harmonic</span>
code_head: <span class="hljs-string">'v22'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Thirty-second muted</span>
code_head: <span class="hljs-string">'v3e'</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Thirty-second rest</span>
code_head: <span class="hljs-string">'v55'</span>,
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">-1.5</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">2.0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">2.0</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Thirty-second slash</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'64'</span>: {
<span class="hljs-attr">common</span>: {
<span class="hljs-attr">beam_count</span>: <span class="hljs-number">4</span>,
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'vb'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">code_flag_upstem</span>: <span class="hljs-string">'va9'</span>,
<span class="hljs-attr">code_flag_downstem</span>: <span class="hljs-string">'v58'</span>,
<span class="hljs-attr">stem_up_extension</span>: <span class="hljs-number">13</span>,
<span class="hljs-attr">stem_down_extension</span>: <span class="hljs-number">13</span>,
<span class="hljs-attr">tabnote_stem_up_extension</span>: <span class="hljs-number">12</span>,
<span class="hljs-attr">tabnote_stem_down_extension</span>: <span class="hljs-number">9</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Sixty-fourth note</span>
code_head: <span class="hljs-string">'vb'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Sixty-fourth harmonic</span>
code_head: <span class="hljs-string">'v22'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Sixty-fourth muted</span>
code_head: <span class="hljs-string">'v3e'</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Sixty-fourth rest</span>
code_head: <span class="hljs-string">'v38'</span>,
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">-1.5</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">2.0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">3.0</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Sixty-fourth slash</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
<span class="hljs-string">'128'</span>: {
<span class="hljs-attr">common</span>: {
<span class="hljs-attr">beam_count</span>: <span class="hljs-number">5</span>,
getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Glyph(<span class="hljs-keyword">this</span>.code_head || <span class="hljs-string">'vb'</span>, scale).getMetrics().width;
},
<span class="hljs-attr">stem</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">stem_offset</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">code_flag_upstem</span>: <span class="hljs-string">'v9b'</span>,
<span class="hljs-attr">code_flag_downstem</span>: <span class="hljs-string">'v30'</span>,
<span class="hljs-attr">stem_up_extension</span>: <span class="hljs-number">22</span>,
<span class="hljs-attr">stem_down_extension</span>: <span class="hljs-number">22</span>,
<span class="hljs-attr">tabnote_stem_up_extension</span>: <span class="hljs-number">21</span>,
<span class="hljs-attr">tabnote_stem_down_extension</span>: <span class="hljs-number">18</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">0</span>,
},
<span class="hljs-attr">type</span>: {
<span class="hljs-string">'n'</span>: { <span class="hljs-comment">// Hundred-twenty-eight note</span>
code_head: <span class="hljs-string">'vb'</span>,
},
<span class="hljs-string">'h'</span>: { <span class="hljs-comment">// Hundred-twenty-eight harmonic</span>
code_head: <span class="hljs-string">'v22'</span>,
},
<span class="hljs-string">'m'</span>: { <span class="hljs-comment">// Hundred-twenty-eight muted</span>
code_head: <span class="hljs-string">'v3e'</span>,
},
<span class="hljs-string">'r'</span>: { <span class="hljs-comment">// Hundred-twenty-eight rest</span>
code_head: <span class="hljs-string">'vaa'</span>,
<span class="hljs-attr">stem</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">flag</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">rest</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
<span class="hljs-attr">dot_shiftY</span>: <span class="hljs-number">1.5</span>,
<span class="hljs-attr">line_above</span>: <span class="hljs-number">3.0</span>,
<span class="hljs-attr">line_below</span>: <span class="hljs-number">3.0</span>,
},
<span class="hljs-string">'s'</span>: { <span class="hljs-comment">// Hundred-twenty-eight rest</span></pre></div>
<p>Drawn with canvas primitives</p>
<div class='highlight'><pre> getWidth: <span class="hljs-function"><span class="hljs-params">()</span> =></span> Flow.SLASH_NOTEHEAD_WIDTH,
<span class="hljs-attr">position</span>: <span class="hljs-string">'B/4'</span>,
},
},
},
};</pre></div>
<p>For future collaboration with the SMuFL Standard Music Font Layout</p>
<div class='highlight'><pre>
Flow.smufl = {};</pre></div>
<p>add references between smufl glyph names and code points.</p>
<div class='highlight'><pre>Flow.smufl.to_code_points = {</pre></div>
<p>staff brackets and dividers (e000-e00f)</p>
<div class='highlight'><pre> bracketTop: <span class="hljs-string">'v1b'</span>,
<span class="hljs-attr">bracketBottom</span>: <span class="hljs-string">'v10'</span>,</pre></div>
<p>barlines (e030-e03f)</p>
<div class='highlight'><pre> barlineTick: <span class="hljs-string">'v6f'</span>,</pre></div>
<p>repeats (e040-e04f)</p>
<div class='highlight'><pre> segno: <span class="hljs-string">'v8c'</span>,
<span class="hljs-attr">coda</span>: <span class="hljs-string">'v4d'</span>,</pre></div>
<p>clefs (e050-e07f)</p>
<div class='highlight'><pre> gClef: <span class="hljs-string">'v83'</span>,
<span class="hljs-attr">cClef</span>: <span class="hljs-string">'vad'</span>,
<span class="hljs-attr">fClef</span>: <span class="hljs-string">'v79'</span>,
<span class="hljs-attr">unpitchedPercussionClef1</span>: <span class="hljs-string">'v59'</span>, <span class="hljs-comment">// same as breveNoteheadHarmonic</span>
<span class="hljs-string">'6stringTabClef'</span>: <span class="hljs-string">'v2f'</span>,</pre></div>
<p>time signatures (e080-e09f)</p>
<div class='highlight'><pre> timeSig0: <span class="hljs-string">'v0'</span>,
<span class="hljs-attr">timeSig1</span>: <span class="hljs-string">'v1'</span>,
<span class="hljs-attr">timeSig2</span>: <span class="hljs-string">'v2'</span>,
<span class="hljs-attr">timeSig3</span>: <span class="hljs-string">'v3'</span>,
<span class="hljs-attr">timeSig4</span>: <span class="hljs-string">'v4'</span>,
<span class="hljs-attr">timeSig5</span>: <span class="hljs-string">'v5'</span>,
<span class="hljs-attr">timeSig6</span>: <span class="hljs-string">'v6'</span>,
<span class="hljs-attr">timeSig7</span>: <span class="hljs-string">'v7'</span>,
<span class="hljs-attr">timeSig8</span>: <span class="hljs-string">'v8'</span>,
<span class="hljs-attr">timeSig9</span>: <span class="hljs-string">'v9'</span>,
<span class="hljs-attr">timeSigCommon</span>: <span class="hljs-string">'v41'</span>,
<span class="hljs-attr">timeSigCutCommon</span>: <span class="hljs-string">'vb6'</span>,</pre></div>
<p>notehead (e0a0-e0ff)</p>
<div class='highlight'><pre> noteheadDoubleWhole: <span class="hljs-string">'v53'</span>,
<span class="hljs-attr">noteheadWhole</span>: <span class="hljs-string">'v1d'</span>,
<span class="hljs-attr">noteheadHalf</span>: <span class="hljs-string">'v81'</span>,
<span class="hljs-attr">noteheadBlack</span>: <span class="hljs-string">'vb'</span>,
<span class="hljs-attr">noteheadXWhole</span>: <span class="hljs-string">'v92'</span>,
<span class="hljs-attr">noteheadXHalf</span>: <span class="hljs-string">'v95'</span>,
<span class="hljs-attr">noteheadXBlack</span>: <span class="hljs-string">'v3e'</span>,
<span class="hljs-attr">noteheadCircleX</span>: <span class="hljs-string">'v3b'</span>,
<span class="hljs-attr">noteheadTriangleUpWhole</span>: <span class="hljs-string">'v49'</span>,
<span class="hljs-attr">noteheadTriangleUpHalf</span>: <span class="hljs-string">'v93'</span>,
<span class="hljs-attr">noteheadTriangleUpBlack</span>: <span class="hljs-string">'v40'</span>,
<span class="hljs-attr">noteheadDiamondWhole</span>: <span class="hljs-string">'v46'</span>,
<span class="hljs-attr">noteheadDiamondHalf</span>: <span class="hljs-string">'v2d'</span>,
<span class="hljs-attr">noteheadDiamondBlack</span>: <span class="hljs-string">'v22'</span>,</pre></div>
<p>individual notes (e1d0-e1ef)</p>
<div class='highlight'><pre> augmentationDot: <span class="hljs-string">'v23'</span>,</pre></div>
<p>temolos (e220-e23f)</p>
<div class='highlight'><pre> tremolo1: <span class="hljs-string">'v74'</span>,</pre></div>
<p>flags (e240-e25f)</p>
<div class='highlight'><pre> flag8thUp: <span class="hljs-string">'v54'</span>,
<span class="hljs-attr">flag8thDown</span>: <span class="hljs-string">'v9a'</span>,
<span class="hljs-attr">flag16thUp</span>: <span class="hljs-string">'v3f'</span>,
<span class="hljs-attr">flag16thDown</span>: <span class="hljs-string">'v8f'</span>,
<span class="hljs-attr">flag32ndUp</span>: <span class="hljs-string">'v47'</span>,
<span class="hljs-attr">flag32ndDown</span>: <span class="hljs-string">'v2a'</span>,
<span class="hljs-attr">flag64thUp</span>: <span class="hljs-string">'va9'</span>,
<span class="hljs-attr">flag64thDown</span>: <span class="hljs-string">'v58'</span>,
<span class="hljs-attr">flag128thUp</span>: <span class="hljs-string">'v9b'</span>,
<span class="hljs-attr">flag128thDown</span>: <span class="hljs-string">'v30'</span>,</pre></div>
<p>standard accidentals (e260-e26f)</p>
<div class='highlight'><pre> accidentalFlat: <span class="hljs-string">'v44'</span>,
<span class="hljs-attr">accidentalNatural</span>: <span class="hljs-string">'v4e'</span>,
<span class="hljs-attr">accidentalSharp</span>: <span class="hljs-string">'v18'</span>,
<span class="hljs-attr">accidentalDoubleSharp</span>: <span class="hljs-string">'v7f'</span>,
<span class="hljs-attr">accidentalDoubleFlat</span>: <span class="hljs-string">'v26'</span>,
<span class="hljs-attr">accidentalParensLeft</span>: <span class="hljs-string">'v9c'</span>,
<span class="hljs-attr">accidentalParensRight</span>: <span class="hljs-string">'v84'</span>,</pre></div>
<p>stein-zimmermann accidentals (24-edo) (e280-e28f)</p>
<div class='highlight'><pre> accidentalQuarterToneFlatStein: <span class="hljs-string">'vab'</span>,
<span class="hljs-attr">accidentalThreeQuarterTonesFlatZimmermann</span>: <span class="hljs-string">'v9e'</span>,
<span class="hljs-attr">accidentalQuarterToneSharpStein</span>: <span class="hljs-string">'v78'</span>,
<span class="hljs-attr">accidentalThreeQuarterTonesSharpStein</span>: <span class="hljs-string">'v51'</span>,</pre></div>
<p>arel-ezgi-uzdilek accidentals (e440-e44f)</p>
<div class='highlight'><pre> accidentalBuyukMucennebFlat: <span class="hljs-string">'v39'</span>,
<span class="hljs-attr">accidentalBakiyeFlat</span>: <span class="hljs-string">'vb7'</span>,
<span class="hljs-attr">accidentalKomaSharp</span>: <span class="hljs-string">'v51'</span>, <span class="hljs-comment">// same as accidentalQuarterToneSharpStein</span>
accidentalKucukMucennebSharp: <span class="hljs-string">'v8d'</span>,</pre></div>
<p>persian accidentals (e460-e46f)</p>
<div class='highlight'><pre> accidentalKoron: <span class="hljs-string">'vd1'</span>,
<span class="hljs-attr">accidentalSori</span>: <span class="hljs-string">'vd0'</span>,</pre></div>
<p>articulation (e4a0-e4bf)</p>
<div class='highlight'><pre> articAccentAbove: <span class="hljs-string">'v42'</span>,
<span class="hljs-attr">articAccentBelow</span>: <span class="hljs-string">'v42'</span>, <span class="hljs-comment">// same as above</span>
articTenutoAbove: <span class="hljs-string">'v25'</span>,
<span class="hljs-attr">articTenutoBelow</span>: <span class="hljs-string">'v25'</span>, <span class="hljs-comment">// same as above</span>
articStaccatoAbove: <span class="hljs-string">'v23'</span>, <span class="hljs-comment">// = dot</span>
articStaccatoBelow: <span class="hljs-string">'v23'</span>, <span class="hljs-comment">// = dot</span>
articStaccatissimoAbove: <span class="hljs-string">'v28'</span>,
<span class="hljs-attr">articMarcatoAbove</span>: <span class="hljs-string">'va'</span>,</pre></div>
<p>holds and pauses (e4c0-e4df)</p>
<div class='highlight'><pre> fermataAbove: <span class="hljs-string">'v43'</span>,
<span class="hljs-attr">fermataBelow</span>: <span class="hljs-string">'v5b'</span>,
<span class="hljs-attr">breathMarkComma</span>: <span class="hljs-string">'v6c'</span>,
<span class="hljs-attr">breathMarkUpbow</span>: <span class="hljs-string">'v8a'</span>, <span class="hljs-comment">// looks better than current upbow</span>
caesura: <span class="hljs-string">'v34'</span>,
<span class="hljs-attr">caesuraCurved</span>: <span class="hljs-string">'v4b'</span>,</pre></div>
<p>rests (e4e0-e4ff)</p>
<div class='highlight'><pre> restMaxima: <span class="hljs-string">'v59'</span>, <span class="hljs-comment">// not designed for this, but should do the trick</span></pre></div>
<p>need restLonga – used in multimeasure rests, like above</p>
<div class='highlight'><pre> restDoubleWhole: <span class="hljs-string">'v31'</span>,
<span class="hljs-attr">restWhole</span>: <span class="hljs-string">'v5c'</span>,
<span class="hljs-attr">restHalf</span>: <span class="hljs-string">'vc'</span>,
<span class="hljs-attr">restQuarter</span>: <span class="hljs-string">'v7c'</span>,
<span class="hljs-attr">rest8th</span>: <span class="hljs-string">'va5'</span>,
<span class="hljs-attr">rest16th</span>: <span class="hljs-string">'v3c'</span>,
<span class="hljs-attr">rest32nd</span>: <span class="hljs-string">'v55'</span>,
<span class="hljs-attr">rest64th</span>: <span class="hljs-string">'v38'</span>,
<span class="hljs-attr">rest128th</span>: <span class="hljs-string">'vaa'</span>,</pre></div>
<p>dynamics (e520-e54f)</p>
<div class='highlight'><pre> dynamicPiano: <span class="hljs-string">'vbf'</span>,
<span class="hljs-attr">dynamicMezzo</span>: <span class="hljs-string">'v62'</span>,
<span class="hljs-attr">dynamicForte</span>: <span class="hljs-string">'vba'</span>,
<span class="hljs-attr">dynamicRinforzando</span>: <span class="hljs-string">'vba'</span>,
<span class="hljs-attr">dynamicSforzando</span>: <span class="hljs-string">'v4a'</span>,
<span class="hljs-attr">dynamicZ</span>: <span class="hljs-string">'v80'</span>,</pre></div>
<p>common ornaments (e560-e56f)</p>
<div class='highlight'><pre> ornamentTrill: <span class="hljs-string">'v1f'</span>,
<span class="hljs-attr">ornamentTurn</span>: <span class="hljs-string">'v72'</span>,
<span class="hljs-attr">ornamentTurnSlash</span>: <span class="hljs-string">'v33'</span>,
<span class="hljs-attr">ornamentMordent</span>: <span class="hljs-string">'v45'</span>,
<span class="hljs-attr">ornamentMordentInverted</span>: <span class="hljs-string">'v1e'</span>,
<span class="hljs-attr">ornamentTremblement</span>: <span class="hljs-string">'v86'</span>,</pre></div>
<p>precomposed trills and mordents (e5b0-e5cf)</p>
<div class='highlight'><pre> ornamentPrecompAppoggTrill: <span class="hljs-string">'v20'</span>,
<span class="hljs-attr">ornamentPrecompSlideTrillDAnglebert</span>: <span class="hljs-string">'v60'</span>,
<span class="hljs-attr">ornamentPrecompSlideTrillBach</span>: <span class="hljs-string">'v29'</span>,
<span class="hljs-attr">ornamentPrecompTrillSuffixDandrieu</span>: <span class="hljs-string">'v6d'</span>,
<span class="hljs-attr">ornamentPrecompDoubleCadenceUpperPrefix</span>: <span class="hljs-string">'vb4'</span>,
<span class="hljs-attr">ornamentPrecompDoubleCadenceUpperPrefixTurn</span>: <span class="hljs-string">'v68'</span>,
<span class="hljs-attr">ornamentPrecompTrillLowerSuffix</span>: <span class="hljs-string">'v2c'</span>,</pre></div>
<p>string techniques (e610-e62f)</p>
<div class='highlight'><pre> stringsDownBow: <span class="hljs-string">'v94'</span>,
<span class="hljs-attr">stringsUpBow</span>: <span class="hljs-string">'v75'</span>,
<span class="hljs-attr">stringsHarmonic</span>: <span class="hljs-string">'vb9'</span>,</pre></div>
<p>plucked techniques (e630-e63f)</p>
<div class='highlight'><pre> pluckedSnapPizzicatoAbove: <span class="hljs-string">'v94'</span>,
<span class="hljs-attr">pluckedLeftHandPizzicato</span>: <span class="hljs-string">'v8b'</span>, <span class="hljs-comment">// plus sign</span></pre></div>
<p>keyboard techniques (e650-e67f)</p>
<div class='highlight'><pre> keyboardPedalPed: <span class="hljs-string">'v36'</span>,
<span class="hljs-attr">keyboardPedalUp</span>: <span class="hljs-string">'v5d'</span>,</pre></div>
<p>percussion playing technique pictograms (e7f0-e80f)</p>
<div class='highlight'><pre> pictChokeCymbal: <span class="hljs-string">'vb3'</span>,</pre></div>
<p>multi-segment lines (eaa0-eb0f)</p>
<div class='highlight'><pre> wiggleArpeggiatoUp: <span class="hljs-string">'va3'</span>, <span class="hljs-comment">// rotated 90deg from reference implementation</span></pre></div>
<p>arrows and arrowheads (eb60-eb8f)</p>
<div class='highlight'><pre> arrowheadBlackUp: <span class="hljs-string">'vc3'</span>,
<span class="hljs-attr">arrowheadBlackDown</span>: <span class="hljs-string">'v52'</span>,</pre></div>
<p>not found:
noteheadDiamondWhole: ‘v27’, stylistic alternate to v46?
noteheadDiamondBlack: ‘v70’, stylistic alternate to v22?
noteheadTriangleUpBlack: ‘v7d’, stylistic alternate to v40?
accidentalSlashedDoubleFlat: ‘v90’,
accidentalOneAndAHalfSharpTurned: ‘v7a’,
unused marcato alternative? ‘v5a’,
arpeggioBrushDown: ‘v11’,</p>
<div class='highlight'><pre>};</pre></div>
<p>Some defaults</p>
<div class='highlight'><pre>Flow.TIME4_4 = {
<span class="hljs-attr">num_beats</span>: <span class="hljs-number">4</span>,
<span class="hljs-attr">beat_value</span>: <span class="hljs-number">4</span>,
<span class="hljs-attr">resolution</span>: Flow.RESOLUTION,
};
<span class="hljs-keyword">export</span> { Flow };</pre></div>
<div class="fleur">h</div>
</div>
</div>
</body>
</html>