music21j-port
Version:
A toolkit for computer-aided musicology, Javascript version
915 lines (739 loc) • 23 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>Music21j Source: music21/clef.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/clef.js</h1>
<section>
<article>
<pre
class="sunlight-highlight-javascript linenums">/**
* music21j -- Javascript reimplementation of Core music21p features.
* music21/clef -- Clef objects
*
* note: only defines a single Clef object for now
*
* Copyright (c) 2013-14, Michael Scott Cuthbert and cuthbertLab
* Based on music21 (=music21p), Copyright (c) 2006–14, Michael Scott Cuthbert and cuthbertLab
*
*/
import { base } from './base.js';
import { pitch } from './pitch.js';
/**
* Clef module, see {@link music21.clef} for namespace
*
* @exports music21/clef
*/
/**
* Clef related objects and properties
*
* @namespace music21.clef
* @memberof music21
* @requires music21/base
* @requires music21/pitch
*/
export const clef = {};
/* music21.Clef
must be defined before Stream since Stream subclasses call new music21.Clef...
*/
// TODO: Fix to newest Vexflow format...
clef.lowestLines = {
treble: 31,
soprano: 29,
'mezzo-soprano': 27,
alto: 25,
tenor: 23,
bass: 19,
percussion: 31,
};
/**
* Clefname can be one of
* "treble", "bass", "soprano", "mezzo-soprano", "alto", "tenor", "percussion"
*
* @class Clef
* @memberof music21.clef
* @extends music21.base.Music21Object
* @param {string} name - clef name
* @param {int} [octaveChange=0] - ottava
* @property {string|undefined} name
* @property {int} lowestLine - diatonicNoteNum (C4 = 29) for the lowest line (in a five-line staff)
* @property {int} lowestLineTrebleOffset - difference between the first line of this staff and the first line in treble clef
* @property {int} octaveChange
*/
export class Clef extends base.Music21Object {
constructor(name, octaveChange) {
super();
if (name !== undefined) {
name = name.toLowerCase();
this.name = name;
this.lowestLine = clef.lowestLines[name];
this.lowestLineTrebleOffset
= clef.lowestLines.treble - this.lowestLine;
} else {
this.name = undefined;
this.lowestLine = clef.lowestLines.treble;
this.lowestLineTrebleOffset = 0;
}
if (octaveChange === undefined) {
this.octaveChange = 0;
} else {
this.octaveChange = octaveChange;
this.lowestLine += 7 * octaveChange;
this.lowestLineTrebleOffset -= 7 * octaveChange;
}
}
/**
* returns a new pitch object if the clef name is not Treble
* designed so it would look the same as it would in treble clef.
* for instance, bass-clef 2nd-space C# becomes treble clef 2nd-space A#
* used for Vex.Flow which requires all pitches to be input as if they
* are in treble clef.
*
* @memberof music21.clef.Clef
* @param {music21.pitch.Pitch} p
* @returns {music21.pitch.Pitch} new pitch
*/
convertPitchToTreble(p) {
if (this.lowestLine === undefined) {
console.log('no first line defined for clef', this.name, this);
return p; // error
}
const lowestLineDifference = this.lowestLineTrebleOffset;
const tempPitch = new pitch.Pitch(p.step);
tempPitch.octave = p.octave;
tempPitch.diatonicNoteNum += lowestLineDifference;
tempPitch.accidental = p.accidental;
return tempPitch;
}
}
clef.Clef = Clef;
/**
* A TrebleClef (same as new music21.clef.Clef('treble')
*
* @class TrebleClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class TrebleClef extends Clef {
constructor() {
super('treble');
}
}
clef.TrebleClef = TrebleClef;
/**
* A TrebleClef down an octave (same as new music21.clef.Clef('treble', -1)
*
* Unlike music21p, currently not a subclass of TrebleClef.
*
* @class Treble8vbClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class Treble8vbClef extends Clef {
constructor() {
super('treble', -1);
}
}
clef.Treble8vbClef = Treble8vbClef;
/**
* A TrebleClef up an octave (same as new music21.clef.Clef('treble', 1)
*
* @class Treble8vaClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class Treble8vaClef extends Clef {
constructor() {
super('treble', 1);
}
}
clef.Treble8vaClef = Treble8vaClef;
/**
* A BassClef (same as new music21.clef.Clef('bass')
*
* @class BassClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class BassClef extends Clef {
constructor() {
super('bass');
}
}
clef.BassClef = BassClef;
/**
* An AltoClef (same as new music21.clef.Clef('alto')
*
* @class AltoClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class AltoClef extends Clef {
constructor() {
super('alto');
}
}
clef.AltoClef = AltoClef;
/**
* A Tenor Clef (same as new music21.clef.Clef('tenor')
*
* @class TenorClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class TenorClef extends Clef {
constructor() {
super('tenor');
}
}
clef.TenorClef = TenorClef;
/**
* A Soprano Clef (same as new music21.clef.Clef('soprano')
*
* @class SopranoClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class SopranoClef extends Clef {
constructor() {
super('soprano');
}
}
clef.SopranoClef = SopranoClef;
/**
* A Mezzo-Soprano Clef (same as new music21.clef.Clef('mezzo-soprano')
*
* @class MezzoSopranoClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class MezzoSopranoClef extends Clef {
constructor() {
super('mezzo-soprano');
}
}
clef.MezzoSopranoClef = MezzoSopranoClef;
/**
* A Percussion Clef (same as new music21.clef.Clef('percussion')
*
* First line is treated as if it's treble clef. Not available as "bestClef"
*
* @class PercussionClef
* @memberof music21.clef
* @extends music21.clef.Clef
*/
export class PercussionClef extends Clef {
constructor() {
super('percussion');
}
}
clef.PercussionClef = PercussionClef;
/**
* Looks at the pitches in a Stream and returns the best clef
* of Treble and Bass
*
* @function music21.clef.bestClef
* @memberof music21.clef
* @param {music21.stream.Stream} st
* @returns {music21.clef.Clef}
*/
clef.bestClef = function bestClef(st) {
// console.log('calling flat on stream: ', st.elements.length, st.classes[st.classes.length - 1]);
const stFlat = st.flat;
let totalNotes = 0;
let totalPitch = 0.0;
for (let i = 0; i < stFlat.length; i++) {
const el = stFlat.get(i);
if (el.pitch !== undefined) {
totalNotes += 1;
totalPitch += el.pitch.diatonicNoteNum;
} else if (el.pitches !== undefined) {
for (let j = 0; j < el.pitches.length; j++) {
totalNotes += 1;
totalPitch += el.pitches[j].diatonicNoteNum;
}
}
}
let averageHeight;
if (totalNotes === 0) {
averageHeight = 29;
} else {
averageHeight = totalPitch / totalNotes;
}
// console.log('bestClef: average height', averageHeight);
if (averageHeight > 28) {
// 29 = c4
return new clef.TrebleClef();
} else {
return new clef.BassClef();
}
};
clef.clefFromString = function clefFromString(clefString, octaveShift) {
if (octaveShift === undefined) {
octaveShift = 0;
}
const xnStr = clefString.trim();
let thisType;
let lineNum;
if (xnStr.toLowerCase() === 'percussion') {
return new clef.PercussionClef(clefString, octaveShift);
} // todo: tab, none, jianpu
if (xnStr.length === 2) {
thisType = xnStr[0].toUpperCase();
lineNum = xnStr[1];
} else if (xnStr.length === 1) {
thisType = xnStr[0].toUpperCase();
if (thisType === 'G') {
lineNum = 2;
} else if (thisType === 'F') {
lineNum = 4;
} else if (thisType === 'C') {
lineNum = 3;
} else {
lineNum = 0;
}
}
const arrayEqual = (a, b) =>
a.length === b.length && a.every((el, ix) => el === b[ix]);
const params = [thisType, lineNum, octaveShift];
if (arrayEqual(params, ['G', 2, 0])) {
return new clef.TrebleClef();
} else if (arrayEqual(params, ['G', 2, -1])) {
return new clef.Treble8vbClef();
} else if (arrayEqual(params, ['G', 2, 1])) {
return new clef.Treble8vaClef();
} else if (arrayEqual(params, ['F', 4, 0])) {
return new clef.BassClef();
} else if (arrayEqual(params, ['F', 4, -1])) {
return new clef.Bass8vbClef();
} else if (arrayEqual(params, ['C', 3, 0])) {
return new clef.AltoClef();
} else if (arrayEqual(params, ['C', 4, 0])) {
return new clef.TenorClef();
} else {
return new clef.Clef(xnStr, octaveShift);
}
};
</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>