Skip to content

Commit

Permalink
Expose measure fragments, staves, and stave entries
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredjj3 committed Dec 15, 2023
1 parent 6fd88f7 commit a0bad78
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 195 deletions.
28 changes: 14 additions & 14 deletions src/rendering/chorus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,20 @@ export class Chorus {
});
}

@util.memoize()
getVoices(): Voice[] {
switch (this.data.type) {
case 'wholerest':
return this.createWholeRest();
case 'multivoice':
return this.createMultiVoice({
keySignature: this.data.keySignature,
measureEntries: this.data.measureEntries,
quarterNoteDivisions: this.data.quarterNoteDivisions,
});
}
}

/** Returns the minimum justify width for the stave in a measure context. */
@util.memoize()
getMinJustifyWidth(address: Address<'chorus'>): number {
Expand Down Expand Up @@ -139,20 +153,6 @@ export class Chorus {
};
}

@util.memoize()
private getVoices(): Voice[] {
switch (this.data.type) {
case 'wholerest':
return this.createWholeRest();
case 'multivoice':
return this.createMultiVoice({
keySignature: this.data.keySignature,
measureEntries: this.data.measureEntries,
quarterNoteDivisions: this.data.quarterNoteDivisions,
});
}
}

private createWholeRest(): Voice[] {
return [
Voice.wholeRest({
Expand Down
246 changes: 123 additions & 123 deletions src/rendering/measure.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,129 @@ export class Measure {
this.measureEntries = opts.measureEntries;
}

@util.memoize()
getFragments(): MeasureFragment[] {
const fragments = new Array<MeasureFragment>();

const measureIndex = this.index;

const beginningBarStyle =
this.musicXml.measure
.getBarlines()
.find((barline) => barline.getLocation() === 'left')
?.getBarStyle() ?? 'regular';

const endBarStyle =
this.musicXml.measure
.getEndingMeasure()
.getBarlines()
.find((barline) => barline.getLocation() === 'right')
?.getBarStyle() ?? 'regular';

let staveSignature = this.leadingStaveSignature;
let currentMeasureEntries = new Array<MeasureEntry>();

const config = this.config;
const staveCount = this.staveCount;
const staveLayouts = this.musicXml.staveLayouts;

let measureFragmentIndex = 0;

function addFragment(
leadingStaveSignature: StaveSignature,
measureEntries: MeasureEntry[],
beginningBarStyle: musicxml.BarStyle,
endBarStyle: musicxml.BarStyle
) {
const fragment = new MeasureFragment({
config,
index: measureFragmentIndex++,
leadingStaveSignature,
beginningBarStyle: beginningBarStyle,
endBarStyle: endBarStyle,
staveCount,
staveLayouts,
measureEntries,
});
fragments.push(fragment);
}

for (let measureEntryIndex = 0; measureEntryIndex < this.measureEntries.length; measureEntryIndex++) {
const measureEntry = this.measureEntries[measureEntryIndex];
const isLastMeasureEntry = measureEntryIndex === this.measureEntries.length - 1;

if (measureEntry instanceof StaveSignature) {
const didStaveModifiersChange = measureEntry.getChangedStaveModifiers().length > 0;
if (didStaveModifiersChange && currentMeasureEntries.length > 0) {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
'none'
);
currentMeasureEntries = [];
}

staveSignature = measureEntry;
} else if (
measureEntry instanceof musicxml.Direction &&
measureEntry.getTypes().some((directionType) => {
const content = directionType.getContent();
return content.type === 'metronome' && content.metronome.isSupported();
}) &&
currentMeasureEntries.length > 0
) {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
'none'
)
currentMeasureEntries = [];
}

currentMeasureEntries.push(measureEntry);

if (isLastMeasureEntry) {
const nextStaveSignature = staveSignature?.getNext();
const hasClefChangeAtMeasureBoundary =
nextStaveSignature?.getChangedStaveModifiers().includes('clef') &&
nextStaveSignature?.getMeasureIndex() === measureIndex + 1 &&
nextStaveSignature?.getMeasureEntryIndex() === 0;

if (hasClefChangeAtMeasureBoundary) {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
'none',
);

// prettier-ignore
addFragment(
nextStaveSignature,
[nextStaveSignature],
'none',
endBarStyle
);
} else {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
endBarStyle
);
}
}
}

return fragments;
}

/** Returns the index of the measure. */
getIndex(): number {
return this.index;
Expand Down Expand Up @@ -186,129 +309,6 @@ export class Measure {
};
}

@util.memoize()
private getFragments(): MeasureFragment[] {
const fragments = new Array<MeasureFragment>();

const measureIndex = this.index;

const beginningBarStyle =
this.musicXml.measure
.getBarlines()
.find((barline) => barline.getLocation() === 'left')
?.getBarStyle() ?? 'regular';

const endBarStyle =
this.musicXml.measure
.getEndingMeasure()
.getBarlines()
.find((barline) => barline.getLocation() === 'right')
?.getBarStyle() ?? 'regular';

let staveSignature = this.leadingStaveSignature;
let currentMeasureEntries = new Array<MeasureEntry>();

const config = this.config;
const staveCount = this.staveCount;
const staveLayouts = this.musicXml.staveLayouts;

let measureFragmentIndex = 0;

function addFragment(
leadingStaveSignature: StaveSignature,
measureEntries: MeasureEntry[],
beginningBarStyle: musicxml.BarStyle,
endBarStyle: musicxml.BarStyle
) {
const fragment = new MeasureFragment({
config,
index: measureFragmentIndex++,
leadingStaveSignature,
beginningBarStyle: beginningBarStyle,
endBarStyle: endBarStyle,
staveCount,
staveLayouts,
measureEntries,
});
fragments.push(fragment);
}

for (let measureEntryIndex = 0; measureEntryIndex < this.measureEntries.length; measureEntryIndex++) {
const measureEntry = this.measureEntries[measureEntryIndex];
const isLastMeasureEntry = measureEntryIndex === this.measureEntries.length - 1;

if (measureEntry instanceof StaveSignature) {
const didStaveModifiersChange = measureEntry.getChangedStaveModifiers().length > 0;
if (didStaveModifiersChange && currentMeasureEntries.length > 0) {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
'none'
);
currentMeasureEntries = [];
}

staveSignature = measureEntry;
} else if (
measureEntry instanceof musicxml.Direction &&
measureEntry.getTypes().some((directionType) => {
const content = directionType.getContent();
return content.type === 'metronome' && content.metronome.isSupported();
}) &&
currentMeasureEntries.length > 0
) {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
'none'
)
currentMeasureEntries = [];
}

currentMeasureEntries.push(measureEntry);

if (isLastMeasureEntry) {
const nextStaveSignature = staveSignature?.getNext();
const hasClefChangeAtMeasureBoundary =
nextStaveSignature?.getChangedStaveModifiers().includes('clef') &&
nextStaveSignature?.getMeasureIndex() === measureIndex + 1 &&
nextStaveSignature?.getMeasureEntryIndex() === 0;

if (hasClefChangeAtMeasureBoundary) {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
'none',
);

// prettier-ignore
addFragment(
nextStaveSignature,
[nextStaveSignature],
'none',
endBarStyle
);
} else {
// prettier-ignore
addFragment(
staveSignature,
currentMeasureEntries,
fragments.length === 0 ? beginningBarStyle : 'none',
endBarStyle
);
}
}
}

return fragments;
}

private getLabel(): string {
return this.musicXml.measure.isImplicit() ? '' : this.musicXml.measure.getNumber() || (this.index + 1).toString();
}
Expand Down
50 changes: 25 additions & 25 deletions src/rendering/measurefragment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,31 @@ export class MeasureFragment {
this.endBarStyle = opts.endBarStyle;
}

@util.memoize()
getStaves(): Stave[] {
const staves = new Array<Stave>(this.staveCount);

for (let staveIndex = 0; staveIndex < this.staveCount; staveIndex++) {
const staveNumber = staveIndex + 1;

staves[staveIndex] = new Stave({
config: this.config,
staveSignature: this.leadingStaveSignature,
number: staveNumber,
beginningBarStyle: this.beginningBarStyle,
endBarStyle: this.endBarStyle,
measureEntries: this.measureEntries.filter((entry) => {
if (entry instanceof musicxml.Note) {
return entry.getStaveNumber() === staveNumber;
}
return true;
}),
});
}

return staves;
}

/** Returns the index of the measure fragment within the measure. */
getIndex(): number {
return this.index;
Expand Down Expand Up @@ -151,31 +176,6 @@ export class MeasureFragment {
};
}

@util.memoize()
private getStaves(): Stave[] {
const staves = new Array<Stave>(this.staveCount);

for (let staveIndex = 0; staveIndex < this.staveCount; staveIndex++) {
const staveNumber = staveIndex + 1;

staves[staveIndex] = new Stave({
config: this.config,
staveSignature: this.leadingStaveSignature,
number: staveNumber,
beginningBarStyle: this.beginningBarStyle,
endBarStyle: this.endBarStyle,
measureEntries: this.measureEntries.filter((entry) => {
if (entry instanceof musicxml.Note) {
return entry.getStaveNumber() === staveNumber;
}
return true;
}),
});
}

return staves;
}

/** Returns the minimum justify width. */
@util.memoize()
private getMinJustifyWidth(address: Address<'measurefragment'>): number {
Expand Down
Loading

0 comments on commit a0bad78

Please sign in to comment.