@stringsync/vexml
Version:
MusicXML to Vexflow
69 lines (68 loc) • 2.6 kB
JavaScript
import * as vexflow from 'vexflow';
import * as util from '../util';
import { Rect } from '../spatial';
export class Wedge {
config;
log;
document;
key;
registry;
constructor(config, log, document, key, registry) {
this.config = config;
this.log = log;
this.document = document;
this.key = key;
this.registry = registry;
}
render() {
const wedge = this.document.getWedge(this.key);
const renders = this.registry.get(wedge.id).filter((r) => r.type === 'note' || r.type === 'rest');
const vexflowStaveHairpins = this.renderVexflowStaveHairpins(renders);
return {
type: 'wedge',
key: this.key,
rect: Rect.empty(),
vexflowStaveHairpins,
};
}
renderVexflowStaveHairpins(renders) {
if (renders.length < 2) {
this.log.warn('cannot render wedge with less than 2 notes, skipping', { wedgeIndex: this.key.wedgeIndex });
return [];
}
const vexflowStaveHairpins = new Array();
const systemIndexes = util.unique(renders.map((n) => n.key.systemIndex));
for (const systemIndex of systemIndexes) {
const systemScopedRenders = renders.filter((n) => n.key.systemIndex === systemIndex);
if (systemScopedRenders.length > 1) {
const vexflowStaveHairpin = this.renderSingleStaveHairpin(systemScopedRenders);
vexflowStaveHairpins.push(vexflowStaveHairpin);
}
}
return vexflowStaveHairpins;
}
renderSingleStaveHairpin(renders) {
const wedge = this.document.getWedge(this.key);
const firstNote = renders.at(0).vexflowNote;
const lastNote = renders.at(-1).vexflowNote;
let vexflowStaveHairpinType;
switch (wedge.wedgeType) {
case 'crescendo':
vexflowStaveHairpinType = vexflow.StaveHairpin.type.CRESC;
break;
case 'diminuendo':
vexflowStaveHairpinType = vexflow.StaveHairpin.type.DECRESC;
break;
}
let vexflowModifierPosition;
switch (wedge.placement) {
case 'above':
vexflowModifierPosition = vexflow.Modifier.Position.ABOVE;
break;
case 'below':
vexflowModifierPosition = vexflow.Modifier.Position.BELOW;
break;
}
return new vexflow.StaveHairpin({ firstNote, lastNote }, vexflowStaveHairpinType).setPosition(vexflowModifierPosition);
}
}