UNPKG

@stringsync/vexml

Version:

MusicXML to Vexflow

69 lines (68 loc) 2.6 kB
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); } }