music21j-port
Version:
A toolkit for computer-aided musicology, Javascript version
893 lines (704 loc) • 25.2 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>Music21j Source: music21.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.js</h1>
<section>
<article>
<pre
class="sunlight-highlight-javascript linenums">/**
* If you are a programmer, this is probably not the script you are looking for.
* The guts of music21j begin at src/loadModules.js
*
* @exports music21
*/
//Not strict mode
if (typeof(m21basis) === "undefined") {
/**
* **music21j**: Javascript reimplementation of Core music21 features.
*
* See http://web.mit.edu/music21/ for more details.
*
* Copyright (c) 2013-18, Michael Scott Cuthbert and cuthbertLab
*
* Based on music21, Copyright (c) 2006-18, Michael Scott Cuthbert and cuthbertLab
* The plan is to implement all core music21 features as Javascript and to expose
* more sophisticated features via server-side connections to remote servers running the
* python music21 (music21p).
*
* Requires an ECMAScript 5 compatible browser w/ SVG and Canvas. IE 11 or any recent
* version of Firefox, Safari, Edge, Chrome, etc. will do. To disable the warning,
* set an attribute in the &lt;script&gt; tag that calls requirejs, warnBanner="no".
*
* All interfaces are alpha and may change radically from day to day and release to release.
* Do not use this in production code yet.
*
* See src/moduleLoader.js for version and version history.
*
* music21j acknowledges VexFlow, MIDI.js in particular for their great efforts without which
* this module would not be possible.
*
* @namespace music21
*/
m21basis = {};
}
m21basis.VERSION = 0.9; // update in README.md also
require.config({
context: 'music21',
});
//must be defined before loading, jQuery, etc. because needed to see if warnBanner is defined
//place a JSON obj into the <script> tag for require...
//<script data-main='music21' src='require.js' m21conf='{"loadSoundfont": false}'>
var pathSimplify = function (path) {
var pPrefix = "";
if (path.indexOf('//') === 0) {
pPrefix = '//'; //cdn loading;
path = path.slice(2);
console.log('cdn load: ', pPrefix, " into ", path);
} else if (path.indexOf('://') !== -1) { // for cross site requests...
var protoSpace = path.indexOf('://');
pPrefix = path.slice(0, protoSpace + 3);
path = path.slice(protoSpace + 3);
console.log('cross-site split', pPrefix, path);
}
var ps = path.split('/');
var addSlash = (path.slice(path.length - 1, path.length) === '/') ? true : false;
var pout = [];
for (var i = 0; i < ps.length; i++) {
var el = ps[i];
if (el === '..') {
if (pout.length > 0) {
if (pout[pout.length - 1] !== '..') {
pout.pop();
} else {
pout.push('..');
}
} else {
pout.push('..');
}
//} else if (el == '') {
// // pass
} else {
pout.push(el);
}
}
var pnew = pout.join('/');
if (addSlash) {
pnew += '/';
}
pnew = pPrefix + pnew;
return pnew;
};
/**
* Get an attribute from the script tag that invokes music21 via its data-main
* attribute.
*
* E.g. if you invoked music21 with:
* <script src="require.js" data-main="src/music21" quiet="2" hi="hello"></script>
*
* then "getM21attribute('quiet')" would return "2".
*
*/
var getM21attribute = function (attrName) {
var scripts = document.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
var s = scripts[i];
var dataMain = s.getAttribute('data-main');
if (dataMain && ((/music21/.test(dataMain)) || (/m21/.test(dataMain)))) {
var m21Attribute = s.getAttribute(attrName);
if (m21Attribute === undefined) {
m21Attribute = s.getAttribute(attrName.toLowerCase());
}
//console.log(m21Attribute);
return m21Attribute;
}
}
};
/**
* Should we warn about obsolete web browsers? default Yes.
*/
var warnBanner = (getM21attribute('warnBanner') !== 'no' ) ? true : false;
//get scriptConfig
if (typeof m21conf === 'undefined') {
m21conf = {};
var m21browserAttribute = getM21attribute('m21conf');
if (m21browserAttribute !== null && m21browserAttribute !== undefined) {
try {
m21conf = JSON.parse(m21browserAttribute);
} catch (e) {
console.log('Unable to JSON parse ' + m21browserAttribute.toString() + ' into m21conf');
}
}
}
if (typeof m21srcPath === 'undefined') {
if (typeof require !== 'undefined') {
m21srcPath = pathSimplify(require.toUrl('music21').replace(/\?bust=\w*/, '') + '/..');
//console.log('m21srcPath: ' + m21srcPath);
}
}
m21basis.m21basePath = pathSimplify(m21srcPath + '/..');
m21basis.m21srcPath = m21srcPath;
//console.log('m21srcPath', m21srcPath);
//console.log('m21srcPath non simplified', require.toUrl('music21'));
var m21requireConfig = {
// note: for building make sure to change notes in
// Gruntfile.js, especially the rollup section.
paths: {
'jquery': pathSimplify(m21srcPath + '/ext/jquery/jquery-3.2.1.min'),
'attrchange': pathSimplify(m21srcPath + '/ext/jqueryPlugins/attrchange'),
'jquery-ui': pathSimplify(m21srcPath + '/ext/jqueryPlugins/jqueryUI/jquery-ui.min'),
'vexflow': pathSimplify(m21srcPath + '/ext/vexflow/vexflow-min'),
'MIDI': pathSimplify(m21srcPath + '/ext/midijs/build/MIDI'),
'jasmidMidifile': pathSimplify(m21srcPath + '/ext/midijs/inc/jasmid/midifile'),
'jasmidReplayer': pathSimplify(m21srcPath + '/ext/midijs/inc/jasmid/replayer'),
'jasmidStream': pathSimplify(m21srcPath + '/ext/midijs/inc/jasmid/stream'),
// a very nice event handler from Mudcu.be that handles drags
'eventjs': pathSimplify(m21srcPath + '/ext/midijs/examples/inc/event'),
// read binary data in base64. In "shim" but is not a shim.
'base64Binary': pathSimplify(m21srcPath + '/ext/midijs/inc/shim/Base64binary'),
// browser shims
'webMidiApiShim': pathSimplify(m21srcPath + '/ext/midijs/inc/shim/WebMIDIAPI'), //not currently loaded/used?
'webAudioShim': pathSimplify(m21srcPath + '/ext/midijs/inc/shim/WebAudioAPI'), // Safari prefixed to <= 9; IE <= Edge
'es6Shim': pathSimplify(m21srcPath + '/ext/es6-shim/es6-shim.min'),
'babelPolyfill': pathSimplify(m21srcPath + '/ext/polyfill'),
'm21': pathSimplify(m21srcPath + '/../build/music21.debug'),
'jsonpickle': pathSimplify(m21srcPath + '/ext/jsonpickle/build/jsonpickle.debug'),
// formerly used Shims (IE9)
//'base64Shim': pathSimplify(m21srcPath + '/ext/midijs/inc/shim/Base64'),
//'vexflowMods': 'ext/vexflowMods',
},
shim: {
'eventjs': {
exports: 'eventjs',
},
'webMidiApiShim': {
deps: ['es6Shim'],
exports: 'window',
},
'MIDI': {
deps: [ //'base64Shim', // Bye-bye IE9!
'base64Binary', 'webAudioShim',
'jasmidMidifile', 'jasmidReplayer', 'jasmidStream', 'eventjs'],
exports: 'MIDI',
},
'attrchange': {
deps: [ 'jquery' ],
exports: 'jQuery.attrchange',
},
'jquery-ui': {
deps: [ 'jquery' ],
exports: 'jQuery.ui'
},
'vexflow': {
deps: [ 'jquery' ],
exports: 'Vex'
},
'm21': {
deps: ['jquery', 'MIDI', 'vexflow', 'jsonpickle', 'babelPolyfill'],
exports: 'm21'
}
}
};
//console.log('jsonpickle in music21: ', m21requireConfig.packages[0].location);
// m21requireConfig.paths['../ext/jquery.js'] = m21requireConfig.paths.jquery;
var m21modules = [
'm21',
'MIDI',
'vexflow',
'jquery',
'jsonpickle',
'jquery-ui',
'attrchange',
'es6Shim',
'babelPolyfill',
//'webmidiapi',
];
//BUG: will this work if multiple files are listed in noLoad???
if (m21conf.noLoad !== undefined) {
m21conf.noLoad.forEach(function(val, i, noLoad) {
var mi = m21modules.indexOf(val);
if (mi !== -1) {
m21modules.splice(mi, 1);
}
});
}
music21 = {}; // global
if ((Object.defineProperties === undefined) && warnBanner) {
var newDiv = document.createElement("div");
newDiv.setAttribute('style',
'font-size: 40px; padding: 40px 20px 40px 20px; margin-top: 20px; line-height: 50px; width: 500px; height: 400px; color: #ffffff; background-color: #900000;');
var textInside = document.createTextNode(
'Unfortunately, IE, Edge 12, Safari 9, and other out-of-date browsers do not work well with music21j. Please upgrade your browser w/ the link above.');
newDiv.appendChild(textInside);
document.body.appendChild(newDiv);
var $buoop = {
vs: {i: 12, f: -4, o: -4, s: 9, c: -4},
test: false,
reminder: 0,
}; // used by update.js...
var e = document.createElement("script");
e.setAttribute("type", "text/javascript");
e.setAttribute("src", "http://browser-update.org/update.js");
document.body.appendChild(e);
} else {
if ( typeof define === "function" && define.amd) {
require.config(m21requireConfig);
//console.log(require.nameToUrl('jquery'));
define( m21modules,
function (m21, midi, vexflow, $, jsonpickle) { // BUG, what if midi is in noLoad?
//console.log('inside of require...');
music21 = m21;
for (var u in m21.common.urls) {
m21.common.urls[u] = m21basis.m21basePath + m21.common.urls[u];
}
music21.m21basePath = m21basis.m21basePath;
music21.m21srcPath = m21basis.m21srcPath;
music21.VERSION = m21basis.VERSION;
music21.scriptConfig = m21conf;
//console.log(music21.chord);
if (midi) { music21.MIDI = midi; }
if (vexflow) { music21.Vex = vexflow; }
else { console.log('could not load VexFlow'); }
if (music21.MIDI) {
if ((music21.scriptConfig.loadSoundfont === undefined) ||
(music21.scriptConfig.loadSoundfont !== false)) {
music21.miditools.loadSoundfont('acoustic_grand_piano');
} else {
console.log('skipping loading sound font');
}
}
if ((music21.scriptConfig.renderHTML === undefined) ||
(music21.scriptConfig.renderHTML !== false)) {
$(document).ready(function() {
music21.tinyNotation.renderNotationDivs();
});
}
//console.log('end inside of require...');
return music21;
});
}
}
</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>