@stringsync/vexml
Version:
MusicXML to Vexflow
204 lines (203 loc) • 8.38 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.Score = void 0;
const util = __importStar(require("../util"));
const system_1 = require("./system");
const label_1 = require("./label");
const spatial_1 = require("../spatial");
const pen_1 = require("./pen");
const systemrendermover_1 = require("./systemrendermover");
const curve_1 = require("./curve");
const wedge_1 = require("./wedge");
const pedal_1 = require("./pedal");
const octaveshift_1 = require("./octaveshift");
const renderregistry_1 = require("./renderregistry");
const vibrato_1 = require("./vibrato");
/**
* Score is the top-level rendering object that is directly responsible for arranging systems.
*/
class Score {
config;
log;
document;
width;
constructor(config, log, document, width) {
this.config = config;
this.log = log;
this.document = document;
this.width = width;
}
render() {
const pen = new pen_1.Pen();
pen.moveBy({ dy: this.config.SCORE_PADDING_TOP });
const titleRender = this.renderTitle(pen);
const systemRenders = this.renderSystems(pen);
const registry = renderregistry_1.RenderRegistry.create(systemRenders);
const curveRenders = this.renderCurves(registry);
const wedgeRenders = this.renderWedges(registry);
const pedalRenders = this.renderPedals(registry);
const octaveShiftRenders = this.renderOctaveShifts(registry);
const vibratoRenders = this.renderVibratos(registry);
pen.moveBy({ dy: this.config.SCORE_PADDING_BOTTOM });
const width = this.width ?? util.max(systemRenders.map((system) => system.rect.w));
const rect = new spatial_1.Rect(0, 0, width, pen.position().y);
return {
type: 'score',
rect,
titleRender,
systemRenders,
curveRenders,
wedgeRenders,
pedalRenders,
octaveShiftRenders,
vibratoRenders,
};
}
renderTitle(pen) {
const title = this.document.getTitle();
if (!title) {
return null;
}
const position = pen.position();
const padding = this.getTitlePadding();
const font = this.getTitleFont();
let label;
if (this.width) {
label = label_1.Label.centerAligned(this.config, this.log, this.width, title, position, padding, font);
}
else {
label = label_1.Label.singleLine(this.config, this.log, title, position, padding, font);
}
const rect = label.rect;
pen.moveBy({ dy: rect.h });
return {
type: 'title',
rect,
label,
};
}
renderCurves(registry) {
const curves = this.document.getCurves();
const curveRenders = new Array();
for (let curveIndex = 0; curveIndex < curves.length; curveIndex++) {
const key = { curveIndex };
const noteRenderCount = registry.get(curves[curveIndex].id)?.length ?? 0;
if (noteRenderCount >= 1) {
const curveRender = new curve_1.Curve(this.config, this.log, this.document, key, registry).render();
curveRenders.push(curveRender);
}
}
return curveRenders;
}
renderWedges(registry) {
const wedges = this.document.getWedges();
const wedgeRenders = new Array();
for (let wedgeIndex = 0; wedgeIndex < wedges.length; wedgeIndex++) {
const key = { wedgeIndex };
const noteRenderCount = registry.get(wedges[wedgeIndex].id)?.length ?? 0;
if (noteRenderCount >= 1) {
const wedgeRender = new wedge_1.Wedge(this.config, this.log, this.document, key, registry).render();
wedgeRenders.push(wedgeRender);
}
}
return wedgeRenders;
}
renderPedals(registry) {
const pedals = this.document.getPedals();
const pedalRenders = new Array();
for (let pedalIndex = 0; pedalIndex < pedals.length; pedalIndex++) {
const key = { pedalIndex };
const noteRenderCount = registry.get(pedals[pedalIndex].id)?.length ?? 0;
if (noteRenderCount >= 1) {
const pedalRender = new pedal_1.Pedal(this.config, this.log, this.document, key, registry).render();
pedalRenders.push(pedalRender);
}
}
return pedalRenders;
}
renderOctaveShifts(registry) {
const octaveShifts = this.document.getOctaveShifts();
const octaveShiftRenders = new Array();
for (let octaveShiftIndex = 0; octaveShiftIndex < octaveShifts.length; octaveShiftIndex++) {
const key = { octaveShiftIndex };
const noteRenderCount = registry.get(octaveShifts[octaveShiftIndex].id)?.length ?? 0;
if (noteRenderCount >= 1) {
const octaveShiftRender = new octaveshift_1.OctaveShift(this.config, this.log, this.document, key, registry).render();
octaveShiftRenders.push(octaveShiftRender);
}
}
return octaveShiftRenders;
}
renderVibratos(registry) {
const vibratos = this.document.getVibratos();
const vibratoRenders = new Array();
for (let vibratoIndex = 0; vibratoIndex < vibratos.length; vibratoIndex++) {
const key = { vibratoIndex };
const noteRenderCount = registry.get(vibratos[vibratoIndex].id)?.length ?? 0;
if (noteRenderCount >= 1) {
const vibratoRender = new vibrato_1.Vibrato(this.config, this.log, this.document, key, registry).render();
vibratoRenders.push(vibratoRender);
}
}
return vibratoRenders;
}
getTitlePadding() {
return { bottom: this.config.TITLE_PADDING_BOTTOM };
}
getTitleFont() {
return {
color: 'black',
family: this.config.TITLE_FONT_FAMILY,
size: this.config.TITLE_FONT_SIZE,
lineHeight: this.config.TITLE_FONT_LINE_HEIGHT_PX,
};
}
renderSystems(pen) {
const systemRenders = new Array();
const systemCount = this.document.getSystemCount();
for (let systemIndex = 0; systemIndex < systemCount; systemIndex++) {
const key = { systemIndex };
const systemRender = new system_1.System(this.config, this.log, this.document, key, this.width, pen.position()).render();
systemRenders.push(systemRender);
const excessHeight = util.max(systemRender.measureRenders.flatMap((m) => m.fragmentRenders).flatMap((e) => e.excessHeight));
new systemrendermover_1.SystemRenderMover().moveBy(systemRender, excessHeight);
pen.moveTo(systemRender.rect.bottomLeft());
pen.moveBy({ dy: this.config.SYSTEM_MARGIN_BOTTOM });
}
return systemRenders;
}
}
exports.Score = Score;