UNPKG

@stringsync/vexml

Version:

MusicXML to Vexflow

204 lines (203 loc) 8.38 kB
"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;