music21j-port
Version:
A toolkit for computer-aided musicology, Javascript version
916 lines (732 loc) • 24.7 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>Music21j Source: music21/tinyNotation.js</title>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/sunlight.default.css">
<link type="text/css" rel="stylesheet" href="styles/site.spruce.css">
</head>
<body>
<div class="container-fluid">
<div class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<a class="brand" href="index.html">Music21j</a>
<ul class="nav">
<li class="dropdown">
<a href="namespaces.list.html" class="dropdown-toggle" data-toggle="dropdown">Namespaces<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="music21.html">music21</a>
</li>
<li>
<a href="music21.articulations.html">music21.articulations</a>
</li>
<li>
<a href="music21.audioSearch.html">music21.audioSearch</a>
</li>
<li>
<a href="music21.base.html">music21.base</a>
</li>
<li>
<a href="music21.beam.html">music21.beam</a>
</li>
<li>
<a href="music21.chord.html">music21.chord</a>
</li>
<li>
<a href="music21.clef.html">music21.clef</a>
</li>
<li>
<a href="music21.common.html">music21.common</a>
</li>
<li>
<a href="music21.duration.html">music21.duration</a>
</li>
<li>
<a href="music21.dynamics.html">music21.dynamics</a>
</li>
<li>
<a href="music21.expressions.html">music21.expressions</a>
</li>
<li>
<a href="music21.fromPython.html">music21.fromPython</a>
</li>
<li>
<a href="music21.instrument.html">music21.instrument</a>
</li>
<li>
<a href="music21.interval.html">music21.interval</a>
</li>
<li>
<a href="music21.key.html">music21.key</a>
</li>
<li>
<a href="music21.keyboard.html">music21.keyboard</a>
</li>
<li>
<a href="music21.meter.html">music21.meter</a>
</li>
<li>
<a href="music21.miditools.html">music21.miditools</a>
</li>
<li>
<a href="music21.note.html">music21.note</a>
</li>
<li>
<a href="music21.pitch.html">music21.pitch</a>
</li>
<li>
<a href="music21.prebase.html">music21.prebase</a>
</li>
<li>
<a href="music21.renderOptions.html">music21.renderOptions</a>
</li>
<li>
<a href="music21.roman.html">music21.roman</a>
</li>
<li>
<a href="music21.scale.html">music21.scale</a>
</li>
<li>
<a href="music21.sites.html">music21.sites</a>
</li>
<li>
<a href="music21.stream.html">music21.stream</a>
</li>
<li>
<a href="music21.tempo.html">music21.tempo</a>
</li>
<li>
<a href="music21.tie.html">music21.tie</a>
</li>
<li>
<a href="music21.tinyNotation.html">music21.tinyNotation</a>
</li>
<li>
<a href="music21.vfShow.html">music21.vfShow</a>
</li>
<li>
<a href="music21.webmidi.html">music21.webmidi</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="classes.list.html" class="dropdown-toggle" data-toggle="dropdown">Classes<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="music21.articulations.Accent.html">music21.articulations.Accent</a>
</li>
<li>
<a href="music21.articulations.Articulation.html">music21.articulations.Articulation</a>
</li>
<li>
<a href="music21.articulations.DynamicArticulation.html">music21.articulations.DynamicArticulation</a>
</li>
<li>
<a href="music21.articulations.LengthArticulation.html">music21.articulations.LengthArticulation</a>
</li>
<li>
<a href="music21.articulations.Marcato.html">music21.articulations.Marcato</a>
</li>
<li>
<a href="music21.articulations.PitchArticulation.html">music21.articulations.PitchArticulation</a>
</li>
<li>
<a href="music21.articulations.Spiccato.html">music21.articulations.Spiccato</a>
</li>
<li>
<a href="music21.articulations.Staccatissimo.html">music21.articulations.Staccatissimo</a>
</li>
<li>
<a href="music21.articulations.Staccato.html">music21.articulations.Staccato</a>
</li>
<li>
<a href="music21.articulations.StrongAccent.html">music21.articulations.StrongAccent</a>
</li>
<li>
<a href="music21.articulations.Tenuto.html">music21.articulations.Tenuto</a>
</li>
<li>
<a href="music21.articulations.TimbreArticulation.html">music21.articulations.TimbreArticulation</a>
</li>
<li>
<a href="music21.base.Music21Object.html">music21.base.Music21Object</a>
</li>
<li>
<a href="music21.beam.Beam.html">music21.beam.Beam</a>
</li>
<li>
<a href="music21.beam.Beams.html">music21.beam.Beams</a>
</li>
<li>
<a href="music21.chord.Chord.html">music21.chord.Chord</a>
</li>
<li>
<a href="music21.clef.AltoClef.html">music21.clef.AltoClef</a>
</li>
<li>
<a href="music21.clef.BassClef.html">music21.clef.BassClef</a>
</li>
<li>
<a href="music21.clef.Clef.html">music21.clef.Clef</a>
</li>
<li>
<a href="music21.clef.MezzoSopranoClef.html">music21.clef.MezzoSopranoClef</a>
</li>
<li>
<a href="music21.clef.PercussionClef.html">music21.clef.PercussionClef</a>
</li>
<li>
<a href="music21.clef.SopranoClef.html">music21.clef.SopranoClef</a>
</li>
<li>
<a href="music21.clef.TenorClef.html">music21.clef.TenorClef</a>
</li>
<li>
<a href="music21.clef.Treble8vaClef.html">music21.clef.Treble8vaClef</a>
</li>
<li>
<a href="music21.clef.Treble8vbClef.html">music21.clef.Treble8vbClef</a>
</li>
<li>
<a href="music21.clef.TrebleClef.html">music21.clef.TrebleClef</a>
</li>
<li>
<a href="music21.duration.Duration.html">music21.duration.Duration</a>
</li>
<li>
<a href="music21.duration.Tuplet.html">music21.duration.Tuplet</a>
</li>
<li>
<a href="music21.dynamics.Dynamic.html">music21.dynamics.Dynamic</a>
</li>
<li>
<a href="music21.expressions.Expression.html">music21.expressions.Expression</a>
</li>
<li>
<a href="music21.expressions.Fermata.html">music21.expressions.Fermata</a>
</li>
<li>
<a href="music21.fromPython.Converter.html">music21.fromPython.Converter</a>
</li>
<li>
<a href="music21.instrument.Instrument.html">music21.instrument.Instrument</a>
</li>
<li>
<a href="music21.interval.ChromaticInterval.html">music21.interval.ChromaticInterval</a>
</li>
<li>
<a href="music21.interval.DiatonicInterval.html">music21.interval.DiatonicInterval</a>
</li>
<li>
<a href="music21.interval.GenericInterval.html">music21.interval.GenericInterval</a>
</li>
<li>
<a href="music21.interval.Interval.html">music21.interval.Interval</a>
</li>
<li>
<a href="music21.key.Key.html">music21.key.Key</a>
</li>
<li>
<a href="music21.key.KeySignature.html">music21.key.KeySignature</a>
</li>
<li>
<a href="music21.keyboard.BlackKey.html">music21.keyboard.BlackKey</a>
</li>
<li>
<a href="music21.keyboard.Key.html">music21.keyboard.Key</a>
</li>
<li>
<a href="music21.keyboard.Keyboard.html">music21.keyboard.Keyboard</a>
</li>
<li>
<a href="music21.keyboard.WhiteKey.html">music21.keyboard.WhiteKey</a>
</li>
<li>
<a href="music21.meter.TimeSignature.html">music21.meter.TimeSignature</a>
</li>
<li>
<a href="music21.miditools.Event.html">music21.miditools.Event</a>
</li>
<li>
<a href="music21.miditools.MidiPlayer.html">music21.miditools.MidiPlayer</a>
</li>
<li>
<a href="music21.note.GeneralNote.html">music21.note.GeneralNote</a>
</li>
<li>
<a href="music21.note.Lyric.html">music21.note.Lyric</a>
</li>
<li>
<a href="music21.note.Note.html">music21.note.Note</a>
</li>
<li>
<a href="music21.note.NotRest.html">music21.note.NotRest</a>
</li>
<li>
<a href="music21.note.Rest.html">music21.note.Rest</a>
</li>
<li>
<a href="music21.pitch.Accidental.html">music21.pitch.Accidental</a>
</li>
<li>
<a href="music21.pitch.Pitch.html">music21.pitch.Pitch</a>
</li>
<li>
<a href="music21.prebase.ProtoM21Object.html">music21.prebase.ProtoM21Object</a>
</li>
<li>
<a href="music21.renderOptions.RenderOptions.html">music21.renderOptions.RenderOptions</a>
</li>
<li>
<a href="music21.roman.RomanNumeral.html">music21.roman.RomanNumeral</a>
</li>
<li>
<a href="music21.stream.Measure.html">music21.stream.Measure</a>
</li>
<li>
<a href="music21.stream.Part.html">music21.stream.Part</a>
</li>
<li>
<a href="music21.stream.Score.html">music21.stream.Score</a>
</li>
<li>
<a href="music21.stream.Stream.html">music21.stream.Stream</a>
</li>
<li>
<a href="music21.stream.Voice.html">music21.stream.Voice</a>
</li>
<li>
<a href="music21.tempo.Metronome.html">music21.tempo.Metronome</a>
</li>
<li>
<a href="music21.tie.Tie.html">music21.tie.Tie</a>
</li>
<li>
<a href="music21.vfShow.Renderer.html">music21.vfShow.Renderer</a>
</li>
<li>
<a href="music21.vfShow.RenderStack.html">music21.vfShow.RenderStack</a>
</li>
<li>
<a href="Notation.html">Notation</a>
</li>
<li>
<a href="Page.html">Page</a>
</li>
<li>
<a href="Recorder.html">Recorder</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="global.html" class="dropdown-toggle" data-toggle="dropdown">Global<b
class="caret"></b></a>
<ul class="dropdown-menu ">
<li>
<a href="global.html#getM21attribute">getM21attribute</a>
</li>
<li>
<a href="global.html#layout">layout</a>
</li>
<li>
<a href="global.html#midiNumDiffFromFrequency">midiNumDiffFromFrequency</a>
</li>
<li>
<a href="global.html#recorderWorkerJs">recorderWorkerJs</a>
</li>
<li>
<a href="global.html#unpickler">unpickler</a>
</li>
<li>
<a href="global.html#warnBanner">warnBanner</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="row-fluid">
<div class="span12">
<div id="main">
<h1 class="page-title">Source: music21/tinyNotation.js</h1>
<section>
<article>
<pre
class="sunlight-highlight-javascript linenums">/**
* music21j -- Javascript reimplementation of Core music21p features.
* music21/tinyNotation -- TinyNotation implementation
*
* Copyright (c) 2013-17, Michael Scott Cuthbert and cuthbertLab
* Based on music21 (=music21p), Copyright (c) 2006–17, Michael Scott Cuthbert and cuthbertLab
*
*/
import * as $ from 'jquery';
import { clef } from './clef.js';
import { duration } from './duration.js';
import { pitch } from './pitch.js';
import { note } from './note.js';
import { meter } from './meter.js';
import { stream } from './stream.js';
import { tie } from './tie.js';
/**
* TinyNotation module, see {@link music21.tinyNotation} namespace
*
* @exports music21/tinyNotation
*/
/**
* @namespace music21.tinyNotation
* @memberof music21
* @requires music21/base
* @requires music21/clef
* @requires music21/duration
* @requires music21/pitch
* @requires music21/note
* @requires music21/meter
* @requires music21/stream
* @requires music21/tie
*/
export const tinyNotation = {};
/**
* Regular expressions object
*
* @memberof music21.tinyNotation
*/
tinyNotation.regularExpressions = {
REST: /r/,
OCTAVE2: /([A-G])[A-G]+/,
OCTAVE3: /([A-G])/,
OCTAVE5: /([a-g])('+)/,
OCTAVE4: /([a-g])/,
EDSHARP: /\((#+)\)/,
EDFLAT: /\((-+)\)/,
EDNAT: /\(n\)/,
SHARP: /^[A-Ga-g]+'*(#+)/, // simple notation finds
FLAT: /^[A-Ga-g]+'*(-+)/, // double sharps too
NAT: /^[A-Ga-g]+'*n/, // explicit naturals
TYPE: /(\d+)/,
TIE: /.~/, // not preceding ties
PRECTIE: /~/, // front ties
ID_EL: /=([A-Za-z0-9]*)/,
LYRIC: /_(.*)/,
DOT: /\.+/,
TIMESIG: /(\d+)\/(\d+)/,
PARTBREAK: /partBreak/, // nonstandard...fix later...
TRIP: /trip\{/,
QUAD: /quad\{/,
ENDBRAC: /\}$/,
};
/**
* Function, not class.
*
* Converts a TinyNotation String into a music21 Stream
*
* See music21p for examples of what can go into tinynotation. It's an
* adaptation of Lilypond format, by design Extremely simple!
*
* @memberof music21.tinyNotation
* @param {string} textIn - a valid tinyNotation string
* @returns {music21.stream.Part|music21.stream.Measure} - a Stream or Part object (if multiple measures)
* @example
* var t = "3/4 c4 B8 c d4 e2.";
* var p = music21.tinyNotation.TinyNotation(t);
* p.duration.quarterLength;
* // 6.0
*/
tinyNotation.TinyNotation = function TinyNotation(textIn) {
textIn = textIn.trim();
const tokens = textIn.split(' ');
let optionalScore;
let p = new stream.Part();
let m = new stream.Measure();
let currentTSBarDuration = 4.0;
let lastDurationQL = 1.0;
const storedDict = {
lastNoteTied: false,
inTrip: false,
inQuad: false,
endTupletAfterNote: false,
};
const tnre = tinyNotation.regularExpressions; // faster typing
for (let i = 0; i < tokens.length; i++) {
// check at first so that a full measure but not over full
// gets returned as a stream.Measure object.
if ((m.duration.quarterLength >= currentTSBarDuration)
|| (Math.abs(m.duration.quarterLength - currentTSBarDuration) < 0.0001)) {
p.append(m);
m = new stream.Measure();
}
let token = tokens[i];
let noteObj;
let lyric;
if (tnre.PARTBREAK.exec(token)) {
if (m.length > 0) {
p.append(m);
m = new stream.Measure();
}
if (optionalScore === undefined) {
optionalScore = new stream.Score();
}
optionalScore.insert(0, p);
p = new stream.Part();
storedDict.lastNoteTied = false;
storedDict.inTrip = false;
storedDict.inQuad = false;
storedDict.endTupletAfterNote = false;
continue;
}
if (tnre.TRIP.exec(token)) {
token = token.slice(5); // cut...
storedDict.inTrip = true;
}
if (tnre.QUAD.exec(token)) {
token = token.slice(5); // cut...
storedDict.inQuad = true;
}
if (tnre.ENDBRAC.exec(token)) {
token = token.slice(0, -1); // cut...
storedDict.endTupletAfterNote = true;
}
// Modifiers
if (tnre.LYRIC.exec(token)) {
[token, lyric] = token.split('_');
}
if (tnre.TIMESIG.exec(token)) {
const MATCH = tnre.TIMESIG.exec(token);
const ts = new meter.TimeSignature();
ts.numerator = parseInt(MATCH[1]);
ts.denominator = parseInt(MATCH[2]);
m.timeSignature = ts;
currentTSBarDuration = ts.barDuration.quarterLength;
// console.log(currentTSBarDuration);
continue;
} else if (tnre.REST.exec(token)) {
noteObj = new note.Rest(lastDurationQL);
} else if (tnre.OCTAVE2.exec(token)) {
const MATCH = tnre.OCTAVE2.exec(token);
noteObj = new note.Note(MATCH[1], lastDurationQL);
noteObj.pitch.octave = 4 - MATCH[0].length;
} else if (tnre.OCTAVE3.exec(token)) {
const MATCH = tnre.OCTAVE3.exec(token);
noteObj = new note.Note(MATCH[1], lastDurationQL);
noteObj.pitch.octave = 3;
} else if (tnre.OCTAVE5.exec(token)) {
// must match octave 5 before 4
const MATCH = tnre.OCTAVE5.exec(token);
noteObj = new note.Note(MATCH[1].toUpperCase(), lastDurationQL);
noteObj.pitch.octave = 3 + MATCH[0].length;
} else if (tnre.OCTAVE4.exec(token)) {
const MATCH = tnre.OCTAVE4.exec(token);
noteObj = new note.Note(MATCH[1].toUpperCase(), lastDurationQL);
noteObj.pitch.octave = 4;
}
if (noteObj === undefined) {
continue;
}
if (lyric !== undefined) {
noteObj.lyric = lyric;
}
if (tnre.TIE.exec(token)) {
noteObj.tie = new tie.Tie('start');
if (storedDict.lastNoteTied) {
noteObj.tie.type = 'continue';
}
storedDict.lastNoteTied = true;
} else if (storedDict.lastNoteTied) {
noteObj.tie = new tie.Tie('stop');
storedDict.lastNoteTied = false;
}
if (tnre.SHARP.exec(token)) {
noteObj.pitch.accidental = new pitch.Accidental('sharp');
} else if (tnre.FLAT.exec(token)) {
noteObj.pitch.accidental = new pitch.Accidental('flat');
} else if (tnre.NAT.exec(token)) {
noteObj.pitch.accidental = new pitch.Accidental('natural');
noteObj.pitch.accidental.displayType = 'always';
}
let MATCH = tnre.TYPE.exec(token);
if (MATCH) {
const durationType = parseInt(MATCH[0]);
noteObj.duration.quarterLength = 4.0 / durationType;
}
MATCH = tnre.DOT.exec(token);
if (MATCH) {
const numDots = MATCH[0].length;
const multiplier = 1 + (1 - Math.pow(0.5, numDots));
noteObj.duration.quarterLength *= multiplier;
}
lastDurationQL = noteObj.duration.quarterLength;
// do before appending tuplets
if (storedDict.inTrip) {
// console.log(noteObj.duration.quarterLength);
noteObj.duration.appendTuplet(
new duration.Tuplet(3, 2, noteObj.duration.quarterLength)
);
}
if (storedDict.inQuad) {
noteObj.duration.appendTuplet(
new duration.Tuplet(4, 3, noteObj.duration.quarterLength)
);
}
if (storedDict.endTupletAfterNote) {
storedDict.inTrip = false;
storedDict.inQuad = false;
storedDict.endTupletAfterNote = false;
}
m.append(noteObj);
}
let returnObject;
if (optionalScore !== undefined) {
if (m.length > 0) {
p.append(m);
}
if (p.length > 0) {
optionalScore.append(p);
}
for (let i = 0; i < optionalScore.length; i++) {
const innerPart = optionalScore.get(i);
innerPart.clef = clef.bestClef(innerPart);
}
returnObject = optionalScore;
} else if (p.length > 0) {
p.append(m);
p.clef = clef.bestClef(p);
returnObject = p;
} else {
m.clef = clef.bestClef(m);
returnObject = m;
}
return returnObject;
};
// render notation divs in HTML
/**
* Render all the TinyNotation classes in the DOM as notation
*
* Called automatically when music21 is loaded.
*
* @memberof music21.tinyNotation
* @param {string} classTypes - a JQuery selector to find elements to replace.
*/
tinyNotation.renderNotationDivs = function renderNotationDivs(
classTypes,
selector
) {
if (classTypes === undefined) {
classTypes = '.music21.tinyNotation';
}
let allRender = [];
if (selector === undefined) {
allRender = $(classTypes);
} else {
if (selector.jquery === undefined) {
selector = $(selector);
}
allRender = selector.find(classTypes);
}
for (let i = 0; i < allRender.length; i++) {
const thisTN = allRender[i];
const $thisTN = $(thisTN);
let thisTNContents;
if ($thisTN.attr('tinynotationcontents') !== undefined) {
thisTNContents = $thisTN.attr('tinynotationcontents');
} else if (thisTN.textContent !== undefined) {
thisTNContents = thisTN.textContent;
thisTNContents = thisTNContents.replace(/s+/g, ' '); // no line-breaks, etc.
}
if (
String.prototype.trim !== undefined
&& thisTNContents !== undefined
) {
thisTNContents = thisTNContents.trim(); // remove leading, trailing whitespace
}
if (thisTNContents) {
const st = tinyNotation.TinyNotation(thisTNContents);
if ($thisTN.hasClass('noPlayback')) {
st.renderOptions.events.click = undefined;
}
const newSVG = st.createDOM();
$thisTN.attr('tinynotationcontents', thisTNContents);
$thisTN.empty();
$thisTN.data('stream', st);
$thisTN.append(newSVG);
// console.log(thisTNContents);
}
}
};
</pre>
</article>
</section>
</div>
<div class="clearfix"></div>
<footer>
<span class="copyright">
Music21j, Copyright © 2013-2018 Michael Scott Cuthbert and cuthbertLab.
</span>
<br />
<span class="jsdoc-message">
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a>
on Wed Jul 4th 2018 using the <a
href="https://github.com/terryweiss/docstrap">DocStrap template</a>.
</span>
</footer>
</div>
<br clear="both">
</div>
</div>
<!--<script src="scripts/sunlight.js"></script>-->
<script src="scripts/docstrap.lib.js"></script>
<script src="scripts/bootstrap-dropdown.js"></script>
<script src="scripts/toc.js"></script>
<script>
$( function () {
$( "[id*='$']" ).each( function () {
var $this = $( this );
$this.attr( "id", $this.attr( "id" ).replace( "$", "__" ) );
} );
$( "#toc" ).toc( {
anchorName : function ( i, heading, prefix ) {
return $( heading ).attr( "id" ) || ( prefix + i );
},
selectors : "h1,h2,h3,h4",
showAndHide : false,
scrollTo : "100px"
} );
$( "#toc>ul" ).addClass( "nav nav-pills nav-stacked" );
$( "#main span[id^='toc']" ).addClass( "toc-shim" );
$( '.dropdown-toggle' ).dropdown();
// $( ".tutorial-section pre, .readme-section pre" ).addClass( "sunlight-highlight-javascript" ).addClass( "linenums" );
$( ".tutorial-section pre, .readme-section pre" ).each( function () {
var $this = $( this );
var example = $this.find( "code" );
exampleText = example.html();
var lang = /{@lang (.*?)}/.exec( exampleText );
if ( lang && lang[1] ) {
exampleText = exampleText.replace( lang[0], "" );
example.html( exampleText );
lang = lang[1];
} else {
lang = "javascript";
}
if ( lang ) {
$this
.addClass( "sunlight-highlight-" + lang )
.addClass( "linenums" )
.html( example.html() );
}
} );
Sunlight.highlightAll( {
lineNumbers : true,
showMenu : true,
enableDoclinks : true
} );
} );
</script>
<!--Navigation and Symbol Display-->
<!--Google Analytics-->
</body>
</html>