@stringsync/vexml
Version:
MusicXML to Vexflow
168 lines (167 loc) • 6.68 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Articulation = void 0;
const vexflow = __importStar(require("vexflow"));
const spatial_1 = require("../spatial");
class Articulation {
config;
log;
document;
key;
constructor(config, log, document, key) {
this.config = config;
this.log = log;
this.document = document;
this.key = key;
}
render() {
const vexflowModifiers = this.renderVexflowModifiers();
return {
type: 'articulation',
key: this.key,
rect: spatial_1.Rect.empty(),
vexflowModifiers,
};
}
renderVexflowModifiers() {
const articulation = this.document.getArticulation(this.key);
let position;
switch (articulation.placement) {
case 'above':
position = vexflow.Modifier.Position.ABOVE;
break;
case 'below':
position = vexflow.Modifier.Position.BELOW;
break;
default:
position = vexflow.Modifier.Position.ABOVE;
}
function vexflowArticulation(type, position) {
const a = new vexflow.Articulation(type);
if (position) {
a.setPosition(position);
}
return a;
}
function vexflowAnnotation(text, position) {
const a = new vexflow.Annotation(text);
if (position) {
a.setPosition(position);
}
return a;
}
function vexflowOrnament(type, position) {
const o = new vexflow.Ornament(type);
if (position) {
o.setPosition(position);
}
return o;
}
switch (articulation.articulationType) {
case 'upright-normal-fermata':
return [vexflowArticulation('a@a', position)];
case 'upright-angled-fermata':
return [vexflowArticulation('a@s', position)];
case 'upright-square-fermata':
return [vexflowArticulation('a@l', position)];
case 'inverted-normal-fermata':
return [vexflowArticulation('a@u', position)];
case 'inverted-angled-fermata':
return [vexflowArticulation('a@v', position)];
case 'inverted-square-fermata':
return [vexflowArticulation('a@r', position)];
case 'upstroke':
return [vexflowArticulation('a|', position)];
case 'downstroke':
return [vexflowArticulation('am', position)];
case 'harmonic':
return [vexflowArticulation('ah', position)];
case 'open-string':
return [vexflowArticulation('ah', position)];
case 'double-tongue':
return [vexflowArticulation('..', position)];
case 'triple-tongue':
return [vexflowArticulation('...', position)];
case 'stopped':
return [vexflowArticulation('a+', position)];
case 'snap-pizzicato':
return [vexflowArticulation('ao', position)];
case 'tap':
return [vexflowAnnotation('T', position)];
case 'heel':
return [vexflowAnnotation('U', position)];
case 'toe':
return [vexflowAnnotation('^', position)];
case 'accent':
return articulation.placement === 'above'
? [vexflowArticulation('a>', position)]
: [vexflowArticulation('a-', position)];
case 'strong-accent':
return [vexflowArticulation('a^', position)];
case 'staccato':
return [vexflowArticulation('a.', position)];
case 'tenuto':
return [vexflowArticulation('a-')];
case 'detached-legato':
return [vexflowArticulation('a.', position), vexflowArticulation('a-', position)];
case 'staccatissimo':
return [vexflowArticulation('av', position)];
case 'scoop':
return [vexflowOrnament('scoop')];
case 'doit':
return [vexflowOrnament('doit')];
case 'falloff':
return [vexflowOrnament('fall')];
case 'breath-mark':
return articulation.placement === 'above'
? [vexflowArticulation('a>', position)]
: [vexflowArticulation('a-', position)];
case 'arpeggio-roll-up':
return [new vexflow.Stroke(vexflow.Stroke.Type.ROLL_UP)];
case 'arpeggio-roll-down':
return [new vexflow.Stroke(vexflow.Stroke.Type.ROLL_DOWN)];
case 'arpeggio-directionless':
return [new vexflow.Stroke(vexflow.Stroke.Type.ARPEGGIO_DIRECTIONLESS)];
case 'trill-mark':
return [vexflowOrnament('tr', position)];
case 'mordent':
return [vexflowOrnament('mordent')];
case 'inverted-mordent':
return [vexflowOrnament('mordentInverted')];
}
}
}
exports.Articulation = Articulation;