@stringsync/vexml
Version:
MusicXML to Vexflow
145 lines (144 loc) • 6.74 kB
JavaScript
;
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;