@stringsync/vexml
Version:
MusicXML to Vexflow
66 lines (65 loc) • 2.09 kB
JavaScript
import * as util from '../util';
/**
* Describes playback elements in a human readable format.
*/
export class ElementDescriber {
elements;
constructor(elements) {
this.elements = elements;
}
static noop() {
return new ElementDescriber(new Map());
}
static create(score, { partIndex }) {
const elements = new Map();
score
.getMeasures()
.flatMap((measure) => measure.getFragments())
.flatMap((fragment) => fragment.getParts().at(partIndex) ?? [])
.flatMap((part) => part.getStaves())
.flatMap((stave) => stave.getVoices())
.flatMap((voice) => voice.getEntries())
.forEach((element, index) => {
elements.set(element, index);
});
return new ElementDescriber(elements);
}
describe(element) {
switch (element.name) {
case 'part':
return this.describePart(element);
case 'system':
return this.describeSystem(element);
case 'note':
return this.describeNote(element);
case 'rest':
return this.describeRest(element);
case 'fragment':
return this.describeFragment();
case 'measure':
return this.describeMeasure(element);
}
}
describePart(part) {
return `part(${part.getIndex()})`;
}
describeSystem(system) {
return `system(${system.getIndex()})`;
}
describeMeasure(measure) {
return `measure(${measure.getAbsoluteMeasureIndex()})`;
}
describeFragment() {
return 'fragment';
}
describeRest(rest) {
util.assert(this.elements.has(rest), 'Expected element to be indexed');
const index = this.elements.get(rest);
return `element(${index})`;
}
describeNote(note) {
util.assert(this.elements.has(note), 'Expected element to be indexed');
const index = this.elements.get(note);
return `element(${index})`;
}
}