UNPKG

@stringsync/vexml

Version:

MusicXML to Vexflow

145 lines (144 loc) 6.74 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.System = void 0; const util = __importStar(require("../../util")); const conversions = __importStar(require("./conversions")); const measure_1 = require("./measure"); const signature_1 = require("./signature"); const contexts_1 = require("./contexts"); const eventcalculator_1 = require("./eventcalculator"); const jumpgroup_1 = require("./jumpgroup"); class System { config; log; measures; constructor(config, log, measures) { this.config = config; this.log = log; this.measures = measures; } static create(config, log, musicXML) { const partIds = musicXML.scorePartwise.getParts().map((part) => part.getId()); const measureCount = util.max(musicXML.scorePartwise.getParts().map((part) => part.getMeasures().length)); const measureLabels = System.getMeasureLabels(measureCount, musicXML); const measureEvents = new eventcalculator_1.EventCalculator(config, log, { scorePartwise: musicXML.scorePartwise }).calculate(); const jumpGroups = System.getJumpGroups(config, log, measureCount, musicXML); const startBarlineStyles = System.getBarlineStyles(measureCount, 'left', musicXML, jumpGroups); const endBarlineStyles = System.getBarlineStyles(measureCount, 'right', musicXML, jumpGroups); const measures = new Array(measureCount); let signature = signature_1.Signature.default(config, log); for (let measureIndex = 0; measureIndex < measureCount; measureIndex++) { const measureLabel = measureLabels[measureIndex]; const jumpGroup = jumpGroups[measureIndex]; const startBarlineStyle = startBarlineStyles[measureIndex]; const endBarlineStyle = endBarlineStyles[measureIndex]; const measure = measure_1.Measure.create(config, log, signature, measureIndex, measureLabel, measureEvents.filter((event) => event.measureIndex === measureIndex), partIds, jumpGroup, startBarlineStyle, endBarlineStyle); measures[measureIndex] = measure; signature = measure.getLastSignature(); } return new System(config, log, measures); } static getMeasureLabels(measureCount, musicXML) { const measureLabels = new Array(measureCount).fill(null); const part = util.first(musicXML.scorePartwise.getParts()); if (!part) { return measureLabels; } const measures = part.getMeasures(); for (let measureIndex = 0; measureIndex < measureCount; measureIndex++) { const measure = measures[measureIndex]; if (measure.isImplicit()) { measureLabels[measureIndex] = null; } const number = parseInt(measure.getNumber(), 10); if (Number.isInteger(number) && !Number.isNaN(number)) { measureLabels[measureIndex] = number; } else { measureLabels[measureIndex] = measureIndex + 1; } } return measureLabels; } static getJumpGroups(config, log, measureCount, musicXML) { const jumpGroups = new Array(); for (let measureIndex = 0; measureIndex < measureCount; measureIndex++) { const jumpGroup = jumpgroup_1.JumpGroup.create(config, log, measureIndex, musicXML); jumpGroups.push(jumpGroup); } return jumpGroups; } static getBarlineStyles(measureCount, location, musicXML, jumpGroups) { const barlineStyles = new Array(measureCount).fill(null); for (let measureIndex = 0; measureIndex < measureCount; measureIndex++) { const jumpGroup = jumpGroups[measureIndex]; let jumpGroupBarlineStyle = null; if (location === 'left') { jumpGroupBarlineStyle = jumpGroup.getStartBarlineStyle(); } if (location === 'right') { jumpGroupBarlineStyle = jumpGroup.getEndBarlineStyle(); } const barlineStyle = jumpGroupBarlineStyle ?? conversions.fromMusicXMLBarStyleToBarlineStyle(musicXML.scorePartwise .getParts() .flatMap((part) => part.getMeasures().at(measureIndex)?.getBarlines() ?? []) .filter((barline) => barline.getLocation() === location) .map((barline) => barline.getBarStyle()) .at(0)); barlineStyles[measureIndex] = barlineStyle; } return barlineStyles; } parse(scoreCtx) { const systemCtx = new contexts_1.SystemContext(scoreCtx); const parsedMeasures = new Array(); for (const measure of this.measures) { const multiRestEvents = measure.getEvents().filter((event) => event.type === 'multirest'); for (const multiRestEvent of multiRestEvents) { systemCtx.incrementMultiRestCount(multiRestEvent.partId, multiRestEvent.staveNumber, multiRestEvent.measureCount); } const parsedMeasure = measure.parse(systemCtx); parsedMeasures.push(parsedMeasure); systemCtx.decrementMultiRestCounts(); } return { type: 'system', measures: parsedMeasures, }; } } exports.System = System;