opensheetmusicdisplay
Version:
An open source JavaScript engine for displaying MusicXML based on VexFlow.
214 lines (213 loc) • 9.53 kB
TypeScript
import { Fraction } from "../../Common/DataObjects/Fraction";
import { VerticalSourceStaffEntryContainer } from "./VerticalSourceStaffEntryContainer";
import { SourceStaffEntry } from "./SourceStaffEntry";
import { RepetitionInstruction } from "./Instructions/RepetitionInstruction";
import { Staff } from "./Staff";
import { VoiceEntry } from "./VoiceEntry";
import { Voice } from "./Voice";
import { MusicSheet } from "../MusicSheet";
import { MultiExpression } from "./Expressions/MultiExpression";
import { MultiTempoExpression } from "./Expressions/MultiTempoExpression";
import { RehearsalExpression } from "./Expressions/RehearsalExpression";
import { KeyInstruction } from "./Instructions/KeyInstruction";
import { SystemLinesEnum } from "../Graphical/SystemLinesEnum";
import { EngravingRules } from "../Graphical/EngravingRules";
import { GraphicalMeasure } from "../Graphical/GraphicalMeasure";
import { RhythmInstruction } from "./Instructions";
/**
* The Source Measure represents the source data of a unique measure, including all instruments with their staves.
* There exists one source measure per XML measure or per paper sheet measure (e.g. the source measures are not doubled in repetitions)
*/
export declare class SourceMeasure {
/**
* The data entries and data lists will be filled with null values according to the total number of staves,
* so that existing objects can be referred to by staff index.
* @param completeNumberOfStaves
* @param rules
*/
constructor(completeNumberOfStaves: number, rules: EngravingRules);
/**
* The unique measure list index starting with 0.
*/
measureListIndex: number;
/**
* The style of the ending bar line.
*/
endingBarStyleXml: string;
endingBarStyleEnum: SystemLinesEnum;
/** Whether the MusicXML says to print a new system (line break). See OSMDOptions.newSystemFromXML */
printNewSystemXml: boolean;
/** Whether the MusicXML says to print a new page (page break). See OSMDOptions.newPageFromXML */
printNewPageXml: boolean;
IsSystemStartMeasure: boolean;
/** The graphical measure width will be multiplied by this factor.
* E.g. factor 0.6 = 60% will make the measure only 60% as long as before.
* Note that this potentially causes issues by counteracting systems like lyrics overlap prevention,
* and if you give Vexflow too little width to render it will eventually cause other layout issues too.
* This factor is also read by a custom XML attribute osmdWidthFactor in the measure node,
* e.g. <measure number="1" osmdWidthFactor="0.6">
* This will either be multiplicative with a sheet-wide widthFactor or override it, depending on settings.
* (TODO sheet-wide widthFactor not yet implemented)
*/
WidthFactor: number;
private measureNumber;
MeasureNumberXML: number;
MeasureNumberPrinted: number;
RhythmPrinted: RhythmInstruction;
multipleRestMeasures: number;
private absoluteTimestamp;
private completeNumberOfStaves;
private duration;
private activeTimeSignature;
hasLyrics: boolean;
hasMoodExpressions: boolean;
/** Whether the SourceMeasure only has rests, no other entries.
* Not the same as GraphicalMeasure.hasOnlyRests, because one SourceMeasure can have many GraphicalMeasures (staffs).
*/
allRests: boolean;
isReducedToMultiRest: boolean;
/** If this measure is a MultipleRestMeasure, this is the number of the measure in that sequence of measures. */
multipleRestMeasureNumber: number;
private staffLinkedExpressions;
private tempoExpressions;
rehearsalExpression: RehearsalExpression;
private verticalSourceStaffEntryContainers;
private implicitMeasure;
private hasEndLine;
hasEndClef: boolean;
private graphicalMeasureErrors;
private firstInstructionsStaffEntries;
private lastInstructionsStaffEntries;
private firstRepetitionInstructions;
private lastRepetitionInstructions;
private rules;
private tempoInBPM;
private verticalMeasureList;
get MeasureNumber(): number;
set MeasureNumber(value: number);
getPrintedMeasureNumber(): number;
get AbsoluteTimestamp(): Fraction;
set AbsoluteTimestamp(value: Fraction);
get CompleteNumberOfStaves(): number;
get Duration(): Fraction;
set Duration(value: Fraction);
get ActiveTimeSignature(): Fraction;
set ActiveTimeSignature(value: Fraction);
get ImplicitMeasure(): boolean;
set ImplicitMeasure(value: boolean);
get HasEndLine(): boolean;
set HasEndLine(value: boolean);
get StaffLinkedExpressions(): MultiExpression[][];
get TempoExpressions(): MultiTempoExpression[];
get VerticalSourceStaffEntryContainers(): VerticalSourceStaffEntryContainer[];
get FirstInstructionsStaffEntries(): SourceStaffEntry[];
get LastInstructionsStaffEntries(): SourceStaffEntry[];
get FirstRepetitionInstructions(): RepetitionInstruction[];
get LastRepetitionInstructions(): RepetitionInstruction[];
getErrorInMeasure(staffIndex: number): boolean;
setErrorInGraphicalMeasure(staffIndex: number, hasError: boolean): void;
getNextMeasure(measures: SourceMeasure[]): SourceMeasure;
getPreviousMeasure(measures: SourceMeasure[]): SourceMeasure;
get Rules(): EngravingRules;
get VerticalMeasureList(): GraphicalMeasure[];
set VerticalMeasureList(value: GraphicalMeasure[]);
get TempoInBPM(): number;
set TempoInBPM(value: number);
/**
* Check at the given timestamp if a VerticalContainer exists, if not creates a new, timestamp-ordered one,
* and at the given index, if a [[SourceStaffEntry]] exists, and if not, creates a new one.
* @param inMeasureTimestamp
* @param inSourceMeasureStaffIndex
* @param staff
* @returns {{createdNewContainer: boolean, staffEntry: SourceStaffEntry}}
*/
findOrCreateStaffEntry(inMeasureTimestamp: Fraction, inSourceMeasureStaffIndex: number, staff: Staff): {
createdNewContainer: boolean;
staffEntry: SourceStaffEntry;
};
/**
* Check if a VerticalContainer, a staffEntry and a voiceEntry exist at the given timestamp.
* If not, create the necessary entries.
* @param sse
* @param voice
* @returns {{createdVoiceEntry: boolean, voiceEntry: VoiceEntry}}
*/
findOrCreateVoiceEntry(sse: SourceStaffEntry, voice: Voice): {
createdVoiceEntry: boolean;
voiceEntry: VoiceEntry;
};
/**
* Search for a non-null [[SourceStaffEntry]] at the given verticalIndex,
* starting from the given horizontalIndex and moving backwards. If none is found, then return undefined.
* @param verticalIndex
* @param horizontalIndex
* @returns {any}
*/
getPreviousSourceStaffEntryFromIndex(verticalIndex: number, horizontalIndex: number): SourceStaffEntry;
/**
* Return the index of the existing VerticalContainer at the given timestamp.
* @param musicTimestamp
* @returns {number}
*/
getVerticalContainerIndexByTimestamp(musicTimestamp: Fraction): number;
/**
* Return the existing VerticalContainer at the given timestamp.
* @param musicTimestamp
* @returns {any}
*/
getVerticalContainerByTimestamp(musicTimestamp: Fraction): VerticalSourceStaffEntryContainer;
/**
* Check the [[SourceMeasure]] for a possible VerticalContainer with all of its [[StaffEntry]]s undefined,
* and if found, remove the VerticalContainer from the [[SourceMeasure]].
* @param index
*/
checkForEmptyVerticalContainer(index: number): void;
/**
* This method is used for handling a measure with the following error (in the procedure of finding out the Instrument's Duration):
* If the LastStaffEntry is missing (implied restNote or error), then go back the StaffEntries until you find a TiedNote (tie Start),
* which gives the correct MeasureDuration.
* @param musicSheet
* @param maxInstDuration
* @returns {Fraction}
*/
reverseCheck(musicSheet: MusicSheet, maxInstDuration: Fraction): Fraction;
/**
* Calculate all the [[Instrument]]'s NotesDurations for this Measures.
* @param musicSheet
* @param instrumentMaxTieNoteFractions
* @returns {Fraction[]}
*/
calculateInstrumentsDuration(musicSheet: MusicSheet, instrumentMaxTieNoteFractions: Fraction[]): Fraction[];
getEntriesPerStaff(staffIndex: number): SourceStaffEntry[];
/**
*
* @returns {boolean} true iff some measure begin instructions have been found for at least one staff
*/
hasBeginInstructions(): boolean;
beginsWithLineRepetition(): boolean;
/**
* Check if this measure is a Repetition Ending.
* @returns {boolean}
*/
endsWithLineRepetition(): boolean;
/**
* Check if a Repetition starts at the next Measure.
* @returns {boolean}
*/
beginsWithWordRepetition(): boolean;
/**
* Check if this Measure ends a Repetition.
* @returns {boolean}
*/
endsWithWordRepetition(): boolean;
beginsRepetitionEnding(): boolean;
endsRepetitionEnding(): boolean;
getKeyInstruction(staffIndex: number): KeyInstruction;
/**
* Return the first non-null [[SourceStaffEntry]] at the given InstrumentIndex.
* @param instrumentIndex
* @returns {SourceStaffEntry}
*/
private getLastSourceStaffEntryForInstrument;
canBeReducedToMultiRest(): boolean;
}