{"version":3,"sources":["webpack://opensheetmusicdisplay/webpack/universalModuleDefinition","webpack://opensheetmusicdisplay/webpack/bootstrap","webpack://opensheetmusicdisplay/./src/Common/DataObjects/Fraction.ts","webpack://opensheetmusicdisplay/./node_modules/loglevel/lib/loglevel.js","webpack://opensheetmusicdisplay/./src/Common/DataObjects/Pitch.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/BoundingBox.ts","webpack://opensheetmusicdisplay/./src/Common/DataObjects/PointF2D.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalObject.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/AbstractExpression.ts","webpack://opensheetmusicdisplay/./src/Common/Enums/TextAlignment.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Instructions/ClefInstruction.ts","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/util.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/vex.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/fraction.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/registry.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/element.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/boundingboxcomputation.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/boundingbox.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/fonts/vexflow_font.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/glyph.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tables.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/canvascontext.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/raphaelcontext.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/svgcontext.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/renderer.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stem.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tuplet.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/beam.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/voice.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/staveconnector.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tickable.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/note.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/notehead.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stemmablenote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/modifier.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/dot.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavenote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/frethandfinger.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/music.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/accidental.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/notesubgroup.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavetie.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tabtie.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/gracenotegroup.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/strokes.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stringnumber.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/articulation.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tickcontext.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/ornament.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/annotation.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/bend.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/vibrato.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/modifiercontext.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/formatter.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavemodifier.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavebarline.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/staverepetition.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavesection.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavetempo.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/textnote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavetext.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/clef.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/keysignature.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/timesignature.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavevolta.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stave.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tabstave.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tabnote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/vibratobracket.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/multimeasurerest.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/clefnote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/keysignote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/timesignote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tabslide.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/gracenote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/gracetabnote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tuning.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/stavehairpin.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/curve.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/textdynamics.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/staveline.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/pedalmarking.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/textbracket.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/barnote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/ghostnote.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/tremolo.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/crescendo.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/parser.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/easyscore.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/factory.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/system.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/index.js","webpack://opensheetmusicdisplay/./node_modules/vexflow/src/keymanager.js","webpack://opensheetmusicdisplay/./src/MusicalScore/Exceptions.ts","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/Dictionary.js","webpack://opensheetmusicdisplay/./src/MusicalScore/Label.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/MusicSheetCalculator.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Instructions/KeyInstruction.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/VoiceEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Instructions/RhythmInstruction.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowConverter.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetDrawer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalLine.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/DrawingEnums.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalLabel.ts","webpack://opensheetmusicdisplay/./src/Common/Enums/FontStyles.ts","webpack://opensheetmusicdisplay/./src/Util/CollectionUtil.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/SourceStaffEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Instructions/RepetitionInstruction.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Interfaces/ITextTranslation.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/DrawingParameters.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/EngravingRules.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Note.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/ContinuousExpressions/OctaveShift.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/SystemLinesEnum.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/ContinuousExpressions/ContinuousDynamicExpression.ts","webpack://opensheetmusicdisplay/./src/OpenSheetMusicDisplay/index.ts","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/arrays.js","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/SystemLinePosition.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/LinkedVoice.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/AbstractGraphicalExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/index.ts","webpack://opensheetmusicdisplay/(webpack)/buildin/global.js","webpack://opensheetmusicdisplay/./src/OpenSheetMusicDisplay/OSMDOptions.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalMusicPage.ts","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/index.js","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/ChordSymbolContainer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Instructions/AbstractNotationInstruction.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/OrnamentContainer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Voice.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/VerticalSourceStaffEntryContainer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalContinuousDynamicExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/index.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/InstantaneousDynamicExpression.ts","webpack://opensheetmusicdisplay/./src/Common/DataObjects/RectangleF2D.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/StaffLineActivitySymbol.ts","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/LinkedList.js","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalMusicSheet.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalInstantaneousTempoExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/InstantaneousTempoExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/ContinuousExpressions/ContinuousTempoExpression.ts","webpack://opensheetmusicdisplay/./src/Common/FileIO/Xml.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Instrument.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/InstrumentalGroup.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Notehead.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/MusicSymbol.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowTextMeasurer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalInstantaneousDynamicExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/SourceMeasure.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowContinuousDynamicExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/CanvasVexFlowBackend.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowBackend.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowGraphicalNote.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowInstrumentBracket.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowMeasure.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowVoiceEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Instructions/TechnicalInstruction.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Tie.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicSource/PartListEntry.ts","webpack://opensheetmusicdisplay/./src/index.ts","webpack://opensheetmusicdisplay/./src/OpenSheetMusicDisplay/AJAX.ts","webpack://opensheetmusicdisplay/./src/OpenSheetMusicDisplay/Cursor.ts","webpack://opensheetmusicdisplay/./src/Common/DataObjects/SizeF2D.ts","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/Set.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/BSTreeKV.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/Queue.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/Heap.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/FactoryDictionary.js","webpack://opensheetmusicdisplay/./src/Common/Enums/index.ts","webpack://opensheetmusicdisplay/./src/Common/Enums/Fonts.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VerticalGraphicalStaffEntryContainer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/MusicSystemBuilder.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/Clickable.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/OctaveShiftParams.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/AccidentalCalculator.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/AbstractTempoExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalUnknownExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowGraphicalSymbolFactory.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowMusicSystem.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/MusicSystem.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Staff.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/SystemLine.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/MusicSheetDrawer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/DrawingMode.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Arpeggio.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Beam.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/NoteType.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/AlignmentManager.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalChordSymbolContainer.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalCurve.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalLyricEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalLyricWord.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalMeasure.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalNote.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalOctaveShift.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalSlur.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalStaffEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalTie.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalVoiceEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/SkyBottomLineCalculator.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/StaffLine.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/SvgVexFlowBackend.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowInstantaneousDynamicExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowInstrumentBrace.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowOctaveShift.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowStaffEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowStaffLine.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/StaffEntryLink.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Tuplet.ts","webpack://opensheetmusicdisplay/./src/Common/index.ts","webpack://opensheetmusicdisplay/./src/Common/FileIO/Mxl.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSheetReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicSheet.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicSource/Repetition.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicSource/SourceMusicPart.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/InstrumentReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/VoiceGenerator.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/LyricsReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/ArticulationReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/ChordSymbolReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/ExpressionReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/MoodExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/UnknownExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/SlurReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/SubInstrument.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModuleFactory.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/RepetitionInstructionReader.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/RepetitionCalculator.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/index.ts","webpack://opensheetmusicdisplay/./node_modules/process/browser.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/Bag.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/BSTree.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/LinkedDictionary.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/MultiDictionary.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/PriorityQueue.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/Stack.js","webpack://opensheetmusicdisplay/./node_modules/typescript-collections/dist/lib/MultiRootTree.js","webpack://opensheetmusicdisplay/./src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/AbstractGraphicalInstruction.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalComment.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalMarkedArea.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalRectangle.ts","webpack://opensheetmusicdisplay/./src/Common/DataObjects/Matrix2D.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/GraphicalStaffEntryLink.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/SelectionEndSymbol.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/SelectionStartSymbol.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/index.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/DynamicExpressionSymbolEnum.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowSlur.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Instructions/index.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexFlowTabMeasure.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/Graphical/VexFlow/VexflowStafflineNoteCalculator.ts","webpack://opensheetmusicdisplay/./src/Common/FileIO/index.ts","webpack://opensheetmusicdisplay/./node_modules/jszip/dist/jszip.min.js","webpack://opensheetmusicdisplay/./node_modules/buffer/index.js","webpack://opensheetmusicdisplay/./node_modules/base64-js/index.js","webpack://opensheetmusicdisplay/./node_modules/ieee754/index.js","webpack://opensheetmusicdisplay/./node_modules/isarray/index.js","webpack://opensheetmusicdisplay/./node_modules/timers-browserify/main.js","webpack://opensheetmusicdisplay/./node_modules/setimmediate/setImmediate.js","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicParts/MusicPartManager.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicParts/MusicPartManagerIterator.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/HelperObjects/DynamicsContainer.ts","webpack://opensheetmusicdisplay/./src/Common/DataObjects/MusicSheetErrors.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Lyrics/LyricsWord.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Lyrics/LyricsEntry.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/TabNote.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/MultiTempoExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/MultiExpression.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/VoiceData/Expressions/ContinuousExpressions/Slur.ts","webpack://opensheetmusicdisplay/./src/Common/Strings/StringUtil.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicSource/index.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/MusicSource/MappingSourceMusicPart.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/index.ts","webpack://opensheetmusicdisplay/./src/MusicalScore/ScoreIO/MusicSymbolModules/index.ts","webpack://opensheetmusicdisplay/./src/Util/index.ts","webpack://opensheetmusicdisplay/./src/Util/PSMath.ts"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Fraction","numerator","denominator","wholeValue","simplify","this","setRealValue","f1","f2","RealValue","Denominator","Numerator","fraction","sum","clone","Add","Sub","a","b","result","realValue","expansionValue","maxAllowedDenominator","upTestFraction","downTestFraction","obj","diff","frac","lte","lt","greatestCommonDenominator","Math","abs","whole","floor","maximumAllowedNumber","factor","round","timeSignature","beatDistance","distanceFromBeat","FloatInaccuracyTolerance","beatStep","definition","noop","isIE","navigator","test","userAgent","logMethods","bindMethod","methodName","method","Function","e","apply","arguments","traceForIE","console","log","trace","realMethod","undefined","replaceLoggingMethods","level","loggerName","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","Logger","defaultLevel","currentLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","location","indexOf","encodeURIComponent","exec","slice","levels","getLevel","setLevel","persist","toUpperCase","SILENT","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","enableAll","TRACE","disableAll","initialLevel","defaultLogger","_loggersByName","getLogger","TypeError","logger","_log","noConflict","getLoggers","NoteEnum","AccidentalEnum","Pitch","fundamentalNote","octave","accidental","NONE","halfTone","octXmlDiff","HalfTonesFromAccidental","frequency","calcFrequency","note","C","D","E","F","G","A","B","pitch","transpose","newHalfTone","AccidentalHalfTones","WrapAroundCheck","limit","overflow","halfToneSteps","octaveSteps","pow","LN10","halftoneFactor","calcFractionalKey","halftone","pitchEnumValues","SHARP","halftoneInOctave","FLAT","NATURAL","DOUBLESHARP","DOUBLEFLAT","QUARTERTONESHARP","QUARTERTONEFLAT","TRIPLESHARP","TRIPLEFLAT","Error","halfTones","acc","getHigherPitchByTransposeFactor","getLowerPitchByTransposeFactor","getPreviousFundamentalNote","AccidentalFromHalfTones","getNextFundamentalNote","accidentalString","accidentalVexflow","getNoteEnumString","toString","p2","FundamentalNote","Octave","Accidental","noteEnumIndex","newNoteEnum","newOctave","fundamental","LN2","ColDirEnum","dataObject","parent","isSymbol","relativePositionHasBeenSet","xBordersHaveBeenSet","yBordersHaveBeenSet","absolutePosition","PointF2D","relativePosition","size","SizeF2D","marginSize","upperLeftCorner","upperLeftMarginCorner","borderLeft","borderRight","borderTop","borderBottom","borderMarginLeft","borderMarginRight","borderMarginTop","borderMarginBottom","childElements","Parent","calculateRectangle","calculateMarginRectangle","boundingRectangle","boundingMarginRectangle","index","ChildElements","splice","error","constructor","push","RelativePosition","x","BorderMarginRight","BorderMarginLeft","y","BorderMarginBottom","BorderMarginTop","AbsolutePosition","idx","len","calculateAbsolutePositionsRecursive","calculateBoundingBox","minLeft","Number","MAX_VALUE","maxRight","MIN_VALUE","minTop","maxBottom","minMarginLeft","maxMarginRight","minMarginTop","maxMarginBottom","childElement","min","max","calculateTopBottomBorders","EngravingRules","FixStafflineBoundingBox","StaffLineActivitySymbol","placementPsi","direction","position","setAbsolutePositionFromParent","currentPosition","hasBeenMoved","Left","Right","calculateMarginPositionAlongDirection","Up","Down","ArgumentOutOfRangeException","psi","overlapWidth","overlapHeight","leftBorderInside","rightBorderInside","topBorderInside","bottomBorderInside","leftMarginInside","rightMarginInside","topMarginInside","bottomMarginInside","calculatePositionAlongDirection","clickPosition","pointLiesInsideBorders","innerObject","getClickedObjectOfType","region","liesInside","liesInsideBorders","collisionDetection","child","concat","getObjectsInRegion","BorderLeft","BorderTop","BorderRight","BorderBottom","RectangleF2D","createFromLocationAndSize","toBePlaced","marginCollisionDetection","shiftDistance","p1","boundingBox","PlacementEnum","placement","stringList","inputString","toLowerCase","trim","placementString","Above","Below","NotYetDefined","TextAlignmentEnum","textAlignment","LeftTop","LeftCenter","LeftBottom","CenterTop","CenterCenter","CenterBottom","RightTop","RightCenter","RightBottom","ClefInstruction","AbstractNotationInstruction","clefType","ClefEnum","octaveOffset","line","super","calcParameters","instrument","MidiInstrument","Acoustic_Grand_Piano","Electric_Bass_finger","Electric_Bass_pick","Fretless_Bass","Slap_Bass_1","Slap_Bass_2","Synth_Bass_1","Synth_Bass_2","Contrabass","clefList","clefInstructionG","j","clefInstructionF","clef","percussion","TAB","clefPitch","referenceCyPosition","other","Line","clef2","Equals","_hasOwnProperty","isFunction","func","isUndefined","isString","has","prop","defaultCompare","defaultEquals","defaultToString","item","makeString","join","toret","first","reverseCompareFunction","compareFunction","v","compareToEquals","Vex","L","block","args","Array","MakeException","message","data","RERR","RuntimeError","code","Merge","destination","source","Min","Max","forEach","fn","RoundN","parseInt","MidLine","mid_line","SortAndUnique","arr","cmp","eq","newArr","last","sort","Contains","getCanvasContext","canvas_sel","canvas","getElementById","getContext","drawDot","ctx","color","save","setFillStyle","beginPath","arc","PI","closePath","fill","restore","BM","f","start_time","Date","getTime","elapsed","StackTrace","stack","W","Prefix","text","prefix","GCD","LCM","arg0","shift","LCMM","set","u","gcd","param1","param2","otherNumerator","otherDenominator","lcm","compare","__compareA","copy","__compareB","subtract","greaterThanEquals","greaterThan","__tmp","q","quotient","toSimplifiedString","str","split","X","setIndexValue","id","elem","Registry","clear","registry","defaultRegistry","type","class","oldValue","getAttribute","setAttribute","INDEXES","updateIndex","onRegister","attrName","keys","map","getElementsByAttribute","className","array","filter","includes","ID","attrs","newID","el","classes","context","rendered","getDefaultRegistry","register","style","getStyle","shadowColor","setShadowColor","shadowBlur","setShadowBlur","fillStyle","strokeStyle","setStrokeStyle","lineWidth","setLineWidth","checkContext","applyStyle","draw","restoreStyle","onUpdate","BoundingBoxComputation","x1","y1","x2","y2","NaN","addPoint","isNaN","p0x","p0y","p1x","p1y","p2x","p2y","cp1x","cp1y","cp2x","cp2y","addBezierCurve","p3x","p3y","p0","p3","addX","addY","b2ac","t1","sqrt","t2","BoundingBox","that","w","h","new_x","new_y","new_w","new_h","rect","stroke","Font","processOutline","outline","originX","originY","scaleX","scaleY","outlineFns","command","nextX","nextY","font","cache","glyph","glyphs","x_min","x_max","ha","cached_outline","x_pos","y_pos","point","val","nocache","scale","resolution","metrics","loadMetrics","renderOutline","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","bboxComp","addQuadraticCurve","width","height","options","x_shift","y_shift","originShift","setOptions","reset","stave","bbox","getOutlineBoundingBox","getW","getH","xShift","getX","yShift","getY","setOriginX","setOriginY","setRendered","getYForGlyphs","Flow","STEM_WIDTH","STEM_HEIGHT","STAVE_LINE_THICKNESS","RESOLUTION","DEFAULT_NOTATION_FONT_SCALE","DEFAULT_TABLATURE_FONT_SCALE","SLASH_NOTEHEAD_WIDTH","TEXT_HEIGHT_OFFSET_HACK","IsKerned","props","clefProperties","values","line_shift","keyProperties","params","octave_shift","pieces","k","note_values","int_value","int_val","shift_right","extraProps","glyph_name","customNoteHeads","displaced","rest","stem_up_x_offset","stem_down_x_offset","stem_up_y_offset","stem_down_y_offset","integerToNote","integer","noteValue","table","0","1","2","3","4","5","6","7","8","9","10","11","tabToGlyph","fret","shift_y","glyphMetrics","getMetrics","textWidth","getWidth","articulationCodes","artic","articulations","between_lines","accidentalCodes","accidentals","parenRightPaddingAdjustment","accidentalColumnsTable","second_on_bottom","spaced_out_tetrachord","spaced_out_pentachord","very_spaced_out_pentachord","spaced_out_hexachord","very_spaced_out_hexachord","ornamentCodes","ornaments","keySignature","spec","keySpec","keySpecs","notes","accidentalList","acc_list","num","unicode","String","fromCharCode","parseNoteDurationString","durationString","duration","dots","parseNoteStruct","noteStruct","durationStringData","ticks","durationToTicks","customTypes","getGlyphProps","validTypes","currentTicks","sanitizeDuration","alias","durationAliases","durations","durationToFraction","parse","durationToNumber","duration_codes","glyphTypeProperties","customGlyphTypeProperties","code_head","common","stem","stem_offset","flag","stem_up_extension","stem_down_extension","tabnote_stem_up_extension","tabnote_stem_down_extension","dot_shiftY","line_above","line_below","beam_count","code_flag_upstem","code_flag_downstem","smufl","to_code_points","bracketTop","bracketBottom","barlineTick","segno","coda","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKomaSharp","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articMarcatoAbove","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentMordentInverted","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arrowheadBlackUp","arrowheadBlackDown","TIME4_4","num_beats","beat_value","CANVAS_BROWSER_SIZE_LIMIT","vexFlowCanvasContext","WIDTH","HEIGHT","clearRect","family","weight","background_fillStyle","blur","cap_type","lineCap","dash","lineDash","parseFloat","SanitizeCanvasDims","resize","fillRect","radius","startAngle","endAngle","antiClockwise","glow","measureText","fillText","RaphaelContext","element","paper","Raphael","path","pen","state","font_family","font_size","font_weight","attributes","background_attributes","shadow_attributes","state_stack","transform","setSize","viewBox","attr","normalizeAngle","angle","tmp","delta","arcHelper","cos","sin","largeArcFlag","sweepFlag","out","sa","num_paths","toFixed","opacity","strokeWidth","txt","bounds","getBBox","remove","pop","attrNamesToIgnoreMap","fontAttrNamesToIgnore","svgNS","svg","appendChild","groups","iePolyfill","svgElementType","createElementNS","cls","group","pointerBBox","ie","bold","italic","replace","fontAttributes","fontSize","fontArray","match","applyAttributes","visibleWidth","visibleHeight","setViewBox","xMin","yMin","viewBoxString","attrNamesToIgnore","nodeName","propertyName","setAttributeNS","lastChild","removeChild","rectangle","add","peth","textContent","ieMeasureTextFix","widthCorrection","lastContext","CANVAS","RAPHAEL","SVG","VML","UP","DOWN","elementId","backend","background","renderer","setBackgroundFillStyle","buildContext","Backends","USE_CANVAS_PROXY","fromX","fromY","toX","toY","dashPattern","dx","dy","atan2","dashLength","nx","ny","bolsterCanvasContext","devicePixelRatio","x_begin","x_end","y_top","y_bottom","stem_extension","stem_direction","hide","isStemlet","stemletHeight","renderHeightAdjustment","ext","CATEGORY","y_offset","isStemUp","ys","stemHeight","innerMostNoteheadY","outerMostNoteheadY","topY","baseY","isVisible","stem_x","stem_y","getHeight","DEBUG","stemletYOffset","num_notes","beats_occupied","beatsOccupiedDeprecationWarning","notes_occupied","bracketed","some","beam","ratioed","LOCATION_TOP","AlignRestsToNotes","resolveGlyphs","attach","setTuplet","resetTuplet","LOCATION_BOTTOM","msg","warn","getNotesOccupied","beats","setNotesOccupied","detach","numerator_glyphs","unshift","denom_glyphs","first_note","maxTupletCount","countTuplets","minTupletCount","tupletStack","tuplet","tupletCount","nested_tuplet_y_offset","getNestedTupletCount","NESTING_OFFSET","getStave","getYForLine","top_y","getStemDirection","getStemExtents","bottom_y","last_note","getTieLeftX","getTieRightX","getStemX","getYPosition","addGlyphWidth","reduce","notation_start_x","line_width","x_offset","render","colon_x","colon_radius","calculateStemDirection","lineSum","keyProps","keyProp","BEAM_LEFT","BEAM_BOTH","time_sig","beatTotal","beatValue","voice","generateBeams","getTickables","config","tickGroups","multiply","unprocessedNotes","currentTickGroup","noteGroups","currentGroup","nextTickGroup","nextGroup","unprocessedNote","shouldIgnoreTicks","ticksPerGroup","totalTicks","memo","getTicks","unbeamable","equals","createGroups","sanitizedGroups","tempGroup","isFirstOrLast","prevNote","breaksOnEachRest","beam_rests","isRest","breaksOnFirstOrLastRest","beam_middle_only","breakOnStemChange","maintain_stem_directions","prevDirection","isUnbeamableDuration","sanitizeGroups","stemDirection","findFirstNote","setStemDirection","applyStemDirection","beamedNoteGroups","beamable","getIntrinsicTicks","allTuplets","uniqueTuplets","getTuplets","beams","show_stemlets","render_options","secondary_breaks","secondary_break_ticks","flat_beams","flat_beam_offset","setTupletLocation","setBracketed","auto_stem","hasStem","getCategory","setBeam","postFormatted","getBeamCount","break_on_indices","beam_width","max_slope","min_slope","slope_iterations","slope_cost","stemlet_extension","partial_beam_length","min_flat_beam_offset","getGlyph","beamCount","indices","first_x_px","first_y_px","slope","firstNote","initialSlope","lastNote","firstStemTipY","firstStemX","getStemSlope","increment","minCost","bestSlope","totalStemExtension","yShiftTemp","adjustedStemTipY","getSlopeY","stemTipY","idealSlope","cost","total","extremeY","extremeBeamCount","currentExtreme","getYs","offset","extremeTest","newOffset","beamY","getBeamYToDraw","stemX","beamedStemTipY","preBeamExtension","getStem","getExtension","beamExtension","setExtension","totalBeamWidth","setVisibility","setStemlet","prev_tick","tick","next_tick","lookup_duration","prev_note_gets_beam","next_note_gets_beam","note_gets_beam","lookupBeamDirection","tick_of_duration","beam_lines","beam_started","current_beam","previous_should_break","tick_tally","should_break","prev_note","next_note","beam_alone","end","start","beam_direction","last_beam","setContext","valid_beam_durations","beamThickness","beamLines","getBeamLines","beam_line","startBeamX","startBeamY","lastBeamX","lastBeamY","calculateFlatSlope","calculateSlope","applyStemExtensions","postFormat","drawStems","drawBeamLines","STRICT","SOFT","FULL","time","resolutionMultiplier","tickables","ticksUsed","smallestTickCount","largestTickWidth","Mode","voiceGroup","bb","setStave","getBoundingBox","mergeWith","g","strict","tickable","lessThan","setVoice","addTickable","preFormatted","tickable_bb","drawWithStyle","drawBoldDoubleLine","topX","botY","BOLD_DOUBLE_LEFT","BOLD_DOUBLE_RIGHT","variableWidth","SINGLE_RIGHT","SINGLE_LEFT","SINGLE","DOUBLE","BRACE","BRACKET","THIN_DOUBLE","singleRight","singleLeft","single","double","brace","bracket","boldDoubleLeft","boldDoubleRight","thinDouble","none","top_stave","bottom_stave","thickness","texts","typeString","content","shift_x","getNumLines","attachment_height","x3","y3","cpx1","cpy1","cpx2","cpy2","cpx3","cpy3","cpx4","cpy4","cpx5","cpy5","cpx6","cpy6","cpx7","cpy7","cpx8","cpy8","renderGlyph","setFont","text_width","getBottomLineY","intrinsicTicks","tickMultiplier","tickContext","modifierContext","modifiers","align_center","center_x_shift","ignore_ticks","formatterMetrics","freedom","left","right","iterations","space","used","mean","deviation","isCenterAligned","noteCount","notesOccupied","getNoteCount","applyTickMultiplier","mc","mod","tc","preFormat","yPos","xStart","getAbsoluteX","modLeftPx","extraLeftPx","xPre1","xAbs","xPost1","noteWidth","xPost2","extraRightPx","xEnd","modRightPx","xFreedomRight","getFormatterMetrics","xWidth","getXShift","yy","spaceDeviation","initStruct","JSON","stringify","noteType","duration_override","setDuration","setIntrinsicTicks","customGlyphs","positions","playNote","left_modPx","right_modPx","setCenterAlignment","annotation_spacing","stave_padding","STAVEPADDING","setNote","setIndex","setPreFormatted","setYs","glyph_font_scale","text_line","getYForTopText","modifier","left_shift","right_shift","getNoteStartX","getCenterXShift","extra","getExtraPx","head_options","note_type","STEM_UP","glyph_code","custom_glyph_code","custom_glyph","slashed","stroke_px","setWidth","displacementStemAdjustment","spacing","getSpacingBetweenLines","half_spacing","min_y","getLine","setY","getYForNote","head_x","staveSpace","breve_lines","drawSlashNoteHead","note_struct","stemExtensionOverride","setStem","shouldRenderFlag","flagCode","getStemExtension","setDirection","getTopGlyph","buildFlag","getGlyphWidth","getExtents","textLine","extents","getYForBottomText","stem_struct","LEFT","RIGHT","ABOVE","BELOW","above","Position","below","modifier_context","spacingFromNextModifier","PositionString","subNotes","getTickContext","extraPx","subNoteXOffset","extraLeft","getSpacingFromNextModifier","subNote","subTickContext","setXOffset","dot_list","max_shift_map","dot","getNote","getKeyProps","getIndex","getExtraRightPx","note_id","dot_shift","x_width","last_line","prev_dotted_space","half_shiftY","setXShift","lineSpace","spacing_between_lines_px","getModifierStartXY","forceFlagRight","shiftRestVertical","dir","isrest","maxLine","minLine","setKeyLine","getKeyLine","formatByY","notesList","minL","stemMax","getStemLength","stemMin","getStemMinumumLength","maxL","voice_shift","getVoiceShiftWidth","is_displaced","isDisplaced","voices","noteU","noteM","noteL","voiceXShift","stemDelta","lineSpacing","setStemLength","centerRest","hasStave","topNote","bottomNote","topKeys","bottomKeys","HALF_NOTEHEAD_HEIGHT","topNoteBottomY","use_default_head_x","note_heads","DEFAULT_LEDGER_LINE_OFFSET","calculateKeyProps","buildStem","autoStem","noteHeadStyles","noteHead","buildNoteHeads","setStyle","head","calcExtraPx","getKeys","step","lastLine","lineDiff","noteProps","notehead","Infinity","minY","maxY","halfLineSpacing","isTopNote","resultLine","thisLine","hasFlag","getCenterGlyphX","getNoteHeadBounds","setYBounds","tieStartX","tieEndX","restLine","top","bot","isInnerNoteIndex","ledgerLineStyle","flagStyle","mContext","setModifierContext","addModifier","articulation","annotation","setDotShiftY","addDot","getModifiers","setExtraLeftPx","setExtraRightPx","yTop","yBottom","nonDisplacedX","displacedX","highestLine","lowestLine","highestDisplacedLine","lowestDisplacedLine","highestNonDisplacedLine","lowestNonDisplacedLine","displaced_x","non_displaced_x","highest_line","lowest_line","highest_displaced_line","lowest_displaced_line","highest_non_displaced_line","lowest_non_displaced_line","getNoteHeadBeginX","doubleWidth","min_x","drawLedgerLine","normal","ledgerWidth","getLedgerLineStyle","openGroup","noteheadStyle","closeGroup","noteStemHeight","flagX","flagY","getFlagStyle","stemStruct","xBegin","shouldRenderStem","setX","setNoteHeadXBounds","isChord","drawLedgerLines","drawStem","drawNoteHeads","drawFlag","drawModifiers","nums","nums_list","shiftLeft","shiftRight","pos","getPosition","props_tmp","getExtraLeftPx","shiftL","shiftR","numShiftL","numShiftR","xWidthL","xWidthR","num_shift","numWidth","number","finger","dot_x","dot_y","major","dorian","mixolydian","minor","scales","root_index","NUM_TONES","interval","isValidNoteValue","noteString","keyString","noteValues","intervalString","intervals","canonical_notes","intervalValue","isValidIntervalValue","diatonic_intervals","parts","getNoteParts","rootValue","getNoteValue","multiplier","reverse_interval","relativeNoteName","tones","nextNote","getRelativeNoteValue","note1","note2","difference","keySigParts","getKeyParts","scaleName","scaleTypes","keySigString","getScaleTones","noteLocation","root_indices","scaleMap","roots","rootName","noteName","getRelativeNoteName","leftShift","accList","propsTemp","accLine","lineList","accShift","previousLine","flatLine","dblSharpLine","numAcc","totalColumns","noFurtherConflicts","groupStart","groupEnd","checkCollision","getGroupLine","getGroupLines","indexes","lineDifference","indexA","indexB","notColliding","indexPairs","every","lines","groupLength","groupMember","column","endCase","patternLength","collisionDetected","columnWidths","columnXOffsets","totalShift","accCount","lastAccOnLine","line1","line2","clearance","clearanceRequired","collision","tickPositions","tickNoteMap","tickPosition","notesAtPosition","music","createScaleMap","modifiedPitches","processNote","keyIndex","sameAccidental","previouslyModified","addAccidental","getGraceNotes","font_scale","parenLeftPadding","parenRightPadding","cautionary","parenLeft","parenRight","fontScale","parenWidth","accX","accY","formatter","setStrict","addTickables","joinVoices","format","getMinTotalWidth","alignSubNotesWithNote","cp1","cp2","text_shift_x","first_x_shift","last_x_shift","tie_spacing","setNotes","first_indices","last_indices","first_ys","last_ys","last_x_px","cp_x","last_y_px","top_cp_y","bottom_cp_y","center_x","getTieStartX","getTieEndX","renderTie","renderText","gracenote_groups","group_list","gracenote_group","is_stavenote","formatWidth","group_shift","setSpacingFromNextModifier","grace_notes","show_slur","slur","slur_y_shift","graceNote","TieClass","BRUSH_DOWN","BRUSH_UP","ROLL_DOWN","ROLL_UP","RASQUEDO_DOWN","RASQUEDO_UP","ARPEGGIO_DIRECTIONLESS","strokes","strokeList","string","getPositions","strokeShift","all_voices","note_end","stroke_spacing","line_space","getModifierContext","arrow","arrow_shift_x","arrow_y","text_y","Type","shift_left","num_shiftL","num_shiftR","x_widthL","x_widthR","num_width","string_number","dashed","leg","LineEndType","stem_ext","bottom","STEM_DOWN","pattern","drawDashedLine","roundToNearestHalf","mathFn","isWithinLines","getRoundingFunction","ceil","isStaveNote","noteCategory","getIncrement","setTextLine","top_text_line","maxWidth","articWidth","builder","articNameToCode","staccato","tenuto","articString","getFactory","Articulation","canSitBetweenLines","staffSpace","isTab","shouldSitOutsideStaff","initialOffset","isOnStemTip","getInitialOffset","setOrigin","stemBaseY","getTopY","INITIAL_OFFSET","getBottomY","offsetDirection","noteLine","articLine","snappedLine","snapLineToStaff","tContext","contexts","tContexts","currentTick","maxTicks","minTicks","padding","xBase","xOffset","notePx","extraRight","setTickContext","ornament","delayed","accidentalUpper","accidentalLower","accidentalLowerPadding","accidentalUpperPadding","accid","stemDir","stemExtents","isPlacedOnNoteheadSide","glyphYBetweenLines","glyphX","glyphY","delayXShift","nextContext","getNextContext","CENTER","CENTER_STEM","Justify","center","centerStem","TOP","BOTTOM","VerticalJustify","annotations","justification","vert_justification","just","VerticalJustifyString","JustifyString","text_height","has_stem","stem_base","yt","bends","last_width","bend","release","phrase","line_style","bend_width","release_width","updateWidth","measure_text","total_width","additional_width","draw_width","bend_height","annotation_y","renderBend","cp_y","renderRelease","renderArrowHead","setRawFont","render_x","last_bend","last_drawn_width","vibratos","vibrato","harsh","vibrato_width","wave_height","wave_width","wave_girth","setVibratoWidth","vx","vy","renderVibrato","opts","num_waves","PREFORMAT","POSTFORMAT","formatted","extra_left_px","extra_right_px","lookAhead","nextRestLine","getLineForRest","createContexts","ContextType","addToContext","getTotalTicks","getMode","isComplete","getResolutionMultiplier","tickToContextMap","tickList","integerTicks","newContext","list","paddingBetween","addToModifierContext","xPos","contextGaps","gaps","gap","lossHistory","loss","auto_beam","align_rests","setMode","applyAndGetBeams","formatToStave","tabstave","tabnotes","autobeam","notevoice","tabvoice","alignAllNotes","alignTuplets","minTotalWidth","hasMinTotalWidth","tickContexts","modiferContexts","createTickContexts","contextList","contextMap","getTicksUsed","justifyWidth","renderingContext","centerX","leftoverPxPerTick","spaceAccum","prevTick","getCenterAlignedTickables","evaluate","prevContext","prevMetrics","insideRightEdge","insideLeftEdge","durationStats","leftNoteEdge","rightNote","rightMetrics","stats","count","updateStats","totalDeviation","totalCost","current","prev","next","move","minShift","postFormatContexts","createModifierContexts","alignRests","getNoteEndX","BEGIN","END","layoutMetrics","setYShift","REPEAT_BEGIN","REPEAT_END","REPEAT_BOTH","repeatBegin","repeatEnd","repeatBoth","TYPE","widths","paddings","layoutMetricsMap","xMax","paddingLeft","paddingRight","setPosition","setType","setPadding","setLayoutMetrics","drawVerticalBar","drawVerticalEndBar","drawRepeatBar","double_bar","getTopLineTopY","getBottomLineBottomY","begin","CODA_LEFT","CODA_RIGHT","SEGNO_LEFT","SEGNO_RIGHT","DC","DC_AL_CODA","DC_AL_FINE","DS","DS_AL_CODA","DS_AL_FINE","FINE","symbol_type","drawCodaFixed","drawSymbolText","drawSignoFixed","num_lines","draw_coda","text_x","symbol_x","vertical_bar_width","section","tempo","bpm","stem_height","text_struct","superscript","subscript","glyph_type","struct","GLYPHS","glyph_struct","smooth","Justification","sizes","attachments","types","anno_dict","attachment","glyphScale","glyphOffset","numLines","getOptions","setPoint","placeGlyphOnLine","renderToStave","cancelKeySpec","alterKeySpec","setKeySig","glyphFontScale","xPositions","paddingForced","nextAcc","accGlyphData","extraWidth","accidentalSpacing","xPosition","glyphWidth","cancel_accList","different_types","naturals","cancelled","customLines","firstAccidentalType","cancelAccList","convertToCancelAccList","convertToAlterAccList","endClef","convertAccLines","convertToGlyph","timeSpec","customPadding","validate_args","topLine","bottomLine","setTimeSig","timeSig","numbers","assertIsValidFraction","topDigits","botDigits","makeTimeSignatureGlyph","topGlyphs","botGlyphs","topWidth","topGlyph","botWidth","botGlyph","topStartX","botStartX","start_x","parseTimeSpec","MID","BEGIN_END","volta","vert_height","end_x","measure","glyph_spacing_px","fill_style","left_bar","right_bar","space_above_staff_ln","space_below_staff_ln","top_text_position","resetLines","BARTYPE","addEndModifier","line_config","visible","bottom_text_position","begBarline","getType","number_t","headroom","clefSpec","clefs","addClef","setClef","keySignatures","addKeySignature","setKeySignature","timeSignatures","addTimeSignature","setTimeSignature","category","items","order","temp","endBarline","begModifiers","endModifiers","sortByCategory","barlines","keysignatures","timesignatures","getPadding","lastBarlineIdx","getLayoutMetrics","getModifierXShift","isDouble","drawVerticalFixed","top_line","bottom_line","drawVerticalBarFixed","line_number","lines_configuration","tab_options","tab_struct","draw_stem","ghost","draw_dots","draw_stem_through_stave","stem_extension_override","getStemY","stemDownLine","stemStartLine","shouldDrawFlag","flag_x","flag_y","flag_code","stem_through","stem_lines","unused_strings","up_stem","down_stem","line_spacing","total_lines","strings","containsLastString","containsFirstString","line_ys","isTopBound","isBottomBound","getPartialStemLines","strings_used","getUnusedStringGroups","tab_x","render_stem","drawPositions","drawStemThrough","bracket_data","stop","stop_x","number_of_measures","show_number","number_line","number_glyph_point","padding_left","padding_right","line_thickness","serif_thickness","use_symbols","symbol_spacing","semibrave_rest_glyph_scale","xs","sbl","serif","lineThicknessHalf","n4","n2","n1","semibrave_rest","get_semibrave_rest","semibrave_rest_width","yMiddle","drawSymbols","drawLine","clef_obj","abs_x","getTimeSig","SLIDE_UP","SLIDE_DOWN","first_fret","last_fret","slide_direction","slide_y","assign","SCALE","LEDGER_LINE_OFFSET","slash","ret","staveNoteScale","getStaveNoteScale","offsetScale","slashBBox","calcBeamedNotesSlashBBox","noteHeadBounds","Stem","defaultStemExtention","defaultOffsetY","offsets","slashStemOffset","slashBeamOffset","protrusions","beam_slope","beam_angle","atan","iPointOnBeam","slash_angle","protrusion_stem_dx","protrusion_stem_dy","protrusion_beam_dx","protrusion_beam_dy","stem0X","stemY","tuningString","setTuning","names","tuningValues","numStrings","noteToInteger","stringNum","fretNum","stringValue","getValueForString","getValueForFret","CRESC","DECRESC","ppt","pixelsPerTick","l_shift_px","left_shift_ticks","r_shift_px","right_shift_ticks","hairpin_options","left_shift_px","right_shift_px","setRenderOptions","hairpin","dis","first_y","staff_height","l_shift","r_shift","last_x","first_x","renderHairpin","last_y","NEAR_HEAD","NEAR_TOP","nearHead","nearTop","from","to","position_end","invert","cps","cp_spacing","metric","end_metric","renderCurve","sequence","glyph_font_size","letter","glyph_data","letter_x","current_letter","drawArrowHead","x0","y0","line_dash","rounded_end","draw_start_arrow","draw_end_arrow","arrowhead_length","arrowhead_angle","text_position_vertical","TextVerticalPosition","text_justification","TextJustification","setLineDash","setLineCap","start_position","end_position","applyLineStyle","first_index","last_index","upwards_slope","notehead_width","point1","point2","both_arrows","distance","ratio","end_y","start_y","line_angle","angle1","angle2","top_x","bottom_x","drawArrowLine","vertical_position","applyFontStyle","drawPedalGlyph","TEXT","MIXED","Styles","mixed","pedal","setCustomText","custom_depress_text","custom_release_text","bracket_height","text_margin_right","bracket_line_width","glyph_point_size","depress","prev_x","prev_y","is_pedal_depressed","next_is_same","prev_is_same","drawBracketed","drawText","Positions","show_bracket","underline_superscript","main_width","main_height","super_y","superscript_width","super_height","line_y","barline","parameter","y_spacing","YOFFSETSTEMDOWN","YOFFSETSTEMUP","XOFFSETSTEMDOWN","XOFFSETSTEMUP","decrescendo","extend_left","extend_right","decresc","tick_context","next_context","begin_x","half_height","reverse","flattenMatches","results","matchedString","Parser","grammar","errorPos","expect","returnPos","token","noSpace","regexp","RegExp","success","incrementPos","rule","maybe","allMatches","oneMatch","localPos","or","gotOne","matchSuccess","matchFail","numMatches","more","expectOne","expectOneOrMore","rules","matchToken","oneOrMore","zeroOrMore","expectZeroOrMore","matches","run","Grammar","LINE","PIECE","PIECES","EOL","CHORDORNOTE","PARAMS","commitPiece","COMMA","DURATION","DOTS","OPTS","CHORD","SINGLENOTE","LPAREN","NOTES","RPAREN","addChord","NOTE","NOTENAME","ACCIDENTAL","OCTAVE","addSingleNote","ACCIDENTALS","DOT","setNoteDots","SLASH","MAYBESLASH","TYPES","setNoteType","DURATIONS","setNoteDuration","LBRACKET","KEYVAL","KEYVALS","RBRACKET","KEY","EQUALS","VAL","addNoteOption","SVAL","DVAL","commitHooks","elements","rollingDuration","resetPiece","commitHook","piece","chord","addNote","StaveNote","accids","addDotToAll","setId","setClass","addClass","defaults","easyScoreHook","throwOnError","parser","addCommitHook","Beam","Tuplet","getElements","voiceOptions","Voice","setDefaults","default_options","face","renderQ","systems","staves","initRenderer","ghostNote","textNoteStruct","textNote","barNote","clefNote","timeSigNote","keySigNote","cancelKey","alterKey","vJustify","hJustify","fontFamily","fontWeight","setJustification","setVerticalJustification","fingering","stringNumber","multimeasurerest","connector","secondaryBeamBreaks","breakSecondaryAt","curve","tie","setText","vibratoBracket","setLine","setHarsh","textBracket","system","StylesString","isRendered","spaceBetweenStaves","debugFormatter","formatIterations","StaveConnector","spaceAbove","spaceBelow","debugNoteMetrics","Stave","startX","allVoices","debugNoteMetricsYs","part","setNoteStartX","tune","lastY","plotDebugging","plotMetrics","Element","Renderer","Formatter","Music","Glyph","StaveModifier","StaveTempo","StaveTie","TabStave","TabNote","Bend","Vibrato","VibratoBracket","Note","ModifierContext","MultiMeasureRest","TickContext","Annotation","Barline","NoteHead","ClefNote","KeySignature","KeySigNote","TimeSignature","TimeSigNote","TabTie","Clef","Dot","Modifier","TabSlide","GraceNote","GraceTabNote","Tuning","KeyManager","setKey","keyParts","scaleMapByValue","originalScaleMapByValue","scaleNote","modparts","valueNote","originalValueNote","StaveHairpin","Stroke","TextNote","Curve","TextDynamics","StaveLine","Ornament","PedalMarking","TextBracket","FretHandFinger","Repetition","BarNote","GhostNote","NoteSubGroup","GraceNoteGroup","Tremolo","StringNumber","Crescendo","Volta","System","Factory","EasyScore","util","Dictionary","toStrFunction","nElements","toStr","getValue","pair","setValue","previousElement","name_1","name_2","callback","name_3","containsKey","isEmpty","default","alignment","MusicSheetCalculator","staffEntriesWithGraphicalTies","staffEntriesWithOrnaments","staffEntriesWithChordSymbols","staffLinesWithLyricWords","graphicalLyricWords","textMeasurer","graphicalMusicSheet","LeadSheet","measures","minimumStaffEntriesWidth","ParentMusicSheet","Rules","prepareGraphicalMusicSheet","musicSheet","Initialize","measureList","MeasureList","accidentalCalculators","createAccidentalCalculators","activeClefs","initializeActiveClefs","lyricWords","completeNumberOfStaves","getCompleteNumberOfStaves","openOctaveShifts","SourceMeasures","sourceMeasure","graphicalMeasures","createGraphicalMeasuresForSourceMeasure","handleStaffEntries","calculateVerticalContainersList","setIndicesToVerticalGraphicalContainers","musicSystems","clearSystemsAndMeasures","clearRecreatedObjects","createGraphicalTies","calculateSheetLabelBoundingBoxes","calculateXLayout","maxInstrNameLabelLength","MusicPages","calculateMusicSystems","GraphicalMusicSheet","transformRelativeToAbsolutePosition","minLength","maxInstructionsLength","MaxInstructionsConstValue","calculateMeasureXLayout","calculateMeasureWidthFromLyrics","setMeasuresMinStaffEntriesWidth","MinAllowedSystemWidth","measuresVertical","oldMinimumStaffEntriesWidth","graphicalNote","openBeams","tiedGraphicalNote","activeClef","octaveShiftValue","graphicalStaffEntry","openTie","isLastTieNote","voiceEntry","openLyricWords","ornamentContainer","staffEntry","technicalInstructions","openTuplets","graphicalNotes","hasPitchedNote","startGse","endGse","startNote","endNote","staffLine","musicSystem","StaffLines","currentMeasureNumber","Measures","MeasureNumber","labelOffsetX","MeasureNumberLabelXOffset","MeasureNumberLabelOffset","parentSourceMeasure","ImplicitMeasure","calculateSingleMeasureNumberPlacement","labelNumber","label","Label","graphicalLabel","GraphicalLabel","MeasureNumberLabelHeight","skyBottomLineCalculator","SkyBottomLineCalculator","setLabelPositionAndShapeBorders","PositionAndShape","relativeX","relativeY","startCollisionCheck","endCollisionCheck","skyLineMinValue","getSkyLineMinInRange","minBracketTopBorder","GroupBrackets","groupBracket","updateSkyLineInRange","MeasureNumberLabels","tieIsAtSystemBreak","lyricVersesNumber","numberOfVerses","lyricsStartYPosition","StaffHeight","lyricsStaffEntriesList","measureRelativePosition","len2","staffEntries","idx2","LyricsEntries","staffEntryPositionX","lyricsEntryLabel","bottomLineMax","getBottomLineMaxInRange","maxPosition","lyricEntry","verseNumber","LyricsEntry","VerseNumber","sortedLyricVerseNumberIndex","LyricsHeight","VerticalBetweenLyricsDistance","leadSheet","previousRelativeX","endX","Size","parentMeasure","updateBottomLineInRange","lyricsStaffEntries","ParentLyricWord","GraphicalLyricsEntries","calculateSingleLyricWord","extend","calculateLyricExtend","multiExpression","measureIndex","staffIndex","repetitionInstruction","absoluteTimestamp","AbsoluteTimestamp","relative","MoodList","UnknownList","combinedExprString","EntriesList","entry","ParentStaffLine","getRelativePositionInStaffLineFromTimestamp","isPartOfMultiStaffInstrument","beginInstructionsWidth","RhythmRightMargin","fontHeight","UnknownTextHeight","getPlacementOfFirstEntry","graphLabel","calculateLabel","getFontstyleOfFirstEntry","gue","GraphicalUnknownExpression","AbstractExpressions","GraphicalTies","staffEntryLinks","allMeasures","MinMeasureToDrawIndex","visibleMeasureList","MaxMeasureToDrawIndex","visiblegraphicalMeasures","graphicalMeasure","ColoringEnabled","gve","graphicalVoiceEntries","numberOfStaffLines","gmlist","musicSystemBuilder","MusicSystemBuilder","initialize","buildMusicSystems","formatMeasures","optimizeRestPlacement","calculateStaffEntryArticulationMarks","RenderSlurs","calculateTieCurves","calculateSkyBottomLines","calculateTupletNumbers","RenderMeasureNumbers","calculateMeasureNumberPlacement","calculateSlurs","calculateOrnaments","calculateChordSymbols","calculateDynamicExpressions","calculateMoodAndUnknownExpressions","calculateExpressionAlignements","calculateOctaveShifts","calculateWordRepetitionInstructions","calculateRepetitionEndings","calculateTempoExpressions","calculateLyricsPosition","idx3","len3","updateStaffLineBorders","calculateSystemYLayout","calculateComments","calculateMarkedAreas","graphicalMusicPage","MusicSystems","isFirstSystem","setMusicSystemLabelsYPosition","createSystemLeftLine","SystemThinLineWidth","SystemLabelsRightMargin","setYPositionsToVerticalLineObjectsAndCreateLines","createInstrumentBrackets","Instruments","createGroupBrackets","InstrumentalGroups","alignBeginInstructions","calculateBorders","addActivitySymbolClickArea","calculatePageLabels","sbc","graphicalChordContainers","graphicalChordContainer","sps","gps","gse","restNote","previousNote","nextStaffEntry","graphicalContinuousDynamic","startPosInStaffline","ContinuousDynamic","Placement","drawingHeight","ParentStaff","idInMusicSheet","endMeasure","getGraphicalMeasureFromSourceMeasureAndIndex","EndMultiExpression","SourceMeasureParent","EndMeasure","endStaffLine","sameStaffLine","endAbsoluteTimestamp","createFromFraction","endPosInStaffLine","ParentMusicSystem","currentStaffLineIndex","secondGraphicalContinuousDynamic","WedgeMinLength","upperStartX","lowerStartX","WedgeHorizontalMargin","upperEndX","lowerEndX","GraphicalContinuousDynamicExpression","IsSplittedPart","idealY","secondIdealY","nextStaffLineIndex","distanceBetweenStaffLines","WedgePlacementBelowY","WedgeOpeningLength","maxBottomLineValueForExpressionLength","withinCrossedBeam","closestToEndStaffEntry","findClosestStaffEntry","closestToStartStaffEntry","parentVerticalContainer","nextStaffLine","nextStaffLineMinSkyLineValue","relativeSkyLineHeight","WedgeVerticalMargin","NotToBeRemoved","ParentInstrument","Staves","WedgePlacementAboveY","previousStaffLineIndex","previousStaffLine","minSkyLineValueForExpressionLength","formerStaffLineIndex","formerStaffLine","formerStaffLineMaxBottomLineValue","Lines","DynamicType","ContDynamicEnum","crescendo","createCrescendoLines","calcPsi","createFirstHalfCrescendoLines","createSecondHalfCrescendoLines","diminuendo","createDiminuendoLines","createFirstHalfDiminuendoLines","createSecondHalfDiminuendoLines","graphicalInstantaneousDynamic","yPosition","skyLineValue","bottomLineValue","lastStaff","updateSkyBottomLine","repetition","numberText","leftOpen","rightOpen","combinedString","fontStyle","MeasureRightMargin","MarginSize","multiTempoExpression","plus","Timestamp","ContinuousTempo","InstantaneousTempo","firstVisibleMeasureX","verticalIndex","Expression","InstantaneousTempoExpression","firstInstructionEntry","FirstInstructionStaffEntry","lastInstruction","GraphicalInstructions","CompactMode","expr","GraphicalInstantaneousTempoExpression","SourceExpression","MetronomeMarksDrawn","Enum","TempoEnum","metronomeMark","createMetronomeMark","ContinuousTempoExpression","metronomeExpression","idx4","len4","LastInstructionStaffEntry","endInstructionsWidth","accidentalCalculator","linkedNotes","sourceStaffEntry","StemDirectionXml","StemDirectionType","Undefined","SetWantedStemDirectionByXml","WantedStemDirection","calculateStemDirectionFromVoices","findOrCreateGraphicalVoiceEntry","tabStaffEntry","graphicalTabVoiceEntry","Notes","Link","IsGrace","symbolFactory","createGraceNote","createNote","staffLineCount","ParentSourceStaffEntry","StafflineCount","stafflineNoteCalculator","positionNote","checkNoteForAccidental","resetYPositionForLeadSheet","addGraphicalNoteToListAtCorrectYPosition","NoteBeam","PrintObject","handleBeam","NoteTuplet","handleTuplet","graphicalTabNote","Articulations","handleVoiceEntryArticulations","TechnicalInstructions","handleVoiceEntryTechnicalInstructions","handleVoiceEntryLyrics","OrnamentContainer","handleVoiceEntryOrnaments","sourceNote","ParentVoiceEntry","layoutVoiceEntry","maxLabelLength","Voices","Visible","renderedLabel","NameLabel","RenderPartNames","InstrumentLabelTextHeight","defaultColorTitle","DefaultColorTitle","Title","RenderTitle","title","SheetTitleHeight","colorDefault","Subtitle","RenderSubtitle","subtitle","SheetSubtitleHeight","Composer","RenderComposer","composer","SheetComposerHeight","Lyricist","RenderLyricist","lyricist","SheetAuthorHeight","Length","layoutMeasureWithWholeRest","voice1Notes","voice1Note1","voice1Note1IsRest","voice2Note1IsRest","voice2Notes","calculateTwoRestNotesPlacementWithCollisionDetection","calculateRestNotePlacementWithCollisionDetectionFromGraphicalNote","staffEntryIndex","previousStaffEntry","calculateRestNotePlacementWithinGraphicalBeam","timestamp","multiStaffInstrument","firstVisibleMeasureRelativeX","leftStaffEntry","rightStaffEntry","numEntries","VerticalGraphicalStaffEntryContainers","GetInterpolatedIndexInVerticalContainers","leftIndex","rightIndex","getFirstLeftNotNullStaffEntryFromContainer","getFirstRightNotNullStaffEntryFromContainer","measureRelativeX","leftX","rightX","timestampQuotient","leftTimestamp","getAbsoluteTimestamp","rightTimestamp","minus","discreteIndex","getFirstNonNullStaffEntry","page","RenderSingleHorizontalStaffline","pageWidth","firstSystemAbsoluteTopMargin","firstMusicSystem","TitleTopDistance","Labels","SheetMinimumDistanceBetweenTitleAndSubtitle","PageRightMargin","SystemComposerDistance","PageLeftMargin","CompleteNumberOfStaves","VerticalSourceStaffEntryContainers","StaffEntries","startStaffEntry","findGraphicalStaffEntryFromMeasureList","VoiceEntries","NoteTie","handleTie","startGraphicalStaffEntry","findEndTieGraphicalNoteFromNote","StartNote","GetGraphicalFromSourceStaffEntry","ParentStaffEntry","graphicalTie","createGraphicalTie","firstSourceMeasure","getFirstSourceMeasure","AccidentalCalculator","FirstInstructionsStaffEntries","Instructions","abstractNotationInstruction","KeyInstruction","keyInstruction","ActiveKeyInstruction","numberOfEntries","verticalContainer","getOrCreateVerticalContainer","Index","initGraphicalMeasuresCreation","verticalMeasureList","createGraphicalMeasure","graphicalMeasureCreatedCalculations","VerticalMeasureList","staff","getStaffFromIndex","PercussionOneLineCutoff","ClefType","SubInstruments","createTabStaffMeasure","hasError","getErrorInMeasure","instruction","Transpose","MidiInstrumentId","Percussion","transposeCalculator","transposeKey","StaffLinkedExpressions","OctaveShiftStart","openOctaveShift","absoluteEnd","ParentEndMultiExpression","Duration","OctaveShiftParams","entryIndex","createStaffEntry","addGraphicalStaffEntryAtTimestamp","addGraphicalStaffEntry","findLinkedNotes","handleStaffEntryLink","OctaveEnum","getAbsoluteStartTimestamp","getAbsoluteEndTimestamp","getOpenOctaveShift","handleVoiceEntry","clefInstruction","createInStaffClef","ChordContainers","HasChordSymbols","createChordSymbols","doCalculationsAtEndOfMeasure","LastInstructionsStaffEntries","lastStaffEntry","OctaveShiftEnd","setBeamNotesWantedStemDirections","parentVoiceEntry","FillEmptyMeasuresWithWholeRest","SourceStaffEntry","VerticalSourceStaffEntryContainer","VoiceEntry","FillEmptyMeasuresWithWholeRests","YesVisible","relInMeasureTimestamp","createVoiceEntry","octaveEnum","getHalfTone","checkAccidental","layoutVoiceEntries","layoutStaffEntry","calculateLines","idx5","len5","idx6","len6","layoutArticulationMarks","hasTie","layoutOrnament","optimizeRestNotePlacement","firstRestNote","secondRestNote","calculateAbsolutePositionsRecursiveWithoutTopelement","computeNonOverlappingPositionWithMargin","ParentVoice","LinkedVoice","bottomBorder","topBorder","graphicalTies","idx7","len7","parentStaffEntry","EndNote","layoutGraphicalTie","lyricStaffEntriesDict","HasLyrics","LyricVersesNumbers","calculateSingleStaffLineLyricsPosition","calculateLyricsExtendsAndDashes","graphicalLyricWord","nextLyricEntry","startStaffLine","StaffEntryParent","endStaffentry","numberOfDashes","MinimumDistanceBetweenDashes","calculateSingleDashForLyricWord","calculateDashes","lastGraphicalMeasure","secondStartX","secondEndX","distanceBetweenDashes","counter","calculateRightAndLeftDashesForLyricWord","LyricsDashes","startY","endStaffEntry","hasOnlyRests","calculateSingleLyricWordWithUnderscore","lastMeasureBb","lineStart","lineEnd","graphicalLine","GraphicalLine","LyricUnderscoreLineWidth","LyricLines","leftLabel","leftDash","leftDashRelative","rightLabel","rightDash","rightDashRelative","maxIndex","InstantaneousDynamic","StartingContinuousDynamic","StartMultiExpression","calculateDynamicExpressionsForMultiExpression","calculateSingleOctaveShift","horizontalIndex","FirstRepetitionInstructions","calculateWordRepetitionInstruction","LastRepetitionInstructions","musicsheet","Repetitions","calcGraphicalRepetitionEndingsRecursively","TempoExpressions","calculateTempoExpressionsForMultiTempoExpression","calculateMoodAndUnknownExpression","KeyEnum","Key","alteratedNotes","calcAlteratedNotes","keyInstructionList","keyType","currentKeyInstruction","noteList","sharpPositionList","flatPositionList","key2","OperatorEquals","parentVoice","parentSourceStaffEntry","isGrace","graceNoteSlash","graceSlur","lyricsEntries","wantedStemDirection","stemDirectionXml","graceAfterMainNote","arpeggio","stemColorXml","stemColor","ArticulationEnum","accent","strongaccent","invertedstrongaccent","staccatissimo","spiccato","fermata","invertedfermata","breathmark","lefthandpizzicato","naturalharmonic","snappizzicato","upbow","downbow","NoteSlurs","lyricsEntry","voiceEntryWithOrnament","activeKey","voiceEntries","baseNote","baselength","baseVoice","baseTimestamp","currentTimestamp","GetOrnament","OrnamentEnum","Trill","higherPitch","getTransposedPitch","alteration","getAlterationForPitch","AccidentalAbove","createBaseVoiceEntry","createAlteratedVoiceEntry","Turn","lowerPitch","lowerAlteration","higherAlteration","InvertedTurn","DelayedTurn","DelayedInvertedTurn","Mordent","InvertedMordent","RangeError","RhythmInstruction","rhythm","rhythmSymbolEnum","symbolEnum","rhythm2","RhythmSymbolEnum","VexFlowConverter","isTuplet","dur","fund","OctaveOffset","Notehead","noteheadCode","NoteHeadCode","codeFilled","Filled","Shape","NoteHeadShape","NORMAL","DIAMOND","codeStart","TRIANGLE","CIRCLEX","RECTANGLE","SQUARE","graphicalNoteLength","TypeLength","vfnote","vfClefType","numDots","numberOfDots","alignCenter","slashNoteHead","WholeRestXShiftVexflow","unitInPixels","visibleVoiceEntries","VoiceId","vfpitch","vfnoteStruct","GraceNoteSlash","IsCueNote","LedgerLineWidth","LedgerLineStrokeStyle","defaultColorStem","DefaultColorStem","StemColor","stemStyle","setStemStyle","ColorFlags","setFlagStyle","tremoloStrokes","TremoloStrokes","vfArtPosition","vfArt","oContainer","vfPosition","vfOrna","setDelayed","AccidentalBelow","setLowerAccidental","setUpperAccidental","arpeggioType","ArpeggioType","tabPositions","tabNote","tabPosition","FretNumber","SymbolEnum","Rhythm","COMMON","CUT","minorMap","majorMap","lineType","linePosition","SystemLinesEnum","SingleThin","SystemLinePosition","MeasureBegin","DoubleThin","ThinBold","BoldThinDots","DotsThinBold","DotsBoldBoldDots","None","FontStyles","Regular","Fonts","TimesNewRoman","DefaultFontFamily","Bold","Italic","BoldItalic","Underlined","Kokila","styleId","OUTLINE_AND_FILL_STYLE_DICT","VexFlowMusicSheetDrawer","MusicSheetDrawer","drawingParameters","DrawingParameters","VexFlowTextMeasurer","backends","zoom","pageIdx","drawSheet","PageNumber","drawPage","unitDistance","drawStaffLine","absolutePos","drawSlurs","vfstaffLine","graphicalSlur","GraphicalSlurs","isCrossed","drawSlur","curvePointsInPixels","bezierStartPt","bezierStartControlPt","bezierEndControlPt","p4","bezierEndPt","applyScreenTransformation","setAbsoluteCoordinates","ex","drawStaffEntry","renderLine","musicPage","musicPageIndex","backendToUse","staffline","startPosition","drawSampledLine","SkyLine","BottomLine","currentValue","absolute","samplingUnit","SamplingUnit","verticalStart","verticalEnd","horizontalStart","horizontalEnd","drawLabel","GetGraphicalLabel","GraphicalLayers","RenderLyrics","drawLyrics","lyricEntries","layer","graphicalOctaveShift","OctaveShifts","vexFlowOctaveShift","getTextBracket","abstractGraphicalExpression","GraphicalInstantaneousDynamicExpression","drawInstantaneousDynamic","drawContinuousDynamic","instantaneousDynamic","graphicalExpression","IsVerbal","Start","End","Width","bitmapWidth","bitmapHeight","heightInPixel","screenPosition","DefaultColorLabel","DefaultFontStyle","alpha","renderRectangle","styleEnum","OutlineAndFillStyleEnum","BaseWritingColor","Collections","FollowingCursor","AlternativeFollowingCursor","PlaybackCursor","Highlighted","ErrorUnderlay","Selected","SelectionSymbol","DebugColor1","DebugColor2","DebugColor3","SplitScreenDivision","GreyTransparentOverlay","MarkedArea1","MarkedArea2","MarkedArea3","MarkedArea4","MarkedArea5","MarkedArea6","MarkedArea7","MarkedArea8","MarkedArea9","MarkedArea10","Comment1","Comment2","Comment3","Comment4","Comment5","Comment6","Comment7","Comment8","Comment9","Comment10","StyleSets","NoteState","AutoColorSet","Clickable","textHeight","labelMarginBorderFactor","LabelMarginBorderFactor","widthToHeightRatio","TextMeasurer","computeTextWidthToHeightRatio","contains","thisPointer","dict","iterationFunction","toDeleteEntries","startIndex","endIndex","mid","verticalContainerParent","parentStaff","instructions","chordSymbolContainers","VerticalContainerParent","ParentMeasure","staffEntryLink","tieRestDuration","addFollowingNotes","parentRepetition","AlignmentType","StartIndex","Begin","EndIndex","RepetitionInstructionEnum","endingIndices","Ending","StartLine","Coda","Segno","Fine","ToCoda","ForwardJump","DalSegnoAlFine","DaCapoAlFine","DalSegnoAlCoda","DaCapoAlCoda","DaCapo","DalSegno","BackJumpLine","tag","defaultTextTranslation","DrawingParametersEnum","ColoringModes","drawTitle","drawSubtitle","drawLyricist","drawComposer","drawCredits","drawPartNames","fingeringPosition","drawHiddenNotes","drawingParametersEnum","allon","setForAllOn","thumbnail","setForThumbnail","leadsheet","setForLeadsheet","compact","setForCompactMode","compacttight","setForCompactTightMode","setForDefault","drawHighlights","drawErrors","drawSelectionStartSymbol","drawSelectionEndSymbol","drawCursors","drawActivitySymbols","drawScrollIndicator","drawComments","drawMarkedAreas","DrawTitle","DrawSubtitle","DrawComposer","DrawLyricist","DrawPartNames","DrawCredits","MinSkyBottomDistBetweenStaves","MinSkyBottomDistBetweenSystems","BetweenStaffDistance","StaffDistance","MinimumDistanceBetweenSystems","PageBottomMargin","RenderPartAbbreviations","FingeringPosition","noteDistances","noteDistancesScalingFactors","durationDistanceDict","durationScalingDistanceDict","unit","sheetTitleHeight","sheetSubtitleHeight","sheetMinimumDistanceBetweenTitleAndSubtitle","sheetComposerHeight","sheetAuthorHeight","compactMode","pagePlacementEnum","PagePlacementEnum","pageHeight","pageTopMargin","pageTopMarginNarrow","pageBottomMargin","pageLeftMargin","pageRightMargin","titleTopDistance","titleBottomDistance","staffDistance","betweenStaffDistance","minimumStaffLineDistance","minSkyBottomDistBetweenStaves","staffHeight","tabStaffInterlineHeight","betweenStaffLinesDistance","systemLeftMargin","systemRightMargin","firstSystemMargin","systemLabelsRightMargin","systemComposerDistance","instrumentLabelTextHeight","minimumDistanceBetweenSystems","minSkyBottomDistBetweenSystems","lastSystemMaxScalingFactor","autoBeamNotes","autoBeamOptions","beam_middle_rests_only","beamWidth","beamSpaceWidth","beamForwardLength","clefLeftMargin","clefRightMargin","percussionOneLineCutoff","percussionForceVoicesOneLineCutoff","betweenKeySymbolsDistance","keyRightMargin","rhythmRightMargin","showRhythmAgainAfterPartEndOrFinalBarline","inStaffClefScalingFactor","distanceBetweenNaturalAndSymbolWhenCancelling","noteHelperLinesOffset","measureLeftMargin","measureRightMargin","distanceBetweenLastInstructionAndRepetitionBarline","arpeggioDistance","staccatoShorteningFactor","idealStemLength","stemNoteHeadBorderYOffset","stemWidth","stemMargin","stemMinLength","stemMaxLength","beamSlopeMaxAngle","stemMinAllowedDistanceBetweenNoteHeadAndBeamLine","setWantedStemDirectionByXml","graceNoteScalingFactor","graceNoteXOffset","wedgeOpeningLength","wedgeMeasureEndOpeningLength","wedgeMeasureBeginOpeningLength","wedgePlacementAboveY","wedgePlacementBelowY","wedgeHorizontalMargin","wedgeVerticalMargin","distanceOffsetBetweenTwoHorizontallyCrossedWedges","wedgeMinLength","distanceBetweenAdjacentDynamics","tempoChangeMeasureValidity","tempoContinousFactor","staccatoScalingFactor","betweenDotsDistance","ornamentAccidentalScalingFactor","chordSymbolTextHeight","chordSymbolXSpacing","chordSymbolYOffset","chordSymbolLabelTexts","resetChordSymbolLabelTexts","measureNumberLabelHeight","measureNumberLabelOffset","measureNumberLabelXOffset","tupletsRatioed","tupletsBracketed","tripletsBracketed","tupletNumberLabelHeight","tupletNumberYOffset","tupletVerticalLineLength","bezierCurveStepSize","calculateCurveParametersArrays","tieGhostObjectWidth","tieYPositionOffsetFactor","minimumNeededXspaceForTieGhostObject","tieHeightMinimum","tieHeightMaximum","tieHeightInterpolationK","tieHeightInterpolationD","slurNoteHeadYOffset","slurStemXOffset","slurSlopeMaxAngle","slurTangentMinAngle","slurTangentMaxAngle","slursStartingAtSameStaffEntryYOffset","repetitionEndingLabelHeight","repetitionEndingLabelXOffset","repetitionEndingLabelYOffset","repetitionEndingLineYLowerOffset","repetitionEndingLineYUpperOffset","voltaOffset","lyricsAlignmentStandard","lyricsHeight","lyricsYOffsetToStaffHeight","verticalBetweenLyricsDistance","horizontalBetweenLyricsDistance","betweenSyllableMaximumDistance","betweenSyllableMinimumDistance","lyricOverlapAllowedIntoNextMeasure","minimumDistanceBetweenDashes","instantaneousTempoTextHeight","continuousDynamicTextHeight","moodTextHeight","unknownTextHeight","continuousTempoTextHeight","dynamicExpressionMaxDistance","dynamicExpressionSpacer","staffLineWidth","ledgerLineWidth","ledgerLineStrokeStyle","wedgeLineWidth","tupletLineWidth","lyricUnderscoreLineWidth","systemThinLineWidth","systemBoldLineWidth","systemRepetitionEndingLineWidth","systemDotWidth","distanceBetweenVerticalSystemLines","distanceBetweenDotAndLine","octaveShiftLineWidth","octaveShiftVerticalLineLength","graceLineWidth","GraceNoteScalingFactor","minimumCrossedBeamDifferenceMargin","displacedNoteMargin","minNoteDistance","subMeasureXSpacingThreshold","measureDynamicsMaxScalingFactor","wholeRestXShiftVexflow","metronomeMarksDrawn","metronomeMarkXShift","metronomeMarkYShift","AlignRestOption","Never","fillEmptyMeasuresWithWholeRest","No","arpeggiosGoAcrossVoices","renderArpeggios","renderSlurs","coloringMode","XML","coloringEnabled","colorStemsLikeNoteheads","colorBeams","colorFlags","defaultColorNotehead","defaultColorRest","defaultColorLabel","defaultFontFamily","defaultFontStyle","maxMeasureToDrawIndex","minMeasureToDrawIndex","renderComposer","renderTitle","renderSubtitle","renderLyricist","renderPartNames","renderPartAbbreviations","renderFingerings","renderMeasureNumbers","renderLyrics","fingeringInsideStafflines","fingeringLabelFontHeight","fingeringOffsetX","newSystemAtXMLNewSystemAttribute","newPageAtXMLNewPageAttribute","restoreCursorAfterRerender","pageFormat","PageFormat","UndefinedPageFormat","pageBackgroundColor","renderSingleHorizontalStaffline","populateDictionaries","maxInstructionsConstValue","ClefLeftMargin","ClefRightMargin","KeyRightMargin","info","fixStafflineBoundingBox","tPower3","oneMinusTPower3","factorOne","factorTwo","coloringSetCustom","chordtexts","ChordSymbolEnum","augmented","diminished","dominant","majorseventh","minorseventh","diminishedseventh","augmentedseventh","halfdiminished","majorminor","majorsixth","minorsixth","dominantninth","majorninth","minorninth","dominant11th","major11th","minor11th","dominant13th","major13th","minor13th","suspendedsecond","suspendedfourth","power","idString","IsUndefined","otherPageFormat","slurs","playbackInstrumentId","printObject","typeLength","noteTypeXml","normalNotes","isCueNote","noteheadColorXml","noteheadColor","noteheadColorCurrentlyRendered","ActiveTimeSignature","ToString","noteSlur","Appearance","setOctaveShiftValue","octaveValue","staffNumber","startMultiExpression","endMultiExpression","VA8","VB8","MA15","MB15","xmlValue","Dotted","Dashed","BoldThin","DoubleBold","Tick","Short","ContinuousDynamicExpression","AbstractExpression","dynamicType","startVolume","endVolume","isStringInStringList","listContinuousDynamicIncreasing","listContinuousDynamicDecreasing","currentAbsoluteTimestamp","continuousAbsoluteStartTimestamp","continuousAbsoluteEndTimestamp","interpolationRatio","equalsFunction","lastIndexOf","freq","array1","array2","swap","_i","array_1","voiceId","master","AbstractGraphicalExpression","GraphicalObject","parentStaffline","expression","parentStaffLine","BackendType","autoResize","Canvas","GraphicalMusicPage","labels","pageNumber","pageIndex","_arrays","arrays","Bag_1","Bag","BSTree_1","BSTree","BSTreeKV_1","BSTreeKV","Dictionary_1","Heap_1","Heap","LinkedDictionary_1","LinkedDictionary","LinkedList_1","LinkedList","MultiDictionary_1","MultiDictionary","FactoryDictionary_1","FactoryDictionary","FactoryDictionary_2","DefaultDictionary","Queue_1","Queue","PriorityQueue_1","PriorityQueue","Set_1","Set","Stack_1","Stack","MultiRootTree_1","MultiRootTree","_util","rootPitch","chordKind","bassPitch","chordDegree","degree","chordSymbol","transposeHalftones","transposedRootPitch","RootPitch","transposePitch","getTextForAccidental","getTextFromChordKindEnum","ChordKind","ChordDegree","ChordDegreeText","alter","BassPitch","transposedBassPitch","kind","ChordSymbolLabelTexts","accidentalAbove","accidentalBelow","volume","audible","following","comments","continuousDynamic","isSplittedPart","notToBeRemoved","startMeasure","yValue","updateSkyLineWithWedge","updateBottomLineWithWedge","WedgeLineWidth","upperLineEnd","lowerLineEnd","addWedgeLines","WedgeMeasureEndOpeningLength","WedgeMeasureBeginOpeningLength","upperLineStart","lowerLineStart","addDoubleLines","isSecondHalfSplit","upperWedgeStart","lowerWedgeStart","wedgeEnd","isFirstHalfSplit","Center","wedgePoint","upperWedgeEnd","lowerWedgeEnd","upperLine","lowerLine","InstantaneousDynamicExpression","dynamicExpression","soundDynamics","dynamicEnum","DynamicEnum","soundDynamic","calculateLength","dynamicToRelativeVolumeDict","listInstantaneousDynamics","DynamicExpressionSymbolEnum","z","InvalidEnumArgumentException","staffLinePsi","firstNode","lastNode","newNode","createNode","nodeAtIndex","elementAtIndex","node","equalsF","currentNode","previous","eqF","equalsAux","removeElementAtIndex","toArray","calculator","musicPages","verticalGraphicalStaffEntryContainers","cursors","numberOfStaves","selectionStartSymbol","selectionEndSymbol","minAllowedSystemWidth","pageAbsolute","setMusicPageAbsolutePosition","calculate","needsToBeRedrawn","positionOnMusicSheet","graphicalStaffEntryIndex","nextMeasure","orderedMeasures","mList","CollectionUtil","getLastElement","verticalGraphicalStaffEntryContainer","VerticalGraphicalStaffEntryContainer","binarySearch","compareByTimestamp","musicTimestamp","containers","foundIndex","leftTS","rightTS","middleIndex","getLongestStaffEntryDuration","visibleMeasures","visibleInstruments","visibleStavesIndices","getGlobalStaffIndexOfFirstStaff","lastRendered","inListIndex","maxClickDist","foundNotes","entries","closest","CalculateDistance","foundEntries","GetNearestStaffEntry","GetClickableLabel","container","fractionalIndex","searchOnlyVisibleEntries","foundEntry","getStaffEntry","returnOnlyVisibleEntries","calculateXPositionFromTimestamp","correspondingMusicSystem","yCoordinate","timeStamp","currentMusicSystem","findClosestLeftStaffEntry","findClosestRightStaffEntry","currentTimeStamp","previousStaffEntryMusicSystem","nextStaffEntryMusicSystem","previousStaffEntryPositionX","nextStaffEntryPositionX","GetRightBorderAbsoluteXPosition","sm","nextSystemLeftBorderTimeStamp","interpolatedXPosition","previousSystemRightBorderX","nextSystemLeftBorderX","GetLeftBorderAbsoluteXPosition","visibleInstrumentCount","followedInstrumentCount","Following","findGraphicalStaffEntryFromTimestamp","pt1","pt2","deltaX","deltaY","maxLength","maxLengthInStaffEntry","findStaffEntryMaxNoteLength","tempoExpresssion","DataObject","AbstractTempoExpression","soundTempo","parentMultiTempoExpression","isMetronomeMark","setTempoAndTempoType","tempoEnum","larghissimo","grave","lento","largo","larghetto","adagio","adagietto","andanteModerato","andante","andantino","moderato","allegretto","allegroModerato","allegro","vivace","vivacissimo","allegrissimo","presto","prestissimo","listInstantaneousTempoLarghissimo","listInstantaneousTempoGrave","listInstantaneousTempoLento","listInstantaneousTempoLargo","listInstantaneousTempoLarghetto","listInstantaneousTempoAdagio","listInstantaneousTempoAdagietto","listInstantaneousTempoAndanteModerato","listInstantaneousTempoAndante","listInstantaneousTempoAndantino","listInstantaneousTempoModerato","listInstantaneousTempoAllegretto","listInstantaneousTempoAllegroModerato","listInstantaneousTempoAllegro","listInstantaneousTempoVivace","listInstantaneousTempoVivacissimo","listInstantaneousTempoAllegrissimo","listInstantaneousTempoPresto","listInstantaneousTempoPrestissimo","listInstantaneousTempoChangesGeneral","tempoInBpm","ParentMultiTempoExpression","getDefaultValueForTempoType","listInstantaneousTempoAddons","addon","changes","setTempoType","listContinuousTempoFaster","listContinuousTempoSlower","tempoType","ContinuousTempoType","piuMosso","allargando","ritenuto","startTempo","endTempo","absoluteEndTimestamp","accelerando","ritardando","IXmlElement","hasAttributes","firstAttribute","hasElements","hasChildNodes","childNodes","nodeType","Node","TEXT_NODE","nodeValue","attributeName","getNamedItem","elementName","nodes","ELEMENT_NODE","nameUnset","Instrument","InstrumentalGroup","hasLyrics","hasChordSymbols","lyricVersesNumbers","subInstruments","nameLabel","midiInstrumentID","playbackTranspose","subInstrumentIdString","subInstrument","partAbbreviation","Audible","staffId","isAudibleInOtherStaves","st","Id","follow","isFollowingInOtherStaves","Staff","Name","instrumentalGroups","shapeTypeXml","filledXml","setShapeFromXml","filledXmlAttribute","shape","ShapeTypeXmlToShape","filled","MusicSymbol","fontSizeStandard","createElement","mInstantaneousDynamicExpression","mMeasure","printNewSystemXml","printNewPageXml","staffLinkedExpressions","tempoExpressions","verticalSourceStaffEntryContainers","graphicalMeasureErrors","firstRepetitionInstructions","lastRepetitionInstructions","implicitMeasure","hasEndLine","endingBarStyleXml","endingBarStyleEnum","firstInstructionsStaffEntries","lastInstructionsStaffEntries","TempoInBPM","measureNumber","activeTimeSignature","measureListIndex","tempoInBPM","inMeasureTimestamp","inSourceMeasureStaffIndex","existingVerticalSourceStaffEntryContainer","createdNewContainer","sse","ve","createdNewVoiceEntry","createdVoiceEntry","verticalSourceStaffEntryContainer","undefinedCounter","maxInstDuration","maxDuration","instrumentsDurations","instrumentDuration","inSourceMeasureInstrumentIndex","getLastSourceStaffEntryForInstrument","calculateMaxNoteLength","instrumentsDuration","instrumentMaxTieNoteFractions","sourceStaffEntries","beginInstructionsStaffEntry","instr","startMarker","FromWords","rep","BackwardJumpInstructions","forwardJumpInstruction","instrumentIndex","VexFlowContinuousDynamicExpression","sourceLabel","ContinuousDynamicTextHeight","CanvasVexFlowBackend","VexFlowBackend","inner","zIndex","getVexflowBackendType","PageBackgroundColor","CanvasRenderingCtx","translate","old","globalAlpha","oldStyle","points","renderingHtmlElement","children","htmlElementToRemove","getRenderElement","VexFlowGraphicalNote","GraphicalNote","octaveShift","drawPitch","OctaveShift","getPitchFromOctaveShift","tranposedPitch","VexFlowInstrumentBracket","firstVexFlowStaffLine","lastVexFlowStaffLine","depth","firstVexMeasure","lastVexMeasure","addConnector","getVFStave","vexflowConnector","con","stave1","stave2","VexFlowMeasure","GraphicalMeasure","vfVoices","vfTies","vfRepetitionWords","connectors","tuplets","vftuplets","resetLayout","setLineNumber","setBegBarType","setEndBarType","updateInstructionWidth","vfclef","lineNumber","setNumLines","currentKey","previousKey","currentClef","setEndClef","MeasureEnd","StavePositionEnum","addVolta","voltaType","endsRepetitionEnding","beginsRepetitionEnding","skylineMinForMeasure","newSkylineValueForMeasure","VoltaOffset","vexFlowVoltaHeight","setVoltaType","voiceID","vfbeams","autoVfBeams","autoTupletVfBeams","formatVoices","latestVoiceTimestamp","gvEntries","getGraphicalVoiceEntriesPerVoice","gNotesStartTimestamp","gNotesEndTimestamp","noteEnd","inBetweenLength","vfghost","ghostGve","VexFlowVoiceEntry","vfStaveNote","gapFromMeasureStart","measureEndTimestamp","restLength","mybeam","currentTupletBuilder","beamedNotes","beamHasQuarterNoteOrLonger","psBeam","autoStemBeam","beamColor","isGraceBeam","stemColors","vfBeam","ColorBeams","AutoBeamNotes","currentTuplet","notesToAutoBeam","consecutiveBeamableNotes","tupletNotesToAutoBeam","separateAutoBeams","gNote","isOnBeat","haveTwoOrMoreNotesToBeamAlready","noteIsQuarterOrLonger","unbeamableNote","noteTuplet","tupletContainsUnbeamableNote","NoteTypeXml","NoteType","QUARTER","AutoBeamOptions","generateBeamOptions","notesForSeparateAutoBeam","newBeams","tupletBuilder","tupletStaveNotes","tupletVoiceEntries","tupletVoiceEntry","NormalNotes","Bracket","TupletLabelNumber","TripletsBracketed","TupletsBracketed","TupletsRatioed","graceGVoiceEntriesBefore","GraceSlur","graceNotes","gveGrace","graceNoteGroup","graceGve","GraceAfterMainNote","finalizeBeams","finalizeTuplets","getVoicesWithinMeasure","isMainVoice","restFilledEntries","getRestFilledVexFlowStaveNotesPerVoice","vexFlowVoiceEntry","vfse","vfClefBefore","clefModifier","RenderFingerings","createFingerings","Arpeggio","StrokeTypeFromArpeggioType","ArpeggiosGoAcrossVoices","RenderArpeggios","addStroke","createArticulations","createOrnaments","setStemDirectionFromVexFlow","vfStaffEntry","gVoiceEntry","gnote","StemDirection","generateArticulations","gvoices","generateOrnaments","fingeringsCount","TechnicalInstructionType","Fingering","fingeringIndex","fingeringInstruction","modifierPosition","sourceStaff","fretFinger","setOffsetX","FingeringOffsetX","offsetYSign","ordering","FingeringInsideStafflines","perFingeringShift","shiftCount","setOffsetY","vfBeginInstructionsWidth","vfEndInstructionsWidth","GraphicalVoiceEntry","staveNote","modifierWidth","mVexFlowStaveNote","DefaultColorNotehead","DefaultColorRest","sourceNoteNoteheadColor","NoteheadColor","ColoringMode","AutoColoring","CustomColorSet","ColoringSetCurrent","NoteheadColorCurrentlyRendered","beamNotes","colorBeam","ColorStemsLikeNoteheads","stemTransparent","AddNote","enrolledTimestamps","url","xhttp","mimeType","XMLHttpRequest","ActiveXObject","Promise","reject","resolve","onreadystatechange","readyState","DONE","status","responseText","ontimeout","overrideMimeType","open","send","openSheetMusicDisplay","hidden","cursorElementId","curs","cursorElement","manager","graphic","resetIterator","update","Sheet","lastSheetMeasureIndex","startMeasureIndex","endMeasureIndex","SelectionStart","lastMeasure","SelectionEnd","iterator","getIterator","CurrentVisibleVoiceEntries","EndReached","CurrentVoiceEntries","getStaffEntryFromVoiceEntry","bottomStaffline","newWidth","updateStyle","FollowCursor","getBoundingClientRect","scrollIntoView","behavior","display","moveToNext","gradient","createLinearGradient","addColorStop","src","toDataURL","VoicesUnderCursor","toStringFunction","dictionary","intersection","otherSet","union","isSubsetOf","isSub","insertNode","searchNode","search","removeNode","inorderTraversal","inorderTraversalAux","preorderTraversal","preorderTraversalAux","postorderTraversal","postorderTraversalAux","levelTraversal","levelTraversalAux","minimum","minimumAux","maximum","maximumAux","heightAux","leftCh","rightCh","transplant","signal","queue","enqueue","dequeue","peek","collections","leftChildIndex","nodeIndex","rightChildIndex","parentIndex","minIndex","leftChild","rightChild","siftUp","siftDown","removeRoot","equF","extendStatics","__extends","setPrototypeOf","__proto__","__","_super","defaultFactoryFunction","_this","setDefault","defaultValue","xValue","globalSystemIndex","numberOfVisibleStaffLines","activeRhythm","activeKeys","initializeActiveInstructions","systemMaxWidth","getFullPageSystemWidth","prevMeasureEndsPart","currentSystemParams","SystemBuildParameters","currentSystem","initMusicSystem","numberOfMeasures","sourceMeasureEndsPart","HasEndLine","isSystemStartMeasure","IsSystemStartMeasure","isFirstSourceMeasure","currentMeasureBeginInstructionsWidth","MeasureLeftMargin","currentMeasureEndInstructionsWidth","measureStartLine","getMeasureStartLine","getLineWidth","forceShowRhythm","ShowRhythmAgainAfterPartEndOrFinalBarline","addBeginInstructions","addEndInstructions","currentMeasureVarWidth","measureEndLine","getMeasureEndLine","nextMeasureBeginInstructionWidth","nextSourceMeasure","nextGraphicalMeasures","hasBeginInstructions","totalMeasureWidth","measureFitsInSystem","currentWidth","doXmlPageBreak","NewPageAtXMLNewPageAttribute","doXmlLineBreak","NewSystemAtXMLNewSystemAttribute","addMeasureToSystem","updateActiveClefs","finalizeCurrentAndCreateNewSystem","systemMeasures","optimizeDistanceBetweenStaffLines","calculateMusicSystemsRelativePositions","beginInstrWidth","endInstrWidth","systemEndsPart","checkExtraInstructionMeasure","startNewPage","breaksPage","adaptRepetitionLineWithIfNeeded","checkAndCreateExtraInstructionMeasure","stretchMusicSystem","GraphicalMeasures","measureParams","endLine","currentSystemFixWidth","currentVarWidth","beginLine","setMeasureWidth","addStaveMeasuresToSystem","currentSystemVarWidth","systemMeasureIndex","createMusicSystem","layoutSystemStaves","createMusicSystemLabel","SystemLeftMargin","SystemRightMargin","systemWidth","staffList","instruments","multiLyrics","yOffsetSum","addStaffLineToMusicSystem","yOffset","relativeYPosition","createStaffLine","FirstSystemMargin","StaffLineWidth","visibleStaffIndices","getVisibleStavesIndicesFromSourceMeasure","transposeKeyInstruction","isSystemFirstMeasure","measureCount","totalBeginInstructionLengthX","beginInstructionLengthX","AddInstructionsAtMeasureBegin","totalEndInstructionLengthX","endInstructionsStaffEntry","endInstructionLengthX","addInstructionsAtMeasureEnd","firstEntry","visibleStaffIdx","instructionsLengthX","currentRhythm","clefAdded","keyAdded","rhythmAdded","addClefAtBegin","addKeyAtBegin","addRhythmAtBegin","lastEntry","addClefAtEnd","visStaffIdx","getEntriesPerStaff","firstStaffEntries","visibleInstructionEntries","maxMeasureWidth","rhythmInstruction","measureWidth","addExtraInstructionMeasure","createExtraGraphicalMeasure","gmeasures","AddGraphicalMeasures","thisMeasureBeginsLineRepetition","isGlobalFirstMeasure","previousMeasureEndsLineRepetition","nextMeasureBeginsLineRepetition","thisMeasureEndsLineRepetition","nextMeasureHasKeyInstructionChange","thisMeasureEndsWordRepetition","nextMeasureBeginsWordRepetition","systemLineEnum","DistanceBetweenLastInstructionAndRepetitionBarline","endsWithLineRepetition","beginsWithLineRepetition","nextMeasureIndex","beginsWithWordRepetition","endsWithWordRepetition","getNextMeasureKeyInstruction","visIndex","getKeyInstruction","systemFixWidth","systemVarWidth","systemEndX","scalingFactor","calculateXScalingFactor","LastSystemMaxScalingFactor","currentXPosition","setPositionInStaffline","startLine","createVerticalLineForMeasure","staffEntriesScaleFactor","layoutSymbols","decreaseMusicSystemBorders","PageHeight","checkStaffEntriesForStaffEntryLink","upperBottomLine","lowerSkyLine","maxDistance","startIdx","endIdx","skylineValue","lowerIdx","MinimumStaffLineDistance","lowerStafflineYPos","updateStaffLinesRelativePosition","firstStaffLine","lastStaffLine","currentPage","createMusicPage","currentYPosition","timesPageCouldntFitSingleSystem","addSystemToPage","PageTopMarginNarrow","PageTopMargin","TitleBottomDistance","previousSystem","prevSystemLastStaffline","prevSystemLastStaffLineBB","findReqiredDistanceWithSkyBottomLine","newYPosition","currSystemBottomYPos","upperSystem","lowerSystem","upperSystemLastStaffLine","lowerSystemFirstStaffLine","upperBottomLineArray","lowerSkyLineArray","upperStaffLineBB","lowerStaffLineBB","skylinePixelWidth","upperIdx","lowerCenterIdx","absoluteStartTimestamp","keySignatureNoteAlterationsDict","currentAlterationsComparedToKeyInstructionList","currentInMeasureNoteAlterationsDict","activeKeyInstruction","reactOnKeyInstructionChange","pitchKey","isInCurrentAlterationsToKeyList","addGraphicalAccidental","noteEnums","AlteratedNotes","keyAccidentalType","wordsToFind","wordToFind","stringContainsSeparatedWord","word","sourceMultiExpression","yValueAbove","yValueBelow","VexFlowMusicSheetCalculator","beamsNeedUpdate","VexFlowGraphicalSymbolFactory","VexflowStafflineNoteCalculator","clean","calculateXPosition","mvoices","minStaffEntriesWidth","preCalculateMinTotalWidth","formatVoicesDefault","formatVoicesAlignRests","AlignRests","Always","Auto","collidableVoiceEntries","numberOfRests","elongationFactorForMeasureWidth","lastLyricEntryDict","lyricAlignment","minLyricsSpacing","HorizontalBetweenLyricsDistance","LyricOverlapAllowedIntoNextMeasure","SyllableIndex","BetweenSyllableMinimumDistance","TextAlignment","IsCenterAligned","syllables","GetLyricWord","Syllables","dashSpace","lyricsBbox","lyricsLabelWidth","lyricsXPosition","spacingNeededToLastLyric","currentSpacingToLastLyric","currentSpacingToMeasureEnd","spacingNeededToMeasureEnd","maxXInMeasure","labelWidth","IsLeft","elongationFactorForMeasureWidthForCurrentLyric","elongationFactorNeededForMeasureEnd","elongationFactorNeededForLastLyric","lastNoteDuration","sourceNoteDuration","Text","GraphicalTie","vfStartNote","startNoteIndexInTie","vfEndNote","endNoteIndexInTie","vfTie1","vfTie2","vfTie","dynamicStartPosition","VexFlowInstantaneousDynamicExpression","calculateGraphicalInstantaneousDynamicExpression","StartMeasure","calculateGraphicalContinuousDynamic","calculateGraphicalVerbalContinuousDynamic","vfStave","setTempo","TempoInBpm","dotted","MetronomeMarkYShift","setShiftX","MetronomeMarkXShift","skyline","startTimeStamp","ParentStartMultiExpression","endTimeStamp","getLastGraphicalMeasureFromIndex","VexFlowOctaveShift","getStartNote","setStartNote","setEndNote","endsOnDifferentStaffLine","remainingOctaveShift","firstMeasure","calculateOctaveShiftSkyBottomLine","vfOctaveShift","stopX","footroom","uppermostMeasure","addWordRepetition","AlignmentManager","alignDynamicExpressions","ae","graphicalLyricEntry","GraphicalLyricEntry","Word","lyricsEntryIndex","GraphicalLyricWord","isFilled","gSlurs","slurIndex","openSlursDict","openGraphicalSlurs","oldGSlur","newGSlur","GraphicalSlur","addSlurToStaffline","graphicalVoiceEntry","gSlur","findIndexGraphicalSlurFromSlur","sortedGSlurs","Compare","calculateCurve","systemIndex","VexFlowMusicSystem","parentSystem","VexFlowStaffLine","isTabMeasure","VexFlowTabMeasure","VexFlowStaffEntry","setAccidental","tiedNote","se","vfClefParams","chordSymbolSpacing","ChordSymbolXSpacing","chordSymbolContainer","graphicalChordSymbolContainer","GraphicalChordSymbolContainer","ChordSymbolTextHeight","ChordSymbolYOffset","technicalInstruction","MusicSystem","staffLines","calcBracketsWidth","XBordersHaveBeenSet","getSkyLineMin","getBottomLineMax","YBordersHaveBeenSet","topMeasure","bottomMeasure","addMeasureLine","SystemLine","firstVexStaff","lastVexStaff","vexFlowBracket","VexFlowInstrumentBrace","InstrumentBrackets","recursionDepth","vexFlowBrace","measureNumberLabels","objectsToRedraw","instrumentBrackets","groupBrackets","graphicalMarkedAreas","graphicalComments","systemLines","idxInParent","leftSystemLine","createSystemLine","SystemLines","createLinesForSystemLine","staffLineRelative","getBottomStaffLine","singleVerticalLineAfterMeasure","systemXPosition","createInstrumentBracket","instrumentGroups","instrumentGroup","instrument1","findFirstVisibleInstrumentInInstrumentalGroup","instrument2","findLastVisibleInstrumentInInstrumentalGroup","createGroupBracket","instrNameLabel","PartAbbreviation","labelText","updateMusicSystemStaffLineXPosition","ypositionSum","staffCounter","second","topStaffLine","systemLine","instrumentBracket","instrumentalGroup","groupOrInstrument","parentInstrument","instrumentStaffId","stafflineCount","parentMusicSystem","parentTopStaffLine","systemLineType","DistanceBetweenVerticalSystemLines","SystemBoldLineWidth","SystemDotWidth","DistanceBetweenDotAndLine","drawableBoundingBoxElement","skyLineVisible","bottomLineVisible","phonicScoreMode","PhonicScoreModes","Manual","splitScreenLineColor","drawSplitScreenLine","Cursors","drawLineAsVerticalRectangle","Cursor","applyScreenTransformationForRect","calculatePixelDistance","widthInPixel","renderLabel","transformedPoints","symbol","systemBoundingBoxInPixels","absBoundingRectWithMargin","getSystemAbsBoundingRect","getSytemBoundingBoxInPixels","drawMusicSystemComponents","relBoundingRect","BoundingRectangle","selectStartSymb","SelectionStartSymbol","selectEndSymb","SelectionEndSymbol","drawDashes","drawLyricLines","drawSystemLineObject","drawInstrumentBrace","drawGroupBracket","measureNumberLabel","drawStaffLineSymbols","drawComment","systemId","absBoundingRect","createNewImage","drawMeasure","drawOctaveShifts","drawExpressions","drawSkyLine","drawBottomLine","lyricLines","lyricLine","drawGraphicalLine","colorOrStyle","lyricsDashes","drawLineAsHorizontalRectangleWithOffset","symbolStyle","drawMusicSystem","drawBoundingBoxes","startBox","dataObjectString","tmpRect","drawLineAsHorizontalRectangle","Background","markedArea","GraphicalMarkedAreas","systemRectangle","drawRectangle","settings","Comment","labelRectangle","comment","GraphicalComments","parentInst","absX","absY","highlight","Highlight","MusicSymbolDrawingStyle","Disabled","PLAY","Midi","midiPlaybackAvailable","PlaybackSymbols","MIC","FollowSymbols","drawSymbol","measurePSI","absXPSI","absYPSI","DrawErroneousMeasures","MeasureError","DrawingMode","extendedNoteList","BeamEnum","NoteTypeHandler","NoteTypeXmlValues","indexInArray","UNDEFINED","tmpList","aeIdx","currentExpression","nextExpression","dist","getDistance","DynamicExpressionMaxDistance","aes","centerYs","yIdeal","exprIdx","centerOffset","shiftYPosition","squeeze","prevExpression","overlapRight","getOverlap","DynamicExpressionSpacer","overlapLeft","rightBorderA","leftBorderB","bottomBorderA","topBorderB","ChordSymbolContainer","calculateChordText","GraphicalCurve","tPow3","oneMinusTPow3","bezierFactorOne","bezierFactorTwo","lyricsTextAlignment","LyricsAlignmentStandard","lyricWord","graphicalLyricsEntries","firstInstructionStaffEntry","lastInstructionStaffEntry","relativeTimestamp","findStaffEntryMinNoteLength","voiceDuration","calculateNumberOfNeededDots","transposedPitch","product","expandedNumerator","GetExpandedNumerator","GraphicalOctaveShift","getOctaveShift","setSymbol","octaveSymbol","xTimestampSpan","yTimestampSpan","slurStartNote","findGraphicalNoteFromNote","graceStart","findGraphicalNoteFromGraceNote","findEndTieGraphicalNoteFromNoteWithStartingSlur","slurEndNote","graceEnd","calculatePlacement","startEndPoints","calculateStartAndEnd","endY","minAngle","SlurTangentMinAngle","maxAngle","SlurTangentMaxAngle","SlurNoteHeadYOffset","startUpperRight","endUpperLeft","staffEntryParent","calculateTopPoints","pointF","startEndLineAngleRadians","start2","rotationMatrix","transposeMatrix","end2","Matrix2D","getRotationMatrix","getTransposeMatrix","vectorMultiplication","calculateTranslatedAndRotatedPointListAbove","leftLineSlope","calculateMaxLeftSlope","rightLineSlope","calculateMaxRightSlope","leftLineD","rightLineD","intersectionPoint","sameSlope","leftAngle","rightAngle","calculateAngles","controlPoints","calculateControlPoints","leftControlPoint","rightControlPoint","getLeftIndexForPointX","curvePoint","calculateCurvePointAtIndex","startLowerRight","endLowerLeft","calculateBottomPoints","calculateTranslatedAndRotatedPointListBelow","slurStartVE","slurEndVE","startNoteHasMoreStartingSlurs","isSlurLonger","SlursStartingAtSameStaffEntryYOffset","endNoteHasMoreEndingSlurs","hasMultipleVoices","startStemDirection","sX","eX","minAbove","maxBelow","getRightIndexForPointX","getPointListMaxY","heightWidthRatio","calculateHeightWidthRatio","relativeLength","degreesToRadiansFactor","calculatedLeftAngle","calculatedRightAngle","GraphicalStaffEntry","graphicalInstructions","tieNote","LinkStaffEntries","sEntry","calNoteLen","staffLineParent","mStaffLineParent","mRules","arrayLength","StaffLineParent","mSkyLine","mBottomLine","tmpCanvas","vsStaff","initializeHeadless","getCanvas","oldMeasureWidth","imageData","getImageData","rgbaLength","measureArrayLength","tmpSkyLine","tmpBottomLine","bufIndex","drawPixel","img","write","arrayChunkSize","subSampledSkyLine","subSampledBottomLine","chunkIndex","chunk","TopLineOffset","BottomLineOffset","coord","updateInRange","setInRange","sl","bl","getMinInRange","getMaxInRange","startPoint","endPoint","updateWithBoundingBoxRecursivly","currentTopBorder","currentBottomBorder","skyBottomArray","StaffLine","octaveShifts","abstractExpressions","graphicalSlurs","skyBottomLine","topLineOffset","bottomLineOffset","calculateStaffLineOffsets","GetMusicSheet","TabStaffInterlineHeight","activitySymbol","closestStaffentry","SvgVexFlowBackend","offsetWidth","offsetHeight","fontFamilyVexFlow","fontWeightVexflow","fontStyleVexflow","instantaneousDynamicExpression","DynEnum","supscript","lastBorderLeft","applyBordersFromVexflow","slursInVFStaffLine","alignmentManager","vfSlur","linkStaffEntries","tupletLabelNumber","fractions","zip","loadAsync","then","_","file","async","err","rootFile","DOMParser","parseFromString","getElementsByTagName","xml","doc","documentElement","MusicSheetReader","afterSheetReadingModules","repetitionInstructionReader","MusicSymbolModuleFactory","createRepetitionInstructionReader","repetitionCalculator","createRepetitionCalculator","instrumentReaders","instrumentReader","doCalculationsAfterDurationHasBeenSet","_createMusicSheet","sourceMeasureCounter","MusicSheet","Path","MusicSheetReadingException","pushSheetLabels","partlistNode","partInst","partList","initializeReading","couldReadMeasure","currentFraction","guitarPro","encoding","currentMeasure","SourceMeasure","readNextXmlMeasure","errorMsg","ITextTranslation","translateText","addMeasure","checkIfRhythmInstructionsAreSetAndEqual","checkSourceMeasureForNullEntries","setSourceMeasureDuration","SheetErrors","finalizeMeasure","previousMeasure","removeRedundantInstructions","calculateRepetitions","repetitionInstructions","checkForInstrumentWithNoVoice","fillStaffList","DefaultStartTempoInBpm","userStartTempoInBPM","instrumentDict","createInstrumentGroups","getCompleteNumberOfStavesFromXml","idNode","attribute","currentInstrument","xmlMeasureList","instrumentNumberOfStaves","getInstrumentNumberOfStavesFromXml","createStaves","InstrumentReader","rhythmInstructions","maxRhythmValue","areRhythmInstructionsMixed","_lastElement","removeAllInstructionsOfTypeRhythmInstruction","ActiveRhythm","instrs","instrumentsMaxTieNoteFractions","MaxTieNoteFraction","activeRythmMeasure","calculateInstrumentsDuration","maxInstrumentDuration","Equal","checkFractionsForEquivalence","reverseCheck","checkIfMeasureIsImplicit","allInstrumentsHaveSameDuration","firstStaffIndexOfInstrument","graphicalMeasureIsEmpty","setErrorInGraphicalMeasure","pushMeasureError","expand","_removeFromArray","filePath","readComposer","readTitle","readTitleAndComposerFromCredits","barI","filenameSplits","substr","identificationNode","creators","creator","presentAttrsWithValue","trimString","systemYCoordinates","computeSystemYCoordinates","largestTitleCreditSize","finalTitle","largestCreditYInfo","finalSubtitle","possibleTitle","creditElements","credit","creditChild","creditJustify","creditY","creditYInfo","creditSize","titleCreditSizeInt","paperHeight","topSystemDistance","defi","found","systemLayouts","syslab","topSystemDistanceString","titleNode","titleNodeChild","movementNode","finalSubTitle","subtitleNodeChild","workNumber","entryList","instrumentId","entryArray","instrIdString","partElements","partElement","SubInstrument","subElement","setMidiInstrument","getSubInstrument","subInstr","instrumentElements","instrumentElement","fixedKey","pan","iG","IdString","partNode","xmlMeasure","stavesNode","PlaybackSettings","sourceMeasures","repetitions","dynListStaves","timestampSortedDynamicExpressionsList","timestampSortedTempoExpressionsList","musicPartManager","musicSheetErrors","MusicSheetErrors","defaultStartTempoInBpm","drawErroneousMeasures","hasBeenOpenedForTheFirstTime","currentEnrolledPosition","playbackSettings","MusicPartManager","hasBPMInfo","InitializeStartTempoInBPM","selectionStart","selectionEnd","staffIndexInMusicSheet","Normal","getMusicSheetInstrumentIndex","staffLineIndex","repIndex","UserNumberOfRepetitions","localeCompare","measureErrors","getLastSourceMeasure","ComposerString","TitleString","iter","CurrentEnrolledTimestamp","vssec","findSourceMeasureFromTimeStamp","visInstruments","defaultTitle","PartListEntry","virtualOverallRepetition","backwardJumpInstructions","endingParts","endingIndexDict","userNumberOfRepetitions","visibles","fromWords","repetitonIterationOrder","numberOfEndings","musicSheet2","defaultNumber","checkRepetitionForMultipleLyricVerses","endingsDiff","NumberOfEndings","iteration","endingIndex","endingNumbers","RepetitionEndingPart","SourceMusicPart","endingNumber","setEndIndex","lyricVerses","verses","endingPart","voiceGeneratorsDict","staffMainVoiceGeneratorDict","divisions","currentClefNumber","currentXmlMeasureIndex","activeKeyHasBeenInitialized","abstractInstructions","openChordSymbolContainers","activeClefsHaveBeenInitialized","createExpressionGenerators","slurReader","SlurReader","maxTieNoteFraction","measureStartAbsoluteTimestamp","prepareReadingMeasure","previousFraction","divisionsException","lastNoteWasGrace","xmlMeasureListArr","xmlNode","newSystemAttr","newPageAttr","noteStaff","currentStaff","noteVoice","currentVoiceGenerator","getOrCreateVoiceGenerator","noteDivisions","noteDuration","typeDuration","getNoteDurationFromTypeNode","getNoteDurationForTuplet","notationsNode","isGraceNote","graceNode","notationNode","typeNode","sizeAttr","StringToNoteType","stemNode","Double","stemColorAttr","parseXmlColor","ornamentsNode","tremoloNode","tremoloType","tremoloStrokesGiven","noteheadNode","colorAttr","noteColorXml","noteColorAttr","currentStaffEntry","findOrCreateStaffEntry","hasVoiceEntry","checkForStaffEntryLink","beginOfMeasure","hasNotes","saveAbstractInstructionList","read","expressionReader","expressionReaders","readExpressionStaffNumber","readExpressionParameters","divisionsNode","readDivisionsFromNotes","addAbstractInstruction","isAttributesNodeAtBeginOfMeasure","isAttributesNodeAtEndOfMeasure","saveClefInstructionAtEndOfMeasure","staffDetailsNode","staffLinesNode","staffNumberAttr","forFraction","backFraction","IsNegative","directionTypeNode","relativePositionInMeasure","handeled","handleRepetitionInstructionsFromWordsOrSymbols","addOctaveShift","handleLineRepetitionInstructions","SystemLinesEnumHelper","xmlBarlineStyleToSystemLinesEnum","ChordSymbolReader","readChordSymbol","checkForOpenBeam","createDefaultClefInstruction","createDefaultKeyInstruction","reader","checkForOpenExpressions","HasBPMInfo","Message","xmlColorString","checkOpenTies","voiceGenerator","GetVoice","mainVoiceGenerator","VoiceGenerator","ExpressionReader","firstStaffEntry","removeFirstInstructionOfTypeClefInstruction","removeFirstInstructionOfTypeKeyInstruction","parentNode","attributesNode","attributesNodeIndex","firstNoteNodeIndex","childs","nextNoteNodeIndex","getNoteDurationFromType","transposeNode","chromaticNode","PlaybackTranspose","nodeList","clefEnum","clefOctaveOffset","lineNode","signNode","isSupportedClef","clefOctaveNode","keyNode","keyEnum","modeNode","timeNode","timePrintObject","symbolAttribute","printObjectAttribute","denom","senzaMisura","timeList","beatsList","typeList","maxDenom","newRhythmInstruction","newClefInstruction","sseIndex","firstSse","newKeyInstruction","removeFirstInstructionOfTypeRhythmInstruction","actualNotes","actual","directionStaffNumber","staffNode","divisionsFromNote","xmlMeasureIndex","durationNode","mainVoice","lastBeamTag","openTieDict","currentOctaveShift","tupletDict","openTupletNumber","lyricsReader","LyricsReader","articulationReader","ArticulationReader","addToVoice","currentVoiceEntry","noteNode","currentNote","addRestNote","lyricElements","addLyricEntry","hasTupletCommand","readArticulations","slurElements","addSlur","tupletElements","addTuplet","arpeggioNode","currentArpeggio","arpeggioAlreadyExists","directionAttr","tiedNodeList","addTie","handleTimeModificationNode","StaffEntryLink","linkMusicTimestamp","getVerticalContainerByTimestamp","openBeam","handleOpenBeam","articNode","addArticulationExpression","fermaNode","addFermata","tecNode","addTechnicalArticulations","ornaNode","addOrnament","noteAlter","noteAccidental","noteStep","noteOctave","noteheadShapeXml","noteheadFilledXml","xmlnodeElementsArr","noteElement","noteElementsArr","pitchElement","displayStep","OctaveXmlDifference","noteLength","fretNumber","technicalNode","stringNode","fretNode","NoteheadColorXml","PlaybackInstrumentId","StemColorXml","createBeam","restFraction","ExtendedNoteList","beamNode","beamAttr","beamNumber","mainBeamNode","currentBeamTag","sameVoiceEntry","beamNote","addNoteToBeam","beamLastNoteStaffEntry","getVerticalContainerIndexByTimestamp","candidateNote","tupletNodeList","timeModNode","tupletNodeListArr","tupletNode","bracketAttr","tupletNumber","subnotelist","Fractions","getTupletNoteDurationFromType","tupletnumber","noTupletNumbering","tieNodeList","tieNode","findCurrentNoteInTieDict","newTieNumber","getNextAvailableNumberForTie","Tie","tieNumber","lyricNodeList","lyricNodeListArr","lyricNode","syllabic","textNode","lyricNodeChildren","elisionIndex","nextText","nextSyllabic","currentLyricVerseNumber","errorNumberParse1","currentLyricWord","syllableNumber","LyricWord","lvn","input","childNotes","articulationEnum","isSupportedArticulation","xmlElementToArticulationEnum","xmlArticulation","nodeFingering","currentTechnicalInstruction","TechnicalInstruction","elementToOrnamentEnum","ornamentElement","accidentalsList","accidentalsListArr","accidentalNode","getAccEnumFromString","placementAttr","kindText","rootStep","rootAlter","rootNote","rootAlteration","kindValue","bass","bassStep","bassAlter","bassNote","bassAlteration","degreeNode","degreeValue","degreeAlter","degreeType","Degree","globalStaffIndex","inSourceMeasureCurrentFraction","inSourceMeasureFormerFraction","currentMeasureIndex","ignoreDivisionsOffset","offsetNode","offsetDivisions","directionTimestamp","offsetFraction","placeAttr","dynamicsNode","defAttr","readExpressionPlacement","wedgeNode","wordsNode","directionNode","isTempoInstruction","isDynamicInstruction","tempoAttr","dynAttr","dirNode","dirContentNode","beatUnit","bpmNumber","createNewTempoExpressionIfNeeded","instantaneousTempoExpression","currentMultiTempoExpression","addExpression","CombinedExpressionsText","fromNotation","interpretInstantaneousDynamics","interpretWords","interpretWedge","openContinuousDynamicExpression","createNewMultiExpressionIfNeeded","closeOpenContinuousDynamic","openContinuousTempoExpression","closeOpenContinuousTempo","endTimestamp","octaveStaffNumber","octaveShiftNode","StaffNumber","getMultiExpression","catchLogMessage","expressionText","activeInstantaneousDynamic","checkIfWordsNodeIsRepetitionInstruction","fillMultiOrTempoExpression","addWedge","MultiExpression","MultiTempoExpression","continuousDynamicExpression","tmpInputString","createExpressionFromString","stringTrimmed","isInputStringInstantaneousTempo","isInputStringContinuousTempo","continuousTempoExpression","isInputStringInstantaneousDynamic","isInputStringContinuousDynamic","MoodExpression","isInputStringMood","moodExpression","hasDigit","unknownExpression","UnknownExpression","EndingContinuousDynamic","AbsoluteEndTimestamp","setMoodType","listMoodAffettuoso","listMoodAgitato","listMoodAnimato","listMoodAppassionato","listMoodBrillante","listMoodCantabile","listMoodDolce","listMoodEnergico","listMoodEroico","listMoodEspressivo","listMoodFurioso","listMoodGiocoso","listMoodGioioso","listMoodGrandioso","listMoodGrazioso","listMoodLacrimoso","listMoodLeggiero","listMoodMaestoso","listMoodMalinconico","listMoodMarcato","listMoodMarziale","listMoodMesto","listMoodMorendo","listMoodNobilmente","listMoodPatetico","listMoodPesante","listMoodSaltando","listMoodSautille","listMoodScherzando","listMoodSostenuto","listMoodSpiccato","listMoodTenerezza","listMoodTranquillamente","listMoodTrionfante","moodType","MoodEnum","Affettuoso","Agitato","Animato","Appassionato","Brillante","Cantabile","Dolce","Energico","Eroico","Espressivo","Furioso","Giocoso","Gioioso","Grandioso","Grazioso","Lacrimoso","Leggiero","Maestoso","Malinconico","Marcato","Marziale","Mesto","Morendo","Nobilmente","Patetico","Pesante","Saltando","Sautille","Scherzando","Sostenuto","Spiccato","Tenerezza","Tranquillamente","Trionfante","openSlurDict","slurNodes","slurNode","slurNumber","Slur","checkForDoubleSlur","parseMidiInstrument","midiInstrument","Bright_Acoustic_Piano","Electric_Grand_Piano","Electric_Piano_1","Electric_Piano_2","instrumentType","tmpName","Synth_Voice","Banjo","Recorder","Trombone","Viola","Cello","Clarinet","Flute","French_Horn","Acoustic_Guitar_nylon","Orchestral_Harp","Oboe","Church_Organ","Piccolo","Tenor_Sax","Steel_Drums","String_Ensemble_1","Trumpet","Tuba","Violin","Woodblock","RepetitionInstructionReader","RepetitionCalculator","barlineNode","pieceEndingDetected","hasRepeat","styleNode","barlineNodeElements","childNode","separatedEndingIndices","separatedEndingIndex","newInstruction","RepetitionInstruction","addInstruction","relativeMeasurePosition","dsRegEx","innerText","StringUtil","StringContainsSeparatedWord","dcRegEx","segnoCount","codaCount","toCodaCount","dalSegnaCount","findInstructionInPreviousMeasure","foundInstruction","backwardSearchForPreviousIdenticalInstruction","RepetitionInstructionComparer","currentInstructionIndex","searchedType","currentInstruction","currentRepetitionInstructions","handleRepetitionInstructions","currentRepetitionInstruction","cachedSetTimeout","cachedClearTimeout","process","defaultSetTimout","defaultClearTimeout","runTimeout","fun","setTimeout","clearTimeout","currentQueue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","marker","runClearTimeout","Item","nextTick","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","umask","toStrF","nCopies","copies","values_1","toSet","elements_1","LinkedDictionaryPair","unlink","HeadOrTailLinkedDictionaryPair","tail","appendToTail","getLinkedDictionaryPair","oldPair","newPair","existingPair","crawlNode","valuesEqualsFunction","allowDuplicateValues","allowDuplicate","_a","v_1","heap","Direction","rootIds","initRootIds","initNodes","rootId","createEmptyNodeIfNotExist","nodeKey","nodeListItem","getRootIds","getNodes","getObject","toObject","flatten","extraPropsObject","hasParent","childrenCount","traverse","extraPropsObject_1","countChildren","startId","returnArray","idsList","moveIdBeforeId","moveId","beforeId","BEFORE","moveIdAfterId","afterId","AFTER","moveIdIntoId","insideId","atStart","INSIDE_AT_START","INSIDE_AT_END","swapRootIdWithRootId","withRootId","findRootId","swapRootPositionWithRootPosition","swapRootPosition","withRootPosition","deleteId","rootDeleteId","nodeAndSubNodesDelete","nodeRefrencesDelete","insertIdBeforeId","insertId","foundRootIdIndex","insertIdIntoRoot","foundNodeIdIndex","findNodeId","insertIdIntoNode","insertIdAfterId","belowId","insertIdIntoId","nodeInsertAtEnd","rootInsertAtEnd","length_1","length_2","sourceId","sourceRootIndex","targetId","targetRootIndex","rootDelete","nodeInsertAtStart","nodeDeleteAtIndex","swapArrayElements","toDeleteLater","nodeDelete","findNode","rootInsertAtStart","OpenSheetMusicDisplay","OSMDOptions","OSMDOptionsStandard","zoomUpdated","backendType","MXLHelper","MXLtoXMLstring","load","trimmedStr","AJAX","ajax","exc","xmlDocument","xmlDocumentNodes","scorePartwiseElement","URL","score","sheet","createMusicSheet","needBackendUpdate","updateGraphic","calc","cursor","init","drawer","aspectRatio","reCalculate","createOrRefreshRenderBackend","setZoom","enableOrDisableCursor","removeAllChildrenFromContainer","DrawBoundingBox","createBackend","sizeWarningPartTwo","getOSMDBackendType","backendTypeGiven","BackendTypeFromString","autoBeam","PercussionForceVoicesOneLineCutoff","setColoringMode","disableCursor","drawMetronomeMarks","drawPartAbbreviations","drawFingerings","drawMeasureNumbers","measureNumberInterval","PlacementEnumFromString","newSystemFromXML","newPageFromXML","followCursor","drawUpToMeasureNumber","drawFromMeasureNumber","resizeHandlerAttached","autoResizeEnabled","setPageFormat","noteIndices","colorSetString","colorString","coloringSetCurrent","INFO","WARN","ERROR","handleResize","GetCalculator","IsReadyToRender","startCallback","endCallback","rtime","resizeStart","AutoResizeEnabled","resizeEnd","attachEvent","addEventListener","enable","Hidden","previousIterator","Iterator","RestoreCursorAfterRerender","pageFormatString","widthAndHeight","PageFormatStandards","formatId","newPageFormat","StringToPageFormat","drawBoundingBox","AbstractGraphicalInstruction","settingsLabel","GraphicalRectangle","upperLeftPoint","lowerRightPoint","matrix","rotation","scalar","graphicalLinkedStaffEntries","graphicalLinkedStaffEntry","GetVoiceEntry","xCoordinate","verticalLine","anchor","arrowPoints","arrows","linePoints","arrowThickness","hilfsVar","arrowlines","CurvePositionEnum","VexFlowSlur","parentslur","parentSlur","vfCurve","CreateTabNote","instrumentVoiceMapping","voiceIdx","forceOneLineCutoff","forceOneLine","voiceNumber","currentInstrumentMapping","vfGraphicalNote","storageObj","encode","getTypeOf","charCodeAt","charAt","decode","uint8array","Uint8Array","compressedSize","uncompressedSize","crc32","compression","compressedContent","getContentWorker","pipe","uncompressWorker","streamInfo","data_length","getCompressedWorker","withStreamInfo","createWorkerFrom","compressWorker","STORE","magic","DEFLATE","base64","binary","createFolders","date","compressionOptions","unixPermissions","dosPermissions","lie","Uint16Array","Uint32Array","_pako","_pakoAction","_pakoOptions","meta","inherits","processChunk","_createPako","transformTo","flush","cleanUp","raw","onData","pako","O","utf8encode","I","S","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCFullYear","getUTCMonth","getUTCDate","fileRecord","R","LOCAL_FILE_HEADER","dirRecord","CENTRAL_FILE_HEADER","bytesWritten","zipComment","zipPlatform","encodeFileName","streamFiles","accumulate","contentBuffer","dirRecords","currentSourceOffset","entriesCount","currentFile","_sources","percent","openedSource","closedSource","DATA_DESCRIPTOR","CENTRAL_DIRECTORY_END","prepareNextSource","isPaused","pause","resume","registerPrevious","generatedError","lock","generateWorker","platform","_compressWorker","files","support","external","decompressed","checkCRC32","optimizedBinaryString","decodeFileName","utf8decode","isNode","isStream","prepareContent","all","fileNameStr","fileCommentStr","12","_upstreamEnded","_bindStream","_stream","13","Readable","_helper","_read","14","Buffer","newBufferFrom","allocBuffer","alloc","isBuffer","15","substring","folder","generate","generateInternalStream","checkSupport","generateAsync","generateNodeStream","toNodejsStream","16","stream","17","byteAt","zero","lastIndexOfSignature","readAndCheckSignature","readData","checkOffset","18","checkIndex","skip","readInt","readString","readDate","UTC","19","20","21","subarray","22","23","ZIP64_CENTRAL_DIRECTORY_LOCATOR","ZIP64_CENTRAL_DIRECTORY_END","24","destType","25","26","propName","27","dataIsReady","_tickScheduled","_tickAndRepeat","delay","isFinished","_tick","28","extraStreamInfo","isLocked","_listeners","mergeStreamInfo","29","nodestream","_internalType","_outputType","_mimeType","_worker","newBlob","objectMode","30","arraybuffer","ArrayBuffer","nodebuffer","blob","Blob","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","append","getBlob","31","leftOver","applyFromCharCode","Utf8DecodeWorker","Utf8EncodeWorker","32","stringifyByChunk","stringifyByChar","applyCanBeUsed","buffer","byteLength","MAX_VALUE_16BITS","MAX_VALUE_32BITS","pretty","FileReader","onload","target","onerror","readAsArrayBuffer","33","loadOptions","checkSignature","isSignature","readBlockEndOfCentral","diskNumber","diskWithCentralDirStart","centralDirRecordsOnThisDisk","centralDirRecords","centralDirSize","centralDirOffset","zipCommentLength","readBlockZip64EndOfCentral","zip64EndOfCentralSize","zip64ExtensibleData","readBlockZip64EndOfCentralLocator","diskWithZip64CentralDirStart","relativeOffsetEndOfZip64CentralDir","disksCount","readLocalFiles","localHeaderOffset","readLocalPart","handleUTF8","processAttributes","readCentralDir","zip64","readCentralPart","readEndOfCentral","prepareReader","34","isEncrypted","bitFlag","useUTF8","fileNameLength","fileName","compressionMethod","versionMadeBy","extraFieldsLength","fileCommentLength","diskNumberStart","internalFileAttributes","externalFileAttributes","readExtraFields","parseZIP64ExtraField","fileComment","extraFields","findExtraFieldUnicodePath","findExtraFieldUnicodeComment","35","_data","_dataBinary","internalStream","_decompressWorker","nodeStream","36","MutationObserver","WebKitMutationObserver","createTextNode","observe","characterData","setImmediate","MessageChannel","port1","onmessage","port2","postMessage","global","37","outcome","promise","onFulfilled","callFulfilled","otherCallFulfilled","onRejected","callRejected","otherCallRejected","finally","catch","race","immediate","38","39","chunkSize","windowBits","memLevel","strategy","gzip","ended","chunks","strm","avail_out","deflateInit2","header","deflateSetHeader","string2buf","deflateSetDictionary","_dict_set","next_in","avail_in","output","Buf8","next_out","deflate","onEnd","buf2binstring","shrinkBuf","deflateEnd","flattenChunks","Deflate","deflateRaw","40","inflateInit2","Z_OK","inflateGetHeader","Z_FINISH","Z_NO_FLUSH","binstring2buf","inflate","Z_NEED_DICT","inflateSetDictionary","Z_BUF_ERROR","Z_STREAM_END","Z_SYNC_FLUSH","utf8border","buf2string","arraySet","inflateEnd","Inflate","inflateRaw","ungzip","41","Int32Array","setTyped","Buf16","Buf32","42","43","44","Z_PARTIAL_FLUSH","Z_FULL_FLUSH","Z_BLOCK","Z_TREES","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","45","46","T","pending","pending_buf","pending_out","total_out","N","_tr_flush_block","block_start","strstart","U","P","max_chain_length","prev_length","nice_match","w_size","w_mask","good_match","lookahead","match_start","window_size","hash_size","wrap","adler","total_in","insert","ins_h","hash_shift","hash_mask","Z","match_length","_tr_tally","max_lazy_match","last_lit","prev_match","match_available","M","good_length","max_lazy","nice_length","max_chain","H","pending_buf_size","gzhead","gzindex","last_flush","w_bits","hash_bits","dyn_ltree","dyn_dtree","bl_tree","l_desc","d_desc","bl_desc","bl_count","heap_len","heap_max","l_buf","lit_bufsize","d_buf","opt_len","static_len","bi_buf","bi_valid","data_type","_tr_init","K","Y","deflateInit","deflateReset","deflateResetKeep","hcrc","os","_tr_align","_tr_stored_block","deflateInfo","47","xflags","extra_len","done","48","dmax","wsize","whave","wnext","hold","bits","lencode","distcode","lenbits","distbits","sane","49","havedict","flags","check","wbits","ncode","nlen","ndist","have","lens","work","lendyn","distdyn","back","was","inflateReset","inflateReset2","inflateResetKeep","inflateInit","inflateInfo","50","51","52","static_tree","extra_bits","extra_base","elems","max_length","has_stree","dyn_tree","max_code","stat_desc","V","J","53","54","ieee754","isArray","kMaxLength","TYPED_ARRAY_SUPPORT","createBuffer","arg","encodingOrOffset","allocUnsafe","byteOffset","fromArrayLike","fromArrayBuffer","isEncoding","fromString","checked","fromObject","assertSize","isView","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","bidirectionalIndexOf","arrayIndexOf","indexSize","arrLength","valLength","buf","readUInt16BE","hexWrite","remaining","strLen","parsed","utf8Write","blitBuffer","asciiWrite","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","fromByteArray","res","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","decodeCodePointsArray","SlowBuffer","INSPECT_MAX_BYTES","foo","typedArraySupport","poolSize","_augment","species","configurable","allocUnsafeSlow","_isBuffer","swap16","swap32","swap64","inspect","thisStart","thisEnd","thisCopy","targetCopy","isFinite","toJSON","_arr","toHex","bytes","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","INVALID_BASE64_RE","leadSurrogate","toByteArray","stringtrim","base64clean","dst","b64","getLens","validLen","placeHoldersLen","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","encodeChunk","lookup","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","rt","Timeout","clearFn","_id","_clearFn","scope","setInterval","clearInterval","close","unref","ref","enroll","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","clearImmediate","registerImmediate","html","channel","messagePrefix","onGlobalMessage","nextHandle","tasksByHandle","currentlyRunningATask","attachTo","getPrototypeOf","handle","runIfPresent","importScripts","postMessageIsAsynchronous","oldOnMessage","canUsePostMessage","event","script","random","task","sheetStart","sheetEnd","SheetEndTimestamp","calcMapping","curEnrolledTimestamp","curTransform","timestamps","gte","$from","getCurrentRepetitionTimestampTransform","MusicPartManagerIterator","beginning","currentRepetition","CurrentRepetition","curTimestampTransform","TimestampTransform","CurrentSourceTimestamp","JumpOccurred","backJumpOccurred","jumpRep","JumpResponsibleRepetition","nextBackJump","curRepetition","curRepetitionIteration","CurrentJumpResponsibleRepetitionIterationBeforeJump","sourceTimestamp","enrolledTimestamp","nextForwardJump","startTimestamp","currentPartIndex","currentVoiceEntryIndex","currentDynamicEntryIndex","currentTempoEntryIndex","currentDynamicChangingExpressions","endReached","frontReached","currentEnrolledMeasureTimestamp","currentVerticalContainerInMeasureTimestamp","jumpResponsibleRepetition","activeDynamicExpressions","currentVoiceEntries","setRepetitionIterationCount","DynamicsContainer","currentTempoChangingExpression","activeTempoExpression","getRepetitionIterationCount","forwardJumpOccurred","currentMappingPart","getVisibleEntries","getAudibleEntries","getScoreFollowingEntries","recursiveMove","notesOnly","checkEntries","repetitionIterationCountDictKeys","iterationCount","repetitionIterationCountDictValues","resetRepetitionIterationCount","doBackJump","forwardJumpTargetMeasureIndex","getForwardJumpTargetForIteration","getBackwardJumpTarget","incrementRepetitionIterationCount","SheetPlaybackSetting","timeSortedDynamics","TimestampSortedDynamicExpressionsList","parMultiExpression","dynamicsContainer","startTime","endTime","ParentMultiExpression","timeSortedTempoExpressions","TimestampSortedTempoExpressionsList","handleRepetitionsAtMeasureBegin","activateCurrentRhythmInstructions","currentContainer","getVoiceEntries","activateCurrentDynamicOrTempoInstructions","handleRepetitionsAtMeasureEnd","tlist","visibleEntries","audibleEntries","followingEntries","CompareTo","errors","tempErrors","syllableIndex","expressions","instantaneousTempo","continuousTempo","combinedExpressionsText","abstractTempoExpression","checkIfAlreadyExists","tempoExpressionEntry","TempoExpressionEntry","unknownList","moodList","endingContinuousDynamic","startingContinuousDynamic","octaveShiftStart","octaveShiftEnd","abstractExpression","removeExpressionFromEntryList","addExpressionToEntryList","multiExpressionEntry","MultiExpressionEntry","wordRegExString","sourceMusicPart","parentPartListEntry","repetitionRun","isEnding","IsRepetition","comp","PSMath","base","weights","sumWeigtedValues","sumWeights"],"mappings":"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AIzU,KAAKmT,KAAQ,IAC7C,MACJ,KAAKF,EAAS5L,EACVrH,KAAKwU,UAAY,IAAI,EAAA9N,MAAM,EAAAF,SAASa,EAAG,EAAIrH,KAAKkT,aAAc,EAAAzM,eAAeK,MAC7E9G,KAAKyU,oBAAuB,EAAIzU,KAAKmT,KACrC,MACJ,KAAKF,EAASqB,WACVtU,KAAKwU,UAAY,IAAI,EAAA9N,MAAM,EAAAF,SAASa,EAAG,EAAG,EAAAZ,eAAeK,MACzD9G,KAAKyU,oBAAsB,EAC3B,MACJ,KAAKxB,EAASsB,IACVvU,KAAKwU,UAAY,IAAI,EAAA9N,MAAM,EAAAF,SAASiB,EAAG,EAAG,EAAAhB,eAAeK,MACzD9G,KAAKyU,oBAAsB,EAC3B,MACJ,QACI,MAAM,IAAI,EAAAnF,4BAA4B,cAKtD,IAAY2D,EASAM,EAjKZ,oBAwJA,SAAYN,GACR,aACA,aACA,aACA,+BACA,iBALJ,CAAYA,EAAA,EAAAA,WAAA,EAAAA,SAAQ,KASpB,SAAYM,GACR,oBACA,mDACA,qDACA,mDACA,2CACA,2CACA,2CACA,iCACA,2BACA,yBACA,mCACA,8BACA,gCACA,0BACA,8BACA,sCACA,4BACA,sCACA,4CACA,gCACA,oCACA,gCACA,8BACA,8BACA,0CACA,sDACA,sDACA,oDACA,sDACA,sDACA,8CACA,8CACA,4CACA,sCACA,oDACA,gDACA,sCACA,kCACA,kCACA,oCACA,oCACA,wBACA,sBACA,sBACA,gCACA,0CACA,8CACA,0CACA,0BACA,8CACA,8CACA,0CACA,0CACA,gCACA,gCACA,kCACA,sCACA,0BACA,4BACA,oBACA,sCACA,kCACA,sCACA,sCACA,sCACA,kCACA,4BACA,8BACA,oCACA,oBACA,oCACA,0BACA,4BACA,0BACA,sBACA,4BACA,8BACA,oCACA,gCACA,0BACA,0BACA,sCACA,0CACA,0CACA,oCACA,wCACA,oCACA,sCACA,4CACA,sCACA,gCACA,0CACA,kCACA,kCACA,wCACA,gCACA,kCACA,8BACA,0CACA,oCACA,0CACA,2CACA,qCACA,mCACA,iCACA,uBACA,uBACA,6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AAOyyF,EAAcn3B,MACzB,IAAK,UACD,OAAOm3B,EAAcE,QACzB,IAAK,SAEL,IAAK,KACD,OAAOF,EAAcO,OACzB,IAAK,KACL,IAAK,WACD,OAAOP,EAAcI,SACzB,IAAK,YACD,OAAOJ,EAAcM,UACzB,IAAK,WACD,OAAON,EAAcK,QACzB,QAEI,OADA,UAAIwe,KAAK,uCAAyC2Y,EAAe,6BAC1Dx3B,EAAcC,SAMrC,IAAYD,EArFZ,aAqFA,SAAYA,GACR,yBACA,yBACA,uBACA,6BACA,qBACA,uBACA,2BACA,aARJ,CAAYA,EAAA,EAAAA,gBAAA,EAAAA,cAAa,M,8EC3FzB,SAAY+3B,GACR,iDACA,+BACA,mCACA,uCACA,iDACA,qDACA,iDACA,qDACA,6CACA,iDACA,gCACA,gCACA,wBACA,wBACA,wBACA,sBACA,gCACA,kCACA,4BACA,gCACA,8BACA,oCACA,kCACA,wCACA,8CACA,4CACA,oBACA,sBACA,0BACA,kCACA,oCACA,oBACA,kBACA,kBACA,sBACA,oBACA,oBACA,kBACA,sBACA,sBACA,oBACA,kBACA,0BACA,4CACA,4BACA,wBACA,0BACA,oCACA,sDACA,cACA,cACA,cACA,cACA,cACA,cACA,sBACA,oBACA,8BACA,kCACA,sCACA,oCACA,wCACA,kCACA,sCACA,oCACA,wCACA,4BACA,0BACA,4CACA,oBACA,sCACA,gDACA,kCACA,gCACA,kBACA,kBACA,sBACA,oBACA,oBACA,oBACA,oBACA,kBACA,wCACA,4CACA,0BArFJ,CAAY,EAAAA,cAAA,EAAAA,YAAW,M,8ECGvB,cAMA,4BACI,YAAYnxD,GAOL,KAAAn8C,SAAmB,GACnB,KAAAutG,iBAA2B9lI,KAAKu4B,SAPnC,MAAMtgB,EAA4BrT,SAASmhI,cAAc,UACzD/lI,KAAKkd,QAAUjF,EAAOE,WAAW,MACjCnY,KAAK00E,MAAQA,EAeV,8BAA8Bj7D,EAAc+H,EAAalE,EAC3B+8D,EACA9hD,EAAmBv4B,KAAKu4B,UAEzD,OADAv4B,KAAKkd,QAAQsE,KAAO,EAAA2rF,iBAAiB3rF,KAAK+W,EAA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","file":"opensheetmusicdisplay.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"opensheetmusicdisplay\"] = factory();\n\telse\n\t\troot[\"opensheetmusicdisplay\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 77);\n","// TODO: Check the operators' names\n// TODO: This class should probably be immutable?\n\n/**\n * A class representing mathematical fractions, which have a numerator and a denominator.\n */\nexport class Fraction {\n private static maximumAllowedNumber: number = 46340; // sqrt(int.Max) --> signed int with 4 bytes (2^31)\n private numerator: number = 0;\n private denominator: number = 1;\n private wholeValue: number = 0;\n private realValue: number;\n\n /**\n * Returns the maximum of two fractions (does not clone)\n * @param f1\n * @param f2\n * @returns {Fraction}\n */\n public static max(f1: Fraction, f2: Fraction): Fraction {\n if (f1.RealValue > f2.RealValue) {\n return f1;\n } else {\n return f2;\n }\n }\n\n public static Equal(f1: Fraction, f2: Fraction): boolean {\n return f1.wholeValue === f2.wholeValue && f1.Denominator === f2.Denominator && f1.Numerator === f2.Numerator;\n }\n\n /**\n * The same as Fraction.clone\n * @param fraction\n * @returns {Fraction}\n */\n public static createFromFraction(fraction: Fraction): Fraction {\n return new Fraction(fraction.numerator, fraction.denominator, fraction.wholeValue, false);\n }\n\n public static plus(f1: Fraction, f2: Fraction): Fraction {\n const sum: Fraction = f1.clone();\n sum.Add(f2);\n return sum;\n }\n\n public static minus(f1: Fraction, f2: Fraction): Fraction {\n const sum: Fraction = f1.clone();\n sum.Sub(f2);\n return sum;\n }\n\n public static multiply (f1: Fraction, f2: Fraction): Fraction {\n return new Fraction ( (f1.wholeValue * f1.denominator + f1.numerator) * (f2.wholeValue * f2.denominator + f2.numerator),\n f1.denominator * f2.denominator);\n }\n\n private static greatestCommonDenominator(a: number, b: number): number {\n if (a === 0) {\n return b;\n }\n\n if (b === 1) {\n return 1;\n }\n\n while (b !== 0) {\n if (a > b) {\n a -= b;\n } else {\n b -= a;\n }\n }\n\n return a;\n }\n\n /**\n *\n * @param numerator\n * @param denominator\n * @param wholeValue - the integer number, needed for values greater than 1\n * @param simplify - If simplify is true, then the fraction is simplified\n * to make both the numerator and denominator coprime, and less than maximumAllowedNumber.\n */\n constructor(numerator: number = 0, denominator: number = 1, wholeValue: number = 0, simplify: boolean = true) {\n this.numerator = numerator;\n this.denominator = denominator;\n this.wholeValue = wholeValue;\n\n if (simplify) {\n this.simplify();\n }\n this.setRealValue();\n }\n\n public toString(): string {\n let result: string = this.numerator + \"/\" + this.denominator;\n if (this.wholeValue !== 0) {\n result = this.wholeValue + \" \" + result;\n }\n\n return result;\n }\n\n public clone(): Fraction {\n return new Fraction(this.numerator, this.denominator, this.wholeValue, false);\n }\n\n public get Numerator(): number {\n return this.numerator;\n }\n\n public set Numerator(value: number) {\n if (this.numerator !== value) {\n this.numerator = value;\n this.simplify();\n this.setRealValue();\n }\n }\n\n public get Denominator(): number {\n return this.denominator;\n }\n\n public set Denominator(value: number) {\n if (this.denominator !== value) {\n this.denominator = value;\n // don't simplify in case of a GraceNote (need it in order to set the right symbol)\n if (this.numerator !== 0) {\n this.simplify();\n }\n this.setRealValue();\n }\n }\n\n public get WholeValue(): number {\n return this.wholeValue;\n }\n\n public set WholeValue(value: number) {\n if (this.wholeValue !== value) {\n this.wholeValue = value;\n this.setRealValue();\n }\n }\n\n /**\n * Returns the unified numerator where the whole value will be expanded\n * with the denominator and added to the existing numerator.\n */\n public GetExpandedNumerator(): number {\n return this.wholeValue * this.denominator + this.numerator;\n }\n\n public IsNegative(): boolean {\n return this.realValue < 0;\n }\n\n public get RealValue(): number {\n return this.realValue;\n }\n\n public expand(expansionValue: number): void {\n this.numerator *= expansionValue;\n this.denominator *= expansionValue;\n if (this.wholeValue !== 0) {\n this.numerator += this.wholeValue * this.denominator;\n this.wholeValue = 0;\n }\n }\n\n // public multiplyDenominatorWithFactor(factor: number): void {\n // this.denominator *= factor;\n // this.setRealValue();\n // }\n\n /**\n * Adds a Fraction to this Fraction.\n * Attention: This changes the already existing Fraction, which might be referenced elsewhere!\n * Use Fraction.plus() for creating a new Fraction object being the sum of two Fractions.\n * @param fraction the Fraction to add.\n */\n public Add(fraction: Fraction): void {\n // normally should check if denominator or fraction.denominator is 0 but in our case\n // a zero denominator doesn't make sense\n this.numerator = (this.wholeValue * this.denominator + this.numerator) * fraction.denominator +\n (fraction.wholeValue * fraction.denominator + fraction.numerator) * this.denominator;\n this.denominator = this.denominator * fraction.denominator;\n this.wholeValue = 0;\n this.simplify();\n this.setRealValue();\n }\n\n /**\n * Subtracts a Fraction from this Fraction.\n * Attention: This changes the already existing Fraction, which might be referenced elsewhere!\n * Use Fraction.minus() for creating a new Fraction object being the difference of two Fractions.\n * @param fraction the Fraction to subtract.\n */\n public Sub(fraction: Fraction): void {\n // normally should check if denominator or fraction.denominator is 0 but in our case\n // a zero denominator doesn't make sense\n this.numerator = (this.wholeValue * this.denominator + this.numerator) * fraction.denominator -\n (fraction.wholeValue * fraction.denominator + fraction.numerator) * this.denominator;\n this.denominator = this.denominator * fraction.denominator;\n this.wholeValue = 0;\n this.simplify();\n this.setRealValue();\n }\n /**\n * Brute Force quanization by searching incremental with the numerator until the denominator is\n * smaller/equal than the desired one.\n * @param maxAllowedDenominator\n */\n public Quantize(maxAllowedDenominator: number): Fraction {\n if (this.denominator <= maxAllowedDenominator) {\n return this;\n }\n\n const upTestFraction: Fraction = new Fraction(this.numerator + 1, this.denominator, this.wholeValue);\n\n while (upTestFraction.Denominator > maxAllowedDenominator) {\n upTestFraction.Numerator++;\n }\n\n if (this.numerator > this.denominator) {\n const downTestFraction: Fraction = new Fraction(this.numerator - 1, this.denominator, this.wholeValue);\n\n while (downTestFraction.Denominator > maxAllowedDenominator) {\n downTestFraction.Numerator--;\n }\n\n if (downTestFraction.Denominator < upTestFraction.Denominator) {\n return downTestFraction;\n }\n }\n return upTestFraction;\n }\n\n public Equals(obj: Fraction): boolean {\n return this.realValue === obj?.realValue;\n }\n\n public CompareTo(obj: Fraction): number {\n const diff: number = this.realValue - obj.realValue;\n // Return the sign of diff\n return diff ? diff < 0 ? -1 : 1 : 0;\n }\n\n public lt(frac: Fraction): boolean {\n return this.realValue < frac.realValue;\n }\n\n public lte(frac: Fraction): boolean {\n return this.realValue <= frac.realValue;\n }\n\n public gt(frac: Fraction): boolean {\n return !this.lte(frac);\n }\n\n public gte(frac: Fraction): boolean {\n return !this.lt(frac);\n }\n\n //public Equals(f: Fraction): boolean {\n // if (ReferenceEquals(this, f))\n // return true;\n // if (ReferenceEquals(f, undefined))\n // return false;\n // return this.numerator * f.denominator === f.numerator * this.denominator;\n //}\n\n private setRealValue(): void {\n this.realValue = this.wholeValue + this.numerator / this.denominator;\n }\n\n private simplify(): void {\n // don't simplify in case of a GraceNote (need it in order to set the right symbol)\n if (this.numerator === 0) {\n this.denominator = 1;\n return;\n }\n\n // normally should check if denominator or fraction.denominator is 0 but in our case a zero denominator\n // doesn't make sense. Could probably be optimized\n const i: number = Fraction.greatestCommonDenominator(Math.abs(this.numerator), Math.abs(this.denominator));\n\n this.numerator /= i;\n this.denominator /= i;\n\n const whole: number = Math.floor(this.numerator / this.denominator);\n if (whole !== 0) {\n this.wholeValue += whole;\n this.numerator -= whole * this.denominator;\n if (this.numerator === 0) {\n this.denominator = 1;\n }\n }\n if (this.denominator > Fraction.maximumAllowedNumber) {\n const factor: number = this.denominator / Fraction.maximumAllowedNumber;\n this.numerator = Math.round(this.numerator / factor);\n this.denominator = Math.round(this.denominator / factor);\n }\n if (this.numerator > Fraction.maximumAllowedNumber) {\n const factor: number = this.numerator / Fraction.maximumAllowedNumber;\n this.numerator = Math.round(this.numerator / factor);\n this.denominator = Math.round(this.denominator / factor);\n }\n }\n\n public static FloatInaccuracyTolerance: number = 0.0001; // inaccuracy allowed when comparing Fraction.RealValues, because of floating point inaccuracy\n\n public isOnBeat(timeSignature: Fraction): boolean { // use sourceMeasure.ActiveTimeSignature as timeSignature\n const beatDistance: number = this.distanceFromBeat(timeSignature);\n return Math.abs(beatDistance) < Fraction.FloatInaccuracyTolerance;\n }\n\n public distanceFromBeat(timeSignature: Fraction): number {\n const beatStep: Fraction = new Fraction(1, timeSignature.Denominator);\n const distanceFromBeat: number = this.RealValue % beatStep.RealValue; // take modulo the beat value, e.g. 1/8 in a 3/8 time signature\n return distanceFromBeat;\n }\n\n\n //private static equals(f1: Fraction, f2: Fraction): boolean {\n // return f1.numerator * f2.denominator === f2.numerator * f1.denominator;\n //}\n //\n //public static ApproximateFractionFromValue(value: number, epsilonForPrecision: number): Fraction {\n // let n: number = 1;\n // let d: number = 1;\n // let fraction: number = n / d;\n // while (Math.abs(fraction - value) > epsilonForPrecision) {\n // if (fraction < value) {\n // n++;\n // }\n // else {\n // d++;\n // n = Math.round(value * d);\n // }\n // fraction = n / d;\n // }\n // return new Fraction(n, d);\n //}\n //public static GetEarlierTimestamp(m1: Fraction, m2: Fraction): Fraction {\n // if (m1 < m2)\n // return m1;\n // else return m2;\n //}\n\n //public static getFraction(value: number, denominatorPrecision: number): Fraction {\n // let numerator: number = Math.round(value / (1.0 / denominatorPrecision));\n // return new Fraction(numerator, denominatorPrecision);\n //}\n //public static fractionMin(f1: Fraction, f2: Fraction): Fraction {\n // if (f1 < f2)\n // return f1;\n // else return f2;\n //}\n\n //public static GetMaxValue(): Fraction {\n // return new Fraction(Fraction.maximumAllowedNumber, 1);\n //}\n //public static get MaxAllowedNumerator(): number {\n // return Fraction.maximumAllowedNumber;\n //}\n //public static get MaxAllowedDenominator(): number {\n // return Fraction.maximumAllowedNumber;\n //}\n //public ToFloatingString(): string {\n // return this.RealValue.ToString();\n //}\n //public Compare(x: Fraction, y: Fraction): number {\n // if (x > y)\n // return 1;\n // if (x < y)\n // return -1;\n // return 0;\n //}\n\n //#region operators\n //\n // // operator overloads must always come in pairs\n // // operator overload +\n // public static Fraction operator + (Fraction f1, Fraction f2)\n //{\n // Fraction sum = new Fraction(f1);\n // sum.Add(f2);\n // return sum;\n //}\n //\n //// operator overload -\n //public static Fraction operator - (Fraction f1, Fraction f2)\n //{\n // Fraction diff = new Fraction(f1);\n // diff.Sub(f2);\n // return diff;\n //}\n //\n //// operator overloads must always come in pairs\n //// operator overload >\n //public static bool operator > (Fraction f1, Fraction f2)\n //{\n // //return (long) f1.Numerator*f2._denominator > (long) f2._numerator*f1._denominator;\n // return f1.RealValue > f2.RealValue;\n //}\n //\n //// operator overload <\n //public static bool operator < (Fraction f1, Fraction f2)\n //{\n // //return (long) f1._numerator*f2._denominator < (long) f2._numerator*f1._denominator;\n // return f1.RealValue < f2.RealValue;\n //}\n //\n //// operator overload ==\n //public static bool operator === (Fraction f1, Fraction f2)\n //{\n // // code enhanced for performance\n // // System.Object.ReferenceEquals(f1, undefined) is better than if (f1)\n // // and comparisons between booleans are quick\n // bool f1IsNull = System.Object.ReferenceEquals(f1, undefined);\n // bool f2IsNull = System.Object.ReferenceEquals(f2, undefined);\n //\n // // method returns true when both are undefined, false when only the first is undefined, otherwise the result of equals\n // if (f1IsNull !== f2IsNull)\n // return false;\n //\n // if (f1IsNull /*&& f2IsNull*/)\n // return true;\n //\n // return equals(f1, f2);\n //}\n //\n //// operator overload !=\n //public static bool operator !== (Fraction f1, Fraction f2)\n //{\n // return (!(f1 === f2));\n //}\n //\n //// operator overload >=\n //public static bool operator >= (Fraction f1, Fraction f2)\n //{\n // return (!(f1 < f2));\n //}\n //\n //// operator overload <=\n //public static bool operator <= (Fraction f1,Fraction f2)\n //{\n // return (!(f1 > f2));\n //}\n //\n //public static Fraction operator / (Fraction f, int i)\n //{\n // return new Fraction(f._numerator, f._denominator *= i);\n //}\n //\n //public static Fraction operator / (Fraction f1, Fraction f2)\n //{\n // let res = new Fraction(f1.Numerator*f2.Denominator, f1.Denominator*f2.Numerator);\n // return res.Denominator === 0 ? new Fraction(0, 1) : res;\n //}\n //\n //public static Fraction operator * (Fraction f1, Fraction f2)\n //{\n // return new Fraction(f1.Numerator*f2.Numerator, f1.Denominator*f2.Denominator);\n //}\n //\n //public static Fraction operator % (Fraction f1, Fraction f2)\n //{\n // let a = f1/f2;\n // return new Fraction(a.Numerator%a.Denominator, a.Denominator)*f2;\n //}\n //\n //#endregion operators\n}\n","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = \"loglevel\";\n if (name) {\n storageKey += \":\" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== \"string\" || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n","// The value of the enum indicates the number of halftoneSteps from one note to the next\nexport enum NoteEnum {\n C = 0,\n D = 2,\n E = 4,\n F = 5,\n G = 7,\n A = 9,\n B = 11\n}\n\n/** Describes Accidental types.\n * Do not use the number values of these enum members directly for calculation anymore.\n * To use these for pitch calculation, use pitch.AccidentalHalfTones()\n * or Pitch.HalfTonesFromAccidental(accidentalEnum).\n */\nexport enum AccidentalEnum {\n SHARP,\n FLAT,\n NONE,\n NATURAL,\n DOUBLESHARP,\n DOUBLEFLAT,\n TRIPLESHARP,\n TRIPLEFLAT,\n QUARTERTONESHARP,\n QUARTERTONEFLAT,\n}\n\n// This class represents a musical note. The middle A (440 Hz) lies in the octave with the value 1.\nexport class Pitch {\n public static pitchEnumValues: NoteEnum[] = [\n NoteEnum.C, NoteEnum.D, NoteEnum.E, NoteEnum.F, NoteEnum.G, NoteEnum.A, NoteEnum.B,\n ];\n\n private static halftoneFactor: number = 12 / (Math.LN2 / Math.LN10);\n private static octXmlDiff: number = 3;\n\n // private _sourceOctave: number;\n // private _sourceFundamentalNote: NoteEnum;\n // private _sourceAccidental: AccidentalEnum = AccidentalEnum.NONE;\n private octave: number;\n private fundamentalNote: NoteEnum;\n private accidental: AccidentalEnum = AccidentalEnum.NONE;\n private frequency: number;\n private halfTone: number;\n\n public static getNoteEnumString(note: NoteEnum): string {\n switch (note) {\n case NoteEnum.C:\n return \"C\";\n case NoteEnum.D:\n return \"D\";\n case NoteEnum.E:\n return \"E\";\n case NoteEnum.F:\n return \"F\";\n case NoteEnum.G:\n return \"G\";\n case NoteEnum.A:\n return \"A\";\n case NoteEnum.B:\n return \"B\";\n default:\n return \"\";\n }\n }\n\n /**\n * @param the input pitch\n * @param the number of halftones to transpose with\n * @returns ret[0] = the transposed fundamental.\n * ret[1] = the octave shift (not the new octave!)\n * @constructor\n */\n public static CalculateTransposedHalfTone(pitch: Pitch, transpose: number): { value: number; overflow: number; } {\n const newHalfTone: number = pitch.fundamentalNote + pitch.AccidentalHalfTones + transpose;\n return Pitch.WrapAroundCheck(newHalfTone, 12);\n }\n\n public static WrapAroundCheck(value: number, limit: number): { value: number; overflow: number; } {\n let overflow: number = 0;\n\n while (value < 0) {\n value += limit;\n overflow--; // the octave change\n }\n while (value >= limit) {\n value -= limit;\n overflow++; // the octave change\n }\n return {overflow: overflow, value: value};\n }\n\n //public static calcFrequency(pitch: Pitch): number;\n\n //public static calcFrequency(fractionalKey: number): number;\n\n public static calcFrequency(obj: Pitch|number): number {\n let octaveSteps: number = 0;\n let halfToneSteps: number;\n if (obj instanceof Pitch) {\n // obj is a pitch\n const pitch: Pitch = obj;\n octaveSteps = pitch.octave - 1;\n halfToneSteps = pitch.fundamentalNote - NoteEnum.A + pitch.AccidentalHalfTones;\n } else if (typeof obj === \"number\") {\n // obj is a fractional key\n const fractionalKey: number = obj;\n halfToneSteps = fractionalKey - 57.0;\n }\n // Return frequency:\n return 440.0 * Math.pow(2, octaveSteps) * Math.pow(2, halfToneSteps / 12.0);\n }\n\n public static calcFractionalKey(frequency: number): number {\n // Return half-tone frequency:\n return Math.log(frequency / 440.0) / Math.LN10 * Pitch.halftoneFactor + 57.0;\n }\n\n public static fromFrequency(frequency: number): Pitch {\n const key: number = Pitch.calcFractionalKey(frequency) + 0.5;\n const octave: number = Math.floor(key / 12) - Pitch.octXmlDiff;\n const halftone: number = Math.floor(key) % 12;\n let fundamentalNote: NoteEnum = halftone;\n let accidental: AccidentalEnum = AccidentalEnum.NONE;\n if (this.pitchEnumValues.indexOf(fundamentalNote) === -1) {\n fundamentalNote = (halftone - 1);\n accidental = AccidentalEnum.SHARP;\n }\n return new Pitch(fundamentalNote, octave, accidental);\n }\n\n public static fromHalftone(halftone: number): Pitch {\n const octave: number = Math.floor(halftone / 12) - Pitch.octXmlDiff;\n const halftoneInOctave: number = halftone % 12;\n let fundamentalNote: NoteEnum = halftoneInOctave;\n let accidental: AccidentalEnum = AccidentalEnum.NONE;\n if (this.pitchEnumValues.indexOf(fundamentalNote) === -1) {\n fundamentalNote = (halftoneInOctave - 1);\n accidental = AccidentalEnum.SHARP;\n }\n return new Pitch(fundamentalNote, octave, accidental);\n }\n\n public static ceiling(halftone: number): NoteEnum {\n halftone = (halftone) % 12;\n let fundamentalNote: NoteEnum = halftone;\n if (this.pitchEnumValues.indexOf(fundamentalNote) === -1) {\n fundamentalNote = (halftone + 1);\n }\n return fundamentalNote;\n }\n\n public static floor(halftone: number): NoteEnum {\n halftone = halftone % 12;\n let fundamentalNote: NoteEnum = halftone;\n if (this.pitchEnumValues.indexOf(fundamentalNote) === -1) {\n fundamentalNote = (halftone - 1);\n }\n return fundamentalNote;\n }\n\n constructor(fundamentalNote: NoteEnum, octave: number, accidental: AccidentalEnum) {\n this.fundamentalNote = fundamentalNote;\n this.octave = octave;\n this.accidental = accidental;\n this.halfTone = (fundamentalNote) + (octave + Pitch.octXmlDiff) * 12 +\n Pitch.HalfTonesFromAccidental(accidental);\n this.frequency = Pitch.calcFrequency(this);\n }\n\n /** Turns an AccidentalEnum into half tone steps for pitch calculation.\n *\n */\n public static HalfTonesFromAccidental(accidental: AccidentalEnum): number {\n // about equal performance to hashmap/dictionary. could be turned into hashmap for convenience\n // switch is very slightly faster, but both are negligibly short anyways.\n switch (accidental) {\n // ordered from most to least common to improve average runtime\n case AccidentalEnum.NONE:\n return 0;\n case AccidentalEnum.SHARP:\n return 1;\n case AccidentalEnum.FLAT:\n return -1;\n case AccidentalEnum.NATURAL:\n return 0;\n case AccidentalEnum.DOUBLESHARP:\n return 2;\n case AccidentalEnum.DOUBLEFLAT:\n return -2;\n case AccidentalEnum.QUARTERTONESHARP:\n return 0.5;\n case AccidentalEnum.QUARTERTONEFLAT:\n return -0.5;\n case AccidentalEnum.TRIPLESHARP: // very rare, in some classical pieces\n return 3;\n case AccidentalEnum.TRIPLEFLAT:\n return -3;\n default:\n throw new Error(\"Unhandled AccidentalEnum value\");\n // return 0;\n }\n }\n\n public static AccidentalFromHalfTones(halfTones: number): AccidentalEnum {\n switch (halfTones) {\n case 0:\n // for enharmonic change, we won't get a Natural accidental. Maybe there are edge cases though?\n return AccidentalEnum.NONE;\n case 1:\n return AccidentalEnum.SHARP;\n case -1:\n return AccidentalEnum.FLAT;\n case 2:\n return AccidentalEnum.DOUBLESHARP;\n case -2:\n return AccidentalEnum.DOUBLEFLAT;\n case 0.5:\n return AccidentalEnum.QUARTERTONESHARP;\n case -0.5:\n return AccidentalEnum.QUARTERTONEFLAT;\n case 3:\n return AccidentalEnum.TRIPLESHARP;\n case -3:\n return AccidentalEnum.TRIPLEFLAT;\n default:\n if (halfTones > 0 && halfTones < 1) {\n return AccidentalEnum.QUARTERTONESHARP;\n } else if (halfTones < 0 && halfTones > -1) {\n return AccidentalEnum.QUARTERTONEFLAT;\n }\n // potentially unhandled or broken accidental halfTone value\n return AccidentalEnum.QUARTERTONESHARP; // to signal unhandled value\n }\n }\n\n /**\n * Converts AccidentalEnum to a string which represents an accidental in VexFlow\n * Can also be useful in other cases, but has to match Vexflow accidental codes.\n * @param accidental\n * @returns {string} Vexflow Accidental code\n */\n public static accidentalVexflow(accidental: AccidentalEnum): string {\n let acc: string;\n switch (accidental) {\n case AccidentalEnum.NATURAL:\n acc = \"n\";\n break;\n case AccidentalEnum.FLAT:\n acc = \"b\";\n break;\n case AccidentalEnum.SHARP:\n acc = \"#\";\n break;\n case AccidentalEnum.DOUBLESHARP:\n acc = \"##\";\n break;\n case AccidentalEnum.TRIPLESHARP:\n acc = \"++\";\n break;\n case AccidentalEnum.DOUBLEFLAT:\n acc = \"bb\";\n break;\n case AccidentalEnum.TRIPLEFLAT:\n acc = \"bbs\"; // there is no \"bbb\" in VexFlow yet, unfortunately.\n break;\n case AccidentalEnum.QUARTERTONESHARP:\n acc = \"+\";\n break;\n case AccidentalEnum.QUARTERTONEFLAT:\n acc = \"d\";\n break;\n default:\n }\n return acc;\n }\n\n public get AccidentalHalfTones(): number {\n return Pitch.HalfTonesFromAccidental(this.accidental);\n }\n\n public get Octave(): number {\n return this.octave;\n }\n\n public get FundamentalNote(): NoteEnum {\n return this.fundamentalNote;\n }\n\n public get Accidental(): AccidentalEnum {\n return this.accidental;\n }\n\n public get Frequency(): number {\n return this.frequency;\n }\n\n public static get OctaveXmlDifference(): number {\n return Pitch.octXmlDiff;\n }\n\n public getHalfTone(): number {\n return this.halfTone;\n }\n\n // This method returns a new Pitch transposed by the given factor\n public getTransposedPitch(factor: number): Pitch {\n if (factor > 12) {\n throw new Error(\"rewrite this method to handle bigger octave changes or don't use is with bigger octave changes!\");\n }\n if (factor > 0) {\n return this.getHigherPitchByTransposeFactor(factor);\n }\n if (factor < 0) {\n return this.getLowerPitchByTransposeFactor(-factor);\n }\n return this;\n }\n\n public DoEnharmonicChange(): void {\n switch (this.accidental) {\n case AccidentalEnum.FLAT:\n case AccidentalEnum.DOUBLEFLAT:\n this.fundamentalNote = this.getPreviousFundamentalNote(this.fundamentalNote);\n this.accidental = Pitch.AccidentalFromHalfTones(this.halfTone - ((this.fundamentalNote) +\n (this.octave + Pitch.octXmlDiff) * 12));\n break;\n case AccidentalEnum.SHARP:\n case AccidentalEnum.DOUBLESHARP:\n this.fundamentalNote = this.getNextFundamentalNote(this.fundamentalNote);\n this.accidental = Pitch.AccidentalFromHalfTones(this.halfTone - ((this.fundamentalNote) +\n (this.octave + Pitch.octXmlDiff) * 12));\n break;\n default:\n return;\n }\n }\n\n public ToString(): string {\n let accidentalString: string = Pitch.accidentalVexflow(this.accidental);\n if (!accidentalString) {\n accidentalString = \"\";\n }\n return \"Key: \" + Pitch.getNoteEnumString(this.fundamentalNote) + accidentalString +\n \", Note: \" + this.fundamentalNote + \", octave: \" + this.octave.toString();\n }\n\n public OperatorEquals(p2: Pitch): boolean {\n const p1: Pitch = this;\n // if (ReferenceEquals(p1, p2)) {\n // return true;\n // }\n if (!p1 || !p2) {\n return false;\n }\n return (p1.FundamentalNote === p2.FundamentalNote && p1.Octave === p2.Octave && p1.Accidental === p2.Accidental);\n }\n\n public OperatorNotEqual(p2: Pitch): boolean {\n const p1: Pitch = this;\n return !(p1 === p2);\n }\n\n // This method returns a new Pitch factor-Halftones higher than the current Pitch\n private getHigherPitchByTransposeFactor(factor: number): Pitch {\n const noteEnumIndex: number = Pitch.pitchEnumValues.indexOf(this.fundamentalNote);\n let newOctave: number = this.octave;\n let newNoteEnum: NoteEnum;\n if (noteEnumIndex + factor > Pitch.pitchEnumValues.length - 1) {\n newNoteEnum = Pitch.pitchEnumValues[noteEnumIndex + factor - Pitch.pitchEnumValues.length];\n newOctave++;\n } else {\n newNoteEnum = Pitch.pitchEnumValues[noteEnumIndex + factor];\n }\n return new Pitch(newNoteEnum, newOctave, AccidentalEnum.NONE);\n }\n\n private getLowerPitchByTransposeFactor(factor: number): Pitch {\n const noteEnumIndex: number = Pitch.pitchEnumValues.indexOf(this.fundamentalNote);\n let newOctave: number = this.octave;\n let newNoteEnum: NoteEnum;\n if (noteEnumIndex - factor < 0) {\n newNoteEnum = Pitch.pitchEnumValues[Pitch.pitchEnumValues.length + noteEnumIndex - factor];\n newOctave--;\n } else {\n newNoteEnum = Pitch.pitchEnumValues[noteEnumIndex - factor];\n }\n return new Pitch(newNoteEnum, newOctave, AccidentalEnum.NONE);\n }\n\n private getNextFundamentalNote(fundamental: NoteEnum): NoteEnum {\n let i: number = Pitch.pitchEnumValues.indexOf(fundamental);\n i = (i + 1) % Pitch.pitchEnumValues.length;\n return Pitch.pitchEnumValues[i];\n }\n\n private getPreviousFundamentalNote(fundamental: NoteEnum): NoteEnum {\n const i: number = Pitch.pitchEnumValues.indexOf(fundamental);\n if (i > 0) {\n return Pitch.pitchEnumValues[i - 1];\n } else {\n return Pitch.pitchEnumValues[Pitch.pitchEnumValues.length - 1];\n }\n }\n}\n","import log from \"loglevel\";\nimport {ArgumentOutOfRangeException} from \"../Exceptions\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {SizeF2D} from \"../../Common/DataObjects/SizeF2D\";\nimport {RectangleF2D} from \"../../Common/DataObjects/RectangleF2D\";\nimport { StaffLineActivitySymbol } from \"./StaffLineActivitySymbol\";\nimport { EngravingRules } from \"./EngravingRules\";\n\n/**\n * A bounding box delimits an area on the 2D plane.\n * @param dataObject Graphical object where the bounding box will be attached\n * @param parent Parent bounding box of an object in a higher hierarchy position\n * @param connectChildToParent Create a child to parent relationship too. Will be true by default\n */\nexport class BoundingBox {\n protected isSymbol: boolean = false;\n protected relativePositionHasBeenSet: boolean = false;\n protected xBordersHaveBeenSet: boolean = false;\n protected yBordersHaveBeenSet: boolean = false;\n protected absolutePosition: PointF2D = new PointF2D();\n protected relativePosition: PointF2D = new PointF2D();\n protected size: SizeF2D = new SizeF2D();\n protected marginSize: SizeF2D = new SizeF2D();\n protected upperLeftCorner: PointF2D = new PointF2D();\n protected upperLeftMarginCorner: PointF2D = new PointF2D();\n protected borderLeft: number = 0;\n protected borderRight: number = 0;\n protected borderTop: number = 0;\n protected borderBottom: number = 0;\n protected borderMarginLeft: number = 0;\n protected borderMarginRight: number = 0;\n protected borderMarginTop: number = 0;\n protected borderMarginBottom: number = 0;\n protected boundingRectangle: RectangleF2D;\n protected boundingMarginRectangle: RectangleF2D;\n protected childElements: BoundingBox[] = [];\n protected parent: BoundingBox;\n protected dataObject: Object;\n /**\n * Create a bounding box\n * @param dataObject Graphical object where the bounding box will be attached\n * @param parent Parent bounding box of an object in a higher hierarchy position\n * @param isSymbol Defines the bounding box to be symbol thus not calculating its boundaries by itself. NOTE: Borders need to be set!\n */\n constructor(dataObject: Object = undefined, parent: BoundingBox = undefined, isSymbol: boolean = false) {\n this.parent = parent;\n this.dataObject = dataObject;\n this.isSymbol = isSymbol;\n this.xBordersHaveBeenSet = false;\n this.yBordersHaveBeenSet = false;\n if (parent) {\n this.Parent = parent;\n }\n }\n\n public get RelativePositionHasBeenSet(): boolean {\n return this.relativePositionHasBeenSet;\n }\n\n public get XBordersHaveBeenSet(): boolean {\n return this.xBordersHaveBeenSet;\n }\n\n public set XBordersHaveBeenSet(value: boolean) {\n this.xBordersHaveBeenSet = value;\n }\n\n public get YBordersHaveBeenSet(): boolean {\n return this.yBordersHaveBeenSet;\n }\n\n public set YBordersHaveBeenSet(value: boolean) {\n this.yBordersHaveBeenSet = value;\n }\n\n public get AbsolutePosition(): PointF2D {\n return this.absolutePosition;\n }\n\n public set AbsolutePosition(value: PointF2D) {\n this.absolutePosition = value;\n }\n\n public get RelativePosition(): PointF2D {\n return this.relativePosition;\n }\n\n public set RelativePosition(value: PointF2D) {\n this.relativePosition = value;\n this.relativePositionHasBeenSet = true;\n }\n\n public get Size(): SizeF2D {\n return this.size;\n }\n\n public set Size(value: SizeF2D) {\n this.size = value;\n }\n\n public get MarginSize(): SizeF2D {\n return this.marginSize;\n }\n\n public get UpperLeftCorner(): PointF2D {\n return this.upperLeftCorner;\n }\n\n public get UpperLeftMarginCorner(): PointF2D {\n return this.upperLeftMarginCorner;\n }\n\n public get BorderLeft(): number {\n return this.borderLeft;\n }\n\n public set BorderLeft(value: number) {\n this.borderLeft = value;\n this.calculateRectangle();\n }\n\n public get BorderRight(): number {\n return this.borderRight;\n }\n\n public set BorderRight(value: number) {\n this.borderRight = value;\n this.calculateRectangle();\n }\n\n public get BorderTop(): number {\n return this.borderTop;\n }\n\n public set BorderTop(value: number) {\n this.borderTop = value;\n this.calculateRectangle();\n }\n\n public get BorderBottom(): number {\n return this.borderBottom;\n }\n\n public set BorderBottom(value: number) {\n this.borderBottom = value;\n this.calculateRectangle();\n }\n\n public get BorderMarginLeft(): number {\n return this.borderMarginLeft > this.borderLeft ? this.borderLeft : this.borderMarginLeft;\n }\n\n public set BorderMarginLeft(value: number) {\n this.borderMarginLeft = value;\n this.calculateMarginRectangle();\n }\n\n public get BorderMarginRight(): number {\n return this.borderMarginRight < this.borderRight ? this.borderRight : this.borderMarginRight;\n }\n\n public set BorderMarginRight(value: number) {\n this.borderMarginRight = value;\n this.calculateMarginRectangle();\n }\n\n public get BorderMarginTop(): number {\n return this.borderMarginTop > this.borderTop ? this.borderTop : this.borderMarginTop;\n }\n\n public set BorderMarginTop(value: number) {\n this.borderMarginTop = value;\n this.calculateMarginRectangle();\n }\n\n public get BorderMarginBottom(): number {\n return this.borderMarginBottom < this.borderBottom ? this.borderBottom : this.borderMarginBottom;\n }\n\n public set BorderMarginBottom(value: number) {\n this.borderMarginBottom = value;\n this.calculateMarginRectangle();\n }\n\n public get BoundingRectangle(): RectangleF2D {\n return this.boundingRectangle;\n }\n\n public get BoundingMarginRectangle(): RectangleF2D {\n return this.boundingMarginRectangle;\n }\n\n public get ChildElements(): BoundingBox[] {\n return this.childElements;\n }\n\n public set ChildElements(value: BoundingBox[]) {\n this.childElements = value;\n }\n\n public get Parent(): BoundingBox {\n return this.parent;\n }\n\n public set Parent(value: BoundingBox) {\n if (this.parent) {\n // remove from old parent\n const index: number = this.parent.ChildElements.indexOf(this, 0);\n if (index > -1) {\n this.parent.ChildElements.splice(index, 1);\n }\n }\n this.parent = value;\n // add to new parent\n if (this.parent.ChildElements.indexOf(this) > -1) {\n log.error(\"BoundingBox of \" + (this.dataObject.constructor as any).name +\n \" already in children list of \" + (this.parent.dataObject.constructor as any).name + \"'s BoundingBox\");\n } else {\n this.parent.ChildElements.push(this);\n }\n }\n\n public get DataObject(): Object {\n return this.dataObject;\n }\n\n\n /**\n * Get the center of a bounding box\n * @param boundingBox Bounding box to check\n */\n public get Center(): PointF2D {\n return new PointF2D(this.RelativePosition.x + (this.BorderMarginRight + this.BorderMarginLeft),\n this.RelativePosition.y + (this.BorderMarginBottom + this.BorderMarginTop));\n }\n\n public setAbsolutePositionFromParent(): void {\n if (this.parent) {\n this.absolutePosition.x = this.parent.AbsolutePosition.x + this.relativePosition.x;\n this.absolutePosition.y = this.parent.AbsolutePosition.y + this.relativePosition.y;\n } else {\n this.absolutePosition = this.relativePosition;\n }\n }\n\n /**\n * Calculate the the absolute position by adding up all relative positions of all parents (including the own rel. pos.)\n */\n public calculateAbsolutePosition(): void {\n this.absolutePosition.x = this.relativePosition.x;\n this.absolutePosition.y = this.relativePosition.y;\n let parent: BoundingBox = this.parent;\n while (parent) {\n this.absolutePosition.x += parent.relativePosition.x;\n this.absolutePosition.y += parent.relativePosition.y;\n parent = parent.parent;\n }\n }\n\n /**\n * This method calculates the Absolute Positions recursively\n */\n public calculateAbsolutePositionsRecursiveWithoutTopelement(): void {\n this.absolutePosition.x = 0.0;\n this.absolutePosition.y = 0.0;\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const child: BoundingBox = this.ChildElements[idx];\n child.calculateAbsolutePositionsRecursive(this.absolutePosition.x, this.absolutePosition.y);\n }\n }\n\n /**\n * This method calculates the Absolute Positions recursively\n * from the root element down to the leaf elements\n * @param x\n * @param y\n */\n public calculateAbsolutePositionsRecursive(x: number, y: number): void {\n this.absolutePosition.x = this.relativePosition.x + x;\n this.absolutePosition.y = this.relativePosition.y + y;\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const child: BoundingBox = this.ChildElements[idx];\n child.calculateAbsolutePositionsRecursive(this.absolutePosition.x, this.absolutePosition.y);\n }\n }\n\n /**\n * calculates the absolute positions of all children of this boundingBox\n */\n public calculateAbsolutePositionsOfChildren(): void {\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const child: BoundingBox = this.ChildElements[idx];\n child.calculateAbsolutePositionsRecursive(this.absolutePosition.x, this.absolutePosition.y);\n }\n }\n\n /**\n * This method calculates the BoundingBoxes\n */\n public calculateBoundingBox(): void {\n if (this.childElements.length === 0) {\n return;\n }\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const childElement: BoundingBox = this.ChildElements[idx];\n childElement.calculateBoundingBox();\n }\n\n // initialize with max/min values\n let minLeft: number = Number.MAX_VALUE;\n let maxRight: number = Number.MIN_VALUE;\n let minTop: number = Number.MAX_VALUE;\n let maxBottom: number = Number.MIN_VALUE;\n let minMarginLeft: number = Number.MAX_VALUE;\n let maxMarginRight: number = Number.MIN_VALUE;\n let minMarginTop: number = Number.MAX_VALUE;\n let maxMarginBottom: number = Number.MIN_VALUE;\n\n // apart from symbol elements, where we initialize with the symbol's borders\n if (this.isSymbol) {\n minLeft = this.borderLeft;\n maxRight = this.borderRight;\n minTop = this.borderTop;\n maxBottom = this.borderBottom;\n minMarginLeft = this.borderMarginLeft;\n maxMarginRight = this.borderMarginRight;\n minMarginTop = this.borderMarginTop;\n maxMarginBottom = this.borderMarginBottom;\n }\n\n // ChildElements will have their borders calculated, so calculate current borders\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const childElement: BoundingBox = this.ChildElements[idx];\n minLeft = Math.min(minLeft, childElement.relativePosition.x + childElement.borderLeft);\n maxRight = Math.max(maxRight, childElement.relativePosition.x + childElement.borderRight);\n minTop = Math.min(minTop, childElement.relativePosition.y + childElement.borderTop);\n maxBottom = Math.max(maxBottom, childElement.relativePosition.y + childElement.borderBottom);\n minMarginLeft = Math.min(minMarginLeft, childElement.relativePosition.x + childElement.borderMarginLeft);\n maxMarginRight = Math.max(maxMarginRight, childElement.relativePosition.x + childElement.borderMarginRight);\n minMarginTop = Math.min(minMarginTop, childElement.relativePosition.y + childElement.borderMarginTop);\n maxMarginBottom = Math.max(maxMarginBottom, childElement.relativePosition.y + childElement.borderMarginBottom);\n }\n\n // ChildElements will have their borders calculated, so calculate current borders\n this.borderLeft = minLeft;\n this.borderRight = maxRight;\n this.borderTop = minTop;\n this.borderBottom = maxBottom;\n this.borderMarginLeft = minMarginLeft;\n this.borderMarginRight = maxMarginRight;\n this.borderMarginTop = minMarginTop;\n this.borderMarginBottom = maxMarginBottom;\n this.calculateRectangle();\n this.calculateMarginRectangle();\n this.xBordersHaveBeenSet = true;\n this.yBordersHaveBeenSet = true;\n }\n\n public calculateTopBottomBorders(): void {\n if (this.childElements.length === 0) {\n return;\n }\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const childElement: BoundingBox = this.ChildElements[idx];\n childElement.calculateTopBottomBorders();\n }\n let minTop: number = Number.MAX_VALUE;\n let maxBottom: number = Number.MIN_VALUE;\n let minMarginTop: number = Number.MAX_VALUE;\n let maxMarginBottom: number = Number.MIN_VALUE;\n if (this.yBordersHaveBeenSet) {\n minTop = this.borderTop;\n maxBottom = this.borderBottom;\n minMarginTop = this.borderMarginTop;\n maxMarginBottom = this.borderMarginBottom;\n }\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const childElement: BoundingBox = this.ChildElements[idx];\n minTop = Math.min(minTop, childElement.relativePosition.y + childElement.borderTop);\n if (!EngravingRules.FixStafflineBoundingBox || !(childElement.dataObject instanceof StaffLineActivitySymbol)) {\n maxBottom = Math.max(maxBottom, childElement.relativePosition.y + childElement.borderBottom);\n // TODO there's a problem with the bottom bounding box of many stafflines, often caused by StaffLineActivitySymbol,\n // often leading to the page SVG canvas being unnecessarily long in y-direction. This seems to be remedied by this workaround.\n // see #643\n }\n minMarginTop = Math.min(minMarginTop, childElement.relativePosition.y + childElement.borderMarginTop);\n maxMarginBottom = Math.max(maxMarginBottom, childElement.relativePosition.y + childElement.borderMarginBottom);\n }\n this.borderTop = minTop;\n this.borderBottom = maxBottom;\n this.borderMarginTop = minMarginTop;\n this.borderMarginBottom = maxMarginBottom;\n this.calculateRectangle();\n this.calculateMarginRectangle();\n }\n\n /**\n * This method computes the first non-overlapping position in the placementPsi Element for the current (this) positionAndShapeInfo\n * @param placementPsi\n * @param direction\n * @param position\n */\n public computeNonOverlappingPositionWithMargin(placementPsi: BoundingBox, direction: ColDirEnum, position: PointF2D): void {\n this.RelativePosition = new PointF2D(position.x, position.y);\n this.setAbsolutePositionFromParent();\n let currentPosition: number = 0.0;\n let hasBeenMoved: boolean = false;\n do {\n switch (direction) {\n case ColDirEnum.Left:\n case ColDirEnum.Right:\n currentPosition = this.relativePosition.x;\n placementPsi.calculateMarginPositionAlongDirection(this, direction);\n hasBeenMoved = Math.abs(currentPosition - this.relativePosition.x) > 0.001;\n break;\n case ColDirEnum.Up:\n case ColDirEnum.Down:\n currentPosition = this.relativePosition.y;\n placementPsi.calculateMarginPositionAlongDirection(this, direction);\n hasBeenMoved = Math.abs(currentPosition - this.relativePosition.y) > 0.001;\n break;\n default:\n throw new ArgumentOutOfRangeException(\"direction\");\n }\n }\n while (hasBeenMoved);\n }\n\n /**\n * This method detects a collision (without margins)\n * @param psi\n * @returns {boolean}\n */\n public collisionDetection(psi: BoundingBox): boolean {\n const overlapWidth: number = Math.min(this.AbsolutePosition.x + this.borderRight, psi.absolutePosition.x + psi.borderRight)\n - Math.max(this.AbsolutePosition.x + this.borderLeft, psi.absolutePosition.x + psi.borderLeft);\n const overlapHeight: number = Math.min(this.AbsolutePosition.y + this.borderBottom, psi.absolutePosition.y + psi.borderBottom)\n - Math.max(this.AbsolutePosition.y + this.borderTop, psi.absolutePosition.y + psi.borderTop);\n if (overlapWidth > 0 && overlapHeight > 0) {\n return true;\n }\n return false;\n }\n\n /**\n * This method checks if the given Psi's Margins lie inside the current Psi's Margins.\n * @param psi\n * @returns {boolean}\n */\n public liesInsideBorders(psi: BoundingBox): boolean {\n const leftBorderInside: boolean = (this.AbsolutePosition.x + this.borderLeft) <= (psi.absolutePosition.x + psi.borderLeft)\n && (psi.absolutePosition.x + psi.borderLeft) <= (this.AbsolutePosition.x + this.borderRight);\n const rightBorderInside: boolean = (this.AbsolutePosition.x + this.borderLeft) <= (psi.absolutePosition.x + psi.borderRight)\n && (psi.absolutePosition.x + psi.borderRight) <= (this.AbsolutePosition.x + this.borderRight);\n if (leftBorderInside && rightBorderInside) {\n const topBorderInside: boolean = (this.AbsolutePosition.y + this.borderTop) <= (psi.absolutePosition.y + psi.borderTop)\n && (psi.absolutePosition.y + psi.borderTop) <= (this.AbsolutePosition.y + this.borderBottom);\n const bottomBorderInside: boolean = (this.AbsolutePosition.y + this.borderTop) <= (psi.absolutePosition.y + psi.borderBottom)\n && (psi.absolutePosition.y + psi.borderBottom) <= (this.AbsolutePosition.y + this.borderBottom);\n if (topBorderInside && bottomBorderInside) {\n return true;\n }\n }\n return false;\n }\n\n public pointLiesInsideBorders(position: PointF2D): boolean {\n const xInside: boolean = (this.AbsolutePosition.x + this.borderLeft) <= position.x && position.x <= (this.AbsolutePosition.x + this.borderRight);\n if (xInside) {\n const yInside: boolean = (this.AbsolutePosition.y + this.borderTop) <= position.y && position.y <= (this.AbsolutePosition.y + this.borderBottom);\n if (yInside) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * This method detects a collision (margin-wide)\n * @param psi\n * @returns {boolean}\n */\n public marginCollisionDetection(psi: BoundingBox): boolean {\n const overlapWidth: number = Math.min(this.AbsolutePosition.x + this.borderMarginRight, psi.absolutePosition.x + psi.borderMarginRight)\n - Math.max(this.AbsolutePosition.x + this.borderMarginLeft, psi.absolutePosition.x + psi.borderMarginLeft);\n const overlapHeight: number = Math.min(this.AbsolutePosition.y + this.borderMarginBottom, psi.absolutePosition.y + psi.borderMarginBottom)\n - Math.max(this.AbsolutePosition.y + this.borderMarginTop, psi.absolutePosition.y + psi.borderMarginTop);\n if (overlapWidth > 0 && overlapHeight > 0) {\n return true;\n }\n return false;\n }\n\n /**\n * This method checks if the given Psi's Margins lie inside the current Psi's Margins\n * @param psi\n * @returns {boolean}\n */\n public liesInsideMargins(psi: BoundingBox): boolean {\n const leftMarginInside: boolean = (this.AbsolutePosition.x + this.borderMarginLeft) <= (psi.absolutePosition.x + psi.borderMarginLeft)\n && (psi.absolutePosition.x + psi.borderMarginLeft) <= (this.AbsolutePosition.x + this.borderMarginRight);\n const rightMarginInside: boolean = (this.AbsolutePosition.x + this.borderMarginLeft) <= (psi.absolutePosition.x + psi.borderMarginRight)\n && (psi.absolutePosition.x + psi.borderMarginRight) <= (this.AbsolutePosition.x + this.borderMarginRight);\n if (leftMarginInside && rightMarginInside) {\n const topMarginInside: boolean = (this.AbsolutePosition.y + this.borderMarginTop) <= (psi.absolutePosition.y + psi.borderMarginTop)\n && (psi.absolutePosition.y + psi.borderMarginTop) <= (this.AbsolutePosition.y + this.borderMarginBottom);\n const bottomMarginInside: boolean = (this.AbsolutePosition.y + this.borderMarginTop) <= (psi.absolutePosition.y + psi.borderMarginBottom)\n && (psi.absolutePosition.y + psi.borderMarginBottom) <= (this.AbsolutePosition.y + this.borderMarginBottom);\n if (topMarginInside && bottomMarginInside) {\n return true;\n }\n }\n return false;\n }\n\n public pointLiesInsideMargins(position: PointF2D): boolean {\n const xInside: boolean = (this.AbsolutePosition.x + this.borderMarginLeft) <= position.x\n && position.x <= (this.AbsolutePosition.x + this.borderMarginRight);\n if (xInside) {\n const yInside: boolean = (this.AbsolutePosition.y + this.borderMarginTop) <= position.y\n && position.y <= (this.AbsolutePosition.y + this.borderMarginBottom);\n if (yInside) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * This method computes the first non-overlapping position in the placementPsi Element for the current (this) positionAndShapeInfo\n * @param placementPsi\n * @param direction\n * @param position\n */\n public computeNonOverlappingPosition(placementPsi: BoundingBox, direction: ColDirEnum, position: PointF2D): void {\n this.RelativePosition = new PointF2D(position.x, position.y);\n this.setAbsolutePositionFromParent();\n let currentPosition: number = 0.0;\n let hasBeenMoved: boolean = false;\n do {\n switch (direction) {\n case ColDirEnum.Left:\n case ColDirEnum.Right:\n currentPosition = this.relativePosition.x;\n placementPsi.calculatePositionAlongDirection(this, direction);\n hasBeenMoved = Math.abs(currentPosition - this.relativePosition.x) > 0.0001;\n break;\n case ColDirEnum.Up:\n case ColDirEnum.Down:\n currentPosition = this.relativePosition.y;\n placementPsi.calculatePositionAlongDirection(this, direction);\n hasBeenMoved = Math.abs(currentPosition - this.relativePosition.y) > 0.0001;\n break;\n default:\n throw new ArgumentOutOfRangeException(\"direction\");\n }\n } while (hasBeenMoved); // as long as the element is moved\n }\n\n public getClickedObjectOfType(clickPosition: PointF2D): T {\n const obj: Object = this.dataObject;\n if (this.pointLiesInsideBorders(clickPosition) && (obj)) {\n return (obj as T);\n }\n for (let idx: number = 0, len: number = this.childElements.length; idx < len; ++idx) {\n const psi: BoundingBox = this.childElements[idx];\n const innerObject: Object = psi.getClickedObjectOfType(clickPosition);\n if (innerObject) {\n return (innerObject as T);\n }\n }\n return undefined;\n }\n\n public getObjectsInRegion(region: BoundingBox, liesInside: boolean = true): T[] {\n if (this.dataObject) {\n if (liesInside) {\n if (region.liesInsideBorders(this)) {\n return [this.dataObject as T];\n }\n } else {\n if (region.collisionDetection(this)) {\n return [this.dataObject as T];\n }\n }\n // FIXME Andrea: add here \"return []\"?\n }\n const result: T[] = [];\n for (const child of this.childElements) {\n result.concat(child.getObjectsInRegion(region, liesInside));\n }\n return result;\n //return this.childElements.SelectMany(psi => psi.getObjectsInRegion(region, liesInside));\n }\n\n protected calculateRectangle(): void {\n this.upperLeftCorner = new PointF2D(this.BorderLeft, this.BorderTop);\n this.size = new SizeF2D(this.BorderRight - this.BorderLeft, this.BorderBottom - this.BorderTop);\n this.boundingRectangle = RectangleF2D.createFromLocationAndSize(this.upperLeftCorner, this.size);\n }\n\n protected calculateMarginRectangle(): void {\n this.upperLeftMarginCorner = new PointF2D(this.BorderMarginLeft, this.BorderMarginTop);\n this.marginSize = new SizeF2D(this.BorderMarginRight - this.BorderMarginLeft, this.BorderMarginBottom - this.BorderMarginTop);\n this.boundingMarginRectangle = RectangleF2D.createFromLocationAndSize(this.upperLeftMarginCorner, this.marginSize);\n }\n\n /**\n * This method calculates the margin border along the given direction so that no collision takes place along this direction\n * @param toBePlaced\n * @param direction\n */\n private calculateMarginPositionAlongDirection(toBePlaced: BoundingBox, direction: ColDirEnum): void {\n // now this will be the \"known\" Element, about to get bigger with the toBePlaced\n // eg toBePlaced will always be in the PositionAndShape hierarchy a Child of this\n // example: this = StaffEntry, toBePlaced = Accidental\n\n // logical return\n if (this === toBePlaced) {\n return;\n }\n\n // check for collision only at symbols and return border\n if (this.isSymbol && this.marginCollisionDetection(toBePlaced)) {\n let shiftDistance: number = 0;\n switch (direction) {\n case ColDirEnum.Left:\n shiftDistance = (this.absolutePosition.x + this.borderMarginLeft) - (toBePlaced.absolutePosition.x + toBePlaced.borderMarginRight);\n toBePlaced.relativePosition.x += shiftDistance;\n toBePlaced.absolutePosition.x += shiftDistance;\n return;\n case ColDirEnum.Right:\n shiftDistance = (this.absolutePosition.x + this.borderMarginRight) - (toBePlaced.absolutePosition.x + toBePlaced.borderMarginLeft);\n toBePlaced.relativePosition.x += shiftDistance;\n toBePlaced.absolutePosition.x += shiftDistance;\n return;\n case ColDirEnum.Up:\n shiftDistance = (this.absolutePosition.y + this.borderMarginTop) - (toBePlaced.absolutePosition.y + toBePlaced.borderMarginBottom);\n toBePlaced.relativePosition.y += shiftDistance;\n toBePlaced.absolutePosition.y += shiftDistance;\n return;\n case ColDirEnum.Down:\n shiftDistance = (this.absolutePosition.y + this.borderMarginBottom) - (toBePlaced.absolutePosition.y + toBePlaced.borderMarginTop);\n toBePlaced.relativePosition.y += shiftDistance;\n toBePlaced.absolutePosition.y += shiftDistance;\n return;\n default:\n throw new ArgumentOutOfRangeException(\"direction\");\n }\n }\n\n // perform check for all children iteratively and return border from children symbols\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const childElement: BoundingBox = this.ChildElements[idx];\n childElement.calculateMarginPositionAlongDirection(toBePlaced, direction);\n }\n }\n\n /**\n * This method calculates the border along the given direction so that no collision takes place along this direction\n * @param toBePlaced\n * @param direction\n */\n private calculatePositionAlongDirection(toBePlaced: BoundingBox, direction: ColDirEnum): void {\n // now this will be the \"known\" Element, about to get bigger with the toBePlaced\n // eg toBePlaced will always be in the PositionAndShape hierarchy a Child of this\n // example: this = StaffEntry, toBePlaced = Accidental\n\n // logical return\n if (this === toBePlaced) {\n return;\n }\n\n // check for collision only at symbols and return border\n if (this.isSymbol && this.collisionDetection(toBePlaced)) {\n let shiftDistance: number;\n switch (direction) {\n case ColDirEnum.Left:\n shiftDistance = (this.absolutePosition.x + this.borderLeft) - (toBePlaced.absolutePosition.x + toBePlaced.borderRight);\n toBePlaced.relativePosition.x += shiftDistance;\n toBePlaced.absolutePosition.x += shiftDistance;\n return;\n case ColDirEnum.Right:\n shiftDistance = (this.absolutePosition.x + this.borderRight) - (toBePlaced.absolutePosition.x + toBePlaced.borderLeft);\n toBePlaced.relativePosition.x += shiftDistance;\n toBePlaced.absolutePosition.x += shiftDistance;\n return;\n case ColDirEnum.Up:\n shiftDistance = (this.absolutePosition.y + this.borderTop) - (toBePlaced.absolutePosition.y + toBePlaced.borderBottom);\n toBePlaced.relativePosition.y += shiftDistance;\n toBePlaced.absolutePosition.y += shiftDistance;\n return;\n case ColDirEnum.Down:\n shiftDistance = (this.absolutePosition.y + this.borderBottom) - (toBePlaced.absolutePosition.y + toBePlaced.borderTop);\n toBePlaced.relativePosition.y += shiftDistance;\n toBePlaced.absolutePosition.y += shiftDistance;\n return;\n default:\n throw new ArgumentOutOfRangeException(\"direction\");\n }\n }\n\n // perform check for all children iteratively and return border from children symbols\n for (let idx: number = 0, len: number = this.ChildElements.length; idx < len; ++idx) {\n const childElement: BoundingBox = this.ChildElements[idx];\n childElement.calculatePositionAlongDirection(toBePlaced, direction);\n }\n }\n}\n\nexport enum ColDirEnum {\n Left = 0,\n Right = 1,\n Up = 2,\n Down = 3\n}\n","// Represent a point on a plane, with (x,y) coordinates\nexport class PointF2D {\n public x: number = 0;\n public y: number = 0;\n\n constructor(x: number = 0, y: number = 0) {\n this.x = x;\n this.y = y;\n }\n\n public static get Empty(): PointF2D {\n return new PointF2D();\n }\n public static pointsAreEqual(p1: PointF2D, p2: PointF2D): boolean {\n return (p1.x === p2.x && p1.y === p2.y);\n }\n public ToString(): string {\n return \"[\" + this.x + \", \" + this.y + \"]\";\n }\n}\n","import {BoundingBox} from \"./BoundingBox\";\n\nexport class GraphicalObject {\n\n protected boundingBox: BoundingBox;\n\n public get PositionAndShape(): BoundingBox {\n return this.boundingBox;\n }\n\n public set PositionAndShape(value: BoundingBox) {\n this.boundingBox = value;\n }\n\n}\n","import { SourceMeasure } from \"../SourceMeasure\";\n\nexport class AbstractExpression {\n protected placement: PlacementEnum;\n public parentMeasure: SourceMeasure; // could be undefined\n\n constructor(placement: PlacementEnum) {\n this.placement = placement;\n }\n\n protected static isStringInStringList(stringList: Array, inputString: string): boolean {\n for (let idx: number = 0, len: number = stringList.length; idx < len; ++idx) {\n const s: string = stringList[idx];\n if (inputString.toLowerCase() === s.toLowerCase().trim()) {\n return true;\n }\n }\n return false;\n }\n\n /** Placement of the expression */\n public get Placement(): PlacementEnum { return this.placement; }\n\n public static PlacementEnumFromString(placementString: string): PlacementEnum {\n switch (placementString.toLowerCase()) {\n case \"above\":\n return PlacementEnum.Above;\n case \"below\":\n return PlacementEnum.Below;\n case \"left\":\n return PlacementEnum.Left;\n case \"right\":\n return PlacementEnum.Right;\n case \"auto\":\n default:\n return PlacementEnum.NotYetDefined;\n }\n }\n}\n\nexport enum PlacementEnum {\n Above = 0,\n Below = 1,\n Left = 2,\n Right = 3,\n NotYetDefined = 4\n}\n","/**\n * The Alignment of a TextLabel.\n * Specifically the label's position coordinates within the Bounding Box.\n * For LeftBottom, the label's position is at the left bottom corner of its Bounding Box.\n * (used for example with title, composer, author, etc.)\n * (see Show Bounding Box For -> Labels in the local demo)\n */\nexport enum TextAlignmentEnum {\n LeftTop,\n LeftCenter,\n LeftBottom,\n CenterTop,\n CenterCenter,\n CenterBottom,\n RightTop,\n RightCenter,\n RightBottom\n}\n/*\n * TODO this could be split into two alignments, e.g. for LeftTop.\n * A function like IsLeft would be easier with the split.\n * On the other hand, accessing these values will be more complex\n*/\n\nexport class TextAlignment {\n public static IsLeft(textAlignment: TextAlignmentEnum): boolean {\n return textAlignment === TextAlignmentEnum.LeftTop\n || textAlignment === TextAlignmentEnum.LeftCenter\n || textAlignment === TextAlignmentEnum.LeftBottom;\n }\n\n public static IsCenterAligned(textAlignment: TextAlignmentEnum): boolean {\n return textAlignment === TextAlignmentEnum.CenterTop\n || textAlignment === TextAlignmentEnum.CenterCenter\n || textAlignment === TextAlignmentEnum.CenterBottom;\n }\n\n public static IsRight(textAlignment: TextAlignmentEnum): boolean {\n return textAlignment === TextAlignmentEnum.RightTop\n || textAlignment === TextAlignmentEnum.RightCenter\n || textAlignment === TextAlignmentEnum.RightBottom;\n }\n}\n","import {Pitch} from \"../../../Common/DataObjects/Pitch\";\nimport {AbstractNotationInstruction} from \"./AbstractNotationInstruction\";\nimport {NoteEnum} from \"../../../Common/DataObjects/Pitch\";\nimport {AccidentalEnum} from \"../../../Common/DataObjects/Pitch\";\nimport {ArgumentOutOfRangeException} from \"../../Exceptions\";\n\n/**\n * A [[ClefInstruction]] is the clef placed at the beginning of the stave, which indicates the pitch of the notes.\n */\nexport class ClefInstruction extends AbstractNotationInstruction {\n constructor(clefType: ClefEnum = ClefEnum.G, octaveOffset: number = 0, line: number = 2) {\n super(undefined); // FIXME? Missing SourceStaffEntry!\n this.line = line;\n this.clefType = clefType;\n this.octaveOffset = octaveOffset;\n this.calcParameters();\n }\n\n private clefType: ClefEnum = ClefEnum.G;\n private line: number = 2;\n private octaveOffset: number = 0;\n private clefPitch: Pitch;\n private referenceCyPosition: number;\n\n public static getDefaultClefFromMidiInstrument(instrument: MidiInstrument): ClefInstruction {\n switch (instrument) {\n case MidiInstrument.Acoustic_Grand_Piano:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Electric_Bass_finger:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Electric_Bass_pick:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Fretless_Bass:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Slap_Bass_1:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Slap_Bass_2:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Synth_Bass_1:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Synth_Bass_2:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n case MidiInstrument.Contrabass:\n return new ClefInstruction(ClefEnum.F, 0, 4);\n default:\n return new ClefInstruction(ClefEnum.G, 0, 2);\n }\n }\n\n public static getAllPossibleClefs(): ClefInstruction[] {\n const clefList: ClefInstruction[] = [];\n for (let i: number = 0; i <= 2; i++) {\n const clefInstructionG: ClefInstruction = new ClefInstruction(ClefEnum.G, i, 2);\n clefList.push(clefInstructionG);\n }\n for (let j: number = -2; j <= 0; j++) {\n const clefInstructionF: ClefInstruction = new ClefInstruction(ClefEnum.F, j, 4);\n clefList.push(clefInstructionF);\n }\n return clefList;\n }\n\n public static isSupportedClef(clef: ClefEnum): boolean {\n switch (clef) {\n case ClefEnum.G:\n case ClefEnum.F:\n case ClefEnum.C:\n case ClefEnum.percussion:\n case ClefEnum.TAB:\n return true;\n default:\n return false;\n }\n }\n\n public get ClefType(): ClefEnum {\n return this.clefType;\n }\n\n public set ClefType(value: ClefEnum) {\n this.clefType = value;\n }\n\n public get Line(): number {\n return this.line;\n }\n\n public set Line(value: number) {\n this.line = value;\n }\n\n public get OctaveOffset(): number {\n return this.octaveOffset;\n }\n\n public set OctaveOffset(value: number) {\n this.octaveOffset = value;\n }\n\n public get ClefPitch(): Pitch {\n return this.clefPitch;\n }\n\n public set ClefPitch(value: Pitch) {\n this.clefPitch = value;\n }\n\n public get ReferenceCyPosition(): number {\n return this.referenceCyPosition;\n }\n\n public set ReferenceCyPosition(value: number) {\n this.referenceCyPosition = value;\n }\n\n public Equals(other: ClefInstruction): boolean {\n if (this === other) {\n return true;\n }\n if (!this || !other) {\n return false;\n }\n return (this.clefPitch === other.clefPitch && this.Line === other.Line);\n }\n\n public NotEqual(clef2: ClefInstruction): boolean {\n return !this.Equals(clef2);\n }\n\n public ToString(): string {\n return \"ClefType: \" + this.clefType;\n }\n\n private calcParameters(): void {\n switch (this.clefType) {\n case ClefEnum.G:\n this.clefPitch = new Pitch(NoteEnum.G, 1 + this.octaveOffset, AccidentalEnum.NONE);\n this.referenceCyPosition = (5 - this.line) + 2;\n break;\n case ClefEnum.F:\n this.clefPitch = new Pitch(NoteEnum.F, 0 + this.octaveOffset, AccidentalEnum.NONE);\n this.referenceCyPosition = (5 - this.line) + 1.5;\n break;\n case ClefEnum.C:\n this.clefPitch = new Pitch(NoteEnum.C, 1 + this.octaveOffset, AccidentalEnum.NONE);\n this.referenceCyPosition = (5 - this.line);\n break;\n case ClefEnum.percussion:\n this.clefPitch = new Pitch(NoteEnum.C, 2, AccidentalEnum.NONE);\n this.referenceCyPosition = 2;\n break;\n case ClefEnum.TAB:\n this.clefPitch = new Pitch(NoteEnum.G, 0, AccidentalEnum.NONE);\n this.referenceCyPosition = 0;\n break;\n default:\n throw new ArgumentOutOfRangeException(\"clefType\");\n }\n }\n}\n\nexport enum ClefEnum {\n G = 0,\n F = 1,\n C = 2,\n percussion = 3,\n TAB = 4\n}\n\n\nexport enum MidiInstrument {\n None = -1,\n Acoustic_Grand_Piano,\n Bright_Acoustic_Piano,\n Electric_Grand_Piano,\n Honky_tonk_Piano,\n Electric_Piano_1,\n Electric_Piano_2,\n Harpsichord,\n Clavinet,\n Celesta,\n Glockenspiel,\n Music_Box,\n Vibraphone,\n Marimba,\n Xylophone,\n Tubular_Bells,\n Dulcimer,\n Drawbar_Organ,\n Percussive_Organ,\n Rock_Organ,\n Church_Organ,\n Reed_Organ,\n Accordion,\n Harmonica,\n Tango_Accordion,\n Acoustic_Guitar_nylon,\n Acoustic_Guitar_steel,\n Electric_Guitar_jazz,\n Electric_Guitar_clean,\n Electric_Guitar_muted,\n Overdriven_Guitar,\n Distortion_Guitar,\n Guitar_harmonics,\n Acoustic_Bass,\n Electric_Bass_finger,\n Electric_Bass_pick,\n Fretless_Bass,\n Slap_Bass_1,\n Slap_Bass_2,\n Synth_Bass_1,\n Synth_Bass_2,\n Violin,\n Viola,\n Cello,\n Contrabass,\n Tremolo_Strings,\n Pizzicato_Strings,\n Orchestral_Harp,\n Timpani,\n String_Ensemble_1,\n String_Ensemble_2,\n Synth_Strings_1,\n Synth_Strings_2,\n Choir_Aahs,\n Voice_Oohs,\n Synth_Voice,\n Orchestra_Hit,\n Trumpet,\n Trombone,\n Tuba,\n Muted_Trumpet,\n French_Horn,\n Brass_Section,\n Synth_Brass_1,\n Synth_Brass_2,\n Soprano_Sax,\n Alto_Sax,\n Tenor_Sax,\n Baritone_Sax,\n Oboe,\n English_Horn,\n Bassoon,\n Clarinet,\n Piccolo,\n Flute,\n Recorder,\n Pan_Flute,\n Blown_Bottle,\n Shakuhachi,\n Whistle,\n Ocarina,\n Lead_1_square,\n Lead_2_sawtooth,\n Lead_3_calliope,\n Lead_4_chiff,\n Lead_5_charang,\n Lead_6_voice,\n Lead_7_fifths,\n Lead_8_bass_lead,\n Pad_1_new_age,\n Pad_2_warm,\n Pad_3_polysynth,\n Pad_4_choir,\n Pad_5_bowed,\n Pad_6_metallic,\n Pad_7_halo,\n Pad_8_sweep,\n FX_1_rain,\n FX_2_soundtrack,\n FX_3_crystal,\n FX_4_atmosphere,\n FX_5_brightness,\n FX_6_goblins,\n FX_7_echoes,\n FX_8_scifi,\n Sitar,\n Banjo,\n Shamisen,\n Koto,\n Kalimba,\n Bag_pipe,\n Fiddle,\n Shanai,\n Tinkle_Bell,\n Agogo,\n Steel_Drums,\n Woodblock,\n Taiko_Drum,\n Melodic_Tom,\n Synth_Drum,\n Reverse_Cymbal,\n Guitar_Fret_Noise,\n Breath_Noise,\n Seashore,\n Bird_Tweet,\n Telephone_Ring,\n Helicopter,\n Applause,\n Gunshot,\n Percussion = 128\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\nexports.has = function (obj, prop) {\n return _hasOwnProperty.call(obj, prop);\n};\n/**\n * Default function to compare element order.\n * @function\n */\nfunction defaultCompare(a, b) {\n if (a < b) {\n return -1;\n }\n else if (a === b) {\n return 0;\n }\n else {\n return 1;\n }\n}\nexports.defaultCompare = defaultCompare;\n/**\n * Default function to test equality.\n * @function\n */\nfunction defaultEquals(a, b) {\n return a === b;\n}\nexports.defaultEquals = defaultEquals;\n/**\n * Default function to convert an object to a string.\n * @function\n */\nfunction defaultToString(item) {\n if (item === null) {\n return 'COLLECTION_NULL';\n }\n else if (isUndefined(item)) {\n return 'COLLECTION_UNDEFINED';\n }\n else if (isString(item)) {\n return '$s' + item;\n }\n else {\n return '$o' + item.toString();\n }\n}\nexports.defaultToString = defaultToString;\n/**\n * Joins all the properies of the object using the provided join string\n */\nfunction makeString(item, join) {\n if (join === void 0) { join = ','; }\n if (item === null) {\n return 'COLLECTION_NULL';\n }\n else if (isUndefined(item)) {\n return 'COLLECTION_UNDEFINED';\n }\n else if (isString(item)) {\n return item.toString();\n }\n else {\n var toret = '{';\n var first = true;\n for (var prop in item) {\n if (exports.has(item, prop)) {\n if (first) {\n first = false;\n }\n else {\n toret = toret + join;\n }\n toret = toret + prop + ':' + item[prop];\n }\n }\n return toret + '}';\n }\n}\nexports.makeString = makeString;\n/**\n * Checks if the given argument is a function.\n * @function\n */\nfunction isFunction(func) {\n return (typeof func) === 'function';\n}\nexports.isFunction = isFunction;\n/**\n * Checks if the given argument is undefined.\n * @function\n */\nfunction isUndefined(obj) {\n return (typeof obj) === 'undefined';\n}\nexports.isUndefined = isUndefined;\n/**\n * Checks if the given argument is a string.\n * @function\n */\nfunction isString(obj) {\n return Object.prototype.toString.call(obj) === '[object String]';\n}\nexports.isString = isString;\n/**\n * Reverses a compare function.\n * @function\n */\nfunction reverseCompareFunction(compareFunction) {\n if (isUndefined(compareFunction) || !isFunction(compareFunction)) {\n return function (a, b) {\n if (a < b) {\n return 1;\n }\n else if (a === b) {\n return 0;\n }\n else {\n return -1;\n }\n };\n }\n else {\n return function (d, v) {\n return compareFunction(d, v) * -1;\n };\n }\n}\nexports.reverseCompareFunction = reverseCompareFunction;\n/**\n * Returns an equal function given a compare function.\n * @function\n */\nfunction compareToEquals(compareFunction) {\n return function (a, b) {\n return compareFunction(a, b) === 0;\n };\n}\nexports.compareToEquals = compareToEquals;\n//# sourceMappingURL=util.js.map","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements utility methods used by the rest of the VexFlow\n// codebase.\n//\n\n/* eslint max-classes-per-file: \"off\" */\n\nconst Vex = () => { };\n\n// Default log function sends all arguments to console.\nVex.L = (block, args) => {\n if (!args) return;\n const line = Array.prototype.slice.call(args).join(' ');\n window.console.log(block + ': ' + line);\n};\n\nVex.MakeException = (name) => {\n const exception = class extends Error {\n constructor(message, data) {\n super(message);\n this.name = name;\n this.message = message;\n this.data = data;\n }\n };\n\n return exception;\n};\n\n// Default runtime exception.\nclass RuntimeError {\n constructor(code, message) {\n this.code = code;\n this.message = message;\n }\n\n toString() {\n return '[RuntimeError] ' + this.code + ':' + this.message;\n }\n}\n\n// Shortcut method for `RuntimeError`.\nVex.RuntimeError = RuntimeError;\nVex.RERR = Vex.RuntimeError;\n\n// Merge `destination` hash with `source` hash, overwriting like keys\n// in `source` if necessary.\nVex.Merge = (destination, source) => {\n for (const property in source) { // eslint-disable-line guard-for-in\n destination[property] = source[property];\n }\n return destination;\n};\n\n// DEPRECATED. Use `Math.*`.\nVex.Min = Math.min;\nVex.Max = Math.max;\nVex.forEach = (a, fn) => {\n for (let i = 0; i < a.length; i++) {\n fn(a[i], i);\n }\n};\n\n// Round number to nearest fractional value (`.5`, `.25`, etc.)\nVex.RoundN = (x, n) =>\n (x % n) >= (n / 2)\n ? parseInt(x / n, 10) * n + n\n : parseInt(x / n, 10) * n;\n\n// Locate the mid point between stave lines. Returns a fractional line if a space.\nVex.MidLine = (a, b) => {\n let mid_line = b + (a - b) / 2;\n if (mid_line % 2 > 0) {\n mid_line = Vex.RoundN(mid_line * 10, 5) / 10;\n }\n return mid_line;\n};\n\n// Take `arr` and return a new list consisting of the sorted, unique,\n// contents of arr. Does not modify `arr`.\nVex.SortAndUnique = (arr, cmp, eq) => {\n if (arr.length > 1) {\n const newArr = [];\n let last;\n arr.sort(cmp);\n\n for (let i = 0; i < arr.length; ++i) {\n if (i === 0 || !eq(arr[i], last)) {\n newArr.push(arr[i]);\n }\n last = arr[i];\n }\n\n return newArr;\n } else {\n return arr;\n }\n};\n\n// Check if array `a` contains `obj`.\nVex.Contains = (a, obj) => {\n let i = a.length;\n while (i--) {\n if (a[i] === obj) {\n return true;\n }\n }\n return false;\n};\n\n// Get the 2D Canvas context from DOM element `canvas_sel`.\nVex.getCanvasContext = canvas_sel => {\n if (!canvas_sel) {\n throw new Vex.RERR('BadArgument', 'Invalid canvas selector: ' + canvas_sel);\n }\n\n const canvas = document.getElementById(canvas_sel);\n if (!(canvas && canvas.getContext)) {\n throw new Vex.RERR(\n 'UnsupportedBrowserError', 'This browser does not support HTML5 Canvas'\n );\n }\n\n return canvas.getContext('2d');\n};\n\n// Draw a tiny dot marker on the specified canvas. A great debugging aid.\n//\n// `ctx`: Canvas context.\n// `x`, `y`: Dot coordinates.\nVex.drawDot = (ctx, x, y, color = '#55') => {\n ctx.save();\n ctx.setFillStyle(color);\n\n // draw a circle\n ctx.beginPath();\n ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n};\n\n// Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds.\nVex.BM = (s, f) => {\n const start_time = new Date().getTime();\n f();\n const elapsed = new Date().getTime() - start_time;\n Vex.L(s + elapsed + 'ms');\n};\n\n// Get stack trace.\nVex.StackTrace = () => {\n const err = new Error();\n return err.stack;\n};\n\n// Dump warning to console.\nVex.W = (...args) => {\n const line = args.join(' ');\n window.console.log('Warning: ', line, Vex.StackTrace());\n};\n\n// Used by various classes (e.g., SVGContext) to provide a\n// unique prefix to element names (or other keys in shared namespaces).\nVex.Prefix = text => Vex.Prefix.prefix + text;\nVex.Prefix.prefix = 'vf-';\n\nexport { Vex };\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Fraction class that represents a rational number\n//\n// @author zz85\n// @author incompleteopus (modifications)\n\n/* eslint-disable no-underscore-dangle */\n\nimport { Vex } from './vex';\nexport class Fraction {\n /**\n * GCD: Find greatest common divisor using Euclidean algorithm\n */\n static GCD(a, b) {\n if (typeof a !== 'number' || typeof b !== 'number') {\n throw new Vex.RERR('BadArgument', `Invalid numbers: ${a}, ${b}`);\n }\n\n let t;\n\n while (b !== 0) {\n t = b;\n b = a % b;\n a = t;\n }\n\n return a;\n }\n\n /**\n * LCM: Lowest common multiple\n */\n static LCM(a, b) {\n return ((a * b) / Fraction.GCD(a, b));\n }\n\n /**\n * LCMM: Lowest common multiple for more than two numbers\n */\n static LCMM(args) {\n if (args.length === 0) {\n return 0;\n } else if (args.length === 1) {\n return args[0];\n } else if (args.length === 2) {\n return Fraction.LCM(args[0], args[1]);\n } else {\n const arg0 = args[0];\n args.shift();\n return Fraction.LCM(arg0, Fraction.LCMM(args));\n }\n }\n\n constructor(numerator, denominator) {\n this.set(numerator, denominator);\n }\n set(numerator, denominator) {\n this.numerator = numerator === undefined ? 1 : numerator;\n this.denominator = denominator === undefined ? 1 : denominator;\n return this;\n }\n value() {\n return this.numerator / this.denominator;\n }\n simplify() {\n let u = this.numerator;\n let d = this.denominator;\n\n const gcd = Fraction.GCD(u, d);\n u /= gcd;\n d /= gcd;\n\n if (d < 0) {\n d = -d;\n u = -u;\n }\n return this.set(u, d);\n }\n add(param1, param2) {\n let otherNumerator;\n let otherDenominator;\n\n if (param1 instanceof Fraction) {\n otherNumerator = param1.numerator;\n otherDenominator = param1.denominator;\n } else {\n if (param1 !== undefined) {\n otherNumerator = param1;\n } else {\n otherNumerator = 0;\n }\n\n if (param2 !== undefined) {\n otherDenominator = param2;\n } else {\n otherDenominator = 1;\n }\n }\n\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n\n const u = this.numerator * a + otherNumerator * b;\n return this.set(u, lcm);\n }\n subtract(param1, param2) {\n let otherNumerator;\n let otherDenominator;\n\n if (param1 instanceof Fraction) {\n otherNumerator = param1.numerator;\n otherDenominator = param1.denominator;\n } else {\n if (param1 !== undefined) {\n otherNumerator = param1;\n } else {\n otherNumerator = 0;\n }\n\n if (param2 !== undefined) {\n otherDenominator = param2;\n } else {\n otherDenominator = 1;\n }\n }\n\n const lcm = Fraction.LCM(this.denominator, otherDenominator);\n const a = lcm / this.denominator;\n const b = lcm / otherDenominator;\n\n const u = this.numerator * a - otherNumerator * b;\n return this.set(u, lcm);\n }\n multiply(param1, param2) {\n let otherNumerator;\n let otherDenominator;\n\n if (param1 instanceof Fraction) {\n otherNumerator = param1.numerator;\n otherDenominator = param1.denominator;\n } else {\n if (param1 !== undefined) {\n otherNumerator = param1;\n } else {\n otherNumerator = 1;\n }\n\n if (param2 !== undefined) {\n otherDenominator = param2;\n } else {\n otherDenominator = 1;\n }\n }\n\n return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n }\n divide(param1, param2) {\n let otherNumerator;\n let otherDenominator;\n\n if (param1 instanceof Fraction) {\n otherNumerator = param1.numerator;\n otherDenominator = param1.denominator;\n } else {\n if (param1 !== undefined) {\n otherNumerator = param1;\n } else {\n otherNumerator = 1;\n }\n\n if (param2 !== undefined) {\n otherDenominator = param2;\n } else {\n otherDenominator = 1;\n }\n }\n\n return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n }\n\n // Simplifies both sides and checks if they are equal.\n equals(compare) {\n const a = Fraction.__compareA.copy(compare).simplify();\n const b = Fraction.__compareB.copy(this).simplify();\n\n return (a.numerator === b.numerator) && (a.denominator === b.denominator);\n }\n\n // Greater than operator.\n greaterThan(compare) {\n const a = Fraction.__compareB.copy(this);\n a.subtract(compare);\n return (a.numerator > 0);\n }\n\n // Greater than or equals operator.\n greaterThanEquals(compare) {\n const a = Fraction.__compareB.copy(this);\n a.subtract(compare);\n return (a.numerator >= 0);\n }\n\n // Less than operator.\n lessThan(compare) {\n return !(this.greaterThanEquals(compare));\n }\n\n // Less than or equals operator.\n lessThanEquals(compare) {\n return !(this.greaterThan(compare));\n }\n\n // Creates a new copy with this current values.\n clone() {\n return new Fraction(this.numerator, this.denominator);\n }\n\n // Copies value of another Fraction into itself.\n copy(copy) {\n if (typeof copy === 'number') {\n return this.set(copy || 0, 1);\n }\n return this.set(copy.numerator, copy.denominator);\n }\n\n // Returns the integer component eg. (4/2) == 2\n quotient() {\n return Math.floor(this.numerator / this.denominator);\n }\n\n // Returns the fraction component when reduced to a mixed number\n fraction() {\n return this.numerator % this.denominator;\n }\n\n // Returns the absolute value\n abs() {\n this.denominator = Math.abs(this.denominator);\n this.numerator = Math.abs(this.numerator);\n return this;\n }\n\n // Returns a raw string representation\n toString() {\n return this.numerator + '/' + this.denominator;\n }\n\n // Returns a simplified string respresentation\n toSimplifiedString() {\n return Fraction.__tmp.copy(this).simplify().toString();\n }\n\n // Returns string representation in mixed form\n toMixedString() {\n let s = '';\n const q = this.quotient();\n const f = Fraction.__tmp.copy(this);\n\n if (q < 0) {\n f.abs().fraction();\n } else {\n f.fraction();\n }\n\n if (q !== 0) {\n s += q;\n\n if (f.numerator !== 0) {\n s += ' ' + f.toSimplifiedString();\n }\n } else {\n if (f.numerator === 0) {\n s = '0';\n } else {\n s = f.toSimplifiedString();\n }\n }\n\n return s;\n }\n\n // Parses a fraction string\n parse(str) {\n const i = str.split('/');\n const n = parseInt(i[0], 10);\n const d = (i[1]) ? parseInt(i[1], 10) : 1;\n\n return this.set(n, d);\n }\n}\n\n// Temporary cached objects\nFraction.__compareA = new Fraction();\nFraction.__compareB = new Fraction();\nFraction.__tmp = new Fraction();\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to regiser with a registry:\n//\n// 1) Explicitly call `element.register(registry)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n// elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\n\nimport { Vex } from './vex';\n\nexport const X = Vex.MakeException('RegistryError');\n\nfunction setIndexValue(index, name, value, id, elem) {\n if (!index[name][value]) index[name][value] = {};\n index[name][value][id] = elem;\n}\n\nexport class Registry {\n static get INDEXES() { return ['type']; }\n\n constructor() {\n this.clear();\n }\n\n // If you call `enableDefaultRegistry`, any new elements will auto-register with\n // the provided registry as soon as they're constructed.\n static enableDefaultRegistry(registry) {\n Registry.defaultRegistry = registry;\n }\n\n static getDefaultRegistry() {\n return Registry.defaultRegistry;\n }\n\n static disableDefaultRegistry() {\n Registry.defaultRegistry = null;\n }\n\n clear() {\n // Indexes are represented as maps of maps (of maps). This allows\n // for both multi-labeling (e.g., an element can have multiple classes)\n // and efficient lookup.\n this.index = {\n id: {},\n type: {},\n class: {},\n };\n return this;\n }\n\n // Updates the indexes for element 'id'. If an element's attribute changes\n // from A -> B, make sure to remove the element from A.\n updateIndex({ id, name, value, oldValue }) {\n const elem = this.getElementById(id);\n if (oldValue !== null && this.index[name][oldValue]) {\n delete this.index[name][oldValue][id];\n }\n if (value !== null) {\n setIndexValue(this.index, name, value, elem.getAttribute('id'), elem);\n }\n }\n\n // Register element `elem` with this registry. This adds the element to its index and watches\n // it for attribute changes.\n register(elem, id) {\n id = id || elem.getAttribute('id');\n\n if (!id) {\n throw new X('Can\\'t add element without `id` attribute to registry', elem);\n }\n\n // Manually add id to index, then update other indexes.\n elem.setAttribute('id', id);\n setIndexValue(this.index, 'id', id, id, elem);\n Registry.INDEXES.forEach(name => {\n this.updateIndex({ id, name, value: elem.getAttribute(name), oldValue: null });\n });\n elem.onRegister(this);\n return this;\n }\n\n getElementById(id) {\n return this.index.id[id] ? this.index.id[id][id] : null;\n }\n\n getElementsByAttribute(attrName, value) {\n const index = this.index[attrName];\n if (index && index[value]) {\n return Object.keys(index[value]).map(i => index[value][i]);\n } else {\n return [];\n }\n }\n\n getElementsByType(type) { return this.getElementsByAttribute('type', type); }\n getElementsByClass(className) { return this.getElementsByAttribute('class', className); }\n\n // This is called by the element when an attribute value changes. If an indexed\n // attribute changes, then update the local index.\n onUpdate({ id, name, value, oldValue }) {\n function includes(array, value) {\n return array.filter(x => x === value).length > 0;\n }\n\n if (!includes(Registry.INDEXES.concat(['id', 'class']), name)) return this;\n this.updateIndex({ id, name, value, oldValue });\n return this;\n }\n}\n\nRegistry.defaultRegistry = null;\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a generic base class for VexFlow, with implementations\n// of general functions and properties that can be inherited by all VexFlow elements.\n\nimport { Vex } from './vex';\nimport { Registry } from './registry';\n\nexport class Element {\n static newID() { return 'auto' + (Element.ID++); }\n\n constructor({ type } = {}) {\n this.attrs = {\n id: Element.newID(),\n el: null,\n type: type || 'Base',\n classes: {},\n };\n\n this.boundingBox = null;\n this.context = null;\n this.rendered = false;\n\n // If a default registry exist, then register with it right away.\n if (Registry.getDefaultRegistry()) {\n Registry.getDefaultRegistry().register(this);\n }\n }\n\n // set the draw style of a stemmable note:\n setStyle(style) { this.style = style; return this; }\n getStyle() { return this.style; }\n\n // Apply current style to Canvas `context`\n applyStyle(context = this.context, style = this.getStyle()) {\n if (!style) return this;\n\n context.save();\n if (style.shadowColor) context.setShadowColor(style.shadowColor);\n if (style.shadowBlur) context.setShadowBlur(style.shadowBlur);\n if (style.fillStyle) context.setFillStyle(style.fillStyle);\n if (style.strokeStyle) context.setStrokeStyle(style.strokeStyle);\n if (style.lineWidth) context.setLineWidth(style.lineWidth);\n return this;\n }\n\n restoreStyle(context = this.context, style = this.getStyle()) {\n if (!style) return this;\n context.restore();\n return this;\n }\n\n // draw with style of an element.\n drawWithStyle() {\n this.checkContext();\n this.applyStyle();\n this.draw();\n this.restoreStyle();\n }\n\n // An element can have multiple class labels.\n hasClass(className) { return (this.attrs.classes[className] === true); }\n addClass(className) {\n this.attrs.classes[className] = true;\n if (this.registry) {\n this.registry.onUpdate({\n id: this.getAttribute('id'),\n name: 'class',\n value: className,\n oldValue: null,\n });\n }\n return this;\n }\n\n removeClass(className) {\n delete this.attrs.classes[className];\n if (this.registry) {\n this.registry.onUpdate({\n id: this.getAttribute('id'),\n name: 'class',\n value: null,\n oldValue: className,\n });\n }\n return this;\n }\n\n // This is called by the registry after the element is registered.\n onRegister(registry) { this.registry = registry; return this; }\n isRendered() { return this.rendered; }\n setRendered(rendered = true) { this.rendered = rendered; return this; }\n\n getAttributes() { return this.attrs; }\n getAttribute(name) { return this.attrs[name]; }\n setAttribute(name, value) {\n const id = this.attrs.id;\n const oldValue = this.attrs[name];\n this.attrs[name] = value;\n if (this.registry) {\n // Register with old id to support id changes.\n this.registry.onUpdate({ id, name, value, oldValue });\n }\n return this;\n }\n\n getContext() { return this.context; }\n setContext(context) { this.context = context; return this; }\n getBoundingBox() { return this.boundingBox; }\n\n // Validators\n checkContext() {\n if (!this.context) {\n throw new Vex.RERR('NoContext', 'No rendering context attached to instance');\n }\n return this.context;\n }\n}\n\nElement.ID = 1000;\n","// ## Description\n//\n// Object which computes metrics for a bounding box by continuously\n// taking canvas path commands\n\n// Warning: This file is merely a crutch to get bounding box information without\n// explicit metadata. This is likely to get deprecated following SMuFL support.\n//\n// taken from: https://github.com/gabelerner/canvg/blob/860e418aca67b9a41e858a223d74d375793ec364/ca\n// nvg.js#L449\n\nexport class BoundingBoxComputation {\n constructor(x1, y1, x2, y2) { // pass in initial points if you want\n this.x1 = Number.NaN;\n this.y1 = Number.NaN;\n this.x2 = Number.NaN;\n this.y2 = Number.NaN;\n\n this.addPoint(x1, y1);\n this.addPoint(x2, y2);\n }\n\n width() {\n return this.x2 - this.x1;\n }\n\n height() {\n return this.y2 - this.y1;\n }\n\n addPoint(x, y) {\n if (x != null) {\n if (isNaN(this.x1) || isNaN(this.x2)) {\n this.x1 = x;\n this.x2 = x;\n }\n if (x < this.x1) this.x1 = x;\n if (x > this.x2) this.x2 = x;\n }\n\n if (y != null) {\n if (isNaN(this.y1) || isNaN(this.y2)) {\n this.y1 = y;\n this.y2 = y;\n }\n if (y < this.y1) this.y1 = y;\n if (y > this.y2) this.y2 = y;\n }\n }\n\n addX(x) {\n this.addPoint(x, null);\n }\n\n addY(y) {\n this.addPoint(null, y);\n }\n\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n const cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n const cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n const cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n const cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n this.addBezierCurve(p0x, p0y, cp1x, cp1y, cp2x, cp2y, p2x, p2y);\n }\n\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n const p0 = [p0x, p0y];\n const p1 = [p1x, p1y];\n const p2 = [p2x, p2y];\n const p3 = [p3x, p3y];\n let i;\n\n this.addPoint(p0[0], p0[1]);\n this.addPoint(p3[0], p3[1]);\n\n const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n 3 * Math.pow(1 - t, 2) * t * p1[i] +\n 3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n Math.pow(t, 3) * p3[i];\n\n for (i = 0; i <= 1; i++) {\n const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n const c = 3 * p1[i] - 3 * p0[i];\n\n if (a === 0) {\n if (b === 0) continue;\n const t = -c / b;\n if (0 < t && t < 1) {\n if (i === 0) this.addX(f(t, i));\n if (i === 1) this.addY(f(t, i));\n }\n continue;\n }\n\n const b2ac = Math.pow(b, 2) - 4 * c * a;\n if (b2ac < 0) continue;\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0) this.addX(f(t1, i));\n if (i === 1) this.addY(f(t1, i));\n }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0) this.addX(f(t2, i));\n if (i === 1) this.addY(f(t2, i));\n }\n }\n }\n}\n","// Vex Music Notation\n// Mohit Muthanna \n//\n// Copyright Mohit Muthanna 2010\n\n// Bounding boxes for interactive notation\n\nexport class BoundingBox {\n static copy(that) {\n return new BoundingBox(that.x, that.y, that.w, that.h);\n }\n\n constructor(x, y, w, h) {\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n }\n getX() { return this.x; }\n getY() { return this.y; }\n getW() { return this.w; }\n getH() { return this.h; }\n setX(x) { this.x = x; return this; }\n setY(y) { this.y = y; return this; }\n setW(w) { this.w = w; return this; }\n setH(h) { this.h = h; return this; }\n move(x, y) { this.x += x; this.y += y; }\n clone() { return BoundingBox.copy(this); }\n\n // Merge my box with given box. Creates a bigger bounding box unless\n // the given box is contained in this one.\n mergeWith(boundingBox, ctx) {\n const that = boundingBox;\n\n const new_x = this.x < that.x ? this.x : that.x;\n const new_y = this.y < that.y ? this.y : that.y;\n const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n\n this.x = new_x;\n this.y = new_y;\n this.w = new_w;\n this.h = new_h;\n\n if (ctx) this.draw(ctx);\n return this;\n }\n\n draw(ctx, x, y) {\n if (!x) x = 0;\n if (!y) y = 0;\n ctx.rect(this.x + x, this.y + y, this.w, this.h);\n ctx.stroke();\n }\n}\n","export const Font = {\n\"glyphs\":{\n\"v0\":{\"x_min\":0,\"x_max\":514.5,\"ha\":525,\"o\":\"m 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 \"},\n\"v1\":{\"x_min\":-1.359375,\"x_max\":344.359375,\"ha\":351,\"o\":\"m 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 \"},\n\"v2\":{\"x_min\":-1.359375,\"x_max\":458.6875,\"ha\":468,\"o\":\"m 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 \"},\n\"v3\":{\"x_min\":-1.359375,\"x_max\":409.6875,\"ha\":418,\"o\":\"m 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 \"},\n\"v4\":{\"x_min\":0,\"x_max\":468.21875,\"ha\":478,\"o\":\"m 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 \"},\n\"v5\":{\"x_min\":0,\"x_max\":409.6875,\"ha\":418,\"o\":\"m 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 \"},\n\"v6\":{\"x_min\":0,\"x_max\":475.03125,\"ha\":485,\"o\":\"m 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 \"},\n\"v7\":{\"x_min\":0,\"x_max\":442.359375,\"ha\":451,\"o\":\"m 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 \"},\n\"v8\":{\"x_min\":0,\"x_max\":488.640625,\"ha\":499,\"o\":\"m 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 \"},\n\"v9\":{\"x_min\":0,\"x_max\":475.03125,\"ha\":485,\"o\":\"m 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 \"},\n\"va\":{\"x_min\":-149.71875,\"x_max\":148.359375,\"ha\":151,\"o\":\"m -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 \"},\n\"vb\":{\"x_min\":0,\"x_max\":428.75,\"ha\":438,\"o\":\"m 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 \"},\n\"vc\":{\"x_min\":0,\"x_max\":447.8125,\"ha\":457,\"o\":\"m 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 \"},\n\"vf\":{\"x_min\":0,\"x_max\":370.21875,\"ha\":378,\"o\":\"m 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 \"},\n\"v10\":{\"x_min\":0,\"x_max\":559.421875,\"ha\":571,\"o\":\"m 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 \"},\n\"v11\":{\"x_min\":-155.171875,\"x_max\":153.8125,\"ha\":157,\"o\":\"m -137 353 b -130 353 -136 353 -133 353 b -112 349 -125 353 -119 352 b -100 342 -110 347 -104 344 b 0 317 -69 326 -35 317 b 111 349 38 317 76 328 b 129 353 117 352 123 353 b 153 327 142 353 153 344 b 144 302 153 320 153 317 b 27 6 93 226 50 113 b 21 -13 24 -11 24 -11 b 0 -26 17 -22 8 -26 b -24 -12 -9 -26 -19 -22 b -28 5 -24 -9 -27 -2 b -145 302 -53 117 -95 224 b -155 327 -155 317 -155 320 b -137 353 -155 340 -148 349 \"},\n\"v18\":{\"x_min\":0,\"x_max\":323.9375,\"ha\":331,\"o\":\"m 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 \"},\n\"v1b\":{\"x_min\":0,\"x_max\":559.421875,\"ha\":571,\"o\":\"m 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 \"},\n\"v1d\":{\"x_min\":0,\"x_max\":619.3125,\"ha\":632,\"o\":\"m 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 \"},\n\"v1e\":{\"x_min\":-402.890625,\"x_max\":401.53125,\"ha\":410,\"o\":\"m -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 \"},\n\"v1f\":{\"x_min\":-340.28125,\"x_max\":338.921875,\"ha\":346,\"o\":\"m -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 \"},\n\"v20\":{\"x_min\":-571.671875,\"x_max\":570.3125,\"ha\":582,\"o\":\"m -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 \"},\n\"v22\":{\"x_min\":0,\"x_max\":432.828125,\"ha\":442,\"o\":\"m 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 \"},\n\"v23\":{\"x_min\":0,\"x_max\":133.390625,\"ha\":136,\"o\":\"m 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 \"},\n\"v25\":{\"x_min\":0,\"x_max\":318.5,\"ha\":325,\"o\":\"m 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 \"},\n\"v26\":{\"x_min\":-21.78125,\"x_max\":483.1875,\"ha\":493,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 \"},\n\"v27\":{\"x_min\":0,\"x_max\":432.828125,\"ha\":442,\"o\":\"m 208 184 b 213 187 209 186 212 187 b 224 176 217 187 221 183 b 245 147 225 172 235 159 b 419 -1 288 90 347 38 b 431 -8 424 -4 431 -8 b 432 -12 432 -9 432 -11 b 430 -18 432 -13 432 -16 b 364 -61 424 -20 383 -47 b 225 -183 307 -102 250 -152 b 223 -187 224 -184 223 -187 b 220 -188 221 -188 220 -188 b 208 -176 216 -188 210 -184 b 187 -148 205 -173 197 -159 b 12 0 144 -90 84 -38 b 0 11 4 5 0 8 b 16 24 0 13 4 18 b 183 158 83 69 141 115 b 208 184 194 169 198 173 m 183 105 b 176 113 181 109 176 113 b 172 109 176 113 175 112 b 92 45 149 90 117 62 l 88 41 l 102 31 b 247 -105 160 -6 210 -55 l 254 -115 l 257 -112 l 269 -102 b 340 -45 287 -87 319 -61 l 344 -43 l 330 -33 b 183 105 272 6 221 54 \"},\n\"v28\":{\"x_min\":-73.5,\"x_max\":72.140625,\"ha\":74,\"o\":\"m -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 \"},\n\"v29\":{\"x_min\":-590.71875,\"x_max\":589.359375,\"ha\":601,\"o\":\"m 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 \"},\n\"v2a\":{\"x_min\":-21.78125,\"x_max\":366.140625,\"ha\":374,\"o\":\"m 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 \"},\n\"v2c\":{\"x_min\":-597.53125,\"x_max\":596.171875,\"ha\":608,\"o\":\"m -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 \"},\n\"v2d\":{\"x_min\":0,\"x_max\":438.28125,\"ha\":447,\"o\":\"m 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 \"},\n\"v2f\":{\"x_min\":-1.359375,\"x_max\":680.5625,\"ha\":694,\"o\":\"m 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 \"},\n\"v30\":{\"x_min\":-21.78125,\"x_max\":367.5,\"ha\":375,\"o\":\"m 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 \"},\n\"v31\":{\"x_min\":0,\"x_max\":386.5625,\"ha\":394,\"o\":\"m 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 \"},\n\"v33\":{\"x_min\":-423.3125,\"x_max\":421.9375,\"ha\":431,\"o\":\"m -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 \"},\n\"v34\":{\"x_min\":0,\"x_max\":622.03125,\"ha\":635,\"o\":\"m 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 \"},\n\"v36\":{\"x_min\":-1.359375,\"x_max\":1064.390625,\"ha\":1086,\"o\":\"m 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 \"},\n\"v38\":{\"x_min\":-1.359375,\"x_max\":651.96875,\"ha\":665,\"o\":\"m 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 \"},\n\"v39\":{\"x_min\":-171.5,\"x_max\":251.8125,\"ha\":257,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 \"},\n\"v3b\":{\"x_min\":0,\"x_max\":484.5625,\"ha\":494,\"o\":\"m 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 \"},\n\"v3c\":{\"x_min\":0,\"x_max\":450.53125,\"ha\":460,\"o\":\"m 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 \"},\n\"v3e\":{\"x_min\":0,\"x_max\":406.96875,\"ha\":415,\"o\":\"m 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 \"},\n\"v3f\":{\"x_min\":-24.5,\"x_max\":317.140625,\"ha\":324,\"o\":\"m -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 \"},\n\"v40\":{\"x_min\":-1.359375,\"x_max\":436.921875,\"ha\":446,\"o\":\"m 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 \"},\n\"v41\":{\"x_min\":-1.359375,\"x_max\":556.6875,\"ha\":568,\"o\":\"m 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 \"},\n\"v42\":{\"x_min\":-348.4375,\"x_max\":24.5,\"ha\":25,\"o\":\"m -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 \"},\n\"v43\":{\"x_min\":-442.359375,\"x_max\":441,\"ha\":450,\"o\":\"m -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 \"},\n\"v44\":{\"x_min\":-21.78125,\"x_max\":251.8125,\"ha\":257,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 \"},\n\"v45\":{\"x_min\":-402.890625,\"x_max\":401.53125,\"ha\":410,\"o\":\"m -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 \"},\n\"v46\":{\"x_min\":0,\"x_max\":627.46875,\"ha\":640,\"o\":\"m 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 \"},\n\"v47\":{\"x_min\":-24.5,\"x_max\":315.78125,\"ha\":322,\"o\":\"m -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 \"},\n\"v49\":{\"x_min\":0,\"x_max\":630.203125,\"ha\":643,\"o\":\"m 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 \"},\n\"v4a\":{\"x_min\":70.78125,\"x_max\":378.390625,\"ha\":315,\"o\":\"m 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 \"},\n\"v4b\":{\"x_min\":0,\"x_max\":503.609375,\"ha\":514,\"o\":\"m 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 \"},\n\"v4d\":{\"x_min\":-311.6875,\"x_max\":310.328125,\"ha\":317,\"o\":\"m -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 \"},\n\"v4e\":{\"x_min\":0,\"x_max\":239.5625,\"ha\":244,\"o\":\"m 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 \"},\n\"v51\":{\"x_min\":-1.359375,\"x_max\":455.96875,\"ha\":465,\"o\":\"m 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 \"},\n\"v52\":{\"x_min\":-10.890625,\"x_max\":298.078125,\"ha\":294,\"o\":\"m 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 \"},\n\"v53\":{\"x_min\":0,\"x_max\":902.421875,\"ha\":921,\"o\":\"m 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 \"},\n\"v54\":{\"x_min\":-24.5,\"x_max\":317.140625,\"ha\":324,\"o\":\"m -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 \"},\n\"v55\":{\"x_min\":0,\"x_max\":551.25,\"ha\":563,\"o\":\"m 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 \"},\n\"v58\":{\"x_min\":-21.78125,\"x_max\":367.5,\"ha\":375,\"o\":\"m 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 \"},\n\"v59\":{\"x_min\":0,\"x_max\":464.140625,\"ha\":474,\"o\":\"m 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 \"},\n\"v5a\":{\"x_min\":-171.5,\"x_max\":170.140625,\"ha\":174,\"o\":\"m -6 566 b 0 567 -5 567 -2 567 b 14 556 6 567 12 563 b 92 285 14 555 50 433 b 170 13 166 33 170 19 b 168 13 170 13 170 13 b 161 1 168 8 167 4 l 159 0 l 122 0 l 84 0 l 81 1 b 21 195 76 5 78 -5 b -32 381 -8 297 -32 381 b -87 197 -32 381 -57 298 b -141 8 -115 94 -140 9 b -155 0 -142 2 -149 0 b -171 15 -163 0 -171 5 b -14 556 -171 18 -24 528 b -6 566 -14 560 -10 564 \"},\n\"v5b\":{\"x_min\":-441,\"x_max\":439.640625,\"ha\":449,\"o\":\"m -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 \"},\n\"v5c\":{\"x_min\":0,\"x_max\":447.8125,\"ha\":457,\"o\":\"m 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 \"},\n\"v5d\":{\"x_min\":-1.359375,\"x_max\":592.078125,\"ha\":604,\"o\":\"m 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 \"},\n\"v60\":{\"x_min\":-590.71875,\"x_max\":589.359375,\"ha\":601,\"o\":\"m -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 \"},\n\"v62\":{\"x_min\":46.28125,\"x_max\":669.671875,\"ha\":563,\"o\":\"m 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 \"},\n\"v68\":{\"x_min\":-597.53125,\"x_max\":596.171875,\"ha\":608,\"o\":\"m -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 \"},\n\"v6c\":{\"x_min\":-1.359375,\"x_max\":193.28125,\"ha\":197,\"o\":\"m 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 \"},\n\"v6d\":{\"x_min\":-590.71875,\"x_max\":589.359375,\"ha\":601,\"o\":\"m 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 \"},\n\"v6f\":{\"x_min\":-80.3125,\"x_max\":78.9375,\"ha\":81,\"o\":\"m 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 \"},\n\"v70\":{\"x_min\":0,\"x_max\":436.921875,\"ha\":446,\"o\":\"m 213 190 b 217 191 215 191 216 191 b 231 184 223 191 228 188 b 249 154 240 167 246 159 b 419 18 292 91 348 45 b 436 -1 435 11 436 8 b 424 -16 436 -9 434 -13 b 308 -87 394 -26 340 -59 b 231 -186 276 -117 257 -142 b 219 -192 228 -191 225 -192 b 198 -174 209 -192 208 -191 b 47 -33 161 -113 110 -63 b 10 -16 34 -26 17 -19 b 0 -1 2 -13 0 -9 b 17 18 0 8 1 11 b 198 173 95 48 156 101 b 213 190 206 187 208 188 \"},\n\"v72\":{\"x_min\":-423.3125,\"x_max\":421.9375,\"ha\":431,\"o\":\"m -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 \"},\n\"v74\":{\"x_min\":-206.890625,\"x_max\":428.75,\"ha\":438,\"o\":\"m 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 \"},\n\"v75\":{\"x_min\":-149.71875,\"x_max\":148.359375,\"ha\":151,\"o\":\"m -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 \"},\n\"v78\":{\"x_min\":0,\"x_max\":193.28125,\"ha\":197,\"o\":\"m 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 \"},\n\"v79\":{\"x_min\":-1.359375,\"x_max\":899.703125,\"ha\":918,\"o\":\"m 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 \"},\n\"v7a\":{\"x_min\":-1.359375,\"x_max\":386.5625,\"ha\":394,\"o\":\"m 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 \"},\n\"v7c\":{\"x_min\":0,\"x_max\":300.8125,\"ha\":307,\"o\":\"m 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 \"},\n\"v7d\":{\"x_min\":-1.359375,\"x_max\":436.921875,\"ha\":446,\"o\":\"m 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 \"},\n\"v7f\":{\"x_min\":0,\"x_max\":367.5,\"ha\":375,\"o\":\"m 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 \"},\n\"v80\":{\"x_min\":29.9375,\"x_max\":420.578125,\"ha\":371,\"o\":\"m 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 \"},\n\"v81\":{\"x_min\":0,\"x_max\":428.75,\"ha\":438,\"o\":\"m 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 \"},\n\"v83\":{\"x_min\":-1.359375,\"x_max\":847.96875,\"ha\":865,\"o\":\"m 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 \"},\n\"v84\":{\"x_min\":25.859375,\"x_max\":164.6875,\"ha\":168,\"o\":\"m 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 \"},\n\"v86\":{\"x_min\":-571.671875,\"x_max\":570.3125,\"ha\":582,\"o\":\"m -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 \"},\n\"v8a\":{\"x_min\":-170.140625,\"x_max\":168.78125,\"ha\":172,\"o\":\"m -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 \"},\n\"v8b\":{\"x_min\":0,\"x_max\":319.859375,\"ha\":326,\"o\":\"m 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 \"},\n\"v8c\":{\"x_min\":-330.75,\"x_max\":329.390625,\"ha\":336,\"o\":\"m -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 \"},\n\"v8d\":{\"x_min\":-1.359375,\"x_max\":255.890625,\"ha\":261,\"o\":\"m 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 \"},\n\"v8f\":{\"x_min\":-21.78125,\"x_max\":362.0625,\"ha\":369,\"o\":\"m 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 \"},\n\"v90\":{\"x_min\":-171.5,\"x_max\":483.1875,\"ha\":493,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 \"},\n\"v92\":{\"x_min\":0,\"x_max\":598.890625,\"ha\":611,\"o\":\"m 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 \"},\n\"v93\":{\"x_min\":0,\"x_max\":438.28125,\"ha\":447,\"o\":\"m 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 \"},\n\"v94\":{\"x_min\":-149.71875,\"x_max\":148.359375,\"ha\":151,\"o\":\"m -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 \"},\n\"v95\":{\"x_min\":0,\"x_max\":406.96875,\"ha\":415,\"o\":\"m 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 \"},\n\"v97\":{\"x_min\":-228.671875,\"x_max\":227.3125,\"ha\":232,\"o\":\"m -217 487 l -213 488 l 0 488 l 212 488 l 216 487 b 225 476 220 484 224 480 l 227 473 l 227 244 l 227 15 l 225 12 b 206 0 223 4 215 0 b 197 1 204 0 200 0 b 187 12 193 4 189 6 l 186 15 l 186 138 l 186 262 l -1 262 l -187 262 l -187 138 l -187 15 l -189 12 b -208 0 -193 4 -200 0 b -227 12 -216 0 -223 4 l -228 15 l -228 244 l -228 473 l -227 476 b -217 487 -225 480 -221 484 \"},\n\"v9a\":{\"x_min\":-21.78125,\"x_max\":367.5,\"ha\":375,\"o\":\"m 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 \"},\n\"v9b\":{\"x_min\":-24.5,\"x_max\":313.0625,\"ha\":319,\"o\":\"m -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 \"},\n\"v9c\":{\"x_min\":-166.0625,\"x_max\":-25.859375,\"ha\":0,\"o\":\"m -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 \"},\n\"v9e\":{\"x_min\":0,\"x_max\":607.0625,\"ha\":619,\"o\":\"m 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 \"},\n\"va3\":{\"x_min\":58.53125,\"x_max\":228.671875,\"ha\":294,\"o\":\"m 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 \"},\n\"va5\":{\"x_min\":0,\"x_max\":349.8125,\"ha\":357,\"o\":\"m 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 \"},\n\"va9\":{\"x_min\":-24.5,\"x_max\":314.421875,\"ha\":321,\"o\":\"m -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 \"},\n\"vaa\":{\"x_min\":-1.359375,\"x_max\":752.703125,\"ha\":768,\"o\":\"m 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 \"},\n\"vab\":{\"x_min\":0,\"x_max\":272.21875,\"ha\":278,\"o\":\"m 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 \"},\n\"vad\":{\"x_min\":0,\"x_max\":873.828125,\"ha\":892,\"o\":\"m 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 \"},\n\"vb1\":{\"x_min\":78.9375,\"x_max\":485.921875,\"ha\":417,\"o\":\"m 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 \"},\n\"vb3\":{\"x_min\":0,\"x_max\":227.3125,\"ha\":232,\"o\":\"m 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 \"},\n\"vb4\":{\"x_min\":-597.53125,\"x_max\":596.171875,\"ha\":608,\"o\":\"m -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 \"},\n\"vb6\":{\"x_min\":0,\"x_max\":556.6875,\"ha\":568,\"o\":\"m 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 \"},\n\"vb7\":{\"x_min\":-176.9375,\"x_max\":251.8125,\"ha\":257,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 \"},\n\"vb9\":{\"x_min\":-122.5,\"x_max\":121.140625,\"ha\":124,\"o\":\"m -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 \"},\n\"vba\":{\"x_min\":-118.421875,\"x_max\":597.53125,\"ha\":381,\"o\":\"m 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 \"},\n\"vbf\":{\"x_min\":-53.078125,\"x_max\":513.140625,\"ha\":485,\"o\":\"m 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 \"},\n\"vc3\":{\"x_min\":-10.890625,\"x_max\":299.4375,\"ha\":294,\"o\":\"m 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 \"},\n\"vd0\":{\"x_min\":-10.890625,\"x_max\":299.4375,\"ha\":294,\"o\":\"m 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 \"},\n\"vd1\":{\"x_min\":-20,\"x_max\":320,\"ha\":257,\"o\":\"m -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 \"},\n\"vd2\":{\"x_min\":0,\"x_max\":430.75,\"ha\":386,\"o\":\"m 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 \"},\n\"vd3\":{\"x_min\":0,\"x_max\":430.75,\"ha\":386,\"o\":\"m 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 \"},\n\"vd4\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 \"},\n\"vd5\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100\"},\n\"vd6\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z \"},\n\"vd7\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z \"},\n},\n\"cssFontWeight\":\"normal\",\"ascender\":1903,\"underlinePosition\":-125,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-2065.375,\"xMin\":-695.53125,\"yMax\":1901.578125,\"xMax\":1159.671875},\n\"resolution\":1000,\"descender\":-2066,\"familyName\":\"VexFlow-18\",\"lineHeight\":4093,\"underlineThickness\":50\n};\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { BoundingBox } from './boundingbox';\nimport { Font } from './fonts/vexflow_font';\n\nfunction processOutline(outline, originX, originY, scaleX, scaleY, outlineFns) {\n let command;\n let x;\n let y;\n let i = 0;\n\n function nextX() { return originX + outline[i++] * scaleX; }\n function nextY() { return originY + outline[i++] * scaleY; }\n\n while (i < outline.length) {\n command = outline[i++];\n switch (command) {\n case 'm':\n case 'l':\n outlineFns[command](nextX(), nextY());\n break;\n case 'q':\n x = nextX();\n y = nextY();\n outlineFns.q(nextX(), nextY(), x, y);\n break;\n case 'b':\n x = nextX();\n y = nextY();\n outlineFns.b(nextX(), nextY(), nextX(), nextY(), x, y);\n break;\n default:\n break;\n }\n }\n}\n\nexport class Glyph extends Element {\n /* Static methods used to implement loading / unloading of glyphs */\n static loadMetrics(font, code, cache) {\n const glyph = font.glyphs[code];\n if (!glyph) {\n throw new Vex.RERR('BadGlyph', `Glyph ${code} does not exist in font.`);\n }\n\n const x_min = glyph.x_min;\n const x_max = glyph.x_max;\n const ha = glyph.ha;\n\n let outline;\n\n if (glyph.o) {\n if (cache) {\n if (glyph.cached_outline) {\n outline = glyph.cached_outline;\n } else {\n outline = glyph.o.split(' ');\n glyph.cached_outline = outline;\n }\n } else {\n if (glyph.cached_outline) delete glyph.cached_outline;\n outline = glyph.o.split(' ');\n }\n\n return {\n x_min,\n x_max,\n ha,\n outline,\n };\n } else {\n throw new Vex.RERR('BadGlyph', `Glyph ${code} has no outline defined.`);\n }\n }\n\n /**\n * A quick and dirty static glyph renderer. Renders glyphs from the default\n * font defined in Vex.Flow.Font.\n *\n * @param {!Object} ctx The canvas context.\n * @param {number} x_pos X coordinate.\n * @param {number} y_pos Y coordinate.\n * @param {number} point The point size to use.\n * @param {string} val The glyph code in Vex.Flow.Font.\n * @param {boolean} nocache If set, disables caching of font outline.\n */\n static renderGlyph(ctx, x_pos, y_pos, point, val, nocache) {\n const scale = point * 72.0 / (Font.resolution * 100.0);\n const metrics = Glyph.loadMetrics(Font, val, !nocache);\n Glyph.renderOutline(ctx, metrics.outline, scale, x_pos, y_pos);\n }\n\n static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n ctx.beginPath();\n ctx.moveTo(x_pos, y_pos);\n processOutline(outline, x_pos, y_pos, scale, -scale, {\n m: ctx.moveTo.bind(ctx),\n l: ctx.lineTo.bind(ctx),\n q: ctx.quadraticCurveTo.bind(ctx),\n b: ctx.bezierCurveTo.bind(ctx),\n });\n ctx.fill();\n }\n\n static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n const bboxComp = new BoundingBoxComputation();\n\n processOutline(outline, x_pos, y_pos, scale, -scale, {\n m: bboxComp.addPoint.bind(bboxComp),\n l: bboxComp.addPoint.bind(bboxComp),\n q: bboxComp.addQuadraticCurve.bind(bboxComp),\n b: bboxComp.addBezierCurve.bind(bboxComp),\n });\n\n return new BoundingBox(\n bboxComp.x1,\n bboxComp.y1,\n bboxComp.width(),\n bboxComp.height()\n );\n }\n\n /**\n * @constructor\n */\n constructor(code, point, options) {\n super();\n this.setAttribute('type', 'Glyph');\n\n this.code = code;\n this.point = point;\n this.options = {\n cache: true,\n font: Font,\n };\n\n this.metrics = null;\n this.x_shift = 0;\n this.y_shift = 0;\n\n this.originShift = {\n x: 0,\n y: 0,\n };\n\n if (options) {\n this.setOptions(options);\n } else {\n this.reset();\n }\n }\n\n setOptions(options) {\n Vex.Merge(this.options, options);\n this.reset();\n }\n\n setPoint(point) { this.point = point; return this; }\n setStave(stave) { this.stave = stave; return this; }\n setXShift(x_shift) { this.x_shift = x_shift; return this; }\n setYShift(y_shift) { this.y_shift = y_shift; return this; }\n\n reset() {\n this.scale = this.point * 72 / (this.options.font.resolution * 100);\n this.metrics = Glyph.loadMetrics(\n this.options.font,\n this.code,\n this.options.cache\n );\n this.bbox = Glyph.getOutlineBoundingBox(\n this.metrics.outline,\n this.scale,\n 0,\n 0\n );\n }\n\n getMetrics() {\n if (!this.metrics) {\n throw new Vex.RuntimeError('BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n\n return {\n x_min: this.metrics.x_min * this.scale,\n x_max: this.metrics.x_max * this.scale,\n width: this.bbox.getW(),\n height: this.bbox.getH(),\n };\n }\n\n setOriginX(x) {\n const { bbox } = this;\n const originX = Math.abs(bbox.getX() / bbox.getW());\n const xShift = (x - originX) * bbox.getW();\n this.originShift.x = -xShift;\n }\n\n setOriginY(y) {\n const { bbox } = this;\n const originY = Math.abs(bbox.getY() / bbox.getH());\n const yShift = (y - originY) * bbox.getH();\n this.originShift.y = -yShift;\n }\n\n setOrigin(x, y) {\n this.setOriginX(x);\n this.setOriginY(y);\n }\n\n render(ctx, x, y) {\n if (!this.metrics) {\n throw new Vex.RuntimeError('BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n\n const outline = this.metrics.outline;\n const scale = this.scale;\n\n this.setRendered();\n this.applyStyle(ctx);\n Glyph.renderOutline(ctx, outline, scale, x + this.originShift.x, y + this.originShift.y);\n this.restoreStyle(ctx);\n }\n\n renderToStave(x) {\n this.checkContext();\n\n if (!this.metrics) {\n throw new Vex.RuntimeError('BadGlyph', `Glyph ${this.code} is not initialized.`);\n }\n\n if (!this.stave) {\n throw new Vex.RuntimeError('GlyphError', 'No valid stave');\n }\n\n const outline = this.metrics.outline;\n const scale = this.scale;\n\n this.setRendered();\n this.applyStyle();\n Glyph.renderOutline(this.context, outline, scale,\n x + this.x_shift, this.stave.getYForGlyphs() + this.y_shift);\n this.restoreStyle();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\n/* eslint-disable key-spacing */\n\nimport { Vex } from './vex';\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\n\nconst Flow = {\n STEM_WIDTH: 1.5,\n STEM_HEIGHT: 35,\n STAVE_LINE_THICKNESS: 1,\n RESOLUTION: 16384,\n DEFAULT_NOTATION_FONT_SCALE: 39,\n DEFAULT_TABLATURE_FONT_SCALE: 39,\n SLASH_NOTEHEAD_WIDTH: 15,\n\n // HACK:\n // Since text origins are positioned at the baseline, we must\n // compensate for the ascender of the text. Of course, 1 staff space is\n // a very poor approximation.\n //\n // This will be deprecated in the future. This is a temporary solution until\n // we have more robust text metrics.\n TEXT_HEIGHT_OFFSET_HACK: 1,\n\n /* Kerning (DEPRECATED) */\n IsKerned: true,\n};\n\n\nFlow.clefProperties = clef => {\n if (!clef) throw new Vex.RERR('BadArgument', 'Invalid clef: ' + clef);\n\n const props = Flow.clefProperties.values[clef];\n if (!props) throw new Vex.RERR('BadArgument', 'Invalid clef: ' + clef);\n\n return props;\n};\n\nFlow.clefProperties.values = {\n 'treble': { line_shift: 0 },\n 'bass': { line_shift: 6 },\n 'tenor': { line_shift: 4 },\n 'alto': { line_shift: 3 },\n 'soprano': { line_shift: 1 },\n 'percussion': { line_shift: 0 },\n 'mezzo-soprano': { line_shift: 2 },\n 'baritone-c': { line_shift: 5 },\n 'baritone-f': { line_shift: 5 },\n 'subbass': { line_shift: 7 },\n 'french': { line_shift: -1 },\n};\n\n/*\n Take a note in the format \"Key/Octave\" (e.g., \"C/5\") and return properties.\n\n The last argument, params, is a struct the currently can contain one option,\n octave_shift for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n*/\nFlow.keyProperties = (key, clef, params) => {\n if (clef === undefined) {\n clef = 'treble';\n }\n\n const options = { octave_shift: 0 };\n\n if (typeof params === 'object') {\n Vex.Merge(options, params);\n }\n\n const pieces = key.split('/');\n\n if (pieces.length < 2) {\n throw new Vex.RERR('BadArguments', `Key must have note + octave and an optional glyph: ${key}`);\n }\n\n const k = pieces[0].toUpperCase();\n const value = Flow.keyProperties.note_values[k];\n if (!value) throw new Vex.RERR('BadArguments', 'Invalid key name: ' + k);\n if (value.octave) pieces[1] = value.octave;\n\n let octave = parseInt(pieces[1], 10);\n\n // Octave_shift is the shift to compensate for clef 8va/8vb.\n octave += -1 * options.octave_shift;\n\n const base_index = (octave * 7) - (4 * 7);\n let line = (base_index + value.index) / 2;\n line += Flow.clefProperties(clef).line_shift;\n\n let stroke = 0;\n\n if (line <= 0 && (((line * 2) % 2) === 0)) stroke = 1; // stroke up\n if (line >= 6 && (((line * 2) % 2) === 0)) stroke = -1; // stroke down\n\n // Integer value for note arithmetic.\n const int_value = typeof (value.int_val) !== 'undefined'\n ? (octave * 12) + value.int_val\n : null;\n\n /* Check if the user specified a glyph. */\n const code = value.code;\n const shift_right = value.shift_right;\n let extraProps = {};\n if (pieces.length > 2 && pieces[2]) {\n const glyph_name = pieces[2].toUpperCase();\n extraProps = Flow.keyProperties.customNoteHeads[glyph_name] || {};\n }\n\n return {\n key: k,\n octave,\n line,\n int_value,\n accidental: value.accidental,\n code,\n stroke,\n shift_right,\n displaced: false,\n ...extraProps,\n };\n};\n\nFlow.keyProperties.note_values = {\n 'C': { index: 0, int_val: 0, accidental: null },\n 'CN': { index: 0, int_val: 0, accidental: 'n' },\n 'C#': { index: 0, int_val: 1, accidental: '#' },\n 'C##': { index: 0, int_val: 2, accidental: '##' },\n 'CB': { index: 0, int_val: -1, accidental: 'b' },\n 'CBB': { index: 0, int_val: -2, accidental: 'bb' },\n 'D': { index: 1, int_val: 2, accidental: null },\n 'DN': { index: 1, int_val: 2, accidental: 'n' },\n 'D#': { index: 1, int_val: 3, accidental: '#' },\n 'D##': { index: 1, int_val: 4, accidental: '##' },\n 'DB': { index: 1, int_val: 1, accidental: 'b' },\n 'DBB': { index: 1, int_val: 0, accidental: 'bb' },\n 'E': { index: 2, int_val: 4, accidental: null },\n 'EN': { index: 2, int_val: 4, accidental: 'n' },\n 'E#': { index: 2, int_val: 5, accidental: '#' },\n 'E##': { index: 2, int_val: 6, accidental: '##' },\n 'EB': { index: 2, int_val: 3, accidental: 'b' },\n 'EBB': { index: 2, int_val: 2, accidental: 'bb' },\n 'F': { index: 3, int_val: 5, accidental: null },\n 'FN': { index: 3, int_val: 5, accidental: 'n' },\n 'F#': { index: 3, int_val: 6, accidental: '#' },\n 'F##': { index: 3, int_val: 7, accidental: '##' },\n 'FB': { index: 3, int_val: 4, accidental: 'b' },\n 'FBB': { index: 3, int_val: 3, accidental: 'bb' },\n 'G': { index: 4, int_val: 7, accidental: null },\n 'GN': { index: 4, int_val: 7, accidental: 'n' },\n 'G#': { index: 4, int_val: 8, accidental: '#' },\n 'G##': { index: 4, int_val: 9, accidental: '##' },\n 'GB': { index: 4, int_val: 6, accidental: 'b' },\n 'GBB': { index: 4, int_val: 5, accidental: 'bb' },\n 'A': { index: 5, int_val: 9, accidental: null },\n 'AN': { index: 5, int_val: 9, accidental: 'n' },\n 'A#': { index: 5, int_val: 10, accidental: '#' },\n 'A##': { index: 5, int_val: 11, accidental: '##' },\n 'AB': { index: 5, int_val: 8, accidental: 'b' },\n 'ABB': { index: 5, int_val: 7, accidental: 'bb' },\n 'B': { index: 6, int_val: 11, accidental: null },\n 'BN': { index: 6, int_val: 11, accidental: 'n' },\n 'B#': { index: 6, int_val: 12, accidental: '#' },\n 'B##': { index: 6, int_val: 13, accidental: '##' },\n 'BB': { index: 6, int_val: 10, accidental: 'b' },\n 'BBB': { index: 6, int_val: 9, accidental: 'bb' },\n 'R': { index: 6, int_val: 9, rest: true }, // Rest\n 'X': {\n index: 6,\n accidental: '',\n octave: 4,\n code: 'v3e',\n shift_right: 5.5,\n },\n};\n\n// Custom note heads\nFlow.keyProperties.customNoteHeads = {\n /* Diamond */\n 'D0': {\n code: 'v27',\n shift_right: 0, // deprecated for stem_{up,down}_x_offset\n stem_up_x_offset: 0,\n stem_down_x_offset: 0,\n stem_up_y_offset: -1,\n stem_down_y_offset: 0\n },\n 'D1': { code: 'v2d', shift_right: -0.5 },\n 'D2': { code: 'v22', shift_right: -0.5 },\n 'D3': { code: 'v70', shift_right: -0.5 },\n\n /* Triangle */\n 'T0': { code: 'v49', shift_right: -2, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n 'T1': { code: 'v93', shift_right: 0.5, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n 'T2': { code: 'v40', shift_right: 0.5, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n 'T3': { code: 'v7d', shift_right: 0.5, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n\n /* Cross */\n 'X0': {\n code: 'v92',\n stem_up_x_offset: -2,\n stem_down_x_offset: 0,\n stem_up_y_offset: 4,\n stem_down_y_offset: 4\n },\n 'X1': { code: 'v95', shift_right: -0.5, stem_up_y_offset: 4, stem_down_y_offset: 4 },\n 'X2': { code: 'v3e', shift_right: 0.5, stem_up_y_offset: 4, stem_down_y_offset: 4 },\n 'X3': {\n code: 'v3b',\n shift_right: 0,\n stem_up_x_offset: -1.2,\n stem_down_x_offset: 0,\n stem_up_y_offset: -1,\n stem_down_y_offset: 2\n },\n\n /* Square */\n 'S1': { code: 'vd3', shift_right: 0 },\n 'S2': { code: 'vd2', shift_right: 0 },\n\n /* Rectangle */\n 'R1': { code: 'vd5', shift_right: 0 },\n 'R2': { code: 'vd4', shift_right: 0 },\n};\n\nFlow.integerToNote = integer => {\n if (typeof (integer) === 'undefined') {\n throw new Vex.RERR('BadArguments', 'Undefined integer for integerToNote');\n }\n\n if (integer < -2) {\n throw new Vex.RERR('BadArguments', `integerToNote requires integer > -2: ${integer}`);\n }\n\n const noteValue = Flow.integerToNote.table[integer];\n if (!noteValue) {\n throw new Vex.RERR('BadArguments', `Unknown note value for integer: ${integer}`);\n }\n\n return noteValue;\n};\n\nFlow.integerToNote.table = {\n 0: 'C',\n 1: 'C#',\n 2: 'D',\n 3: 'D#',\n 4: 'E',\n 5: 'F',\n 6: 'F#',\n 7: 'G',\n 8: 'G#',\n 9: 'A',\n 10: 'A#',\n 11: 'B',\n};\n\nFlow.tabToGlyph = (fret, scale = 1.0) => {\n let glyph = null;\n let width = 0;\n let shift_y = 0;\n\n if (fret.toString().toUpperCase() === 'X') {\n const glyphMetrics = new Glyph('v7f', Flow.DEFAULT_TABLATURE_FONT_SCALE).getMetrics();\n glyph = 'v7f';\n width = glyphMetrics.width;\n shift_y = -glyphMetrics.height / 2;\n } else {\n width = Flow.textWidth(fret.toString());\n }\n\n return {\n text: fret,\n code: glyph,\n getWidth: () => width * scale,\n shift_y,\n };\n};\n\nFlow.textWidth = text => 7 * text.toString().length;\n\nFlow.articulationCodes = artic => Flow.articulationCodes.articulations[artic];\n\nFlow.articulationCodes.articulations = {\n 'a.': { code: 'v23', between_lines: true }, // Staccato\n 'av': { code: 'v28', between_lines: true }, // Staccatissimo\n 'a>': { code: 'v42', between_lines: true }, // Accent\n 'a-': { code: 'v25', between_lines: true }, // Tenuto\n 'a^': { code: 'va', between_lines: false }, // Marcato\n 'a+': { code: 'v8b', between_lines: false }, // Left hand pizzicato\n 'ao': { code: 'v94', between_lines: false }, // Snap pizzicato\n 'ah': { code: 'vb9', between_lines: false }, // Natural harmonic or open note\n 'a@a': { code: 'v43', between_lines: false }, // Fermata above staff\n 'a@u': { code: 'v5b', between_lines: false }, // Fermata below staff\n 'a|': { code: 'v75', between_lines: false }, // Bow up - up stroke\n 'am': { code: 'v97', between_lines: false }, // Bow down - down stroke\n 'a,': { code: 'vb3', between_lines: false }, // Choked\n};\n\nFlow.accidentalCodes = acc => Flow.accidentalCodes.accidentals[acc];\n\nFlow.accidentalCodes.accidentals = {\n '#': { code: 'v18', parenRightPaddingAdjustment: -1 },\n '##': { code: 'v7f', parenRightPaddingAdjustment: -1 },\n 'b': { code: 'v44', parenRightPaddingAdjustment: -2 },\n 'bb': { code: 'v26', parenRightPaddingAdjustment: -2 },\n 'n': { code: 'v4e', parenRightPaddingAdjustment: -1 },\n '{': { code: 'v9c', parenRightPaddingAdjustment: -1 },\n '}': { code: 'v84', parenRightPaddingAdjustment: -1 },\n 'db': { code: 'v9e', parenRightPaddingAdjustment: -1 },\n 'd': { code: 'vab', parenRightPaddingAdjustment: 0 },\n 'bbs': { code: 'v90', parenRightPaddingAdjustment: -1 },\n '++': { code: 'v51', parenRightPaddingAdjustment: -1 },\n '+': { code: 'v78', parenRightPaddingAdjustment: -1 },\n '+-': { code: 'v8d', parenRightPaddingAdjustment: -1 },\n '++-': { code: 'v7a', parenRightPaddingAdjustment: -1 },\n 'bs': { code: 'vb7', parenRightPaddingAdjustment: -1 },\n 'bss': { code: 'v39', parenRightPaddingAdjustment: -1 },\n 'o': { code: 'vd0', parenRightPaddingAdjustment: -1 },\n 'k': { code: 'vd1', parenRightPaddingAdjustment: -1 },\n 'ashs': { code: 'vd6', parenRightPaddingAdjustment: -1 }, // arabic sharp half sharp\n 'afhf': { code: 'vd7', parenRightPaddingAdjustment: -1 }, // arabic flat half flat\n};\n\nFlow.accidentalColumnsTable = {\n 1: {\n a: [1],\n b: [1],\n },\n 2: {\n a: [1, 2],\n },\n 3: {\n a: [1, 3, 2],\n b: [1, 2, 1],\n second_on_bottom: [1, 2, 3],\n },\n 4: {\n a: [1, 3, 4, 2],\n b: [1, 2, 3, 1],\n spaced_out_tetrachord: [1, 2, 1, 2],\n },\n 5: {\n a: [1, 3, 5, 4, 2],\n b: [1, 2, 4, 3, 1],\n spaced_out_pentachord: [1, 2, 3, 2, 1],\n very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n },\n 6: {\n a: [1, 3, 5, 6, 4, 2],\n b: [1, 2, 4, 5, 3, 1],\n spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n },\n};\n\nFlow.ornamentCodes = acc => Flow.ornamentCodes.ornaments[acc];\n\nFlow.ornamentCodes.ornaments = {\n 'mordent': { code: 'v1e' },\n 'mordent_inverted': { code: 'v45' },\n 'turn': { code: 'v72' },\n 'turn_inverted': { code: 'v33' },\n 'tr': { code: 'v1f' },\n 'upprall': { code: 'v60' },\n 'downprall': { code: 'vb4' },\n 'prallup': { code: 'v6d' },\n 'pralldown': { code: 'v2c' },\n 'upmordent': { code: 'v29' },\n 'downmordent': { code: 'v68' },\n 'lineprall': { code: 'v20' },\n 'prallprall': { code: 'v86' },\n};\n\nFlow.keySignature = spec => {\n const keySpec = Flow.keySignature.keySpecs[spec];\n\n if (!keySpec) {\n throw new Vex.RERR('BadKeySignature', `Bad key signature spec: '${spec}'`);\n }\n\n if (!keySpec.acc) {\n return [];\n }\n\n const notes = Flow.keySignature.accidentalList(keySpec.acc);\n\n const acc_list = [];\n for (let i = 0; i < keySpec.num; ++i) {\n const line = notes[i];\n acc_list.push({ type: keySpec.acc, line });\n }\n\n return acc_list;\n};\n\nFlow.keySignature.keySpecs = {\n 'C': { acc: null, num: 0 },\n 'Am': { acc: null, num: 0 },\n 'F': { acc: 'b', num: 1 },\n 'Dm': { acc: 'b', num: 1 },\n 'Bb': { acc: 'b', num: 2 },\n 'Gm': { acc: 'b', num: 2 },\n 'Eb': { acc: 'b', num: 3 },\n 'Cm': { acc: 'b', num: 3 },\n 'Ab': { acc: 'b', num: 4 },\n 'Fm': { acc: 'b', num: 4 },\n 'Db': { acc: 'b', num: 5 },\n 'Bbm': { acc: 'b', num: 5 },\n 'Gb': { acc: 'b', num: 6 },\n 'Ebm': { acc: 'b', num: 6 },\n 'Cb': { acc: 'b', num: 7 },\n 'Abm': { acc: 'b', num: 7 },\n 'G': { acc: '#', num: 1 },\n 'Em': { acc: '#', num: 1 },\n 'D': { acc: '#', num: 2 },\n 'Bm': { acc: '#', num: 2 },\n 'A': { acc: '#', num: 3 },\n 'F#m': { acc: '#', num: 3 },\n 'E': { acc: '#', num: 4 },\n 'C#m': { acc: '#', num: 4 },\n 'B': { acc: '#', num: 5 },\n 'G#m': { acc: '#', num: 5 },\n 'F#': { acc: '#', num: 6 },\n 'D#m': { acc: '#', num: 6 },\n 'C#': { acc: '#', num: 7 },\n 'A#m': { acc: '#', num: 7 },\n};\n\nFlow.unicode = {\n // Unicode accidentals\n 'sharp': String.fromCharCode(parseInt('266F', 16)),\n 'flat': String.fromCharCode(parseInt('266D', 16)),\n 'natural': String.fromCharCode(parseInt('266E', 16)),\n // Major Chord\n 'triangle': String.fromCharCode(parseInt('25B3', 16)),\n // half-diminished\n 'o-with-slash': String.fromCharCode(parseInt('00F8', 16)),\n // Diminished\n 'degrees': String.fromCharCode(parseInt('00B0', 16)),\n 'circle': String.fromCharCode(parseInt('25CB', 16)),\n};\n\nFlow.keySignature.accidentalList = (acc) => {\n const patterns = {\n 'b': [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n };\n\n return patterns[acc];\n};\n\nFlow.parseNoteDurationString = durationString => {\n if (typeof (durationString) !== 'string') {\n return null;\n }\n\n const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n\n const result = regexp.exec(durationString);\n if (!result) {\n return null;\n }\n\n const duration = result[1];\n const dots = result[2].length;\n let type = result[3];\n\n if (type.length === 0) {\n type = 'n';\n }\n\n return {\n duration,\n dots,\n type,\n };\n};\n\nFlow.parseNoteStruct = noteStruct => {\n const duration = noteStruct.duration;\n\n // Preserve backwards-compatibility\n const durationStringData = Flow.parseNoteDurationString(duration);\n if (!durationStringData) {\n return null;\n }\n\n let ticks = Flow.durationToTicks(durationStringData.duration);\n if (ticks == null) {\n return null;\n }\n\n let type = noteStruct.type;\n const customTypes = [];\n\n if (type) {\n if (!Flow.getGlyphProps.validTypes[type]) {\n return null;\n }\n } else {\n type = durationStringData.type || 'n';\n\n // If we have keys, try and check if we've got a custom glyph\n if (noteStruct.keys !== undefined) {\n noteStruct.keys.forEach((k, i) => {\n const result = k.split('/');\n // We have a custom glyph specified after the note eg. /X2\n if (result && result.length === 3) {\n customTypes[i] = result[2];\n }\n });\n }\n }\n\n const dots = noteStruct.dots ? noteStruct.dots : durationStringData.dots;\n\n if (typeof (dots) !== 'number') {\n return null;\n }\n\n let currentTicks = ticks;\n\n for (let i = 0; i < dots; i++) {\n if (currentTicks <= 1) return null;\n\n currentTicks = currentTicks / 2;\n ticks += currentTicks;\n }\n\n return {\n duration: durationStringData.duration,\n type,\n customTypes,\n dots,\n ticks,\n };\n};\n\n// Used to convert duration aliases to the number based duration.\n// If the input isn't an alias, simply return the input.\n//\n// example: 'q' -> '4', '8' -> '8'\nFlow.sanitizeDuration = duration => {\n const alias = Flow.durationAliases[duration];\n if (alias !== undefined) {\n duration = alias;\n }\n\n if (Flow.durationToTicks.durations[duration] === undefined) {\n throw new Vex.RERR('BadArguments', `The provided duration is not valid: ${duration}`);\n }\n\n return duration;\n};\n\n// Convert the `duration` to an fraction\nFlow.durationToFraction = duration => new Fraction().parse(Flow.sanitizeDuration(duration));\n\n// Convert the `duration` to an number\nFlow.durationToNumber = duration => Flow.durationToFraction(duration).value();\n\n// Convert the `duration` to total ticks\nFlow.durationToTicks = duration => {\n duration = Flow.sanitizeDuration(duration);\n\n const ticks = Flow.durationToTicks.durations[duration];\n if (ticks === undefined) {\n return null;\n }\n\n return ticks;\n};\n\nFlow.durationToTicks.durations = {\n '1/2': Flow.RESOLUTION * 2,\n '1': Flow.RESOLUTION / 1,\n '2': Flow.RESOLUTION / 2,\n '4': Flow.RESOLUTION / 4,\n '8': Flow.RESOLUTION / 8,\n '16': Flow.RESOLUTION / 16,\n '32': Flow.RESOLUTION / 32,\n '64': Flow.RESOLUTION / 64,\n '128': Flow.RESOLUTION / 128,\n '256': Flow.RESOLUTION / 256,\n};\n\nFlow.durationAliases = {\n 'w': '1',\n 'h': '2',\n 'q': '4',\n\n // This is the default duration used to render bars (BarNote). Bars no longer\n // consume ticks, so this should be a no-op.\n //\n // TODO(0xfe): This needs to be cleaned up.\n 'b': '256',\n};\n\n// Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\nFlow.getGlyphProps = (duration, type) => {\n duration = Flow.sanitizeDuration(duration);\n\n const code = Flow.getGlyphProps.duration_codes[duration];\n if (code === undefined) {\n return null;\n }\n\n if (!type) {\n type = 'n';\n }\n\n let glyphTypeProperties = code.type[type];\n\n if (glyphTypeProperties === undefined) {\n // Try and get it from the custom list of note heads\n const customGlyphTypeProperties = Flow.keyProperties.customNoteHeads[type.toUpperCase()];\n\n // If not, then return with nothing\n if (customGlyphTypeProperties === undefined) {\n return null;\n }\n\n // Otherwise set it as the code_head value\n glyphTypeProperties = {\n code_head: customGlyphTypeProperties.code,\n ...customGlyphTypeProperties,\n };\n }\n\n return { ...code.common, ...glyphTypeProperties };\n};\n\nFlow.getGlyphProps.validTypes = {\n 'n': { name: 'note' },\n 'r': { name: 'rest' },\n 'h': { name: 'harmonic' },\n 'm': { name: 'muted' },\n 's': { name: 'slash' },\n};\n\nFlow.getGlyphProps.duration_codes = {\n '1/2': {\n common: {\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'v53', scale).getMetrics().width;\n },\n stem: false,\n stem_offset: 0,\n flag: false,\n stem_up_extension: -Flow.STEM_HEIGHT,\n stem_down_extension: -Flow.STEM_HEIGHT,\n tabnote_stem_up_extension: -Flow.STEM_HEIGHT,\n tabnote_stem_down_extension: -Flow.STEM_HEIGHT,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Breve note\n code_head: 'v53',\n },\n 'h': { // Breve note harmonic\n code_head: 'v59',\n },\n 'm': { // Breve note muted -\n code_head: 'vf',\n stem_offset: 0,\n },\n 'r': { // Breve rest\n code_head: 'v31',\n rest: true,\n position: 'B/5',\n dot_shiftY: 0.5,\n },\n 's': { // Breve note slash -\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '1': {\n common: {\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'v1d', scale).getMetrics().width;\n },\n stem: false,\n stem_offset: 0,\n flag: false,\n stem_up_extension: -Flow.STEM_HEIGHT,\n stem_down_extension: -Flow.STEM_HEIGHT,\n tabnote_stem_up_extension: -Flow.STEM_HEIGHT,\n tabnote_stem_down_extension: -Flow.STEM_HEIGHT,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Whole note\n code_head: 'v1d',\n },\n 'h': { // Whole note harmonic\n code_head: 'v46',\n },\n 'm': { // Whole note muted\n code_head: 'v92',\n stem_offset: -3,\n },\n 'r': { // Whole rest\n code_head: 'v5c',\n rest: true,\n position: 'D/5',\n dot_shiftY: 0.5,\n },\n 's': { // Whole note slash\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '2': {\n common: {\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'v81', scale).getMetrics().width;\n },\n stem: true,\n stem_offset: 0,\n flag: false,\n stem_up_extension: 0,\n stem_down_extension: 0,\n tabnote_stem_up_extension: 0,\n tabnote_stem_down_extension: 0,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Half note\n code_head: 'v81',\n },\n 'h': { // Half note harmonic\n code_head: 'v2d',\n },\n 'm': { // Half note muted\n code_head: 'v95',\n stem_offset: -3,\n },\n 'r': { // Half rest\n code_head: 'vc',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n },\n 's': { // Half note slash\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '4': {\n common: {\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n },\n stem: true,\n stem_offset: 0,\n flag: false,\n stem_up_extension: 0,\n stem_down_extension: 0,\n tabnote_stem_up_extension: 0,\n tabnote_stem_down_extension: 0,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Quarter note\n code_head: 'vb',\n },\n 'h': { // Quarter harmonic\n code_head: 'v22',\n },\n 'm': { // Quarter muted\n code_head: 'v3e',\n stem_offset: -3,\n },\n 'r': { // Quarter rest\n code_head: 'v7c',\n stem: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.5,\n line_below: 1.5,\n },\n 's': { // Quarter slash\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '8': {\n common: {\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n },\n stem: true,\n stem_offset: 0,\n flag: true,\n beam_count: 1,\n code_flag_upstem: 'v54',\n code_flag_downstem: 'v9a',\n stem_up_extension: 0,\n stem_down_extension: 0,\n tabnote_stem_up_extension: 0,\n tabnote_stem_down_extension: 0,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Eighth note\n code_head: 'vb',\n },\n 'h': { // Eighth note harmonic\n code_head: 'v22',\n },\n 'm': { // Eighth note muted\n code_head: 'v3e',\n },\n 'r': { // Eighth rest\n code_head: 'va5',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 1.0,\n },\n 's': { // Eight slash\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '16': {\n common: {\n beam_count: 2,\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n },\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'v3f',\n code_flag_downstem: 'v8f',\n stem_up_extension: 0,\n stem_down_extension: 0,\n tabnote_stem_up_extension: 0,\n tabnote_stem_down_extension: 0,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Sixteenth note\n code_head: 'vb',\n },\n 'h': { // Sixteenth note harmonic\n code_head: 'v22',\n },\n 'm': { // Sixteenth note muted\n code_head: 'v3e',\n },\n 'r': { // Sixteenth rest\n code_head: 'v3c',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -0.5,\n line_above: 1.0,\n line_below: 2.0,\n },\n 's': { // Sixteenth slash\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '32': {\n common: {\n beam_count: 3,\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n },\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'v47',\n code_flag_downstem: 'v2a',\n stem_up_extension: 9,\n stem_down_extension: 9,\n tabnote_stem_up_extension: 8,\n tabnote_stem_down_extension: 5,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Thirty-second note\n code_head: 'vb',\n },\n 'h': { // Thirty-second harmonic\n code_head: 'v22',\n },\n 'm': { // Thirty-second muted\n code_head: 'v3e',\n },\n 'r': { // Thirty-second rest\n code_head: 'v55',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 2.0,\n },\n 's': { // Thirty-second slash\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '64': {\n common: {\n beam_count: 4,\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n },\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'va9',\n code_flag_downstem: 'v58',\n stem_up_extension: 13,\n stem_down_extension: 13,\n tabnote_stem_up_extension: 12,\n tabnote_stem_down_extension: 9,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Sixty-fourth note\n code_head: 'vb',\n },\n 'h': { // Sixty-fourth harmonic\n code_head: 'v22',\n },\n 'm': { // Sixty-fourth muted\n code_head: 'v3e',\n },\n 'r': { // Sixty-fourth rest\n code_head: 'v38',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: -1.5,\n line_above: 2.0,\n line_below: 3.0,\n },\n 's': { // Sixty-fourth slash\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n '128': {\n common: {\n beam_count: 5,\n getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n },\n stem: true,\n stem_offset: 0,\n flag: true,\n code_flag_upstem: 'v9b',\n code_flag_downstem: 'v30',\n stem_up_extension: 22,\n stem_down_extension: 22,\n tabnote_stem_up_extension: 21,\n tabnote_stem_down_extension: 18,\n dot_shiftY: 0,\n line_above: 0,\n line_below: 0,\n },\n type: {\n 'n': { // Hundred-twenty-eight note\n code_head: 'vb',\n },\n 'h': { // Hundred-twenty-eight harmonic\n code_head: 'v22',\n },\n 'm': { // Hundred-twenty-eight muted\n code_head: 'v3e',\n },\n 'r': { // Hundred-twenty-eight rest\n code_head: 'vaa',\n stem: false,\n flag: false,\n rest: true,\n position: 'B/4',\n dot_shiftY: 1.5,\n line_above: 3.0,\n line_below: 3.0,\n },\n 's': { // Hundred-twenty-eight rest\n // Drawn with canvas primitives\n getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n position: 'B/4',\n },\n },\n },\n};\n\n// For future collaboration with the SMuFL Standard Music Font Layout\n\nFlow.smufl = {};\n\n// add references between smufl glyph names and code points.\nFlow.smufl.to_code_points = {\n // staff brackets and dividers (e000-e00f)\n bracketTop: 'v1b',\n bracketBottom: 'v10',\n\n // barlines (e030-e03f)\n barlineTick: 'v6f',\n\n // repeats (e040-e04f)\n segno: 'v8c',\n coda: 'v4d',\n\n // clefs (e050-e07f)\n gClef: 'v83',\n cClef: 'vad',\n fClef: 'v79',\n unpitchedPercussionClef1: 'v59', // same as breveNoteheadHarmonic\n '6stringTabClef': 'v2f',\n\n // time signatures (e080-e09f)\n timeSig0: 'v0',\n timeSig1: 'v1',\n timeSig2: 'v2',\n timeSig3: 'v3',\n timeSig4: 'v4',\n timeSig5: 'v5',\n timeSig6: 'v6',\n timeSig7: 'v7',\n timeSig8: 'v8',\n timeSig9: 'v9',\n timeSigCommon: 'v41',\n timeSigCutCommon: 'vb6',\n\n // notehead (e0a0-e0ff)\n noteheadDoubleWhole: 'v53',\n noteheadWhole: 'v1d',\n noteheadHalf: 'v81',\n noteheadBlack: 'vb',\n noteheadXWhole: 'v92',\n noteheadXHalf: 'v95',\n noteheadXBlack: 'v3e',\n noteheadCircleX: 'v3b',\n noteheadTriangleUpWhole: 'v49',\n noteheadTriangleUpHalf: 'v93',\n noteheadTriangleUpBlack: 'v40',\n noteheadDiamondWhole: 'v46',\n noteheadDiamondHalf: 'v2d',\n noteheadDiamondBlack: 'v22',\n\n // individual notes (e1d0-e1ef)\n augmentationDot: 'v23',\n\n // temolos (e220-e23f)\n tremolo1: 'v74',\n\n // flags (e240-e25f)\n flag8thUp: 'v54',\n flag8thDown: 'v9a',\n flag16thUp: 'v3f',\n flag16thDown: 'v8f',\n flag32ndUp: 'v47',\n flag32ndDown: 'v2a',\n flag64thUp: 'va9',\n flag64thDown: 'v58',\n flag128thUp: 'v9b',\n flag128thDown: 'v30',\n\n // standard accidentals (e260-e26f)\n accidentalFlat: 'v44',\n accidentalNatural: 'v4e',\n accidentalSharp: 'v18',\n accidentalDoubleSharp: 'v7f',\n accidentalDoubleFlat: 'v26',\n accidentalParensLeft: 'v9c',\n accidentalParensRight: 'v84',\n\n // stein-zimmermann accidentals (24-edo) (e280-e28f)\n accidentalQuarterToneFlatStein: 'vab',\n accidentalThreeQuarterTonesFlatZimmermann: 'v9e',\n accidentalQuarterToneSharpStein: 'v78',\n accidentalThreeQuarterTonesSharpStein: 'v51',\n\n // arel-ezgi-uzdilek accidentals (e440-e44f)\n accidentalBuyukMucennebFlat: 'v39',\n accidentalBakiyeFlat: 'vb7',\n accidentalKomaSharp: 'v51', // same as accidentalQuarterToneSharpStein\n accidentalKucukMucennebSharp: 'v8d',\n\n // persian accidentals (e460-e46f)\n accidentalKoron: 'vd1',\n accidentalSori: 'vd0',\n\n // articulation (e4a0-e4bf)\n articAccentAbove: 'v42',\n articAccentBelow: 'v42', // same as above\n articTenutoAbove: 'v25',\n articTenutoBelow: 'v25', // same as above\n articStaccatoAbove: 'v23', // = dot\n articStaccatoBelow: 'v23', // = dot\n articStaccatissimoAbove: 'v28',\n articMarcatoAbove: 'va',\n\n // holds and pauses (e4c0-e4df)\n fermataAbove: 'v43',\n fermataBelow: 'v5b',\n breathMarkComma: 'v6c',\n breathMarkUpbow: 'v8a', // looks better than current upbow\n caesura: 'v34',\n caesuraCurved: 'v4b',\n\n // rests (e4e0-e4ff)\n restMaxima: 'v59', // not designed for this, but should do the trick\n // need restLonga -- used in multimeasure rests, like above\n restDoubleWhole: 'v31',\n restWhole: 'v5c',\n restHalf: 'vc',\n restQuarter: 'v7c',\n rest8th: 'va5',\n rest16th: 'v3c',\n rest32nd: 'v55',\n rest64th: 'v38',\n rest128th: 'vaa',\n\n // dynamics (e520-e54f)\n dynamicPiano: 'vbf',\n dynamicMezzo: 'v62',\n dynamicForte: 'vba',\n dynamicRinforzando: 'vba',\n dynamicSforzando: 'v4a',\n dynamicZ: 'v80',\n\n // common ornaments (e560-e56f)\n ornamentTrill: 'v1f',\n ornamentTurn: 'v72',\n ornamentTurnSlash: 'v33',\n ornamentMordent: 'v45',\n ornamentMordentInverted: 'v1e',\n ornamentTremblement: 'v86',\n\n // precomposed trills and mordents (e5b0-e5cf)\n ornamentPrecompAppoggTrill: 'v20',\n ornamentPrecompSlideTrillDAnglebert: 'v60',\n ornamentPrecompSlideTrillBach: 'v29',\n ornamentPrecompTrillSuffixDandrieu: 'v6d',\n ornamentPrecompDoubleCadenceUpperPrefix: 'vb4',\n ornamentPrecompDoubleCadenceUpperPrefixTurn: 'v68',\n ornamentPrecompTrillLowerSuffix: 'v2c',\n\n // string techniques (e610-e62f)\n stringsDownBow: 'v94',\n stringsUpBow: 'v75',\n stringsHarmonic: 'vb9',\n\n // plucked techniques (e630-e63f)\n pluckedSnapPizzicatoAbove: 'v94',\n pluckedLeftHandPizzicato: 'v8b', // plus sign\n\n // keyboard techniques (e650-e67f)\n keyboardPedalPed: 'v36',\n keyboardPedalUp: 'v5d',\n\n // percussion playing technique pictograms (e7f0-e80f)\n pictChokeCymbal: 'vb3',\n\n // multi-segment lines (eaa0-eb0f)\n wiggleArpeggiatoUp: 'va3', // rotated 90deg from reference implementation\n\n // arrows and arrowheads (eb60-eb8f)\n arrowheadBlackUp: 'vc3',\n arrowheadBlackDown: 'v52',\n\n // not found:\n // noteheadDiamondWhole: 'v27', stylistic alternate to v46?\n // noteheadDiamondBlack: 'v70', stylistic alternate to v22?\n // noteheadTriangleUpBlack: 'v7d', stylistic alternate to v40?\n // accidentalSlashedDoubleFlat: 'v90',\n // accidentalOneAndAHalfSharpTurned: 'v7a',\n // unused marcato alternative? 'v5a',\n // arpeggioBrushDown: 'v11',\n};\n\n// Some defaults\nFlow.TIME4_4 = {\n num_beats: 4,\n beat_value: 4,\n resolution: Flow.RESOLUTION,\n};\nexport { Flow };\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Mohit Muthanna \n//\n// A rendering context for the Raphael backend.\n//\n// Copyright Mohit Cheppudira 2010\n\nimport { Vex } from './vex';\n\n/** @constructor */\nexport class CanvasContext {\n static get WIDTH() {\n return 600;\n }\n static get HEIGHT() {\n return 400;\n }\n static get CANVAS_BROWSER_SIZE_LIMIT() {\n return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size\n }\n\n static SanitizeCanvasDims(width, height) {\n if (Math.max(width, height) > this.CANVAS_BROWSER_SIZE_LIMIT) {\n Vex.W(\n 'Canvas dimensions exceed browser limit. Cropping to ' +\n this.CANVAS_BROWSER_SIZE_LIMIT\n );\n if (width > this.CANVAS_BROWSER_SIZE_LIMIT) {\n width = this.CANVAS_BROWSER_SIZE_LIMIT;\n // note: Math.min return 0 for undefined, NaN for null. Would change inputs.\n }\n if (height > this.CANVAS_BROWSER_SIZE_LIMIT) {\n height = this.CANVAS_BROWSER_SIZE_LIMIT;\n }\n }\n return [width, height];\n }\n\n constructor(context) {\n // Use a name that is unlikely to clash with a canvas context\n // property\n this.vexFlowCanvasContext = context;\n if (!context.canvas) {\n this.canvas = {\n width: CanvasContext.WIDTH,\n height: CanvasContext.HEIGHT,\n };\n } else {\n this.canvas = context.canvas;\n }\n }\n\n clear() {\n this.vexFlowCanvasContext.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n\n // Containers not implemented\n openGroup() {}\n closeGroup() {}\n add() {}\n\n setFont(family, size, weight) {\n this.vexFlowCanvasContext.font = (weight || '') + ' ' + size + 'pt ' + family;\n return this;\n }\n\n setRawFont(font) {\n this.vexFlowCanvasContext.font = font;\n return this;\n }\n\n setFillStyle(style) {\n this.vexFlowCanvasContext.fillStyle = style;\n return this;\n }\n\n setBackgroundFillStyle(style) {\n this.background_fillStyle = style;\n return this;\n }\n\n setStrokeStyle(style) {\n this.vexFlowCanvasContext.strokeStyle = style;\n return this;\n }\n\n setShadowColor(style) {\n this.vexFlowCanvasContext.shadowColor = style;\n return this;\n }\n\n setShadowBlur(blur) {\n this.vexFlowCanvasContext.shadowBlur = blur;\n return this;\n }\n\n setLineWidth(width) {\n this.vexFlowCanvasContext.lineWidth = width;\n return this;\n }\n\n setLineCap(cap_type) {\n this.vexFlowCanvasContext.lineCap = cap_type;\n return this;\n }\n\n // setLineDash: is the one native method in a canvas context\n // that begins with set, therefore we don't bolster the method\n // if it already exists (see renderer.bolsterCanvasContext).\n // If it doesn't exist, we bolster it and assume it's looking for\n // a ctx.lineDash method, as previous versions of VexFlow\n // expected.\n setLineDash(dash) {\n this.vexFlowCanvasContext.lineDash = dash;\n return this;\n }\n\n scale(x, y) {\n return this.vexFlowCanvasContext.scale(parseFloat(x), parseFloat(y));\n }\n\n resize(width, height) {\n [width, height] = this.SanitizeCanvasDims(parseInt(width, 10), parseInt(height, 10));\n return this.vexFlowCanvasContext.resize(width, height);\n }\n\n rect(x, y, width, height) {\n return this.vexFlowCanvasContext.rect(x, y, width, height);\n }\n\n fillRect(x, y, width, height) {\n return this.vexFlowCanvasContext.fillRect(x, y, width, height);\n }\n\n clearRect(x, y, width, height) {\n return this.vexFlowCanvasContext.clearRect(x, y, width, height);\n }\n\n beginPath() {\n return this.vexFlowCanvasContext.beginPath();\n }\n\n moveTo(x, y) {\n return this.vexFlowCanvasContext.moveTo(x, y);\n }\n\n lineTo(x, y) {\n return this.vexFlowCanvasContext.lineTo(x, y);\n }\n\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n return this.vexFlowCanvasContext.bezierCurveTo(x1, y1, x2, y2, x, y);\n }\n\n quadraticCurveTo(x1, y1, x, y) {\n return this.vexFlowCanvasContext.quadraticCurveTo(x1, y1, x, y);\n }\n\n // This is an attempt (hack) to simulate the HTML5 canvas\n // arc method.\n arc(x, y, radius, startAngle, endAngle, antiClockwise) {\n return this.vexFlowCanvasContext.arc(x, y, radius, startAngle, endAngle, antiClockwise);\n }\n\n // Adapted from the source for Raphael's Element.glow\n glow() {\n return this.vexFlowCanvasContext.glow();\n }\n\n fill() {\n return this.vexFlowCanvasContext.fill();\n }\n\n stroke() {\n return this.vexFlowCanvasContext.stroke();\n }\n\n closePath() {\n return this.vexFlowCanvasContext.closePath();\n }\n\n measureText(text) {\n return this.vexFlowCanvasContext.measureText(text);\n }\n\n fillText(text, x, y) {\n return this.vexFlowCanvasContext.fillText(text, x, y);\n }\n\n save() {\n return this.vexFlowCanvasContext.save();\n }\n\n restore() {\n return this.vexFlowCanvasContext.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A rendering context for the Raphael backend.\n//\n// ## Warning: Deprecated for SVGContext\n// Except in instances where SVG support for IE < 9.0 is\n// needed, SVGContext is recommended.\n\nexport class RaphaelContext {\n constructor(element) {\n this.element = element;\n this.paper = Raphael(element); // eslint-disable-line\n this.path = '';\n this.pen = { x: 0, y: 0 };\n this.lineWidth = 1.0;\n this.state = {\n scale: { x: 1, y: 1 },\n font_family: 'Arial',\n font_size: 8,\n font_weight: 800,\n };\n\n this.attributes = {\n 'stroke-width': 0.3,\n 'fill': 'black',\n 'stroke': 'black',\n 'font': '10pt Arial',\n };\n\n this.background_attributes = {\n 'stroke-width': 0,\n 'fill': 'white',\n 'stroke': 'white',\n 'font': '10pt Arial',\n };\n\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n\n this.state_stack = [];\n }\n\n // Containers not implemented\n openGroup() {}\n closeGroup() {}\n add() {}\n\n setFont(family, size, weight) {\n this.state.font_family = family;\n this.state.font_size = size;\n this.state.font_weight = weight;\n this.attributes.font = (this.state.font_weight || '') + ' ' +\n (this.state.font_size * this.state.scale.x) + 'pt ' +\n this.state.font_family;\n return this;\n }\n\n setRawFont(font) {\n this.attributes.font = font;\n return this;\n }\n\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n\n setBackgroundFillStyle(style) {\n this.background_attributes.fill = style;\n this.background_attributes.stroke = style;\n return this;\n }\n\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n\n setShadowColor(style) {\n this.shadow_attributes.color = style;\n return this;\n }\n\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n }\n\n // Empty because there is no equivalent in SVG\n setLineDash() { return this; }\n setLineCap() { return this; }\n\n scale(x, y) {\n this.state.scale = { x, y };\n // The scale() method is deprecated as of Raphael.JS 2.0, and\n // can no longer be used as an option in an Element.attr() call.\n // It is preserved here for users running earlier versions of\n // Raphael.JS, though it has no effect on the SVG output in\n // Raphael 2 and higher.\n this.attributes.transform = 'S' + x + ',' + y + ',0,0';\n this.attributes.scale = x + ',' + y + ',0,0';\n this.attributes.font = this.state.font_size * this.state.scale.x + 'pt ' +\n this.state.font_family;\n this.background_attributes.transform = 'S' + x + ',' + y + ',0,0';\n this.background_attributes.font = this.state.font_size *\n this.state.scale.x + 'pt ' +\n this.state.font_family;\n return this;\n }\n\n clear() { this.paper.clear(); }\n\n resize(width, height) {\n this.element.style.width = width;\n this.paper.setSize(width, height);\n return this;\n }\n\n // Sets the SVG `viewBox` property, which results in auto scaling images when its container\n // is resized.\n //\n // Usage: `ctx.setViewBox(\"0 0 600 400\")`\n setViewBox(viewBox) {\n this.paper.canvas.setAttribute('viewBox', viewBox);\n }\n\n rect(x, y, width, height) {\n if (height < 0) {\n y += height;\n height = -height;\n }\n\n this.paper.rect(x, y, width - 0.5, height - 0.5)\n .attr(this.attributes)\n .attr('fill', 'none')\n .attr('stroke-width', this.lineWidth);\n return this;\n }\n\n fillRect(x, y, width, height) {\n if (height < 0) {\n y += height;\n height = -height;\n }\n\n this.paper.rect(x, y, width - 0.5, height - 0.5).attr(this.attributes);\n return this;\n }\n\n clearRect(x, y, width, height) {\n if (height < 0) {\n y += height;\n height = -height;\n }\n\n this.paper.rect(x, y, width - 0.5, height - 0.5)\n .attr(this.background_attributes);\n return this;\n }\n\n beginPath() {\n this.path = '';\n this.pen.x = 0;\n this.pen.y = 0;\n return this;\n }\n\n moveTo(x, y) {\n this.path += 'M' + x + ',' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n lineTo(x, y) {\n this.path += 'L' + x + ',' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' +\n x1 + ',' +\n y1 + ',' +\n x2 + ',' +\n y2 + ',' +\n x + ',' +\n y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' +\n x1 + ',' +\n y1 + ',' +\n x + ',' +\n y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n // This is an attempt (hack) to simulate the HTML5 canvas\n // arc method.\n arc(x, y, radius, startAngle, endAngle, antiClockwise) {\n function normalizeAngle(angle) {\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n\n while (angle > Math.PI * 2) {\n angle -= Math.PI * 2;\n }\n return angle;\n }\n\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n\n if (startAngle > endAngle) {\n const tmp = startAngle;\n startAngle = endAngle;\n endAngle = tmp;\n antiClockwise = !antiClockwise;\n }\n\n const delta = endAngle - startAngle;\n\n if (delta > Math.PI) {\n this.arcHelper(x, y, radius, startAngle, startAngle + delta / 2, antiClockwise);\n this.arcHelper(x, y, radius, startAngle + delta / 2, endAngle, antiClockwise);\n } else {\n this.arcHelper(x, y, radius, startAngle, endAngle, antiClockwise);\n }\n return this;\n }\n\n arcHelper(x, y, radius, startAngle, endAngle, antiClockwise) {\n const x1 = x + radius * Math.cos(startAngle);\n const y1 = y + radius * Math.sin(startAngle);\n\n const x2 = x + radius * Math.cos(endAngle);\n const y2 = y + radius * Math.sin(endAngle);\n\n let largeArcFlag = 0;\n let sweepFlag = 0;\n if (antiClockwise) {\n sweepFlag = 1;\n if (endAngle - startAngle < Math.PI) {\n largeArcFlag = 1;\n }\n } else if (endAngle - startAngle > Math.PI) {\n largeArcFlag = 1;\n }\n\n this.path += 'M' + x1 + ',' + y1 + ',A' +\n radius + ',' + radius + ',0,' + largeArcFlag + ',' + sweepFlag + ',' +\n x2 + ',' + y2 + 'M' + this.pen.x + ',' + this.pen.y;\n }\n\n // Adapted from the source for Raphael's Element.glow\n glow() {\n const out = this.paper.set();\n if (this.shadow_attributes.width > 0) {\n const sa = this.shadow_attributes;\n const num_paths = sa.width / 2;\n for (let i = 1; i <= num_paths; i++) {\n out.push(this.paper.path(this.path).attr({\n stroke: sa.color,\n 'stroke-linejoin': 'round',\n 'stroke-linecap': 'round',\n 'stroke-width': +(sa.width / num_paths * i).toFixed(3),\n opacity: +((sa.opacity || 0.3) / num_paths).toFixed(3),\n // See note in this.scale(): In Raphael the scale() method\n // is deprecated and removed as of Raphael 2.0 and replaced\n // by the transform() method. It is preserved here for\n // users with earlier versions of Raphael, but has no effect\n // on the output SVG in Raphael 2.0+.\n transform: this.attributes.transform,\n scale: this.attributes.scale,\n }));\n }\n }\n return out;\n }\n\n fill() {\n const elem = this.paper.path(this.path)\n .attr(this.attributes)\n .attr('stroke-width', 0);\n this.glow(elem);\n return this;\n }\n\n stroke() {\n // The first line of code below is, unfortunately, a bit of a hack:\n // Raphael's transform() scaling does not scale the stroke-width, so\n // in order to scale a stroke, we have to manually scale the\n // stroke-width.\n //\n // This works well so long as the X & Y states for this.scale() are\n // relatively similar. However, if they are very different, we\n // would expect horizontal and vertical lines to have different\n // stroke-widths.\n //\n // In the future, if we want to support very divergent values for\n // horizontal and vertical scaling, we may want to consider\n // implementing SVG scaling with properties of the SVG viewBox &\n // viewPort and removing it entirely from the Element.attr() calls.\n // This would more closely parallel the approach taken in\n // canvascontext.js as well.\n\n const strokeWidth = this.lineWidth * (this.state.scale.x + this.state.scale.y) / 2;\n const elem = this.paper.path(this.path)\n .attr(this.attributes)\n .attr('fill', 'none')\n .attr('stroke-width', strokeWidth);\n this.glow(elem);\n return this;\n }\n\n closePath() {\n this.path += 'Z';\n return this;\n }\n\n measureText(text) {\n const txt = this.paper.text(0, 0, text)\n .attr(this.attributes)\n .attr('fill', 'none')\n .attr('stroke', 'none');\n const bounds = txt.getBBox();\n txt.remove();\n\n return {\n width: bounds.width,\n height: bounds.height,\n };\n }\n\n fillText(text, x, y) {\n this.paper\n .text(\n x + (this.measureText(text).width / 2),\n y - (this.state.font_size / (2.25 * this.state.scale.y)),\n text\n )\n .attr(this.attributes);\n\n return this;\n }\n\n save() {\n // TODO(mmuthanna): State needs to be deep-copied.\n this.state_stack.push({\n state: {\n font_family: this.state.font_family,\n },\n attributes: {\n font: this.attributes.font,\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n });\n return this;\n }\n\n restore() {\n // TODO(0xfe): State needs to be deep-restored.\n const state = this.state_stack.pop();\n this.state.font_family = state.state.font_family;\n this.attributes.font = state.attributes.font;\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Gregory Ristow (2015)\n\nimport { Vex } from './vex';\n\nconst attrNamesToIgnoreMap = {\n path: {\n x: true,\n y: true,\n width: true,\n height: true,\n },\n rect: {\n },\n text: {\n width: true,\n height: true,\n },\n};\n\n{\n const fontAttrNamesToIgnore = {\n 'font-family': true,\n 'font-weight': true,\n 'font-style': true,\n 'font-size': true,\n };\n\n Vex.Merge(attrNamesToIgnoreMap.rect, fontAttrNamesToIgnore);\n Vex.Merge(attrNamesToIgnoreMap.path, fontAttrNamesToIgnore);\n}\n\nexport class SVGContext {\n constructor(element) {\n // element is the parent DOM object\n this.element = element;\n // Create the SVG in the SVG namespace:\n this.svgNS = 'http://www.w3.org/2000/svg';\n const svg = this.create('svg');\n // Add it to the canvas:\n this.element.appendChild(svg);\n\n // Point to it:\n this.svg = svg;\n this.groups = [this.svg]; // Create the group stack\n this.parent = this.svg;\n\n this.path = '';\n this.pen = { x: NaN, y: NaN };\n this.lineWidth = 1.0;\n this.state = {\n scale: { x: 1, y: 1 },\n 'font-family': 'Arial',\n 'font-size': '8pt',\n 'font-weight': 'normal',\n };\n\n this.attributes = {\n 'stroke-width': 0.3,\n 'fill': 'black',\n 'stroke': 'black',\n 'stroke-dasharray': 'none',\n 'font-family': 'Arial',\n 'font-size': '10pt',\n 'font-weight': 'normal',\n 'font-style': 'normal',\n };\n\n this.background_attributes = {\n 'stroke-width': 0,\n 'fill': 'white',\n 'stroke': 'white',\n 'stroke-dasharray': 'none',\n 'font-family': 'Arial',\n 'font-size': '10pt',\n 'font-weight': 'normal',\n 'font-style': 'normal',\n };\n\n this.shadow_attributes = {\n width: 0,\n color: 'black',\n };\n\n this.state_stack = [];\n\n // Test for Internet Explorer\n this.iePolyfill();\n }\n\n create(svgElementType) {\n return document.createElementNS(this.svgNS, svgElementType);\n }\n\n // Allow grouping elements in containers for interactivity.\n openGroup(cls, id, attrs) {\n const group = this.create('g');\n this.groups.push(group);\n this.parent.appendChild(group);\n this.parent = group;\n if (cls) group.setAttribute('class', Vex.Prefix(cls));\n if (id) group.setAttribute('id', Vex.Prefix(id));\n\n if (attrs && attrs.pointerBBox) {\n group.setAttribute('pointer-events', 'bounding-box');\n }\n return group;\n }\n\n closeGroup() {\n this.groups.pop();\n this.parent = this.groups[this.groups.length - 1];\n }\n\n add(elem) {\n this.parent.appendChild(elem);\n }\n\n // Tests if the browser is Internet Explorer; if it is,\n // we do some tricks to improve text layout. See the\n // note at ieMeasureTextFix() for details.\n iePolyfill() {\n if (typeof (navigator) !== 'undefined') {\n this.ie = (\n /MSIE 9/i.test(navigator.userAgent) ||\n /MSIE 10/i.test(navigator.userAgent) ||\n /rv:11\\.0/i.test(navigator.userAgent) ||\n /Trident/i.test(navigator.userAgent)\n );\n }\n }\n\n // ### Styling & State Methods:\n\n setFont(family, size, weight) {\n // Unlike canvas, in SVG italic is handled by font-style,\n // not weight. So: we search the weight argument and\n // apply bold and italic to weight and style respectively.\n let bold = false;\n let italic = false;\n let style = 'normal';\n // Weight might also be a number (200, 400, etc...) so we\n // test its type to be sure we have access to String methods.\n if (typeof weight === 'string') {\n // look for \"italic\" in the weight:\n if (weight.indexOf('italic') !== -1) {\n weight = weight.replace(/italic/g, '');\n italic = true;\n }\n // look for \"bold\" in weight\n if (weight.indexOf('bold') !== -1) {\n weight = weight.replace(/bold/g, '');\n bold = true;\n }\n // remove any remaining spaces\n weight = weight.replace(/ /g, '');\n }\n weight = bold ? 'bold' : weight;\n weight = (typeof weight === 'undefined' || weight === '') ? 'normal' : weight;\n\n style = italic ? 'italic' : style;\n\n const fontAttributes = {\n 'font-family': family,\n 'font-size': size + 'pt',\n 'font-weight': weight,\n 'font-style': style,\n };\n\n // Store the font size so that if the browser is Internet\n // Explorer we can fix its calculations of text width.\n this.fontSize = Number(size);\n\n Vex.Merge(this.attributes, fontAttributes);\n Vex.Merge(this.state, fontAttributes);\n\n return this;\n }\n\n setRawFont(font) {\n font = font.trim();\n // Assumes size first, splits on space -- which is presently\n // how all existing modules are calling this.\n const fontArray = font.split(' ');\n\n this.attributes['font-family'] = fontArray[1];\n this.state['font-family'] = fontArray[1];\n\n this.attributes['font-size'] = fontArray[0];\n this.state['font-size'] = fontArray[0];\n\n // Saves fontSize for IE polyfill\n this.fontSize = Number(fontArray[0].match(/\\d+/));\n return this;\n }\n\n setFillStyle(style) {\n this.attributes.fill = style;\n return this;\n }\n\n setBackgroundFillStyle(style) {\n this.background_attributes.fill = style;\n this.background_attributes.stroke = style;\n return this;\n }\n\n setStrokeStyle(style) {\n this.attributes.stroke = style;\n return this;\n }\n\n setShadowColor(style) {\n this.shadow_attributes.color = style;\n return this;\n }\n\n setShadowBlur(blur) {\n this.shadow_attributes.width = blur;\n return this;\n }\n\n setLineWidth(width) {\n this.attributes['stroke-width'] = width;\n this.lineWidth = width;\n }\n\n // @param array {lineDash} as [dashInt, spaceInt, dashInt, spaceInt, etc...]\n setLineDash(lineDash) {\n if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n lineDash = lineDash.join(', ');\n this.attributes['stroke-dasharray'] = lineDash;\n return this;\n } else {\n throw new Vex.RERR('ArgumentError', 'lineDash must be an array of integers.');\n }\n }\n\n setLineCap(lineCap) {\n this.attributes['stroke-linecap'] = lineCap;\n return this;\n }\n\n // ### Sizing & Scaling Methods:\n\n // TODO (GCR): See note at scale() -- seperate our internal\n // conception of pixel-based width/height from the style.width\n // and style.height properties eventually to allow users to\n // apply responsive sizing attributes to the SVG.\n resize(width, height) {\n this.width = width;\n this.height = height;\n this.element.style.width = width;\n const attributes = {\n width,\n height,\n };\n this.applyAttributes(this.svg, attributes);\n this.scale(this.state.scale.x, this.state.scale.y);\n return this;\n }\n\n scale(x, y) {\n // uses viewBox to scale\n // TODO (GCR): we may at some point want to distinguish the\n // style.width / style.height properties that are applied to\n // the SVG object from our internal conception of the SVG\n // width/height. This would allow us to create automatically\n // scaling SVG's that filled their containers, for instance.\n //\n // As this isn't implemented in Canvas or Raphael contexts,\n // I've left as is for now, but in using the viewBox to\n // handle internal scaling, am trying to make it possible\n // for us to eventually move in that direction.\n\n this.state.scale = { x, y };\n const visibleWidth = this.width / x;\n const visibleHeight = this.height / y;\n this.setViewBox(0, 0, visibleWidth, visibleHeight);\n\n return this;\n }\n\n setViewBox(...args) {\n // Override for \"x y w h\" style:\n if (args.length === 1) {\n const [viewBox] = args;\n this.svg.setAttribute('viewBox', viewBox);\n } else {\n const [xMin, yMin, width, height] = args;\n const viewBoxString = xMin + ' ' + yMin + ' ' + width + ' ' + height;\n this.svg.setAttribute('viewBox', viewBoxString);\n }\n }\n\n // ### Drawing helper methods:\n\n applyAttributes(element, attributes) {\n const attrNamesToIgnore = attrNamesToIgnoreMap[element.nodeName];\n Object\n .keys(attributes)\n .forEach(propertyName => {\n if (attrNamesToIgnore && attrNamesToIgnore[propertyName]) {\n return;\n }\n element.setAttributeNS(null, propertyName, attributes[propertyName]);\n });\n\n return element;\n }\n\n // ### Shape & Path Methods:\n\n clear() {\n // Clear the SVG by removing all inner children.\n\n // (This approach is usually slightly more efficient\n // than removing the old SVG & adding a new one to\n // the container element, since it does not cause the\n // container to resize twice. Also, the resize\n // triggered by removing the entire SVG can trigger\n // a touchcancel event when the element resizes away\n // from a touch point.)\n\n while (this.svg.lastChild) {\n this.svg.removeChild(this.svg.lastChild);\n }\n\n // Replace the viewbox attribute we just removed:\n this.scale(this.state.scale.x, this.state.scale.y);\n }\n\n // ## Rectangles:\n\n rect(x, y, width, height, attributes) {\n // Avoid invalid negative height attribs by\n // flipping the rectangle on its head:\n if (height < 0) {\n y += height;\n height *= -1;\n }\n\n // Create the rect & style it:\n const rectangle = this.create('rect');\n if (typeof attributes === 'undefined') {\n attributes = {\n fill: 'none',\n 'stroke-width': this.lineWidth,\n stroke: 'black',\n };\n }\n\n Vex.Merge(attributes, {\n x,\n y,\n width,\n height,\n });\n\n this.applyAttributes(rectangle, attributes);\n\n this.add(rectangle);\n return this;\n }\n\n fillRect(x, y, width, height) {\n if (height < 0) {\n y += height;\n height *= -1;\n }\n\n this.rect(x, y, width, height, this.attributes);\n return this;\n }\n\n clearRect(x, y, width, height) {\n // TODO(GCR): Improve implementation of this...\n // Currently it draws a box of the background color, rather\n // than creating alpha through lower z-levels.\n //\n // See the implementation of this in SVGKit:\n // http://sourceforge.net/projects/svgkit/\n // as a starting point.\n //\n // Adding a large number of transform paths (as we would\n // have to do) could be a real performance hit. Since\n // tabNote seems to be the only module that makes use of this\n // it may be worth creating a seperate tabStave that would\n // draw lines around locations of tablature fingering.\n //\n\n this.rect(x, y, width, height, this.background_attributes);\n return this;\n }\n\n // ## Paths:\n\n beginPath() {\n this.path = '';\n this.pen.x = NaN;\n this.pen.y = NaN;\n return this;\n }\n\n moveTo(x, y) {\n this.path += 'M' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n lineTo(x, y) {\n this.path += 'L' + x + ' ' + y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this.path += 'C' +\n x1 + ' ' +\n y1 + ',' +\n x2 + ' ' +\n y2 + ',' +\n x + ' ' +\n y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n quadraticCurveTo(x1, y1, x, y) {\n this.path += 'Q' +\n x1 + ' ' +\n y1 + ',' +\n x + ' ' +\n y;\n this.pen.x = x;\n this.pen.y = y;\n return this;\n }\n\n // This is an attempt (hack) to simulate the HTML5 canvas\n // arc method.\n arc(x, y, radius, startAngle, endAngle, antiClockwise) {\n function normalizeAngle(angle) {\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n\n while (angle > Math.PI * 2) {\n angle -= Math.PI * 2;\n }\n return angle;\n }\n\n startAngle = normalizeAngle(startAngle);\n endAngle = normalizeAngle(endAngle);\n\n if (startAngle > endAngle) {\n const tmp = startAngle;\n startAngle = endAngle;\n endAngle = tmp;\n antiClockwise = !antiClockwise;\n }\n\n const delta = endAngle - startAngle;\n\n if (delta > Math.PI) {\n this.arcHelper(x, y, radius, startAngle, startAngle + delta / 2, antiClockwise);\n this.arcHelper(x, y, radius, startAngle + delta / 2, endAngle, antiClockwise);\n } else {\n this.arcHelper(x, y, radius, startAngle, endAngle, antiClockwise);\n }\n return this;\n }\n\n arcHelper(x, y, radius, startAngle, endAngle, antiClockwise) {\n const x1 = x + radius * Math.cos(startAngle);\n const y1 = y + radius * Math.sin(startAngle);\n\n const x2 = x + radius * Math.cos(endAngle);\n const y2 = y + radius * Math.sin(endAngle);\n\n let largeArcFlag = 0;\n let sweepFlag = 0;\n if (antiClockwise) {\n sweepFlag = 1;\n if (endAngle - startAngle < Math.PI) {\n largeArcFlag = 1;\n }\n } else if (endAngle - startAngle > Math.PI) {\n largeArcFlag = 1;\n }\n\n this.path += 'M' + x1 + ' ' + y1 + ' A' +\n radius + ' ' + radius + ' 0 ' + largeArcFlag + ' ' + sweepFlag + ' ' +\n x2 + ' ' + y2;\n if (!isNaN(this.pen.x) && !isNaN(this.pen.y)) {\n this.peth += 'M' + this.pen.x + ' ' + this.pen.y;\n }\n }\n\n closePath() {\n this.path += 'Z';\n\n return this;\n }\n\n // Adapted from the source for Raphael's Element.glow\n glow() {\n // Calculate the width & paths of the glow:\n if (this.shadow_attributes.width > 0) {\n const sa = this.shadow_attributes;\n const num_paths = sa.width / 2;\n // Stroke at varying widths to create effect of gaussian blur:\n for (let i = 1; i <= num_paths; i++) {\n const attributes = {\n stroke: sa.color,\n 'stroke-linejoin': 'round',\n 'stroke-linecap': 'round',\n 'stroke-width': +((sa.width * 0.4) / num_paths * i).toFixed(3),\n opacity: +((sa.opacity || 0.3) / num_paths).toFixed(3),\n };\n\n const path = this.create('path');\n attributes.d = this.path;\n this.applyAttributes(path, attributes);\n this.add(path);\n }\n }\n return this;\n }\n\n fill(attributes) {\n // If our current path is set to glow, make it glow\n this.glow();\n\n const path = this.create('path');\n if (typeof attributes === 'undefined') {\n attributes = {};\n Vex.Merge(attributes, this.attributes);\n attributes.stroke = 'none';\n }\n\n attributes.d = this.path;\n\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n\n stroke() {\n // If our current path is set to glow, make it glow.\n this.glow();\n\n const path = this.create('path');\n const attributes = {};\n Vex.Merge(attributes, this.attributes);\n attributes.fill = 'none';\n attributes['stroke-width'] = this.lineWidth;\n attributes.d = this.path;\n\n this.applyAttributes(path, attributes);\n this.add(path);\n return this;\n }\n\n // ## Text Methods:\n measureText(text) {\n const txt = this.create('text');\n if (typeof (txt.getBBox) !== 'function') {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n\n txt.textContent = text;\n this.applyAttributes(txt, this.attributes);\n\n // Temporarily add it to the document for measurement.\n this.svg.appendChild(txt);\n\n let bbox = txt.getBBox();\n if (this.ie && text !== '' && this.attributes['font-style'] === 'italic') {\n bbox = this.ieMeasureTextFix(bbox, text);\n }\n\n this.svg.removeChild(txt);\n return bbox;\n }\n\n ieMeasureTextFix(bbox) {\n // Internet Explorer over-pads text in italics,\n // resulting in giant width estimates for measureText.\n // To fix this, we use this formula, tested against\n // ie 11:\n // overestimate (in pixels) = FontSize(in pt) * 1.196 + 1.96\n // And then subtract the overestimate from calculated width.\n\n const fontSize = Number(this.fontSize);\n const m = 1.196;\n const b = 1.9598;\n const widthCorrection = (m * fontSize) + b;\n const width = bbox.width - widthCorrection;\n const height = bbox.height - 1.5;\n\n // Get non-protected copy:\n const box = {\n x: bbox.x,\n y: bbox.y,\n width,\n height,\n };\n\n return box;\n }\n\n fillText(text, x, y) {\n if (!text || text.length <= 0) {\n return;\n }\n const attributes = {};\n Vex.Merge(attributes, this.attributes);\n attributes.stroke = 'none';\n attributes.x = x;\n attributes.y = y;\n\n const txt = this.create('text');\n txt.textContent = text;\n this.applyAttributes(txt, attributes);\n this.add(txt);\n }\n\n save() {\n // TODO(mmuthanna): State needs to be deep-copied.\n this.state_stack.push({\n state: {\n 'font-family': this.state['font-family'],\n 'font-weight': this.state['font-weight'],\n 'font-style': this.state['font-style'],\n 'font-size': this.state['font-size'],\n scale: this.state.scale,\n },\n attributes: {\n 'font-family': this.attributes['font-family'],\n 'font-weight': this.attributes['font-weight'],\n 'font-style': this.attributes['font-style'],\n 'font-size': this.attributes['font-size'],\n fill: this.attributes.fill,\n stroke: this.attributes.stroke,\n 'stroke-width': this.attributes['stroke-width'],\n 'stroke-dasharray': this.attributes['stroke-dasharray'],\n },\n shadow_attributes: {\n width: this.shadow_attributes.width,\n color: this.shadow_attributes.color,\n },\n lineWidth: this.lineWidth,\n });\n return this;\n }\n\n restore() {\n // TODO(0xfe): State needs to be deep-restored.\n const state = this.state_stack.pop();\n this.state['font-family'] = state.state['font-family'];\n this.state['font-weight'] = state.state['font-weight'];\n this.state['font-style'] = state.state['font-style'];\n this.state['font-size'] = state.state['font-size'];\n this.state.scale = state.state.scale;\n\n this.attributes['font-family'] = state.attributes['font-family'];\n this.attributes['font-weight'] = state.attributes['font-weight'];\n this.attributes['font-style'] = state.attributes['font-style'];\n this.attributes['font-size'] = state.attributes['font-size'];\n\n this.attributes.fill = state.attributes.fill;\n this.attributes.stroke = state.attributes.stroke;\n this.attributes['stroke-width'] = state.attributes['stroke-width'];\n this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n\n this.shadow_attributes.width = state.shadow_attributes.width;\n this.shadow_attributes.color = state.shadow_attributes.color;\n\n this.lineWidth = state.lineWidth;\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Support for different rendering contexts: Canvas, Raphael\n\nimport { CanvasContext } from './canvascontext';\nimport { RaphaelContext } from './raphaelcontext';\nimport { SVGContext } from './svgcontext';\nimport { Vex } from './vex';\n\nlet lastContext = null;\n\nexport class Renderer {\n static get Backends() {\n return {\n CANVAS: 1,\n RAPHAEL: 2,\n SVG: 3,\n VML: 4,\n };\n }\n\n // End of line types\n static get LineEndType() {\n return {\n NONE: 1, // No leg\n UP: 2, // Upward leg\n DOWN: 3, // Downward leg\n };\n }\n\n // Set this to true if you're using VexFlow inside a runtime\n // that does not allow modifiying canvas objects. There is a small\n // performance degradation due to the extra indirection.\n static get USE_CANVAS_PROXY() {\n return false;\n }\n\n static get lastContext() {\n return lastContext;\n }\n static set lastContext(ctx) {\n lastContext = ctx;\n }\n\n static buildContext(elementId, backend, width, height, background) {\n const renderer = new Renderer(elementId, backend);\n if (width && height) {\n renderer.resize(width, height);\n }\n\n if (!background) background = '#FFF';\n const ctx = renderer.getContext();\n ctx.setBackgroundFillStyle(background);\n Renderer.lastContext = ctx;\n return ctx;\n }\n\n static getCanvasContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n }\n\n static getRaphaelContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.RAPHAEL, width, height, background);\n }\n\n static getSVGContext(elementId, width, height, background) {\n return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n }\n\n static bolsterCanvasContext(ctx) {\n if (Renderer.USE_CANVAS_PROXY) {\n return new CanvasContext(ctx);\n }\n\n const methodNames = [\n 'clear', 'setFont', 'setRawFont', 'setFillStyle', 'setBackgroundFillStyle',\n 'setStrokeStyle', 'setShadowColor', 'setShadowBlur', 'setLineWidth',\n 'setLineCap', 'setLineDash', 'openGroup', 'closeGroup', 'getGroup',\n ];\n\n ctx.vexFlowCanvasContext = ctx;\n\n methodNames.forEach(methodName => {\n ctx[methodName] = ctx[methodName] || CanvasContext.prototype[methodName];\n });\n\n return ctx;\n }\n\n // Draw a dashed line (horizontal, vertical or diagonal\n // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n // setting the second number to 0 draws a solid line.\n static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n context.beginPath();\n\n const dx = toX - fromX;\n const dy = toY - fromY;\n const angle = Math.atan2(dy, dx);\n let x = fromX;\n let y = fromY;\n context.moveTo(fromX, fromY);\n let idx = 0;\n let draw = true;\n while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n const dashLength = dashPattern[idx++ % dashPattern.length];\n const nx = x + (Math.cos(angle) * dashLength);\n x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n const ny = y + (Math.sin(angle) * dashLength);\n y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n if (draw) {\n context.lineTo(x, y);\n } else {\n context.moveTo(x, y);\n }\n draw = !draw;\n }\n\n context.closePath();\n context.stroke();\n }\n\n constructor(elementId, backend) {\n this.elementId = elementId;\n if (!this.elementId) {\n throw new Vex.RERR('BadArgument', 'Invalid id for renderer.');\n }\n\n this.element = document.getElementById(elementId);\n if (!this.element) this.element = elementId;\n\n // Verify backend and create context\n this.ctx = null;\n this.paper = null;\n this.backend = backend;\n if (this.backend === Renderer.Backends.CANVAS) {\n // Create context.\n if (!this.element.getContext) {\n throw new Vex.RERR('BadElement', `Can't get canvas context from element: ${elementId}`);\n }\n this.ctx = Renderer.bolsterCanvasContext(this.element.getContext('2d'));\n } else if (this.backend === Renderer.Backends.RAPHAEL) {\n this.ctx = new RaphaelContext(this.element);\n } else if (this.backend === Renderer.Backends.SVG) {\n this.ctx = new SVGContext(this.element);\n } else {\n throw new Vex.RERR('InvalidBackend', `No support for backend: ${this.backend}`);\n }\n }\n\n resize(width, height) {\n if (this.backend === Renderer.Backends.CANVAS) {\n if (!this.element.getContext) {\n throw new Vex.RERR(\n 'BadElement', `Can't get canvas context from element: ${this.elementId}`\n );\n }\n [width, height] = CanvasContext.SanitizeCanvasDims(width, height);\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n this.element.width = width * devicePixelRatio;\n this.element.height = height * devicePixelRatio;\n this.element.style.width = width + 'px';\n this.element.style.height = height + 'px';\n\n this.ctx = Renderer.bolsterCanvasContext(this.element.getContext('2d'));\n this.ctx.scale(devicePixelRatio, devicePixelRatio);\n } else {\n this.ctx.resize(width, height);\n }\n\n return this;\n }\n\n getContext() { return this.ctx; }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\n\n// To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`.\nfunction L(...args) { if (Stem.DEBUG) Vex.L('Vex.Flow.Stem', args); }\n\nexport class Stem extends Element {\n static get CATEGORY() { return 'stem'; }\n\n // Stem directions\n static get UP() {\n return 1;\n }\n static get DOWN() {\n return -1;\n }\n\n // Theme\n static get WIDTH() {\n return Flow.STEM_WIDTH;\n }\n static get HEIGHT() {\n return Flow.STEM_HEIGHT;\n }\n\n constructor(options = {}) {\n super();\n this.setAttribute('type', 'Stem');\n\n // Default notehead x bounds\n this.x_begin = options.x_begin || 0;\n this.x_end = options.x_end || 0;\n\n // Y bounds for top/bottom most notehead\n this.y_top = options.y_top || 0;\n this.y_bottom = options.y_bottom || 0;\n\n // Stem top extension\n this.stem_extension = options.stem_extension || 0;\n\n // Direction of the stem\n this.stem_direction = options.stem_direction || 0;\n\n // Flag to override all draw calls\n this.hide = options.hide || false;\n\n this.isStemlet = options.isStemlet || false;\n this.stemletHeight = options.stemletHeight || 0;\n\n // Use to adjust the rendered height without affecting\n // the results of `.getExtents()`\n this.renderHeightAdjustment = 0;\n this.setOptions(options);\n }\n\n setOptions(options) {\n // Changing where the stem meets the head\n this.stem_up_y_offset = options.stem_up_y_offset || 0;\n this.stem_down_y_offset = options.stem_down_y_offset || 0;\n }\n\n // Set the x bounds for the default notehead\n setNoteHeadXBounds(x_begin, x_end) {\n this.x_begin = x_begin;\n this.x_end = x_end;\n return this;\n }\n\n // Set the direction of the stem in relation to the noteheads\n setDirection(direction) { this.stem_direction = direction; }\n\n // Set the extension for the stem, generally for flags or beams\n setExtension(ext) { this.stem_extension = ext; }\n getExtension() { return this.stem_extension; }\n\n // The the y bounds for the top and bottom noteheads\n setYBounds(y_top, y_bottom) {\n this.y_top = y_top;\n this.y_bottom = y_bottom;\n }\n\n // The category of the object\n getCategory() { return Stem.CATEGORY; }\n\n // Gets the entire height for the stem\n getHeight() {\n const y_offset = (this.stem_direction === Stem.UP) ? this.stem_up_y_offset : this.stem_down_y_offset; // eslint-disable-line max-len\n return ((this.y_bottom - this.y_top) * this.stem_direction) +\n ((Stem.HEIGHT - y_offset + this.stem_extension) * this.stem_direction);\n }\n getBoundingBox() {\n throw new Vex.RERR('NotImplemented', 'getBoundingBox() not implemented.');\n }\n\n // Get the y coordinates for the very base of the stem to the top of\n // the extension\n getExtents() {\n const isStemUp = this.stem_direction === Stem.UP;\n const ys = [this.y_top, this.y_bottom];\n const stemHeight = Stem.HEIGHT + this.stem_extension;\n\n const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n const stemTipY = innerMostNoteheadY + (stemHeight * -this.stem_direction);\n\n return { topY: stemTipY, baseY: outerMostNoteheadY };\n }\n\n setVisibility(isVisible) {\n this.hide = !isVisible;\n return this;\n }\n\n setStemlet(isStemlet, stemletHeight) {\n this.isStemlet = isStemlet;\n this.stemletHeight = stemletHeight;\n return this;\n }\n\n // Render the stem onto the canvas\n draw() {\n this.setRendered();\n if (this.hide) return;\n const ctx = this.checkContext();\n\n let stem_x;\n let stem_y;\n const stem_direction = this.stem_direction;\n\n if (stem_direction === Stem.DOWN) {\n // Down stems are rendered to the left of the head.\n stem_x = this.x_begin;\n stem_y = this.y_top + this.stem_down_y_offset;\n } else {\n // Up stems are rendered to the right of the head.\n stem_x = this.x_end;\n stem_y = this.y_bottom - this.stem_up_y_offset;\n }\n\n const stemHeight = this.getHeight();\n\n L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n\n // The offset from the stem's base which is required fo satisfy the stemlet height\n const stemletYOffset = this.isStemlet\n ? stemHeight - this.stemletHeight * this.stem_direction\n : 0;\n\n // Draw the stem\n ctx.save();\n this.applyStyle(ctx);\n ctx.beginPath();\n ctx.setLineWidth(Stem.WIDTH);\n ctx.moveTo(stem_x, stem_y - stemletYOffset);\n ctx.lineTo(stem_x, stem_y - stemHeight - (this.renderHeightAdjustment * stem_direction));\n ctx.stroke();\n this.restoreStyle(ctx);\n ctx.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.} A set of notes: staveNotes,\n * notes, etc... any class that inherits stemmableNote at some\n * point in its prototype chain.\n * @param options: object {\n *\n * num_notes: fit this many notes into...\n * notes_occupied: ...the space of this many notes\n *\n * Together, these two properties make up the tuplet ratio\n * in the form of num_notes : notes_occupied.\n * num_notes defaults to the number of notes passed in, so\n * it is important that if you omit this property, all of\n * the notes passed should be of the same note value.\n * notes_occupied defaults to 2 -- so you should almost\n * certainly pass this parameter for anything other than\n * a basic triplet.\n *\n * location:\n * default 1, which is above the notes: ┌─── 3 ───┐\n * -1 is below the notes └─── 3 ───┘\n *\n * bracketed: boolean, draw a bracket around the tuplet number\n * when true: ┌─── 3 ───┐ when false: 3\n * defaults to true if notes are not beamed, false otherwise\n *\n * ratioed: boolean\n * when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n * defaults to true if the difference between num_notes and\n * notes_occupied is greater than 1.\n *\n * y_offset: int, default 0\n * manually offset a tuplet, for instance to avoid collisions\n * with articulations, etc...\n * }\n */\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\n\nexport class Tuplet extends Element {\n static get LOCATION_TOP() {\n return 1;\n }\n static get LOCATION_BOTTOM() {\n return -1;\n }\n static get NESTING_OFFSET() {\n return 15;\n }\n\n constructor(notes, options) {\n super();\n this.setAttribute('type', 'Tuplet');\n if (!notes || !notes.length) {\n throw new Vex.RuntimeError('BadArguments', 'No notes provided for tuplet.');\n }\n\n this.options = Vex.Merge({}, options);\n this.notes = notes;\n this.num_notes = 'num_notes' in this.options ?\n this.options.num_notes : notes.length;\n\n // We accept beats_occupied, but warn that it's deprecated:\n // the preferred property name is now notes_occupied.\n if (this.options.beats_occupied) {\n this.beatsOccupiedDeprecationWarning();\n }\n this.notes_occupied = this.options.notes_occupied ||\n this.options.beats_occupied ||\n 2;\n if ('bracketed' in this.options) {\n this.bracketed = this.options.bracketed;\n } else {\n this.bracketed =\n notes.some(note => note.beam === null);\n }\n\n this.ratioed = 'ratioed' in this.options ?\n this.options.ratioed :\n (Math.abs(this.notes_occupied - this.num_notes) > 1);\n this.point = 28;\n this.y_pos = 16;\n this.x_pos = 100;\n this.width = 200;\n this.location = this.options.location || Tuplet.LOCATION_TOP;\n\n Formatter.AlignRestsToNotes(notes, true, true);\n this.resolveGlyphs();\n this.attach();\n }\n\n attach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.setTuplet(this);\n }\n }\n\n detach() {\n for (let i = 0; i < this.notes.length; i++) {\n const note = this.notes[i];\n note.resetTuplet(this);\n }\n }\n\n /**\n * Set whether or not the bracket is drawn.\n */\n setBracketed(bracketed) {\n this.bracketed = !!bracketed;\n return this;\n }\n\n /**\n * Set whether or not the ratio is shown.\n */\n setRatioed(ratioed) {\n this.ratioed = !!ratioed;\n return this;\n }\n\n /**\n * Set the tuplet to be displayed either on the top or bottom of the stave\n */\n setTupletLocation(location) {\n if (!location) {\n location = Tuplet.LOCATION_TOP;\n } else if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n throw new Vex.RERR('BadArgument', 'Invalid tuplet location: ' + location);\n }\n\n this.location = location;\n return this;\n }\n\n getNotes() {\n return this.notes;\n }\n\n getNoteCount() {\n return this.num_notes;\n }\n\n beatsOccupiedDeprecationWarning() {\n const msg = [\n 'beats_occupied has been deprecated as an ',\n 'option for tuplets. Please use notes_occupied ',\n 'instead. Calls to getBeatsOccupied and ',\n 'setBeatsOccupied should now be routed to ',\n 'getNotesOccupied and setNotesOccupied instead',\n ].join('');\n\n if (console && console.warn) { // eslint-disable-line no-console\n console.warn(msg); // eslint-disable-line no-console\n } else if (console) {\n console.log(msg); // eslint-disable-line no-console\n }\n }\n\n getBeatsOccupied() {\n this.beatsOccupiedDeprecationWarning();\n return this.getNotesOccupied();\n }\n\n setBeatsOccupied(beats) {\n this.beatsOccupiedDeprecationWarning();\n return this.setNotesOccupied(beats);\n }\n\n getNotesOccupied() {\n return this.notes_occupied;\n }\n\n setNotesOccupied(notes) {\n this.detach();\n this.notes_occupied = notes;\n this.resolveGlyphs();\n this.attach();\n }\n\n resolveGlyphs() {\n this.numerator_glyphs = [];\n let n = this.num_notes;\n while (n >= 1) {\n this.numerator_glyphs.unshift(new Glyph('v' + (n % 10), this.point));\n n = parseInt(n / 10, 10);\n }\n\n this.denom_glyphs = [];\n n = this.notes_occupied;\n while (n >= 1) {\n this.denom_glyphs.unshift(new Glyph('v' + (n % 10), this.point));\n n = parseInt(n / 10, 10);\n }\n }\n\n // determine how many tuplets are nested within this tuplet\n // on the same side (above/below), to calculate a y\n // offset for this tuplet:\n getNestedTupletCount() {\n const location = this.location;\n const first_note = this.notes[0];\n let maxTupletCount = countTuplets(first_note, location);\n let minTupletCount = countTuplets(first_note, location);\n\n // Count the tuplets that are on the same side (above/below)\n // as this tuplet:\n function countTuplets(note, location) {\n return note.tupletStack.filter(tuplet => tuplet.location === location).length;\n }\n\n this.notes.forEach(note => {\n const tupletCount = countTuplets(note, location);\n maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n });\n\n return maxTupletCount - minTupletCount;\n }\n\n // determine the y position of the tuplet:\n getYPosition() {\n // offset the tuplet for any nested tuplets between\n // it and the notes:\n const nested_tuplet_y_offset =\n this.getNestedTupletCount() *\n Tuplet.NESTING_OFFSET *\n -this.location;\n\n // offset the tuplet for any manual y_offset:\n const y_offset = this.options.y_offset || 0;\n\n // now iterate through the notes and find our highest\n // or lowest locations, to form a base y_pos\n const first_note = this.notes[0];\n let y_pos;\n if (this.location === Tuplet.LOCATION_TOP) {\n y_pos = first_note.getStave().getYForLine(0) - 15;\n // y_pos = first_note.getStemExtents().topY - 10;\n\n for (let i = 0; i < this.notes.length; ++i) {\n const top_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().topY - 10\n : this.notes[i].getStemExtents().baseY - 20;\n\n if (top_y < y_pos) {\n y_pos = top_y;\n }\n }\n } else {\n y_pos = first_note.getStave().getYForLine(4) + 20;\n\n for (let i = 0; i < this.notes.length; ++i) {\n const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n ? this.notes[i].getStemExtents().baseY + 20\n : this.notes[i].getStemExtents().topY + 10;\n if (bottom_y > y_pos) {\n y_pos = bottom_y;\n }\n }\n }\n\n return y_pos + nested_tuplet_y_offset + y_offset;\n }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n // determine x value of left bound of tuplet\n const first_note = this.notes[0];\n const last_note = this.notes[this.notes.length - 1];\n\n if (!this.bracketed) {\n this.x_pos = first_note.getStemX();\n this.width = last_note.getStemX() - this.x_pos;\n } else {\n this.x_pos = first_note.getTieLeftX() - 5;\n this.width = last_note.getTieRightX() - this.x_pos + 5;\n }\n\n // determine y value for tuplet\n this.y_pos = this.getYPosition();\n\n const addGlyphWidth = (width, glyph) => width + glyph.getMetrics().width;\n\n // calculate total width of tuplet notation\n let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n if (this.ratioed) {\n width = this.denom_glyphs.reduce(addGlyphWidth, width);\n width += this.point * 0.32;\n }\n\n const notation_center_x = this.x_pos + (this.width / 2);\n const notation_start_x = notation_center_x - (width / 2);\n\n // draw bracket if the tuplet is not beamed\n if (this.bracketed) {\n const line_width = this.width / 2 - width / 2 - 5;\n\n // only draw the bracket if it has positive length\n if (line_width > 0) {\n this.context.fillRect(this.x_pos, this.y_pos, line_width, 1);\n this.context.fillRect(\n this.x_pos + this.width / 2 + width / 2 + 5,\n this.y_pos,\n line_width,\n 1\n );\n this.context.fillRect(\n this.x_pos,\n this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM),\n 1,\n this.location * 10\n );\n this.context.fillRect(\n this.x_pos + this.width,\n this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM),\n 1,\n this.location * 10\n );\n }\n }\n\n // draw numerator glyphs\n let x_offset = 0;\n this.numerator_glyphs.forEach(glyph => {\n glyph.render(this.context, notation_start_x + x_offset, this.y_pos + (this.point / 3) - 2);\n x_offset += glyph.getMetrics().width;\n });\n\n // display colon and denominator if the ratio is to be shown\n if (this.ratioed) {\n const colon_x = notation_start_x + x_offset + this.point * 0.16;\n const colon_radius = this.point * 0.06;\n this.context.beginPath();\n this.context.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n this.context.closePath();\n this.context.fill();\n this.context.beginPath();\n this.context.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n this.context.closePath();\n this.context.fill();\n x_offset += this.point * 0.32;\n this.denom_glyphs.forEach(glyph => {\n glyph.render(this.context, notation_start_x + x_offset, this.y_pos + (this.point / 3) - 2);\n x_offset += glyph.getMetrics().width;\n });\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `Beams` that span over a set of `StemmableNotes`.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tuplet } from './tuplet';\nimport { Stem } from './stem';\n\nfunction calculateStemDirection(notes) {\n let lineSum = 0;\n notes.forEach(note => {\n if (note.keyProps) {\n note.keyProps.forEach(keyProp => {\n lineSum += (keyProp.line - 3);\n });\n }\n });\n\n if (lineSum >= 0) {\n return Stem.DOWN;\n }\n return Stem.UP;\n}\n\nconst getStemSlope = (firstNote, lastNote) => {\n const firstStemTipY = firstNote.getStemExtents().topY;\n const firstStemX = firstNote.getStemX();\n const lastStemTipY = lastNote.getStemExtents().topY;\n const lastStemX = lastNote.getStemX();\n return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n};\n\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n\nexport class Beam extends Element {\n // Gets the default beam groups for a provided time signature.\n // Attempts to guess if the time signature is not found in table.\n // Currently this is fairly naive.\n static getDefaultBeamGroups(time_sig) {\n if (!time_sig || time_sig === 'c') {\n time_sig = '4/4';\n }\n\n const defaults = {\n '1/2': ['1/2'],\n '2/2': ['1/2'],\n '3/2': ['1/2'],\n '4/2': ['1/2'],\n\n '1/4': ['1/4'],\n '2/4': ['1/4'],\n '3/4': ['1/4'],\n '4/4': ['1/4'],\n\n '1/8': ['1/8'],\n '2/8': ['2/8'],\n '3/8': ['3/8'],\n '4/8': ['2/8'],\n\n '1/16': ['1/16'],\n '2/16': ['2/16'],\n '3/16': ['3/16'],\n '4/16': ['2/16'],\n };\n\n const groups = defaults[time_sig];\n\n if (groups === undefined) {\n // If no beam groups found, naively determine\n // the beam groupings from the time signature\n const beatTotal = parseInt(time_sig.split('/')[0], 10);\n const beatValue = parseInt(time_sig.split('/')[1], 10);\n\n const tripleMeter = beatTotal % 3 === 0;\n\n if (tripleMeter) {\n return [new Fraction(3, beatValue)];\n } else if (beatValue > 4) {\n return [new Fraction(2, beatValue)];\n } else if (beatValue <= 4) {\n return [new Fraction(1, beatValue)];\n }\n } else {\n return groups.map(group => new Fraction().parse(group));\n }\n\n return [new Fraction(1, 4)];\n }\n\n // A helper function to automatically build basic beams for a voice. For more\n // complex auto-beaming use `Beam.generateBeams()`.\n //\n // Parameters:\n // * `voice` - The voice to generate the beams for\n // * `stem_direction` - A stem direction to apply to the entire voice\n // * `groups` - An array of `Fraction` representing beat groupings for the beam\n static applyAndGetBeams(voice, stem_direction, groups) {\n return Beam.generateBeams(voice.getTickables(), {\n groups,\n stem_direction,\n });\n }\n\n // A helper function to autimatically build beams for a voice with\n // configuration options.\n //\n // Example configuration object:\n //\n // ```\n // config = {\n // groups: [new Vex.Flow.Fraction(2, 8)],\n // stem_direction: -1,\n // beam_rests: true,\n // beam_middle_only: true,\n // show_stemlets: false\n // };\n // ```\n //\n // Parameters:\n // * `notes` - An array of notes to create the beams for\n // * `config` - The configuration object\n // * `groups` - Array of `Fractions` that represent the beat structure to beam the notes\n // * `stem_direction` - Set to apply the same direction to all notes\n // * `beam_rests` - Set to `true` to include rests in the beams\n // * `beam_middle_only` - Set to `true` to only beam rests in the middle of the beat\n // * `show_stemlets` - Set to `true` to draw stemlets for rests\n // * `maintain_stem_directions` - Set to `true` to not apply new stem directions\n //\n static generateBeams(notes, config) {\n if (!config) config = {};\n\n if (!config.groups || !config.groups.length) {\n config.groups = [new Fraction(2, 8)];\n }\n\n // Convert beam groups to tick amounts\n const tickGroups = config.groups.map(group => {\n if (!group.multiply) {\n throw new Vex.RuntimeError('InvalidBeamGroups',\n 'The beam groups must be an array of Vex.Flow.Fractions');\n }\n return group.clone().multiply(Flow.RESOLUTION, 1);\n });\n\n const unprocessedNotes = notes;\n let currentTickGroup = 0;\n let noteGroups = [];\n let currentGroup = [];\n\n function getTotalTicks(vf_notes) {\n return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n }\n\n function nextTickGroup() {\n if (tickGroups.length - 1 > currentTickGroup) {\n currentTickGroup += 1;\n } else {\n currentTickGroup = 0;\n }\n }\n\n function createGroups() {\n let nextGroup = [];\n\n unprocessedNotes.forEach(unprocessedNote => {\n nextGroup = [];\n if (unprocessedNote.shouldIgnoreTicks()) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n return; // Ignore untickables (like bar notes)\n }\n\n currentGroup.push(unprocessedNote);\n const ticksPerGroup = tickGroups[currentTickGroup].clone();\n const totalTicks = getTotalTicks(currentGroup);\n\n // Double the amount of ticks in a group, if it's an unbeamable tuplet\n const unbeamable = Flow.durationToNumber(unprocessedNote.duration) < 8;\n if (unbeamable && unprocessedNote.tuplet) {\n ticksPerGroup.numerator *= 2;\n }\n\n // If the note that was just added overflows the group tick total\n if (totalTicks.greaterThan(ticksPerGroup)) {\n // If the overflow note can be beamed, start the next group\n // with it. Unbeamable notes leave the group overflowed.\n if (!unbeamable) {\n nextGroup.push(currentGroup.pop());\n }\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n nextTickGroup();\n } else if (totalTicks.equals(ticksPerGroup)) {\n noteGroups.push(currentGroup);\n currentGroup = nextGroup;\n nextTickGroup();\n }\n });\n\n // Adds any remainder notes\n if (currentGroup.length > 0) {\n noteGroups.push(currentGroup);\n }\n }\n\n function getBeamGroups() {\n return noteGroups.filter(group => {\n if (group.length > 1) {\n let beamable = true;\n group.forEach(note => {\n if (note.getIntrinsicTicks() >= Flow.durationToTicks('4')) {\n beamable = false;\n }\n });\n return beamable;\n }\n return false;\n });\n }\n\n // Splits up groups by Rest\n function sanitizeGroups() {\n const sanitizedGroups = [];\n noteGroups.forEach(group => {\n let tempGroup = [];\n group.forEach((note, index, group) => {\n const isFirstOrLast = index === 0 || index === group.length - 1;\n const prevNote = group[index - 1];\n\n const breaksOnEachRest = !config.beam_rests && note.isRest();\n const breaksOnFirstOrLastRest = (config.beam_rests &&\n config.beam_middle_only && note.isRest() && isFirstOrLast);\n\n let breakOnStemChange = false;\n if (config.maintain_stem_directions && prevNote &&\n !note.isRest() && !prevNote.isRest()) {\n const prevDirection = prevNote.getStemDirection();\n const currentDirection = note.getStemDirection();\n breakOnStemChange = currentDirection !== prevDirection;\n }\n\n const isUnbeamableDuration = parseInt(note.duration, 10) < 8;\n\n // Determine if the group should be broken at this note\n const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest ||\n breakOnStemChange || isUnbeamableDuration;\n\n if (shouldBreak) {\n // Add current group\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n\n // Start a new group. Include the current note if the group\n // was broken up by stem direction, as that note needs to start\n // the next group of notes\n tempGroup = breakOnStemChange ? [note] : [];\n } else {\n // Add note to group\n tempGroup.push(note);\n }\n });\n\n // If there is a remaining group, add it as well\n if (tempGroup.length > 0) {\n sanitizedGroups.push(tempGroup);\n }\n });\n\n noteGroups = sanitizedGroups;\n }\n\n function formatStems() {\n noteGroups.forEach(group => {\n let stemDirection;\n if (config.maintain_stem_directions) {\n const note = findFirstNote(group);\n stemDirection = note ? note.getStemDirection() : Stem.UP;\n } else {\n if (config.stem_direction) {\n stemDirection = config.stem_direction;\n } else {\n stemDirection = calculateStemDirection(group);\n }\n }\n applyStemDirection(group, stemDirection);\n });\n }\n\n function findFirstNote(group) {\n for (let i = 0; i < group.length; i++) {\n const note = group[i];\n if (!note.isRest()) {\n return note;\n }\n }\n\n return false;\n }\n\n function applyStemDirection(group, direction) {\n group.forEach(note => {\n note.setStemDirection(direction);\n });\n }\n\n // Get all of the tuplets in all of the note groups\n function getTuplets() {\n const uniqueTuplets = [];\n\n // Go through all of the note groups and inspect for tuplets\n noteGroups.forEach(group => {\n let tuplet = null;\n group.forEach(note => {\n if (note.tuplet && (tuplet !== note.tuplet)) {\n tuplet = note.tuplet;\n uniqueTuplets.push(tuplet);\n }\n });\n });\n return uniqueTuplets;\n }\n\n\n // Using closures to store the variables throughout the various functions\n // IMO Keeps it this process lot cleaner - but not super consistent with\n // the rest of the API's style - Silverwolf90 (Cyril)\n createGroups();\n sanitizeGroups();\n formatStems();\n\n // Get the notes to be beamed\n const beamedNoteGroups = getBeamGroups();\n\n // Get the tuplets in order to format them accurately\n const allTuplets = getTuplets();\n\n // Create a Vex.Flow.Beam from each group of notes to be beamed\n const beams = [];\n beamedNoteGroups.forEach(group => {\n const beam = new Beam(group);\n\n if (config.show_stemlets) {\n beam.render_options.show_stemlets = true;\n }\n if (config.secondary_breaks) {\n beam.render_options.secondary_break_ticks = Flow.durationToTicks(config.secondary_breaks);\n }\n if (config.flat_beams === true) {\n beam.render_options.flat_beams = true;\n beam.render_options.flat_beam_offset = config.flat_beam_offset;\n }\n beams.push(beam);\n });\n\n // Reformat tuplets\n allTuplets.forEach(tuplet => {\n // Set the tuplet location based on the stem direction\n const direction = tuplet.notes[0].stem_direction === Stem.DOWN ?\n Tuplet.LOCATION_BOTTOM : Tuplet.LOCATION_TOP;\n tuplet.setTupletLocation(direction);\n\n // If any of the notes in the tuplet are not beamed, draw a bracket.\n let bracketed = false;\n for (let i = 0; i < tuplet.notes.length; i++) {\n const note = tuplet.notes[i];\n if (note.beam === null) {\n bracketed = true;\n break;\n }\n }\n tuplet.setBracketed(bracketed);\n });\n\n return beams;\n }\n\n constructor(notes, auto_stem) {\n super();\n this.setAttribute('type', 'Beam');\n\n if (!notes || notes === []) {\n throw new Vex.RuntimeError('BadArguments', 'No notes provided for beam.');\n }\n\n if (notes.length === 1) {\n throw new Vex.RuntimeError('BadArguments', 'Too few notes for beam.');\n }\n\n // Validate beam line, direction and ticks.\n this.ticks = notes[0].getIntrinsicTicks();\n\n if (this.ticks >= Flow.durationToTicks('4')) {\n throw new Vex.RuntimeError('BadArguments',\n 'Beams can only be applied to notes shorter than a quarter note.');\n }\n\n let i; // shared iterator\n let note;\n\n this.stem_direction = Stem.UP;\n\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (note.hasStem()) {\n this.stem_direction = note.getStemDirection();\n break;\n }\n }\n\n let stem_direction = this.stem_direction;\n // Figure out optimal stem direction based on given notes\n if (auto_stem && notes[0].getCategory() === 'stavenotes') {\n stem_direction = calculateStemDirection(notes);\n } else if (auto_stem && notes[0].getCategory() === 'tabnotes') {\n // Auto Stem TabNotes\n const stem_weight = notes.reduce((memo, note) => memo + note.stem_direction, 0);\n\n stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n }\n\n // Apply stem directions and attach beam to notes\n for (i = 0; i < notes.length; ++i) {\n note = notes[i];\n if (auto_stem) {\n note.setStemDirection(stem_direction);\n this.stem_direction = stem_direction;\n }\n note.setBeam(this);\n }\n\n this.postFormatted = false;\n this.notes = notes;\n this.beam_count = this.getBeamCount();\n this.break_on_indices = [];\n this.render_options = {\n beam_width: 5,\n max_slope: 0.25,\n min_slope: -0.25,\n slope_iterations: 20,\n slope_cost: 100,\n show_stemlets: false,\n stemlet_extension: 7,\n partial_beam_length: 10,\n flat_beams: false,\n min_flat_beam_offset: 15,\n };\n }\n\n // Get the notes in this beam\n getNotes() { return this.notes; }\n\n // Get the max number of beams in the set of notes\n getBeamCount() {\n const beamCounts = this.notes.map(note => note.getGlyph().beam_count);\n\n const maxBeamCount = beamCounts.reduce((max, beamCount) => beamCount > max ? beamCount : max);\n\n return maxBeamCount;\n }\n\n // Set which note `indices` to break the secondary beam at\n breakSecondaryAt(indices) {\n this.break_on_indices = indices;\n return this;\n }\n\n // Return the y coordinate for linear function\n getSlopeY(x, first_x_px, first_y_px, slope) {\n return first_y_px + ((x - first_x_px) * slope);\n }\n\n // Calculate the best possible slope for the provided notes\n calculateSlope() {\n const {\n notes,\n stem_direction: stemDirection,\n render_options: { max_slope, min_slope, slope_iterations, slope_cost },\n } = this;\n\n const firstNote = notes[0];\n const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n const increment = (max_slope - min_slope) / slope_iterations;\n let minCost = Number.MAX_VALUE;\n let bestSlope = 0;\n let yShift = 0;\n\n // iterate through slope values to find best weighted fit\n for (let slope = min_slope; slope <= max_slope; slope += increment) {\n let totalStemExtension = 0;\n let yShiftTemp = 0;\n\n // iterate through notes, calculating y shift and stem extension\n for (let i = 1; i < notes.length; ++i) {\n const note = notes[i];\n const adjustedStemTipY = this.getSlopeY(\n note.getStemX(),\n firstNote.getStemX(),\n firstNote.getStemExtents().topY,\n slope\n ) + yShiftTemp;\n\n const stemTipY = note.getStemExtents().topY;\n // beam needs to be shifted up to accommodate note\n if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n const diff = Math.abs(stemTipY - adjustedStemTipY);\n yShiftTemp += diff * -stemDirection;\n totalStemExtension += diff * i;\n } else { // beam overshoots note, account for the difference\n totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n }\n }\n\n // most engraving books suggest aiming for a slope about half the angle of the\n // difference between the first and last notes' stem length;\n const idealSlope = initialSlope / 2;\n const distanceFromIdeal = Math.abs(idealSlope - slope);\n\n // This tries to align most beams to something closer to the idealSlope, but\n // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n\n // update state when a more ideal slope is found\n if (cost < minCost) {\n minCost = cost;\n bestSlope = slope;\n yShift = yShiftTemp;\n }\n }\n\n this.slope = bestSlope;\n this.y_shift = yShift;\n }\n\n // Calculate a slope and y-shift for flat beams\n calculateFlatSlope() {\n const {\n notes, stem_direction,\n render_options: { beam_width, min_flat_beam_offset, flat_beam_offset },\n } = this;\n\n // If a flat beam offset has not yet been supplied or calculated,\n // generate one based on the notes in this particular note group\n let total = 0;\n let extremeY = 0; // Store the highest or lowest note here\n let extremeBeamCount = 0; // The beam count of the extreme note\n let currentExtreme = 0;\n for (let i = 0; i < notes.length; i++) {\n // Total up all of the offsets so we can average them out later\n const note = notes[i];\n const stemTipY = note.getStemExtents().topY;\n total += stemTipY;\n\n // Store the highest (stems-up) or lowest (stems-down) note so the\n // offset can be adjusted in case the average isn't enough\n if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n currentExtreme = stemTipY;\n extremeY = Math.max(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n } else if (\n stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)\n ) {\n currentExtreme = stemTipY;\n extremeY = Math.min(...note.getYs());\n extremeBeamCount = note.getBeamCount();\n }\n }\n\n // Average the offsets to try and come up with a reasonable one that\n // works for all of the notes in the beam group.\n let offset = total / notes.length;\n\n // In case the average isn't long enough, add or subtract some more\n // based on the highest or lowest note (again, based on the stem\n // direction). This also takes into account the added height due to\n // the width of the beams.\n const beamWidth = beam_width * 1.5;\n const extremeTest = min_flat_beam_offset + (extremeBeamCount * beamWidth);\n const newOffset = extremeY + (extremeTest * -stem_direction);\n if (stem_direction === Stem.DOWN && offset < newOffset) {\n offset = extremeY + extremeTest;\n } else if (stem_direction === Stem.UP && offset > newOffset) {\n offset = extremeY - extremeTest;\n }\n\n if (!flat_beam_offset) {\n // Set the offset for the group based on the calculations above.\n this.render_options.flat_beam_offset = offset;\n } else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n } else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n this.render_options.flat_beam_offset = offset;\n }\n\n // for flat beams, the slope and y_shift are simply 0\n this.slope = 0;\n this.y_shift = 0;\n }\n\n getBeamYToDraw() {\n const firstNote = this.notes[0];\n const firstStemTipY = firstNote.getStemExtents().topY;\n let beamY = firstStemTipY;\n\n // For flat beams, set the first and last Y to the offset, rather than\n // using the note's stem extents.\n if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n beamY = this.render_options.flat_beam_offset;\n }\n return beamY;\n }\n\n // Create new stems for the notes in the beam, so that each stem\n // extends into the beams.\n applyStemExtensions() {\n const {\n notes, slope, y_shift, stem_direction, beam_count,\n render_options: {\n show_stemlets,\n stemlet_extension,\n beam_width,\n },\n } = this;\n\n const firstNote = notes[0];\n const firstStemTipY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n\n for (let i = 0; i < notes.length; ++i) {\n const note = notes[i];\n const stemX = note.getStemX();\n const { topY: stemTipY } = note.getStemExtents();\n const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n const preBeamExtension = note.getStem().getExtension();\n const beamExtension = stem_direction === Stem.UP\n ? stemTipY - beamedStemTipY\n : beamedStemTipY - stemTipY;\n\n note.stem.setExtension(preBeamExtension + beamExtension);\n note.stem.renderHeightAdjustment = -Stem.WIDTH / 2;\n\n if (note.isRest() && show_stemlets) {\n const beamWidth = beam_width;\n const totalBeamWidth = ((beam_count - 1) * beamWidth * 1.5) + beamWidth;\n note.stem\n .setVisibility(true)\n .setStemlet(true, totalBeamWidth + stemlet_extension);\n }\n }\n }\n\n // return upper level beam direction.\n lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n if (duration === '4') {\n return BEAM_LEFT;\n }\n\n const lookup_duration = `${Flow.durationToNumber(duration) / 2}`;\n const prev_note_gets_beam = prev_tick < Flow.durationToTicks(lookup_duration);\n const next_note_gets_beam = next_tick < Flow.durationToTicks(lookup_duration);\n const note_gets_beam = tick < Flow.durationToTicks(lookup_duration);\n\n if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_BOTH;\n } else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n return BEAM_LEFT;\n } else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n return BEAM_RIGHT;\n }\n\n return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n }\n\n // Get the x coordinates for the beam lines of specific `duration`\n getBeamLines(duration) {\n const tick_of_duration = Flow.durationToTicks(duration);\n const beam_lines = [];\n let beam_started = false;\n let current_beam = null;\n const partial_beam_length = this.render_options.partial_beam_length;\n let previous_should_break = false;\n let tick_tally = 0;\n for (let i = 0; i < this.notes.length; ++i) {\n const note = this.notes[i];\n\n // See if we need to break secondary beams on this note.\n const ticks = note.ticks.value();\n tick_tally += ticks;\n let should_break = false;\n\n // 8th note beams are always drawn.\n if (parseInt(duration, 10) >= 8) {\n // First, check to see if any indices were set up through breakSecondaryAt()\n should_break = this.break_on_indices.indexOf(i) !== -1;\n\n // If the secondary breaks were auto-configured in the render options,\n // handle that as well.\n if (this.render_options.secondary_break_ticks && tick_tally >=\n this.render_options.secondary_break_ticks) {\n tick_tally = 0;\n should_break = true;\n }\n }\n const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n\n const stem_x = note.getStemX() - (Stem.WIDTH / 2);\n\n // Check to see if the next note in the group will get a beam at this\n // level. This will help to inform the partial beam logic below.\n const prev_note = this.notes[i - 1];\n const next_note = this.notes[i + 1];\n const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n const beam_alone = prev_note && next_note &&\n note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n if (note_gets_beam) {\n // This note gets a beam at the current level\n if (beam_started) {\n // We're currently in the middle of a beam. Just continue it on to\n // the stem X of the current note.\n current_beam = beam_lines[beam_lines.length - 1];\n current_beam.end = stem_x;\n\n // If a secondary beam break is set up, end the beam right now.\n if (should_break) {\n beam_started = false;\n if (next_note && !next_note_gets_beam && current_beam.end === null) {\n // This note gets a beam,.but the next one does not. This means\n // we need a partial pointing right.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n }\n } else {\n // No beam started yet. Start a new one.\n current_beam = { start: stem_x, end: null };\n beam_started = true;\n\n if (beam_alone) {\n // previous and next beam exists and does not get a beam but current gets it.\n const prev_tick = prev_note.getIntrinsicTicks();\n const next_tick = next_note.getIntrinsicTicks();\n const tick = note.getIntrinsicTicks();\n const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n\n if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n current_beam.end = current_beam.start - partial_beam_length;\n } else {\n current_beam.end = current_beam.start + partial_beam_length;\n }\n } else if (!next_note_gets_beam) {\n // The next note doesn't get a beam. Draw a partial.\n if ((previous_should_break || i === 0) && next_note) {\n // This is the first note (but not the last one), or it is\n // following a secondary break. Draw a partial to the right.\n current_beam.end = current_beam.start + partial_beam_length;\n } else {\n // By default, draw a partial to the left.\n current_beam.end = current_beam.start - partial_beam_length;\n }\n } else if (should_break) {\n // This note should have a secondary break after it. Even though\n // we just started a beam, it needs to end immediately.\n current_beam.end = current_beam.start - partial_beam_length;\n beam_started = false;\n }\n beam_lines.push(current_beam);\n }\n } else {\n // The current note does not get a beam.\n beam_started = false;\n }\n\n // Store the secondary break flag to inform the partial beam logic in\n // the next iteration of the loop.\n previous_should_break = should_break;\n }\n\n // Add a partial beam pointing left if this is the last note in the group\n const last_beam = beam_lines[beam_lines.length - 1];\n if (last_beam && last_beam.end === null) {\n last_beam.end = last_beam.start - partial_beam_length;\n }\n return beam_lines;\n }\n\n // Render the stems for each notes\n drawStems() {\n this.notes.forEach(note => {\n if (note.getStem()) {\n note.getStem().setContext(this.context).draw();\n }\n }, this);\n }\n\n // Render the beam lines\n drawBeamLines() {\n this.checkContext();\n\n const valid_beam_durations = ['4', '8', '16', '32', '64'];\n\n const firstNote = this.notes[0];\n let beamY = this.getBeamYToDraw();\n const firstStemX = firstNote.getStemX();\n const beamThickness = this.render_options.beam_width * this.stem_direction;\n\n // Draw the beams.\n for (let i = 0; i < valid_beam_durations.length; ++i) {\n const duration = valid_beam_durations[i];\n const beamLines = this.getBeamLines(duration);\n\n for (let j = 0; j < beamLines.length; ++j) {\n const beam_line = beamLines[j];\n const startBeamX = beam_line.start;\n\n const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n const lastBeamX = beam_line.end;\n const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n\n this.context.beginPath();\n this.context.moveTo(startBeamX, startBeamY);\n this.context.lineTo(startBeamX, startBeamY + beamThickness);\n this.context.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n this.context.lineTo(lastBeamX + 1, lastBeamY);\n this.context.closePath();\n this.context.fill();\n }\n\n beamY += beamThickness * 1.5;\n }\n }\n\n // Pre-format the beam\n preFormat() { return this; }\n\n // Post-format the beam. This can only be called after\n // the notes in the beam have both `x` and `y` values. ie: they've\n // been formatted and have staves\n postFormat() {\n if (this.postFormatted) return;\n\n // Calculate a smart slope if we're not forcing the beams to be flat.\n if (this.notes[0].getCategory() === 'tabnotes' || this.render_options.flat_beams) {\n this.calculateFlatSlope();\n } else {\n this.calculateSlope();\n }\n this.applyStemExtensions();\n\n this.postFormatted = true;\n }\n\n // Render the beam to the canvas context\n draw() {\n this.checkContext();\n this.setRendered();\n if (this.unbeamable) return;\n\n if (!this.postFormatted) {\n this.postFormat();\n }\n\n this.drawStems();\n this.applyStyle();\n this.drawBeamLines();\n this.restoreStyle();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements the main Voice class. It's mainly a container\n// object to group `Tickables` for formatting.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Fraction } from './fraction';\n\nexport class Voice extends Element {\n // Modes allow the addition of ticks in three different ways:\n //\n // STRICT: This is the default. Ticks must fill the voice.\n // SOFT: Ticks can be added without restrictions.\n // FULL: Ticks do not need to fill the voice, but can't exceed the maximum\n // tick length.\n static get Mode() {\n return {\n STRICT: 1,\n SOFT: 2,\n FULL: 3,\n };\n }\n\n constructor(time) {\n super();\n this.setAttribute('type', 'Voice');\n\n // Time signature shortcut: \"4/4\", \"3/8\", etc.\n if (typeof(time) === 'string') {\n const match = time.match(/(\\d+)\\/(\\d+)/);\n if (match) {\n time = {\n num_beats: match[1],\n beat_value: match[2],\n resolution: Flow.RESOLUTION,\n };\n }\n }\n\n // Default time sig is 4/4\n this.time = Vex.Merge({\n num_beats: 4,\n beat_value: 4,\n resolution: Flow.RESOLUTION,\n }, time);\n\n // Recalculate total ticks.\n this.totalTicks = new Fraction(\n this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n\n this.resolutionMultiplier = 1;\n\n // Set defaults\n this.tickables = [];\n this.ticksUsed = new Fraction(0, 1);\n this.smallestTickCount = this.totalTicks.clone();\n this.largestTickWidth = 0;\n this.stave = null;\n // Do we care about strictly timed notes\n this.mode = Voice.Mode.STRICT;\n\n // This must belong to a VoiceGroup\n this.voiceGroup = null;\n }\n\n // Get the total ticks in the voice\n getTotalTicks() { return this.totalTicks; }\n\n // Get the total ticks used in the voice by all the tickables\n getTicksUsed() { return this.ticksUsed; }\n\n // Get the largest width of all the tickables\n getLargestTickWidth() { return this.largestTickWidth; }\n\n // Get the tick count for the shortest tickable\n getSmallestTickCount() { return this.smallestTickCount; }\n\n // Get the tickables in the voice\n getTickables() { return this.tickables; }\n\n // Get/set the voice mode, use a value from `Voice.Mode`\n getMode() { return this.mode; }\n setMode(mode) { this.mode = mode; return this; }\n\n // Get the resolution multiplier for the voice\n getResolutionMultiplier() { return this.resolutionMultiplier; }\n\n // Get the actual tick resolution for the voice\n getActualResolution() { return this.resolutionMultiplier * this.time.resolution; }\n\n // Set the voice's stave\n setStave(stave) {\n this.stave = stave;\n this.boundingBox = null; // Reset bounding box so we can reformat\n return this;\n }\n\n // Get the bounding box for the voice\n getBoundingBox() {\n let stave;\n let boundingBox;\n let bb;\n let i;\n\n if (!this.boundingBox) {\n if (!this.stave) throw new Vex.RERR('NoStave', \"Can't get bounding box without stave.\");\n stave = this.stave;\n boundingBox = null;\n\n for (i = 0; i < this.tickables.length; ++i) {\n this.tickables[i].setStave(stave);\n\n bb = this.tickables[i].getBoundingBox();\n if (!bb) continue;\n\n boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n }\n\n this.boundingBox = boundingBox;\n }\n return this.boundingBox;\n }\n\n // Every tickable must be associated with a voiceGroup. This allows formatters\n // and preformatters to associate them with the right modifierContexts.\n getVoiceGroup() {\n if (!this.voiceGroup) {\n throw new Vex.RERR('NoVoiceGroup', 'No voice group for voice.');\n }\n\n return this.voiceGroup;\n }\n\n // Set the voice group\n setVoiceGroup(g) { this.voiceGroup = g; return this; }\n\n // Set the voice mode to strict or soft\n setStrict(strict) {\n this.mode = strict ? Voice.Mode.STRICT : Voice.Mode.SOFT;\n return this;\n }\n\n // Determine if the voice is complete according to the voice mode\n isComplete() {\n if (this.mode === Voice.Mode.STRICT || this.mode === Voice.Mode.FULL) {\n return this.ticksUsed.equals(this.totalTicks);\n } else {\n return true;\n }\n }\n\n // Add a tickable to the voice\n addTickable(tickable) {\n if (!tickable.shouldIgnoreTicks()) {\n const ticks = tickable.getTicks();\n\n // Update the total ticks for this line.\n this.ticksUsed.add(ticks);\n\n if (\n (this.mode === Voice.Mode.STRICT || this.mode === Voice.Mode.FULL) &&\n this.ticksUsed.greaterThan(this.totalTicks)\n ) {\n this.ticksUsed.subtract(ticks);\n throw new Vex.RERR('BadArgument', 'Too many ticks.');\n }\n\n // Track the smallest tickable for formatting.\n if (ticks.lessThan(this.smallestTickCount)) {\n this.smallestTickCount = ticks.clone();\n }\n\n this.resolutionMultiplier = this.ticksUsed.denominator;\n\n // Expand total ticks using denominator from ticks used.\n this.totalTicks.add(0, this.ticksUsed.denominator);\n }\n\n // Add the tickable to the line.\n this.tickables.push(tickable);\n tickable.setVoice(this);\n return this;\n }\n\n // Add an array of tickables to the voice.\n addTickables(tickables) {\n for (let i = 0; i < tickables.length; ++i) {\n this.addTickable(tickables[i]);\n }\n\n return this;\n }\n\n // Preformats the voice by applying the voice's stave to each note.\n preFormat() {\n if (this.preFormatted) return this;\n\n this.tickables.forEach((tickable) => {\n if (!tickable.getStave()) {\n tickable.setStave(this.stave);\n }\n });\n\n this.preFormatted = true;\n return this;\n }\n\n // Render the voice onto the canvas `context` and an optional `stave`.\n // If `stave` is omitted, it is expected that the notes have staves\n // already set.\n draw(context = this.context, stave = this.stave) {\n this.setRendered();\n let boundingBox = null;\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n\n // Set the stave if provided\n if (stave) tickable.setStave(stave);\n\n if (!tickable.getStave()) {\n throw new Vex.RuntimeError(\n 'MissingStave', 'The voice cannot draw tickables without staves.'\n );\n }\n\n if (i === 0) boundingBox = tickable.getBoundingBox();\n\n if (i > 0 && boundingBox) {\n const tickable_bb = tickable.getBoundingBox();\n if (tickable_bb) boundingBox.mergeWith(tickable_bb);\n }\n\n tickable.setContext(context);\n tickable.drawWithStyle();\n }\n\n this.boundingBox = boundingBox;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Glyph } from './glyph';\n\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n if (\n type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n type !== StaveConnector.type.BOLD_DOUBLE_RIGHT\n ) {\n throw new Vex.RERR(\n 'InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.'\n );\n }\n\n let x_shift = 3;\n let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n const thickLineOffset = 2; // For aesthetics\n\n if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n x_shift = -5; // Flips the side of the thin line\n variableWidth = 3;\n }\n\n // Thin line\n ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n // Thick line\n ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n\nexport class StaveConnector extends Element {\n // SINGLE_LEFT and SINGLE are the same value for compatibility\n // with older versions of vexflow which didn't have right sided\n // stave connectors\n static get type() {\n return {\n SINGLE_RIGHT: 0,\n SINGLE_LEFT: 1,\n SINGLE: 1,\n DOUBLE: 2,\n BRACE: 3,\n BRACKET: 4,\n BOLD_DOUBLE_LEFT: 5,\n BOLD_DOUBLE_RIGHT: 6,\n THIN_DOUBLE: 7,\n NONE: 8,\n };\n }\n\n static get typeString() {\n return {\n singleRight: StaveConnector.type.SINGLE_RIGHT,\n singleLeft: StaveConnector.type.SINGLE_LEFT,\n single: StaveConnector.type.SINGLE,\n double: StaveConnector.type.DOUBLE,\n brace: StaveConnector.type.BRACE,\n bracket: StaveConnector.type.BRACKET,\n boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n thinDouble: StaveConnector.type.THIN_DOUBLE,\n none: StaveConnector.type.NONE,\n };\n }\n\n constructor(top_stave, bottom_stave) {\n super();\n this.setAttribute('type', 'StaveConnector');\n\n this.thickness = Flow.STAVE_LINE_THICKNESS;\n this.width = 3;\n this.top_stave = top_stave;\n this.bottom_stave = bottom_stave;\n this.type = StaveConnector.type.DOUBLE;\n this.font = {\n family: 'times',\n size: 16,\n weight: 'normal',\n };\n // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n // 2. Offset BRACE type not to overlap with another StaveConnector\n this.x_shift = 0;\n this.texts = [];\n }\n\n setType(type) {\n type = typeof(type) === 'string'\n ? StaveConnector.typeString[type]\n : type;\n\n if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n this.type = type;\n }\n return this;\n }\n\n setText(text, options) {\n this.texts.push({\n content: text,\n options: Vex.Merge({ shift_x: 0, shift_y: 0 }, options),\n });\n return this;\n }\n\n setFont(font) {\n Vex.Merge(this.font, font);\n }\n\n setXShift(x_shift) {\n if (typeof x_shift !== 'number') {\n throw Vex.RERR('InvalidType', 'x_shift must be a Number');\n }\n\n this.x_shift = x_shift;\n return this;\n }\n\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n\n let topY = this.top_stave.getYForLine(0);\n let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) +\n this.thickness;\n let width = this.width;\n let topX = this.top_stave.getX();\n\n const isRightSidedConnector = (\n this.type === StaveConnector.type.SINGLE_RIGHT ||\n this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n this.type === StaveConnector.type.THIN_DOUBLE\n );\n\n if (isRightSidedConnector) {\n topX = this.top_stave.getX() + this.top_stave.width;\n }\n\n let attachment_height = botY - topY;\n switch (this.type) {\n case StaveConnector.type.SINGLE:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_LEFT:\n width = 1;\n break;\n case StaveConnector.type.SINGLE_RIGHT:\n width = 1;\n break;\n case StaveConnector.type.DOUBLE:\n topX -= (this.width + 2);\n break;\n case StaveConnector.type.BRACE: {\n width = 12;\n // May need additional code to draw brace\n const x1 = this.top_stave.getX() - 2 + this.x_shift;\n const y1 = topY;\n const x3 = x1;\n const y3 = botY;\n const x2 = x1 - width;\n const y2 = y1 + attachment_height / 2.0;\n const cpx1 = x2 - (0.90 * width);\n const cpy1 = y1 + (0.2 * attachment_height);\n const cpx2 = x1 + (1.10 * width);\n const cpy2 = y2 - (0.135 * attachment_height);\n const cpx3 = cpx2;\n const cpy3 = y2 + (0.135 * attachment_height);\n const cpx4 = cpx1;\n const cpy4 = y3 - (0.2 * attachment_height);\n const cpx5 = x2 - width;\n const cpy5 = cpy4;\n const cpx6 = x1 + (0.40 * width);\n const cpy6 = y2 + (0.135 * attachment_height);\n const cpx7 = cpx6;\n const cpy7 = y2 - (0.135 * attachment_height);\n const cpx8 = cpx5;\n const cpy8 = cpy1;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n ctx.fill();\n ctx.stroke();\n break;\n } case StaveConnector.type.BRACKET:\n topY -= 4;\n botY += 4;\n attachment_height = botY - topY;\n Glyph.renderGlyph(ctx, topX - 5, topY - 3, 40, 'v1b', true);\n Glyph.renderGlyph(ctx, topX - 5, botY + 3, 40, 'v10', true);\n topX -= (this.width + 2);\n break;\n case StaveConnector.type.BOLD_DOUBLE_LEFT:\n drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY);\n break;\n case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n drawBoldDoubleLine(ctx, this.type, topX, topY, botY);\n break;\n case StaveConnector.type.THIN_DOUBLE:\n width = 1;\n break;\n case StaveConnector.type.NONE:\n break;\n default:\n throw new Vex.RERR(\n 'InvalidType', `The provided StaveConnector.type (${this.type}) is invalid`\n );\n }\n\n if (\n this.type !== StaveConnector.type.BRACE &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n this.type !== StaveConnector.type.NONE\n ) {\n ctx.fillRect(topX, topY, width, attachment_height);\n }\n\n // If the connector is a thin double barline, draw the paralell line\n if (this.type === StaveConnector.type.THIN_DOUBLE) {\n ctx.fillRect(topX - 3, topY, width, attachment_height);\n }\n\n ctx.save();\n ctx.lineWidth = 2;\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n // Add stave connector text\n for (let i = 0; i < this.texts.length; i++) {\n const text = this.texts[i];\n const text_width = ctx.measureText('' + text.content).width;\n const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 +\n text.options.shift_y;\n\n ctx.fillText('' + text.content, x, y + 4);\n }\n ctx.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// The tickable interface. Tickables are things that sit on a score and\n// have a duration, i.e., they occupy space in the musical rendering dimension.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Fraction } from './fraction';\n\nexport class Tickable extends Element {\n constructor() {\n super();\n this.setAttribute('type', 'Tickable');\n\n // These properties represent the duration of\n // this tickable element.\n this.ticks = new Fraction(0, 1);\n this.intrinsicTicks = 0;\n this.tickMultiplier = new Fraction(1, 1);\n\n this.width = 0;\n this.x_shift = 0; // Shift from tick context\n this.voice = null;\n this.tickContext = null;\n this.modifierContext = null;\n this.modifiers = [];\n this.preFormatted = false;\n this.postFormatted = false;\n this.tuplet = null;\n this.tupletStack = [];\n\n this.align_center = false;\n this.center_x_shift = 0; // Shift from tick context if center aligned\n\n // This flag tells the formatter to ignore this tickable during\n // formatting and justification. It is set by tickables such as BarNote.\n this.ignore_ticks = false;\n\n // This is a space for an external formatting class or function to maintain\n // metrics.\n this.formatterMetrics = {\n // The freedom of a tickable is the distance it can move without colliding\n // with neighboring elements. A formatter can set these values during its\n // formatting pass, which a different formatter can then use to fine tune.\n freedom: { left: 0, right: 0 },\n\n // The simplified rational duration of this tick as a string. It can be\n // used as an index to a map or hashtable.\n duration: '',\n\n // The number of formatting iterations undergone.\n iterations: 0,\n\n // The space in pixels allocated by this formatter, along with the mean space\n // for tickables of this duration, and the deviation from the mean.\n space: {\n used: 0,\n mean: 0,\n deviation: 0,\n },\n };\n }\n\n reset() { return this; }\n getTicks() { return this.ticks; }\n shouldIgnoreTicks() { return this.ignore_ticks; }\n getWidth() { return this.width; }\n\n getFormatterMetrics() { return this.formatterMetrics; }\n\n setXShift(x) { this.x_shift = x; }\n getCenterXShift() {\n if (this.isCenterAligned()) {\n return this.center_x_shift;\n }\n\n return 0;\n }\n isCenterAligned() { return this.align_center; }\n setCenterAlignment(align_center) {\n this.align_center = align_center;\n return this;\n }\n\n // Every tickable must be associated with a voice. This allows formatters\n // and preFormatter to associate them with the right modifierContexts.\n getVoice() {\n if (!this.voice) throw new Vex.RERR('NoVoice', 'Tickable has no voice.');\n return this.voice;\n }\n setVoice(voice) { this.voice = voice; }\n getTuplet() { return this.tuplet; }\n\n /*\n * resetTuplet\n * @param tuplet -- the specific tuplet to reset\n * if this is not provided, all tuplets are reset.\n * @returns this\n *\n * Removes any prior tuplets from the tick calculation and\n * resets the intrinsic tick value to\n */\n resetTuplet(tuplet) {\n let noteCount;\n let notesOccupied;\n if (tuplet) {\n const i = this.tupletStack.indexOf(tuplet);\n if (i !== -1) {\n this.tupletStack.splice(i, 1);\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n\n while (this.tupletStack.length) {\n tuplet = this.tupletStack.pop();\n noteCount = tuplet.getNoteCount();\n notesOccupied = tuplet.getNotesOccupied();\n\n // Revert old multiplier by inverting numerator & denom.:\n this.applyTickMultiplier(noteCount, notesOccupied);\n }\n return this;\n }\n\n setTuplet(tuplet) {\n // Attach to new tuplet\n\n if (tuplet) {\n this.tupletStack.push(tuplet);\n\n const noteCount = tuplet.getNoteCount();\n const notesOccupied = tuplet.getNotesOccupied();\n\n this.applyTickMultiplier(notesOccupied, noteCount);\n }\n\n this.tuplet = tuplet;\n\n return this;\n }\n\n /** optional, if tickable has modifiers **/\n addToModifierContext(mc) {\n this.modifierContext = mc;\n // Add modifiers to modifier context (if any)\n this.preFormatted = false;\n }\n\n /** optional, if tickable has modifiers **/\n addModifier(mod) {\n this.modifiers.push(mod);\n this.preFormatted = false;\n return this;\n }\n getModifiers() {\n return this.modifiers;\n }\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n }\n preFormat() {\n if (this.preFormatted) return;\n\n this.width = 0;\n if (this.modifierContext) {\n this.modifierContext.preFormat();\n this.width += this.modifierContext.getWidth();\n }\n }\n postFormat() {\n if (this.postFormatted) return this;\n this.postFormatted = true;\n return this;\n }\n getIntrinsicTicks() {\n return this.intrinsicTicks;\n }\n setIntrinsicTicks(intrinsicTicks) {\n this.intrinsicTicks = intrinsicTicks;\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n getTickMultiplier() {\n return this.tickMultiplier;\n }\n applyTickMultiplier(numerator, denominator) {\n this.tickMultiplier.multiply(numerator, denominator);\n this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n }\n setDuration(duration) {\n const ticks = duration.numerator * (Flow.RESOLUTION / duration.denominator);\n this.ticks = this.tickMultiplier.clone().multiply(ticks);\n this.intrinsicTicks = this.ticks.value();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements an abstract interface for notes and chords that\n// are rendered on a stave. Notes have some common properties: All of them\n// have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n//\n// Some notes have stems, heads, dots, etc. Most notational elements that\n// surround a note are called *modifiers*, and every note has an associated\n// array of them. All notes also have a rendering context and belong to a stave.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Tickable } from './tickable';\n\nexport class Note extends Tickable {\n static get CATEGORY() { return 'note'; }\n static get STAVEPADDING() { return 12; }\n\n // Debug helper. Displays various note metrics for the given\n // note.\n static plotMetrics(ctx, note, yPos) {\n const metrics = note.getMetrics();\n const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.extraLeftPx;\n const xPre1 = note.getAbsoluteX() - metrics.extraLeftPx;\n const xAbs = note.getAbsoluteX();\n const xPost1 = note.getAbsoluteX() + metrics.noteWidth;\n const xPost2 = note.getAbsoluteX() + metrics.noteWidth + metrics.extraRightPx;\n const xEnd = note.getAbsoluteX()\n + metrics.noteWidth\n + metrics.extraRightPx\n + metrics.modRightPx;\n const xFreedomRight = xEnd + note.getFormatterMetrics().freedom.right;\n\n const xWidth = xEnd - xStart;\n ctx.save();\n ctx.setFont('Arial', 8, '');\n ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n\n const y = (yPos + 7);\n function stroke(x1, x2, color, yy = y) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(3);\n ctx.moveTo(x1 + note.getXShift(), yy);\n ctx.lineTo(x2 + note.getXShift(), yy);\n ctx.stroke();\n }\n\n stroke(xStart, xPre1, 'red');\n stroke(xPre1, xAbs, '#999');\n stroke(xAbs, xPost1, 'green');\n stroke(xPost1, xPost2, '#999');\n stroke(xPost2, xEnd, 'red');\n stroke(xEnd, xFreedomRight, '#DD0');\n stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n Vex.drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n\n const formatterMetrics = note.getFormatterMetrics();\n if (formatterMetrics.iterations > 0) {\n const spaceDeviation = formatterMetrics.space.deviation;\n const prefix = spaceDeviation >= 0 ? '+' : '';\n ctx.setFillStyle('red');\n ctx.fillText(prefix + Math.round(spaceDeviation),\n xAbs + note.getXShift(), yPos - 10);\n }\n ctx.restore();\n }\n\n // Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n // positioning and layout.\n // To create a new note you need to provide a `noteStruct`, which consists\n // of the following fields:\n //\n // `type`: The note type (e.g., `r` for rest, `s` for slash notes, etc.)\n // `dots`: The number of dots, which affects the duration.\n // `duration`: The time length (e.g., `q` for quarter, `h` for half, `8` for eighth etc.)\n //\n // The range of values for these parameters are available in `src/tables.js`.\n constructor(noteStruct) {\n super();\n this.setAttribute('type', 'Note');\n\n if (!noteStruct) {\n throw new Vex.RuntimeError(\n 'BadArguments', 'Note must have valid initialization data to identify duration and type.'\n );\n }\n\n // Parse `noteStruct` and get note properties.\n const initStruct = Flow.parseNoteStruct(noteStruct);\n if (!initStruct) {\n throw new Vex.RuntimeError(\n 'BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`\n );\n }\n\n // Set note properties from parameters.\n this.duration = initStruct.duration;\n this.dots = initStruct.dots;\n this.noteType = initStruct.type;\n this.customTypes = initStruct.customTypes;\n\n if (noteStruct.duration_override) {\n // Custom duration\n this.setDuration(noteStruct.duration_override);\n } else {\n // Default duration\n this.setIntrinsicTicks(initStruct.ticks);\n }\n\n this.modifiers = [];\n\n // Get the glyph code for this note from the font.\n this.glyph = Flow.getGlyphProps(this.duration, this.noteType);\n this.customGlyphs = this.customTypes.map(t => Flow.getGlyphProps(this.duration, t));\n\n if (this.positions && (typeof (this.positions) !== 'object' || !this.positions.length)) {\n throw new Vex.RuntimeError('BadArguments', 'Note keys must be array type.');\n }\n\n // Note to play for audio players.\n this.playNote = null;\n\n // Positioning contexts used by the Formatter.\n this.tickContext = null; // The current tick context.\n this.modifierContext = null;\n this.ignore_ticks = false;\n\n // Positioning variables\n this.width = 0; // Width in pixels calculated after preFormat\n this.extraLeftPx = 0; // Extra room on left for offset note head\n this.extraRightPx = 0; // Extra room on right for offset note head\n this.x_shift = 0; // X shift from tick context X\n this.left_modPx = 0; // Max width of left modifiers\n this.right_modPx = 0; // Max width of right modifiers\n this.voice = null; // The voice that this note is in\n this.preFormatted = false; // Is this note preFormatted?\n this.ys = []; // list of y coordinates for each note\n // we need to hold on to these for ties and beams.\n\n if (noteStruct.align_center) {\n this.setCenterAlignment(noteStruct.align_center);\n }\n\n // The render surface.\n this.stave = null;\n this.render_options = {\n annotation_spacing: 5,\n stave_padding: Note.STAVEPADDING,\n };\n }\n\n // Get and set the play note, which is arbitrary data that can be used by an\n // audio player.\n getPlayNote() { return this.playNote; }\n setPlayNote(note) { this.playNote = note; return this; }\n\n // Don't play notes by default, call them rests. This is also used by things like\n // beams and dots for positioning.\n isRest() { return false; }\n\n // TODO(0xfe): Why is this method here?\n addStroke(index, stroke) {\n stroke.setNote(this);\n stroke.setIndex(index);\n this.modifiers.push(stroke);\n this.setPreFormatted(false);\n return this;\n }\n\n // Get and set the target stave.\n getStave() { return this.stave; }\n setStave(stave) {\n this.stave = stave;\n this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n this.context = this.stave.context;\n return this;\n }\n\n // `Note` is not really a modifier, but is used in\n // a `ModifierContext`.\n getCategory() { return Note.CATEGORY; }\n\n // Set the rendering context for the note.\n setContext(context) { this.context = context; return this; }\n\n // Get and set spacing to the left and right of the notes.\n getExtraLeftPx() { return this.extraLeftPx; }\n getExtraRightPx() { return this.extraRightPx; }\n setExtraLeftPx(x) { this.extraLeftPx = x; return this; }\n setExtraRightPx(x) { this.extraRightPx = x; return this; }\n\n // Returns true if this note has no duration (e.g., bar notes, spacers, etc.)\n shouldIgnoreTicks() { return this.ignore_ticks; }\n\n // Get the stave line number for the note.\n getLineNumber() { return 0; }\n\n // Get the stave line number for rest.\n getLineForRest() { return 0; }\n\n // Get the glyph associated with this note.\n getGlyph() { return this.glyph; }\n\n getGlyphWidth() {\n return this.glyph.getWidth(this.render_options.glyph_font_scale);\n }\n\n // Set and get Y positions for this note. Each Y value is associated with\n // an individual pitch/key within the note/chord.\n setYs(ys) { this.ys = ys; return this; }\n getYs() {\n if (this.ys.length === 0) {\n throw new Vex.RERR('NoYValues', 'No Y-values calculated for this note.');\n }\n\n return this.ys;\n }\n\n // Get the Y position of the space above the stave onto which text can\n // be rendered.\n getYForTopText(text_line) {\n if (!this.stave) {\n throw new Vex.RERR('NoStave', 'No stave attached to this note.');\n }\n\n return this.stave.getYForTopText(text_line);\n }\n\n // Get a `BoundingBox` for this note.\n getBoundingBox() { return null; }\n\n // Returns the voice that this note belongs in.\n getVoice() {\n if (!this.voice) throw new Vex.RERR('NoVoice', 'Note has no voice.');\n return this.voice;\n }\n\n // Attach this note to `voice`.\n setVoice(voice) {\n this.voice = voice;\n this.preFormatted = false;\n return this;\n }\n\n // Get and set the `TickContext` for this note.\n getTickContext() { return this.tickContext; }\n setTickContext(tc) {\n this.tickContext = tc;\n this.preFormatted = false;\n return this;\n }\n\n // Accessors for the note type.\n getDuration() { return this.duration; }\n isDotted() { return (this.dots > 0); }\n hasStem() { return false; }\n getDots() { return this.dots; }\n getNoteType() { return this.noteType; }\n setBeam() { return this; } // ignore parameters\n\n // Attach this note to a modifier context.\n setModifierContext(mc) { this.modifierContext = mc; return this; }\n\n // Attach a modifier to this note.\n addModifier(modifier, index = 0) {\n modifier.setNote(this);\n modifier.setIndex(index);\n this.modifiers.push(modifier);\n this.setPreFormatted(false);\n return this;\n }\n\n // Get the coordinates for where modifiers begin.\n getModifierStartXY() {\n if (!this.preFormatted) {\n throw new Vex.RERR('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n\n return {\n x: this.getAbsoluteX(),\n y: this.ys[0],\n };\n }\n\n // Get bounds and metrics for this note.\n //\n // Returns a struct with fields:\n // `width`: The total width of the note (including modifiers.)\n // `noteWidth`: The width of the note head only.\n // `left_shift`: The horizontal displacement of the note.\n // `modLeftPx`: Start `X` for left modifiers.\n // `modRightPx`: Start `X` for right modifiers.\n // `extraLeftPx`: Extra space on left of note.\n // `extraRightPx`: Extra space on right of note.\n getMetrics() {\n if (!this.preFormatted) {\n throw new Vex.RERR('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n }\n\n let modLeftPx = 0;\n let modRightPx = 0;\n if (this.modifierContext != null) {\n modLeftPx = this.modifierContext.state.left_shift;\n modRightPx = this.modifierContext.state.right_shift;\n }\n\n const width = this.getWidth();\n return {\n width,\n noteWidth: width - modLeftPx - modRightPx - this.extraLeftPx - this.extraRightPx,\n left_shift: this.x_shift, // TODO(0xfe): Make style consistent\n\n // Modifiers, accidentals etc.\n modLeftPx,\n modRightPx,\n\n // Displaced note head on left or right.\n extraLeftPx: this.extraLeftPx,\n extraRightPx: this.extraRightPx,\n };\n }\n\n // Get and set width of note. Used by the formatter for positioning.\n setWidth(width) { this.width = width; }\n getWidth() {\n if (!this.preFormatted) {\n throw new Vex.RERR('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n }\n\n return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n }\n\n // Displace note by `x` pixels. Used by the formatter.\n setXShift(x) { this.x_shift = x; return this; }\n getXShift() { return this.x_shift; }\n\n // Get `X` position of this tick context.\n getX() {\n if (!this.tickContext) {\n throw new Vex.RERR('NoTickContext', 'Note needs a TickContext assigned for an X-Value');\n }\n\n return this.tickContext.getX() + this.x_shift;\n }\n\n // Get the absolute `X` position of this note's tick context. This\n // excludes x_shift, so you'll need to factor it in if you're\n // looking for the post-formatted x-position.\n getAbsoluteX() {\n if (!this.tickContext) {\n throw new Vex.RERR('NoTickContext', 'Note needs a TickContext assigned for an X-Value');\n }\n\n // Position note to left edge of tick context.\n let x = this.tickContext.getX();\n if (this.stave) {\n x += this.stave.getNoteStartX() + this.render_options.stave_padding;\n }\n\n if (this.isCenterAligned()) {\n x += this.getCenterXShift();\n }\n\n return x;\n }\n setPreFormatted(value) {\n this.preFormatted = value;\n\n // Maintain the width of left and right modifiers in pixels.\n if (this.preFormatted) {\n const extra = this.tickContext.getExtraPx();\n this.left_modPx = Math.max(this.left_modPx, extra.left);\n this.right_modPx = Math.max(this.right_modPx, extra.right);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `NoteHeads`. `NoteHeads` are typically not manipulated\n// directly, but used internally in `StaveNote`.\n//\n// See `tests/notehead_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { StaveNote } from './stavenote';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`.\nfunction L(...args) { if (NoteHead.DEBUG) Vex.L('Vex.Flow.NoteHead', args); }\n\n// Draw slashnote head manually. No glyph exists for this.\n//\n// Parameters:\n// * `ctx`: the Canvas context\n// * `duration`: the duration of the note. ex: \"4\"\n// * `x`: the x coordinate to draw at\n// * `y`: the y coordinate to draw at\n// * `stem_direction`: the direction of the stem\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n const width = Flow.SLASH_NOTEHEAD_WIDTH;\n ctx.save();\n ctx.setLineWidth(Flow.STEM_WIDTH);\n\n let fill = false;\n\n if (Flow.durationToNumber(duration) > 2) {\n fill = true;\n }\n\n if (!fill) x -= (Flow.STEM_WIDTH / 2) * stem_direction;\n\n ctx.beginPath();\n ctx.moveTo(x, y + staveSpace);\n ctx.lineTo(x, y + 1);\n ctx.lineTo(x + width, y - staveSpace);\n ctx.lineTo(x + width, y);\n ctx.lineTo(x, y + staveSpace);\n ctx.closePath();\n\n if (fill) {\n ctx.fill();\n } else {\n ctx.stroke();\n }\n\n if (Flow.durationToFraction(duration).equals(0.5)) {\n const breve_lines = [-3, -1, width + 1, width + 3];\n for (let i = 0; i < breve_lines.length; i++) {\n ctx.beginPath();\n ctx.moveTo(x + breve_lines[i], y - 10);\n ctx.lineTo(x + breve_lines[i], y + 11);\n ctx.stroke();\n }\n }\n\n ctx.restore();\n}\n\nexport class NoteHead extends Note {\n static get CATEGORY() { return 'notehead'; }\n\n constructor(head_options) {\n super(head_options);\n this.setAttribute('type', 'NoteHead');\n\n this.index = head_options.index;\n this.x = head_options.x || 0;\n this.y = head_options.y || 0;\n this.note_type = head_options.note_type;\n this.duration = head_options.duration;\n this.displaced = head_options.displaced || false;\n this.stem_direction = head_options.stem_direction || StaveNote.STEM_UP;\n this.line = head_options.line;\n\n // Get glyph code based on duration and note type. This could be\n // regular notes, rests, or other custom codes.\n this.glyph = Flow.getGlyphProps(this.duration, this.note_type);\n if (!this.glyph) {\n throw new Vex.RuntimeError(\n 'BadArguments',\n `No glyph found for duration '${this.duration}' and type '${this.note_type}'`);\n }\n\n this.glyph_code = this.glyph.code_head;\n this.x_shift = head_options.x_shift || 0;\n if (head_options.custom_glyph_code) {\n this.custom_glyph = true;\n this.glyph_code = head_options.custom_glyph_code;\n this.stem_up_x_offset = head_options.stem_up_x_offset || 0;\n this.stem_down_x_offset = head_options.stem_down_x_offset || 0;\n }\n\n this.style = head_options.style;\n this.slashed = head_options.slashed;\n\n Vex.Merge(this.render_options, {\n // font size for note heads\n glyph_font_scale: head_options.glyph_font_scale || Flow.DEFAULT_NOTATION_FONT_SCALE,\n // number of stroke px to the left and right of head\n stroke_px: 3,\n });\n\n this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n }\n\n getCategory() { return NoteHead.CATEGORY; }\n\n // Get the width of the notehead\n getWidth() { return this.width; }\n\n // Determine if the notehead is displaced\n isDisplaced() { return this.displaced === true; }\n\n // Get the glyph data\n getGlyph() { return this.glyph; }\n\n // Set the X coordinate\n setX(x) { this.x = x; return this; }\n\n // get/set the Y coordinate\n getY() { return this.y; }\n setY(y) { this.y = y; return this; }\n\n // Get/set the stave line the notehead is placed on\n getLine() { return this.line; }\n setLine(line) { this.line = line; return this; }\n\n // Get the canvas `x` coordinate position of the notehead.\n getAbsoluteX() {\n // If the note has not been preformatted, then get the static x value\n // Otherwise, it's been formatted and we should use it's x value relative\n // to its tick context\n const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n\n // For a more natural displaced notehead, we adjust the displacement amount\n // by half the stem width in order to maintain a slight overlap with the stem\n const displacementStemAdjustment = (Stem.WIDTH / 2);\n\n return x + (this.displaced\n ? (this.width - displacementStemAdjustment) * this.stem_direction\n : 0\n );\n }\n\n // Get the `BoundingBox` for the `NoteHead`\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new Vex.RERR('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n\n const spacing = this.stave.getSpacingBetweenLines();\n const half_spacing = spacing / 2;\n const min_y = this.y - half_spacing;\n\n return new Flow.BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n }\n\n // Set notehead to a provided `stave`\n setStave(stave) {\n const line = this.getLine();\n\n this.stave = stave;\n this.setY(stave.getYForNote(line));\n this.context = this.stave.context;\n return this;\n }\n\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted) return this;\n\n const width = this.getWidth() + this.extraLeftPx + this.extraRightPx;\n\n this.setWidth(width);\n this.setPreFormatted(true);\n return this;\n }\n\n // Draw the notehead\n draw() {\n this.checkContext();\n this.setRendered();\n\n const ctx = this.context;\n let head_x = this.getAbsoluteX();\n if (this.custom_glyph) {\n // head_x += this.x_shift;\n head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n }\n\n const y = this.y;\n\n L(\"Drawing note head '\", this.note_type, this.duration, \"' at\", head_x, y);\n\n // Begin and end positions for head.\n const stem_direction = this.stem_direction;\n const glyph_font_scale = this.render_options.glyph_font_scale;\n\n if (this.style) {\n this.applyStyle(ctx);\n }\n\n if (this.note_type === 's') {\n const staveSpace = this.stave.getSpacingBetweenLines();\n drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n } else {\n Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code);\n }\n\n if (this.style) {\n this.restoreStyle(ctx);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Stem } from './stem';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\n\nexport class StemmableNote extends Note {\n constructor(note_struct) {\n super(note_struct);\n this.setAttribute('type', 'StemmableNote');\n\n this.stem = null;\n this.stemExtensionOverride = null;\n this.beam = null;\n }\n\n // Get and set the note's `Stem`\n getStem() { return this.stem; }\n setStem(stem) { this.stem = stem; return this; }\n\n // Builds and sets a new stem\n buildStem() {\n const stem = new Stem();\n this.setStem(stem);\n return this;\n }\n\n buildFlag() {\n const { glyph, beam } = this;\n const shouldRenderFlag = beam === null;\n\n if (glyph && glyph.flag && shouldRenderFlag) {\n const flagCode = this.getStemDirection() === Stem.DOWN\n ? glyph.code_flag_downstem\n : glyph.code_flag_upstem;\n\n this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale);\n }\n }\n\n // Get the glyph associated with the top key of this note\n getTopGlyph() {\n if (this.getStemDirection() === Stem.DOWN) {\n return this.customGlyphs[this.customGlyphs.length - 1];\n } else {\n return this.customGlyphs[0];\n }\n }\n\n // Get the full length of stem\n getStemLength() {\n return Stem.HEIGHT + this.getStemExtension();\n }\n\n // Get the number of beams for this duration\n getBeamCount() {\n const glyph = this.getGlyph();\n\n if (glyph) {\n return glyph.beam_count;\n } else {\n return 0;\n }\n }\n\n // Get the minimum length of stem\n getStemMinumumLength() {\n const frac = Flow.durationToFraction(this.duration);\n let length = frac.value() <= 1 ? 0 : 20;\n // if note is flagged, cannot shorten beam\n switch (this.duration) {\n case '8':\n if (this.beam == null) length = 35;\n break;\n case '16':\n length = this.beam == null ? 35 : 25;\n break;\n case '32':\n length = this.beam == null ? 45 : 35;\n break;\n case '64':\n length = this.beam == null ? 50 : 40;\n break;\n case '128':\n length = this.beam == null ? 55 : 45;\n break;\n default:\n break;\n }\n return length;\n }\n\n // Get/set the direction of the stem\n getStemDirection() { return this.stem_direction; }\n setStemDirection(direction) {\n if (!direction) direction = Stem.UP;\n if (direction !== Stem.UP && direction !== Stem.DOWN) {\n throw new Vex.RERR('BadArgument', `Invalid stem direction: ${direction}`);\n }\n\n this.stem_direction = direction;\n if (this.stem) {\n this.stem.setDirection(direction);\n this.stem.setExtension(this.getStemExtension());\n const glyph = this.getTopGlyph() || this.getGlyph();\n this.stem.setOptions({\n stem_up_y_offset: glyph.stem_up_y_offset,\n stem_down_y_offset: glyph.stem_down_y_offset\n });\n }\n\n this.reset();\n if (this.flag) {\n this.buildFlag();\n }\n\n this.beam = null;\n if (this.preFormatted) {\n this.preFormat();\n }\n\n return this;\n }\n\n // Get the `x` coordinate of the stem\n getStemX() {\n const x_begin = this.getAbsoluteX() + this.x_shift;\n const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n return stem_x;\n }\n\n // Get the `x` coordinate for the center of the glyph.\n // Used for `TabNote` stems and stemlets over rests\n getCenterGlyphX() {\n return this.getAbsoluteX() + this.x_shift + (this.getGlyphWidth() / 2);\n }\n\n // Get the stem extension for the current duration\n getStemExtension() {\n const glyph = this.getGlyph();\n\n if (this.stemExtensionOverride != null) {\n return this.stemExtensionOverride;\n }\n\n if (glyph) {\n return this.getStemDirection() === 1\n ? glyph.stem_up_extension\n : glyph.stem_down_extension;\n }\n\n return 0;\n }\n\n // Set the stem length to a specific. Will override the default length.\n setStemLength(height) {\n this.stemExtensionOverride = (height - Stem.HEIGHT);\n return this;\n }\n\n // Get the top and bottom `y` values of the stem.\n getStemExtents() {\n return this.stem.getExtents();\n }\n\n // Sets the current note's beam\n setBeam(beam) { this.beam = beam; return this; }\n\n // Get the `y` value for the top/bottom modifiers at a specific `textLine`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n if (this.hasStem()) {\n return Math.min(\n this.stave.getYForTopText(textLine),\n extents.topY - (this.render_options.annotation_spacing * (textLine + 1))\n );\n } else {\n return this.stave.getYForTopText(textLine);\n }\n }\n\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n if (this.hasStem()) {\n return Math.max(\n this.stave.getYForTopText(textLine),\n extents.baseY + (this.render_options.annotation_spacing * (textLine))\n );\n } else {\n return this.stave.getYForBottomText(textLine);\n }\n }\n\n hasFlag() {\n return Flow.getGlyphProps(this.duration).flag && !this.beam;\n }\n\n // Post format the note\n postFormat() {\n if (this.beam) this.beam.postFormat();\n\n this.postFormatted = true;\n\n return this;\n }\n\n // Render the stem onto the canvas\n drawStem(stem_struct) {\n this.checkContext();\n this.setRendered();\n\n this.setStem(new Stem(stem_struct));\n this.stem.setContext(this.context).draw();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// `Modifier` is an abstract interface for notational elements that modify\n// a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n//\n// For a `Modifier` instance to be positioned correctly, it must be part of\n// a `ModifierContext`. All modifiers in the same context are rendered relative to\n// one another.\n//\n// Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n// in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n// `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\n\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) Vex.L('Vex.Flow.Modifier', args); }\n\nexport class Modifier extends Element {\n static get CATEGORY() { return 'none'; }\n\n // Modifiers can be positioned almost anywhere, relative to a note.\n static get Position() {\n return {\n LEFT: 1,\n RIGHT: 2,\n ABOVE: 3,\n BELOW: 4,\n };\n }\n\n static get PositionString() {\n return {\n above: Modifier.Position.ABOVE,\n below: Modifier.Position.BELOW,\n left: Modifier.Position.LEFT,\n right: Modifier.Position.RIGHT,\n };\n }\n\n constructor() {\n super();\n this.setAttribute('type', 'Modifier');\n\n this.width = 0;\n\n // Modifiers are attached to a note and an index. An index is a\n // specific head in a chord.\n this.note = null;\n this.index = null;\n\n // The `text_line` is reserved space above or below a stave.\n this.text_line = 0;\n this.position = Modifier.Position.LEFT;\n this.modifier_context = null;\n this.x_shift = 0;\n this.y_shift = 0;\n this.spacingFromNextModifier = 0;\n }\n\n // Every modifier has a category. The `ModifierContext` uses this to determine\n // the type and order of the modifiers.\n getCategory() { return Modifier.CATEGORY; }\n\n // Get and set modifier widths.\n getWidth() { return this.width; }\n setWidth(width) { this.width = width; return this; }\n\n // Get and set attached note (`StaveNote`, `TabNote`, etc.)\n getNote() { return this.note; }\n setNote(note) { this.note = note; return this; }\n\n // Get and set note index, which is a specific note in a chord.\n getIndex() { return this.index; }\n setIndex(index) { this.index = index; return this; }\n\n // Every modifier must be part of a `ModifierContext`.\n getModifierContext() { return this.modifier_context; }\n setModifierContext(c) { this.modifier_context = c; return this; }\n\n // Get and set articulation position.\n getPosition() { return this.position; }\n setPosition(position) {\n this.position = typeof(position) === 'string'\n ? Modifier.PositionString[position]\n : position;\n return this;\n }\n\n // Set the `text_line` for the modifier.\n setTextLine(line) { this.text_line = line; return this; }\n\n // Shift modifier down `y` pixels. Negative values shift up.\n setYShift(y) { this.y_shift = y; return this; }\n\n setSpacingFromNextModifier(x) {\n this.spacingFromNextModifier = x;\n }\n\n getSpacingFromNextModifier() { return this.spacingFromNextModifier; }\n\n // Shift modifier `x` pixels in the direction of the modifier. Negative values\n // shift reverse.\n setXShift(x) {\n this.x_shift = 0;\n if (this.position === Modifier.Position.LEFT) {\n this.x_shift -= x;\n } else {\n this.x_shift += x;\n }\n }\n getXShift() { return this.x_shift; }\n\n // Render the modifier onto the canvas.\n draw() {\n this.checkContext();\n throw new Vex.RERR('MethodNotImplemented', 'draw() not implemented for this modifier.');\n }\n\n // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n alignSubNotesWithNote(subNotes, note) {\n // Shift over the tick contexts of each note\n const tickContext = note.getTickContext();\n const extraPx = tickContext.getExtraPx();\n const subNoteXOffset = tickContext.getX() - extraPx.left - extraPx.extraLeft\n + this.getSpacingFromNextModifier();\n\n subNotes.forEach((subNote) => {\n const subTickContext = subNote.getTickContext();\n subNote.setStave(note.stave);\n subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n });\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\n\nexport class Dot extends Modifier {\n static get CATEGORY() { return 'dots'; }\n\n // Arrange dots inside a ModifierContext.\n static format(dots, state) {\n const right_shift = state.right_shift;\n const dot_spacing = 1;\n\n if (!dots || dots.length === 0) return false;\n\n const dot_list = [];\n const max_shift_map = {};\n for (let i = 0; i < dots.length; ++i) {\n const dot = dots[i];\n const note = dot.getNote();\n\n let props;\n let shift;\n // Only StaveNote has .getKeyProps()\n if (typeof note.getKeyProps === 'function') {\n props = note.getKeyProps()[dot.getIndex()];\n shift = (props.displaced ? note.getExtraRightPx() : 0);\n } else { // Else it's a TabNote\n props = { line: 0.5 }; // Shim key props for dot placement\n shift = 0;\n }\n\n const note_id = note.getAttribute('id');\n dot_list.push({ line: props.line, note, note_id, dot });\n max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n }\n\n // Sort dots by line number.\n dot_list.sort((a, b) => b.line - a.line);\n\n let dot_shift = right_shift;\n let x_width = 0;\n let last_line = null;\n let last_note = null;\n let prev_dotted_space = null;\n let half_shiftY = 0;\n\n for (let i = 0; i < dot_list.length; ++i) {\n const { dot, note, note_id, line } = dot_list[i];\n\n // Reset the position of the dot every line.\n if (line !== last_line || note !== last_note) {\n dot_shift = max_shift_map[note_id];\n }\n\n if (!note.isRest() && line !== last_line) {\n if (Math.abs(line % 1) === 0.5) {\n // note is on a space, so no dot shift\n half_shiftY = 0;\n } else {\n // note is on a line, so shift dot to space above the line\n half_shiftY = 0.5;\n if (last_note != null &&\n !last_note.isRest() && last_line - line === 0.5) {\n // previous note on a space, so shift dot to space below the line\n half_shiftY = -0.5;\n } else if (line + half_shiftY === prev_dotted_space) {\n // previous space is dotted, so shift dot to space below the line\n half_shiftY = -0.5;\n }\n }\n }\n\n // convert half_shiftY to a multiplier for dots.draw()\n if (note.isRest()) {\n dot.dot_shiftY += -half_shiftY;\n } else {\n dot.dot_shiftY = -half_shiftY;\n }\n prev_dotted_space = line + half_shiftY;\n\n dot.setXShift(dot_shift);\n dot_shift += dot.getWidth() + dot_spacing; // spacing\n x_width = (dot_shift > x_width) ? dot_shift : x_width;\n last_line = line;\n last_note = note;\n }\n\n // Update state.\n state.right_shift += x_width;\n return true;\n }\n\n /**\n * @constructor\n */\n constructor() {\n super();\n this.setAttribute('type', 'Dot');\n\n this.note = null;\n this.index = null;\n this.position = Modifier.Position.RIGHT;\n\n this.radius = 2;\n this.setWidth(5);\n this.dot_shiftY = 0;\n }\n\n getCategory() { return Dot.CATEGORY; }\n\n setNote(note) {\n this.note = note;\n\n if (this.note.getCategory() === 'gracenotes') {\n this.radius *= 0.50;\n this.setWidth(3);\n }\n }\n\n setDotShiftY(y) { this.dot_shiftY = y; return this; }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n if (!this.note || this.index === null) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw dot without a note and index.\");\n }\n\n const lineSpace = this.note.stave.options.spacing_between_lines_px;\n\n const start = this.note.getModifierStartXY(this.position, this.index,\n { forceFlagRight: true });\n\n // Set the starting y coordinate to the base of the stem for TabNotes\n if (this.note.getCategory() === 'tabnotes') {\n start.y = this.note.getStemExtents().baseY;\n }\n\n const x = (start.x + this.x_shift) + this.width - this.radius;\n const y = start.y + this.y_shift + (this.dot_shiftY * lineSpace);\n const ctx = this.context;\n\n ctx.beginPath();\n ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n ctx.fill();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// *Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.*\n//\n// See `tests/stavenote_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { BoundingBox } from './boundingbox';\nimport { Stem } from './stem';\nimport { NoteHead } from './notehead';\nimport { StemmableNote } from './stemmablenote';\nimport { Modifier } from './modifier';\nimport { Dot } from './dot';\n\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\nfunction L(...args) { if (StaveNote.DEBUG) Vex.L('Vex.Flow.StaveNote', args); }\n\nconst getStemAdjustment = (note) => Stem.WIDTH / (2 * -note.getStemDirection());\n\nconst isInnerNoteIndex = (note, index) =>\n index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n const delta = (note.isrest ? 0.0 : 1.0) * dir;\n\n rest.line += delta;\n rest.maxLine += delta;\n rest.minLine += delta;\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) + (delta));\n}\n\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n const delta = rest.line - Vex.MidLine(noteU.minLine, noteL.maxLine);\n rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n rest.line -= delta;\n rest.maxLine -= delta;\n rest.minLine -= delta;\n}\n\nexport class StaveNote extends StemmableNote {\n static get CATEGORY() { return 'stavenotes'; }\n static get STEM_UP() { return Stem.UP; }\n static get STEM_DOWN() { return Stem.DOWN; }\n static get DEFAULT_LEDGER_LINE_OFFSET() { return 3; }\n\n // ## Static Methods\n //\n // Format notes inside a ModifierContext.\n static format(notes, state) {\n if (!notes || notes.length < 2) return false;\n\n // FIXME: VexFlow will soon require that a stave be set before formatting.\n // Which, according to the below condition, means that following branch will\n // always be taken and the rest of this function is dead code.\n //\n // Problematically, `Formatter#formatByY` was not designed to work for more\n // than 2 voices (although, doesn't throw on this condition, just tries\n // to power through).\n //\n // Based on the above:\n // * 2 voices can be formatted *with or without* a stave being set but\n // the output will be different\n // * 3 voices can only be formatted *without* a stave\n if (notes[0].getStave()) {\n return StaveNote.formatByY(notes, state);\n }\n\n const notesList = [];\n\n for (let i = 0; i < notes.length; i++) {\n const props = notes[i].getKeyProps();\n const line = props[0].line;\n let minL = props[props.length - 1].line;\n const stemDirection = notes[i].getStemDirection();\n const stemMax = notes[i].getStemLength() / 10;\n const stemMin = notes[i].getStemMinumumLength() / 10;\n\n let maxL;\n if (notes[i].isRest()) {\n maxL = line + notes[i].glyph.line_above;\n minL = line - notes[i].glyph.line_below;\n } else {\n maxL = stemDirection === 1\n ? props[props.length - 1].line + stemMax\n : props[props.length - 1].line;\n\n minL = stemDirection === 1\n ? props[0].line\n : props[0].line - stemMax;\n }\n\n notesList.push({\n line: props[0].line, // note/rest base line\n maxLine: maxL, // note/rest upper bounds line\n minLine: minL, // note/rest lower bounds line\n isrest: notes[i].isRest(),\n stemDirection,\n stemMax, // Maximum (default) note stem length;\n stemMin, // minimum note stem length\n voice_shift: notes[i].getVoiceShiftWidth(),\n is_displaced: notes[i].isDisplaced(), // note manually displaced\n note: notes[i],\n });\n }\n\n const voices = notesList.length;\n\n let noteU = notesList[0];\n const noteM = voices > 2 ? notesList[1] : null;\n let noteL = voices > 2 ? notesList[2] : notesList[1];\n\n // for two voice backward compatibility, ensure upper voice is stems up\n // for three voices, the voices must be in order (upper, middle, lower)\n if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n noteU = notesList[1];\n noteL = notesList[0];\n }\n\n const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n let xShift = 0;\n let stemDelta;\n\n // Test for two voice note intersection\n if (voices === 2) {\n const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n // if top voice is a middle voice, check stem intersection with lower voice\n if (noteU.stemDirection === noteL.stemDirection &&\n noteU.minLine <= noteL.maxLine) {\n if (!noteU.isrest) {\n stemDelta = Math.abs(noteU.line - (noteL.maxLine + 0.5));\n stemDelta = Math.max(stemDelta, noteU.stemMin);\n noteU.minLine = noteU.line - stemDelta;\n noteU.note.setStemLength(stemDelta * 10);\n }\n }\n if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n if (noteU.isrest) {\n // shift rest up\n shiftRestVertical(noteU, noteL, 1);\n } else if (noteL.isrest) {\n // shift rest down\n shiftRestVertical(noteL, noteU, -1);\n } else {\n xShift = voiceXShift;\n if (noteU.stemDirection === noteL.stemDirection) {\n // upper voice is middle voice, so shift it right\n noteU.note.setXShift(xShift + 3);\n } else {\n // shift lower voice right\n noteL.note.setXShift(xShift);\n }\n }\n }\n\n // format complete\n return true;\n }\n\n // Check middle voice stem intersection with lower voice\n if (noteM !== null && noteM.minLine < noteL.maxLine + 0.5) {\n if (!noteM.isrest) {\n stemDelta = Math.abs(noteM.line - (noteL.maxLine + 0.5));\n stemDelta = Math.max(stemDelta, noteM.stemMin);\n noteM.minLine = noteM.line - stemDelta;\n noteM.note.setStemLength(stemDelta * 10);\n }\n }\n\n // For three voices, test if rests can be repositioned\n //\n // Special case 1 :: middle voice rest between two notes\n //\n if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n const restHeight = noteM.maxLine - noteM.minLine;\n const space = noteU.minLine - noteL.maxLine;\n if (restHeight < space) {\n // center middle voice rest between the upper and lower voices\n centerRest(noteM, noteU, noteL);\n } else {\n xShift = voiceXShift + 3; // shift middle rest right\n noteM.note.setXShift(xShift);\n }\n // format complete\n return true;\n }\n }\n\n // Special case 2 :: all voices are rests\n if (noteU.isrest && noteM.isrest && noteL.isrest) {\n // Shift upper voice rest up\n shiftRestVertical(noteU, noteM, 1);\n // Shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n // format complete\n return true;\n }\n\n // Test if any other rests can be repositioned\n if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n // Shift middle voice rest up\n shiftRestVertical(noteM, noteL, 1);\n }\n if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n // Shift middle voice rest down\n shiftRestVertical(noteM, noteU, -1);\n }\n if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n // shift upper voice rest up;\n shiftRestVertical(noteU, noteM, 1);\n }\n if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n // shift lower voice rest down\n shiftRestVertical(noteL, noteM, -1);\n }\n\n // If middle voice intersects upper or lower voice\n if ((!noteU.isrest && !noteM.isrest && noteU.minLine <= noteM.maxLine + 0.5) ||\n (!noteM.isrest && !noteL.isrest && noteM.minLine <= noteL.maxLine)) {\n xShift = voiceXShift + 3; // shift middle note right\n noteM.note.setXShift(xShift);\n }\n\n return true;\n }\n\n static formatByY(notes, state) {\n // NOTE: this function does not support more than two voices per stave\n // use with care.\n let hasStave = true;\n\n for (let i = 0; i < notes.length; i++) {\n hasStave = hasStave && notes[i].getStave() != null;\n }\n\n if (!hasStave) {\n throw new Vex.RERR(\n 'Stave Missing',\n 'All notes must have a stave - Vex.Flow.ModifierContext.formatMultiVoice!'\n );\n }\n\n let xShift = 0;\n\n for (let i = 0; i < notes.length - 1; i++) {\n let topNote = notes[i];\n let bottomNote = notes[i + 1];\n\n if (topNote.getStemDirection() === Stem.DOWN) {\n topNote = notes[i + 1];\n bottomNote = notes[i];\n }\n\n const topKeys = topNote.getKeyProps();\n const bottomKeys = bottomNote.getKeyProps();\n\n const HALF_NOTEHEAD_HEIGHT = 0.5;\n\n // `keyProps` and `stave.getYForLine` have different notions of a `line`\n // so we have to convert the keyProps value by subtracting 5.\n // See https://github.com/0xfe/vexflow/wiki/Development-Gotchas\n //\n // We also extend the y for each note by a half notehead because the\n // notehead's origin is centered\n const topNoteBottomY = topNote\n .getStave()\n .getYForLine(5 - topKeys[0].line + HALF_NOTEHEAD_HEIGHT);\n\n const bottomNoteTopY = bottomNote\n .getStave()\n .getYForLine(5 - bottomKeys[bottomKeys.length - 1].line - HALF_NOTEHEAD_HEIGHT);\n\n const areNotesColliding = bottomNoteTopY - topNoteBottomY < 0;\n\n if (areNotesColliding) {\n xShift = topNote.getVoiceShiftWidth() + 2;\n bottomNote.setXShift(xShift);\n }\n }\n\n state.right_shift += xShift;\n }\n\n static postFormat(notes) {\n if (!notes) return false;\n\n notes.forEach(note => note.postFormat());\n\n return true;\n }\n\n constructor(noteStruct) {\n super(noteStruct);\n this.setAttribute('type', 'StaveNote');\n\n this.keys = noteStruct.keys;\n this.clef = noteStruct.clef;\n this.octave_shift = noteStruct.octave_shift;\n this.beam = null;\n\n // Pull note rendering properties\n this.glyph = Flow.getGlyphProps(this.duration, this.noteType);\n\n if (!this.glyph) {\n throw new Vex.RuntimeError(\n 'BadArguments',\n `Invalid note initialization data (No glyph found): ${JSON.stringify(noteStruct)}`\n );\n }\n\n // if true, displace note to right\n this.displaced = false;\n this.dot_shiftY = 0;\n // per-pitch properties\n this.keyProps = [];\n // for displaced ledger lines\n this.use_default_head_x = false;\n\n // Drawing\n this.note_heads = [];\n this.modifiers = [];\n\n Vex.Merge(this.render_options, {\n // font size for note heads and rests\n glyph_font_scale: noteStruct.glyph_font_scale || Flow.DEFAULT_NOTATION_FONT_SCALE,\n // number of stroke px to the left and right of head\n stroke_px: noteStruct.stroke_px || StaveNote.DEFAULT_LEDGER_LINE_OFFSET,\n });\n\n this.calculateKeyProps();\n this.buildStem();\n\n // Set the stem direction\n if (noteStruct.auto_stem) {\n this.autoStem();\n } else {\n this.setStemDirection(noteStruct.stem_direction);\n }\n this.reset();\n this.buildFlag();\n }\n\n reset() {\n super.reset();\n\n // Save prior noteHead styles & reapply them after making new noteheads.\n const noteHeadStyles = this.note_heads.map(noteHead => noteHead.getStyle());\n this.buildNoteHeads();\n this.note_heads.forEach((noteHead, index) => noteHead.setStyle(noteHeadStyles[index]));\n\n if (this.stave) {\n this.note_heads.forEach(head => head.setStave(this.stave));\n }\n this.calcExtraPx();\n }\n\n setBeam(beam) {\n this.beam = beam;\n this.calcExtraPx();\n return this;\n }\n\n getCategory() { return StaveNote.CATEGORY; }\n\n // Builds a `Stem` for the note\n buildStem() {\n this.setStem(new Stem({ hide: !!this.isRest(), }));\n }\n\n // Builds a `NoteHead` for each key in the note\n buildNoteHeads() {\n this.note_heads = [];\n const stemDirection = this.getStemDirection();\n const keys = this.getKeys();\n\n let lastLine = null;\n let lineDiff = null;\n let displaced = false;\n\n // Draw notes from bottom to top.\n\n // For down-stem notes, we draw from top to bottom.\n let start;\n let end;\n let step;\n if (stemDirection === Stem.UP) {\n start = 0;\n end = keys.length;\n step = 1;\n } else if (stemDirection === Stem.DOWN) {\n start = keys.length - 1;\n end = -1;\n step = -1;\n }\n\n for (let i = start; i !== end; i += step) {\n const noteProps = this.keyProps[i];\n const line = noteProps.line;\n\n // Keep track of last line with a note head, so that consecutive heads\n // are correctly displaced.\n if (lastLine === null) {\n lastLine = line;\n } else {\n lineDiff = Math.abs(lastLine - line);\n if (lineDiff === 0 || lineDiff === 0.5) {\n displaced = !displaced;\n } else {\n displaced = false;\n this.use_default_head_x = true;\n }\n }\n lastLine = line;\n\n const notehead = new NoteHead({\n duration: this.duration,\n note_type: this.noteType,\n displaced,\n stem_direction: stemDirection,\n custom_glyph_code: noteProps.code,\n glyph_font_scale: this.render_options.glyph_font_scale,\n x_shift: noteProps.shift_right,\n stem_up_x_offset: noteProps.stem_up_x_offset,\n stem_down_x_offset: noteProps.stem_down_x_offset,\n line: noteProps.line,\n });\n\n this.note_heads[i] = notehead;\n }\n }\n\n // Automatically sets the stem direction based on the keys in the note\n autoStem() {\n // Figure out optimal stem direction based on given notes\n this.minLine = this.keyProps[0].line;\n this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n\n const MIDDLE_LINE = 3;\n const decider = (this.minLine + this.maxLine) / 2;\n const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n\n this.setStemDirection(stemDirection);\n }\n\n // Calculates and stores the properties for each key in the note\n calculateKeyProps() {\n let lastLine = null;\n for (let i = 0; i < this.keys.length; ++i) {\n const key = this.keys[i];\n\n // All rests use the same position on the line.\n // if (this.glyph.rest) key = this.glyph.position;\n if (this.glyph.rest) this.glyph.position = key;\n\n const options = { octave_shift: this.octave_shift || 0 };\n const props = Flow.keyProperties(key, this.clef, options);\n\n if (!props) {\n throw new Vex.RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n }\n\n // Override line placement for default rests\n if (props.key === 'R') {\n if (this.duration === '1' || this.duration === 'w') {\n props.line = 4;\n } else {\n props.line = 3;\n }\n }\n\n // Calculate displacement of this note\n const line = props.line;\n if (lastLine === null) {\n lastLine = line;\n } else {\n if (Math.abs(lastLine - line) === 0.5) {\n this.displaced = true;\n props.displaced = true;\n\n // Have to mark the previous note as\n // displaced as well, for modifier placement\n if (this.keyProps.length > 0) {\n this.keyProps[i - 1].displaced = true;\n }\n }\n }\n\n lastLine = line;\n this.keyProps.push(props);\n }\n\n // Sort the notes from lowest line to highest line\n lastLine = -Infinity;\n this.keyProps.forEach(key => {\n if (key.line < lastLine) {\n Vex.W(\n 'Unsorted keys in note will be sorted. ' +\n 'See https://github.com/0xfe/vexflow/issues/104 for details.'\n );\n }\n lastLine = key.line;\n });\n this.keyProps.sort((a, b) => a.line - b.line);\n }\n\n // Get the `BoundingBox` for the entire note\n getBoundingBox() {\n if (!this.preFormatted) {\n throw new Vex.RERR('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n }\n\n const { width: w, modLeftPx, extraLeftPx } = this.getMetrics();\n const x = this.getAbsoluteX() - modLeftPx - extraLeftPx;\n\n let minY = 0;\n let maxY = 0;\n const halfLineSpacing = this.getStave().getSpacingBetweenLines() / 2;\n const lineSpacing = halfLineSpacing * 2;\n\n if (this.isRest()) {\n const y = this.ys[0];\n const frac = Flow.durationToFraction(this.duration);\n if (frac.equals(1) || frac.equals(2)) {\n minY = y - halfLineSpacing;\n maxY = y + halfLineSpacing;\n } else {\n minY = y - (this.glyph.line_above * lineSpacing);\n maxY = y + (this.glyph.line_below * lineSpacing);\n }\n } else if (this.glyph.stem) {\n const ys = this.getStemExtents();\n ys.baseY += halfLineSpacing * this.stem_direction;\n minY = Math.min(ys.topY, ys.baseY);\n maxY = Math.max(ys.topY, ys.baseY);\n } else {\n minY = null;\n maxY = null;\n\n for (let i = 0; i < this.ys.length; ++i) {\n const yy = this.ys[i];\n if (i === 0) {\n minY = yy;\n maxY = yy;\n } else {\n minY = Math.min(yy, minY);\n maxY = Math.max(yy, maxY);\n }\n }\n minY -= halfLineSpacing;\n maxY += halfLineSpacing;\n }\n\n return new BoundingBox(x, minY, w, maxY - minY);\n }\n\n // Gets the line number of the top or bottom note in the chord.\n // If `isTopNote` is `true` then get the top note\n getLineNumber(isTopNote) {\n if (!this.keyProps.length) {\n throw new Vex.RERR(\n 'NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\"\n );\n }\n\n let resultLine = this.keyProps[0].line;\n\n // No precondition assumed for sortedness of keyProps array\n for (let i = 0; i < this.keyProps.length; i++) {\n const thisLine = this.keyProps[i].line;\n if (isTopNote) {\n if (thisLine > resultLine) resultLine = thisLine;\n } else {\n if (thisLine < resultLine) resultLine = thisLine;\n }\n }\n\n return resultLine;\n }\n\n // Determine if current note is a rest\n isRest() { return this.glyph.rest; }\n\n // Determine if the current note is a chord\n isChord() { return !this.isRest() && this.keys.length > 1; }\n\n // Determine if the `StaveNote` has a stem\n hasStem() { return this.glyph.stem; }\n\n hasFlag() {\n return super.hasFlag() && !this.isRest();\n }\n\n getStemX() {\n if (this.noteType === 'r') {\n return this.getCenterGlyphX();\n } else {\n // We adjust the origin of the stem because we want the stem left-aligned\n // with the notehead if stemmed-down, and right-aligned if stemmed-up\n return super.getStemX() + getStemAdjustment(this);\n }\n }\n\n // Get the `y` coordinate for text placed on the top/bottom of a\n // note at a desired `text_line`\n getYForTopText(textLine) {\n const extents = this.getStemExtents();\n return Math.min(\n this.stave.getYForTopText(textLine),\n extents.topY - (this.render_options.annotation_spacing * (textLine + 1))\n );\n }\n getYForBottomText(textLine) {\n const extents = this.getStemExtents();\n return Math.max(\n this.stave.getYForTopText(textLine),\n extents.baseY + (this.render_options.annotation_spacing * (textLine))\n );\n }\n\n // Sets the current note to the provided `stave`. This applies\n // `y` values to the `NoteHeads`.\n setStave(stave) {\n super.setStave(stave);\n\n const ys = this.note_heads.map(notehead => {\n notehead.setStave(stave);\n return notehead.getY();\n });\n\n this.setYs(ys);\n\n if (this.stem) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n this.stem.setYBounds(y_top, y_bottom);\n }\n\n return this;\n }\n\n // Get the pitches in the note\n getKeys() { return this.keys; }\n\n // Get the properties for all the keys in the note\n getKeyProps() {\n return this.keyProps;\n }\n\n // Check if note is shifted to the right\n isDisplaced() {\n return this.displaced;\n }\n\n // Sets whether shift note to the right. `displaced` is a `boolean`\n setNoteDisplaced(displaced) {\n this.displaced = displaced;\n return this;\n }\n\n // Get the starting `x` coordinate for a `StaveTie`\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n tieStartX += this.getGlyphWidth() + this.x_shift + this.extraRightPx;\n if (this.modifierContext) tieStartX += this.modifierContext.getExtraRightPx();\n return tieStartX;\n }\n\n // Get the ending `x` coordinate for a `StaveTie`\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n tieEndX += this.x_shift - this.extraLeftPx;\n return tieEndX;\n }\n\n // Get the stave line on which to place a rest\n getLineForRest() {\n let restLine = this.keyProps[0].line;\n if (this.keyProps.length > 1) {\n const lastLine = this.keyProps[this.keyProps.length - 1].line;\n const top = Math.max(restLine, lastLine);\n const bot = Math.min(restLine, lastLine);\n restLine = Vex.MidLine(top, bot);\n }\n\n return restLine;\n }\n\n // Get the default `x` and `y` coordinates for the provided `position`\n // and key `index`\n getModifierStartXY(position, index, options) {\n options = options || {};\n if (!this.preFormatted) {\n throw new Vex.RERR('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n\n if (this.ys.length === 0) {\n throw new Vex.RERR('NoYValues', 'No Y-Values calculated for this note.');\n }\n\n const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n let x = 0;\n if (position === LEFT) {\n // extra_left_px\n // FIXME: What are these magic numbers?\n x = -1 * 2;\n } else if (position === RIGHT) {\n // extra_right_px\n // FIXME: What is this magical +2?\n x = this.getGlyphWidth() + this.x_shift + 2;\n\n if (this.stem_direction === Stem.UP && this.hasFlag() &&\n (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n x += this.flag.getMetrics().width;\n }\n } else if (position === BELOW || position === ABOVE) {\n x = this.getGlyphWidth() / 2;\n }\n\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n\n // Sets the style of the complete StaveNote, including all keys\n // and the stem.\n setStyle(style) {\n super.setStyle(style);\n this.note_heads.forEach(notehead => notehead.setStyle(style));\n this.stem.setStyle(style);\n }\n\n setStemStyle(style) {\n const stem = this.getStem();\n stem.setStyle(style);\n }\n getStemStyle() { return this.stem.getStyle(); }\n\n setLedgerLineStyle(style) { this.ledgerLineStyle = style; }\n getLedgerLineStyle() { return this.ledgerLineStyle; }\n\n setFlagStyle(style) { this.flagStyle = style; }\n getFlagStyle() { return this.flagStyle; }\n\n // Sets the notehead at `index` to the provided coloring `style`.\n //\n // `style` is an `object` with the following properties: `shadowColor`,\n // `shadowBlur`, `fillStyle`, `strokeStyle`\n setKeyStyle(index, style) {\n this.note_heads[index].setStyle(style);\n return this;\n }\n\n setKeyLine(index, line) {\n this.keyProps[index].line = line;\n this.reset();\n return this;\n }\n\n getKeyLine(index) {\n return this.keyProps[index].line;\n }\n\n // Add self to modifier context. `mContext` is the `ModifierContext`\n // to be added to.\n addToModifierContext(mContext) {\n this.setModifierContext(mContext);\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addModifier(this.modifiers[i]);\n }\n this.modifierContext.addModifier(this);\n this.setPreFormatted(false);\n return this;\n }\n\n // Generic function to add modifiers to a note\n //\n // Parameters:\n // * `index`: The index of the key that we're modifying\n // * `modifier`: The modifier to add\n addModifier(index, modifier) {\n modifier.setNote(this);\n modifier.setIndex(index);\n this.modifiers.push(modifier);\n this.setPreFormatted(false);\n return this;\n }\n\n // Helper function to add an accidental to a key\n addAccidental(index, accidental) {\n return this.addModifier(index, accidental);\n }\n\n // Helper function to add an articulation to a key\n addArticulation(index, articulation) {\n return this.addModifier(index, articulation);\n }\n\n // Helper function to add an annotation to a key\n addAnnotation(index, annotation) {\n return this.addModifier(index, annotation);\n }\n\n // Helper function to add a dot on a specific key\n addDot(index) {\n const dot = new Dot();\n dot.setDotShiftY(this.glyph.dot_shiftY);\n this.dots++;\n return this.addModifier(index, dot);\n }\n\n // Convenience method to add dot to all keys in note\n addDotToAll() {\n for (let i = 0; i < this.keys.length; ++i) {\n this.addDot(i);\n }\n return this;\n }\n\n // Get all accidentals in the `ModifierContext`\n getAccidentals() {\n return this.modifierContext.getModifiers('accidentals');\n }\n\n // Get all dots in the `ModifierContext`\n getDots() {\n return this.modifierContext.getModifiers('dots');\n }\n\n // Get the width of the note if it is displaced. Used for `Voice`\n // formatting\n getVoiceShiftWidth() {\n // TODO: may need to accomodate for dot here.\n return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n }\n\n // Calculates and sets the extra pixels to the left or right\n // if the note is displaced.\n calcExtraPx() {\n this.setExtraLeftPx(\n this.displaced && this.stem_direction === Stem.DOWN\n ? this.getGlyphWidth()\n : 0\n );\n\n // For upstems with flags, the extra space is unnecessary, since it's taken\n // up by the flag.\n this.setExtraRightPx(\n !this.hasFlag() && this.displaced && this.stem_direction === Stem.UP\n ? this.getGlyphWidth()\n : 0\n );\n }\n\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted) return;\n if (this.modifierContext) this.modifierContext.preFormat();\n\n let width = this.getGlyphWidth() + this.extraLeftPx + this.extraRightPx;\n\n // For upward flagged notes, the width of the flag needs to be added\n if (this.glyph.flag && this.beam === null && this.stem_direction === Stem.UP) {\n width += this.getGlyphWidth();\n }\n\n this.setWidth(width);\n this.setPreFormatted(true);\n }\n\n /**\n * @typedef {Object} noteHeadBounds\n * @property {number} y_top the highest notehead bound\n * @property {number} y_bottom the lowest notehead bound\n * @property {number|Null} displaced_x the starting x for displaced noteheads\n * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n * @property {number} highest_line the highest notehead line in traditional music line\n * numbering (bottom line = 1, top line = 5)\n * @property {number} lowest_line the lowest notehead line\n * @property {number|false} highest_displaced_line the highest staff line number\n * for a displaced notehead\n * @property {number|false} lowest_displaced_line\n * @property {number} highest_non_displaced_line\n * @property {number} lowest_non_displaced_line\n */\n\n /**\n * Get the staff line and y value for the highest & lowest noteheads\n * @returns {noteHeadBounds}\n */\n getNoteHeadBounds() {\n // Top and bottom Y values for stem.\n let yTop = null;\n let yBottom = null;\n let nonDisplacedX = null;\n let displacedX = null;\n\n let highestLine = this.stave.getNumLines();\n let lowestLine = 1;\n let highestDisplacedLine = false;\n let lowestDisplacedLine = false;\n let highestNonDisplacedLine = highestLine;\n let lowestNonDisplacedLine = lowestLine;\n\n this.note_heads.forEach(notehead => {\n const line = notehead.getLine();\n const y = notehead.getY();\n\n if (yTop === null || y < yTop) {\n yTop = y;\n }\n\n if (yBottom === null || y > yBottom) {\n yBottom = y;\n }\n\n if (displacedX === null && notehead.isDisplaced()) {\n displacedX = notehead.getAbsoluteX();\n }\n\n if (nonDisplacedX === null && !notehead.isDisplaced()) {\n nonDisplacedX = notehead.getAbsoluteX();\n }\n\n highestLine = line > highestLine ? line : highestLine;\n lowestLine = line < lowestLine ? line : lowestLine;\n\n if (notehead.isDisplaced()) {\n highestDisplacedLine = (highestDisplacedLine === false) ?\n line : Math.max(line, highestDisplacedLine);\n lowestDisplacedLine = (lowestDisplacedLine === false) ?\n line : Math.min(line, lowestDisplacedLine);\n } else {\n highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n }\n }, this);\n\n return {\n y_top: yTop,\n y_bottom: yBottom,\n displaced_x: displacedX,\n non_displaced_x: nonDisplacedX,\n highest_line: highestLine,\n lowest_line: lowestLine,\n highest_displaced_line: highestDisplacedLine,\n lowest_displaced_line: lowestDisplacedLine,\n highest_non_displaced_line: highestNonDisplacedLine,\n lowest_non_displaced_line: lowestNonDisplacedLine,\n };\n }\n\n // Get the starting `x` coordinate for the noteheads\n getNoteHeadBeginX() {\n return this.getAbsoluteX() + this.x_shift;\n }\n\n // Get the ending `x` coordinate for the noteheads\n getNoteHeadEndX() {\n const xBegin = this.getNoteHeadBeginX();\n return xBegin + this.getGlyphWidth();\n }\n\n // Draw the ledger lines between the stave and the highest/lowest keys\n drawLedgerLines() {\n const {\n stave, glyph,\n render_options: { stroke_px },\n context: ctx,\n } = this;\n\n const width = glyph.getWidth() + (stroke_px * 2);\n const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - (Stem.WIDTH / 2);\n\n if (this.isRest()) return;\n if (!ctx) {\n throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n\n const {\n highest_line,\n lowest_line,\n highest_displaced_line,\n highest_non_displaced_line,\n lowest_displaced_line,\n lowest_non_displaced_line,\n displaced_x,\n non_displaced_x,\n } = this.getNoteHeadBounds();\n\n const min_x = Math.min(displaced_x, non_displaced_x);\n\n const drawLedgerLine = (y, normal, displaced) => {\n let x;\n if (displaced && normal) x = min_x - stroke_px;\n else if (normal) x = non_displaced_x - stroke_px;\n else x = displaced_x - stroke_px;\n const ledgerWidth = (normal && displaced) ? doubleWidth : width;\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + ledgerWidth, y);\n ctx.stroke();\n };\n\n const style = { ...stave.getStyle() || {}, ...this.getLedgerLineStyle() || {} };\n this.applyStyle(ctx, style);\n\n // Draw ledger lines below the staff:\n for (let line = 6; line <= highest_line; ++line) {\n const normal = (non_displaced_x !== null) && (line <= highest_non_displaced_line);\n const displaced = (displaced_x !== null) && (line <= highest_displaced_line);\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n\n // Draw ledger lines above the staff:\n for (let line = 0; line >= lowest_line; --line) {\n const normal = (non_displaced_x !== null) && (line >= lowest_non_displaced_line);\n const displaced = (displaced_x !== null) && (line >= lowest_displaced_line);\n drawLedgerLine(stave.getYForNote(line), normal, displaced);\n }\n\n this.restoreStyle(ctx, style);\n }\n\n // Draw all key modifiers\n drawModifiers() {\n if (!this.context) {\n throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n\n const ctx = this.context;\n ctx.openGroup('modifiers');\n for (let i = 0; i < this.modifiers.length; i++) {\n const modifier = this.modifiers[i];\n const notehead = this.note_heads[modifier.getIndex()];\n const noteheadStyle = notehead.getStyle();\n notehead.applyStyle(ctx, noteheadStyle);\n modifier.setContext(ctx);\n modifier.drawWithStyle();\n notehead.restoreStyle(ctx, noteheadStyle);\n }\n ctx.closeGroup();\n }\n\n // Draw the flag for the note\n drawFlag() {\n const { stem, beam, context: ctx } = this;\n\n if (!ctx) {\n throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n\n const shouldRenderFlag = beam === null;\n const glyph = this.getGlyph();\n\n if (glyph.flag && shouldRenderFlag) {\n const { y_top, y_bottom } = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n const flagX = this.getStemX();\n // FIXME: What's with the magic +/- 2\n const flagY = this.getStemDirection() === Stem.DOWN\n // Down stems have flags on the left\n ? y_top - noteStemHeight + 2\n // Up stems have flags on the eft.\n : y_bottom - noteStemHeight - 2;\n\n // Draw the Flag\n ctx.openGroup('flag', null, { pointerBBox: true });\n this.applyStyle(ctx, this.getFlagStyle() || false);\n this.flag.render(ctx, flagX, flagY);\n this.restoreStyle(ctx, this.getFlagStyle() || false);\n ctx.closeGroup();\n }\n }\n\n // Draw the NoteHeads\n drawNoteHeads() {\n this.note_heads.forEach(notehead => {\n this.context.openGroup('notehead', null, { pointerBBox: true });\n notehead.setContext(this.context).draw();\n this.context.closeGroup();\n });\n }\n\n drawStem(stemStruct) {\n // GCR TODO: I can't find any context in which this is called with the stemStruct\n // argument in the codebase or tests. Nor can I find a case where super.drawStem\n // is called at all. Perhaps these should be removed?\n if (!this.context) {\n throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n\n if (stemStruct) {\n this.setStem(new Stem(stemStruct));\n }\n\n this.context.openGroup('stem', null, { pointerBBox: true });\n this.stem.setContext(this.context).draw();\n this.context.closeGroup();\n }\n\n // Draws all the `StaveNote` parts. This is the main drawing method.\n draw() {\n if (!this.context) {\n throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n }\n if (!this.stave) {\n throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n }\n if (this.ys.length === 0) {\n throw new Vex.RERR('NoYValues', \"Can't draw note without Y values.\");\n }\n\n const xBegin = this.getNoteHeadBeginX();\n const shouldRenderStem = this.hasStem() && !this.beam;\n\n // Format note head x positions\n this.note_heads.forEach(notehead => notehead.setX(xBegin));\n\n // Format stem x positions\n const stemX = this.getStemX();\n this.stem.setNoteHeadXBounds(stemX, stemX);\n\n L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n\n // Draw each part of the note\n this.drawLedgerLines();\n\n // Apply the overall style -- may be contradicted by local settings:\n this.applyStyle();\n this.setAttribute('el', this.context.openGroup('stavenote', this.getAttribute('id')));\n this.context.openGroup('note', null, { pointerBBox: true });\n if (shouldRenderStem) this.drawStem();\n this.drawNoteHeads();\n this.drawFlag();\n this.context.closeGroup();\n this.drawModifiers();\n this.context.closeGroup();\n this.restoreStyle();\n this.setRendered();\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\n\n/**\n * @constructor\n */\nexport class FretHandFinger extends Modifier {\n static get CATEGORY() { return 'frethandfinger'; }\n\n // Arrange fingerings inside a ModifierContext.\n static format(nums, state) {\n const { left_shift, right_shift } = state;\n const num_spacing = 1;\n\n if (!nums || nums.length === 0) return false;\n\n const nums_list = [];\n let prev_note = null;\n let shiftLeft = 0;\n let shiftRight = 0;\n\n for (let i = 0; i < nums.length; ++i) {\n const num = nums[i];\n const note = num.getNote();\n const pos = num.getPosition();\n const props = note.getKeyProps()[num.getIndex()];\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n const props_tmp = note.getKeyProps()[n];\n if (left_shift === 0) {\n shiftLeft = props_tmp.displaced ? note.getExtraLeftPx() : shiftLeft;\n }\n if (right_shift === 0) {\n shiftRight = props_tmp.displaced ? note.getExtraRightPx() : shiftRight;\n }\n }\n prev_note = note;\n }\n\n nums_list.push({\n note,\n num,\n pos,\n line: props.line,\n shiftL: shiftLeft,\n shiftR: shiftRight,\n });\n }\n\n // Sort fingernumbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n\n let numShiftL = 0;\n let numShiftR = 0;\n let xWidthL = 0;\n let xWidthR = 0;\n let lastLine = null;\n let lastNote = null;\n\n for (let i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n\n // Reset the position of the string number every line.\n if (line !== lastLine || note !== lastNote) {\n numShiftL = left_shift + shiftL;\n numShiftR = right_shift + shiftR;\n }\n\n const numWidth = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift + numShiftL);\n num_shift = left_shift + numWidth; // spacing\n xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n } else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(numShiftR);\n num_shift = shiftRight + numWidth; // spacing\n xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n }\n lastLine = line;\n lastNote = note;\n }\n\n state.left_shift += xWidthL;\n state.right_shift += xWidthR;\n\n return true;\n }\n\n constructor(number) {\n super();\n this.setAttribute('type', 'FretHandFinger');\n\n this.note = null;\n this.index = null;\n this.finger = number;\n this.width = 7;\n this.position = Modifier.Position.LEFT; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.font = {\n family: 'sans-serif',\n size: 9,\n weight: 'bold',\n };\n }\n getCategory() { return FretHandFinger.CATEGORY; }\n setFretHandFinger(number) { this.finger = number; return this; }\n setOffsetX(x) { this.x_offset = x; return this; }\n setOffsetY(y) { this.y_offset = y; return this; }\n\n draw() {\n this.checkContext();\n\n if (!this.note || this.index == null) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw string number without a note and index.\");\n }\n\n this.setRendered();\n const ctx = this.context;\n const start = this.note.getModifierStartXY(this.position, this.index);\n let dot_x = start.x + this.x_shift + this.x_offset;\n let dot_y = start.y + this.y_shift + this.y_offset + 5;\n\n switch (this.position) {\n case Modifier.Position.ABOVE:\n dot_x -= 4;\n dot_y -= 12;\n break;\n case Modifier.Position.BELOW:\n dot_x -= 2;\n dot_y += 10;\n break;\n case Modifier.Position.LEFT:\n dot_x -= this.width;\n break;\n case Modifier.Position.RIGHT:\n dot_x += 1;\n break;\n default:\n throw new Vex.RERR('InvalidPostion', `The position ${this.position} does not exist`);\n }\n\n ctx.save();\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n ctx.fillText('' + this.finger, dot_x, dot_y);\n ctx.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements some standard music theory routines.\n\nimport { Vex } from './vex';\n\nexport class Music {\n static get NUM_TONES() {\n return 12;\n }\n\n static get roots() {\n return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n }\n\n static get root_values() {\n return [0, 2, 4, 5, 7, 9, 11];\n }\n\n static get root_indices() {\n return {\n 'c': 0,\n 'd': 1,\n 'e': 2,\n 'f': 3,\n 'g': 4,\n 'a': 5,\n 'b': 6,\n };\n }\n\n static get canonical_notes() {\n return [\n 'c', 'c#', 'd', 'd#',\n 'e', 'f', 'f#', 'g',\n 'g#', 'a', 'a#', 'b',\n ];\n }\n\n static get diatonic_intervals() {\n return [\n 'unison', 'm2', 'M2', 'm3', 'M3',\n 'p4', 'dim5', 'p5', 'm6', 'M6',\n 'b7', 'M7', 'octave',\n ];\n }\n\n static get diatonic_accidentals() {\n return {\n 'unison': { note: 0, accidental: 0 },\n 'm2': { note: 1, accidental: -1 },\n 'M2': { note: 1, accidental: 0 },\n 'm3': { note: 2, accidental: -1 },\n 'M3': { note: 2, accidental: 0 },\n 'p4': { note: 3, accidental: 0 },\n 'dim5': { note: 4, accidental: -1 },\n 'p5': { note: 4, accidental: 0 },\n 'm6': { note: 5, accidental: -1 },\n 'M6': { note: 5, accidental: 0 },\n 'b7': { note: 6, accidental: -1 },\n 'M7': { note: 6, accidental: 0 },\n 'octave': { note: 7, accidental: 0 },\n };\n }\n\n static get intervals() {\n return {\n 'u': 0, 'unison': 0,\n 'm2': 1, 'b2': 1, 'min2': 1, 'S': 1, 'H': 1,\n '2': 2, 'M2': 2, 'maj2': 2, 'T': 2, 'W': 2,\n 'm3': 3, 'b3': 3, 'min3': 3,\n 'M3': 4, '3': 4, 'maj3': 4,\n '4': 5, 'p4': 5,\n '#4': 6, 'b5': 6, 'aug4': 6, 'dim5': 6,\n '5': 7, 'p5': 7,\n '#5': 8, 'b6': 8, 'aug5': 8,\n '6': 9, 'M6': 9, 'maj6': 9,\n 'b7': 10, 'm7': 10, 'min7': 10, 'dom7': 10,\n 'M7': 11, 'maj7': 11,\n '8': 12, 'octave': 12,\n };\n }\n\n static get scales() {\n return {\n major: [2, 2, 1, 2, 2, 2, 1],\n dorian: [2, 1, 2, 2, 2, 1, 2],\n mixolydian: [2, 2, 1, 2, 2, 1, 2],\n minor: [2, 1, 2, 2, 1, 2, 2],\n };\n }\n\n static get scaleTypes() {\n return {\n 'M': Music.scales.major,\n 'm': Music.scales.minor,\n };\n }\n\n static get accidentals() {\n return ['bb', 'b', 'n', '#', '##'];\n }\n\n static get noteValues() {\n return {\n 'c': { root_index: 0, int_val: 0 },\n 'cn': { root_index: 0, int_val: 0 },\n 'c#': { root_index: 0, int_val: 1 },\n 'c##': { root_index: 0, int_val: 2 },\n 'cb': { root_index: 0, int_val: 11 },\n 'cbb': { root_index: 0, int_val: 10 },\n 'd': { root_index: 1, int_val: 2 },\n 'dn': { root_index: 1, int_val: 2 },\n 'd#': { root_index: 1, int_val: 3 },\n 'd##': { root_index: 1, int_val: 4 },\n 'db': { root_index: 1, int_val: 1 },\n 'dbb': { root_index: 1, int_val: 0 },\n 'e': { root_index: 2, int_val: 4 },\n 'en': { root_index: 2, int_val: 4 },\n 'e#': { root_index: 2, int_val: 5 },\n 'e##': { root_index: 2, int_val: 6 },\n 'eb': { root_index: 2, int_val: 3 },\n 'ebb': { root_index: 2, int_val: 2 },\n 'f': { root_index: 3, int_val: 5 },\n 'fn': { root_index: 3, int_val: 5 },\n 'f#': { root_index: 3, int_val: 6 },\n 'f##': { root_index: 3, int_val: 7 },\n 'fb': { root_index: 3, int_val: 4 },\n 'fbb': { root_index: 3, int_val: 3 },\n 'g': { root_index: 4, int_val: 7 },\n 'gn': { root_index: 4, int_val: 7 },\n 'g#': { root_index: 4, int_val: 8 },\n 'g##': { root_index: 4, int_val: 9 },\n 'gb': { root_index: 4, int_val: 6 },\n 'gbb': { root_index: 4, int_val: 5 },\n 'a': { root_index: 5, int_val: 9 },\n 'an': { root_index: 5, int_val: 9 },\n 'a#': { root_index: 5, int_val: 10 },\n 'a##': { root_index: 5, int_val: 11 },\n 'ab': { root_index: 5, int_val: 8 },\n 'abb': { root_index: 5, int_val: 7 },\n 'b': { root_index: 6, int_val: 11 },\n 'bn': { root_index: 6, int_val: 11 },\n 'b#': { root_index: 6, int_val: 0 },\n 'b##': { root_index: 6, int_val: 1 },\n 'bb': { root_index: 6, int_val: 10 },\n 'bbb': { root_index: 6, int_val: 9 },\n };\n }\n\n isValidNoteValue(note) {\n if (note == null || note < 0 || note >= Music.NUM_TONES) {\n return false;\n }\n return true;\n }\n\n isValidIntervalValue(interval) {\n return this.isValidNoteValue(interval);\n }\n\n getNoteParts(noteString) {\n if (!noteString || noteString.length < 1) {\n throw new Vex.RERR('BadArguments', 'Invalid note name: ' + noteString);\n }\n\n if (noteString.length > 3) {\n throw new Vex.RERR('BadArguments', 'Invalid note name: ' + noteString);\n }\n\n const note = noteString.toLowerCase();\n\n const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n const match = regex.exec(note);\n\n if (match != null) {\n const root = match[1];\n const accidental = match[2];\n\n return {\n root,\n accidental,\n };\n } else {\n throw new Vex.RERR('BadArguments', 'Invalid note name: ' + noteString);\n }\n }\n\n getKeyParts(keyString) {\n if (!keyString || keyString.length < 1) {\n throw new Vex.RERR('BadArguments', 'Invalid key: ' + keyString);\n }\n\n const key = keyString.toLowerCase();\n\n // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n const match = regex.exec(key);\n\n if (match != null) {\n const root = match[1];\n const accidental = match[2];\n let type = match[3];\n\n // Unspecified type implies major\n if (!type) type = 'M';\n\n return {\n root,\n accidental,\n type,\n };\n } else {\n throw new Vex.RERR('BadArguments', `Invalid key: ${keyString}`);\n }\n }\n\n getNoteValue(noteString) {\n const value = Music.noteValues[noteString];\n if (value == null) {\n throw new Vex.RERR('BadArguments', `Invalid note name: ${noteString}`);\n }\n\n return value.int_val;\n }\n\n getIntervalValue(intervalString) {\n const value = Music.intervals[intervalString];\n if (value == null) {\n throw new Vex.RERR('BadArguments', `Invalid interval name: ${intervalString}`);\n }\n\n return value;\n }\n\n getCanonicalNoteName(noteValue) {\n if (!this.isValidNoteValue(noteValue)) {\n throw new Vex.RERR('BadArguments', `Invalid note value: ${noteValue}`);\n }\n\n return Music.canonical_notes[noteValue];\n }\n\n getCanonicalIntervalName(intervalValue) {\n if (!this.isValidIntervalValue(intervalValue)) {\n throw new Vex.RERR('BadArguments', `Invalid interval value: ${intervalValue}`);\n }\n\n return Music.diatonic_intervals[intervalValue];\n }\n\n /* Given a note, interval, and interval direction, product the\n * relative note.\n */\n getRelativeNoteValue(noteValue, intervalValue, direction) {\n if (direction == null) direction = 1;\n\n if (direction !== 1 && direction !== -1) {\n throw new Vex.RERR('BadArguments', `Invalid direction: ${direction}`);\n }\n\n let sum = (noteValue + (direction * intervalValue)) % Music.NUM_TONES;\n if (sum < 0) sum += Music.NUM_TONES;\n\n return sum;\n }\n\n getRelativeNoteName(root, noteValue) {\n const parts = this.getNoteParts(root);\n const rootValue = this.getNoteValue(parts.root);\n let interval = noteValue - rootValue;\n\n if (Math.abs(interval) > Music.NUM_TONES - 3) {\n let multiplier = 1;\n if (interval > 0) multiplier = -1;\n\n // Possibly wrap around. (Add +1 for modulo operator)\n const reverse_interval = (((noteValue + 1) + (rootValue + 1)) %\n Music.NUM_TONES) * multiplier;\n\n if (Math.abs(reverse_interval) > 2) {\n throw new Vex.RERR('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n } else {\n interval = reverse_interval;\n }\n }\n\n if (Math.abs(interval) > 2) {\n throw new Vex.RERR('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n }\n\n let relativeNoteName = parts.root;\n if (interval > 0) {\n for (let i = 1; i <= interval; ++i) {\n relativeNoteName += '#';\n }\n } else if (interval < 0) {\n for (let i = -1; i >= interval; --i) {\n relativeNoteName += 'b';\n }\n }\n\n return relativeNoteName;\n }\n\n /* Return scale tones, given intervals. Each successive interval is\n * relative to the previous one, e.g., Major Scale:\n *\n * TTSTTTS = [2,2,1,2,2,2,1]\n *\n * When used with key = 0, returns C scale (which is isomorphic to\n * interval list).\n */\n getScaleTones(key, intervals) {\n const tones = [key];\n\n let nextNote = key;\n for (let i = 0; i < intervals.length; i += 1) {\n nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n if (nextNote !== key) tones.push(nextNote);\n }\n\n return tones;\n }\n\n /* Returns the interval of a note, given a diatonic scale.\n *\n * E.g., Given the scale C, and the note E, returns M3\n */\n getIntervalBetween(note1, note2, direction) {\n if (direction == null) direction = 1;\n\n if (direction !== 1 && direction !== -1) {\n throw new Vex.RERR('BadArguments', `Invalid direction: ${direction}`);\n }\n\n if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n throw new Vex.RERR('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n }\n\n let difference = direction === 1\n ? note2 - note1\n : note1 - note2;\n\n if (difference < 0) difference += Music.NUM_TONES;\n\n return difference;\n }\n\n // Create a scale map that represents the pitch state for a\n // `keySignature`. For example, passing a `G` to `keySignature` would\n // return a scale map with every note naturalized except for `F` which\n // has an `F#` state.\n createScaleMap(keySignature) {\n const keySigParts = this.getKeyParts(keySignature);\n const scaleName = Music.scaleTypes[keySigParts.type];\n\n let keySigString = keySigParts.root;\n if (keySigParts.accidental) keySigString += keySigParts.accidental;\n\n if (!scaleName) throw new Vex.RERR('BadArguments', 'Unsupported key type: ' + keySignature);\n\n const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n const noteLocation = Music.root_indices[keySigParts.root];\n\n const scaleMap = {};\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n let noteName = this.getRelativeNoteName(rootName, scale[i]);\n\n if (noteName.length === 1) {\n noteName += 'n';\n }\n\n scaleMap[rootName] = noteName;\n }\n\n return scaleMap;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\n//\n// ## Description\n//\n// This file implements accidentals as modifiers that can be attached to\n// notes. Support is included for both western and microtonal accidentals.\n//\n// See `tests/accidental_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Fraction } from './fraction';\nimport { Flow } from './tables';\nimport { Music } from './music';\nimport { Modifier } from './modifier';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`.\nfunction L(...args) { if (Accidental.DEBUG) Vex.L('Vex.Flow.Accidental', args); }\n\nconst getGlyphWidth = glyph => glyph.getMetrics().width;\n\n// An `Accidental` inherits from `Modifier`, and is formatted within a\n// `ModifierContext`.\nexport class Accidental extends Modifier {\n static get CATEGORY() { return 'accidentals'; }\n\n // Arrange accidentals inside a ModifierContext.\n static format(accidentals, state) {\n const noteheadAccidentalPadding = 1;\n const leftShift = state.left_shift + noteheadAccidentalPadding;\n const accidentalSpacing = 3;\n\n // If there are no accidentals, we needn't format their positions\n if (!accidentals || accidentals.length === 0) return;\n\n const accList = [];\n let prevNote = null;\n let shiftL = 0;\n\n // First determine the accidentals' Y positions from the note.keys\n let propsTemp;\n for (let i = 0; i < accidentals.length; ++i) {\n const acc = accidentals[i];\n const note = acc.getNote();\n const stave = note.getStave();\n const props = note.getKeyProps()[acc.getIndex()];\n if (note !== prevNote) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n propsTemp = note.getKeyProps()[n];\n shiftL = propsTemp.displaced ? note.getExtraLeftPx() : shiftL;\n }\n prevNote = note;\n }\n if (stave !== null) {\n const lineSpace = stave.options.spacing_between_lines_px;\n const y = stave.getYForLine(props.line);\n const accLine = Math.round(y / lineSpace * 2) / 2;\n accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n } else {\n accList.push({ line: props.line, shift: shiftL, acc });\n }\n }\n\n // Sort accidentals by line number.\n accList.sort((a, b) => b.line - a.line);\n\n // FIXME: Confusing name. Each object in this array has a property called `line`.\n // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n const lineList = [];\n\n // amount by which all accidentals must be shifted right or left for\n // stem flipping, notehead shifting concerns.\n let accShift = 0;\n let previousLine = null;\n\n // Create an array of unique line numbers (lineList) from accList\n for (let i = 0; i < accList.length; i++) {\n const acc = accList[i];\n\n // if this is the first line, or a new line, add a lineList\n if (previousLine === null || previousLine !== acc.line) {\n lineList.push({\n line: acc.line,\n flatLine: true,\n dblSharpLine: true,\n numAcc: 0,\n width: 0,\n });\n }\n // if this accidental is not a flat, the accidental needs 3.0 lines lower\n // clearance instead of 2.5 lines for b or bb.\n // FIXME: Naming could use work. acc.acc is very awkward\n if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n lineList[lineList.length - 1].flatLine = false;\n }\n\n // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n if (acc.acc.type !== '##') {\n lineList[lineList.length - 1].dblSharpLine = false;\n }\n\n // Track how many accidentals are on this line:\n lineList[lineList.length - 1].numAcc++;\n\n // Track the total x_offset needed for this line which will be needed\n // for formatting lines w/ multiple accidentals:\n\n // width = accidental width + universal spacing between accidentals\n lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n\n // if this accShift is larger, use it to keep first column accidentals in the same line\n accShift = acc.shift > accShift ? acc.shift : accShift;\n\n previousLine = acc.line;\n }\n\n // ### Place Accidentals in Columns\n //\n // Default to a classic triangular layout (middle accidental farthest left),\n // but follow exceptions as outlined in G. Read's _Music Notation_ and\n // Elaine Gould's _Behind Bars_.\n //\n // Additionally, this implements different vertical collision rules for\n // flats (only need 2.5 lines clearance below) and double sharps (only\n // need 2.5 lines of clearance above or below).\n //\n // Classic layouts and exception patterns are found in the 'tables.js'\n // in 'Vex.Flow.accidentalColumnsTable'\n //\n // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n // using as few columns as possible for the verticle structure.\n //\n // TODO (?): Allow column to be specified for an accidental at run-time?\n\n let totalColumns = 0;\n\n // establish the boundaries for a group of notes with clashing accidentals:\n for (let i = 0; i < lineList.length; i++) {\n let noFurtherConflicts = false;\n const groupStart = i;\n let groupEnd = i;\n\n while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n // if this note conflicts with the next:\n if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n // include the next note in the group:\n groupEnd++;\n } else {\n noFurtherConflicts = true;\n }\n }\n\n // Gets an a line from the `lineList`, relative to the current group\n const getGroupLine = (index) => lineList[groupStart + index];\n const getGroupLines = (indexes) => indexes.map(getGroupLine);\n const lineDifference = (indexA, indexB) => {\n const [a, b] = getGroupLines([indexA, indexB]).map(item => item.line);\n return a - b;\n };\n\n const notColliding = (...indexPairs) =>\n indexPairs\n .map(getGroupLines)\n .every(lines => !this.checkCollision(...lines));\n\n // Set columns for the lines in this group:\n const groupLength = groupEnd - groupStart + 1;\n\n // Set the accidental column for each line of the group\n let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n\n switch (groupLength) {\n case 3:\n if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n endCase = 'second_on_bottom';\n }\n break;\n case 4:\n if (notColliding([0, 2], [1, 3])) {\n endCase = 'spaced_out_tetrachord';\n }\n break;\n case 5:\n if (endCase === 'b' && notColliding([1, 3])) {\n endCase = 'spaced_out_pentachord';\n if (notColliding([0, 2], [2, 4])) {\n endCase = 'very_spaced_out_pentachord';\n }\n }\n break;\n case 6:\n if (notColliding([0, 3], [1, 4], [2, 5])) {\n endCase = 'spaced_out_hexachord';\n }\n if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n endCase = 'very_spaced_out_hexachord';\n }\n break;\n default:\n break;\n }\n\n let groupMember;\n let column;\n // If the group contains more than seven members, use ascending parallel lines\n // of accidentals, using as few columns as possible while avoiding collisions.\n if (groupLength >= 7) {\n // First, determine how many columns to use:\n let patternLength = 2;\n let collisionDetected = true;\n while (collisionDetected === true) {\n collisionDetected = false;\n for (let line = 0; line + patternLength < lineList.length; line++) {\n if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n collisionDetected = true;\n patternLength++;\n break;\n }\n }\n }\n // Then, assign a column to each line of accidentals\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = ((groupMember - i) % patternLength) + 1;\n lineList[groupMember].column = column;\n totalColumns = (totalColumns > column) ? totalColumns : column;\n }\n\n // Otherwise, if the group contains fewer than seven members, use the layouts from\n // the accidentalsColumnsTable housed in tables.js.\n } else {\n for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n column = Flow.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n lineList[groupMember].column = column;\n totalColumns = (totalColumns > column) ? totalColumns : column;\n }\n }\n\n // Increment i to the last note that was set, so that if a lower set of notes\n // does not conflict at all with this group, it can have its own classic shape.\n i = groupEnd;\n }\n\n // ### Convert Columns to x_offsets\n //\n // This keeps columns aligned, even if they have different accidentals within them\n // which sometimes results in a larger x_offset than is an accidental might need\n // to preserve the symmetry of the accidental shape.\n //\n // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n // music with complex chord clusters.\n //\n // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n // parallel columns.\n\n // track each column's max width, which will be used as initial shift of later columns:\n const columnWidths = [];\n const columnXOffsets = [];\n for (let i = 0; i <= totalColumns; i++) {\n columnWidths[i] = 0;\n columnXOffsets[i] = 0;\n }\n\n columnWidths[0] = accShift + leftShift;\n columnXOffsets[0] = accShift + leftShift;\n\n // Fill columnWidths with widest needed x-space;\n // this is what keeps the columns parallel.\n lineList.forEach(line => {\n if (line.width > columnWidths[line.column]) columnWidths[line.column] = line.width;\n });\n\n for (let i = 1; i < columnWidths.length; i++) {\n // this column's offset = this column's width + previous column's offset\n columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n }\n\n const totalShift = columnXOffsets[columnXOffsets.length - 1];\n // Set the xShift for each accidental according to column offsets:\n let accCount = 0;\n lineList.forEach(line => {\n let lineWidth = 0;\n const lastAccOnLine = accCount + line.numAcc;\n // handle all of the accidentals on a given line:\n for (accCount; accCount < lastAccOnLine; accCount++) {\n const xShift = (columnXOffsets[line.column - 1] + lineWidth);\n accList[accCount].acc.setXShift(xShift);\n // keep track of the width of accidentals we've added so far, so that when\n // we loop, we add space for them.\n lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n L('Line, accCount, shift: ', line.line, accCount, xShift);\n }\n });\n\n // update the overall layout with the full width of the accidental shapes:\n state.left_shift += totalShift;\n }\n\n // Helper function to determine whether two lines of accidentals collide vertically\n static checkCollision(line1, line2) {\n let clearance = line2.line - line1.line;\n let clearanceRequired = 3;\n // But less clearance is required for certain accidentals: b, bb and ##.\n if (clearance > 0) { // then line 2 is on top\n clearanceRequired = (line2.flatLine || line2.dblSharpLine) ? 2.5 : 3.0;\n if (line1.dblSharpLine) clearance -= 0.5;\n } else { // line 1 is on top\n clearanceRequired = (line1.flatLine || line1.dblSharpLine) ? 2.5 : 3.0;\n if (line2.dblSharpLine) clearance -= 0.5;\n }\n const collision = Math.abs(clearance) < clearanceRequired;\n L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n return collision;\n }\n\n // Use this method to automatically apply accidentals to a set of `voices`.\n // The accidentals will be remembered between all the voices provided.\n // Optionally, you can also provide an initial `keySignature`.\n static applyAccidentals(voices, keySignature) {\n const tickPositions = [];\n const tickNoteMap = {};\n\n // Sort the tickables in each voice by their tick position in the voice\n voices.forEach(voice => {\n const tickPosition = new Fraction(0, 1);\n const notes = voice.getTickables();\n notes.forEach(note => {\n if (note.shouldIgnoreTicks()) return;\n\n const notesAtPosition = tickNoteMap[tickPosition.value()];\n\n if (!notesAtPosition) {\n tickPositions.push(tickPosition.value());\n tickNoteMap[tickPosition.value()] = [note];\n } else {\n notesAtPosition.push(note);\n }\n\n tickPosition.add(note.getTicks());\n });\n });\n\n const music = new Music();\n\n // Default key signature is C major\n if (!keySignature) keySignature = 'C';\n\n // Get the scale map, which represents the current state of each pitch\n const scaleMap = music.createScaleMap(keySignature);\n\n tickPositions.forEach(tick => {\n const notes = tickNoteMap[tick];\n\n // Array to store all pitches that modified accidental states\n // at this tick position\n const modifiedPitches = [];\n\n const processNote = (note) => {\n if (note.isRest() || note.shouldIgnoreTicks()) return;\n\n // Go through each key and determine if an accidental should be\n // applied\n note.keys.forEach((keyString, keyIndex) => {\n const key = music.getNoteParts(keyString.split('/')[0]);\n\n // Force a natural for every key without an accidental\n const accidentalString = key.accidental || 'n';\n const pitch = key.root + accidentalString;\n\n // Determine if the current pitch has the same accidental\n // as the scale state\n const sameAccidental = scaleMap[key.root] === pitch;\n\n // Determine if an identical pitch in the chord already\n // modified the accidental state\n const previouslyModified = modifiedPitches.indexOf(pitch) > -1;\n\n // Add the accidental to the StaveNote\n if (!sameAccidental || (sameAccidental && previouslyModified)) {\n // Modify the scale map so that the root pitch has an\n // updated state\n scaleMap[key.root] = pitch;\n\n // Create the accidental\n const accidental = new Accidental(accidentalString);\n\n // Attach the accidental to the StaveNote\n note.addAccidental(keyIndex, accidental);\n\n // Add the pitch to list of pitches that modified accidentals\n modifiedPitches.push(pitch);\n }\n });\n\n // process grace notes\n note.getModifiers().forEach(modifier => {\n if (modifier.getCategory() === 'gracenotegroups') {\n modifier.getGraceNotes().forEach(processNote);\n }\n });\n };\n\n notes.forEach(processNote);\n });\n }\n\n // Create accidental. `type` can be a value from the\n // `Vex.Flow.accidentalCodes.accidentals` table in `tables.js`. For\n // example: `#`, `##`, `b`, `n`, etc.\n constructor(type = null) {\n super();\n this.setAttribute('type', 'Accidental');\n\n L('New accidental: ', type);\n\n this.note = null;\n // The `index` points to a specific note in a chord.\n this.index = null;\n this.type = type;\n this.position = Modifier.Position.LEFT;\n\n this.render_options = {\n // Font size for glyphs\n font_scale: 38,\n\n // Length of stroke across heads above or below the stave.\n stroke_px: 3,\n\n // Padding between accidental and parentheses on each side\n parenLeftPadding: 2,\n parenRightPadding: 2,\n };\n\n this.accidental = Flow.accidentalCodes(this.type);\n if (!this.accidental) {\n throw new Vex.RERR('ArgumentError', `Unknown accidental type: ${type}`);\n }\n\n // Cautionary accidentals have parentheses around them\n this.cautionary = false;\n this.parenLeft = null;\n this.parenRight = null;\n\n this.reset();\n }\n\n reset() {\n const fontScale = this.render_options.font_scale;\n this.glyph = new Glyph(this.accidental.code, fontScale);\n this.glyph.setOriginX(1.0);\n\n if (this.cautionary) {\n this.parenLeft = new Glyph(Flow.accidentalCodes('{').code, fontScale);\n this.parenRight = new Glyph(Flow.accidentalCodes('}').code, fontScale);\n this.parenLeft.setOriginX(1.0);\n this.parenRight.setOriginX(1.0);\n }\n }\n\n getCategory() { return Accidental.CATEGORY; }\n\n getWidth() {\n const parenWidth = this.cautionary\n ? (\n getGlyphWidth(this.parenLeft) +\n getGlyphWidth(this.parenRight) +\n this.render_options.parenLeftPadding +\n this.render_options.parenRightPadding\n )\n : 0;\n\n return getGlyphWidth(this.glyph) + parenWidth;\n }\n\n // Attach this accidental to `note`, which must be a `StaveNote`.\n setNote(note) {\n if (!note) {\n throw new Vex.RERR('ArgumentError', `Bad note value: ${note}`);\n }\n\n this.note = note;\n\n // Accidentals attached to grace notes are rendered smaller.\n if (this.note.getCategory() === 'gracenotes') {\n this.render_options.font_scale = 25;\n this.reset();\n }\n }\n\n // If called, draws parenthesis around accidental.\n setAsCautionary() {\n this.cautionary = true;\n this.render_options.font_scale = 28;\n this.reset();\n return this;\n }\n\n // Render accidental onto canvas.\n draw() {\n const {\n context,\n type, position, note, index, cautionary,\n x_shift, y_shift,\n glyph, parenLeft, parenRight,\n render_options: { parenLeftPadding, parenRightPadding },\n } = this;\n\n this.checkContext();\n\n if (!(note && (index != null))) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw accidental without a note and index.\");\n }\n\n // Figure out the start `x` and `y` coordinates for note and index.\n const start = note.getModifierStartXY(position, index);\n let accX = start.x + x_shift;\n const accY = start.y + y_shift;\n L('Rendering: ', type, accX, accY);\n\n if (!cautionary) {\n glyph.render(context, accX, accY);\n } else {\n // Render the accidental in parentheses.\n parenRight.render(context, accX, accY);\n accX -= getGlyphWidth(parenRight);\n accX -= parenRightPadding;\n accX -= this.accidental.parenRightPaddingAdjustment;\n glyph.render(context, accX, accY);\n accX -= getGlyphWidth(glyph);\n accX -= parenLeftPadding;\n parenLeft.render(context, accX, accY);\n }\n\n this.setRendered();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Formatter } from './formatter';\nimport { Voice } from './voice';\n\nexport class NoteSubGroup extends Modifier {\n static get CATEGORY() { return 'notesubgroup'; }\n\n // Arrange groups inside a `ModifierContext`\n static format(groups, state) {\n if (!groups || groups.length === 0) return false;\n\n let width = 0;\n for (let i = 0; i < groups.length; ++i) {\n const group = groups[i];\n group.preFormat();\n width += group.getWidth();\n }\n\n state.left_shift += width;\n return true;\n }\n\n constructor(subNotes) {\n super();\n this.setAttribute('type', 'NoteSubGroup');\n\n this.note = null;\n this.index = null;\n this.position = Modifier.Position.LEFT;\n this.subNotes = subNotes;\n this.subNotes.forEach(subNote => { subNote.ignore_ticks = false; });\n this.width = 0;\n this.preFormatted = false;\n\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Flow.RESOLUTION,\n }).setStrict(false);\n\n this.voice.addTickables(this.subNotes);\n\n return this;\n }\n\n getCategory() { return NoteSubGroup.CATEGORY; }\n\n preFormat() {\n if (this.preFormatted) return;\n\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n\n setNote(note) {\n this.note = note;\n }\n setWidth(width) {\n this.width = width;\n }\n getWidth() {\n return this.width;\n }\n\n draw() {\n this.checkContext();\n\n const note = this.getNote();\n\n if (!(note && (this.index !== null))) {\n throw new Vex.RuntimeError('NoAttachedNote',\n \"Can't draw notes without a parent note and parent note index.\");\n }\n\n this.setRendered();\n this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n\n // Draw notes\n this.subNotes.forEach(subNote => subNote.setContext(this.context).drawWithStyle());\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\n\nexport class StaveTie extends Element {\n constructor(notes, text) {\n /**\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n **/\n super();\n this.setAttribute('type', 'StaveTie');\n this.notes = notes;\n this.context = null;\n this.text = text;\n this.direction = null;\n\n this.render_options = {\n cp1: 8, // Curve control point 1\n cp2: 12, // Curve control point 2\n text_shift_x: 0,\n first_x_shift: 0,\n last_x_shift: 0,\n y_shift: 7,\n tie_spacing: 0,\n font: { family: 'Arial', size: 10, style: '' },\n };\n\n this.font = this.render_options.font;\n this.setNotes(notes);\n }\n\n setFont(font) { this.font = font; return this; }\n setDirection(direction) { this.direction = direction; return this; }\n\n /**\n * Set the notes to attach this tie to.\n *\n * @param {!Object} notes The notes to tie up.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new Vex.RuntimeError(\n 'BadArguments', 'Tie needs to have either first_note or last_note set.'\n );\n }\n\n if (!notes.first_indices) notes.first_indices = [0];\n if (!notes.last_indices) notes.last_indices = [0];\n\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new Vex.RuntimeError('BadArguments', 'Tied notes must have similar index sizes');\n }\n\n // Success. Lets grab 'em notes.\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return (!this.first_note || !this.last_note);\n }\n\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new Vex.RERR('BadArguments', 'No Y-values to render');\n }\n\n const ctx = this.context;\n let cp1 = this.render_options.cp1;\n let cp2 = this.render_options.cp2;\n\n if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n cp1 = 2; cp2 = 8;\n }\n\n const first_x_shift = this.render_options.first_x_shift;\n const last_x_shift = this.render_options.last_x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n\n for (let i = 0; i < this.first_indices.length; ++i) {\n const cp_x = ((params.last_x_px + last_x_shift) +\n (params.first_x_px + first_x_shift)) / 2;\n const first_y_px = params.first_ys[this.first_indices[i]] + y_shift;\n const last_y_px = params.last_ys[this.last_indices[i]] + y_shift;\n\n if (isNaN(first_y_px) || isNaN(last_y_px)) {\n throw new Vex.RERR('BadArguments', 'Bad indices for tie rendering.');\n }\n\n const top_cp_y = ((first_y_px + last_y_px) / 2) + (cp1 * params.direction);\n const bottom_cp_y = ((first_y_px + last_y_px) / 2) + (cp2 * params.direction);\n\n ctx.beginPath();\n ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n ctx.closePath();\n ctx.fill();\n }\n }\n\n renderText(first_x_px, last_x_px) {\n if (!this.text) return;\n let center_x = (first_x_px + last_x_px) / 2;\n center_x -= this.context.measureText(this.text).width / 2;\n\n this.context.save();\n this.context.setFont(this.font.family, this.font.size, this.font.style);\n this.context.fillText(\n this.text,\n center_x + this.render_options.text_shift_x,\n (this.first_note || this.last_note).getStave().getYForTopText() - 1\n );\n this.context.restore();\n }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n const first_note = this.first_note;\n const last_note = this.last_note;\n\n let first_x_px;\n let last_x_px;\n let first_ys;\n let last_ys;\n let stem_direction;\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n stem_direction = first_note.getStemDirection();\n first_ys = first_note.getYs();\n } else {\n first_x_px = last_note.getStave().getTieStartX();\n first_ys = last_note.getYs();\n this.first_indices = this.last_indices;\n }\n\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n stem_direction = last_note.getStemDirection();\n last_ys = last_note.getYs();\n } else {\n last_x_px = first_note.getStave().getTieEndX();\n last_ys = first_note.getYs();\n this.last_indices = this.first_indices;\n }\n\n if (this.direction) {\n stem_direction = this.direction;\n }\n\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: stem_direction,\n });\n\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n","// / [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\n\nimport { StaveTie } from './stavetie';\n\nexport class TabTie extends StaveTie {\n static createHammeron(notes) {\n return new TabTie(notes, 'H');\n }\n\n static createPulloff(notes) {\n return new TabTie(notes, 'P');\n }\n\n constructor(notes, text) {\n /**\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n **/\n super(notes, text);\n this.setAttribute('type', 'TabTie');\n\n this.render_options.cp1 = 9;\n this.render_options.cp2 = 11;\n this.render_options.y_shift = 3;\n\n this.setNotes(notes);\n }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n const first_note = this.first_note;\n const last_note = this.last_note;\n let first_x_px;\n let last_x_px;\n let first_ys;\n let last_ys;\n\n if (first_note) {\n first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n first_ys = first_note.getYs();\n } else {\n first_x_px = last_note.getStave().getTieStartX();\n first_ys = last_note.getYs();\n this.first_indices = this.last_indices;\n }\n\n if (last_note) {\n last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n last_ys = last_note.getYs();\n } else {\n last_x_px = first_note.getStave().getTieEndX();\n last_ys = first_note.getYs();\n this.last_indices = this.first_indices;\n }\n\n this.renderTie({\n first_x_px,\n last_x_px,\n first_ys,\n last_ys,\n direction: -1, // Tab tie's are always face up.\n });\n\n this.renderText(first_x_px, last_x_px);\n return true;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Formatter } from './formatter';\nimport { Voice } from './voice';\nimport { Beam } from './beam';\nimport { StaveTie } from './stavetie';\nimport { TabTie } from './tabtie';\nimport { StaveNote } from './stavenote';\n\n// To enable logging for this class. Set `Vex.Flow.GraceNoteGroup.DEBUG` to `true`.\nfunction L(...args) { if (GraceNoteGroup.DEBUG) Vex.L('Vex.Flow.GraceNoteGroup', args); }\n\nexport class GraceNoteGroup extends Modifier {\n static get CATEGORY() { return 'gracenotegroups'; }\n\n // Arrange groups inside a `ModifierContext`\n static format(gracenote_groups, state) {\n const group_spacing_stave = 4;\n const group_spacing_tab = 0;\n\n if (!gracenote_groups || gracenote_groups.length === 0) return false;\n\n const group_list = [];\n let prev_note = null;\n let shiftL = 0;\n\n for (let i = 0; i < gracenote_groups.length; ++i) {\n const gracenote_group = gracenote_groups[i];\n const note = gracenote_group.getNote();\n const is_stavenote = (note.getCategory() === StaveNote.CATEGORY);\n const spacing = (is_stavenote ? group_spacing_stave : group_spacing_tab);\n\n if (is_stavenote && note !== prev_note) {\n // Iterate through all notes to get the displaced pixels\n for (let n = 0; n < note.keys.length; ++n) {\n const props_tmp = note.getKeyProps()[n];\n shiftL = (props_tmp.displaced ? note.getExtraLeftPx() : shiftL);\n }\n prev_note = note;\n }\n\n group_list.push({ shift: shiftL, gracenote_group, spacing });\n }\n\n // If first note left shift in case it is displaced\n let group_shift = group_list[0].shift;\n let formatWidth;\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n gracenote_group.preFormat();\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n group_shift = Math.max(formatWidth, group_shift);\n }\n\n for (let i = 0; i < group_list.length; ++i) {\n const gracenote_group = group_list[i].gracenote_group;\n formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n }\n\n state.left_shift += group_shift;\n return true;\n }\n\n // ## Prototype Methods\n //\n // `GraceNoteGroup` inherits from `Modifier` and is placed inside a\n // `ModifierContext`.\n constructor(grace_notes, show_slur) {\n super();\n this.setAttribute('type', 'GraceNoteGroup');\n\n this.note = null;\n this.index = null;\n this.position = Modifier.Position.LEFT;\n this.grace_notes = grace_notes;\n this.width = 0;\n\n this.preFormatted = false;\n\n this.show_slur = show_slur;\n this.slur = null;\n\n this.formatter = new Formatter();\n this.voice = new Voice({\n num_beats: 4,\n beat_value: 4,\n resolution: Flow.RESOLUTION,\n }).setStrict(false);\n\n this.render_options = {\n slur_y_shift: 0,\n };\n\n this.beams = [];\n\n this.voice.addTickables(this.grace_notes);\n\n return this;\n }\n\n getCategory() { return GraceNoteGroup.CATEGORY; }\n\n preFormat() {\n if (this.preFormatted) return;\n\n this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n this.setWidth(this.formatter.getMinTotalWidth());\n this.preFormatted = true;\n }\n\n beamNotes(grace_notes) {\n grace_notes = grace_notes || this.grace_notes;\n if (grace_notes.length > 1) {\n const beam = new Beam(grace_notes);\n\n beam.render_options.beam_width = 3;\n beam.render_options.partial_beam_length = 4;\n\n this.beams.push(beam);\n }\n\n return this;\n }\n\n setNote(note) {\n this.note = note;\n }\n setWidth(width) {\n this.width = width;\n }\n getWidth() {\n return this.width;\n }\n getGraceNotes() {\n return this.grace_notes;\n }\n draw() {\n this.checkContext();\n\n const note = this.getNote();\n\n L('Drawing grace note group for:', note);\n\n if (!(note && (this.index !== null))) {\n throw new Vex.RuntimeError('NoAttachedNote',\n \"Can't draw grace note without a parent note and parent note index.\");\n }\n\n this.setRendered();\n this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n\n // Draw notes\n this.grace_notes.forEach(graceNote => {\n graceNote.setContext(this.context).draw();\n });\n\n // Draw beam\n this.beams.forEach(beam => {\n beam.setContext(this.context).draw();\n });\n\n if (this.show_slur) {\n // Create and draw slur\n const is_stavenote = (this.getNote().getCategory() === StaveNote.CATEGORY);\n const TieClass = (is_stavenote ? StaveTie : TabTie);\n\n this.slur = new TieClass({\n last_note: this.grace_notes[0],\n first_note: note,\n first_indices: [0],\n last_indices: [0],\n });\n\n this.slur.render_options.cp2 = 12;\n this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n this.slur.setContext(this.context).draw();\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// ## Description\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { StaveNote } from './stavenote';\nimport { Glyph } from './glyph';\n\nexport class Stroke extends Modifier {\n static get CATEGORY() { return 'strokes'; }\n static get Type() {\n return {\n BRUSH_DOWN: 1,\n BRUSH_UP: 2,\n ROLL_DOWN: 3, // Arpeggiated chord\n ROLL_UP: 4, // Arpeggiated chord\n RASQUEDO_DOWN: 5,\n RASQUEDO_UP: 6,\n ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n };\n }\n\n // Arrange strokes inside `ModifierContext`\n static format(strokes, state) {\n const left_shift = state.left_shift;\n const stroke_spacing = 0;\n\n if (!strokes || strokes.length === 0) return this;\n\n const strokeList = strokes.map((stroke) => {\n const note = stroke.getNote();\n if (note instanceof StaveNote) {\n const { line, displaced } = note.getKeyProps()[stroke.getIndex()];\n const shift = displaced ? note.getExtraLeftPx() : 0;\n return { line, shift, stroke };\n } else {\n const { str: string } = note.getPositions()[stroke.getIndex()];\n return { line: string, shift: 0, stroke };\n }\n });\n\n const strokeShift = left_shift;\n\n // There can only be one stroke .. if more than one, they overlay each other\n const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n stroke.setXShift(strokeShift + shift);\n return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n }, 0);\n\n state.left_shift += xShift;\n return true;\n }\n\n constructor(type, options) {\n super();\n this.setAttribute('type', 'Stroke');\n\n this.note = null;\n this.options = Vex.Merge({}, options);\n\n // multi voice - span stroke across all voices if true\n this.all_voices = 'all_voices' in this.options ? this.options.all_voices : true;\n\n // multi voice - end note of stroke, set in draw()\n this.note_end = null;\n this.index = null;\n this.type = type;\n this.position = Modifier.Position.LEFT;\n\n this.render_options = {\n font_scale: 38,\n stroke_px: 3,\n stroke_spacing: 10,\n };\n\n this.font = {\n family: 'serif',\n size: 10,\n weight: 'bold italic',\n };\n\n this.setXShift(0);\n this.setWidth(10);\n }\n\n getCategory() { return Stroke.CATEGORY; }\n getPosition() { return this.position; }\n addEndNote(note) { this.note_end = note; return this; }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n if (!(this.note && (this.index != null))) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw stroke without a note and index.\");\n }\n\n const start = this.note.getModifierStartXY(this.position, this.index);\n let ys = this.note.getYs();\n let topY = start.y;\n let botY = start.y;\n const x = start.x - 5;\n const line_space = this.note.stave.options.spacing_between_lines_px;\n\n const notes = this.getModifierContext().getModifiers(this.note.getCategory());\n for (let i = 0; i < notes.length; i++) {\n ys = notes[i].getYs();\n for (let n = 0; n < ys.length; n++) {\n if (this.note === notes[i] || this.all_voices) {\n topY = Vex.Min(topY, ys[n]);\n botY = Vex.Max(botY, ys[n]);\n }\n }\n }\n\n let arrow;\n let arrow_shift_x;\n let arrow_y;\n let text_shift_x;\n let text_y;\n switch (this.type) {\n case Stroke.Type.BRUSH_DOWN:\n arrow = 'vc3';\n arrow_shift_x = -3;\n arrow_y = topY - (line_space / 2) + 10;\n botY += (line_space / 2);\n break;\n case Stroke.Type.BRUSH_UP:\n arrow = 'v11';\n arrow_shift_x = 0.5;\n arrow_y = botY + (line_space / 2);\n topY -= (line_space / 2);\n break;\n case Stroke.Type.ROLL_DOWN:\n case Stroke.Type.RASQUEDO_DOWN:\n arrow = 'vc3';\n arrow_shift_x = -3;\n text_shift_x = this.x_shift + arrow_shift_x - 2;\n if (this.note instanceof StaveNote) {\n topY += 1.5 * line_space;\n if ((botY - topY) % 2 !== 0) {\n botY += 0.5 * line_space;\n } else {\n botY += line_space;\n }\n arrow_y = topY - line_space;\n text_y = botY + line_space + 2;\n } else {\n topY += 1.5 * line_space;\n botY += line_space;\n arrow_y = topY - 0.75 * line_space;\n text_y = botY + 0.25 * line_space;\n }\n break;\n case Stroke.Type.ROLL_UP:\n case Stroke.Type.RASQUEDO_UP:\n arrow = 'v52';\n arrow_shift_x = -4;\n text_shift_x = this.x_shift + arrow_shift_x - 1;\n if (this.note instanceof StaveNote) {\n arrow_y = line_space / 2;\n topY += 0.5 * line_space;\n if ((botY - topY) % 2 === 0) {\n botY += line_space / 2;\n }\n arrow_y = botY + 0.5 * line_space;\n text_y = topY - 1.25 * line_space;\n } else {\n topY += 0.25 * line_space;\n botY += 0.5 * line_space;\n arrow_y = botY + 0.25 * line_space;\n text_y = topY - line_space;\n }\n break;\n case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n topY += 0.5 * line_space;\n botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n break;\n default:\n throw new Vex.RERR('InvalidType', `The stroke type ${this.type} does not exist`);\n }\n\n // Draw the stroke\n if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n this.context.fillRect(x + this.x_shift, topY, 1, botY - topY);\n } else {\n if (this.note instanceof StaveNote) {\n for (let i = topY; i <= botY; i += line_space) {\n Glyph.renderGlyph(\n this.context,\n x + this.x_shift - 4,\n i,\n this.render_options.font_scale,\n 'va3'\n );\n }\n } else {\n let i;\n for (i = topY; i <= botY; i += 10) {\n Glyph.renderGlyph(\n this.context,\n x + this.x_shift - 4,\n i,\n this.render_options.font_scale,\n 'va3'\n );\n }\n if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n text_y = i + 0.25 * line_space;\n }\n }\n }\n\n if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n return; // skip drawing arrow heads or text\n }\n\n // Draw the arrow head\n Glyph.renderGlyph(\n this.context,\n x + this.x_shift + arrow_shift_x,\n arrow_y,\n this.render_options.font_scale,\n arrow\n );\n\n // Draw the rasquedo \"R\"\n if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n this.context.save();\n this.context.setFont(this.font.family, this.font.size, this.font.weight);\n this.context.fillText('R', x + text_shift_x, text_y);\n this.context.restore();\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// ## Description\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { Renderer } from './renderer';\nimport { StaveNote } from './stavenote';\n\nexport class StringNumber extends Modifier {\n static get CATEGORY() { return 'stringnumber'; }\n\n // ## Static Methods\n // Arrange string numbers inside a `ModifierContext`\n static format(nums, state) {\n const left_shift = state.left_shift;\n const right_shift = state.right_shift;\n const num_spacing = 1;\n\n if (!nums || nums.length === 0) return this;\n\n const nums_list = [];\n let prev_note = null;\n let shift_left = 0;\n let shift_right = 0;\n\n let i;\n let num;\n let note;\n let pos;\n let props_tmp;\n for (i = 0; i < nums.length; ++i) {\n num = nums[i];\n note = num.getNote();\n\n for (i = 0; i < nums.length; ++i) {\n num = nums[i];\n note = num.getNote();\n pos = num.getPosition();\n const props = note.getKeyProps()[num.getIndex()];\n\n if (note !== prev_note) {\n for (let n = 0; n < note.keys.length; ++n) {\n props_tmp = note.getKeyProps()[n];\n if (left_shift === 0) {\n shift_left = props_tmp.displaced ? note.getExtraLeftPx() : shift_left;\n }\n if (right_shift === 0) {\n shift_right = props_tmp.displaced ? note.getExtraRightPx() : shift_right;\n }\n }\n prev_note = note;\n }\n\n nums_list.push({\n pos,\n note,\n num,\n line: props.line,\n shiftL: shift_left,\n shiftR: shift_right,\n });\n }\n }\n\n // Sort string numbers by line number.\n nums_list.sort((a, b) => b.line - a.line);\n\n // TODO: This variable never gets assigned to anything. Is that a bug or can this be removed?\n let num_shiftL = 0; // eslint-disable-line\n let num_shiftR = 0;\n let x_widthL = 0;\n let x_widthR = 0;\n let last_line = null;\n let last_note = null;\n for (i = 0; i < nums_list.length; ++i) {\n let num_shift = 0;\n note = nums_list[i].note;\n pos = nums_list[i].pos;\n num = nums_list[i].num;\n const line = nums_list[i].line;\n const shiftL = nums_list[i].shiftL;\n const shiftR = nums_list[i].shiftR;\n\n // Reset the position of the string number every line.\n if (line !== last_line || note !== last_note) {\n num_shiftL = left_shift + shiftL;\n num_shiftR = right_shift + shiftR;\n }\n\n const num_width = num.getWidth() + num_spacing;\n if (pos === Modifier.Position.LEFT) {\n num.setXShift(left_shift);\n num_shift = shift_left + num_width; // spacing\n x_widthL = (num_shift > x_widthL) ? num_shift : x_widthL;\n } else if (pos === Modifier.Position.RIGHT) {\n num.setXShift(num_shiftR);\n num_shift += num_width; // spacing\n x_widthR = (num_shift > x_widthR) ? num_shift : x_widthR;\n }\n last_line = line;\n last_note = note;\n }\n\n state.left_shift += x_widthL;\n state.right_shift += x_widthR;\n return true;\n }\n\n constructor(number) {\n super();\n this.setAttribute('type', 'StringNumber');\n\n this.note = null;\n this.last_note = null;\n this.index = null;\n this.string_number = number;\n this.setWidth(20); // ???\n this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n this.x_shift = 0;\n this.y_shift = 0;\n this.x_offset = 0; // Horizontal offset from default\n this.y_offset = 0; // Vertical offset from default\n this.dashed = true; // true - draw dashed extension false - no extension\n this.leg = Renderer.LineEndType.NONE; // draw upward/downward leg at the of extension line\n this.radius = 8;\n this.font = {\n family: 'sans-serif',\n size: 10,\n weight: 'bold',\n };\n }\n getCategory() { return StringNumber.CATEGORY; }\n getNote() { return this.note; }\n setNote(note) { this.note = note; return this; }\n getIndex() { return this.index; }\n setIndex(index) { this.index = index; return this; }\n\n setLineEndType(leg) {\n if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n this.leg = leg;\n }\n return this;\n }\n\n setStringNumber(number) { this.string_number = number; return this; }\n setOffsetX(x) { this.x_offset = x; return this; }\n setOffsetY(y) { this.y_offset = y; return this; }\n setLastNote(note) { this.last_note = note; return this; }\n setDashed(dashed) { this.dashed = dashed; return this; }\n\n draw() {\n const ctx = this.checkContext();\n if (!(this.note && (this.index != null))) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw string number without a note and index.\");\n }\n this.setRendered();\n\n const line_space = this.note.stave.options.spacing_between_lines_px;\n\n const start = this.note.getModifierStartXY(this.position, this.index);\n let dot_x = (start.x + this.x_shift + this.x_offset);\n let dot_y = start.y + this.y_shift + this.y_offset;\n\n switch (this.position) {\n case Modifier.Position.ABOVE:\n case Modifier.Position.BELOW: {\n const stem_ext = this.note.getStemExtents();\n let top = stem_ext.topY;\n let bottom = stem_ext.baseY + 2;\n\n if (this.note.stem_direction === StaveNote.STEM_DOWN) {\n top = stem_ext.baseY;\n bottom = stem_ext.topY - 2;\n }\n\n if (this.position === Modifier.Position.ABOVE) {\n dot_y = this.note.hasStem()\n ? top - (line_space * 1.75)\n : start.y - (line_space * 1.75);\n } else {\n dot_y = this.note.hasStem()\n ? bottom + (line_space * 1.5)\n : start.y + (line_space * 1.75);\n }\n\n dot_y += this.y_shift + this.y_offset;\n\n break;\n } case Modifier.Position.LEFT:\n dot_x -= (this.radius / 2) + 5;\n break;\n case Modifier.Position.RIGHT:\n dot_x += (this.radius / 2) + 6;\n break;\n default:\n throw new Vex.RERR(\n 'InvalidPosition', `The position ${this.position} is invalid`\n );\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n ctx.lineWidth = 1.5;\n ctx.stroke();\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n const x = dot_x - ctx.measureText(this.string_number).width / 2;\n ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n\n if (this.last_note != null) {\n const end = this.last_note.getStemX() - this.note.getX() + 5;\n ctx.strokeStyle = '#000000';\n ctx.lineCap = 'round';\n ctx.lineWidth = 0.6;\n if (this.dashed) {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n } else {\n Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n }\n\n let len;\n let pattern;\n switch (this.leg) {\n case Renderer.LineEndType.UP:\n len = -10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n case Renderer.LineEndType.DOWN:\n len = 10;\n pattern = this.dashed ? [3, 3] : [3, 0];\n Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n break;\n default:\n break;\n }\n }\n\n ctx.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n//\n// ## Description\n//\n// This file implements articulations and accents as modifiers that can be\n// attached to notes. The complete list of articulations is available in\n// `tables.js` under `Vex.Flow.articulationCodes`.\n//\n// See `tests/articulation_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\n\n// To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`.\nfunction L(...args) { if (Articulation.DEBUG) Vex.L('Vex.Flow.Articulation', args); }\n\nconst { ABOVE, BELOW } = Modifier.Position;\n\nconst roundToNearestHalf = (mathFn, value) => mathFn(value / 0.5) * 0.5;\n\n// This includes both staff and ledger lines\nconst isWithinLines = (line, position) => position === ABOVE ? line <= 5 : line >= 1;\n\nconst getRoundingFunction = (line, position) => {\n if (isWithinLines(line, position)) {\n if (position === ABOVE) {\n return Math.ceil;\n } else {\n return Math.floor;\n }\n } else {\n return Math.round;\n }\n};\n\nconst snapLineToStaff = (canSitBetweenLines, line, position, offsetDirection) => {\n // Initially, snap to nearest staff line or space\n const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n const onStaffLine = snappedLine % 1 === 0;\n\n if (canSnapToStaffSpace && onStaffLine) {\n const HALF_STAFF_SPACE = 0.5;\n return snappedLine + (HALF_STAFF_SPACE * -offsetDirection);\n } else {\n return snappedLine;\n }\n};\n\nconst isStaveNote = (note) => {\n const noteCategory = note.getCategory();\n return noteCategory === 'stavenotes' || noteCategory === 'gracenotes';\n};\n\nconst getTopY = (note, textLine) => {\n const stave = note.getStave();\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n\n if (isStaveNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n } else {\n return stemBaseY;\n }\n } else {\n return Math.min(...note.getYs());\n }\n } else if (note.getCategory() === 'tabnotes') {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemTipY;\n } else {\n return stave.getYForTopText(textLine);\n }\n } else {\n return stave.getYForTopText(textLine);\n }\n } else {\n throw new Vex.RERR(\n 'UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'\n );\n }\n};\n\nconst getBottomY = (note, textLine) => {\n const stave = note.getStave();\n const stemDirection = note.getStemDirection();\n const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n\n if (isStaveNote(note)) {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stemBaseY;\n } else {\n return stemTipY;\n }\n } else {\n return Math.max(...note.getYs());\n }\n } else if (note.getCategory() === 'tabnotes') {\n if (note.hasStem()) {\n if (stemDirection === Stem.UP) {\n return stave.getYForBottomText(textLine);\n } else {\n return stemTipY;\n }\n } else {\n return stave.getYForBottomText(textLine);\n }\n } else {\n throw new Vex.RERR(\n 'UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'\n );\n }\n};\n\n// Gets the initial offset of the articulation from the y value of the starting position.\n// This is required because the top/bottom text positions already have spacing applied to\n// provide a \"visually pleasent\" default position. However the y values provided from\n// the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n// normalizes this asymmetry.\nconst getInitialOffset = (note, position) => {\n const isOnStemTip = (\n (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n (position === BELOW && note.getStemDirection() === Stem.DOWN)\n );\n\n if (isStaveNote(note)) {\n if (note.hasStem() && isOnStemTip) {\n return 0.5;\n } else {\n // this amount is larger than the stem-tip offset because we start from\n // the center of the notehead\n return 1;\n }\n } else {\n if (note.hasStem() && isOnStemTip) {\n return 1;\n } else {\n return 0;\n }\n }\n};\n\nexport class Articulation extends Modifier {\n static get CATEGORY() { return 'articulations'; }\n static get INITIAL_OFFSET() { return -0.5; }\n\n // FIXME:\n // Most of the complex formatting logic (ie: snapping to space) is\n // actually done in .render(). But that logic belongs in this method.\n //\n // Unfortunately, this isn't possible because, by this point, stem lengths\n // have not yet been finalized. Finalized stem lengths are required to determine the\n // initial position of any stem-side articulation.\n //\n // This indicates that all objects should have their stave set before being\n // formatted. It can't be an optional if you want accurate vertical positioning.\n // Consistently positioned articulations that play nice with other modifiers\n // won't be possible until we stop relying on render-time formatting.\n //\n // Ideally, when this function has completed, the vertical articulation positions\n // should be ready to render without further adjustment. But the current state\n // is far from this ideal.\n static format(articulations, state) {\n if (!articulations || articulations.length === 0) return false;\n\n const isAbove = artic => artic.getPosition() === ABOVE;\n const isBelow = artic => artic.getPosition() === BELOW;\n const margin = 0.5;\n const getIncrement = (articulation, line, position) =>\n roundToNearestHalf(\n getRoundingFunction(line, position),\n (articulation.glyph.getMetrics().height / 10) + margin\n );\n\n articulations\n .filter(isAbove)\n .forEach(articulation => {\n articulation.setTextLine(state.top_text_line);\n state.top_text_line += getIncrement(articulation, state.top_text_line, ABOVE);\n });\n\n articulations\n .filter(isBelow)\n .forEach(articulation => {\n articulation.setTextLine(state.text_line);\n state.text_line += getIncrement(articulation, state.text_line, BELOW);\n });\n\n const width = articulations\n .map(articulation => articulation.getWidth())\n .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n\n static easyScoreHook({ articulations }, note, builder) {\n if (!articulations) return;\n\n const articNameToCode = {\n staccato: 'a.',\n tenuto: 'a-',\n };\n\n articulations\n .split(',')\n .map(articString => articString.trim().split('.'))\n .map(([name, position]) => {\n const artic = { type: articNameToCode[name] };\n if (position) artic.position = Modifier.PositionString[position];\n return builder.getFactory().Articulation(artic);\n })\n .map(artic => note.addModifier(0, artic));\n }\n\n // Create a new articulation of type `type`, which is an entry in\n // `Vex.Flow.articulationCodes` in `tables.js`.\n constructor(type) {\n super();\n this.setAttribute('type', 'Articulation');\n\n this.note = null;\n this.index = null;\n this.type = type;\n this.position = BELOW;\n this.render_options = {\n font_scale: 38,\n };\n\n this.articulation = Flow.articulationCodes(this.type);\n if (!this.articulation) {\n throw new Vex.RERR('ArgumentError', `Articulation not found: ${this.type}`);\n }\n\n this.glyph = new Glyph(this.articulation.code, this.render_options.font_scale);\n\n this.setWidth(this.glyph.getMetrics().width);\n }\n\n getCategory() { return Articulation.CATEGORY; }\n\n // Render articulation in position next to note.\n draw() {\n const {\n note, index, position, glyph,\n articulation: { between_lines: canSitBetweenLines },\n text_line: textLine,\n context: ctx,\n } = this;\n\n this.checkContext();\n\n if (!note || index == null) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw Articulation without a note and index.\");\n }\n\n this.setRendered();\n\n const stave = note.getStave();\n const staffSpace = stave.getSpacingBetweenLines();\n const isTab = note.getCategory() === 'tabnotes';\n\n // Articulations are centered over/under the note head.\n const { x } = note.getModifierStartXY(position, index);\n const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n\n const initialOffset = getInitialOffset(note, position);\n\n let y = {\n [ABOVE]: () => {\n glyph.setOrigin(0.5, 1);\n const y = getTopY(note, textLine) - ((textLine + initialOffset) * staffSpace);\n return shouldSitOutsideStaff\n ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y)\n : y;\n },\n [BELOW]: () => {\n glyph.setOrigin(0.5, 0);\n const y = getBottomY(note, textLine) + ((textLine + initialOffset) * staffSpace);\n return shouldSitOutsideStaff\n ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y)\n : y;\n },\n }[position]();\n\n if (!isTab) {\n const offsetDirection = position === ABOVE ? -1 : +1;\n const noteLine = isTab ? note.positions[index].str : note.getKeyProps()[index].line;\n const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n const articLine = distanceFromNote + noteLine;\n const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n\n if (isWithinLines(snappedLine, position)) glyph.setOrigin(0.5, 0.5);\n\n y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection;\n }\n\n L(`Rendering articulation at (x: ${x}, y: ${y})`);\n\n glyph.render(ctx, x, y);\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\n\nimport { Vex } from './vex';\nimport { Tickable } from './tickable';\nimport { Fraction } from './fraction';\n\nexport class TickContext extends Tickable {\n static getNextContext(tContext) {\n const contexts = tContext.tContexts;\n const index = contexts.indexOf(tContext);\n\n return contexts[index + 1];\n }\n\n constructor() {\n super();\n this.setAttribute('type', 'TickContext');\n this.currentTick = new Fraction(0, 1);\n this.maxTicks = new Fraction(0, 1);\n this.minTicks = null;\n this.padding = 3; // padding on each side (width += padding * 2)\n this.x = 0;\n this.xBase = 0; // base x position without xOffset\n this.xOffset = 0; // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n this.tickables = []; // Notes, tabs, chords, lyrics.\n this.notePx = 0; // width of widest note in this context\n this.extraLeftPx = 0; // Extra left pixels for modifers & displace notes\n this.extraRightPx = 0; // Extra right pixels for modifers & displace notes\n this.tContexts = []; // Parent array of tick contexts\n }\n\n getX() { return this.x; }\n setX(x) { this.x = x; this.xBase = x; this.xOffset = 0; return this; }\n getXBase() { return this.xBase; } // use of xBase and xOffset is optional, avoids offset creep\n setXBase(xBase) { this.xBase = xBase; this.x = xBase + this.xOffset; }\n getXOffset() { return this.xOffset; }\n setXOffset(xOffset) { this.xOffset = xOffset; this.x = this.xBase + xOffset; }\n getWidth() { return this.width + (this.padding * 2); }\n setPadding(padding) { this.padding = padding; return this; }\n getMaxTicks() { return this.maxTicks; }\n getMinTicks() { return this.minTicks; }\n getTickables() { return this.tickables; }\n\n getCenterAlignedTickables() {\n return this.tickables.filter(tickable => tickable.isCenterAligned());\n }\n\n // Get widths context, note and left/right modifiers for formatting\n getMetrics() {\n const { width, notePx, extraLeftPx, extraRightPx } = this;\n return { width, notePx, extraLeftPx, extraRightPx };\n }\n\n getCurrentTick() { return this.currentTick; }\n setCurrentTick(tick) {\n this.currentTick = tick;\n this.preFormatted = false;\n }\n\n // ### DEPRECATED ###\n // Get left & right pixels used for modifiers. THIS METHOD IS DEPRECATED. Use\n // the getMetrics() method instead!\n getExtraPx() {\n let left_shift = 0;\n let right_shift = 0;\n let extraLeftPx = 0;\n let extraRightPx = 0;\n for (let i = 0; i < this.tickables.length; i++) {\n extraLeftPx = Math.max(this.tickables[i].extraLeftPx || 0, extraLeftPx);\n extraRightPx = Math.max(this.tickables[i].extraRightPx || 0, extraRightPx);\n const mContext = this.tickables[i].modifierContext;\n if (mContext && mContext != null) {\n left_shift = Math.max(left_shift, mContext.state.left_shift);\n right_shift = Math.max(right_shift, mContext.state.right_shift);\n }\n }\n return {\n left: left_shift,\n right: right_shift,\n extraLeft: extraLeftPx,\n extraRight: extraRightPx,\n };\n }\n\n addTickable(tickable) {\n if (!tickable) {\n throw new Vex.RERR('BadArgument', 'Invalid tickable added.');\n }\n\n if (!tickable.shouldIgnoreTicks()) {\n this.ignore_ticks = false;\n\n const ticks = tickable.getTicks();\n\n if (ticks.greaterThan(this.maxTicks)) {\n this.maxTicks = ticks.clone();\n }\n\n if (this.minTicks == null) {\n this.minTicks = ticks.clone();\n } else if (ticks.lessThan(this.minTicks)) {\n this.minTicks = ticks.clone();\n }\n }\n\n tickable.setTickContext(this);\n this.tickables.push(tickable);\n this.preFormatted = false;\n return this;\n }\n\n preFormat() {\n if (this.preFormatted) return this;\n\n for (let i = 0; i < this.tickables.length; ++i) {\n const tickable = this.tickables[i];\n tickable.preFormat();\n const metrics = tickable.getMetrics();\n\n // Maintain max extra pixels from all tickables in the context\n this.extraLeftPx = Math.max(this.extraLeftPx, metrics.extraLeftPx + metrics.modLeftPx);\n this.extraRightPx = Math.max(this.extraRightPx, metrics.extraRightPx + metrics.modRightPx);\n\n // Maintain the widest note for all tickables in the context\n this.notePx = Math.max(this.notePx, metrics.noteWidth);\n\n // Recalculate the tick context total width\n this.width = this.notePx + this.extraLeftPx + this.extraRightPx;\n }\n\n return this;\n }\n\n postFormat() {\n if (this.postFormatted) return this;\n this.postFormatted = true;\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements ornaments as modifiers that can be\n// attached to notes. The complete list of ornaments is available in\n// `tables.js` under `Vex.Flow.ornamentCodes`.\n//\n// See `tests/ornament_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { TickContext } from './tickcontext';\nimport { StaveNote } from './stavenote';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`.\nfunction L(...args) { if (Ornament.DEBUG) Vex.L('Vex.Flow.Ornament', args); }\n\nexport class Ornament extends Modifier {\n static get CATEGORY() { return 'ornaments'; }\n\n // ## Static Methods\n // Arrange ornaments inside `ModifierContext`\n static format(ornaments, state) {\n if (!ornaments || ornaments.length === 0) return false;\n\n let width = 0;\n for (let i = 0; i < ornaments.length; ++i) {\n const ornament = ornaments[i];\n const increment = 2;\n\n width = Math.max(ornament.getWidth(), width);\n\n if (ornament.getPosition() === Modifier.Position.ABOVE) {\n ornament.setTextLine(state.top_text_line);\n state.top_text_line += increment;\n } else {\n ornament.setTextLine(state.text_line);\n state.text_line += increment;\n }\n }\n\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n\n // Create a new ornament of type `type`, which is an entry in\n // `Vex.Flow.ornamentCodes` in `tables.js`.\n constructor(type) {\n super();\n this.setAttribute('type', 'Ornament');\n\n this.note = null;\n this.index = null;\n this.type = type;\n this.position = Modifier.Position.ABOVE;\n this.delayed = false;\n\n this.accidentalUpper = null;\n this.accidentalLower = null;\n\n this.render_options = {\n font_scale: 38,\n accidentalLowerPadding: 3,\n accidentalUpperPadding: 3,\n };\n\n this.ornament = Flow.ornamentCodes(this.type);\n if (!this.ornament) {\n throw new Vex.RERR('ArgumentError', `Ornament not found: '${this.type}'`);\n }\n\n this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale);\n this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n }\n\n getCategory() { return Ornament.CATEGORY; }\n\n // Set whether the ornament is to be delayed\n setDelayed(delayed) { this.delayed = delayed; return this; }\n\n // Set the upper accidental for the ornament\n setUpperAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalUpper = new Glyph(Flow.accidentalCodes(accid).code, scale);\n this.accidentalUpper.setOrigin(0.5, 1.0);\n return this;\n }\n\n // Set the lower accidental for the ornament\n setLowerAccidental(accid) {\n const scale = this.render_options.font_scale / 1.3;\n this.accidentalLower = new Glyph(Flow.accidentalCodes(accid).code, scale);\n this.accidentalLower.setOrigin(0.5, 1.0);\n return this;\n }\n\n // Render ornament in position next to note.\n draw() {\n this.checkContext();\n\n if (!this.note || this.index == null) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw Ornament without a note and index.\");\n }\n\n this.setRendered();\n\n const ctx = this.context;\n const stemDir = this.note.getStemDirection();\n const stave = this.note.getStave();\n\n // Get stem extents\n const stemExtents = this.note.getStem().getExtents();\n let y = stemDir === StaveNote.STEM_DOWN ? stemExtents.baseY : stemExtents.topY;\n\n // TabNotes don't have stems attached to them. Tab stems are rendered\n // outside the stave.\n if (this.note.getCategory() === 'tabnotes') {\n if (this.note.hasStem()) {\n if (stemDir === StaveNote.STEM_DOWN) {\n y = stave.getYForTopText(this.text_line);\n }\n } else { // Without a stem\n y = stave.getYForTopText(this.text_line);\n }\n }\n\n const isPlacedOnNoteheadSide = stemDir === StaveNote.STEM_DOWN;\n const spacing = stave.getSpacingBetweenLines();\n let lineSpacing = 1;\n\n // Beamed stems are longer than quarter note stems, adjust accordingly\n if (!isPlacedOnNoteheadSide && this.note.beam) {\n lineSpacing += 0.5;\n }\n\n const totalSpacing = spacing * (this.text_line + lineSpacing);\n const glyphYBetweenLines = y - totalSpacing;\n\n // Get initial coordinates for the modifier position\n const start = this.note.getModifierStartXY(this.position, this.index);\n let glyphX = start.x;\n let glyphY = Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n glyphY += this.y_shift;\n\n // Ajdust x position if ornament is delayed\n if (this.delayed) {\n let delayXShift = 0;\n if (this.delayXShift !== undefined) {\n delayXShift = this.delayXShift;\n } else {\n delayXShift += this.glyph.getMetrics().width / 2;\n const nextContext = TickContext.getNextContext(this.note.getTickContext());\n if (nextContext) {\n delayXShift += (nextContext.getX() - glyphX) * 0.5;\n } else {\n delayXShift += (stave.x + stave.width - glyphX) * 0.5;\n }\n this.delayXShift = delayXShift;\n }\n glyphX += delayXShift;\n }\n\n L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n\n if (this.accidentalLower) {\n this.accidentalLower.render(ctx, glyphX, glyphY);\n glyphY -= this.accidentalLower.getMetrics().height;\n glyphY -= this.render_options.accidentalLowerPadding;\n }\n\n this.glyph.render(ctx, glyphX, glyphY);\n glyphY -= this.glyph.getMetrics().height;\n\n if (this.accidentalUpper) {\n glyphY -= this.render_options.accidentalUpperPadding;\n this.accidentalUpper.render(ctx, glyphX, glyphY);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements text annotations as modifiers that can be attached to\n// notes.\n//\n// See `tests/annotation_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\n\n// To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`.\nfunction L(...args) { if (Annotation.DEBUG) Vex.L('Vex.Flow.Annotation', args); }\n\nexport class Annotation extends Modifier {\n static get CATEGORY() { return 'annotations'; }\n\n // Text annotations can be positioned and justified relative to the note.\n static get Justify() {\n return {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n CENTER_STEM: 4,\n };\n }\n\n static get JustifyString() {\n return {\n left: Annotation.Justify.LEFT,\n right: Annotation.Justify.RIGHT,\n center: Annotation.Justify.CENTER,\n centerStem: Annotation.Justify.CENTER_STEM,\n };\n }\n\n static get VerticalJustify() {\n return {\n TOP: 1,\n CENTER: 2,\n BOTTOM: 3,\n CENTER_STEM: 4,\n };\n }\n\n static get VerticalJustifyString() {\n return {\n above: Annotation.VerticalJustify.TOP,\n top: Annotation.VerticalJustify.TOP,\n below: Annotation.VerticalJustify.BOTTOM,\n bottom: Annotation.VerticalJustify.BOTTOM,\n center: Annotation.VerticalJustify.CENTER,\n centerStem: Annotation.VerticalJustify.CENTER_STEM,\n };\n }\n\n // Arrange annotations within a `ModifierContext`\n static format(annotations, state) {\n if (!annotations || annotations.length === 0) return false;\n\n let width = 0;\n for (let i = 0; i < annotations.length; ++i) {\n const annotation = annotations[i];\n width = Math.max(annotation.getWidth(), width);\n if (annotation.getPosition() === Modifier.Position.ABOVE) {\n annotation.setTextLine(state.top_text_line);\n state.top_text_line++;\n } else {\n annotation.setTextLine(state.text_line);\n state.text_line++;\n }\n }\n\n state.left_shift += width / 2;\n state.right_shift += width / 2;\n return true;\n }\n\n // ## Prototype Methods\n //\n // Annotations inherit from `Modifier` and is positioned correctly when\n // in a `ModifierContext`.\n // Create a new `Annotation` with the string `text`.\n constructor(text) {\n super();\n this.setAttribute('type', 'Annotation');\n\n this.note = null;\n this.index = null;\n this.text = text;\n this.justification = Annotation.Justify.CENTER;\n this.vert_justification = Annotation.VerticalJustify.TOP;\n this.font = {\n family: 'Arial',\n size: 10,\n weight: '',\n };\n\n // The default width is calculated from the text.\n this.setWidth(Flow.textWidth(text));\n }\n\n getCategory() { return Annotation.CATEGORY; }\n\n // Set font family, size, and weight. E.g., `Arial`, `10pt`, `Bold`.\n setFont(family, size, weight) {\n this.font = { family, size, weight };\n return this;\n }\n\n // Set vertical position of text (above or below stave). `just` must be\n // a value in `Annotation.VerticalJustify`.\n setVerticalJustification(just) {\n this.vert_justification = typeof (just) === 'string'\n ? Annotation.VerticalJustifyString[just]\n : just;\n return this;\n }\n\n // Get and set horizontal justification. `justification` is a value in\n // `Annotation.Justify`.\n getJustification() { return this.justification; }\n setJustification(just) {\n this.justification = typeof (just) === 'string'\n ? Annotation.JustifyString[just]\n : just;\n return this;\n }\n\n // Render text beside the note.\n draw() {\n this.checkContext();\n\n if (!this.note) {\n throw new Vex.RERR(\n 'NoNoteForAnnotation', \"Can't draw text annotation without an attached note.\"\n );\n }\n\n this.setRendered();\n const start = this.note.getModifierStartXY(Modifier.Position.ABOVE,\n this.index);\n\n // We're changing context parameters. Save current state.\n this.context.save();\n this.context.setFont(this.font.family, this.font.size, this.font.weight);\n const text_width = this.context.measureText(this.text).width;\n\n // Estimate text height to be the same as the width of an 'm'.\n //\n // This is a hack to work around the inability to measure text height\n // in HTML5 Canvas (and SVG).\n const text_height = this.context.measureText('m').width;\n let x;\n let y;\n\n if (this.justification === Annotation.Justify.LEFT) {\n x = start.x;\n } else if (this.justification === Annotation.Justify.RIGHT) {\n x = start.x - text_width;\n } else if (this.justification === Annotation.Justify.CENTER) {\n x = start.x - text_width / 2;\n } else /* CENTER_STEM */ {\n x = this.note.getStemX() - text_width / 2;\n }\n\n let stem_ext;\n let spacing;\n const has_stem = this.note.hasStem();\n const stave = this.note.getStave();\n\n // The position of the text varies based on whether or not the note\n // has a stem.\n if (has_stem) {\n stem_ext = this.note.getStem().getExtents();\n spacing = stave.getSpacingBetweenLines();\n }\n\n if (this.vert_justification === Annotation.VerticalJustify.BOTTOM) {\n // HACK: We need to compensate for the text's height since its origin\n // is bottom-right.\n y = stave.getYForBottomText(this.text_line + Flow.TEXT_HEIGHT_OFFSET_HACK);\n if (has_stem) {\n const stem_base = (this.note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY);\n y = Math.max(y, stem_base + (spacing * (this.text_line + 2)));\n }\n } else if (this.vert_justification === Annotation.VerticalJustify.CENTER) {\n const yt = this.note.getYForTopText(this.text_line) - 1;\n const yb = stave.getYForBottomText(this.text_line);\n y = yt + (yb - yt) / 2 + text_height / 2;\n } else if (this.vert_justification === Annotation.VerticalJustify.TOP) {\n y = Math.min(stave.getYForTopText(this.text_line), this.note.getYs()[0] - 10);\n if (has_stem) {\n y = Math.min(y, (stem_ext.topY - 5) - (spacing * this.text_line));\n }\n } else /* CENTER_STEM */ {\n const extents = this.note.getStemExtents();\n y = extents.topY + (extents.baseY - extents.topY) / 2 +\n text_height / 2;\n }\n\n L('Rendering annotation: ', this.text, x, y);\n this.context.fillText(this.text, x, y);\n this.context.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements tablature bends.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\n/**\n @param text Text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n @param release If true, render a release. (DEPRECATED)\n @param phrase If set, ignore \"text\" and \"release\", and use the more\n sophisticated phrase specified.\n\n Example of a phrase:\n\n [{\n type: UP,\n text: \"whole\"\n width: 8;\n },\n {\n type: DOWN,\n text: \"whole\"\n width: 8;\n },\n {\n type: UP,\n text: \"half\"\n width: 8;\n },\n {\n type: UP,\n text: \"whole\"\n width: 8;\n },\n {\n type: DOWN,\n text: \"1 1/2\"\n width: 8;\n }]\n */\nexport class Bend extends Modifier {\n static get CATEGORY() { return 'bends'; }\n\n static get UP() {\n return 0;\n }\n static get DOWN() {\n return 1;\n }\n\n // ## Static Methods\n // Arrange bends in `ModifierContext`\n static format(bends, state) {\n if (!bends || bends.length === 0) return false;\n\n let last_width = 0;\n // Bends are always on top.\n const text_line = state.top_text_line;\n\n // Format Bends\n for (let i = 0; i < bends.length; ++i) {\n const bend = bends[i];\n bend.setXShift(last_width);\n last_width = bend.getWidth();\n bend.setTextLine(text_line);\n }\n\n state.right_shift += last_width;\n state.top_text_line += 1;\n return true;\n }\n\n // ## Prototype Methods\n constructor(text, release, phrase) {\n super();\n this.setAttribute('type', 'Bend');\n\n this.text = text;\n this.x_shift = 0;\n this.release = release || false;\n this.font = '10pt Arial';\n this.render_options = {\n line_width: 1.5,\n line_style: '#777777',\n bend_width: 8,\n release_width: 8,\n };\n\n if (phrase) {\n this.phrase = phrase;\n } else {\n // Backward compatibility\n this.phrase = [{ type: Bend.UP, text: this.text }];\n if (this.release) this.phrase.push({ type: Bend.DOWN, text: '' });\n }\n\n this.updateWidth();\n }\n\n getCategory() { return Bend.CATEGORY; }\n\n setXShift(value) {\n this.x_shift = value;\n this.updateWidth();\n }\n setFont(font) { this.font = font; return this; }\n getText() { return this.text; }\n updateWidth() {\n const that = this;\n\n function measure_text(text) {\n let text_width;\n if (that.context) {\n text_width = that.context.measureText(text).width;\n } else {\n text_width = Flow.textWidth(text);\n }\n\n return text_width;\n }\n\n let total_width = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if ('width' in bend) {\n total_width += bend.width;\n } else {\n const additional_width = (bend.type === Bend.UP) ?\n this.render_options.bend_width : this.render_options.release_width;\n\n bend.width = Vex.Max(additional_width, measure_text(bend.text)) + 3;\n bend.draw_width = bend.width / 2;\n total_width += bend.width;\n }\n }\n\n this.setWidth(total_width + this.x_shift);\n return this;\n }\n draw() {\n this.checkContext();\n if (!(this.note && (this.index != null))) {\n throw new Vex.RERR('NoNoteForBend', \"Can't draw bend without a note or index.\");\n }\n\n this.setRendered();\n\n const start = this.note.getModifierStartXY(Modifier.Position.RIGHT,\n this.index);\n start.x += 3;\n start.y += 0.5;\n const x_shift = this.x_shift;\n\n const ctx = this.context;\n const bend_height = this.note.getStave().getYForTopText(this.text_line) + 3;\n const annotation_y = this.note.getStave().getYForTopText(this.text_line) - 1;\n const that = this;\n\n function renderBend(x, y, width, height) {\n const cp_x = x + width;\n const cp_y = y;\n\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(that.render_options.line_width);\n ctx.setStrokeStyle(that.render_options.line_style);\n ctx.setFillStyle(that.render_options.line_style);\n ctx.moveTo(x, y);\n ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n ctx.stroke();\n ctx.restore();\n }\n\n function renderRelease(x, y, width, height) {\n ctx.save();\n ctx.beginPath();\n ctx.setLineWidth(that.render_options.line_width);\n ctx.setStrokeStyle(that.render_options.line_style);\n ctx.setFillStyle(that.render_options.line_style);\n ctx.moveTo(x, height);\n ctx.quadraticCurveTo(\n x + width, height,\n x + width, y);\n ctx.stroke();\n ctx.restore();\n }\n\n function renderArrowHead(x, y, direction) {\n const width = 4;\n const dir = direction || 1;\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x - width, y + width * dir);\n ctx.lineTo(x + width, y + width * dir);\n ctx.closePath();\n ctx.fill();\n }\n\n function renderText(x, text) {\n ctx.save();\n ctx.setRawFont(that.font);\n const render_x = x - (ctx.measureText(text).width / 2);\n ctx.fillText(text, render_x, annotation_y);\n ctx.restore();\n }\n\n let last_bend = null;\n let last_drawn_width = 0;\n for (let i = 0; i < this.phrase.length; ++i) {\n const bend = this.phrase[i];\n if (i === 0) bend.draw_width += x_shift;\n\n last_drawn_width = bend.draw_width +\n (last_bend ? last_bend.draw_width : 0) -\n (i === 1 ? x_shift : 0);\n if (bend.type === Bend.UP) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderArrowHead(start.x, bend_height);\n }\n\n renderBend(start.x, start.y, last_drawn_width, bend_height);\n }\n\n if (bend.type === Bend.DOWN) {\n if (last_bend && last_bend.type === Bend.UP) {\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n\n if (last_bend && last_bend.type === Bend.DOWN) {\n renderArrowHead(start.x, start.y, -1);\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n\n if (last_bend === null) {\n last_drawn_width = bend.draw_width;\n renderRelease(start.x, start.y, last_drawn_width, bend_height);\n }\n }\n\n renderText(start.x + last_drawn_width, bend.text);\n last_bend = bend;\n last_bend.x = start.x;\n\n start.x += last_drawn_width;\n }\n\n // Final arrowhead and text\n if (last_bend.type === Bend.UP) {\n renderArrowHead(last_bend.x + last_drawn_width, bend_height);\n } else if (last_bend.type === Bend.DOWN) {\n renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements vibratos.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { Bend } from './bend';\n\nexport class Vibrato extends Modifier {\n static get CATEGORY() { return 'vibratos'; }\n\n // ## Static Methods\n // Arrange vibratos inside a `ModifierContext`.\n static format(vibratos, state, context) {\n if (!vibratos || vibratos.length === 0) return false;\n\n // Vibratos are always on top.\n let text_line = state.top_text_line;\n let width = 0;\n let shift = state.right_shift - 7;\n\n // If there's a bend, drop the text line\n const bends = context.getModifiers(Bend.CATEGORY);\n if (bends && bends.length > 0) {\n text_line--;\n }\n\n // Format Vibratos\n for (let i = 0; i < vibratos.length; ++i) {\n const vibrato = vibratos[i];\n vibrato.setXShift(shift);\n vibrato.setTextLine(text_line);\n width += vibrato.getWidth();\n shift += width;\n }\n\n state.right_shift += width;\n state.top_text_line += 1;\n return true;\n }\n\n // ## Prototype Methods\n constructor() {\n super();\n this.setAttribute('type', 'Vibrato');\n\n this.position = Modifier.Position.RIGHT;\n this.render_options = {\n harsh: false,\n vibrato_width: 20,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n\n this.setVibratoWidth(this.render_options.vibrato_width);\n }\n getCategory() { return Vibrato.CATEGORY; }\n setHarsh(harsh) { this.render_options.harsh = harsh; return this; }\n setVibratoWidth(width) {\n this.render_options.vibrato_width = width;\n this.setWidth(width);\n return this;\n }\n\n draw() {\n const ctx = this.checkContext();\n\n if (!this.note) {\n throw new Vex.RERR('NoNoteForVibrato', \"Can't draw vibrato without an attached note.\");\n }\n\n this.setRendered();\n const start = this.note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n\n const vx = start.x + this.x_shift;\n const vy = this.note.getYForTopText(this.text_line) + 2;\n\n Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n }\n\n // Static rendering method that can be called from\n // other classes (e.g. VibratoBracket)\n static renderVibrato(ctx, x, y, opts) {\n const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n const num_waves = vibrato_width / wave_width;\n\n ctx.beginPath();\n\n let i;\n if (harsh) {\n ctx.moveTo(x, y + wave_girth + 1);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x + wave_width, y - (wave_height / 2));\n x += wave_width;\n ctx.lineTo(x + wave_width, y + (wave_height / 2));\n x += wave_width;\n }\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.lineTo(x - wave_width, (y - (wave_height / 2)) + wave_girth + 1);\n x -= wave_width;\n ctx.lineTo(x - wave_width, (y + (wave_height / 2)) + wave_girth + 1);\n x -= wave_width;\n }\n ctx.fill();\n } else {\n ctx.moveTo(x, y + wave_girth);\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(x + (wave_width / 2), y - (wave_height / 2), x + wave_width, y);\n x += wave_width;\n ctx.quadraticCurveTo(x + (wave_width / 2), y + (wave_height / 2), x + wave_width, y);\n x += wave_width;\n }\n\n for (i = 0; i < num_waves / 2; ++i) {\n ctx.quadraticCurveTo(\n x - (wave_width / 2),\n (y + (wave_height / 2)) + wave_girth,\n x - wave_width, y + wave_girth);\n x -= wave_width;\n ctx.quadraticCurveTo(\n x - (wave_width / 2),\n (y - (wave_height / 2)) + wave_girth,\n x - wave_width, y + wave_girth);\n x -= wave_width;\n }\n ctx.fill();\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of modifiers to notes (e.g. bends,\n// fingering positions etc.)\n\nimport { Vex } from './vex';\nimport { StaveNote } from './stavenote';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Accidental } from './accidental';\nimport { NoteSubGroup } from './notesubgroup';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { Stroke } from './strokes';\nimport { StringNumber } from './stringnumber';\nimport { Articulation } from './articulation';\nimport { Ornament } from './ornament';\nimport { Annotation } from './annotation';\nimport { Bend } from './bend';\nimport { Vibrato } from './vibrato';\n\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\nfunction L(...args) { if (ModifierContext.DEBUG) Vex.L('Vex.Flow.ModifierContext', args); }\n\nexport class ModifierContext {\n constructor() {\n // Current modifiers\n this.modifiers = {};\n\n // Formatting data.\n this.preFormatted = false;\n this.postFormatted = false;\n this.width = 0;\n this.spacing = 0;\n this.state = {\n left_shift: 0,\n right_shift: 0,\n text_line: 0,\n top_text_line: 0,\n };\n\n // Add new modifiers to this array. The ordering is significant -- lower\n // modifiers are formatted and rendered before higher ones.\n this.PREFORMAT = [\n StaveNote,\n Dot,\n FretHandFinger,\n Accidental,\n Stroke,\n GraceNoteGroup,\n NoteSubGroup,\n StringNumber,\n Articulation,\n Ornament,\n Annotation,\n Bend,\n Vibrato,\n ];\n\n // If post-formatting is required for an element, add it to this array.\n this.POSTFORMAT = [StaveNote];\n }\n\n addModifier(modifier) {\n const type = modifier.getCategory();\n if (!this.modifiers[type]) this.modifiers[type] = [];\n this.modifiers[type].push(modifier);\n modifier.setModifierContext(this);\n this.preFormatted = false;\n return this;\n }\n\n getModifiers(type) { return this.modifiers[type]; }\n getWidth() { return this.width; }\n getExtraLeftPx() { return this.state.left_shift; }\n getExtraRightPx() { return this.state.right_shift; }\n getState() { return this.state; }\n\n getMetrics() {\n if (!this.formatted) {\n throw new Vex.RERR('UnformattedModifier', 'Unformatted modifier has no metrics.');\n }\n\n return {\n width: this.state.left_shift + this.state.right_shift + this.spacing,\n spacing: this.spacing,\n extra_left_px: this.state.left_shift,\n extra_right_px: this.state.right_shift,\n };\n }\n\n preFormat() {\n if (this.preFormatted) return;\n this.PREFORMAT.forEach((modifier) => {\n L('Preformatting ModifierContext: ', modifier.CATEGORY);\n modifier.format(this.getModifiers(modifier.CATEGORY), this.state, this);\n });\n\n // Update width of this modifier context\n this.width = this.state.left_shift + this.state.right_shift;\n this.preFormatted = true;\n }\n\n postFormat() {\n if (this.postFormatted) return;\n this.POSTFORMAT.forEach((modifier) => {\n L('Postformatting ModifierContext: ', modifier.CATEGORY);\n modifier.postFormat(this.getModifiers(modifier.CATEGORY), this);\n });\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements the formatting and layout algorithms that are used\n// to position notes in a voice. The algorithm can align multiple voices both\n// within a stave, and across multiple staves.\n//\n// To do this, the formatter breaks up voices into a grid of rational-valued\n// `ticks`, to which each note is assigned. Then, minimum widths are assigned\n// to each tick based on the widths of the notes and modifiers in that tick. This\n// establishes the smallest amount of space required for each tick.\n//\n// Finally, the formatter distributes the left over space proportionally to\n// all the ticks, setting the `x` values of the notes in each tick.\n//\n// See `tests/formatter_tests.js` for usage examples. The helper functions included\n// here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n\nimport { Vex } from './vex';\nimport { Beam } from './beam';\nimport { Flow } from './tables';\nimport { Fraction } from './fraction';\nimport { Voice } from './voice';\nimport { StaveConnector } from './staveconnector';\nimport { StaveNote } from './stavenote';\nimport { Note } from './note';\nimport { ModifierContext } from './modifiercontext';\nimport { TickContext } from './tickcontext';\n\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nfunction L(...args) { if (Formatter.DEBUG) Vex.L('Vex.Flow.Formatter', args); }\n\n// Helper function to locate the next non-rest note(s).\nfunction lookAhead(notes, restLine, i, compare) {\n // If no valid next note group, nextRestLine is same as current.\n let nextRestLine = restLine;\n\n // Get the rest line for next valid non-rest note group.\n for (i += 1; i < notes.length; i += 1) {\n const note = notes[i];\n if (!note.isRest() && !note.shouldIgnoreTicks()) {\n nextRestLine = note.getLineForRest();\n break;\n }\n }\n\n // Locate the mid point between two lines.\n if (compare && restLine !== nextRestLine) {\n const top = Math.max(restLine, nextRestLine);\n const bot = Math.min(restLine, nextRestLine);\n nextRestLine = Vex.MidLine(top, bot);\n }\n return nextRestLine;\n}\n\n// Take an array of `voices` and place aligned tickables in the same context. Returns\n// a mapping from `tick` to `ContextType`, a list of `tick`s, and the resolution\n// multiplier.\n//\n// Params:\n// * `voices`: Array of `Voice` instances.\n// * `ContextType`: A context class (e.g., `ModifierContext`, `TickContext`)\n// * `addToContext`: Function to add tickable to context.\nfunction createContexts(voices, ContextType, addToContext) {\n if (!voices || !voices.length) {\n throw new Vex.RERR('BadArgument', 'No voices to format');\n }\n\n // Find out highest common multiple of resolution multipliers.\n // The purpose of this is to find out a common denominator\n // for all fractional tick values in all tickables of all voices,\n // so that the values can be expanded and the numerator used\n // as an integer tick value.\n const totalTicks = voices[0].getTotalTicks();\n const resolutionMultiplier = voices.reduce((resolutionMultiplier, voice) => {\n if (!voice.getTotalTicks().equals(totalTicks)) {\n throw new Vex.RERR(\n 'TickMismatch', 'Voices should have same total note duration in ticks.'\n );\n }\n\n if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n throw new Vex.RERR(\n 'IncompleteVoice', 'Voice does not have enough notes.'\n );\n }\n\n return Math.max(\n resolutionMultiplier,\n Fraction.LCM(resolutionMultiplier, voice.getResolutionMultiplier())\n );\n }, 1);\n\n // Initialize tick maps.\n const tickToContextMap = {};\n const tickList = [];\n const contexts = [];\n\n // For each voice, extract notes and create a context for every\n // new tick that hasn't been seen before.\n voices.forEach(voice => {\n // Use resolution multiplier as denominator to expand ticks\n // to suitable integer values, so that no additional expansion\n // of fractional tick values is needed.\n const ticksUsed = new Fraction(0, resolutionMultiplier);\n\n voice.getTickables().forEach(tickable => {\n const integerTicks = ticksUsed.numerator;\n\n // If we have no tick context for this tick, create one.\n if (!tickToContextMap[integerTicks]) {\n const newContext = new ContextType();\n contexts.push(newContext);\n tickToContextMap[integerTicks] = newContext;\n }\n\n // Add this tickable to the TickContext.\n addToContext(tickable, tickToContextMap[integerTicks]);\n\n // Maintain a sorted list of tick contexts.\n tickList.push(integerTicks);\n ticksUsed.add(tickable.getTicks());\n });\n });\n\n return {\n map: tickToContextMap,\n array: contexts,\n list: Vex.SortAndUnique(tickList, (a, b) => a - b, (a, b) => a === b),\n resolutionMultiplier,\n };\n}\n\nexport class Formatter {\n // Helper function to layout \"notes\" one after the other without\n // regard for proportions. Useful for tests and debugging.\n static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n notes.reduce((x, note) => {\n note.addToModifierContext(new ModifierContext());\n const tick = new TickContext().addTickable(note).preFormat();\n const extra = tick.getExtraPx();\n tick.setX(x + extra.left);\n\n return x + tick.getWidth() + extra.right + paddingBetween;\n }, x);\n }\n\n // Helper function to plot formatter debug info.\n static plotDebugging(ctx, formatter, xPos, y1, y2) {\n const x = xPos + Note.STAVEPADDING;\n const contextGaps = formatter.contextGaps;\n function stroke(x1, x2, color) {\n ctx.beginPath();\n ctx.setStrokeStyle(color);\n ctx.setFillStyle(color);\n ctx.setLineWidth(1);\n ctx.fillRect(x1, y1, x2 - x1, y2 - y1);\n }\n\n ctx.save();\n ctx.setFont('Arial', 8, '');\n\n contextGaps.gaps.forEach(gap => {\n stroke(x + gap.x1, x + gap.x2, '#aaa');\n // Vex.drawDot(ctx, xPos + gap.x1, yPos, 'blue');\n ctx.fillText(Math.round(gap.x2 - gap.x1), x + gap.x1, y2 + 12);\n });\n\n ctx.fillText(Math.round(contextGaps.total) + 'px', x - 20, y2 + 12);\n ctx.setFillStyle('red');\n\n ctx.fillText('Loss: ' +\n formatter.lossHistory.map(loss => Math.round(loss)), x - 20, y2 + 22);\n ctx.restore();\n }\n\n // Helper function to format and draw a single voice. Returns a bounding\n // box for the notation.\n //\n // Parameters:\n // * `ctx` - The rendering context\n // * `stave` - The stave to which to draw (`Stave` or `TabStave`)\n // * `notes` - Array of `Note` instances (`StaveNote`, `TextNote`, `TabNote`, etc.)\n // * `params` - One of below:\n // * Setting `autobeam` only `(context, stave, notes, true)` or\n // `(ctx, stave, notes, {autobeam: true})`\n // * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n // * Setting both a struct is needed `(context, stave, notes, {\n // autobeam: true, align_rests: true})`\n //\n // `autobeam` automatically generates beams for the notes.\n // `align_rests` aligns rests with nearby notes.\n static FormatAndDraw(ctx, stave, notes, params) {\n const options = {\n auto_beam: false,\n align_rests: false,\n };\n\n if (typeof params === 'object') {\n Vex.Merge(options, params);\n } else if (typeof params === 'boolean') {\n options.auto_beam = params;\n }\n\n // Start by creating a voice and adding all the notes to it.\n const voice = new Voice(Flow.TIME4_4)\n .setMode(Voice.Mode.SOFT)\n .addTickables(notes);\n\n // Then create beams, if requested.\n const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n\n // Instantiate a `Formatter` and format the notes.\n new Formatter()\n .joinVoices([voice], { align_rests: options.align_rests })\n .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n\n // Render the voice and beams to the stave.\n voice.setStave(stave).draw(ctx, stave);\n beams.forEach(beam => beam.setContext(ctx).draw());\n\n // Return the bounding box of the voice.\n return voice.getBoundingBox();\n }\n\n // Helper function to format and draw aligned tab and stave notes in two\n // separate staves.\n //\n // Parameters:\n // * `ctx` - The rendering context\n // * `tabstave` - A `TabStave` instance on which to render `TabNote`s.\n // * `stave` - A `Stave` instance on which to render `Note`s.\n // * `notes` - Array of `Note` instances for the stave (`StaveNote`, `BarNote`, etc.)\n // * `tabnotes` - Array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n // * `autobeam` - Automatically generate beams.\n // * `params` - A configuration object:\n // * `autobeam` automatically generates beams for the notes.\n // * `align_rests` aligns rests with nearby notes.\n static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n const opts = {\n auto_beam: autobeam,\n align_rests: false,\n };\n\n if (typeof params === 'object') {\n Vex.Merge(opts, params);\n } else if (typeof params === 'boolean') {\n opts.auto_beam = params;\n }\n\n // Create a `4/4` voice for `notes`.\n const notevoice = new Voice(Flow.TIME4_4)\n .setMode(Voice.Mode.SOFT)\n .addTickables(notes);\n\n // Create a `4/4` voice for `tabnotes`.\n const tabvoice = new Voice(Flow.TIME4_4)\n .setMode(Voice.Mode.SOFT)\n .addTickables(tabnotes);\n\n // Then create beams, if requested.\n const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n\n // Instantiate a `Formatter` and align tab and stave notes.\n new Formatter()\n .joinVoices([notevoice], { align_rests: opts.align_rests })\n .joinVoices([tabvoice])\n .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n\n // Render voices and beams to staves.\n notevoice.draw(ctx, stave);\n tabvoice.draw(ctx, tabstave);\n beams.forEach(beam => beam.setContext(ctx).draw());\n\n // Draw a connector between tab and note staves.\n new StaveConnector(stave, tabstave).setContext(ctx).draw();\n }\n\n // Auto position rests based on previous/next note positions.\n //\n // Params:\n // * `notes`: An array of notes.\n // * `alignAllNotes`: If set to false, only aligns non-beamed notes.\n // * `alignTuplets`: If set to false, ignores tuplets.\n static AlignRestsToNotes(notes, alignAllNotes, alignTuplets) {\n notes.forEach((note, index) => {\n if (note instanceof StaveNote && note.isRest()) {\n if (note.tuplet && !alignTuplets) return;\n\n // If activated rests not on default can be rendered as specified.\n const position = note.getGlyph().position.toUpperCase();\n if (position !== 'R/4' && position !== 'B/4') return;\n\n if (alignAllNotes || note.beam != null) {\n // Align rests with previous/next notes.\n const props = note.getKeyProps()[0];\n if (index === 0) {\n props.line = lookAhead(notes, props.line, index, false);\n note.setKeyLine(0, props.line);\n } else if (index > 0 && index < notes.length) {\n // If previous note is a rest, use its line number.\n let restLine;\n if (notes[index - 1].isRest()) {\n restLine = notes[index - 1].getKeyProps()[0].line;\n props.line = restLine;\n } else {\n restLine = notes[index - 1].getLineForRest();\n // Get the rest line for next valid non-rest note group.\n props.line = lookAhead(notes, restLine, index, true);\n }\n note.setKeyLine(0, props.line);\n }\n }\n }\n });\n\n return this;\n }\n\n constructor() {\n // Minimum width required to render all the notes in the voices.\n this.minTotalWidth = 0;\n\n // This is set to `true` after `minTotalWidth` is calculated.\n this.hasMinTotalWidth = false;\n\n // Total number of ticks in the voice.\n this.totalTicks = new Fraction(0, 1);\n\n // Arrays of tick and modifier contexts.\n this.tickContexts = null;\n this.modiferContexts = null;\n\n // Gaps between contexts, for free movement of notes post\n // formatting.\n this.contextGaps = {\n total: 0,\n gaps: [],\n };\n\n this.voices = [];\n }\n\n // Find all the rests in each of the `voices` and align them\n // to neighboring notes. If `alignAllNotes` is `false`, then only\n // align non-beamed notes.\n alignRests(voices, alignAllNotes) {\n if (!voices || !voices.length) {\n throw new Vex.RERR('BadArgument', 'No voices to format rests');\n }\n\n voices.forEach(voice =>\n Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n }\n\n // Calculate the minimum width required to align and format `voices`.\n preCalculateMinTotalWidth(voices) {\n // Cache results.\n if (this.hasMinTotalWidth) return this.minTotalWidth;\n\n // Create tick contexts if not already created.\n if (!this.tickContexts) {\n if (!voices) {\n throw new Vex.RERR(\n 'BadArgument', \"'voices' required to run preCalculateMinTotalWidth\"\n );\n }\n\n this.createTickContexts(voices);\n }\n\n const { list: contextList, map: contextMap } = this.tickContexts;\n\n // Go through each tick context and calculate total width.\n this.minTotalWidth = contextList\n .map(tick => {\n const context = contextMap[tick];\n context.preFormat();\n return context.getWidth();\n })\n .reduce((a, b) => a + b, 0);\n\n this.hasMinTotalWidth = true;\n\n return this.minTotalWidth;\n }\n\n // Get minimum width required to render all voices. Either `format` or\n // `preCalculateMinTotalWidth` must be called before this method.\n getMinTotalWidth() {\n if (!this.hasMinTotalWidth) {\n throw new Vex.RERR(\n 'NoMinTotalWidth',\n \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\"\n );\n }\n\n return this.minTotalWidth;\n }\n\n // Create `ModifierContext`s for each tick in `voices`.\n createModifierContexts(voices) {\n const contexts = createContexts(\n voices,\n ModifierContext,\n (tickable, context) => tickable.addToModifierContext(context)\n );\n\n this.modiferContexts = contexts;\n return contexts;\n }\n\n // Create `TickContext`s for each tick in `voices`. Also calculate the\n // total number of ticks in voices.\n createTickContexts(voices) {\n const contexts = createContexts(\n voices,\n TickContext,\n (tickable, context) => context.addTickable(tickable)\n );\n\n contexts.array.forEach(context => {\n context.tContexts = contexts.array;\n });\n\n this.totalTicks = voices[0].getTicksUsed().clone();\n this.tickContexts = contexts;\n return contexts;\n }\n\n // This is the core formatter logic. Format voices and justify them\n // to `justifyWidth` pixels. `renderingContext` is required to justify elements\n // that can't retreive widths without a canvas. This method sets the `x` positions\n // of all the tickables/notes in the formatter.\n preFormat(justifyWidth = 0, renderingContext, voices, stave) {\n // Initialize context maps.\n const contexts = this.tickContexts;\n const { list: contextList, map: contextMap, resolutionMultiplier } = contexts;\n\n // If voices and a stave were provided, set the Stave for each voice\n // and preFormat to apply Y values to the notes;\n if (voices && stave) {\n voices.forEach(voice => voice.setStave(stave).preFormat());\n }\n\n // Now distribute the ticks to each tick context, and assign them their\n // own X positions.\n let x = 0;\n let shift = 0;\n const centerX = justifyWidth / 2;\n this.minTotalWidth = 0;\n\n // Pass 1: Give each note maximum width requested by context.\n contextList.forEach((tick) => {\n const context = contextMap[tick];\n if (renderingContext) context.setContext(renderingContext);\n\n // Make sure that all tickables in this context have calculated their\n // space requirements.\n context.preFormat();\n\n const width = context.getWidth();\n this.minTotalWidth += width;\n\n const metrics = context.getMetrics();\n x = x + shift + metrics.extraLeftPx;\n context.setX(x);\n\n // Calculate shift for the next tick.\n shift = width - metrics.extraLeftPx;\n });\n\n this.minTotalWidth = x + shift;\n this.hasMinTotalWidth = true;\n\n // No justification needed. End formatting.\n if (justifyWidth <= 0) return;\n\n // Pass 2: Take leftover width, and distribute it to proportionately to\n // all notes.\n const remainingX = justifyWidth - this.minTotalWidth;\n const leftoverPxPerTick = remainingX / (this.totalTicks.value() * resolutionMultiplier);\n let spaceAccum = 0;\n\n contextList.forEach((tick, index) => {\n const prevTick = contextList[index - 1] || 0;\n const context = contextMap[tick];\n const tickSpace = (tick - prevTick) * leftoverPxPerTick;\n\n spaceAccum += tickSpace;\n context.setX(context.getX() + spaceAccum);\n\n // Move center aligned tickables to middle\n context\n .getCenterAlignedTickables()\n .forEach(tickable => { // eslint-disable-line\n tickable.center_x_shift = centerX - context.getX();\n });\n });\n\n // Just one context. Done formatting.\n if (contextList.length === 1) return;\n\n this.justifyWidth = justifyWidth;\n this.lossHistory = [];\n this.evaluate();\n }\n\n // Calculate the total cost of this formatting decision.\n evaluate() {\n const justifyWidth = this.justifyWidth;\n // Calculate available slack per tick context. This works out how much freedom\n // to move a context has in either direction, without affecting other notes.\n this.contextGaps = { total: 0, gaps: [] };\n this.tickContexts.list.forEach((tick, index) => {\n if (index === 0) return;\n const prevTick = this.tickContexts.list[index - 1];\n const prevContext = this.tickContexts.map[prevTick];\n const context = this.tickContexts.map[tick];\n const prevMetrics = prevContext.getMetrics();\n\n const insideRightEdge = prevContext.getX() + prevMetrics.width;\n const insideLeftEdge = context.getX();\n const gap = insideLeftEdge - insideRightEdge;\n this.contextGaps.total += gap;\n this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n\n // Tell the tick contexts how much they can reposition themselves.\n context.getFormatterMetrics().freedom.left = gap;\n prevContext.getFormatterMetrics().freedom.right = gap;\n });\n\n // Calculate mean distance in each voice for each duration type, then calculate\n // how far each note is from the mean.\n const durationStats = this.durationStats = {};\n\n function updateStats(duration, space) {\n const stats = durationStats[duration];\n if (stats === undefined) {\n durationStats[duration] = { mean: space, count: 1 };\n } else {\n stats.count += 1;\n stats.mean = (stats.mean + space) / 2;\n }\n }\n\n this.voices.forEach(voice => {\n voice.getTickables().forEach((note, i, notes) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getMetrics();\n const formatterMetrics = note.getFormatterMetrics();\n const leftNoteEdge = note.getX() + metrics.noteWidth +\n metrics.modRightPx + metrics.extraRightPx;\n let space = 0;\n\n if (i < (notes.length - 1)) {\n const rightNote = notes[i + 1];\n const rightMetrics = rightNote.getMetrics();\n const rightNoteEdge = rightNote.getX() -\n rightMetrics.modLeftPx - rightMetrics.extraLeftPx;\n\n space = rightNoteEdge - leftNoteEdge;\n formatterMetrics.space.used = rightNote.getX() - note.getX();\n rightNote.getFormatterMetrics().freedom.left = space;\n } else {\n space = justifyWidth - leftNoteEdge;\n formatterMetrics.space.used = justifyWidth - note.getX();\n }\n\n formatterMetrics.freedom.right = space;\n updateStats(duration, formatterMetrics.space.used);\n });\n });\n\n // Calculate how much each note deviates from the mean. Loss function is square\n // root of the sum of squared deviations.\n let totalDeviation = 0;\n this.voices.forEach(voice => {\n voice.getTickables().forEach((note) => {\n const duration = note.getTicks().clone().simplify().toString();\n const metrics = note.getFormatterMetrics();\n metrics.iterations += 1;\n metrics.space.deviation = metrics.space.used - durationStats[duration].mean;\n metrics.duration = duration;\n metrics.space.mean = durationStats[duration].mean;\n\n totalDeviation += Math.pow(durationStats[duration].mean, 2);\n });\n });\n\n this.totalCost = Math.sqrt(totalDeviation);\n this.lossHistory.push(this.totalCost);\n return this;\n }\n\n // Run a single iteration of rejustification. At a high level, this method calculates\n // the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n // attempt to reduce the cost. You can call this method multiple times until it finds\n // and oscillates around a global minimum.\n tune() {\n const sum = (means) => means.reduce((a, b) => a + b);\n\n // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n // on adjacent tickcontexts.\n function move(current, prev, next, shift) {\n current.setX(current.getX() + shift);\n current.getFormatterMetrics().freedom.left += shift;\n current.getFormatterMetrics().freedom.right -= shift;\n\n if (prev) prev.getFormatterMetrics().freedom.right += shift;\n if (next) next.getFormatterMetrics().freedom.left -= shift;\n }\n\n let shift = 0;\n this.tickContexts.list.forEach((tick, index, list) => {\n const context = this.tickContexts.map[tick];\n const prevContext = (index > 0) ? this.tickContexts.map[list[index - 1]] : null;\n const nextContext = (index < list.length - 1) ? this.tickContexts.map[list[index + 1]] : null;\n\n move(context, prevContext, nextContext, shift);\n\n const cost = -sum(\n context.getTickables().map(t => t.getFormatterMetrics().space.deviation));\n\n if (cost > 0) {\n shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n } else if (cost < 0) {\n if (nextContext) {\n shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n } else {\n shift = 0;\n }\n }\n\n const minShift = Math.min(5, Math.abs(shift));\n shift = shift > 0 ? minShift : -minShift;\n });\n\n return this.evaluate();\n }\n\n // This is the top-level call for all formatting logic completed\n // after `x` *and* `y` values have been computed for the notes\n // in the voices.\n postFormat() {\n const postFormatContexts = (contexts) =>\n contexts.list.forEach(tick => contexts.map[tick].postFormat());\n\n postFormatContexts(this.modiferContexts);\n postFormatContexts(this.tickContexts);\n\n return this;\n }\n\n // Take all `voices` and create `ModifierContext`s out of them. This tells\n // the formatters that the voices belong on a single stave.\n joinVoices(voices) {\n this.createModifierContexts(voices);\n this.hasMinTotalWidth = false;\n return this;\n }\n\n // Align rests in voices, justify the contexts, and position the notes\n // so voices are aligned and ready to render onto the stave. This method\n // mutates the `x` positions of all tickables in `voices`.\n //\n // Voices are full justified to fit in `justifyWidth` pixels.\n //\n // Set `options.context` to the rendering context. Set `options.align_rests`\n // to true to enable rest alignment.\n format(voices, justifyWidth, options) {\n const opts = {\n align_rests: false,\n context: null,\n stave: null,\n };\n\n Vex.Merge(opts, options);\n this.voices = voices;\n this.alignRests(voices, opts.align_rests);\n this.createTickContexts(voices);\n this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n\n // Only postFormat if a stave was supplied for y value formatting\n if (opts.stave) this.postFormat();\n\n return this;\n }\n\n // This method is just like `format` except that the `justifyWidth` is inferred\n // from the `stave`.\n formatToStave(voices, stave, options) {\n const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - 10;\n L('Formatting voices to width: ', justifyWidth);\n const opts = { context: stave.getContext() };\n Vex.Merge(opts, options);\n return this.format(voices, justifyWidth, opts);\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\n\nimport { Element } from './element';\n\nexport class StaveModifier extends Element {\n static get Position() {\n return {\n LEFT: 1,\n RIGHT: 2,\n ABOVE: 3,\n BELOW: 4,\n BEGIN: 5,\n END: 6,\n };\n }\n\n constructor() {\n super();\n this.setAttribute('type', 'StaveModifier');\n\n this.padding = 10;\n this.position = StaveModifier.Position.ABOVE;\n this.layoutMetrics = null;\n }\n\n getPosition() { return this.position; }\n setPosition(position) { this.position = position; return this; }\n getStave() { return this.stave; }\n setStave(stave) { this.stave = stave; return this; }\n getWidth() { return this.width; }\n setWidth(width) { this.width = width; return this; }\n getX() { return this.x; }\n setX(x) { this.x = x; return this; }\n getCategory() { return ''; }\n makeSpacer(padding) {\n // TODO(0xfe): Return an instance of type `Spacer` based on `GhostNote`\n // instead of this hack.\n\n return {\n getContext() { return true; },\n setStave() {},\n renderToStave() {},\n getMetrics() {\n return { width: padding };\n },\n };\n }\n placeGlyphOnLine(glyph, stave, line) {\n glyph.setYShift(stave.getYForLine(line) - stave.getYForGlyphs());\n }\n getPadding(index) {\n return (index !== undefined && index < 2 ? 0 : this.padding);\n }\n setPadding(padding) { this.padding = padding; return this; }\n setLayoutMetrics(layoutMetrics) {\n this.layoutMetrics = layoutMetrics;\n return this;\n }\n getLayoutMetrics() {\n return this.layoutMetrics;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\n\nimport { Flow } from './tables';\nimport { StaveModifier } from './stavemodifier';\n\nexport class Barline extends StaveModifier {\n static get CATEGORY() { return 'barlines'; }\n static get type() {\n return {\n SINGLE: 1,\n DOUBLE: 2,\n END: 3,\n REPEAT_BEGIN: 4,\n REPEAT_END: 5,\n REPEAT_BOTH: 6,\n NONE: 7,\n };\n }\n\n static get typeString() {\n return {\n single: Barline.type.SINGLE,\n double: Barline.type.DOUBLE,\n end: Barline.type.END,\n repeatBegin: Barline.type.REPEAT_BEGIN,\n repeatEnd: Barline.type.REPEAT_END,\n repeatBoth: Barline.type.REPEAT_BOTH,\n none: Barline.type.NONE,\n };\n }\n\n /**\n * @constructor\n */\n constructor(type) {\n super();\n this.setAttribute('type', 'Barline');\n this.thickness = Flow.STAVE_LINE_THICKNESS;\n\n const TYPE = Barline.type;\n this.widths = {};\n this.widths[TYPE.SINGLE] = 5;\n this.widths[TYPE.DOUBLE] = 5;\n this.widths[TYPE.END] = 5;\n this.widths[TYPE.REPEAT_BEGIN] = 5;\n this.widths[TYPE.REPEAT_END] = 5;\n this.widths[TYPE.REPEAT_BOTH] = 5;\n this.widths[TYPE.NONE] = 5;\n\n this.paddings = {};\n this.paddings[TYPE.SINGLE] = 0;\n this.paddings[TYPE.DOUBLE] = 0;\n this.paddings[TYPE.END] = 0;\n this.paddings[TYPE.REPEAT_BEGIN] = 15;\n this.paddings[TYPE.REPEAT_END] = 15;\n this.paddings[TYPE.REPEAT_BOTH] = 15;\n this.paddings[TYPE.NONE] = 0;\n\n this.layoutMetricsMap = {};\n this.layoutMetricsMap[TYPE.SINGLE] = {\n xMin: 0,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.DOUBLE] = {\n xMin: -3,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.END] = {\n xMin: -5,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_END] = {\n xMin: -10,\n xMax: 1,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n xMin: -2,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n xMin: -10,\n xMax: 10,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.layoutMetricsMap[TYPE.NONE] = {\n xMin: 0,\n xMax: 0,\n paddingLeft: 5,\n paddingRight: 5,\n };\n this.setPosition(StaveModifier.Position.BEGIN);\n this.setType(type);\n }\n getCategory() { return Barline.CATEGORY; }\n getType() { return this.type; }\n setType(type) {\n this.type = typeof(type) === 'string'\n ? Barline.typeString[type]\n : type;\n\n this.setWidth(this.widths[this.type]);\n this.setPadding(this.paddings[this.type]);\n this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n return this;\n }\n\n // Draw barlines\n draw(stave) {\n stave.checkContext();\n this.setRendered();\n\n switch (this.type) {\n case Barline.type.SINGLE:\n this.drawVerticalBar(stave, this.x, false);\n break;\n case Barline.type.DOUBLE:\n this.drawVerticalBar(stave, this.x, true);\n break;\n case Barline.type.END:\n this.drawVerticalEndBar(stave, this.x);\n break;\n case Barline.type.REPEAT_BEGIN:\n // If the barline is shifted over (in front of clef/time/key)\n // Draw vertical bar at the beginning.\n this.drawRepeatBar(stave, this.x, true);\n if (stave.getX() !== this.x) {\n this.drawVerticalBar(stave, stave.getX());\n }\n\n break;\n case Barline.type.REPEAT_END:\n this.drawRepeatBar(stave, this.x, false);\n break;\n case Barline.type.REPEAT_BOTH:\n this.drawRepeatBar(stave, this.x, false);\n this.drawRepeatBar(stave, this.x, true);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n }\n\n drawVerticalBar(stave, x, double_bar) {\n stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n if (double_bar) {\n stave.context.fillRect(x - 3, topY, 1, botY - topY);\n }\n stave.context.fillRect(x, topY, 1, botY - topY);\n }\n\n drawVerticalEndBar(stave, x) {\n stave.checkContext();\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n stave.context.fillRect(x - 5, topY, 1, botY - topY);\n stave.context.fillRect(x - 2, topY, 3, botY - topY);\n }\n\n drawRepeatBar(stave, x, begin) {\n stave.checkContext();\n\n const topY = stave.getTopLineTopY();\n const botY = stave.getBottomLineBottomY();\n let x_shift = 3;\n\n if (!begin) {\n x_shift = -5;\n }\n\n stave.context.fillRect(x + x_shift, topY, 1, botY - topY);\n stave.context.fillRect(x - 2, topY, 3, botY - topY);\n\n const dot_radius = 2;\n\n // Shift dots left or right\n if (begin) {\n x_shift += 4;\n } else {\n x_shift -= 4;\n }\n\n const dot_x = (x + x_shift) + (dot_radius / 2);\n\n // calculate the y offset based on number of stave lines\n let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n y_offset = (y_offset / 2) - (stave.getSpacingBetweenLines() / 2);\n let dot_y = topY + y_offset + (dot_radius / 2);\n\n // draw the top repeat dot\n stave.context.beginPath();\n stave.context.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n stave.context.fill();\n\n // draw the bottom repeat dot\n dot_y += stave.getSpacingBetweenLines();\n stave.context.beginPath();\n stave.context.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n stave.context.fill();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\n\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\nexport class Repetition extends StaveModifier {\n static get CATEGORY() { return 'repetitions'; }\n static get type() {\n return {\n NONE: 1, // no coda or segno\n CODA_LEFT: 2, // coda at beginning of stave\n CODA_RIGHT: 3, // coda at end of stave\n SEGNO_LEFT: 4, // segno at beginning of stave\n SEGNO_RIGHT: 5, // segno at end of stave\n DC: 6, // D.C. at end of stave\n DC_AL_CODA: 7, // D.C. al coda at end of stave\n DC_AL_FINE: 8, // D.C. al Fine end of stave\n DS: 9, // D.S. at end of stave\n DS_AL_CODA: 10, // D.S. al coda at end of stave\n DS_AL_FINE: 11, // D.S. al Fine at end of stave\n FINE: 12, // Fine at end of stave\n };\n }\n\n constructor(type, x, y_shift) {\n super();\n this.setAttribute('type', 'Repetition');\n\n this.symbol_type = type;\n this.x = x;\n this.x_shift = 0;\n this.y_shift = y_shift;\n this.font = {\n family: 'times',\n size: 12,\n weight: 'bold italic',\n };\n }\n\n getCategory() { return Repetition.CATEGORY; }\n setShiftX(x) { this.x_shift = x; return this; }\n setShiftY(y) { this.y_shift = y; return this; }\n\n draw(stave, x) {\n this.setRendered();\n\n switch (this.symbol_type) {\n case Repetition.type.CODA_RIGHT:\n this.drawCodaFixed(stave, x + stave.width);\n break;\n case Repetition.type.CODA_LEFT:\n this.drawSymbolText(stave, x, 'Coda', true);\n break;\n case Repetition.type.SEGNO_LEFT:\n this.drawSignoFixed(stave, x);\n break;\n case Repetition.type.SEGNO_RIGHT:\n this.drawSignoFixed(stave, x + stave.width);\n break;\n case Repetition.type.DC:\n this.drawSymbolText(stave, x, 'D.C.', false);\n break;\n case Repetition.type.DC_AL_CODA:\n this.drawSymbolText(stave, x, 'D.C. al', true);\n break;\n case Repetition.type.DC_AL_FINE:\n this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n break;\n case Repetition.type.DS:\n this.drawSymbolText(stave, x, 'D.S.', false);\n break;\n case Repetition.type.DS_AL_CODA:\n this.drawSymbolText(stave, x, 'D.S. al', true);\n break;\n case Repetition.type.DS_AL_FINE:\n this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n break;\n case Repetition.type.FINE:\n this.drawSymbolText(stave, x, 'Fine', false);\n break;\n default:\n break;\n }\n\n return this;\n }\n\n drawCodaFixed(stave, x) {\n const y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n Glyph.renderGlyph(stave.context, this.x + x + this.x_shift, y + 25, 40, 'v4d', true);\n return this;\n }\n\n drawSignoFixed(stave, x) {\n const y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n Glyph.renderGlyph(stave.context, this.x + x + this.x_shift, y + 25, 30, 'v8c', true);\n return this;\n }\n\n drawSymbolText(stave, x, text, draw_coda) {\n const ctx = stave.checkContext();\n\n ctx.save();\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n // Default to right symbol\n let text_x = 0 + this.x_shift;\n let symbol_x = x + this.x_shift;\n if (this.symbol_type === Repetition.type.CODA_LEFT) {\n // Offset Coda text to right of stave beginning\n text_x = this.x + stave.options.vertical_bar_width;\n symbol_x = text_x + ctx.measureText(text).width + 12;\n } else {\n // Offset Signo text to left stave end\n symbol_x = this.x + x + stave.width - 5 + this.x_shift;\n text_x = symbol_x - + ctx.measureText(text).width - 12;\n }\n\n const y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n if (draw_coda) {\n Glyph.renderGlyph(ctx, symbol_x, y, 40, 'v4d', true);\n }\n\n ctx.fillText(text, text_x, y + 5);\n ctx.restore();\n\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\n\nimport { StaveModifier } from './stavemodifier';\n\nexport class StaveSection extends StaveModifier {\n static get CATEGORY() { return 'stavesection'; }\n\n constructor(section, x, shift_y) {\n super();\n this.setAttribute('type', 'StaveSection');\n\n this.setWidth(16);\n this.section = section;\n this.x = x;\n this.shift_x = 0;\n this.shift_y = shift_y;\n this.font = {\n family: 'sans-serif',\n size: 12,\n weight: 'bold',\n };\n }\n\n getCategory() { return StaveSection.CATEGORY; }\n setStaveSection(section) { this.section = section; return this; }\n setShiftX(x) { this.shift_x = x; return this; }\n setShiftY(y) { this.shift_y = y; return this; }\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n\n ctx.save();\n ctx.lineWidth = 2;\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n const text_width = ctx.measureText('' + this.section).width;\n let width = text_width + 6; // add left & right padding\n if (width < 18) width = 18;\n const height = 20;\n // Seems to be a good default y\n const y = stave.getYForTopText(3) + this.shift_y;\n let x = this.x + shift_x;\n ctx.beginPath();\n ctx.lineWidth = 2;\n ctx.rect(x, y, width, height);\n ctx.stroke();\n x += (width - text_width) / 2;\n ctx.fillText('' + this.section, x, y + 16);\n ctx.restore();\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\n\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\nexport class StaveTempo extends StaveModifier {\n static get CATEGORY() { return 'stavetempo'; }\n\n constructor(tempo, x, shift_y) {\n super();\n this.setAttribute('type', 'StaveTempo');\n\n this.tempo = tempo;\n this.position = Modifier.Position.ABOVE;\n this.x = x;\n this.shift_x = 10;\n this.shift_y = shift_y;\n this.font = {\n family: 'times',\n size: 14,\n weight: 'bold',\n };\n this.render_options = {\n glyph_font_scale: 30, // font size for note\n };\n }\n getCategory() { return StaveTempo.CATEGORY; }\n setTempo(tempo) { this.tempo = tempo; return this; }\n setShiftX(x) { this.shift_x = x; return this; }\n setShiftY(y) { this.shift_y = y; return this; }\n\n draw(stave, shift_x) {\n const ctx = stave.checkContext();\n this.setRendered();\n\n const options = this.render_options;\n // FIXME: What does the '38' mean? Why 38? Is that supposed to\n // be the default font size for standard notation?\n const scale = options.glyph_font_scale / 38;\n const name = this.tempo.name;\n const duration = this.tempo.duration;\n const dots = this.tempo.dots;\n const bpm = this.tempo.bpm;\n const font = this.font;\n let x = this.x + this.shift_x + shift_x;\n const y = stave.getYForTopText(1) + this.shift_y;\n\n ctx.save();\n\n if (name) {\n ctx.setFont(font.family, font.size, font.weight);\n ctx.fillText(name, x, y);\n x += ctx.measureText(name).width;\n }\n\n if (duration && bpm) {\n ctx.setFont(font.family, font.size, 'normal');\n\n if (name) {\n x += ctx.measureText(' ').width;\n ctx.fillText('(', x, y);\n x += ctx.measureText('(').width;\n }\n\n const code = Flow.getGlyphProps(duration);\n\n x += 3 * scale;\n Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n x += code.getWidth() * scale;\n\n // Draw stem and flags\n if (code.stem) {\n let stem_height = 30;\n\n if (code.beam_count) stem_height += 3 * (code.beam_count - 1);\n\n stem_height *= scale;\n\n const y_top = y - stem_height;\n ctx.fillRect(x - scale, y_top, scale, stem_height);\n\n if (code.flag) {\n Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem);\n\n if (!dots) x += 6 * scale;\n }\n }\n\n // Draw dot\n for (let i = 0; i < dots; i++) {\n x += 6 * scale;\n ctx.beginPath();\n ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n ctx.fill();\n }\n\n ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n }\n\n ctx.restore();\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `TextNote` is a notation element that is positioned in time. Generally\n// meant for objects that sit above/below the staff and inline with each other.\n// Examples of this would be such as dynamics, lyrics, chord changes, etc.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Note } from './note';\nimport { Glyph } from './glyph';\n\nexport class TextNote extends Note {\n static get Justification() {\n return {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n };\n }\n\n // Glyph data\n static get GLYPHS() {\n return {\n 'segno': {\n code: 'v8c',\n point: 40,\n x_shift: 0,\n y_shift: -10,\n // width: 10 // optional\n },\n 'tr': {\n code: 'v1f',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 'mordent_upper': {\n code: 'v1e',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 'mordent_lower': {\n code: 'v45',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 'f': {\n code: 'vba',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 'p': {\n code: 'vbf',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 'm': {\n code: 'v62',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 's': {\n code: 'v4a',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 'z': {\n code: 'v80',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n 'coda': {\n code: 'v4d',\n point: 40,\n x_shift: 0,\n y_shift: -8,\n // width: 10 // optional\n },\n 'pedal_open': {\n code: 'v36',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n },\n 'pedal_close': {\n code: 'v5d',\n point: 40,\n x_shift: 0,\n y_shift: 3,\n },\n 'caesura_straight': {\n code: 'v34',\n point: 40,\n x_shift: 0,\n y_shift: 2,\n },\n 'caesura_curved': {\n code: 'v4b',\n point: 40,\n x_shift: 0,\n y_shift: 2,\n },\n 'breath': {\n code: 'v6c',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n },\n 'tick': {\n code: 'v6f',\n point: 50,\n x_shift: 0,\n y_shift: 0,\n },\n 'turn': {\n code: 'v72',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n },\n 'turn_inverted': {\n code: 'v33',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n },\n\n // DEPRECATED - please use \"mordent_upper\" or \"mordent_lower\"\n 'mordent': {\n code: 'v1e',\n point: 40,\n x_shift: 0,\n y_shift: 0,\n // width: 10 // optional\n },\n };\n }\n\n constructor(text_struct) {\n super(text_struct);\n this.setAttribute('type', 'TextNote');\n\n // Note properties\n this.text = text_struct.text;\n this.superscript = text_struct.superscript;\n this.subscript = text_struct.subscript;\n this.glyph_type = text_struct.glyph;\n this.glyph = null;\n this.font = {\n family: 'Arial',\n size: 12,\n weight: '',\n };\n\n // Set font\n if (text_struct.font) this.font = text_struct.font;\n\n // Determine and set initial note width. Note that the text width is\n // an approximation and isn't very accurate. The only way to accurately\n // measure the length of text is with `canvasmeasureText()`\n if (this.glyph_type) {\n const struct = TextNote.GLYPHS[this.glyph_type];\n if (!struct) throw new Vex.RERR('Invalid glyph type: ' + this.glyph_type);\n\n this.glyph = new Glyph(struct.code, struct.point, { cache: false });\n\n if (struct.width) {\n this.setWidth(struct.width);\n } else {\n this.setWidth(this.glyph.getMetrics().width);\n }\n\n this.glyph_struct = struct;\n } else {\n this.setWidth(Flow.textWidth(this.text));\n }\n this.line = text_struct.line || 0;\n this.smooth = text_struct.smooth || false;\n this.ignore_ticks = text_struct.ignore_ticks || false;\n this.justification = TextNote.Justification.LEFT;\n }\n\n // Set the horizontal justification of the TextNote\n setJustification(just) {\n this.justification = just;\n return this;\n }\n\n // Set the Stave line on which the note should be placed\n setLine(line) {\n this.line = line;\n return this;\n }\n\n // Pre-render formatting\n preFormat() {\n this.checkContext();\n\n if (this.preFormatted) return;\n\n if (this.smooth) {\n this.setWidth(0);\n } else {\n if (this.glyph) {\n // Width already set.\n } else {\n this.setWidth(this.context.measureText(this.text).width);\n }\n }\n\n if (this.justification === TextNote.Justification.CENTER) {\n this.extraLeftPx = this.width / 2;\n } else if (this.justification === TextNote.Justification.RIGHT) {\n this.extraLeftPx = this.width;\n }\n\n this.setPreFormatted(true);\n }\n\n // Renders the TextNote\n draw() {\n this.checkContext();\n\n if (!this.stave) {\n throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n }\n\n this.setRendered();\n const ctx = this.context;\n let x = this.getAbsoluteX();\n if (this.justification === TextNote.Justification.CENTER) {\n x -= this.getWidth() / 2;\n } else if (this.justification === TextNote.Justification.RIGHT) {\n x -= this.getWidth();\n }\n\n let y;\n if (this.glyph) {\n y = this.stave.getYForLine(this.line + -3);\n this.glyph.render(\n this.context,\n x + this.glyph_struct.x_shift,\n y + this.glyph_struct.y_shift\n );\n } else {\n y = this.stave.getYForLine(this.line + -3);\n this.applyStyle(ctx);\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n ctx.fillText(this.text, x, y);\n\n // Width of the letter M gives us the approximate height of the text\n const height = ctx.measureText('M').width;\n // Get accurate width of text\n const width = ctx.measureText(this.text).width;\n\n // Write superscript\n if (this.superscript) {\n ctx.setFont(this.font.family, this.font.size / 1.3, this.font.weight);\n ctx.fillText(this.superscript, x + width + 2, y - (height / 2.2));\n }\n\n // Write subscript\n if (this.subscript) {\n ctx.setFont(this.font.family, this.font.size / 1.3, this.font.weight);\n ctx.fillText(this.subscript, x + width + 2, y + (height / 2.2) - 1);\n }\n\n this.restoreStyle(ctx);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n\nimport { Vex } from './vex';\nimport { StaveModifier } from './stavemodifier';\nimport { TextNote } from './textnote';\n\nexport class StaveText extends StaveModifier {\n static get CATEGORY() { return 'stavetext'; }\n\n constructor(text, position, options) {\n super();\n this.setAttribute('type', 'StaveText');\n\n this.setWidth(16);\n this.text = text;\n this.position = position;\n this.options = {\n shift_x: 0,\n shift_y: 0,\n justification: TextNote.Justification.CENTER,\n };\n Vex.Merge(this.options, options);\n\n this.font = {\n family: 'times',\n size: 16,\n weight: 'normal',\n };\n }\n\n getCategory() { return StaveText.CATEGORY; }\n setStaveText(text) { this.text = text; return this; }\n setShiftX(x) { this.shift_x = x; return this; }\n setShiftY(y) { this.shift_y = y; return this; }\n\n setFont(font) {\n Vex.Merge(this.font, font);\n }\n\n setText(text) {\n this.text = text;\n }\n\n draw(stave) {\n const ctx = stave.checkContext();\n this.setRendered();\n\n ctx.save();\n ctx.lineWidth = 2;\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n const text_width = ctx.measureText('' + this.text).width;\n\n let x;\n let y;\n const Position = StaveModifier.Position;\n const Justification = TextNote.Justification;\n switch (this.position) {\n case Position.LEFT:\n case Position.RIGHT:\n y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n if (this.position === Position.LEFT) {\n x = stave.getX() - text_width - 24 + this.options.shift_x;\n } else {\n x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n }\n break;\n case Position.ABOVE:\n case Position.BELOW:\n x = stave.getX() + this.options.shift_x;\n if (this.options.justification === Justification.CENTER) {\n x += stave.getWidth() / 2 - text_width / 2;\n } else if (this.options.justification === Justification.RIGHT) {\n x += stave.getWidth() - text_width;\n }\n\n if (this.position === Position.ABOVE) {\n y = stave.getYForTopText(2) + this.options.shift_y;\n } else {\n y = stave.getYForBottomText(2) + this.options.shift_y;\n }\n break;\n default:\n throw new Vex.RERR('InvalidPosition', 'Value Must be in Modifier.Position.');\n }\n\n ctx.fillText('' + this.text, x, y + 4);\n ctx.restore();\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n//\n// ## Description\n//\n// This file implements various types of clefs that can be rendered on a stave.\n//\n// See `tests/clef_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`.\nfunction L(...args) { if (Clef.DEBUG) Vex.L('Vex.Flow.Clef', args); }\n\nexport class Clef extends StaveModifier {\n static get CATEGORY() { return 'clefs'; }\n\n // Every clef name is associated with a glyph code from the font file\n // and a default stave line number.\n static get types() {\n return {\n 'treble': {\n code: 'v83',\n line: 3,\n },\n 'bass': {\n code: 'v79',\n line: 1,\n },\n 'alto': {\n code: 'vad',\n line: 2,\n },\n 'tenor': {\n code: 'vad',\n line: 1,\n },\n 'percussion': {\n code: 'v59',\n line: 2,\n },\n 'soprano': {\n code: 'vad',\n line: 4,\n },\n 'mezzo-soprano': {\n code: 'vad',\n line: 3,\n },\n 'baritone-c': {\n code: 'vad',\n line: 0,\n },\n 'baritone-f': {\n code: 'v79',\n line: 2,\n },\n 'subbass': {\n code: 'v79',\n line: 0,\n },\n 'french': {\n code: 'v83',\n line: 4,\n },\n 'tab': {\n code: 'v2f',\n },\n };\n }\n\n // Sizes affect the point-size of the clef.\n static get sizes() {\n return {\n 'default': {\n point: 40,\n width: 26\n },\n 'small': {\n point: 32,\n width: 20,\n },\n };\n }\n\n // Annotations attach to clefs -- such as \"8\" for octave up or down.\n static get annotations() {\n return {\n '8va': {\n code: 'v8',\n sizes: {\n 'default': {\n point: 20,\n attachments: {\n 'treble': {\n line: -1.2,\n x_shift: 11,\n },\n },\n },\n 'small': {\n point: 18,\n attachments: {\n 'treble': {\n line: -0.4,\n x_shift: 8,\n },\n },\n },\n },\n },\n '8vb': {\n code: 'v8',\n sizes: {\n 'default': {\n point: 20,\n attachments: {\n 'treble': {\n line: 6.3,\n x_shift: 10,\n },\n 'bass': {\n line: 4,\n x_shift: 1,\n },\n },\n },\n 'small': {\n point: 18,\n attachments: {\n 'treble': {\n line: 5.8,\n x_shift: 6,\n },\n 'bass': {\n line: 3.5,\n x_shift: 0.5,\n },\n },\n },\n },\n },\n };\n }\n\n // Create a new clef. The parameter `clef` must be a key from\n // `Clef.types`.\n constructor(type, size, annotation) {\n super();\n this.setAttribute('type', 'Clef');\n\n this.setPosition(StaveModifier.Position.BEGIN);\n this.setType(type, size, annotation);\n this.setWidth(Clef.sizes[this.size].width);\n L('Creating clef:', type);\n }\n\n getCategory() { return Clef.CATEGORY; }\n\n setType(type, size, annotation) {\n this.type = type;\n this.clef = Clef.types[type];\n if (size === undefined) {\n this.size = 'default';\n } else {\n this.size = size;\n }\n this.clef.point = Clef.sizes[this.size].point;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n\n // If an annotation, such as 8va, is specified, add it to the Clef object.\n if (annotation !== undefined) {\n const anno_dict = Clef.annotations[annotation];\n this.annotation = {\n code: anno_dict.code,\n point: anno_dict.sizes[this.size].point,\n line: anno_dict.sizes[this.size].attachments[this.type].line,\n x_shift: anno_dict.sizes[this.size].attachments[this.type].x_shift,\n };\n\n this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n this.attachment.metrics.x_max = 0;\n this.attachment.setXShift(this.annotation.x_shift);\n } else {\n this.annotation = undefined;\n }\n\n return this;\n }\n\n getWidth() {\n if (this.type === 'tab' && !this.stave) {\n throw new Vex.RERR('ClefError', \"Can't get width without stave.\");\n }\n\n return this.width;\n }\n\n setStave(stave) {\n this.stave = stave;\n\n if (this.type !== 'tab') return this;\n\n let glyphScale;\n let glyphOffset;\n const numLines = this.stave.getOptions().num_lines;\n switch (numLines) {\n case 8:\n glyphScale = 55;\n glyphOffset = 14;\n break;\n case 7:\n glyphScale = 47;\n glyphOffset = 8;\n break;\n case 6:\n glyphScale = 40;\n glyphOffset = 1;\n break;\n case 5:\n glyphScale = 30;\n glyphOffset = -6;\n break;\n case 4:\n glyphScale = 23;\n glyphOffset = -12;\n break;\n default:\n throw new Vex.RERR('ClefError', `Invalid number of lines: ${numLines}`);\n }\n\n this.glyph.setPoint(glyphScale);\n this.glyph.setYShift(glyphOffset);\n\n return this;\n }\n\n draw() {\n if (!this.x) throw new Vex.RERR('ClefError', \"Can't draw clef without x.\");\n if (!this.stave) throw new Vex.RERR('ClefError', \"Can't draw clef without stave.\");\n this.setRendered();\n\n this.glyph.setStave(this.stave);\n this.glyph.setContext(this.stave.context);\n if (this.clef.line !== undefined) {\n this.placeGlyphOnLine(this.glyph, this.stave, this.clef.line);\n }\n\n this.glyph.renderToStave(this.x);\n\n if (this.annotation !== undefined) {\n this.placeGlyphOnLine(this.attachment, this.stave, this.annotation.line);\n this.attachment.setStave(this.stave);\n this.attachment.setContext(this.stave.context);\n this.attachment.renderToStave(this.x);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\nexport class KeySignature extends StaveModifier {\n static get CATEGORY() { return 'keysignatures'; }\n\n // Space between natural and following accidental depending\n // on vertical position\n static get accidentalSpacing() {\n return {\n '#': {\n above: 6,\n below: 4,\n },\n 'b': {\n above: 4,\n below: 7,\n },\n 'n': {\n above: 4,\n below: 1,\n },\n '##': {\n above: 6,\n below: 4,\n },\n 'bb': {\n above: 4,\n below: 7,\n },\n 'db': {\n above: 4,\n below: 7,\n },\n 'd': {\n above: 4,\n below: 7,\n },\n 'bbs': {\n above: 4,\n below: 7,\n },\n '++': {\n above: 6,\n below: 4,\n },\n '+': {\n above: 6,\n below: 4,\n },\n '+-': {\n above: 6,\n below: 4,\n },\n '++-': {\n above: 6,\n below: 4,\n },\n 'bs': {\n above: 4,\n below: 10,\n },\n 'bss': {\n above: 4,\n below: 10,\n },\n };\n }\n\n // Create a new Key Signature based on a `key_spec`\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super();\n this.setAttribute('type', 'KeySignature');\n\n this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n this.setPosition(StaveModifier.Position.BEGIN);\n this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n this.glyphs = [];\n this.xPositions = []; // relative to this.x\n this.paddingForced = false;\n }\n\n getCategory() { return KeySignature.CATEGORY; }\n\n // Add an accidental glyph to the `KeySignature` instance which represents\n // the provided `acc`. If `nextAcc` is also provided, the appropriate\n // spacing will be included in the glyph's position\n convertToGlyph(acc, nextAcc) {\n const accGlyphData = Flow.accidentalCodes(acc.type);\n const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n\n // Determine spacing between current accidental and the next accidental\n let extraWidth = 1;\n if (acc.type === 'n' && nextAcc) {\n const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n if (spacing) {\n const isAbove = nextAcc.line >= acc.line;\n extraWidth = isAbove ? spacing.above : spacing.below;\n }\n }\n\n // Place the glyph on the stave\n this.placeGlyphOnLine(glyph, this.stave, acc.line);\n this.glyphs.push(glyph);\n\n const xPosition = this.xPositions[this.xPositions.length - 1];\n const glyphWidth = glyph.getMetrics().width + extraWidth;\n // Store the next accidental's x position\n this.xPositions.push(xPosition + glyphWidth);\n // Expand size of key signature\n this.width += glyphWidth;\n }\n\n // Cancel out a key signature provided in the `spec` parameter. This will\n // place appropriate natural accidentals before the key signature.\n cancelKey(spec) {\n this.formatted = false;\n this.cancelKeySpec = spec;\n\n return this;\n }\n\n convertToCancelAccList(spec) {\n // Get the accidental list for the cancelled key signature\n const cancel_accList = Flow.keySignature(spec);\n\n // If the cancelled key has a different accidental type, ie: # vs b\n const different_types = this.accList.length > 0\n && cancel_accList.length > 0\n && cancel_accList[0].type !== this.accList[0].type;\n\n // Determine how many naturals needed to add\n const naturals = different_types\n ? cancel_accList.length\n : cancel_accList.length - this.accList.length;\n\n // Return if no naturals needed\n if (naturals < 1) return undefined;\n\n // Get the line position for each natural\n const cancelled = [];\n for (let i = 0; i < naturals; i++) {\n let index = i;\n if (!different_types) {\n index = cancel_accList.length - naturals + i;\n }\n\n const acc = cancel_accList[index];\n cancelled.push({ type: 'n', line: acc.line });\n }\n\n // Combine naturals with main accidental list for the key signature\n this.accList = cancelled.concat(this.accList);\n\n return {\n accList: cancelled,\n type: cancel_accList[0].type\n };\n }\n\n // Deprecated\n addToStave(stave) {\n this.paddingForced = true;\n stave.addModifier(this);\n\n return this;\n }\n\n // Apply the accidental staff line placement based on the `clef` and\n // the accidental `type` for the key signature ('# or 'b').\n convertAccLines(clef, type, accList = this.accList) {\n let offset = 0.0; // if clef === \"treble\"\n let customLines; // when clef doesn't follow treble key sig shape\n\n switch (clef) {\n // Treble & Subbass both have offsets of 0, so are not included.\n case 'soprano':\n if (type === '#') customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n else offset = -1;\n break;\n case 'mezzo-soprano':\n if (type === 'b') customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n else offset = 1.5;\n break;\n case 'alto':\n offset = 0.5;\n break;\n case 'tenor':\n if (type === '#') customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n else offset = -0.5;\n break;\n case 'baritone-f':\n case 'baritone-c':\n if (type === 'b') customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n else offset = 2;\n break;\n case 'bass':\n case 'french':\n offset = 1;\n break;\n default:\n break;\n }\n\n // If there's a special case, assign those lines/spaces:\n let i;\n if (typeof customLines !== 'undefined') {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line = customLines[i];\n }\n } else if (offset !== 0) {\n for (i = 0; i < accList.length; ++i) {\n accList[i].line += offset;\n }\n }\n }\n\n getPadding(index) {\n if (!this.formatted) this.format();\n\n return (\n this.glyphs.length === 0 || (!this.paddingForced && index < 2) ?\n 0 : this.padding\n );\n }\n\n getWidth() {\n if (!this.formatted) this.format();\n\n return this.width;\n }\n\n setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n this.formatted = false;\n this.keySpec = keySpec;\n this.cancelKeySpec = cancelKeySpec;\n this.alterKeySpec = alterKeySpec;\n\n return this;\n }\n\n // Alter the accidentals of a key spec one by one.\n // Each alteration is a new accidental that replaces the\n // original accidental (or the canceled one).\n alterKey(alterKeySpec) {\n this.formatted = false;\n this.alterKeySpec = alterKeySpec;\n\n return this;\n }\n\n convertToAlterAccList(alterKeySpec) {\n const max = Math.min(alterKeySpec.length, this.accList.length);\n for (let i = 0; i < max; ++i) {\n if (alterKeySpec[i]) {\n this.accList[i].type = alterKeySpec[i];\n }\n }\n }\n\n format() {\n if (!this.stave) {\n throw new Vex.RERR('KeySignatureError', \"Can't draw key signature without stave.\");\n }\n\n this.width = 0;\n this.glyphs = [];\n this.xPositions = [0]; // initialize with initial x position\n this.accList = Flow.keySignature(this.keySpec);\n const accList = this.accList;\n const firstAccidentalType = accList.length > 0 ? accList[0].type : null;\n let cancelAccList;\n if (this.cancelKeySpec) {\n cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n }\n if (this.alterKeySpec) {\n this.convertToAlterAccList(this.alterKeySpec);\n }\n\n if (this.accList.length > 0) {\n const clef = ((this.position === StaveModifier.Position.END) ?\n this.stave.endClef : this.stave.clef) || this.stave.clef;\n if (cancelAccList) {\n this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n }\n this.convertAccLines(clef, firstAccidentalType, accList);\n for (let i = 0; i < this.accList.length; ++i) {\n this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n }\n }\n\n this.formatted = true;\n }\n\n draw() {\n if (!this.x) {\n throw new Vex.RERR('KeySignatureError', \"Can't draw key signature without x.\");\n }\n\n if (!this.stave) {\n throw new Vex.RERR('KeySignatureError', \"Can't draw key signature without stave.\");\n }\n\n if (!this.formatted) this.format();\n this.setRendered();\n\n for (let i = 0; i < this.glyphs.length; i++) {\n const glyph = this.glyphs[i];\n const x = this.x + this.xPositions[i];\n glyph.setStave(this.stave);\n glyph.setContext(this.stave.context);\n glyph.renderToStave(x);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\n\nimport { Vex } from './vex';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\n\nconst assertIsValidFraction = (timeSpec) => {\n const numbers = timeSpec.split('/').filter(number => number !== '');\n\n if (numbers.length !== 2) {\n throw new Vex.RERR(\n 'BadTimeSignature',\n `Invalid time spec: ${timeSpec}. Must be in the form \"/\"`\n );\n }\n\n numbers.forEach(number => {\n if (isNaN(Number(number))) {\n throw new Vex.RERR(\n 'BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain two valid numbers.`\n );\n }\n });\n};\n\nexport class TimeSignature extends StaveModifier {\n static get CATEGORY() { return 'timesignatures'; }\n\n static get glyphs() {\n return {\n 'C': {\n code: 'v41',\n point: 40,\n line: 2,\n },\n 'C|': {\n code: 'vb6',\n point: 40,\n line: 2,\n },\n };\n }\n\n constructor(timeSpec = null, customPadding = 15, validate_args = true) {\n super();\n this.setAttribute('type', 'TimeSignature');\n this.validate_args = validate_args;\n\n if (timeSpec === null) return;\n\n const padding = customPadding;\n\n this.point = 40;\n this.topLine = 2;\n this.bottomLine = 4;\n this.setPosition(StaveModifier.Position.BEGIN);\n this.setTimeSig(timeSpec);\n this.setWidth(this.timeSig.glyph.getMetrics().width);\n this.setPadding(padding);\n }\n\n getCategory() { return TimeSignature.CATEGORY; }\n\n parseTimeSpec(timeSpec) {\n if (timeSpec === 'C' || timeSpec === 'C|') {\n const { line, code, point } = TimeSignature.glyphs[timeSpec];\n return {\n line,\n num: false,\n glyph: new Glyph(code, point),\n };\n }\n\n if (this.validate_args) {\n assertIsValidFraction(timeSpec);\n }\n\n const [topDigits, botDigits] = timeSpec\n .split('/')\n .map(number => number.split(''));\n\n return {\n num: true,\n glyph: this.makeTimeSignatureGlyph(topDigits, botDigits),\n };\n }\n\n makeTimeSignatureGlyph(topDigits, botDigits) {\n const glyph = new Glyph('v0', this.point);\n glyph.topGlyphs = [];\n glyph.botGlyphs = [];\n\n let topWidth = 0;\n for (let i = 0; i < topDigits.length; ++i) {\n const num = topDigits[i];\n const topGlyph = new Glyph('v' + num, this.point);\n\n glyph.topGlyphs.push(topGlyph);\n topWidth += topGlyph.getMetrics().width;\n }\n\n let botWidth = 0;\n for (let i = 0; i < botDigits.length; ++i) {\n const num = botDigits[i];\n const botGlyph = new Glyph('v' + num, this.point);\n\n glyph.botGlyphs.push(botGlyph);\n botWidth += botGlyph.getMetrics().width;\n }\n\n const width = topWidth > botWidth ? topWidth : botWidth;\n const xMin = glyph.getMetrics().x_min;\n\n glyph.getMetrics = () => ({\n x_min: xMin,\n x_max: xMin + width,\n width,\n });\n\n const topStartX = (width - topWidth) / 2.0;\n const botStartX = (width - botWidth) / 2.0;\n\n const that = this;\n glyph.renderToStave = function renderToStave(x) {\n let start_x = x + topStartX;\n for (let i = 0; i < this.topGlyphs.length; ++i) {\n const glyph = this.topGlyphs[i];\n Glyph.renderOutline(\n this.context,\n glyph.metrics.outline,\n glyph.scale,\n start_x + glyph.x_shift,\n this.stave.getYForLine(that.topLine)\n );\n start_x += glyph.getMetrics().width;\n }\n\n start_x = x + botStartX;\n for (let i = 0; i < this.botGlyphs.length; ++i) {\n const glyph = this.botGlyphs[i];\n that.placeGlyphOnLine(glyph, this.stave, glyph.line);\n Glyph.renderOutline(\n this.context,\n glyph.metrics.outline,\n glyph.scale,\n start_x + glyph.x_shift,\n this.stave.getYForLine(that.bottomLine)\n );\n start_x += glyph.getMetrics().width;\n }\n };\n\n return glyph;\n }\n\n getTimeSig() {\n return this.timeSig;\n }\n\n setTimeSig(timeSpec) {\n this.timeSig = this.parseTimeSpec(timeSpec);\n return this;\n }\n\n draw() {\n if (!this.x) {\n throw new Vex.RERR('TimeSignatureError', \"Can't draw time signature without x.\");\n }\n\n if (!this.stave) {\n throw new Vex.RERR('TimeSignatureError', \"Can't draw time signature without stave.\");\n }\n\n this.setRendered();\n this.timeSig.glyph.setStave(this.stave);\n this.timeSig.glyph.setContext(this.stave.context);\n this.placeGlyphOnLine(this.timeSig.glyph, this.stave, this.timeSig.line);\n this.timeSig.glyph.renderToStave(this.x);\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\n\nimport { StaveModifier } from './stavemodifier';\n\nexport class Volta extends StaveModifier {\n static get CATEGORY() { return 'voltas'; }\n static get type() {\n return {\n NONE: 1,\n BEGIN: 2,\n MID: 3,\n END: 4,\n BEGIN_END: 5,\n };\n }\n\n constructor(type, number, x, y_shift) {\n super();\n this.setAttribute('type', 'Volta');\n this.volta = type;\n this.x = x;\n this.y_shift = y_shift;\n this.number = number;\n this.font = {\n family: 'sans-serif',\n size: 9,\n weight: 'bold',\n };\n }\n\n getCategory() { return Volta.CATEGORY; }\n setShiftY(y) { this.y_shift = y; return this; }\n\n draw(stave, x) {\n const ctx = stave.checkContext();\n this.setRendered();\n\n let width = stave.width;\n const top_y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n const vert_height = 1.5 * stave.options.spacing_between_lines_px;\n switch (this.volta) {\n case Volta.type.BEGIN:\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n break;\n case Volta.type.END:\n width -= 5;\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n case Volta.type.BEGIN_END:\n width -= 3;\n ctx.fillRect(this.x + x, top_y, 1, vert_height);\n ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n break;\n default:\n break;\n }\n // If the beginning of a volta, draw measure number\n if (this.volta === Volta.type.BEGIN || this.volta === Volta.type.BEGIN_END) {\n ctx.save();\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n ctx.restore();\n }\n\n ctx.fillRect(this.x + x, top_y, width, 1);\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Barline } from './stavebarline';\nimport { StaveModifier } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { KeySignature } from './keysignature';\nimport { TimeSignature } from './timesignature';\nimport { Volta } from './stavevolta';\n\nexport class Stave extends Element {\n constructor(x, y, width, options) {\n super();\n this.setAttribute('type', 'Stave');\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.formatted = false;\n this.start_x = x + 5;\n this.end_x = x + width;\n this.modifiers = []; // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n this.measure = 0;\n this.clef = 'treble';\n this.endClef = undefined;\n this.font = {\n family: 'sans-serif',\n size: 8,\n weight: '',\n };\n this.options = {\n vertical_bar_width: 10, // Width around vertical bar end-marker\n glyph_spacing_px: 10,\n num_lines: 5,\n fill_style: '#999999',\n left_bar: true, // draw vertical bar on left\n right_bar: true, // draw vertical bar on right\n spacing_between_lines_px: 10, // in pixels\n space_above_staff_ln: 4, // in staff lines\n space_below_staff_ln: 4, // in staff lines\n top_text_position: 1, // in staff lines\n };\n this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n Vex.Merge(this.options, options);\n\n this.resetLines();\n\n const BARTYPE = Barline.type;\n // beg bar\n this.addModifier(new Barline(this.options.left_bar ? BARTYPE.SINGLE : BARTYPE.NONE));\n // end bar\n this.addEndModifier(new Barline(this.options.right_bar ? BARTYPE.SINGLE : BARTYPE.NONE));\n }\n\n space(spacing) { return this.options.spacing_between_lines_px * spacing; }\n\n resetLines() {\n this.options.line_config = [];\n for (let i = 0; i < this.options.num_lines; i++) {\n this.options.line_config.push({ visible: true });\n }\n this.height = (this.options.num_lines + this.options.space_above_staff_ln) *\n this.options.spacing_between_lines_px;\n this.options.bottom_text_position = this.options.num_lines;\n }\n\n getOptions() { return this.options; }\n\n setNoteStartX(x) {\n if (!this.formatted) this.format();\n\n this.start_x = x;\n const begBarline = this.modifiers[0];\n begBarline.setX(this.start_x - begBarline.getWidth());\n return this;\n }\n getNoteStartX() {\n if (!this.formatted) this.format();\n\n return this.start_x;\n }\n\n getNoteEndX() {\n if (!this.formatted) this.format();\n\n return this.end_x;\n }\n getTieStartX() { return this.start_x; }\n getTieEndX() { return this.x + this.width; }\n getX() { return this.x; }\n getNumLines() { return this.options.num_lines; }\n setNumLines(lines) {\n this.options.num_lines = parseInt(lines, 10);\n this.resetLines();\n return this;\n }\n setY(y) { this.y = y; return this; }\n\n getTopLineTopY() {\n return this.getYForLine(0) - (Flow.STAVE_LINE_THICKNESS / 2);\n }\n getBottomLineBottomY() {\n return this.getYForLine(this.getNumLines() - 1) + (Flow.STAVE_LINE_THICKNESS / 2);\n }\n\n setX(x) {\n const shift = x - this.x;\n this.formatted = false;\n this.x = x;\n this.start_x += shift;\n this.end_x += shift;\n for (let i = 0; i < this.modifiers.length; i++) {\n const mod = this.modifiers[i];\n if (mod.x !== undefined) {\n mod.x += shift;\n }\n }\n return this;\n }\n\n setWidth(width) {\n this.formatted = false;\n this.width = width;\n this.end_x = this.x + width;\n\n // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n // this.modifiers[1].setX(this.end_x);\n return this;\n }\n\n getWidth() {\n return this.width;\n }\n\n getStyle() {\n return {\n fillStyle: this.options.fill_style,\n strokeStyle: this.options.fill_style, // yes, this is correct for legacy compatibility\n lineWidth: Flow.STAVE_LINE_THICKNESS, ...this.style || {}\n };\n }\n\n setMeasure(measure) { this.measure = measure; return this; }\n\n /**\n * Gets the pixels to shift from the beginning of the stave\n * following the modifier at the provided index\n * @param {Number} index The index from which to determine the shift\n * @return {Number} The amount of pixels shifted\n */\n getModifierXShift(index = 0) {\n if (typeof index !== 'number') {\n throw new Vex.RERR('InvalidIndex', 'Must be of number type');\n }\n\n if (!this.formatted) this.format();\n\n if (this.getModifiers(StaveModifier.Position.BEGIN).length === 1) {\n return 0;\n }\n\n let start_x = this.start_x - this.x;\n const begBarline = this.modifiers[0];\n if (begBarline.getType() === Barline.type.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n start_x -= begBarline.getWidth();\n }\n\n return start_x;\n }\n\n // Coda & Segno Symbol functions\n setRepetitionTypeLeft(type, y) {\n this.modifiers.push(new Repetition(type, this.x, y));\n return this;\n }\n\n setRepetitionTypeRight(type, y) {\n this.modifiers.push(new Repetition(type, this.x, y));\n return this;\n }\n\n // Volta functions\n setVoltaType(type, number_t, y) {\n this.modifiers.push(new Volta(type, number_t, this.x, y));\n return this;\n }\n\n // Section functions\n setSection(section, y) {\n this.modifiers.push(new StaveSection(section, this.x, y));\n return this;\n }\n\n // Tempo functions\n setTempo(tempo, y) {\n this.modifiers.push(new StaveTempo(tempo, this.x, y));\n return this;\n }\n\n // Text functions\n setText(text, position, options) {\n this.modifiers.push(new StaveText(text, position, options));\n return this;\n }\n\n getHeight() {\n return this.height;\n }\n\n getSpacingBetweenLines() {\n return this.options.spacing_between_lines_px;\n }\n\n getBoundingBox() {\n return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n }\n\n getBottomY() {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const score_bottom = this.getYForLine(options.num_lines) +\n (options.space_below_staff_ln * spacing);\n\n return score_bottom;\n }\n\n getBottomLineY() {\n return this.getYForLine(this.options.num_lines);\n }\n\n // This returns the y for the *center* of a staff line\n getYForLine(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n\n const y = this.y + (line * spacing) + (headroom * spacing);\n\n return y;\n }\n\n getLineForY(y) {\n // Does the reverse of getYForLine - somewhat dumb and just calls\n // getYForLine until the right value is reaches\n\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n return ((y - this.y) / spacing) - headroom;\n }\n\n getYForTopText(line) {\n const l = line || 0;\n return this.getYForLine(-l - this.options.top_text_position);\n }\n\n getYForBottomText(line) {\n const l = line || 0;\n return this.getYForLine(this.options.bottom_text_position + l);\n }\n\n getYForNote(line) {\n const options = this.options;\n const spacing = options.spacing_between_lines_px;\n const headroom = options.space_above_staff_ln;\n const y = this.y + (headroom * spacing) + (5 * spacing) - (line * spacing);\n\n return y;\n }\n\n getYForGlyphs() {\n return this.getYForLine(3);\n }\n\n // This method adds a stave modifier to the stave. Note that the first two\n // modifiers (BarLines) are automatically added upon construction.\n addModifier(modifier, position) {\n if (position !== undefined) {\n modifier.setPosition(position);\n }\n\n modifier.setStave(this);\n this.formatted = false;\n this.modifiers.push(modifier);\n return this;\n }\n\n addEndModifier(modifier) {\n this.addModifier(modifier, StaveModifier.Position.END);\n return this;\n }\n\n // Bar Line functions\n setBegBarType(type) {\n // Only valid bar types at beginning of stave is none, single or begin repeat\n const { SINGLE, REPEAT_BEGIN, NONE } = Barline.type;\n if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n this.modifiers[0].setType(type);\n this.formatted = false;\n }\n return this;\n }\n\n setEndBarType(type) {\n // Repeat end not valid at end of stave\n if (type !== Barline.type.REPEAT_BEGIN) {\n this.modifiers[1].setType(type);\n this.formatted = false;\n }\n return this;\n }\n\n setClef(clefSpec, size, annotation, position) {\n if (position === undefined) {\n position = StaveModifier.Position.BEGIN;\n }\n\n if (position === StaveModifier.Position.END) {\n this.endClef = clefSpec;\n } else {\n this.clef = clefSpec;\n }\n\n const clefs = this.getModifiers(position, Clef.CATEGORY);\n if (clefs.length === 0) {\n this.addClef(clefSpec, size, annotation, position);\n } else {\n clefs[0].setType(clefSpec, size, annotation);\n }\n\n return this;\n }\n\n setEndClef(clefSpec, size, annotation) {\n this.setClef(clefSpec, size, annotation, StaveModifier.Position.END);\n return this;\n }\n\n setKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifier.Position.BEGIN;\n }\n\n const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n if (keySignatures.length === 0) {\n this.addKeySignature(keySpec, cancelKeySpec, position);\n } else {\n keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n }\n\n return this;\n }\n\n setEndKeySignature(keySpec, cancelKeySpec) {\n this.setKeySignature(keySpec, cancelKeySpec, StaveModifier.Position.END);\n return this;\n }\n\n setTimeSignature(timeSpec, customPadding, position) {\n if (position === undefined) {\n position = StaveModifier.Position.BEGIN;\n }\n\n const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n if (timeSignatures.length === 0) {\n this.addTimeSignature(timeSpec, customPadding, position);\n } else {\n timeSignatures[0].setTimeSig(timeSpec);\n }\n\n return this;\n }\n\n setEndTimeSignature(timeSpec, customPadding) {\n this.setTimeSignature(timeSpec, customPadding, StaveModifier.Position.END);\n return this;\n }\n\n addKeySignature(keySpec, cancelKeySpec, position) {\n if (position === undefined) {\n position = StaveModifier.Position.BEGIN;\n }\n this.addModifier(new KeySignature(keySpec, cancelKeySpec)\n .setPosition(position), position);\n return this;\n }\n\n addClef(clef, size, annotation, position) {\n if (position === undefined || position === StaveModifier.Position.BEGIN) {\n this.clef = clef;\n } else if (position === StaveModifier.Position.END) {\n this.endClef = clef;\n }\n\n this.addModifier(new Clef(clef, size, annotation), position);\n return this;\n }\n\n addEndClef(clef, size, annotation) {\n this.addClef(clef, size, annotation, StaveModifier.Position.END);\n return this;\n }\n\n addTimeSignature(timeSpec, customPadding, position) {\n this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n return this;\n }\n\n addEndTimeSignature(timeSpec, customPadding) {\n this.addTimeSignature(timeSpec, customPadding, StaveModifier.Position.END);\n return this;\n }\n\n // Deprecated\n addTrebleGlyph() {\n this.addClef('treble');\n return this;\n }\n\n getModifiers(position, category) {\n if (position === undefined && category === undefined) return this.modifiers;\n\n return this.modifiers.filter(modifier =>\n (position === undefined || position === modifier.getPosition()) &&\n (category === undefined || category === modifier.getCategory())\n );\n }\n\n sortByCategory(items, order) {\n for (let i = items.length - 1; i >= 0; i--) {\n for (let j = 0; j < i; j++) {\n if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n const temp = items[j];\n items[j] = items[j + 1];\n items[j + 1] = temp;\n }\n }\n }\n }\n\n format() {\n const begBarline = this.modifiers[0];\n const endBarline = this.modifiers[1];\n\n const begModifiers = this.getModifiers(StaveModifier.Position.BEGIN);\n const endModifiers = this.getModifiers(StaveModifier.Position.END);\n\n this.sortByCategory(begModifiers, {\n barlines: 0, clefs: 1, keysignatures: 2, timesignatures: 3,\n });\n\n this.sortByCategory(endModifiers, {\n timesignatures: 0, keysignatures: 1, barlines: 2, clefs: 3,\n });\n\n if (begModifiers.length > 1 &&\n begBarline.getType() === Barline.type.REPEAT_BEGIN) {\n begModifiers.push(begModifiers.splice(0, 1)[0]);\n begModifiers.splice(0, 0, new Barline(Barline.type.SINGLE));\n }\n\n if (endModifiers.indexOf(endBarline) > 0) {\n endModifiers.splice(0, 0, new Barline(Barline.type.NONE));\n }\n\n let width;\n let padding;\n let modifier;\n let offset = 0;\n let x = this.x;\n for (let i = 0; i < begModifiers.length; i++) {\n modifier = begModifiers[i];\n padding = modifier.getPadding(i + offset);\n width = modifier.getWidth();\n\n x += padding;\n modifier.setX(x);\n x += width;\n\n if (padding + width === 0) offset--;\n }\n\n this.start_x = x;\n x = this.x + this.width;\n\n const widths = {\n left: 0,\n right: 0,\n paddingRight: 0,\n paddingLeft: 0,\n };\n\n let lastBarlineIdx = 0;\n\n for (let i = 0; i < endModifiers.length; i++) {\n modifier = endModifiers[i];\n lastBarlineIdx = (modifier.getCategory() === 'barlines') ? i : lastBarlineIdx;\n\n widths.right = 0;\n widths.left = 0;\n widths.paddingRight = 0;\n widths.paddingLeft = 0;\n const layoutMetrics = modifier.getLayoutMetrics();\n\n if (layoutMetrics) {\n if (i !== 0) {\n widths.right = layoutMetrics.xMax || 0;\n widths.paddingRight = layoutMetrics.paddingRight || 0;\n }\n widths.left = (-layoutMetrics.xMin) || 0;\n widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n\n if (i === endModifiers.length - 1) {\n widths.paddingLeft = 0;\n }\n } else {\n widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n if (i !== 0) {\n widths.right = modifier.getWidth();\n }\n if (i === 0) {\n widths.left = modifier.getWidth();\n }\n }\n x -= widths.paddingRight;\n x -= widths.right;\n\n modifier.setX(x);\n\n x -= widths.left;\n x -= widths.paddingLeft;\n }\n\n this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n this.formatted = true;\n }\n\n /**\n * All drawing functions below need the context to be set.\n */\n draw() {\n this.checkContext();\n this.setRendered();\n\n if (!this.formatted) this.format();\n\n const num_lines = this.options.num_lines;\n const width = this.width;\n const x = this.x;\n let y;\n\n // Render lines\n for (let line = 0; line < num_lines; line++) {\n y = this.getYForLine(line);\n\n this.applyStyle();\n if (this.options.line_config[line].visible) {\n this.context.beginPath();\n this.context.moveTo(x, y);\n this.context.lineTo(x + width, y);\n this.context.stroke();\n }\n this.restoreStyle();\n }\n\n // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n for (let i = 0; i < this.modifiers.length; i++) {\n // Only draw modifier if it has a draw function\n if (typeof this.modifiers[i].draw === 'function') {\n this.modifiers[i].applyStyle(this.context);\n this.modifiers[i].draw(this, this.getModifierXShift(i));\n this.modifiers[i].restoreStyle(this.context);\n }\n }\n\n // Render measure numbers\n if (this.measure > 0) {\n this.context.save();\n this.context.setFont(this.font.family, this.font.size, this.font.weight);\n const text_width = this.context.measureText('' + this.measure).width;\n y = this.getYForTopText(0) + 3;\n this.context.fillText('' + this.measure, this.x - text_width / 2, y);\n this.context.restore();\n }\n\n return this;\n }\n\n // Draw Simple barlines for backward compatability\n // Do not delete - draws the beginning bar of the stave\n drawVertical(x, isDouble) {\n this.drawVerticalFixed(this.x + x, isDouble);\n }\n\n drawVerticalFixed(x, isDouble) {\n this.checkContext();\n\n const top_line = this.getYForLine(0);\n const bottom_line = this.getYForLine(this.options.num_lines - 1);\n if (isDouble) {\n this.context.fillRect(x - 3, top_line, 1, bottom_line - top_line + 1);\n }\n this.context.fillRect(x, top_line, 1, bottom_line - top_line + 1);\n }\n\n drawVerticalBar(x) {\n this.drawVerticalBarFixed(this.x + x, false);\n }\n\n drawVerticalBarFixed(x) {\n this.checkContext();\n\n const top_line = this.getYForLine(0);\n const bottom_line = this.getYForLine(this.options.num_lines - 1);\n this.context.fillRect(x, top_line, 1, bottom_line - top_line + 1);\n }\n\n /**\n * Get the current configuration for the Stave.\n * @return {Array} An array of configuration objects.\n */\n getConfigForLines() {\n return this.options.line_config;\n }\n\n /**\n * Configure properties of the lines in the Stave\n * @param line_number The index of the line to configure.\n * @param line_config An configuration object for the specified line.\n * @throws Vex.RERR \"StaveConfigError\" When the specified line number is out of\n * range of the number of lines specified in the constructor.\n */\n setConfigForLine(line_number, line_config) {\n if (line_number >= this.options.num_lines || line_number < 0) {\n throw new Vex.RERR(\n 'StaveConfigError',\n 'The line number must be within the range of the number of lines in the Stave.'\n );\n }\n\n if (line_config.visible === undefined) {\n throw new Vex.RERR(\n 'StaveConfigError',\n \"The line configuration object is missing the 'visible' property.\"\n );\n }\n\n if (typeof (line_config.visible) !== 'boolean') {\n throw new Vex.RERR(\n 'StaveConfigError',\n \"The line configuration objects 'visible' property must be true or false.\"\n );\n }\n\n this.options.line_config[line_number] = line_config;\n\n return this;\n }\n\n /**\n * Set the staff line configuration array for all of the lines at once.\n * @param lines_configuration An array of line configuration objects. These objects\n * are of the same format as the single one passed in to setLineConfiguration().\n * The caller can set null for any line config entry if it is desired that the default be used\n * @throws Vex.RERR \"StaveConfigError\" When the lines_configuration array does not have\n * exactly the same number of elements as the num_lines configuration object set in\n * the constructor.\n */\n setConfigForLines(lines_configuration) {\n if (lines_configuration.length !== this.options.num_lines) {\n throw new Vex.RERR(\n 'StaveConfigError',\n 'The length of the lines configuration array must match the number of lines in the Stave'\n );\n }\n\n // Make sure the defaults are present in case an incomplete set of\n // configuration options were supplied.\n // eslint-disable-next-line\n for (const line_config in lines_configuration) {\n // Allow 'null' to be used if the caller just wants the default for a particular node.\n if (!lines_configuration[line_config]) {\n lines_configuration[line_config] = this.options.line_config[line_config];\n }\n Vex.Merge(this.options.line_config[line_config], lines_configuration[line_config]);\n }\n\n this.options.line_config = lines_configuration;\n\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Stave } from './stave';\n\nexport class TabStave extends Stave {\n constructor(x, y, width, options) {\n const tab_options = {\n spacing_between_lines_px: 13,\n num_lines: 6,\n top_text_position: 1,\n };\n\n Vex.Merge(tab_options, options);\n super(x, y, width, tab_options);\n this.setAttribute('type', 'TabStave');\n }\n\n getYForGlyphs() {\n return this.getYForLine(2.5);\n }\n\n // Deprecated\n addTabGlyph() {\n this.addClef('tab');\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.js` for usage examples\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Dot } from './dot';\nimport { Glyph } from './glyph';\n\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n const stem_through = [];\n let group = [];\n for (let string = 1; string <= num_lines; string++) {\n const is_used = strings_used.indexOf(string) > -1;\n\n if (!is_used) {\n group.push(string);\n } else {\n stem_through.push(group);\n group = [];\n }\n }\n if (group.length > 0) stem_through.push(group);\n\n return stem_through;\n}\n\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n const up_stem = stem_direction !== 1;\n const down_stem = stem_direction !== -1;\n\n const line_spacing = stave.getSpacingBetweenLines();\n const total_lines = stave.getNumLines();\n\n const stem_lines = [];\n\n unused_strings.forEach(strings => {\n const containsLastString = strings.indexOf(total_lines) > -1;\n const containsFirstString = strings.indexOf(1) > -1;\n\n if ((up_stem && containsFirstString) ||\n (down_stem && containsLastString)) {\n return;\n }\n\n // If there's only one string in the group, push a duplicate value.\n // We do this because we need 2 strings to convert into upper/lower y\n // values.\n if (strings.length === 1) {\n strings.push(strings[0]);\n }\n\n const line_ys = [];\n // Iterate through each group string and store it's y position\n strings.forEach((string, index, strings) => {\n const isTopBound = string === 1;\n const isBottomBound = string === total_lines;\n\n // Get the y value for the appropriate staff line,\n // we adjust for a 0 index array, since string numbers are index 1\n let y = stave.getYForLine(string - 1);\n\n // Unless the string is the first or last, add padding to each side\n // of the line\n if (index === 0 && !isTopBound) {\n y -= line_spacing / 2 - 1;\n } else if (index === strings.length - 1 && !isBottomBound) {\n y += line_spacing / 2 - 1;\n }\n\n // Store the y value\n line_ys.push(y);\n\n // Store a subsequent y value connecting this group to the main\n // stem above/below the stave if it's the top/bottom string\n if (stem_direction === 1 && isTopBound) {\n line_ys.push(stem_y - 2);\n } else if (stem_direction === -1 && isBottomBound) {\n line_ys.push(stem_y + 2);\n }\n });\n\n // Add the sorted y values to the\n stem_lines.push(line_ys.sort((a, b) => a - b));\n });\n\n return stem_lines;\n}\n\nexport class TabNote extends StemmableNote {\n static get CATEGORY() { return 'tabnotes'; }\n\n // Initialize the TabNote with a `tab_struct` full of properties\n // and whether to `draw_stem` when rendering the note\n constructor(tab_struct, draw_stem) {\n super(tab_struct);\n this.setAttribute('type', 'TabNote');\n\n this.ghost = false; // Renders parenthesis around notes\n // Note properties\n //\n // The fret positions in the note. An array of `{ str: X, fret: X }`\n this.positions = tab_struct.positions;\n\n // Render Options\n Vex.Merge(this.render_options, {\n // font size for note heads and rests\n glyph_font_scale: Flow.DEFAULT_TABLATURE_FONT_SCALE,\n // Flag to draw a stem\n draw_stem,\n // Flag to draw dot modifiers\n draw_dots: draw_stem,\n // Flag to extend the main stem through the stave and fret positions\n draw_stem_through_stave: false,\n // vertical shift from stave line\n y_shift: 0,\n // normal glyph scale\n scale: 1.0,\n // default tablature font\n font: '10pt Arial',\n });\n\n this.glyph = Flow.getGlyphProps(this.duration, this.noteType);\n\n if (!this.glyph) {\n throw new Vex.RuntimeError(\n 'BadArguments',\n `Invalid note initialization data (No glyph found): ${JSON.stringify(tab_struct)}`\n );\n }\n\n this.buildStem();\n\n if (tab_struct.stem_direction) {\n this.setStemDirection(tab_struct.stem_direction);\n } else {\n this.setStemDirection(Stem.UP);\n }\n\n // Renders parenthesis around notes\n this.ghost = false;\n this.updateWidth();\n }\n\n reset() {\n if (this.stave) this.setStave(this.stave);\n }\n\n // The ModifierContext category\n getCategory() { return TabNote.CATEGORY; }\n\n // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n // Often used for indicating frets that are being bent to\n setGhost(ghost) {\n this.ghost = ghost;\n this.updateWidth();\n return this;\n }\n\n // Determine if the note has a stem\n hasStem() { return this.render_options.draw_stem; }\n\n // Get the default stem extension for the note\n getStemExtension() {\n const glyph = this.getGlyph();\n\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n\n if (glyph) {\n return this.getStemDirection() === 1\n ? glyph.tabnote_stem_up_extension\n : glyph.tabnote_stem_down_extension;\n }\n\n return 0;\n }\n\n // Add a dot to the note\n addDot() {\n const dot = new Dot();\n this.dots += 1;\n return this.addModifier(dot, 0);\n }\n\n // Calculate and store the width of the note\n updateWidth() {\n this.glyphs = [];\n this.width = 0;\n for (let i = 0; i < this.positions.length; ++i) {\n let fret = this.positions[i].fret;\n if (this.ghost) fret = '(' + fret + ')';\n const glyph = Flow.tabToGlyph(fret, this.render_options.scale);\n this.glyphs.push(glyph);\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n // For some reason we associate a notehead glyph with a TabNote, and this\n // glyph is used for certain width calculations. Of course, this is totally\n // incorrect since a notehead is a poor approximation for the dimensions of\n // a fret number which can have multiple digits. As a result, we must\n // overwrite getWidth() to return the correct width\n this.glyph.getWidth = () => this.width;\n }\n\n // Set the `stave` to the note\n setStave(stave) {\n super.setStave(stave);\n this.context = stave.context;\n\n // Calculate the fret number width based on font used\n let i;\n if (this.context) {\n const ctx = this.context;\n this.width = 0;\n for (i = 0; i < this.glyphs.length; ++i) {\n const glyph = this.glyphs[i];\n const text = '' + glyph.text;\n if (text.toUpperCase() !== 'X') {\n ctx.save();\n ctx.setRawFont(this.render_options.font);\n glyph.width = ctx.measureText(text).width;\n ctx.restore();\n glyph.getWidth = () => glyph.width;\n }\n this.width = Math.max(glyph.getWidth(), this.width);\n }\n this.glyph.getWidth = () => this.width;\n }\n\n // we subtract 1 from `line` because getYForLine expects a 0-based index,\n // while the position.str is a 1-based index\n const ys = this.positions.map(({ str: line }) => stave.getYForLine(line - 1));\n\n this.setYs(ys);\n\n if (this.stem) {\n this.stem.setYBounds(this.getStemY(), this.getStemY());\n }\n\n return this;\n }\n\n // Get the fret positions for the note\n getPositions() { return this.positions; }\n\n // Add self to the provided modifier context `mc`\n addToModifierContext(mc) {\n this.setModifierContext(mc);\n for (let i = 0; i < this.modifiers.length; ++i) {\n this.modifierContext.addModifier(this.modifiers[i]);\n }\n this.modifierContext.addModifier(this);\n this.preFormatted = false;\n return this;\n }\n\n // Get the `x` coordinate to the right of the note\n getTieRightX() {\n let tieStartX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieStartX += note_glyph_width / 2;\n tieStartX += (-this.width / 2) + this.width + 2;\n\n return tieStartX;\n }\n\n // Get the `x` coordinate to the left of the note\n getTieLeftX() {\n let tieEndX = this.getAbsoluteX();\n const note_glyph_width = this.glyph.getWidth();\n tieEndX += note_glyph_width / 2;\n tieEndX -= (this.width / 2) + 2;\n\n return tieEndX;\n }\n\n // Get the default `x` and `y` coordinates for a modifier at a specific\n // `position` at a fret position `index`\n getModifierStartXY(position, index) {\n if (!this.preFormatted) {\n throw new Vex.RERR('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n }\n\n if (this.ys.length === 0) {\n throw new Vex.RERR('NoYValues', 'No Y-Values calculated for this note.');\n }\n\n let x = 0;\n if (position === Modifier.Position.LEFT) {\n x = -1 * 2; // extra_left_px\n } else if (position === Modifier.Position.RIGHT) {\n x = this.width + 2; // extra_right_px\n } else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n const note_glyph_width = this.glyph.getWidth();\n x = note_glyph_width / 2;\n }\n\n return {\n x: this.getAbsoluteX() + x,\n y: this.ys[index],\n };\n }\n\n // Get the default line for rest\n getLineForRest() { return this.positions[0].str; }\n\n // Pre-render formatting\n preFormat() {\n if (this.preFormatted) return;\n if (this.modifierContext) this.modifierContext.preFormat();\n // width is already set during init()\n this.setPreFormatted(true);\n }\n\n // Get the x position for the stem\n getStemX() { return this.getCenterGlyphX(); }\n\n // Get the y position for the stem\n getStemY() {\n const num_lines = this.stave.getNumLines();\n\n // The decimal staff line amounts provide optimal spacing between the\n // fret number and the stem\n const stemUpLine = -0.5;\n const stemDownLine = num_lines - 0.5;\n const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n\n return this.stave.getYForLine(stemStartLine);\n }\n\n // Get the stem extents for the tabnote\n getStemExtents() {\n return this.stem.getExtents();\n }\n\n // Draw the fal onto the context\n drawFlag() {\n const {\n beam, glyph, context, stem, stem_direction,\n render_options: { draw_stem, glyph_font_scale },\n } = this;\n\n const shouldDrawFlag = beam == null && draw_stem;\n\n // Now it's the flag's turn.\n if (glyph.flag && shouldDrawFlag) {\n const flag_x = this.getStemX() + 1;\n const flag_y = this.getStemY() - stem.getHeight();\n\n const flag_code = stem_direction === Stem.DOWN\n ? glyph.code_flag_downstem // Down stems have flags on the left.\n : glyph.code_flag_upstem;\n\n // Draw the Flag\n Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code);\n }\n }\n\n // Render the modifiers onto the context\n drawModifiers() {\n // Draw the modifiers\n this.modifiers.forEach((modifier) => {\n // Only draw the dots if enabled\n if (modifier.getCategory() === 'dots' && !this.render_options.draw_dots) return;\n\n modifier.setContext(this.context);\n modifier.drawWithStyle();\n });\n }\n\n // Render the stem extension through the fret positions\n drawStemThrough() {\n const stem_x = this.getStemX();\n const stem_y = this.getStemY();\n const ctx = this.context;\n\n const stem_through = this.render_options.draw_stem_through_stave;\n const draw_stem = this.render_options.draw_stem;\n if (draw_stem && stem_through) {\n const total_lines = this.stave.getNumLines();\n const strings_used = this.positions.map(position => position.str);\n\n const unused_strings = getUnusedStringGroups(total_lines, strings_used);\n const stem_lines = getPartialStemLines(\n stem_y,\n unused_strings,\n this.getStave(),\n this.getStemDirection()\n );\n\n ctx.save();\n ctx.setLineWidth(Stem.WIDTH);\n stem_lines.forEach(bounds => {\n if (bounds.length === 0) return;\n\n ctx.beginPath();\n ctx.moveTo(stem_x, bounds[0]);\n ctx.lineTo(stem_x, bounds[bounds.length - 1]);\n ctx.stroke();\n ctx.closePath();\n });\n ctx.restore();\n }\n }\n\n // Render the fret positions onto the context\n drawPositions() {\n const ctx = this.context;\n const x = this.getAbsoluteX();\n const ys = this.ys;\n for (let i = 0; i < this.positions.length; ++i) {\n const y = ys[i] + this.render_options.y_shift;\n const glyph = this.glyphs[i];\n\n // Center the fret text beneath the notation note head\n const note_glyph_width = this.glyph.getWidth();\n const tab_x = x + (note_glyph_width / 2) - (glyph.getWidth() / 2);\n\n // FIXME: Magic numbers.\n ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n\n if (glyph.code) {\n Glyph.renderGlyph(ctx, tab_x, y,\n this.render_options.glyph_font_scale * this.render_options.scale,\n glyph.code);\n } else {\n ctx.save();\n ctx.setRawFont(this.render_options.font);\n const text = glyph.text.toString();\n ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n ctx.restore();\n }\n }\n }\n\n // The main rendering function for the entire note\n draw() {\n this.checkContext();\n\n if (!this.stave) {\n throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n }\n\n if (this.ys.length === 0) {\n throw new Vex.RERR('NoYValues', \"Can't draw note without Y values.\");\n }\n\n this.setRendered();\n const render_stem = this.beam == null && this.render_options.draw_stem;\n\n this.drawPositions();\n this.drawStemThrough();\n\n const stem_x = this.getStemX();\n\n this.stem.setNoteHeadXBounds(stem_x, stem_x);\n\n if (render_stem) {\n this.context.openGroup('stem', null, { pointerBBox: true });\n this.stem.setContext(this.context).draw();\n this.context.closeGroup();\n }\n\n this.drawFlag();\n this.drawModifiers();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n//\n// ## Description\n//\n// This file implements `VibratoBrackets`\n// that renders vibrato effect between two notes.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Vibrato } from './vibrato';\n\n// To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`.\nfunction L(...args) { if (VibratoBracket.DEBUG) Vex.L('Vex.Flow.VibratoBracket', args); }\n\nexport class VibratoBracket extends Element {\n // bracket_data = {\n // start: Vex.Flow.Note (optional)\n // stop: Vex.Flow.Note (optional)\n // };\n // Either the stop or start note must be set, or both of them.\n // A null value for the start or stop note indicates that the vibrato\n // is drawn from the beginning or until the end of the stave accordingly.\n constructor(bracket_data) {\n super();\n this.setAttribute('type', 'VibratoBracket');\n\n this.start = bracket_data.start;\n this.stop = bracket_data.stop;\n\n this.line = 1;\n\n this.render_options = {\n harsh: false,\n wave_height: 6,\n wave_width: 4,\n wave_girth: 2,\n };\n }\n\n // Set line position of the vibrato bracket\n setLine(line) { this.line = line; return this; }\n setHarsh(harsh) { this.render_options.harsh = harsh; return this; }\n\n // Draw the vibrato bracket on the rendering context\n draw() {\n const ctx = this.context;\n this.setRendered();\n\n const y = (this.start)\n ? this.start.getStave().getYForTopText(this.line)\n : this.stop.getStave().getYForTopText(this.line);\n\n // If start note is not set then vibrato will be drawn\n // from the beginning of the stave\n const start_x = (this.start)\n ? this.start.getAbsoluteX()\n : this.stop.getStave().getTieStartX();\n\n // If stop note is not set then vibrato will be drawn\n // until the end of the stave\n const stop_x = (this.stop)\n ? this.stop.getAbsoluteX() - this.stop.getWidth() - 5\n : this.start.getStave().getTieEndX() - 10;\n\n this.render_options.vibrato_width = stop_x - start_x;\n\n L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n\n Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifier } from './stavemodifier';\nimport { TimeSignature } from './timesignature';\n\nlet semibrave_rest;\nfunction get_semibrave_rest() {\n if (!semibrave_rest) {\n const notehead = new NoteHead({ duration: 'w', note_type: 'r' });\n semibrave_rest = {\n glyph_font_scale: notehead.render_options.glyph_font_scale,\n glyph_code: notehead.glyph_code,\n width: notehead.getWidth(),\n };\n }\n return semibrave_rest;\n}\n\nexport class MultiMeasureRest extends Element {\n // Parameters:\n // * `number_of_measures` - Number of measures.\n // * `options` - The options object.\n // * `show_number` - Show number of measures string or not.\n // * `number_line` - Staff line to render the number of measures string.\n // * `number_glyph_point` - Size of the number of measures string glyphs.\n // * `padding_left` - Left padding from stave x.\n // * `padding_right` - Right padding from stave end x.\n // * `line` - Staff line to render rest line or rest symbols.\n // * `spacing_between_lines_px` - Spacing between staff lines to\n // resolve serif height or {2-bar and 4-bar}rest symbol height.\n // * `line_thickness` - Rest line thickness.\n // * `serif_thickness` - Rest serif line thickness.\n // * `use_symbols` - Use rest symbols or not.\n // * `symbol_spacing` - Spacing between each rest symbol glyphs.\n // * `semibrave_rest_glyph_scale` - Size of the semibrave(1-bar) rest symbol.\n constructor(number_of_measures, options) {\n super();\n this.setAttribute('type', 'MultiMeasureRest');\n\n this.render_options = {\n show_number: true,\n number_line: -0.5,\n number_glyph_point: 40, // same as TimeSignature.\n\n padding_left: undefined,\n padding_right: undefined,\n\n line: 2,\n\n spacing_between_lines_px: 10, // same as Stave.\n\n line_thickness: undefined,\n serif_thickness: 2,\n\n use_symbols: false,\n symbol_spacing: undefined,\n\n /* same as NoteHead. */\n semibrave_rest_glyph_scale: Flow.DEFAULT_NOTATION_FONT_SCALE,\n };\n Vex.Merge(this.render_options, options);\n\n this.number_of_measures = number_of_measures;\n this.xs = {\n left: NaN,\n right: NaN,\n };\n }\n\n getXs() {\n return this.xs;\n }\n\n setStave(stave) {\n this.stave = stave;\n return this;\n }\n\n getStave() {\n return this.stave;\n }\n\n drawLine(ctx, left, right, sbl) {\n const y = this.stave.getYForLine(this.render_options.line);\n const padding = (right - left) * 0.1;\n\n left += padding;\n right -= padding;\n\n const serif = {\n thickness: this.render_options.serif_thickness,\n height: sbl,\n };\n let lineThicknessHalf = sbl * 0.25;\n if (!isNaN(this.render_options.line_thickness)) {\n lineThicknessHalf = this.render_options.line_thickness * 0.5;\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left, y - sbl);\n ctx.lineTo(left + serif.thickness, y - sbl);\n ctx.lineTo(left + serif.thickness, y - lineThicknessHalf);\n ctx.lineTo(right - serif.thickness, y - lineThicknessHalf);\n ctx.lineTo(right - serif.thickness, y - sbl);\n ctx.lineTo(right, y - sbl);\n ctx.lineTo(right, y + sbl);\n ctx.lineTo(right - serif.thickness, y + sbl);\n ctx.lineTo(right - serif.thickness, y + lineThicknessHalf);\n ctx.lineTo(left + serif.thickness, y + lineThicknessHalf);\n ctx.lineTo(left + serif.thickness, y + sbl);\n ctx.lineTo(left, y + sbl);\n ctx.closePath();\n ctx.fill();\n }\n\n drawSymbols(ctx, left, right, sbl) {\n const n4 = Math.floor(this.number_of_measures / 4);\n const n = this.number_of_measures % 4;\n const n2 = Math.floor(n / 2);\n const n1 = n % 2;\n\n const semibrave_rest = get_semibrave_rest();\n const semibrave_rest_width = semibrave_rest.width *\n (this.render_options.semibrave_rest_glyph_scale / semibrave_rest.glyph_font_scale);\n const glyphs = {\n 2: {\n width: semibrave_rest_width * 0.5,\n height: sbl,\n },\n 1: {\n width: semibrave_rest_width,\n },\n };\n\n let spacing = semibrave_rest_width * 1.35;\n if (!isNaN(this.render_options.symbol_spacing)) {\n spacing = this.render_options.symbol_spacing;\n }\n\n const width = (n4 * glyphs[2].width) + (n2 * glyphs[2].width)\n + (n1 * glyphs[1].width) + ((n4 + n2 + n1 - 1) * spacing);\n let x = left + ((right - left) * 0.5) - (width * 0.5);\n const yTop = this.stave.getYForLine(this.render_options.line - 1);\n const yMiddle = this.stave.getYForLine(this.render_options.line);\n const yBottom = this.stave.getYForLine(this.render_options.line + 1);\n\n ctx.save();\n ctx.setStrokeStyle('none');\n ctx.setLineWidth(0);\n\n for (let i = 0; i < n4; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n2; ++i) {\n ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n x += glyphs[2].width + spacing;\n }\n for (let i = 0; i < n1; ++i) {\n Glyph.renderGlyph(ctx, x, yTop, this.render_options.semibrave_rest_glyph_scale,\n semibrave_rest.glyph_code);\n x += glyphs[1].width + spacing;\n }\n\n ctx.restore();\n }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n const ctx = this.context;\n const stave = this.stave;\n const sbl = this.render_options.spacing_between_lines_px;\n\n let left = stave.getNoteStartX();\n let right = stave.getNoteEndX();\n\n // FIXME: getNoteStartX() returns x+5(barline width) and\n // getNoteEndX() returns x + width(no barline width) by default. how to fix?\n const begModifiers = stave.getModifiers(StaveModifier.Position.BEGIN);\n if (begModifiers.length === 1 && begModifiers[0].getCategory() === 'barlines') {\n left -= begModifiers[0].getWidth();\n }\n\n if (!isNaN(this.render_options.padding_left)) {\n left = stave.getX() + this.render_options.padding_left;\n }\n\n if (!isNaN(this.render_options.padding_right)) {\n right = stave.getX() + stave.getWidth() - this.render_options.padding_right;\n }\n\n this.xs.left = left;\n this.xs.right = right;\n\n if (this.render_options.use_symbols) {\n this.drawSymbols(ctx, left, right, sbl);\n } else {\n this.drawLine(ctx, left, right, sbl);\n }\n\n if (this.render_options.show_number) {\n const timeSpec = '/' + this.number_of_measures;\n const timeSig = new TimeSignature(null, undefined, false);\n timeSig.point = this.render_options.number_glyph_point;\n timeSig.setTimeSig(timeSpec);\n timeSig.setStave(stave);\n timeSig.x = left + ((right - left) * 0.5) - (timeSig.timeSig.glyph.getMetrics().width * 0.5);\n timeSig.bottomLine = this.render_options.number_line;\n timeSig.setContext(ctx).draw();\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Copyright Mohit Muthanna 2010\n//\n// Author Taehoon Moon 2014\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\n\n/** @constructor */\nexport class ClefNote extends Note {\n static get CATEGORY() { return 'clefnote'; }\n\n constructor(type, size, annotation) {\n super({ duration: 'b' });\n this.setAttribute('type', 'ClefNote');\n\n this.setType(type, size, annotation);\n\n // Note properties\n this.ignore_ticks = true;\n }\n\n setType(type, size, annotation) {\n this.type = type;\n this.clef_obj = new Clef(type, size, annotation);\n this.clef = this.clef_obj.clef;\n this.glyph = new Glyph(this.clef.code, this.clef.point);\n this.setWidth(this.glyph.getMetrics().width);\n return this;\n }\n\n getClef() {\n return this.clef;\n }\n\n setContext(context) {\n this.context = context;\n this.glyph.setContext(this.context);\n return this;\n }\n\n getBoundingBox() {\n return super.getBoundingBox();\n }\n\n addToModifierContext() {\n /* overridden to ignore */\n return this;\n }\n\n getCategory() { return ClefNote.CATEGORY; }\n\n preFormat() {\n this.setPreFormatted(true);\n return this;\n }\n\n draw() {\n if (!this.stave) throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n\n if (!this.glyph.getContext()) {\n this.glyph.setContext(this.context);\n }\n\n this.setRendered();\n const abs_x = this.getAbsoluteX();\n\n this.glyph.setStave(this.stave);\n this.glyph.setYShift(\n this.stave.getYForLine(this.clef.line) - this.stave.getYForGlyphs());\n this.glyph.renderToStave(abs_x);\n\n // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n if (this.clef_obj.annotation !== undefined) {\n const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n if (!attachment.getContext()) {\n attachment.setContext(this.context);\n }\n attachment.setStave(this.stave);\n attachment.setYShift(\n this.stave.getYForLine(this.clef_obj.annotation.line) - this.stave.getYForGlyphs());\n attachment.setXShift(this.clef_obj.annotation.x_shift);\n attachment.renderToStave(abs_x);\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\n\nimport { Note } from './note';\nimport { KeySignature } from './keysignature';\n\nexport class KeySigNote extends Note {\n constructor(keySpec, cancelKeySpec, alterKeySpec) {\n super({ duration: 'b' });\n this.setAttribute('type', 'KeySigNote');\n\n this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n\n // Note properties\n this.ignore_ticks = true;\n }\n\n getBoundingBox() {\n return super.getBoundingBox();\n }\n\n addToModifierContext() {\n /* overridden to ignore */\n return this;\n }\n\n preFormat() {\n this.setPreFormatted(true);\n this.keySignature.setStave(this.stave);\n this.keySignature.format();\n this.setWidth(this.keySignature.width);\n return this;\n }\n\n draw() {\n this.stave.checkContext();\n this.setRendered();\n this.keySignature.x = this.getAbsoluteX();\n this.keySignature.setContext(this.context);\n this.keySignature.draw();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\n\nexport class TimeSigNote extends Note {\n constructor(timeSpec, customPadding) {\n super({ duration: 'b' });\n this.setAttribute('type', 'TimeSigNote');\n\n const timeSignature = new TimeSignature(timeSpec, customPadding);\n this.timeSig = timeSignature.getTimeSig();\n this.setWidth(this.timeSig.glyph.getMetrics().width);\n\n // Note properties\n this.ignore_ticks = true;\n }\n\n getBoundingBox() {\n return super.getBoundingBox();\n }\n\n addToModifierContext() {\n /* overridden to ignore */\n return this;\n }\n\n preFormat() {\n this.setPreFormatted(true);\n return this;\n }\n\n draw() {\n this.stave.checkContext();\n this.setRendered();\n\n if (!this.timeSig.glyph.getContext()) {\n this.timeSig.glyph.setContext(this.context);\n }\n\n this.timeSig.glyph.setStave(this.stave);\n this.timeSig.glyph.setYShift(\n this.stave.getYForLine(this.timeSig.line) - this.stave.getYForGlyphs());\n this.timeSig.glyph.renderToStave(this.getAbsoluteX());\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\n\nimport { Vex } from './vex';\nimport { TabTie } from './tabtie';\n\nexport class TabSlide extends TabTie {\n static get SLIDE_UP() {\n return 1;\n }\n static get SLIDE_DOWN() {\n return -1;\n }\n\n static createSlideUp(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_UP);\n }\n\n static createSlideDown(notes) {\n return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n }\n\n constructor(notes, direction) {\n /**\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * first_indices: [n1, n2, n3],\n * last_indices: [n1, n2, n3]\n * }\n *\n **/\n super(notes, 'sl.');\n this.setAttribute('type', 'TabSlide');\n\n if (!direction) {\n const first_fret = notes.first_note.getPositions()[0].fret;\n const last_fret = notes.last_note.getPositions()[0].fret;\n\n direction = ((parseInt(first_fret, 10) > parseInt(last_fret, 10)) ?\n TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP);\n }\n\n this.slide_direction = direction;\n this.render_options.cp1 = 11;\n this.render_options.cp2 = 14;\n this.render_options.y_shift = 0.5;\n\n this.setFont({ font: 'Times', size: 10, style: 'bold italic' });\n this.setNotes(notes);\n }\n\n renderTie(params) {\n if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n throw new Vex.RERR('BadArguments', 'No Y-values to render');\n }\n\n const ctx = this.context;\n const first_x_px = params.first_x_px;\n const first_ys = params.first_ys;\n const last_x_px = params.last_x_px;\n\n const direction = this.slide_direction;\n if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n throw new Vex.RERR('BadSlide', 'Invalid slide direction');\n }\n\n for (let i = 0; i < this.first_indices.length; ++i) {\n const slide_y = first_ys[this.first_indices[i]] +\n this.render_options.y_shift;\n\n if (isNaN(slide_y)) {\n throw new Vex.RERR('BadArguments', 'Bad indices for slide rendering.');\n }\n\n ctx.beginPath();\n ctx.moveTo(first_x_px, slide_y + (3 * direction));\n ctx.lineTo(last_x_px, slide_y - (3 * direction));\n ctx.closePath();\n ctx.stroke();\n }\n\n this.setRendered();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Flow } from './tables';\n\nexport class GraceNote extends StaveNote {\n static get CATEGORY() { return 'gracenotes'; }\n static get LEDGER_LINE_OFFSET() { return 2; }\n static get SCALE() { return 0.66; }\n\n constructor(note_struct) {\n super(Object.assign(note_struct, {\n glyph_font_scale: Flow.DEFAULT_NOTATION_FONT_SCALE * GraceNote.SCALE,\n stroke_px: GraceNote.LEDGER_LINE_OFFSET,\n }));\n this.setAttribute('type', 'GraceNote');\n\n this.slash = note_struct.slash;\n this.slur = true;\n\n this.buildNoteHeads();\n\n this.width = 3;\n }\n\n getStemExtension() {\n if (this.stem_extension_override != null) {\n return this.stem_extension_override;\n }\n\n const glyph = this.getGlyph();\n if (glyph) {\n let ret = super.getStemExtension();\n if (glyph.stem) {\n const staveNoteScale = this.getStaveNoteScale();\n ret = ((Stem.HEIGHT + ret) * staveNoteScale) - Stem.HEIGHT;\n }\n return ret;\n }\n\n return 0;\n }\n\n getCategory() { return GraceNote.CATEGORY; }\n\n // FIXME: move this to more basic class.\n getStaveNoteScale() {\n return this.render_options.glyph_font_scale / Flow.DEFAULT_NOTATION_FONT_SCALE;\n }\n\n draw() {\n super.draw();\n this.setRendered();\n const stem = this.stem;\n if (this.slash && stem) {\n const staveNoteScale = this.getStaveNoteScale();\n\n // some magic numbers are based on the staveNoteScale 0.66.\n const offsetScale = staveNoteScale / 0.66;\n let slashBBox = undefined;\n const beam = this.beam;\n if (beam) {\n // FIXME: should render slash after beam?\n if (!beam.postFormatted) {\n beam.postFormat();\n }\n\n slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale,\n 8 * offsetScale,\n {\n stem: 6 * offsetScale,\n beam: 5 * offsetScale,\n });\n } else {\n const stem_direction = this.getStemDirection();\n const noteHeadBounds = this.getNoteHeadBounds();\n const noteStemHeight = stem.getHeight();\n let x = this.getAbsoluteX();\n let y = stem_direction === Flow.Stem.DOWN ?\n noteHeadBounds.y_top - noteStemHeight :\n noteHeadBounds.y_bottom - noteStemHeight;\n\n const defaultStemExtention = stem_direction === Flow.Stem.DOWN ?\n this.glyph.stem_down_extension :\n this.glyph.stem_up_extension;\n\n let defaultOffsetY = Flow.STEM_HEIGHT;\n defaultOffsetY -= (defaultOffsetY / 2.8);\n defaultOffsetY += defaultStemExtention;\n y += ((defaultOffsetY * staveNoteScale) * stem_direction);\n\n const offsets = stem_direction === Flow.Stem.UP ? {\n x1: 1,\n y1: 0,\n x2: 13,\n y2: -9,\n } : {\n x1: -4,\n y1: 1,\n x2: 13,\n y2: 9,\n };\n\n x += (offsets.x1 * offsetScale);\n y += (offsets.y1 * offsetScale);\n slashBBox = {\n x1: x,\n y1: y,\n x2: x + (offsets.x2 * offsetScale),\n y2: y + (offsets.y2 * offsetScale),\n };\n }\n\n // FIXME: avoide staff lines, leadger lines or others.\n\n const ctx = this.context;\n ctx.save();\n ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n ctx.beginPath();\n ctx.moveTo(slashBBox.x1, slashBBox.y1);\n ctx.lineTo(slashBBox.x2, slashBBox.y2);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n }\n }\n\n calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n const beam = this.beam;\n const beam_slope = beam.slope;\n const isBeamEndNote = (beam.notes[beam.notes.length - 1] === this);\n const scaleX = isBeamEndNote ? -1 : 1;\n const beam_angle = Math.atan(beam_slope * scaleX);\n\n // slash line intersecting point on beam.\n const iPointOnBeam = {\n dx: Math.cos(beam_angle) * slashBeamOffset,\n dy: Math.sin(beam_angle) * slashBeamOffset,\n };\n\n slashStemOffset *= this.getStemDirection();\n const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n\n const stemX = this.getStemX();\n const stem0X = beam.notes[0].getStemX();\n const stemY = this.beam.getBeamYToDraw() + ((stemX - stem0X) * beam_slope);\n\n const ret = {\n x1: stemX - protrusion_stem_dx,\n y1: (stemY + slashStemOffset - protrusion_stem_dy),\n x2: stemX + (iPointOnBeam.dx * scaleX) + protrusion_beam_dx,\n y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n };\n return ret;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { TabNote } from './tabnote';\n\nexport class GraceTabNote extends TabNote {\n static get CATEGORY() { return 'gracetabnotes'; }\n\n constructor(note_struct) {\n super(note_struct, false);\n this.setAttribute('type', 'GraceTabNote');\n\n Vex.Merge(this.render_options, {\n // vertical shift from stave line\n y_shift: 0.3,\n // grace glyph scale\n scale: 0.6,\n // grace tablature font\n font: '7.5pt Arial',\n });\n\n this.updateWidth();\n }\n\n getCategory() { return GraceTabNote.CATEGORY; }\n\n draw() {\n super.draw();\n this.setRendered();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of tunings for tablature.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\n\nexport class Tuning {\n static get names() {\n return {\n 'standard': 'E/5,B/4,G/4,D/4,A/3,E/3',\n 'dagdad': 'D/5,A/4,G/4,D/4,A/3,D/3',\n 'dropd': 'E/5,B/4,G/4,D/4,A/3,D/3',\n 'eb': 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n 'standardBanjo': 'D/5,B/4,G/4,D/4,G/5',\n };\n }\n\n constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n // Default to standard tuning.\n this.setTuning(tuningString);\n }\n\n noteToInteger(noteString) {\n return Flow.keyProperties(noteString).int_value;\n }\n\n setTuning(noteString) {\n if (Tuning.names[noteString]) {\n noteString = Tuning.names[noteString];\n }\n\n this.tuningString = noteString;\n this.tuningValues = [];\n this.numStrings = 0;\n\n const keys = noteString.split(/\\s*,\\s*/);\n if (keys.length === 0) {\n throw new Vex.RERR('BadArguments', 'Invalid tuning string: ' + noteString);\n }\n\n this.numStrings = keys.length;\n for (let i = 0; i < this.numStrings; ++i) {\n this.tuningValues[i] = this.noteToInteger(keys[i]);\n }\n }\n\n getValueForString(stringNum) {\n const s = parseInt(stringNum, 10);\n if (s < 1 || s > this.numStrings) {\n throw new Vex.RERR(\n 'BadArguments', `String number must be between 1 and ${this.numStrings}:${stringNum}`\n );\n }\n\n return this.tuningValues[s - 1];\n }\n\n getValueForFret(fretNum, stringNum) {\n const stringValue = this.getValueForString(stringNum);\n const f = parseInt(fretNum, 10);\n\n if (f < 0) {\n throw new Vex.RERR('BadArguments', 'Fret number must be 0 or higher: ' +\n fretNum);\n }\n\n return stringValue + f;\n }\n\n getNoteForFret(fretNum, stringNum) {\n const noteValue = this.getValueForFret(fretNum, stringNum);\n\n const octave = Math.floor(noteValue / 12);\n const value = noteValue % 12;\n\n return Flow.integerToNote(value) + '/' + octave;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class by Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either Crescendo or Descrescendo.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Modifier } from './modifier';\n\nexport class StaveHairpin extends Element {\n static get type() {\n return {\n CRESC: 1,\n DECRESC: 2,\n };\n }\n\n /* Helper function to convert ticks into pixels.\n * Requires a Formatter with voices joined and formatted (to\n * get pixels per tick)\n *\n * options is struct that has:\n *\n * {\n * height: px,\n * y_shift: px, //vertical offset\n * left_shift_ticks: 0, //left horizontal offset expressed in ticks\n * right_shift_ticks: 0 // right horizontal offset expressed in ticks\n * }\n *\n **/\n static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n const ppt = formatter.pixelsPerTick;\n\n if (ppt == null) {\n throw new Vex.RuntimeError(\n 'BadArguments',\n 'A valid Formatter must be provide to draw offsets by ticks.'\n );\n }\n\n const l_shift_px = ppt * options.left_shift_ticks;\n const r_shift_px = ppt * options.right_shift_ticks;\n\n const hairpin_options = {\n height: options.height,\n y_shift: options.y_shift,\n left_shift_px: l_shift_px,\n right_shift_px: r_shift_px };\n\n new StaveHairpin({\n first_note: notes.first_note,\n last_note: notes.last_note,\n }, type)\n .setContext(ctx)\n .setRenderOptions(hairpin_options)\n .setPosition(position)\n .draw();\n }\n\n /**\n * Create a new hairpin from the specified notes.\n *\n * @constructor\n * @param {!Object} notes The notes to tie up.\n * @param {!Object} type The type of hairpin\n */\n constructor(notes, type) {\n /**\n * Notes is a struct that has:\n *\n * {\n * first_note: Note,\n * last_note: Note,\n * }\n *\n **/\n super();\n this.setAttribute('type', 'StaveHairpin');\n this.notes = notes;\n this.hairpin = type;\n this.position = Modifier.Position.BELOW;\n\n this.render_options = {\n height: 10,\n y_shift: 0, // vertical offset\n left_shift_px: 0, // left horizontal offset\n right_shift_px: 0, // right horizontal offset\n };\n\n this.setNotes(notes);\n }\n\n setPosition(position) {\n if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n this.position = position;\n }\n return this;\n }\n\n setRenderOptions(options) {\n if (\n options.height != null &&\n options.y_shift != null &&\n options.left_shift_px != null &&\n options.right_shift_px != null\n ) {\n this.render_options = options;\n }\n return this;\n }\n\n /**\n * Set the notes to attach this hairpin to.\n *\n * @param {!Object} notes The start and end notes.\n */\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new Vex.RuntimeError(\n 'BadArguments',\n 'Hairpin needs to have either first_note or last_note set.'\n );\n }\n\n // Success. Lets grab 'em notes.\n this.first_note = notes.first_note;\n this.last_note = notes.last_note;\n return this;\n }\n\n renderHairpin(params) {\n const ctx = this.checkContext();\n let dis = this.render_options.y_shift + 20;\n let y_shift = params.first_y;\n\n if (this.position === Modifier.Position.ABOVE) {\n dis = -dis + 30;\n y_shift = params.first_y - params.staff_height;\n }\n\n const l_shift = this.render_options.left_shift_px;\n const r_shift = this.render_options.right_shift_px;\n\n ctx.beginPath();\n\n switch (this.hairpin) {\n case StaveHairpin.type.CRESC:\n ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + (this.render_options.height / 2) + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n break;\n case StaveHairpin.type.DECRESC:\n ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n ctx.lineTo(params.last_x + r_shift, y_shift + (this.render_options.height / 2) + dis);\n ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n break;\n default:\n // Default is NONE, so nothing to draw\n break;\n }\n\n ctx.stroke();\n ctx.closePath();\n }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n const firstNote = this.first_note;\n const lastNote = this.last_note;\n\n const start = firstNote.getModifierStartXY(this.position, 0);\n const end = lastNote.getModifierStartXY(this.position, 0);\n\n this.renderHairpin({\n first_x: start.x,\n last_x: end.x,\n first_y: firstNote.getStave().y + firstNote.getStave().height,\n last_y: lastNote.getStave().y + lastNote.getStave().height,\n staff_height: firstNote.getStave().height,\n });\n return true;\n }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\n\nimport { Vex } from './vex';\nimport { Element } from './element';\n\nexport class Curve extends Element {\n static get Position() {\n return {\n NEAR_HEAD: 1,\n NEAR_TOP: 2,\n };\n }\n\n static get PositionString() {\n return {\n nearHead: Curve.Position.NEAR_HEAD,\n nearTop: Curve.Position.NEAR_TOP,\n };\n }\n\n // from: Start note\n // to: End note\n // options:\n // cps: List of control points\n // x_shift: pixels to shift\n // y_shift: pixels to shift\n constructor(from, to, options) {\n super();\n this.setAttribute('type', 'Curve');\n\n this.render_options = {\n spacing: 2,\n thickness: 2,\n x_shift: 0,\n y_shift: 10,\n position: Curve.Position.NEAR_HEAD,\n position_end: Curve.Position.NEAR_HEAD,\n invert: false,\n cps: [{ x: 0, y: 10 }, { x: 0, y: 10 }],\n };\n\n Vex.Merge(this.render_options, options);\n this.setNotes(from, to);\n }\n\n setNotes(from, to) {\n if (!from && !to) {\n throw new Vex.RuntimeError(\n 'BadArguments', 'Curve needs to have either first_note or last_note set.'\n );\n }\n\n this.from = from;\n this.to = to;\n return this;\n }\n\n /**\n * @return {boolean} Returns true if this is a partial bar.\n */\n isPartial() {\n return (!this.from || !this.to);\n }\n\n renderCurve(params) {\n const ctx = this.context;\n const cps = this.render_options.cps;\n\n const x_shift = this.render_options.x_shift;\n const y_shift = this.render_options.y_shift * params.direction;\n\n const first_x = params.first_x + x_shift;\n const first_y = params.first_y + y_shift;\n const last_x = params.last_x - x_shift;\n const last_y = params.last_y + y_shift;\n const thickness = this.render_options.thickness;\n\n const cp_spacing = (last_x - first_x) / (cps.length + 2);\n\n ctx.beginPath();\n ctx.moveTo(first_x, first_y);\n ctx.bezierCurveTo(\n first_x + cp_spacing + cps[0].x,\n first_y + (cps[0].y * params.direction),\n last_x - cp_spacing + cps[1].x,\n last_y + (cps[1].y * params.direction),\n last_x,\n last_y\n );\n ctx.bezierCurveTo(\n last_x - cp_spacing + cps[1].x,\n last_y + ((cps[1].y + thickness) * params.direction),\n first_x + cp_spacing + cps[0].x,\n first_y + ((cps[0].y + thickness) * params.direction),\n first_x,\n first_y\n );\n ctx.stroke();\n ctx.closePath();\n ctx.fill();\n }\n\n draw() {\n this.checkContext();\n this.setRendered();\n\n const first_note = this.from;\n const last_note = this.to;\n let first_x;\n let last_x;\n let first_y;\n let last_y;\n let stem_direction;\n\n let metric = 'baseY';\n let end_metric = 'baseY';\n\n function getPosition(position) {\n return typeof(position) === 'string'\n ? Curve.PositionString[position]\n : position;\n }\n const position = getPosition(this.render_options.position);\n const position_end = getPosition(this.render_options.position_end);\n\n if (position === Curve.Position.NEAR_TOP) {\n metric = 'topY';\n end_metric = 'topY';\n }\n\n if (position_end === Curve.Position.NEAR_HEAD) {\n end_metric = 'baseY';\n } else if (position_end === Curve.Position.NEAR_TOP) {\n end_metric = 'topY';\n }\n\n if (first_note) {\n first_x = first_note.getTieRightX();\n stem_direction = first_note.getStemDirection();\n first_y = first_note.getStemExtents()[metric];\n } else {\n first_x = last_note.getStave().getTieStartX();\n first_y = last_note.getStemExtents()[metric];\n }\n\n if (last_note) {\n last_x = last_note.getTieLeftX();\n stem_direction = last_note.getStemDirection();\n last_y = last_note.getStemExtents()[end_metric];\n } else {\n last_x = first_note.getStave().getTieEndX();\n last_y = first_note.getStemExtents()[end_metric];\n }\n\n this.renderCurve({\n first_x,\n last_x,\n first_y,\n last_y,\n direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n });\n return true;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `TextDynamics` which renders traditional\n// text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n//\n// You can render any dynamics string that contains a combination of\n// the following letters: P, M, F, Z, R, S\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`.\nfunction L(...args) { if (TextDynamics.DEBUG) Vex.L('Vex.Flow.TextDynamics', args); }\n\nexport class TextDynamics extends Note {\n // The glyph data for each dynamics letter\n static get GLYPHS() {\n return {\n 'f': {\n code: 'vba',\n width: 12,\n },\n 'p': {\n code: 'vbf',\n width: 14,\n },\n 'm': {\n code: 'v62',\n width: 17,\n },\n 's': {\n code: 'v4a',\n width: 10,\n },\n 'z': {\n code: 'v80',\n width: 12,\n },\n 'r': {\n code: 'vb1',\n width: 12,\n },\n };\n }\n\n // A `TextDynamics` object inherits from `Note` so that it can be formatted\n // within a `Voice`.\n // Create the dynamics marking. `text_struct` is an object\n // that contains a `duration` property and a `sequence` of\n // letters that represents the letters to render\n constructor(text_struct) {\n super(text_struct);\n this.setAttribute('type', 'TextDynamics');\n\n this.sequence = text_struct.text.toLowerCase();\n this.line = text_struct.line || 0;\n this.glyphs = [];\n\n Vex.Merge(this.render_options, {\n glyph_font_size: 40,\n });\n\n L('New Dynamics Text: ', this.sequence);\n }\n\n // Set the Stave line on which the note should be placed\n setLine(line) {\n this.line = line;\n return this;\n }\n\n // Preformat the dynamics text\n preFormat() {\n let total_width = 0;\n // Iterate through each letter\n this.sequence.split('').forEach(letter => {\n // Get the glyph data for the letter\n const glyph_data = TextDynamics.GLYPHS[letter];\n if (!glyph_data) throw new Vex.RERR('Invalid dynamics character: ' + letter);\n\n const size = this.render_options.glyph_font_size;\n const glyph = new Glyph(glyph_data.code, size);\n\n // Add the glyph\n this.glyphs.push(glyph);\n\n total_width += glyph_data.width;\n });\n\n // Store the width of the text\n this.setWidth(total_width);\n this.preFormatted = true;\n return this;\n }\n\n // Draw the dynamics text on the rendering context\n draw() {\n this.setRendered();\n const x = this.getAbsoluteX();\n const y = this.stave.getYForLine(this.line + (-3));\n\n L('Rendering Dynamics: ', this.sequence);\n\n let letter_x = x;\n this.glyphs.forEach((glyph, index) => {\n const current_letter = this.sequence[index];\n glyph.render(this.context, letter_x, y);\n letter_x += TextDynamics.GLYPHS[current_letter].width;\n });\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\n\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n // all cases do this.\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(x0, y0);\n ctx.closePath();\n\n ctx.fill();\n}\n\n// Helper function to draw a line with arrow heads\nfunction drawArrowLine(ctx, point1, point2, config) {\n const both_arrows = config.draw_start_arrow && config.draw_end_arrow;\n\n const x1 = point1.x;\n const y1 = point1.y;\n const x2 = point2.x;\n const y2 = point2.y;\n\n // For ends with arrow we actually want to stop before we get to the arrow\n // so that wide lines won't put a flat end on the arrow.\n const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n const ratio = (distance - config.arrowhead_length / 3) / distance;\n let end_x;\n let end_y;\n let start_x;\n let start_y;\n if (config.draw_end_arrow || both_arrows) {\n end_x = Math.round(x1 + (x2 - x1) * ratio);\n end_y = Math.round(y1 + (y2 - y1) * ratio);\n } else {\n end_x = x2;\n end_y = y2;\n }\n\n if (config.draw_start_arrow || both_arrows) {\n start_x = x1 + (x2 - x1) * (1 - ratio);\n start_y = y1 + (y2 - y1) * (1 - ratio);\n } else {\n start_x = x1;\n start_y = y1;\n }\n\n if (config.color) {\n ctx.setStrokeStyle(config.color);\n ctx.setFillStyle(config.color);\n }\n\n // Draw the shaft of the arrow\n ctx.beginPath();\n ctx.moveTo(start_x, start_y);\n ctx.lineTo(end_x, end_y);\n ctx.stroke();\n ctx.closePath();\n\n // calculate the angle of the line\n const line_angle = Math.atan2(y2 - y1, x2 - x1);\n // h is the line length of a side of the arrow head\n const h = Math.abs(config.arrowhead_length / Math.cos(config.arrowhead_angle));\n\n let angle1;\n let angle2;\n let top_x;\n let top_y;\n let bottom_x;\n let bottom_y;\n\n if (config.draw_end_arrow || both_arrows) {\n angle1 = line_angle + Math.PI + config.arrowhead_angle;\n top_x = x2 + Math.cos(angle1) * h;\n top_y = y2 + Math.sin(angle1) * h;\n\n angle2 = line_angle + Math.PI - config.arrowhead_angle;\n bottom_x = x2 + Math.cos(angle2) * h;\n bottom_y = y2 + Math.sin(angle2) * h;\n\n drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n }\n\n if (config.draw_start_arrow || both_arrows) {\n angle1 = line_angle + config.arrowhead_angle;\n top_x = x1 + Math.cos(angle1) * h;\n top_y = y1 + Math.sin(angle1) * h;\n\n angle2 = line_angle - config.arrowhead_angle;\n bottom_x = x1 + Math.cos(angle2) * h;\n bottom_y = y1 + Math.sin(angle2) * h;\n\n drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n }\n}\n\nexport class StaveLine extends Element {\n // Text Positioning\n static get TextVerticalPosition() {\n return {\n TOP: 1,\n BOTTOM: 2,\n };\n }\n\n static get TextJustification() {\n return {\n LEFT: 1,\n CENTER: 2,\n RIGHT: 3,\n };\n }\n\n // Initialize the StaveLine with the given `notes`.\n //\n // `notes` is a struct that has:\n //\n // ```\n // {\n // first_note: Note,\n // last_note: Note,\n // first_indices: [n1, n2, n3],\n // last_indices: [n1, n2, n3]\n // }\n // ```\n constructor(notes) {\n super();\n this.setAttribute('type', 'StaveLine');\n\n this.notes = notes;\n\n this.text = '';\n\n this.font = {\n family: 'Arial',\n size: 10,\n weight: '',\n };\n\n this.render_options = {\n // Space to add to the left or the right\n padding_left: 4,\n padding_right: 3,\n\n // The width of the line in pixels\n line_width: 1,\n // An array of line/space lengths. Unsupported with Raphael (SVG)\n line_dash: null,\n // Can draw rounded line end, instead of a square. Unsupported with Raphael (SVG)\n rounded_end: true,\n // The color of the line and arrowheads\n color: null,\n\n // Flags to draw arrows on each end of the line\n draw_start_arrow: false,\n draw_end_arrow: false,\n\n // The length of the arrowhead sides\n arrowhead_length: 10,\n // The angle of the arrowhead\n arrowhead_angle: Math.PI / 8,\n\n // The position of the text\n text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n text_justification: StaveLine.TextJustification.CENTER,\n };\n\n this.setNotes(notes);\n }\n\n // Set the font for the `StaveLine` text\n setFont(font) { this.font = font; return this; }\n // The the annotation for the `StaveLine`\n setText(text) { this.text = text; return this; }\n\n // Set the notes for the `StaveLine`\n setNotes(notes) {\n if (!notes.first_note && !notes.last_note) {\n throw new Vex.RuntimeError(\n 'BadArguments', 'Notes needs to have either first_note or last_note set.'\n );\n }\n\n if (!notes.first_indices) notes.first_indices = [0];\n if (!notes.last_indices) notes.last_indices = [0];\n\n if (notes.first_indices.length !== notes.last_indices.length) {\n throw new Vex.RuntimeError(\n 'BadArguments', 'Connected notes must have similar index sizes'\n );\n }\n\n // Success. Lets grab 'em notes.\n this.first_note = notes.first_note;\n this.first_indices = notes.first_indices;\n this.last_note = notes.last_note;\n this.last_indices = notes.last_indices;\n return this;\n }\n\n // Apply the style of the `StaveLine` to the context\n applyLineStyle() {\n const ctx = this.checkContext();\n const render_options = this.render_options;\n\n if (render_options.line_dash) {\n ctx.setLineDash(render_options.line_dash);\n }\n\n if (render_options.line_width) {\n ctx.setLineWidth(render_options.line_width);\n }\n\n if (render_options.rounded_end) {\n ctx.setLineCap('round');\n } else {\n ctx.setLineCap('square');\n }\n }\n\n // Apply the text styling to the context\n applyFontStyle() {\n const ctx = this.checkContext();\n\n if (this.font) {\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n }\n\n if (this.render_options.color) {\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n }\n }\n\n // Renders the `StaveLine` on the context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n\n const first_note = this.first_note;\n const last_note = this.last_note;\n const render_options = this.render_options;\n\n ctx.save();\n this.applyLineStyle();\n\n // Cycle through each set of indices and draw lines\n let start_position;\n let end_position;\n this.first_indices.forEach((first_index, i) => {\n const last_index = this.last_indices[i];\n\n // Get initial coordinates for the start/end of the line\n start_position = first_note.getModifierStartXY(2, first_index);\n end_position = last_note.getModifierStartXY(1, last_index);\n const upwards_slope = start_position.y > end_position.y;\n\n // Adjust `x` coordinates for modifiers\n start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n\n\n // Adjust first `x` coordinates for displacements\n const notehead_width = first_note.getGlyph().getWidth();\n const first_displaced = first_note.getKeyProps()[first_index].displaced;\n if (first_displaced && first_note.getStemDirection() === 1) {\n start_position.x += notehead_width + render_options.padding_left;\n }\n\n // Adjust last `x` coordinates for displacements\n const last_displaced = last_note.getKeyProps()[last_index].displaced;\n if (last_displaced && last_note.getStemDirection() === -1) {\n end_position.x -= notehead_width + render_options.padding_right;\n }\n\n // Adjust y position better if it's not coming from the center of the note\n start_position.y += upwards_slope ? -3 : 1;\n end_position.y += upwards_slope ? 2 : 0;\n\n drawArrowLine(ctx, start_position, end_position, this.render_options);\n });\n\n ctx.restore();\n\n // Determine the x coordinate where to start the text\n const text_width = ctx.measureText(this.text).width;\n const justification = render_options.text_justification;\n let x = 0;\n if (justification === StaveLine.TextJustification.LEFT) {\n x = start_position.x;\n } else if (justification === StaveLine.TextJustification.CENTER) {\n const delta_x = (end_position.x - start_position.x);\n const center_x = (delta_x / 2) + start_position.x;\n x = center_x - (text_width / 2);\n } else if (justification === StaveLine.TextJustification.RIGHT) {\n x = end_position.x - text_width;\n }\n\n // Determine the y value to start the text\n let y;\n const vertical_position = render_options.text_position_vertical;\n if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n y = first_note.getStave().getYForTopText();\n } else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n y = first_note.getStave().getYForBottomText(Flow.TEXT_HEIGHT_OFFSET_HACK);\n }\n\n // Draw the text\n ctx.save();\n this.applyFontStyle();\n ctx.fillText(this.text, x, y);\n ctx.restore();\n\n return this;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements different types of pedal markings. These notation\n// elements indicate to the performer when to depress and release the a pedal.\n//\n// In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n// custom text for the release/depress pedal markings.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`.\nfunction L(...args) { if (PedalMarking.DEBUG) Vex.L('Vex.Flow.PedalMarking', args); }\n\n// Draws a pedal glyph with the provided `name` on a rendering `context`\n// at the coordinates `x` and `y. Takes into account the glyph data\n// coordinate shifts.\nfunction drawPedalGlyph(name, context, x, y, point) {\n const glyph_data = PedalMarking.GLYPHS[name];\n const glyph = new Glyph(glyph_data.code, point);\n glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n\nexport class PedalMarking extends Element {\n // Glyph data\n static get GLYPHS() {\n return {\n 'pedal_depress': {\n code: 'v36',\n x_shift: -10,\n y_shift: 0,\n },\n 'pedal_release': {\n code: 'v5d',\n x_shift: -2,\n y_shift: 3,\n },\n };\n }\n\n static get Styles() {\n return {\n TEXT: 1,\n BRACKET: 2,\n MIXED: 3,\n };\n }\n\n static get StylesString() {\n return {\n text: PedalMarking.Styles.TEXT,\n bracket: PedalMarking.Styles.BRACKET,\n mixed: PedalMarking.Styles.MIXED,\n };\n }\n\n // Create a sustain pedal marking. Returns the defaults PedalMarking.\n // Which uses the traditional \"Ped\" and \"*\"\" markings.\n static createSustain(notes) {\n const pedal = new PedalMarking(notes);\n return pedal;\n }\n\n // Create a sostenuto pedal marking\n static createSostenuto(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setStyle(PedalMarking.Styles.MIXED);\n pedal.setCustomText('Sost. Ped.');\n return pedal;\n }\n\n // Create an una corda pedal marking\n static createUnaCorda(notes) {\n const pedal = new PedalMarking(notes);\n pedal.setStyle(PedalMarking.Styles.TEXT);\n pedal.setCustomText('una corda', 'tre corda');\n return pedal;\n }\n\n // ## Prototype Methods\n constructor(notes) {\n super();\n this.setAttribute('type', 'PedalMarking');\n\n this.notes = notes;\n this.style = PedalMarking.TEXT;\n this.line = 0;\n\n // Custom text for the release/depress markings\n this.custom_depress_text = '';\n this.custom_release_text = '';\n\n this.font = {\n family: 'Times New Roman',\n size: 12,\n weight: 'italic bold',\n };\n\n this.render_options = {\n bracket_height: 10,\n text_margin_right: 6,\n bracket_line_width: 1,\n glyph_point_size: 40,\n color: 'black',\n };\n }\n\n // Set custom text for the `depress`/`release` pedal markings. No text is\n // set if the parameter is falsy.\n setCustomText(depress, release) {\n this.custom_depress_text = depress || '';\n this.custom_release_text = release || '';\n return this;\n }\n\n // Set the pedal marking style\n setStyle(style) {\n if (style < 1 && style > 3) {\n throw new Vex.RERR('InvalidParameter', 'The style must be one found in PedalMarking.Styles');\n }\n\n this.style = style;\n return this;\n }\n\n // Set the staff line to render the markings on\n setLine(line) { this.line = line; return this; }\n\n // Draw the bracket based pedal markings\n drawBracketed() {\n const ctx = this.context;\n let is_pedal_depressed = false;\n let prev_x;\n let prev_y;\n const pedal = this;\n\n // Iterate through each note\n this.notes.forEach((note, index, notes) => {\n // Each note triggers the opposite pedal action\n is_pedal_depressed = !is_pedal_depressed;\n\n // Get the initial coordinates for the note\n const x = note.getAbsoluteX();\n const y = note.getStave().getYForBottomText(pedal.line + 3);\n\n // Throw if current note is positioned before the previous note\n if (x < prev_x) {\n throw new Vex.RERR(\n 'InvalidConfiguration', 'The notes provided must be in order of ascending x positions'\n );\n }\n\n // Determine if the previous or next note are the same\n // as the current note. We need to keep track of this for\n // when adjustments are made for the release+depress action\n const next_is_same = notes[index + 1] === note;\n const prev_is_same = notes[index - 1] === note;\n\n let x_shift = 0;\n if (is_pedal_depressed) {\n // Adjustment for release+depress\n x_shift = prev_is_same ? 5 : 0;\n\n if (pedal.style === PedalMarking.Styles.MIXED && !prev_is_same) {\n // For MIXED style, start with text instead of bracket\n if (pedal.custom_depress_text) {\n // If we have custom text, use instead of the default \"Ped\" glyph\n const text_width = ctx.measureText(pedal.custom_depress_text).width;\n ctx.fillText(pedal.custom_depress_text, x - (text_width / 2), y);\n x_shift = (text_width / 2) + pedal.render_options.text_margin_right;\n } else {\n // Render the Ped glyph in position\n drawPedalGlyph('pedal_depress', ctx, x, y, pedal.render_options.glyph_point_size);\n x_shift = 20 + pedal.render_options.text_margin_right;\n }\n } else {\n // Draw start bracket\n ctx.beginPath();\n ctx.moveTo(x, y - pedal.render_options.bracket_height);\n ctx.lineTo(x + x_shift, y);\n ctx.stroke();\n ctx.closePath();\n }\n } else {\n // Adjustment for release+depress\n x_shift = next_is_same ? -5 : 0;\n\n // Draw end bracket\n ctx.beginPath();\n ctx.moveTo(prev_x, prev_y);\n ctx.lineTo(x + x_shift, y);\n ctx.lineTo(x, y - pedal.render_options.bracket_height);\n ctx.stroke();\n ctx.closePath();\n }\n\n // Store previous coordinates\n prev_x = x + x_shift;\n prev_y = y;\n });\n }\n\n // Draw the text based pedal markings. This defaults to the traditional\n // \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n drawText() {\n const ctx = this.context;\n let is_pedal_depressed = false;\n const pedal = this;\n\n // The glyph point size\n const point = pedal.render_options.glyph_point_size;\n\n // Iterate through each note, placing glyphs or custom text accordingly\n this.notes.forEach(note => {\n is_pedal_depressed = !is_pedal_depressed;\n const stave = note.getStave();\n const x = note.getAbsoluteX();\n const y = stave.getYForBottomText(pedal.line + 3);\n\n let text_width = 0;\n if (is_pedal_depressed) {\n if (pedal.custom_depress_text) {\n text_width = ctx.measureText(pedal.custom_depress_text).width;\n ctx.fillText(pedal.custom_depress_text, x - (text_width / 2), y);\n } else {\n drawPedalGlyph('pedal_depress', ctx, x, y, point);\n }\n } else {\n if (pedal.custom_release_text) {\n text_width = ctx.measureText(pedal.custom_release_text).width;\n ctx.fillText(pedal.custom_release_text, x - (text_width / 2), y);\n } else {\n drawPedalGlyph('pedal_release', ctx, x, y, point);\n }\n }\n });\n }\n\n // Render the pedal marking in position on the rendering context\n draw() {\n const ctx = this.checkContext();\n this.setRendered();\n\n ctx.save();\n ctx.setStrokeStyle(this.render_options.color);\n ctx.setFillStyle(this.render_options.color);\n ctx.setFont(this.font.family, this.font.size, this.font.weight);\n\n L('Rendering Pedal Marking');\n\n if (this.style === PedalMarking.Styles.BRACKET || this.style === PedalMarking.Styles.MIXED) {\n ctx.setLineWidth(this.render_options.bracket_line_width);\n this.drawBracketed();\n } else if (this.style === PedalMarking.Styles.TEXT) {\n this.drawText();\n }\n\n ctx.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implement `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Renderer } from './renderer';\n\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\nfunction L(...args) { if (TextBracket.DEBUG) Vex.L('Vex.Flow.TextBracket', args); }\n\nexport class TextBracket extends Element {\n // FIXME: Modifier.Position is singular while this is plural, make consistent\n static get Positions() {\n return {\n TOP: 1,\n BOTTOM: -1,\n };\n }\n\n static get PositionString() {\n return {\n top: TextBracket.Positions.TOP,\n bottom: TextBracket.Positions.BOTTOM,\n };\n }\n\n constructor({\n start,\n stop,\n text = '',\n superscript = '',\n position = TextBracket.Positions.TOP,\n }) {\n super();\n this.setAttribute('type', 'TextBracket');\n\n this.start = start;\n this.stop = stop;\n\n this.text = text;\n this.superscript = superscript;\n\n this.position = typeof position === 'string'\n ? TextBracket.PositionString[position]\n : position;\n\n this.line = 1;\n\n this.font = {\n family: 'Serif',\n size: 15,\n weight: 'italic',\n };\n\n this.render_options = {\n dashed: true,\n dash: [5],\n color: 'black',\n line_width: 1,\n show_bracket: true,\n bracket_height: 8,\n\n // In the BOTTOM position, the bracket line can extend\n // under the superscript.\n underline_superscript: true,\n };\n }\n\n // Apply the text backet styling to the provided `context`\n applyStyle(context) {\n // Apply style for the octave bracket\n context.setFont(this.font.family, this.font.size, this.font.weight);\n context.setStrokeStyle(this.render_options.color);\n context.setFillStyle(this.render_options.color);\n context.setLineWidth(this.render_options.line_width);\n\n return this;\n }\n\n // Set whether the bracket line should be `dashed`. You can also\n // optionally set the `dash` pattern by passing in an array of numbers\n setDashed(dashed, dash) {\n this.render_options.dashed = dashed;\n if (dash) this.render_options.dash = dash;\n return this;\n }\n\n // Set the font for the text\n setFont(font) {\n // We use Object.assign to support partial updates to the font object\n this.font = { ...this.font, ...font };\n return this;\n }\n // Set the rendering `context` for the octave bracket\n setLine(line) { this.line = line; return this; }\n\n // Draw the octave bracket on the rendering context\n draw() {\n const ctx = this.context;\n this.setRendered();\n\n let y = 0;\n switch (this.position) {\n case TextBracket.Positions.TOP:\n y = this.start.getStave().getYForTopText(this.line);\n break;\n case TextBracket.Positions.BOTTOM:\n y = this.start.getStave().getYForBottomText(this.line + Flow.TEXT_HEIGHT_OFFSET_HACK);\n break;\n default:\n throw new Vex.RERR('InvalidPosition', `The position ${this.position} is invalid`);\n }\n\n // Get the preliminary start and stop coordintates for the bracket\n const start = { x: this.start.getAbsoluteX(), y };\n const stop = { x: this.stop.getAbsoluteX(), y };\n\n L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n\n const bracket_height = this.render_options.bracket_height * this.position;\n\n ctx.save();\n this.applyStyle(ctx);\n\n // Draw text\n ctx.fillText(this.text, start.x, start.y);\n\n // Get the width and height for the octave number\n const main_width = ctx.measureText(this.text).width;\n const main_height = ctx.measureText('M').width;\n\n // Calculate the y position for the super script\n const super_y = start.y - (main_height / 2.5);\n\n // Draw the superscript\n ctx.setFont(this.font.family, this.font.size / 1.4, this.font.weight);\n ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n\n // Determine width and height of the superscript\n const superscript_width = ctx.measureText(this.superscript).width;\n const super_height = ctx.measureText('M').width;\n\n // Setup initial coordinates for the bracket line\n let start_x = start.x;\n let line_y = super_y;\n const end_x = stop.x + this.stop.getGlyph().getWidth();\n\n // Adjust x and y coordinates based on position\n if (this.position === TextBracket.Positions.TOP) {\n start_x += main_width + superscript_width + 5;\n line_y -= super_height / 2.7;\n } else if (this.position === TextBracket.Positions.BOTTOM) {\n line_y += super_height / 2.7;\n start_x += main_width + 2;\n\n if (!this.render_options.underline_superscript) {\n start_x += superscript_width;\n }\n }\n\n if (this.render_options.dashed) {\n // Main line\n Renderer.drawDashedLine(\n ctx,\n start_x,\n line_y,\n end_x,\n line_y,\n this.render_options.dash\n );\n // Ending Bracket\n if (this.render_options.show_bracket) {\n Renderer.drawDashedLine(\n ctx,\n end_x,\n line_y + (1 * this.position),\n end_x,\n line_y + bracket_height,\n this.render_options.dash\n );\n }\n } else {\n ctx.beginPath();\n ctx.moveTo(start_x, line_y);\n // Main line\n ctx.lineTo(end_x, line_y);\n if (this.render_options.show_bracket) {\n // Ending bracket\n ctx.lineTo(end_x, line_y + bracket_height);\n }\n ctx.stroke();\n ctx.closePath();\n }\n\n ctx.restore();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// A `BarNote` is used to render bar lines (from `barline.js`). `BarNote`s can\n// be added to a voice and rendered in the middle of a stave. Since it has no\n// duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n//\n// See `tests/barnote_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { Barline } from './stavebarline';\n\n// To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`.\nfunction L(...args) { if (BarNote.DEBUG) Vex.L('Vex.Flow.BarNote', args); }\n\nexport class BarNote extends Note {\n constructor(type = Barline.type.SINGLE) {\n super({ duration: 'b' });\n this.setAttribute('type', 'BarNote');\n\n this.metrics = {\n widths: {},\n };\n\n const TYPE = Barline.type;\n this.metrics.widths = {\n [TYPE.SINGLE]: 8,\n [TYPE.DOUBLE]: 12,\n [TYPE.END]: 15,\n [TYPE.REPEAT_BEGIN]: 14,\n [TYPE.REPEAT_END]: 14,\n [TYPE.REPEAT_BOTH]: 18,\n [TYPE.NONE]: 0,\n };\n\n // Tell the formatter that bar notes have no duration.\n this.ignore_ticks = true;\n this.setType(type);\n }\n\n // Get and set the type of Bar note. `type` must be one of `Vex.Flow.Barline.type`.\n getType() { return this.type; }\n setType(type) {\n this.type = typeof(type) === 'string'\n ? Barline.typeString[type]\n : type;\n\n // Set width to width of relevant `Barline`.\n this.setWidth(this.metrics.widths[this.type]);\n return this;\n }\n\n getBoundingBox() {\n return super.getBoundingBox();\n }\n\n addToModifierContext() {\n /* overridden to ignore */\n return this;\n }\n\n preFormat() {\n /* overridden to ignore */\n this.setPreFormatted(true);\n return this;\n }\n\n // Render note to stave.\n draw() {\n this.checkContext();\n if (!this.stave) throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n L('Rendering bar line at: ', this.getAbsoluteX());\n const barline = new Barline(this.type);\n barline.setX(this.getAbsoluteX());\n barline.draw(this.stave);\n this.setRendered();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n\nimport { Vex } from './vex';\nimport { StemmableNote } from './stemmablenote';\n\nexport class GhostNote extends StemmableNote {\n /** @constructor */\n constructor(parameter) {\n // Sanity check\n if (!parameter) {\n throw new Vex.RuntimeError('BadArguments',\n 'Ghost note must have valid initialization data to identify ' +\n 'duration.');\n }\n\n let note_struct;\n\n // Preserve backwards-compatibility\n if (typeof (parameter) === 'string') {\n note_struct = { duration: parameter };\n } else if (typeof (parameter) === 'object') {\n note_struct = parameter;\n } else {\n throw new Vex.RuntimeError('BadArguments',\n 'Ghost note must have valid initialization data to identify ' +\n 'duration.');\n }\n\n super(note_struct);\n this.setAttribute('type', 'GhostNote');\n\n // Note properties\n this.setWidth(0);\n }\n\n isRest() { return true; }\n\n setStave(stave) {\n super.setStave(stave);\n }\n\n addToModifierContext() { /* intentionally overridden */ return this; }\n\n preFormat() {\n this.setPreFormatted(true);\n return this;\n }\n\n draw() {\n if (!this.stave) throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n\n // Draw the modifiers\n this.setRendered();\n for (let i = 0; i < this.modifiers.length; ++i) {\n const modifier = this.modifiers[i];\n modifier.setContext(this.context);\n modifier.drawWithStyle();\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan \n//\n// This class implements tremolo notation.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\n\nexport class Tremolo extends Modifier {\n static get CATEGORY() { return 'tremolo'; }\n static get YOFFSETSTEMUP() { return -9; }\n static get YOFFSETSTEMDOWN() { return -21; }\n static get XOFFSETSTEMUP() { return 6; }\n static get XOFFSETSTEMDOWN() { return -2; }\n constructor(num) {\n super();\n this.setAttribute('type', 'Tremolo');\n\n this.num = num;\n this.note = null;\n this.index = null;\n this.position = Modifier.Position.CENTER;\n this.code = 'v74';\n }\n\n getCategory() { return Tremolo.CATEGORY; }\n\n draw() {\n this.checkContext();\n\n if (!(this.note && this.index != null)) {\n throw new Vex.RERR('NoAttachedNote', \"Can't draw Tremolo without a note and index.\");\n }\n\n this.setRendered();\n const stemDirection = this.note.getStemDirection();\n this.y_spacing = 4 * stemDirection;\n const start = this.note.getModifierStartXY(this.position, this.index);\n let x = start.x;\n let y = this.note.stem.getExtents().topY;\n const scale = this.note.getCategory() === 'gracenotes' ? GraceNote.SCALE : 1;\n if (stemDirection < 0) {\n y += Tremolo.YOFFSETSTEMDOWN * scale;\n } else {\n y += Tremolo.YOFFSETSTEMUP * scale;\n }\n\n this.font = {\n family: 'Arial',\n size: 16 * scale,\n weight: '',\n };\n\n this.render_options = {\n font_scale: 35 * scale,\n stroke_px: 3,\n stroke_spacing: 10 * scale,\n };\n\n x += stemDirection < 0 ? Tremolo.XOFFSETSTEMDOWN : Tremolo.XOFFSETSTEMUP;\n for (let i = 0; i < this.num; ++i) {\n Glyph.renderGlyph(this.context, x, y, this.render_options.font_scale, this.code);\n y += this.y_spacing;\n }\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\n\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\nfunction L(...args) { if (Crescendo.DEBUG) Vex.L('Vex.Flow.Crescendo', args); }\n\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n const begin_x = params.begin_x;\n const end_x = params.end_x;\n const y = params.y;\n const half_height = params.height / 2;\n\n ctx.beginPath();\n\n if (params.reverse) {\n ctx.moveTo(begin_x, y - half_height);\n ctx.lineTo(end_x, y);\n ctx.lineTo(begin_x, y + half_height);\n } else {\n ctx.moveTo(end_x, y - half_height);\n ctx.lineTo(begin_x, y);\n ctx.lineTo(end_x, y + half_height);\n }\n\n ctx.stroke();\n ctx.closePath();\n}\n\nexport class Crescendo extends Note {\n // Initialize the crescendo's properties\n constructor(note_struct) {\n super(note_struct);\n this.setAttribute('type', 'Crescendo');\n\n // Whether the object is a decrescendo\n this.decrescendo = false;\n\n // The staff line to be placed on\n this.line = note_struct.line || 0;\n\n // The height at the open end of the cresc/decresc\n this.height = 15;\n\n Vex.Merge(this.render_options, {\n // Extensions to the length of the crescendo on either side\n extend_left: 0,\n extend_right: 0,\n // Vertical shift\n y_shift: 0,\n });\n }\n\n // Set the line to center the element on\n setLine(line) { this.line = line; return this; }\n\n // Set the full height at the open end\n setHeight(height) { this.height = height; return this; }\n\n // Set whether the sign should be a descresendo by passing a bool\n // to `decresc`\n setDecrescendo(decresc) {\n this.decrescendo = decresc;\n return this;\n }\n\n // Preformat the note\n preFormat() { this.preFormatted = true; return this; }\n\n // Render the Crescendo object onto the canvas\n draw() {\n this.checkContext();\n this.setRendered();\n\n const tick_context = this.getTickContext();\n const next_context = TickContext.getNextContext(tick_context);\n\n const begin_x = this.getAbsoluteX();\n const end_x = next_context ? next_context.getX() : this.stave.x + this.stave.width;\n const y = this.stave.getYForLine(this.line + (-3)) + 1;\n\n L(\n 'Drawing ',\n this.decrescendo ? 'decrescendo ' : 'crescendo ',\n this.height,\n 'x',\n begin_x - end_x\n );\n\n renderHairpin(this.context, {\n begin_x: begin_x - this.render_options.extend_left,\n end_x: end_x + this.render_options.extend_right,\n y: y + this.render_options.y_shift,\n height: this.height,\n reverse: this.decrescendo,\n });\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\n\nimport { Vex } from './vex';\n\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\nfunction L(...args) { if (Parser.DEBUG) Vex.L('Vex.Flow.Parser', args); }\n\nexport const X = Vex.MakeException('ParserError');\n\n// Converts parser results into an easy to reference list that can be\n// used in triggers.\nfunction flattenMatches(results) {\n if (results.matchedString !== undefined) return results.matchedString;\n if (results.results) return flattenMatches(results.results);\n if (results.length === 1) return flattenMatches(results[0]);\n if (results.length === 0) return null;\n return results.map(flattenMatches);\n}\n\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n // For an example of a simple grammar, take a look at tests/parser_tests.js or\n // the EasyScore grammar in easyscore.js.\n constructor(grammar) {\n this.grammar = grammar;\n }\n\n // Parse `line` using current grammar. Returns {success: true} if the\n // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n // where `errorPos` is the location of the error in the string.\n parse(line) {\n this.line = line;\n this.pos = 0;\n this.errorPos = -1;\n const results = this.expect(this.grammar.begin());\n results.errorPos = this.errorPos;\n return results;\n }\n\n matchFail(returnPos) {\n if (this.errorPos === -1) this.errorPos = this.pos;\n this.pos = returnPos;\n }\n\n matchSuccess() {\n this.errorPos = -1;\n }\n\n // Look for `token` in this.line[this.pos], and return success\n // if one is found. `token` is specified as a regular expression.\n matchToken(token, noSpace = false) {\n const regexp = noSpace\n ? new RegExp('^((' + token + '))')\n : new RegExp('^((' + token + ')\\\\s*)');\n const workingLine = this.line.slice(this.pos);\n const result = workingLine.match(regexp);\n if (result !== null) {\n return {\n success: true,\n matchedString: result[2],\n incrementPos: result[1].length,\n pos: this.pos,\n };\n } else {\n return {\n success: false,\n pos: this.pos,\n };\n }\n }\n\n // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n // set, then return success even if the token is not found, but reset\n // the position before exiting.\n expectOne(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n\n let allMatches = true;\n let oneMatch = false;\n maybe = (maybe === true) || (rule.maybe === true);\n\n // Execute all sub rules in sequence.\n for (let i = 0; i < rule.expect.length; i++) {\n const next = rule.expect[i];\n const localPos = this.pos;\n const result = this.expect(next);\n\n // If `rule.or` is set, then return success if any one\n // of the subrules match, else all subrules must match.\n if (result.success) {\n results.push(result);\n oneMatch = true;\n if (rule.or) break;\n } else {\n allMatches = false;\n if (!rule.or) {\n this.pos = localPos;\n break;\n }\n }\n }\n\n const gotOne = (rule.or && oneMatch) || allMatches;\n const success = gotOne || (maybe === true);\n if (maybe && !gotOne) this.pos = pos;\n if (success) this.matchSuccess(); else this.matchFail(pos);\n return { success, results, numMatches: gotOne ? 1 : 0 };\n }\n\n // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n // then a failed match is also a success (but the position is reset).\n expectOneOrMore(rule, maybe = false) {\n const results = [];\n const pos = this.pos;\n let numMatches = 0;\n let more = true;\n\n do {\n const result = this.expectOne(rule);\n if (result.success) {\n numMatches++;\n results.push(result.results);\n } else {\n more = false;\n }\n } while (more);\n\n const success = (numMatches > 0) || (maybe === true);\n if (maybe && !(numMatches > 0)) this.pos = pos;\n if (success) this.matchSuccess(); else this.matchFail(pos);\n return { success, results, numMatches };\n }\n\n // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n expectZeroOrMore(rule) {\n return this.expectOneOrMore(rule, true);\n }\n\n // Execute the rule produced by the provided the `rules` function. This\n // ofloads to one of the above matchers and consolidates the results. It is also\n // responsible for executing any code triggered by the rule (in `rule.run`.)\n expect(rules) {\n L('Evaluating rules:', rules);\n let result;\n if (!rules) {\n throw new X('Invalid Rule: ' + rules, rules);\n }\n\n // Get rule from Grammar class.\n const rule = rules.bind(this.grammar)();\n\n if (rule.token) {\n // Base case: parse the regex and throw an error if the\n // line doesn't match.\n result = this.matchToken(rule.token, (rule.noSpace === true));\n if (result.success) {\n // Token match! Update position and throw away parsed portion\n // of string.\n this.pos += result.incrementPos;\n }\n } else if (rule.expect) {\n if (rule.oneOrMore) {\n result = this.expectOneOrMore(rule);\n } else if (rule.zeroOrMore) {\n result = this.expectZeroOrMore(rule);\n } else {\n result = this.expectOne(rule);\n }\n } else {\n throw new X('Bad grammar! No `token` or `expect` property', rule);\n }\n\n // If there's a trigger attached to this rule, then pull it.\n result.matches = [];\n if (result.results) result.results.forEach(r => result.matches.push(flattenMatches(r)));\n if (rule.run && result.success) rule.run(result);\n return result;\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements a parser for a simple language to generate\n// VexFlow objects.\n\n/* eslint max-classes-per-file: \"off\" */\n\nimport { Vex } from './vex';\nimport { StaveNote } from './stavenote';\nimport { Parser } from './parser';\nimport { Articulation } from './articulation';\n\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\nfunction L(...args) { if (EasyScore.DEBUG) Vex.L('Vex.Flow.EasyScore', args); }\n\nexport const X = Vex.MakeException('EasyScoreError');\n\nclass Grammar {\n constructor(builder) {\n this.builder = builder;\n }\n\n begin() { return this.LINE; }\n\n LINE() {\n return {\n expect: [this.PIECE, this.PIECES, this.EOL],\n };\n }\n PIECE() {\n return {\n expect: [this.CHORDORNOTE, this.PARAMS],\n run: () => this.builder.commitPiece(),\n };\n }\n PIECES() {\n return {\n expect: [this.COMMA, this.PIECE],\n zeroOrMore: true,\n };\n }\n PARAMS() {\n return {\n expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n };\n }\n CHORDORNOTE() {\n return {\n expect: [this.CHORD, this.SINGLENOTE],\n or: true,\n };\n }\n CHORD() {\n return {\n expect: [this.LPAREN, this.NOTES, this.RPAREN],\n run: (state) => this.builder.addChord(state.matches[1]),\n };\n }\n NOTES() {\n return {\n expect: [this.NOTE],\n oneOrMore: true,\n };\n }\n NOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n };\n }\n SINGLENOTE() {\n return {\n expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n run: (state) =>\n this.builder.addSingleNote(state.matches[0], state.matches[1], state.matches[2]),\n };\n }\n ACCIDENTAL() {\n return {\n expect: [this.ACCIDENTALS],\n maybe: true,\n };\n }\n DOTS() {\n return {\n expect: [this.DOT],\n zeroOrMore: true,\n run: (state) => this.builder.setNoteDots(state.matches[0]),\n };\n }\n TYPE() {\n return {\n expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n maybe: true,\n run: (state) => this.builder.setNoteType(state.matches[2]),\n };\n }\n DURATION() {\n return {\n expect: [this.SLASH, this.DURATIONS],\n maybe: true,\n run: (state) => this.builder.setNoteDuration(state.matches[1]),\n };\n }\n OPTS() {\n return {\n expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n maybe: true,\n };\n }\n KEYVALS() {\n return {\n expect: [this.COMMA, this.KEYVAL],\n zeroOrMore: true,\n };\n }\n KEYVAL() {\n const unquote = (str) => str.slice(1, -1);\n\n return {\n expect: [this.KEY, this.EQUALS, this.VAL],\n run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n };\n }\n VAL() {\n return {\n expect: [this.SVAL, this.DVAL],\n or: true,\n };\n }\n\n KEY() { return { token: '[a-zA-Z][a-zA-Z0-9]*' }; }\n DVAL() { return { token: '[\"][^\"]*[\"]' }; }\n SVAL() { return { token: \"['][^']*[']\" }; }\n NOTENAME() { return { token: '[a-gA-G]' }; }\n OCTAVE() { return { token: '[0-9]+' }; }\n ACCIDENTALS() { return { token: 'bbs|bb|bss|bs|b|db|d|##|#|n|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' }; }\n DURATIONS() { return { token: '[0-9whq]+' }; }\n TYPES() { return { token: '[rRsSxX]' }; }\n LPAREN() { return { token: '[(]' }; }\n RPAREN() { return { token: '[)]' }; }\n COMMA() { return { token: '[,]' }; }\n DOT() { return { token: '[.]' }; }\n SLASH() { return { token: '[/]' }; }\n MAYBESLASH() { return { token: '[/]?' }; }\n EQUALS() { return { token: '[=]' }; }\n LBRACKET() { return { token: '\\\\[' }; }\n RBRACKET() { return { token: '\\\\]' }; }\n EOL() { return { token: '$' }; }\n}\n\nclass Builder {\n constructor(factory) {\n this.factory = factory;\n this.commitHooks = [];\n this.reset();\n }\n\n reset(options = {}) {\n this.options = {\n stem: 'auto',\n clef: 'treble',\n };\n this.elements = {\n notes: [],\n accidentals: [],\n };\n this.rollingDuration = '8';\n this.resetPiece();\n Object.assign(this.options, options);\n }\n\n getFactory() { return this.factory; }\n\n getElements() { return this.elements; }\n\n addCommitHook(commitHook) {\n this.commitHooks.push(commitHook);\n }\n\n resetPiece() {\n L('resetPiece');\n this.piece = {\n chord: [],\n duration: this.rollingDuration,\n dots: 0,\n type: undefined,\n options: {},\n };\n }\n\n setNoteDots(dots) {\n L('setNoteDots:', dots);\n if (dots) this.piece.dots = dots.length;\n }\n\n setNoteDuration(duration) {\n L('setNoteDuration:', duration);\n this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n }\n\n setNoteType(type) {\n L('setNoteType:', type);\n if (type) this.piece.type = type;\n }\n\n addNoteOption(key, value) {\n L('addNoteOption: key:', key, 'value:', value);\n this.piece.options[key] = value;\n }\n\n addNote(key, accid, octave) {\n L('addNote:', key, accid, octave);\n this.piece.chord.push({ key, accid, octave });\n }\n\n addSingleNote(key, accid, octave) {\n L('addSingleNote:', key, accid, octave);\n this.addNote(key, accid, octave);\n }\n\n addChord(notes) {\n L('startChord');\n if (typeof (notes[0]) !== 'object') {\n this.addSingleNote(notes[0]);\n } else {\n notes.forEach(n => {\n if (n) this.addNote(...n);\n });\n }\n L('endChord');\n }\n\n commitPiece() {\n L('commitPiece');\n const { factory } = this;\n\n if (!factory) return;\n\n const options = { ...this.options, ...this.piece.options };\n const { stem, clef } = options;\n const autoStem = stem.toLowerCase() === 'auto';\n const stemDirection = !autoStem && stem.toLowerCase() === 'up'\n ? StaveNote.STEM_UP\n : StaveNote.STEM_DOWN;\n\n // Build StaveNotes.\n const { chord, duration, dots, type } = this.piece;\n const keys = chord.map(note => note.key + '/' + note.octave);\n const note = factory.StaveNote({\n keys,\n duration,\n dots,\n type,\n clef,\n auto_stem: autoStem,\n });\n if (!autoStem) note.setStemDirection(stemDirection);\n\n // Attach accidentals.\n const accids = chord.map(note => note.accid || null);\n accids.forEach((accid, i) => {\n if (accid) note.addAccidental(i, factory.Accidental({ type: accid }));\n });\n\n // Attach dots.\n for (let i = 0; i < dots; i++) note.addDotToAll();\n\n this.commitHooks.forEach(fn => fn(options, note, this));\n\n this.elements.notes.push(note);\n this.elements.accidentals.concat(accids);\n this.resetPiece();\n }\n}\n\nfunction setId({ id }, note) {\n if (id === undefined) return;\n\n note.setAttribute('id', id);\n}\n\n\nfunction setClass(options, note) {\n if (!options.class) return;\n\n const commaSeparatedRegex = /\\s*,\\s*/;\n\n options.class\n .split(commaSeparatedRegex)\n .forEach(className => note.addClass(className));\n}\n\nexport class EasyScore {\n constructor(options = {}) {\n this.setOptions(options);\n this.defaults = {\n clef: 'treble',\n time: '4/4',\n stem: 'auto',\n };\n }\n\n set(defaults) {\n Object.assign(this.defaults, defaults);\n return this;\n }\n\n setOptions(options) {\n this.options = {\n factory: null,\n builder: null,\n commitHooks: [\n setId,\n setClass,\n Articulation.easyScoreHook,\n ],\n throwOnError: false, ...options\n };\n\n this.factory = this.options.factory;\n this.builder = this.options.builder || new Builder(this.factory);\n this.grammar = new Grammar(this.builder);\n this.parser = new Parser(this.grammar);\n this.options.commitHooks.forEach(commitHook => this.addCommitHook(commitHook));\n return this;\n }\n\n setContext(context) {\n if (this.factory) this.factory.setContext(context);\n return this;\n }\n\n parse(line, options = {}) {\n this.builder.reset(options);\n const result = this.parser.parse(line);\n if (!result.success && this.options.throwOnError) {\n throw new X('Error parsing line: ' + line, result);\n }\n return result;\n }\n\n beam(notes, options = {}) {\n this.factory.Beam({ notes, options });\n return notes;\n }\n\n tuplet(notes, options = {}) {\n this.factory.Tuplet({ notes, options });\n return notes;\n }\n\n notes(line, options = {}) {\n options = { clef: this.defaults.clef, stem: this.defaults.stem, ...options };\n this.parse(line, options);\n return this.builder.getElements().notes;\n }\n\n voice(notes, voiceOptions) {\n voiceOptions = { time: this.defaults.time, ...voiceOptions };\n return this.factory.Voice(voiceOptions).addTickables(notes);\n }\n\n addCommitHook(commitHook) {\n return this.builder.addCommitHook(commitHook);\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a high level API around VexFlow. It will eventually\n// become the canonical way to use VexFlow.\n//\n// *This API is currently DRAFT*\n\nimport { Vex } from './vex';\nimport { Accidental } from './accidental';\nimport { Articulation } from './articulation';\nimport { Annotation } from './annotation';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { StringNumber } from './stringnumber';\nimport { TextDynamics } from './textdynamics';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Renderer } from './renderer';\nimport { Stave } from './stave';\nimport { StaveTie } from './stavetie';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveConnector } from './staveconnector';\nimport { System } from './system';\nimport { TickContext } from './tickcontext';\nimport { Tuplet } from './tuplet';\nimport { Voice } from './voice';\nimport { Beam } from './beam';\nimport { Curve } from './curve';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { EasyScore } from './easyscore';\nimport { TimeSigNote } from './timesignote';\nimport { KeySigNote } from './keysignote';\nimport { ClefNote } from './clefnote';\nimport { PedalMarking } from './pedalmarking';\nimport { TextBracket } from './textbracket';\nimport { VibratoBracket } from './vibratobracket';\nimport { GhostNote } from './ghostnote';\nimport { BarNote } from './barnote';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextNote } from './textnote';\n\n// To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`.\nfunction L(...args) { if (Factory.DEBUG) Vex.L('Vex.Flow.Factory', args); }\n\nexport const X = Vex.MakeException('FactoryError');\n\nfunction setDefaults(params = {}, defaults) {\n const default_options = defaults.options;\n params = Object.assign(defaults, params);\n params.options = Object.assign(default_options, params.options);\n return params;\n}\n\nexport class Factory {\n constructor(options) {\n L('New factory: ', options);\n const defaults = {\n stave: {\n space: 10,\n },\n renderer: {\n context: null,\n elementId: '',\n backend: Renderer.Backends.SVG,\n width: 500,\n height: 200,\n background: '#FFF',\n },\n font: {\n face: 'Arial',\n point: 10,\n style: '',\n },\n };\n\n this.options = defaults;\n this.setOptions(options);\n }\n\n static newFromElementId(elementId, width = 500, height = 200) {\n return new Factory({ renderer: { elementId, width, height } });\n }\n\n reset() {\n this.renderQ = [];\n this.systems = [];\n this.staves = [];\n this.voices = [];\n this.stave = null; // current stave\n }\n\n getOptions() { return this.options; }\n setOptions(options) {\n for (const key of ['stave', 'renderer', 'font']) {\n Object.assign(this.options[key], options[key]);\n }\n if (this.options.renderer.elementId !== null || this.options.renderer.context) {\n this.initRenderer();\n }\n\n this.reset();\n }\n\n initRenderer() {\n const { elementId, backend, width, height, background } = this.options.renderer;\n if (elementId === '') {\n throw new X('HTML DOM element not set in Factory');\n }\n\n this.context = Renderer.buildContext(elementId, backend, width, height, background);\n }\n\n getContext() { return this.context; }\n setContext(context) { this.context = context; return this; }\n getStave() { return this.stave; }\n getVoices() { return this.voices; }\n\n // Returns pixels from current stave spacing.\n space(spacing) { return this.options.stave.space * spacing; }\n\n Stave(params) {\n params = setDefaults(params, {\n x: 0,\n y: 0,\n width: this.options.renderer.width - this.space(1),\n options: {\n spacing_between_lines_px: this.options.stave.space,\n },\n });\n\n const stave = new Stave(params.x, params.y, params.width, params.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n\n TabStave(params) {\n params = setDefaults(params, {\n x: 0,\n y: 0,\n width: this.options.renderer.width - this.space(1),\n options: {\n spacing_between_lines_px: this.options.stave.space * 1.3,\n },\n });\n\n const stave = new TabStave(params.x, params.y, params.width, params.options);\n this.staves.push(stave);\n stave.setContext(this.context);\n this.stave = stave;\n return stave;\n }\n\n StaveNote(noteStruct) {\n const note = new StaveNote(noteStruct);\n if (this.stave) note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n\n GhostNote(noteStruct) {\n const ghostNote = new GhostNote(noteStruct);\n if (this.stave) ghostNote.setStave(this.stave);\n ghostNote.setContext(this.context);\n this.renderQ.push(ghostNote);\n return ghostNote;\n }\n\n TextNote(textNoteStruct) {\n const textNote = new TextNote(textNoteStruct);\n if (this.stave) textNote.setStave(this.stave);\n textNote.setContext(this.context);\n this.renderQ.push(textNote);\n return textNote;\n }\n\n BarNote(params) {\n params = setDefaults(params, {\n type: 'single',\n options: {},\n });\n\n const barNote = new BarNote(params.type);\n if (this.stave) barNote.setStave(this.stave);\n barNote.setContext(this.context);\n this.renderQ.push(barNote);\n return barNote;\n }\n\n ClefNote(params) {\n params = setDefaults(params, {\n type: 'treble',\n options: {\n size: 'default',\n },\n });\n\n const clefNote = new ClefNote(params.type, params.options.size, params.options.annotation);\n if (this.stave) clefNote.setStave(this.stave);\n clefNote.setContext(this.context);\n this.renderQ.push(clefNote);\n return clefNote;\n }\n\n TimeSigNote(params) {\n params = setDefaults(params, {\n time: '4/4',\n options: {},\n });\n\n const timeSigNote = new TimeSigNote(params.time);\n if (this.stave) timeSigNote.setStave(this.stave);\n timeSigNote.setContext(this.context);\n this.renderQ.push(timeSigNote);\n return timeSigNote;\n }\n\n KeySigNote(params) {\n const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n if (this.stave) keySigNote.setStave(this.stave);\n keySigNote.setContext(this.context);\n this.renderQ.push(keySigNote);\n return keySigNote;\n }\n\n TabNote(noteStruct) {\n const note = new TabNote(noteStruct);\n if (this.stave) note.setStave(this.stave);\n note.setContext(this.context);\n this.renderQ.push(note);\n return note;\n }\n\n GraceNote(noteStruct) {\n const note = new GraceNote(noteStruct);\n if (this.stave) note.setStave(this.stave);\n note.setContext(this.context);\n return note;\n }\n\n GraceNoteGroup(params) {\n const group = new GraceNoteGroup(params.notes, params.slur);\n group.setContext(this.context);\n return group;\n }\n\n Accidental(params) {\n params = setDefaults(params, {\n type: null,\n options: {},\n });\n\n const accid = new Accidental(params.type);\n accid.setContext(this.context);\n return accid;\n }\n\n Annotation(params) {\n params = setDefaults(params, {\n text: 'p',\n vJustify: 'below',\n hJustify: 'center',\n fontFamily: 'Times',\n fontSize: 14,\n fontWeight: 'bold italic',\n options: {},\n });\n\n const annotation = new Annotation(params.text);\n annotation.setJustification(params.hJustify);\n annotation.setVerticalJustification(params.vJustify);\n annotation.setFont(params.fontFamily, params.fontSize, params.fontWeight);\n annotation.setContext(this.context);\n return annotation;\n }\n\n Articulation(params) {\n params = setDefaults(params, {\n type: 'a.',\n position: 'above',\n options: {},\n });\n\n const articulation = new Articulation(params.type);\n articulation.setPosition(params.position);\n articulation.setContext(this.context);\n return articulation;\n }\n\n TextDynamics(params) {\n params = setDefaults(params, {\n text: 'p',\n duration: 'q',\n dots: 0,\n line: 0,\n options: {},\n });\n\n const text = new TextDynamics({\n text: params.text,\n line: params.line,\n duration: params.duration,\n dots: params.dots,\n });\n\n if (this.stave) text.setStave(this.stave);\n text.setContext(this.context);\n this.renderQ.push(text);\n return text;\n }\n\n Fingering(params) {\n params = setDefaults(params, {\n number: '0',\n position: 'left',\n options: {},\n });\n\n const fingering = new FretHandFinger(params.number);\n fingering.setPosition(params.position);\n fingering.setContext(this.context);\n return fingering;\n }\n\n StringNumber(params) {\n params = setDefaults(params, {\n number: '0',\n position: 'left',\n options: {},\n });\n\n const stringNumber = new StringNumber(params.number);\n stringNumber.setPosition(params.position);\n stringNumber.setContext(this.context);\n return stringNumber;\n }\n\n TickContext() {\n return new TickContext().setContext(this.context);\n }\n\n ModifierContext() {\n return new ModifierContext();\n }\n\n MultiMeasureRest(params) {\n const multimeasurerest = new MultiMeasureRest(params.number_of_measures, params);\n multimeasurerest.setContext(this.context);\n this.renderQ.push(multimeasurerest);\n return multimeasurerest;\n }\n\n Voice(params) {\n params = setDefaults(params, {\n time: '4/4',\n options: {},\n });\n const voice = new Voice(params.time);\n this.voices.push(voice);\n return voice;\n }\n\n StaveConnector(params) {\n params = setDefaults(params, {\n top_stave: null,\n bottom_stave: null,\n type: 'double',\n options: {},\n });\n const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n connector.setType(params.type).setContext(this.context);\n this.renderQ.push(connector);\n return connector;\n }\n\n Formatter() {\n return new Formatter();\n }\n\n Tuplet(params) {\n params = setDefaults(params, {\n notes: [],\n options: {},\n });\n\n const tuplet = new Tuplet(params.notes, params.options).setContext(this.context);\n this.renderQ.push(tuplet);\n return tuplet;\n }\n\n Beam(params) {\n params = setDefaults(params, {\n notes: [],\n options: {\n autoStem: false,\n secondaryBeamBreaks: [],\n },\n });\n\n const beam = new Beam(params.notes, params.options.autoStem).setContext(this.context);\n beam.breakSecondaryAt(params.options.secondaryBeamBreaks);\n this.renderQ.push(beam);\n return beam;\n }\n\n Curve(params) {\n params = setDefaults(params, {\n from: null,\n to: null,\n options: {},\n });\n\n const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n this.renderQ.push(curve);\n return curve;\n }\n\n StaveTie(params) {\n params = setDefaults(params, {\n from: null,\n to: null,\n first_indices: [0],\n last_indices: [0],\n text: null,\n options: {\n direction: undefined,\n },\n });\n\n const tie = new StaveTie({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n }, params.text);\n\n if (params.options.direction) tie.setDirection(params.options.direction);\n tie.setContext(this.context);\n this.renderQ.push(tie);\n return tie;\n }\n\n StaveLine(params) {\n params = setDefaults(params, {\n from: null,\n to: null,\n first_indices: [0],\n last_indices: [0],\n options: {},\n });\n\n const line = new StaveLine({\n first_note: params.from,\n last_note: params.to,\n first_indices: params.first_indices,\n last_indices: params.last_indices,\n });\n\n if (params.options.text) line.setText(params.options.text);\n if (params.options.font) line.setFont(params.options.font);\n\n line.setContext(this.context);\n this.renderQ.push(line);\n return line;\n }\n\n VibratoBracket(params) {\n params = setDefaults(params, {\n from: null,\n to: null,\n options: {\n harsh: false,\n },\n });\n\n const vibratoBracket = new VibratoBracket({\n start: params.from,\n stop: params.to,\n });\n\n if (params.options.line) vibratoBracket.setLine(params.options.line);\n if (params.options.harsh) vibratoBracket.setHarsh(params.options.harsh);\n\n vibratoBracket.setContext(this.context);\n this.renderQ.push(vibratoBracket);\n\n return vibratoBracket;\n }\n\n TextBracket(params) {\n params = setDefaults(params, {\n from: null,\n to: null,\n text: '',\n options: {\n superscript: '',\n position: 1,\n },\n });\n\n const textBracket = new TextBracket({\n start: params.from,\n stop: params.to,\n text: params.text,\n superscript: params.options.superscript,\n position: params.options.position,\n });\n\n if (params.options.line) textBracket.setLine(params.options.line);\n if (params.options.font) textBracket.setFont(params.options.font);\n\n textBracket.setContext(this.context);\n this.renderQ.push(textBracket);\n return textBracket;\n }\n\n System(params = {}) {\n params.factory = this;\n const system = new System(params).setContext(this.context);\n this.systems.push(system);\n return system;\n }\n\n EasyScore(params = {}) {\n params.factory = this;\n return new EasyScore(params);\n }\n\n PedalMarking(params = {}) {\n params = setDefaults(params, {\n notes: [],\n options: {\n style: 'mixed',\n },\n });\n\n const pedal = new PedalMarking(params.notes);\n pedal.setStyle(PedalMarking.StylesString[params.options.style]);\n pedal.setContext(this.context);\n this.renderQ.push(pedal);\n return pedal;\n }\n\n NoteSubGroup(params = {}) {\n params = setDefaults(params, {\n notes: [],\n options: {},\n });\n\n const group = new NoteSubGroup(params.notes);\n group.setContext(this.context);\n return group;\n }\n\n draw() {\n this.systems.forEach(i => i.setContext(this.context).format());\n this.staves.forEach(i => i.setContext(this.context).draw());\n this.voices.forEach(i => i.setContext(this.context).draw());\n this.renderQ.forEach(i => {\n if (!i.isRendered()) i.setContext(this.context).draw();\n });\n this.systems.forEach(i => i.setContext(this.context).draw());\n this.reset();\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements a musical system, which is a collection of staves,\n// each which can have one or more voices. All voices across all staves in\n// the system are formatted together.\n\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\n\nfunction setDefaults(params, defaults) {\n const default_options = defaults.options;\n params = Object.assign(defaults, params);\n params.options = Object.assign(default_options, params.options);\n return params;\n}\n\nexport class System extends Element {\n constructor(params = {}) {\n super();\n this.setAttribute('type', 'System');\n this.setOptions(params);\n this.parts = [];\n }\n\n setOptions(options = {}) {\n this.options = setDefaults(options, {\n x: 10,\n y: 10,\n width: 500,\n connector: null,\n spaceBetweenStaves: 12, // stave spaces\n factory: null,\n debugFormatter: false,\n formatIterations: 0, // number of formatter tuning steps\n options: {},\n });\n\n this.factory = this.options.factory || new Factory({ renderer: { el: null } });\n }\n\n setContext(context) {\n super.setContext(context);\n this.factory.setContext(context);\n return this;\n }\n\n addConnector(type = 'double') {\n this.connector = this.factory.StaveConnector({\n top_stave: this.parts[0].stave,\n bottom_stave: this.parts[this.parts.length - 1].stave,\n type,\n });\n return this.connector;\n }\n\n addStave(params) {\n params = setDefaults(params, {\n stave: null,\n voices: [],\n spaceAbove: 0, // stave spaces\n spaceBelow: 0, // stave spaces\n debugNoteMetrics: false,\n options: { left_bar: false },\n });\n\n if (!params.stave) {\n params.stave = this.factory.Stave({\n x: this.options.x,\n y: this.options.y,\n width: this.options.width,\n options: params.options,\n });\n }\n\n params.voices.forEach(voice =>\n voice\n .setContext(this.context)\n .setStave(params.stave)\n .getTickables()\n .forEach(tickable => tickable.setStave(params.stave))\n );\n\n this.parts.push(params);\n return params.stave;\n }\n\n format() {\n const formatter = new Formatter();\n this.formatter = formatter;\n\n let y = this.options.y;\n let startX = 0;\n let allVoices = [];\n const debugNoteMetricsYs = [];\n\n // Join the voices for each stave.\n this.parts.forEach(part => {\n y = y + part.stave.space(part.spaceAbove);\n part.stave.setY(y);\n formatter.joinVoices(part.voices);\n y = y + part.stave.space(part.spaceBelow);\n y = y + part.stave.space(this.options.spaceBetweenStaves);\n if (part.debugNoteMetrics) {\n debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n y += 15;\n }\n allVoices = allVoices.concat(part.voices);\n\n startX = Math.max(startX, part.stave.getNoteStartX());\n });\n\n // Update the start position of all staves.\n this.parts.forEach(part => part.stave.setNoteStartX(startX));\n const justifyWidth = this.options.width - (startX - this.options.x) - Note.STAVEPADDING;\n formatter.format(allVoices, justifyWidth);\n\n for (let i = 0; i < this.options.formatIterations; i++) {\n formatter.tune();\n }\n\n this.startX = startX;\n this.debugNoteMetricsYs = debugNoteMetricsYs;\n this.lastY = y;\n }\n\n draw() {\n // Render debugging information, if requested.\n const ctx = this.checkContext();\n this.setRendered();\n\n if (this.options.debugFormatter) {\n Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n }\n\n this.debugNoteMetricsYs.forEach(d => {\n d.voice.getTickables().forEach(note => Note.plotMetrics(ctx, note, d.y));\n });\n }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Renderer } from './renderer';\nimport { Formatter } from './formatter';\nimport { Music } from './music';\nimport { Glyph } from './glyph';\nimport { Stave } from './stave';\nimport { StaveNote } from './stavenote';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveTempo } from './stavetempo';\nimport { Voice } from './voice';\nimport { Accidental } from './accidental';\nimport { Beam } from './beam';\nimport { StaveTie } from './stavetie';\nimport { TabStave } from './tabstave';\nimport { TabNote } from './tabnote';\nimport { Bend } from './bend';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Note } from './note';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { TickContext } from './tickcontext';\nimport { Articulation } from './articulation';\nimport { Annotation } from './annotation';\nimport { Barline } from './stavebarline';\nimport { NoteHead } from './notehead';\nimport { StaveConnector } from './staveconnector';\nimport { ClefNote } from './clefnote';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Stem } from './stem';\nimport { TabTie } from './tabtie';\nimport { Clef } from './clef';\nimport { Dot } from './dot';\nimport { Modifier } from './modifier';\nimport { TabSlide } from './tabslide';\nimport { Tuplet } from './tuplet';\nimport { GraceNote } from './gracenote';\nimport { GraceTabNote } from './gracetabnote';\nimport { Tuning } from './tuning';\nimport { KeyManager } from './keymanager';\nimport { StaveHairpin } from './stavehairpin';\nimport { BoundingBox } from './boundingbox';\nimport { Stroke } from './strokes';\nimport { TextNote } from './textnote';\nimport { Curve } from './curve';\nimport { TextDynamics } from './textdynamics';\nimport { StaveLine } from './staveline';\nimport { Ornament } from './ornament';\nimport { PedalMarking } from './pedalmarking';\nimport { TextBracket } from './textbracket';\nimport { FretHandFinger } from './frethandfinger';\nimport { Repetition } from './staverepetition';\nimport { BarNote } from './barnote';\nimport { GhostNote } from './ghostnote';\nimport { NoteSubGroup } from './notesubgroup';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { Tremolo } from './tremolo';\nimport { StringNumber } from './stringnumber';\nimport { Crescendo } from './crescendo';\nimport { Volta } from './stavevolta';\nimport { Font } from './fonts/vexflow_font';\nimport { System } from './system';\nimport { Factory } from './factory';\nimport { Parser } from './parser';\nimport { EasyScore } from './easyscore';\nimport { Registry } from './registry';\n\nVex.Flow = Flow;\nVex.Flow.Element = Element;\nVex.Flow.Fraction = Fraction;\nVex.Flow.Renderer = Renderer;\nVex.Flow.Formatter = Formatter;\nVex.Flow.Music = Music;\nVex.Flow.Glyph = Glyph;\nVex.Flow.Stave = Stave;\nVex.Flow.StaveNote = StaveNote;\nVex.Flow.StaveModifier = StaveModifier;\nVex.Flow.StaveTempo = StaveTempo;\nVex.Flow.Voice = Voice;\nVex.Flow.Accidental = Accidental;\nVex.Flow.Beam = Beam;\nVex.Flow.StaveTie = StaveTie;\nVex.Flow.TabStave = TabStave;\nVex.Flow.TabNote = TabNote;\nVex.Flow.Bend = Bend;\nVex.Flow.Vibrato = Vibrato;\nVex.Flow.VibratoBracket = VibratoBracket;\nVex.Flow.Note = Note;\nVex.Flow.ModifierContext = ModifierContext;\nVex.Flow.MultiMeasureRest = MultiMeasureRest;\nVex.Flow.TickContext = TickContext;\nVex.Flow.Articulation = Articulation;\nVex.Flow.Annotation = Annotation;\nVex.Flow.Barline = Barline;\nVex.Flow.NoteHead = NoteHead;\nVex.Flow.StaveConnector = StaveConnector;\nVex.Flow.ClefNote = ClefNote;\nVex.Flow.KeySignature = KeySignature;\nVex.Flow.KeySigNote = KeySigNote;\nVex.Flow.TimeSignature = TimeSignature;\nVex.Flow.TimeSigNote = TimeSigNote;\nVex.Flow.Stem = Stem;\nVex.Flow.TabTie = TabTie;\nVex.Flow.Clef = Clef;\nVex.Flow.Dot = Dot;\nVex.Flow.Modifier = Modifier;\nVex.Flow.TabSlide = TabSlide;\nVex.Flow.Tuplet = Tuplet;\nVex.Flow.GraceNote = GraceNote;\nVex.Flow.GraceTabNote = GraceTabNote;\nVex.Flow.Tuning = Tuning;\nVex.Flow.KeyManager = KeyManager;\nVex.Flow.StaveHairpin = StaveHairpin;\nVex.Flow.BoundingBox = BoundingBox;\nVex.Flow.Stroke = Stroke;\nVex.Flow.TextNote = TextNote;\nVex.Flow.Curve = Curve;\nVex.Flow.TextDynamics = TextDynamics;\nVex.Flow.StaveLine = StaveLine;\nVex.Flow.Ornament = Ornament;\nVex.Flow.PedalMarking = PedalMarking;\nVex.Flow.TextBracket = TextBracket;\nVex.Flow.FretHandFinger = FretHandFinger;\nVex.Flow.Repetition = Repetition;\nVex.Flow.BarNote = BarNote;\nVex.Flow.GhostNote = GhostNote;\nVex.Flow.NoteSubGroup = NoteSubGroup;\nVex.Flow.GraceNoteGroup = GraceNoteGroup;\nVex.Flow.Tremolo = Tremolo;\nVex.Flow.StringNumber = StringNumber;\nVex.Flow.Crescendo = Crescendo;\nVex.Flow.Volta = Volta;\nVex.Flow.Font = Font;\nVex.Flow.System = System;\nVex.Flow.Factory = Factory;\nVex.Flow.Parser = Parser;\nVex.Flow.EasyScore = EasyScore;\nVex.Flow.Registry = Registry;\n\nexport default Vex;\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\n\nimport { Vex } from './vex';\nimport { Music } from './music';\n\nexport class KeyManager {\n constructor(key) {\n this.music = new Music();\n this.setKey(key);\n }\n\n setKey(key) {\n this.key = key;\n this.reset();\n return this;\n }\n\n getKey() { return this.key; }\n\n reset() {\n this.keyParts = this.music.getKeyParts(this.key);\n\n this.keyString = this.keyParts.root;\n if (this.keyParts.accidental) this.keyString += this.keyParts.accidental;\n\n const is_supported_type = Music.scaleTypes[this.keyParts.type];\n if (!is_supported_type) {\n throw new Vex.RERR('BadArguments', `Unsupported key type: ${this.key}`);\n }\n\n this.scale = this.music.getScaleTones(\n this.music.getNoteValue(this.keyString),\n Music.scaleTypes[this.keyParts.type]\n );\n\n this.scaleMap = {};\n this.scaleMapByValue = {};\n this.originalScaleMapByValue = {};\n\n const noteLocation = Music.root_indices[this.keyParts.root];\n\n for (let i = 0; i < Music.roots.length; ++i) {\n const index = (noteLocation + i) % Music.roots.length;\n const rootName = Music.roots[index];\n\n const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n this.scaleMap[rootName] = noteName;\n this.scaleMapByValue[this.scale[i]] = noteName;\n this.originalScaleMapByValue[this.scale[i]] = noteName;\n }\n\n return this;\n }\n\n getAccidental(key) {\n const root = this.music.getKeyParts(key).root;\n const parts = this.music.getNoteParts(this.scaleMap[root]);\n\n return {\n note: this.scaleMap[root],\n accidental: parts.accidental,\n };\n }\n\n selectNote(note) {\n note = note.toLowerCase();\n const parts = this.music.getNoteParts(note);\n\n // First look for matching note in our altered scale\n const scaleNote = this.scaleMap[parts.root];\n const modparts = this.music.getNoteParts(scaleNote);\n\n if (scaleNote === note) {\n return {\n 'note': scaleNote,\n 'accidental': parts.accidental,\n 'change': false,\n };\n }\n\n // Then search for a note of equivalent value in our altered scale\n const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n if (valueNote != null) {\n return {\n 'note': valueNote,\n 'accidental': this.music.getNoteParts(valueNote).accidental,\n 'change': false,\n };\n }\n\n // Then search for a note of equivalent value in the original scale\n const originalValueNote = this.originalScaleMapByValue[\n this.music.getNoteValue(note)];\n if (originalValueNote != null) {\n this.scaleMap[modparts.root] = originalValueNote;\n delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n return {\n 'note': originalValueNote,\n 'accidental': this.music.getNoteParts(originalValueNote).accidental,\n 'change': true,\n };\n }\n\n // Then try to unmodify a currently modified note.\n if (modparts.root === note) {\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(modparts.root)] = modparts.root;\n this.scaleMap[modparts.root] = modparts.root;\n return {\n 'note': modparts.root,\n 'accidental': null,\n 'change': true,\n };\n }\n\n // Last resort -- shitshoot\n delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n\n delete this.scaleMap[modparts.root];\n this.scaleMap[modparts.root] = note;\n\n return {\n note,\n 'accidental': parts.accidental,\n 'change': true,\n };\n }\n}\n","\nexport class MusicSheetReadingException implements Error {\n public name: string;\n public message: string;\n constructor(message: string, e?: Error) {\n //super(message);\n this.message = message;\n if (e) {\n this.message += \" \" + e.toString();\n }\n }\n}\n\n\nexport class ArgumentOutOfRangeException implements Error {\n public name: string;\n public message: string;\n constructor(message: string) {\n //super(message);\n this.message = message;\n }\n}\n\nexport class InvalidEnumArgumentException implements Error {\n public name: string;\n public message: string;\n constructor(message: string) {\n this.message = message;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\nvar Dictionary = /** @class */ (function () {\n /**\n * Creates an empty dictionary.\n * @class

Dictionaries map keys to values; each key can map to at most one value.\n * This implementation accepts any kind of objects as keys.

\n *\n *

If the keys are custom objects a function which converts keys to unique\n * strings must be provided. Example:

\n *
\n     * function petToString(pet) {\n     *  return pet.name;\n     * }\n     * 
\n * @constructor\n * @param {function(Object):string=} toStrFunction optional function used\n * to convert keys to strings. If the keys aren't strings or if toString()\n * is not appropriate, a custom function which receives a key and returns a\n * unique string must be provided.\n */\n function Dictionary(toStrFunction) {\n this.table = {};\n this.nElements = 0;\n this.toStr = toStrFunction || util.defaultToString;\n }\n /**\n * Returns the value to which this dictionary maps the specified key.\n * Returns undefined if this dictionary contains no mapping for this key.\n * @param {Object} key key whose associated value is to be returned.\n * @return {*} the value to which this dictionary maps the specified key or\n * undefined if the map contains no mapping for this key.\n */\n Dictionary.prototype.getValue = function (key) {\n var pair = this.table['$' + this.toStr(key)];\n if (util.isUndefined(pair)) {\n return undefined;\n }\n return pair.value;\n };\n /**\n * Associates the specified value with the specified key in this dictionary.\n * If the dictionary previously contained a mapping for this key, the old\n * value is replaced by the specified value.\n * @param {Object} key key with which the specified value is to be\n * associated.\n * @param {Object} value value to be associated with the specified key.\n * @return {*} previous value associated with the specified key, or undefined if\n * there was no mapping for the key or if the key/value are undefined.\n */\n Dictionary.prototype.setValue = function (key, value) {\n if (util.isUndefined(key) || util.isUndefined(value)) {\n return undefined;\n }\n var ret;\n var k = '$' + this.toStr(key);\n var previousElement = this.table[k];\n if (util.isUndefined(previousElement)) {\n this.nElements++;\n ret = undefined;\n }\n else {\n ret = previousElement.value;\n }\n this.table[k] = {\n key: key,\n value: value\n };\n return ret;\n };\n /**\n * Removes the mapping for this key from this dictionary if it is present.\n * @param {Object} key key whose mapping is to be removed from the\n * dictionary.\n * @return {*} previous value associated with specified key, or undefined if\n * there was no mapping for key.\n */\n Dictionary.prototype.remove = function (key) {\n var k = '$' + this.toStr(key);\n var previousElement = this.table[k];\n if (!util.isUndefined(previousElement)) {\n delete this.table[k];\n this.nElements--;\n return previousElement.value;\n }\n return undefined;\n };\n /**\n * Returns an array containing all of the keys in this dictionary.\n * @return {Array} an array containing all of the keys in this dictionary.\n */\n Dictionary.prototype.keys = function () {\n var array = [];\n for (var name_1 in this.table) {\n if (util.has(this.table, name_1)) {\n var pair = this.table[name_1];\n array.push(pair.key);\n }\n }\n return array;\n };\n /**\n * Returns an array containing all of the values in this dictionary.\n * @return {Array} an array containing all of the values in this dictionary.\n */\n Dictionary.prototype.values = function () {\n var array = [];\n for (var name_2 in this.table) {\n if (util.has(this.table, name_2)) {\n var pair = this.table[name_2];\n array.push(pair.value);\n }\n }\n return array;\n };\n /**\n * Executes the provided function once for each key-value pair\n * present in this dictionary.\n * @param {function(Object,Object):*} callback function to execute, it is\n * invoked with two arguments: key and value. To break the iteration you can\n * optionally return false.\n */\n Dictionary.prototype.forEach = function (callback) {\n for (var name_3 in this.table) {\n if (util.has(this.table, name_3)) {\n var pair = this.table[name_3];\n var ret = callback(pair.key, pair.value);\n if (ret === false) {\n return;\n }\n }\n }\n };\n /**\n * Returns true if this dictionary contains a mapping for the specified key.\n * @param {Object} key key whose presence in this dictionary is to be\n * tested.\n * @return {boolean} true if this dictionary contains a mapping for the\n * specified key.\n */\n Dictionary.prototype.containsKey = function (key) {\n return !util.isUndefined(this.getValue(key));\n };\n /**\n * Removes all mappings from this dictionary.\n * @this {collections.Dictionary}\n */\n Dictionary.prototype.clear = function () {\n this.table = {};\n this.nElements = 0;\n };\n /**\n * Returns the number of keys in this dictionary.\n * @return {number} the number of key-value mappings in this dictionary.\n */\n Dictionary.prototype.size = function () {\n return this.nElements;\n };\n /**\n * Returns true if this dictionary contains no mappings.\n * @return {boolean} true if this dictionary contains no mappings.\n */\n Dictionary.prototype.isEmpty = function () {\n return this.nElements <= 0;\n };\n Dictionary.prototype.toString = function () {\n var toret = '{';\n this.forEach(function (k, v) {\n toret += \"\\n\\t\" + k + \" : \" + v;\n });\n return toret + '\\n}';\n };\n return Dictionary;\n}()); // End of dictionary\nexports.default = Dictionary;\n//# sourceMappingURL=Dictionary.js.map","import {TextAlignmentEnum} from \"../Common/Enums/TextAlignment\";\nimport {OSMDColor} from \"../Common/DataObjects/OSMDColor\";\nimport {Fonts} from \"../Common/Enums/Fonts\";\nimport {FontStyles} from \"../Common/Enums/FontStyles\";\n\n/**\n * A text label on the graphical music sheet.\n * It is used e.g. for titles, composer names, instrument names and dynamic instructions.\n */\nexport class Label {\n\n constructor(text: string = \"\", alignment: TextAlignmentEnum = TextAlignmentEnum.CenterBottom,\n font: Fonts = undefined) {\n this.text = text;\n this.textAlignment = alignment;\n this.font = font;\n this.fontFamily = undefined; // default value, will use EngravingRules.DefaultFontFamily at rendering\n }\n\n public text: string;\n public color: OSMDColor;\n public colorDefault: string; // TODO this is Vexflow format, convert to OSMDColor. for now convenient for default colors.\n public font: Fonts;\n public fontFamily: string; // default undefined: will use EngravingRules.DefaultFontFamily at rendering\n public fontStyle: FontStyles;\n public fontHeight: number;\n public textAlignment: TextAlignmentEnum;\n\n public ToString(): string {\n return this.text;\n }\n}\n","import { GraphicalStaffEntry } from \"./GraphicalStaffEntry\";\nimport { StaffLine } from \"./StaffLine\";\nimport { GraphicalMusicSheet } from \"./GraphicalMusicSheet\";\nimport { EngravingRules } from \"./EngravingRules\";\nimport { Tie } from \"../VoiceData/Tie\";\nimport { Fraction } from \"../../Common/DataObjects/Fraction\";\nimport { Note } from \"../VoiceData/Note\";\nimport { MusicSheet } from \"../MusicSheet\";\nimport { GraphicalMeasure } from \"./GraphicalMeasure\";\nimport {ClefInstruction, ClefEnum} from \"../VoiceData/Instructions/ClefInstruction\";\nimport { LyricWord } from \"../VoiceData/Lyrics/LyricsWord\";\nimport { SourceMeasure } from \"../VoiceData/SourceMeasure\";\nimport { GraphicalMusicPage } from \"./GraphicalMusicPage\";\nimport { GraphicalNote } from \"./GraphicalNote\";\nimport { Beam } from \"../VoiceData/Beam\";\nimport { OctaveEnum } from \"../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport { VoiceEntry, StemDirectionType } from \"../VoiceData/VoiceEntry\";\nimport { OrnamentContainer } from \"../VoiceData/OrnamentContainer\";\nimport { ArticulationEnum } from \"../VoiceData/VoiceEntry\";\nimport { Tuplet } from \"../VoiceData/Tuplet\";\nimport { MusicSystem } from \"./MusicSystem\";\nimport { GraphicalTie } from \"./GraphicalTie\";\nimport { RepetitionInstruction } from \"../VoiceData/Instructions/RepetitionInstruction\";\nimport { MultiExpression, MultiExpressionEntry } from \"../VoiceData/Expressions/MultiExpression\";\nimport { StaffEntryLink } from \"../VoiceData/StaffEntryLink\";\nimport { MusicSystemBuilder } from \"./MusicSystemBuilder\";\nimport { MultiTempoExpression } from \"../VoiceData/Expressions/MultiTempoExpression\";\nimport { Repetition } from \"../MusicSource/Repetition\";\nimport { PointF2D } from \"../../Common/DataObjects/PointF2D\";\nimport { SourceStaffEntry } from \"../VoiceData/SourceStaffEntry\";\nimport { BoundingBox } from \"./BoundingBox\";\nimport { Instrument } from \"../Instrument\";\nimport { GraphicalLabel } from \"./GraphicalLabel\";\nimport { TextAlignmentEnum } from \"../../Common/Enums/TextAlignment\";\nimport { VerticalGraphicalStaffEntryContainer } from \"./VerticalGraphicalStaffEntryContainer\";\nimport { KeyInstruction } from \"../VoiceData/Instructions/KeyInstruction\";\nimport { AbstractNotationInstruction } from \"../VoiceData/Instructions/AbstractNotationInstruction\";\nimport { TechnicalInstruction } from \"../VoiceData/Instructions/TechnicalInstruction\";\nimport { Pitch } from \"../../Common/DataObjects/Pitch\";\nimport { LinkedVoice } from \"../VoiceData/LinkedVoice\";\nimport { ColDirEnum } from \"./BoundingBox\";\nimport { IGraphicalSymbolFactory } from \"../Interfaces/IGraphicalSymbolFactory\";\nimport { ITextMeasurer } from \"../Interfaces/ITextMeasurer\";\nimport { ITransposeCalculator } from \"../Interfaces/ITransposeCalculator\";\nimport { OctaveShiftParams } from \"./OctaveShiftParams\";\nimport { AccidentalCalculator } from \"./AccidentalCalculator\";\nimport { MidiInstrument } from \"../VoiceData/Instructions/ClefInstruction\";\nimport { Staff } from \"../VoiceData/Staff\";\nimport { OctaveShift } from \"../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport log from \"loglevel\";\nimport Dictionary from \"typescript-collections/dist/lib/Dictionary\";\nimport { GraphicalLyricEntry } from \"./GraphicalLyricEntry\";\nimport { GraphicalLyricWord } from \"./GraphicalLyricWord\";\nimport { GraphicalLine } from \"./GraphicalLine\";\nimport { Label } from \"../Label\";\nimport { GraphicalVoiceEntry } from \"./GraphicalVoiceEntry\";\nimport { VerticalSourceStaffEntryContainer } from \"../VoiceData/VerticalSourceStaffEntryContainer\";\nimport { SkyBottomLineCalculator } from \"./SkyBottomLineCalculator\";\nimport { PlacementEnum } from \"../VoiceData/Expressions/AbstractExpression\";\nimport { AbstractGraphicalInstruction } from \"./AbstractGraphicalInstruction\";\nimport { GraphicalInstantaneousTempoExpression } from \"./GraphicalInstantaneousTempoExpression\";\nimport { InstantaneousTempoExpression, TempoEnum } from \"../VoiceData/Expressions/InstantaneousTempoExpression\";\nimport { ContinuousTempoExpression } from \"../VoiceData/Expressions/ContinuousExpressions/ContinuousTempoExpression\";\nimport { FontStyles } from \"../../Common/Enums/FontStyles\";\nimport { AbstractTempoExpression } from \"../VoiceData/Expressions/AbstractTempoExpression\";\nimport { GraphicalInstantaneousDynamicExpression } from \"./GraphicalInstantaneousDynamicExpression\";\nimport { ContDynamicEnum } from \"../VoiceData/Expressions/ContinuousExpressions/ContinuousDynamicExpression\";\nimport { GraphicalContinuousDynamicExpression } from \"./GraphicalContinuousDynamicExpression\";\nimport { FillEmptyMeasuresWithWholeRests } from \"../../OpenSheetMusicDisplay/OSMDOptions\";\nimport { IStafflineNoteCalculator } from \"../Interfaces/IStafflineNoteCalculator\";\nimport { GraphicalUnknownExpression } from \"./GraphicalUnknownExpression\";\n\n/**\n * Class used to do all the calculations in a MusicSheet, which in the end populates a GraphicalMusicSheet.\n */\nexport abstract class MusicSheetCalculator {\n public static symbolFactory: IGraphicalSymbolFactory;\n public static transposeCalculator: ITransposeCalculator;\n public static stafflineNoteCalculator: IStafflineNoteCalculator;\n protected static textMeasurer: ITextMeasurer;\n\n protected staffEntriesWithGraphicalTies: GraphicalStaffEntry[] = [];\n protected staffEntriesWithOrnaments: GraphicalStaffEntry[] = [];\n protected staffEntriesWithChordSymbols: GraphicalStaffEntry[] = [];\n protected staffLinesWithLyricWords: StaffLine[] = [];\n\n protected graphicalLyricWords: GraphicalLyricWord[] = [];\n\n protected graphicalMusicSheet: GraphicalMusicSheet;\n protected rules: EngravingRules;\n protected musicSystems: MusicSystem[];\n\n public static get TextMeasurer(): ITextMeasurer {\n return MusicSheetCalculator.textMeasurer;\n }\n\n public static set TextMeasurer(value: ITextMeasurer) {\n MusicSheetCalculator.textMeasurer = value;\n }\n\n protected get leadSheet(): boolean {\n return this.graphicalMusicSheet.LeadSheet;\n }\n\n protected static setMeasuresMinStaffEntriesWidth(measures: GraphicalMeasure[], minimumStaffEntriesWidth: number): void {\n for (let idx: number = 0, len: number = measures.length; idx < len; ++idx) {\n const measure: GraphicalMeasure = measures[idx];\n measure.minimumStaffEntriesWidth = minimumStaffEntriesWidth;\n }\n }\n\n public initialize(graphicalMusicSheet: GraphicalMusicSheet): void {\n this.graphicalMusicSheet = graphicalMusicSheet;\n this.rules = graphicalMusicSheet.ParentMusicSheet.Rules;\n this.prepareGraphicalMusicSheet();\n //this.calculate();\n }\n\n /**\n * Build the 2D [[GraphicalMeasure]] list needed for the [[MusicSheetCalculator]].\n * Internally it creates [[GraphicalMeasure]]s, [[GraphicalStaffEntry]]'s and [[GraphicalNote]]s.\n */\n public prepareGraphicalMusicSheet(): void {\n // Clear the stored system images dict - all systems have to be redrawn.\n // Not necessary now. TODO Check\n // this.graphicalMusicSheet.SystemImages.length = 0;\n const musicSheet: MusicSheet = this.graphicalMusicSheet.ParentMusicSheet;\n\n this.staffEntriesWithGraphicalTies = [];\n this.staffEntriesWithOrnaments = [];\n this.staffEntriesWithChordSymbols = [];\n this.staffLinesWithLyricWords = [];\n // this.staffLinesWithGraphicalExpressions = [];\n\n this.graphicalMusicSheet.Initialize();\n const measureList: GraphicalMeasure[][] = this.graphicalMusicSheet.MeasureList;\n\n // one AccidentalCalculator for each Staff (regardless of Instrument)\n const accidentalCalculators: AccidentalCalculator[] = this.createAccidentalCalculators();\n\n // List of Active ClefInstructions\n const activeClefs: ClefInstruction[] = this.graphicalMusicSheet.initializeActiveClefs();\n\n // LyricWord - GraphicalLyricWord Lists\n const lyricWords: LyricWord[] = [];\n\n const completeNumberOfStaves: number = musicSheet.getCompleteNumberOfStaves();\n\n // Octave Shifts List\n const openOctaveShifts: OctaveShiftParams[] = [];\n\n // TieList - timestampsArray\n for (let i: number = 0; i < completeNumberOfStaves; i++) {\n openOctaveShifts.push(undefined);\n }\n\n // go through all SourceMeasures (taking into account normal SourceMusicParts and Repetitions)\n for (let idx: number = 0, len: number = musicSheet.SourceMeasures.length; idx < len; ++idx) {\n const sourceMeasure: SourceMeasure = musicSheet.SourceMeasures[idx];\n const graphicalMeasures: GraphicalMeasure[] = this.createGraphicalMeasuresForSourceMeasure(\n sourceMeasure,\n accidentalCalculators,\n lyricWords,\n openOctaveShifts,\n activeClefs\n );\n measureList.push(graphicalMeasures);\n }\n this.handleStaffEntries();\n this.calculateVerticalContainersList();\n this.setIndicesToVerticalGraphicalContainers();\n }\n\n /**\n * The main method for the Calculator.\n */\n public calculate(): void {\n this.musicSystems = [];\n\n this.clearSystemsAndMeasures();\n\n // delete graphicalObjects (currently: ties) that will be recalculated, newly create GraphicalObjects streching over a single StaffEntry\n this.clearRecreatedObjects();\n\n this.createGraphicalTies();\n\n // calculate SheetLabelBoundingBoxes\n this.calculateSheetLabelBoundingBoxes();\n this.calculateXLayout(this.graphicalMusicSheet, this.maxInstrNameLabelLength());\n\n // create List\n this.graphicalMusicSheet.MusicPages.length = 0;\n\n // create new MusicSystems and StaffLines (as many as necessary) and populate them with Measures from measureList\n this.calculateMusicSystems();\n\n // Add some white space at the end of the piece:\n //this.graphicalMusicSheet.MusicPages[0].PositionAndShape.BorderMarginBottom += 9;\n\n // transform Relative to Absolute Positions\n GraphicalMusicSheet.transformRelativeToAbsolutePosition(this.graphicalMusicSheet);\n }\n\n public calculateXLayout(graphicalMusicSheet: GraphicalMusicSheet, maxInstrNameLabelLength: number): void {\n // for each inner List in big Measure List calculate new Positions for the StaffEntries\n // and adjust Measures sizes\n // calculate max measure length for maximum zoom in.\n let minLength: number = 0;\n const maxInstructionsLength: number = this.rules.MaxInstructionsConstValue;\n if (this.graphicalMusicSheet.MeasureList.length > 0) {\n /** list of vertically ordered measures belonging to one bar */\n let measures: GraphicalMeasure[] = this.graphicalMusicSheet.MeasureList[0];\n let minimumStaffEntriesWidth: number = this.calculateMeasureXLayout(measures);\n minimumStaffEntriesWidth = this.calculateMeasureWidthFromLyrics(measures, minimumStaffEntriesWidth);\n MusicSheetCalculator.setMeasuresMinStaffEntriesWidth(measures, minimumStaffEntriesWidth);\n minLength = minimumStaffEntriesWidth * 1.2 + maxInstrNameLabelLength + maxInstructionsLength;\n for (let i: number = 1; i < this.graphicalMusicSheet.MeasureList.length; i++) {\n measures = this.graphicalMusicSheet.MeasureList[i];\n minimumStaffEntriesWidth = this.calculateMeasureXLayout(measures);\n minimumStaffEntriesWidth = this.calculateMeasureWidthFromLyrics(measures, minimumStaffEntriesWidth);\n MusicSheetCalculator.setMeasuresMinStaffEntriesWidth(measures, minimumStaffEntriesWidth);\n minLength = Math.max(minLength, minimumStaffEntriesWidth * 1.2 + maxInstructionsLength);\n }\n }\n this.graphicalMusicSheet.MinAllowedSystemWidth = minLength;\n }\n\n public calculateMeasureWidthFromLyrics(measuresVertical: GraphicalMeasure[], oldMinimumStaffEntriesWidth: number): number {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected formatMeasures(): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Calculates the x layout of the staff entries within the staff measures belonging to one source measure.\n * All staff entries are x-aligned throughout all the measures.\n * @param measures - The minimum required x width of the source measure\n */\n protected calculateMeasureXLayout(measures: GraphicalMeasure[]): number {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Called for every source measure when generating the list of staff measures for it.\n */\n protected initGraphicalMeasuresCreation(): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected handleBeam(graphicalNote: GraphicalNote, beam: Beam, openBeams: Beam[]): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Check if the tied graphical note belongs to any beams or tuplets and react accordingly.\n * @param tiedGraphicalNote\n * @param beams\n * @param activeClef\n * @param octaveShiftValue\n * @param graphicalStaffEntry\n * @param duration\n * @param openTie\n * @param isLastTieNote\n */\n protected handleTiedGraphicalNote(tiedGraphicalNote: GraphicalNote, beams: Beam[], activeClef: ClefInstruction,\n octaveShiftValue: OctaveEnum, graphicalStaffEntry: GraphicalStaffEntry, duration: Fraction,\n openTie: Tie, isLastTieNote: boolean): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected handleVoiceEntryLyrics(voiceEntry: VoiceEntry, graphicalStaffEntry: GraphicalStaffEntry,\n openLyricWords: LyricWord[]): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected handleVoiceEntryOrnaments(ornamentContainer: OrnamentContainer, voiceEntry: VoiceEntry,\n graphicalStaffEntry: GraphicalStaffEntry): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected handleVoiceEntryArticulations(articulations: ArticulationEnum[],\n voiceEntry: VoiceEntry,\n staffEntry: GraphicalStaffEntry): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Adds a technical instruction at the given staff entry.\n * @param technicalInstructions\n * @param voiceEntry\n * @param staffEntry\n */\n protected handleVoiceEntryTechnicalInstructions(technicalInstructions: TechnicalInstruction[],\n voiceEntry: VoiceEntry, staffEntry: GraphicalStaffEntry): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n\n protected handleTuplet(graphicalNote: GraphicalNote, tuplet: Tuplet, openTuplets: Tuplet[]): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected layoutVoiceEntry(voiceEntry: VoiceEntry, graphicalNotes: GraphicalNote[],\n graphicalStaffEntry: GraphicalStaffEntry, hasPitchedNote: boolean): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected layoutStaffEntry(graphicalStaffEntry: GraphicalStaffEntry): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected createGraphicalTie(tie: Tie, startGse: GraphicalStaffEntry, endGse: GraphicalStaffEntry, startNote: GraphicalNote,\n endNote: GraphicalNote): GraphicalTie {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected updateStaffLineBorders(staffLine: StaffLine): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Iterate through all Measures and calculates the MeasureNumberLabels.\n * @param musicSystem\n */\n protected calculateMeasureNumberPlacement(musicSystem: MusicSystem): void {\n const staffLine: StaffLine = musicSystem.StaffLines[0];\n let currentMeasureNumber: number = staffLine.Measures[0].MeasureNumber;\n let labelOffsetX: number = 0;\n for (const measure of staffLine.Measures) {\n if (measure.MeasureNumber === 0 || measure.MeasureNumber === 1) {\n currentMeasureNumber = measure.MeasureNumber;\n }\n if (measure !== staffLine.Measures[0] && this.rules.MeasureNumberLabelXOffset) {\n labelOffsetX = this.rules.MeasureNumberLabelXOffset;\n } else {\n labelOffsetX = 0; // don't offset label for first measure in staffline\n }\n\n if ((measure.MeasureNumber === currentMeasureNumber ||\n measure.MeasureNumber === currentMeasureNumber + this.rules.MeasureNumberLabelOffset) &&\n !measure.parentSourceMeasure.ImplicitMeasure) {\n if (measure.MeasureNumber !== 1 ||\n (measure.MeasureNumber === 1 && measure !== staffLine.Measures[0])) {\n this.calculateSingleMeasureNumberPlacement(measure, staffLine, musicSystem, labelOffsetX);\n }\n currentMeasureNumber = measure.MeasureNumber;\n }\n }\n }\n\n /// \n /// This method calculates a single MeasureNumberLabel and adds it to the graphical label list of the music system\n /// \n /// \n /// \n /// \n private calculateSingleMeasureNumberPlacement(measure: GraphicalMeasure, staffLine: StaffLine, musicSystem: MusicSystem,\n labelOffsetX: number = 0): void {\n const labelNumber: string = measure.MeasureNumber.toString();\n const label: Label = new Label(labelNumber);\n // maybe give rules as argument instead of just setting fontStyle and maybe other settings manually afterwards\n const graphicalLabel: GraphicalLabel = new GraphicalLabel(label, this.rules.MeasureNumberLabelHeight,\n TextAlignmentEnum.LeftBottom, this.rules);\n\n const skyBottomLineCalculator: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n\n // calculate LabelBoundingBox and set PSI parent\n graphicalLabel.setLabelPositionAndShapeBorders();\n graphicalLabel.PositionAndShape.Parent = musicSystem.PositionAndShape;\n\n // calculate relative Position\n const relativeX: number = staffLine.PositionAndShape.RelativePosition.x +\n measure.PositionAndShape.RelativePosition.x - graphicalLabel.PositionAndShape.BorderMarginLeft +\n labelOffsetX;\n let relativeY: number;\n\n // and the corresponding SkyLine indices\n let start: number = relativeX;\n let end: number = relativeX - graphicalLabel.PositionAndShape.BorderLeft + graphicalLabel.PositionAndShape.BorderRight;\n\n start -= staffLine.PositionAndShape.RelativePosition.x;\n end -= staffLine.PositionAndShape.RelativePosition.x;\n\n // correct for hypersensitive collision checks, notes having skyline extend too far to left and right\n const startCollisionCheck: number = start + 0.5;\n const endCollisionCheck: number = end - 0.5;\n\n // get the minimum corresponding SkyLine value\n const skyLineMinValue: number = skyBottomLineCalculator.getSkyLineMinInRange(startCollisionCheck, endCollisionCheck);\n\n if (measure === staffLine.Measures[0]) {\n // must take into account possible MusicSystem Brackets\n let minBracketTopBorder: number = 0;\n if (musicSystem.GroupBrackets.length > 0) {\n for (const groupBracket of musicSystem.GroupBrackets) {\n minBracketTopBorder = Math.min(minBracketTopBorder, groupBracket.PositionAndShape.BorderTop);\n }\n }\n relativeY = Math.min(skyLineMinValue, minBracketTopBorder);\n } else {\n relativeY = skyLineMinValue;\n }\n\n relativeY = Math.min(0, relativeY);\n\n graphicalLabel.PositionAndShape.RelativePosition = new PointF2D(relativeX, relativeY);\n\n skyBottomLineCalculator.updateSkyLineInRange(start, end, relativeY + graphicalLabel.PositionAndShape.BorderMarginTop);\n musicSystem.MeasureNumberLabels.push(graphicalLabel);\n }\n\n /**\n * Calculate the shape (Bézier curve) for this tie.\n * @param tie\n * @param tieIsAtSystemBreak\n */\n protected layoutGraphicalTie(tie: GraphicalTie, tieIsAtSystemBreak: boolean): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Calculate the Lyrics YPositions for a single [[StaffLine]].\n * @param staffLine\n * @param lyricVersesNumber\n */\n protected calculateSingleStaffLineLyricsPosition(staffLine: StaffLine, lyricVersesNumber: number[]): GraphicalStaffEntry[] {\n let numberOfVerses: number = 0;\n let lyricsStartYPosition: number = this.rules.StaffHeight; // Add offset to prevent collision\n const lyricsStaffEntriesList: GraphicalStaffEntry[] = [];\n const skyBottomLineCalculator: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n\n // first find maximum Ycoordinate for the whole StaffLine\n let len: number = staffLine.Measures.length;\n for (let idx: number = 0; idx < len; ++idx) {\n const measure: GraphicalMeasure = staffLine.Measures[idx];\n const measureRelativePosition: PointF2D = measure.PositionAndShape.RelativePosition;\n const len2: number = measure.staffEntries.length;\n for (let idx2: number = 0; idx2 < len2; ++idx2) {\n const staffEntry: GraphicalStaffEntry = measure.staffEntries[idx2];\n if (staffEntry.LyricsEntries.length > 0) {\n lyricsStaffEntriesList.push(staffEntry);\n numberOfVerses = Math.max(numberOfVerses, staffEntry.LyricsEntries.length);\n\n // Position of Staffentry relative to StaffLine\n const staffEntryPositionX: number = staffEntry.PositionAndShape.RelativePosition.x +\n measureRelativePosition.x;\n\n let minMarginLeft: number = Number.MAX_VALUE;\n let maxMarginRight: number = Number.MIN_VALUE;\n\n // if more than one LyricEntry in StaffEntry, find minMarginLeft, maxMarginRight of all corresponding Labels\n for (let i: number = 0; i < staffEntry.LyricsEntries.length; i++) {\n const lyricsEntryLabel: GraphicalLabel = staffEntry.LyricsEntries[i].GraphicalLabel;\n minMarginLeft = Math.min(minMarginLeft, staffEntryPositionX + lyricsEntryLabel.PositionAndShape.BorderMarginLeft);\n maxMarginRight = Math.max(maxMarginRight, staffEntryPositionX + lyricsEntryLabel.PositionAndShape.BorderMarginRight);\n }\n\n // check BottomLine in this range and take the maximum between the two values\n const bottomLineMax: number = skyBottomLineCalculator.getBottomLineMaxInRange(minMarginLeft, maxMarginRight);\n lyricsStartYPosition = Math.max(lyricsStartYPosition, bottomLineMax);\n }\n }\n }\n\n let maxPosition: number = 0;\n // iterate again through the Staffentries with LyricEntries\n len = lyricsStaffEntriesList.length;\n for (const staffEntry of lyricsStaffEntriesList) {\n // set LyricEntryLabel RelativePosition\n for (let i: number = 0; i < staffEntry.LyricsEntries.length; i++) {\n const lyricEntry: GraphicalLyricEntry = staffEntry.LyricsEntries[i];\n const lyricsEntryLabel: GraphicalLabel = lyricEntry.GraphicalLabel;\n\n // read the verseNumber and get index of this number in the sorted LyricVerseNumbersList of Instrument\n // eg verseNumbers: 2,3,4,6 => 1,2,3,4\n const verseNumber: number = lyricEntry.LyricsEntry.VerseNumber;\n const sortedLyricVerseNumberIndex: number = lyricVersesNumber.indexOf(verseNumber);\n const firstPosition: number = lyricsStartYPosition + this.rules.LyricsHeight + this.rules.VerticalBetweenLyricsDistance;\n\n // Y-position calculated according to aforementioned mapping\n let position: number = firstPosition + (this.rules.VerticalBetweenLyricsDistance + this.rules.LyricsHeight) * sortedLyricVerseNumberIndex;\n if (this.leadSheet) {\n position = 3.4 + (this.rules.VerticalBetweenLyricsDistance + this.rules.LyricsHeight) * (sortedLyricVerseNumberIndex);\n }\n const previousRelativeX: number = lyricsEntryLabel.PositionAndShape.RelativePosition.x;\n lyricsEntryLabel.PositionAndShape.RelativePosition = new PointF2D(previousRelativeX, position);\n maxPosition = Math.max(maxPosition, position);\n }\n }\n\n // update BottomLine (on the whole StaffLine's length)\n if (lyricsStaffEntriesList.length > 0) {\n const endX: number = staffLine.PositionAndShape.Size.width;\n let startX: number = lyricsStaffEntriesList[0].PositionAndShape.RelativePosition.x +\n lyricsStaffEntriesList[0].PositionAndShape.BorderMarginLeft +\n lyricsStaffEntriesList[0].parentMeasure.PositionAndShape.RelativePosition.x;\n startX = startX > endX ? endX : startX;\n skyBottomLineCalculator.updateBottomLineInRange(startX, endX, maxPosition);\n }\n return lyricsStaffEntriesList;\n }\n\n /**\n * calculates the dashes of lyric words and the extending underscore lines of syllables sung on more than one note.\n * @param lyricsStaffEntries\n */\n protected calculateLyricsExtendsAndDashes(lyricsStaffEntries: GraphicalStaffEntry[]): void {\n // iterate again to create now the extend lines and dashes for words\n for (let idx: number = 0, len: number = lyricsStaffEntries.length; idx < len; ++idx) {\n const staffEntry: GraphicalStaffEntry = lyricsStaffEntries[idx];\n // set LyricEntryLabel RelativePosition\n for (let i: number = 0; i < staffEntry.LyricsEntries.length; i++) {\n const lyricEntry: GraphicalLyricEntry = staffEntry.LyricsEntries[i];\n // calculate LyricWord's Dashes and underscoreLine\n if (lyricEntry.ParentLyricWord &&\n lyricEntry.ParentLyricWord.GraphicalLyricsEntries[lyricEntry.ParentLyricWord.GraphicalLyricsEntries.length - 1] !== lyricEntry) {\n this.calculateSingleLyricWord(lyricEntry);\n }\n // calculate the underscore line extend if needed\n if (lyricEntry.LyricsEntry.extend) {\n this.calculateLyricExtend(lyricEntry);\n }\n }\n }\n }\n\n /**\n * Calculate a single OctaveShift for a [[MultiExpression]].\n * @param sourceMeasure\n * @param multiExpression\n * @param measureIndex\n * @param staffIndex\n */\n protected calculateSingleOctaveShift(sourceMeasure: SourceMeasure, multiExpression: MultiExpression,\n measureIndex: number, staffIndex: number): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Calculate all the textual [[RepetitionInstruction]]s (e.g. dal segno) for a single [[SourceMeasure]].\n * @param repetitionInstruction\n * @param measureIndex\n */\n protected calculateWordRepetitionInstruction(repetitionInstruction: RepetitionInstruction,\n measureIndex: number): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n /**\n * Calculate all the Mood and Unknown Expressions for a single [[MultiExpression]].\n * @param multiExpression\n * @param measureIndex\n * @param staffIndex\n */\n protected calculateMoodAndUnknownExpression(multiExpression: MultiExpression, measureIndex: number, staffIndex: number): void {\n // calculate absolute Timestamp\n const absoluteTimestamp: Fraction = multiExpression.AbsoluteTimestamp;\n const measures: GraphicalMeasure[] = this.graphicalMusicSheet.MeasureList[measureIndex];\n let relative: PointF2D = new PointF2D();\n\n if ((multiExpression.MoodList.length > 0) || (multiExpression.UnknownList.length > 0)) {\n let combinedExprString: string = \"\";\n for (let idx: number = 0, len: number = multiExpression.EntriesList.length; idx < len; ++idx) {\n const entry: MultiExpressionEntry = multiExpression.EntriesList[idx];\n if (entry.prefix !== \"\") {\n if (combinedExprString === \"\") {\n combinedExprString += entry.prefix;\n } else {\n combinedExprString += \" \" + entry.prefix;\n }\n }\n if (combinedExprString === \"\") {\n combinedExprString += entry.label;\n } else {\n combinedExprString += \" \" + entry.label;\n }\n }\n const staffLine: StaffLine = measures[staffIndex].ParentStaffLine;\n if (!staffLine) {\n log.debug(\"MusicSheetCalculator.calculateMoodAndUnknownExpression: staffLine undefined. Returning.\");\n return;\n }\n relative = this.getRelativePositionInStaffLineFromTimestamp(absoluteTimestamp, staffIndex, staffLine, staffLine?.isPartOfMultiStaffInstrument());\n\n if (Math.abs(relative.x - 0) < 0.0001) {\n relative.x = measures[staffIndex].beginInstructionsWidth + this.rules.RhythmRightMargin;\n }\n\n const fontHeight: number = this.rules.UnknownTextHeight;\n const placement: PlacementEnum = multiExpression.getPlacementOfFirstEntry();\n const graphLabel: GraphicalLabel = this.calculateLabel(staffLine,\n relative, combinedExprString,\n multiExpression.getFontstyleOfFirstEntry(),\n placement,\n fontHeight);\n\n const gue: GraphicalUnknownExpression = new GraphicalUnknownExpression(\n staffLine, graphLabel, placement, measures[staffIndex]?.parentSourceMeasure, multiExpression);\n // multiExpression); // TODO would be nice to hand over and save reference to original expression,\n // but MultiExpression is not an AbstractExpression.\n staffLine.AbstractExpressions.push(gue);\n }\n }\n\n /**\n * Delete all Objects that must be recalculated.\n * If graphicalMusicSheet.reCalculate has been called, then this method will be called to reset or remove all flexible\n * graphical music symbols (e.g. Ornaments, Lyrics, Slurs) graphicalMusicSheet will have MusicPages, they will have MusicSystems etc...\n */\n protected clearRecreatedObjects(): void {\n // Clear StaffEntries with GraphicalTies\n for (let idx: number = 0, len: number = this.staffEntriesWithGraphicalTies.length; idx < len; ++idx) {\n const staffEntriesWithGraphicalTie: GraphicalStaffEntry = this.staffEntriesWithGraphicalTies[idx];\n staffEntriesWithGraphicalTie.GraphicalTies.length = 0;\n }\n this.staffEntriesWithGraphicalTies.length = 0;\n return;\n }\n\n /**\n * This method handles a [[StaffEntryLink]].\n * @param graphicalStaffEntry\n * @param staffEntryLinks\n */\n protected handleStaffEntryLink(graphicalStaffEntry: GraphicalStaffEntry,\n staffEntryLinks: StaffEntryLink[]): void {\n log.debug(\"handleStaffEntryLink not implemented\");\n }\n\n /**\n * Store the newly computed [[Measure]]s in newly created [[MusicSystem]]s.\n */\n protected calculateMusicSystems(): void {\n if (!this.graphicalMusicSheet.MeasureList) {\n return;\n }\n\n const allMeasures: GraphicalMeasure[][] = this.graphicalMusicSheet.MeasureList;\n if (!allMeasures) {\n return;\n }\n if (this.rules.MinMeasureToDrawIndex > allMeasures.length - 1) {\n log.debug(\"minimum measure to draw index out of range. resetting min measure index to limit.\");\n this.rules.MinMeasureToDrawIndex = allMeasures.length - 1;\n }\n\n // visible 2D-MeasureList\n const visibleMeasureList: GraphicalMeasure[][] = [];\n for (let idx: number = this.rules.MinMeasureToDrawIndex, len: number = allMeasures.length;\n idx < len && idx <= this.rules.MaxMeasureToDrawIndex; ++idx) {\n const graphicalMeasures: GraphicalMeasure[] = allMeasures[idx];\n const visiblegraphicalMeasures: GraphicalMeasure[] = [];\n for (let idx2: number = 0, len2: number = graphicalMeasures.length; idx2 < len2; ++idx2) {\n const graphicalMeasure: GraphicalMeasure = allMeasures[idx][idx2];\n\n if (graphicalMeasure.isVisible()) {\n visiblegraphicalMeasures.push(graphicalMeasure);\n\n if (this.rules.ColoringEnabled) {\n // (re-)color notes\n for (const staffEntry of graphicalMeasure.staffEntries) {\n for (const gve of staffEntry.graphicalVoiceEntries) {\n gve.color();\n }\n }\n }\n }\n }\n visibleMeasureList.push(visiblegraphicalMeasures);\n }\n\n // find out how many StaffLine Instances we need\n let numberOfStaffLines: number = 0;\n\n for (let idx: number = 0, len: number = visibleMeasureList.length; idx < len; ++idx) {\n const gmlist: GraphicalMeasure[] = visibleMeasureList[idx];\n numberOfStaffLines = Math.max(gmlist.length, numberOfStaffLines);\n\n break;\n }\n if (numberOfStaffLines === 0) {\n return;\n }\n\n\n // build the MusicSystems\n const musicSystemBuilder: MusicSystemBuilder = new MusicSystemBuilder();\n musicSystemBuilder.initialize(this.graphicalMusicSheet, visibleMeasureList, numberOfStaffLines);\n this.musicSystems = musicSystemBuilder.buildMusicSystems();\n\n this.formatMeasures();\n\n // check for Measures with only WholeRestNotes and correct their X-Position (middle of Measure)\n // this.checkMeasuresForWholeRestNotes(); // this currently does nothing\n if (!this.leadSheet) {\n // calculate Beam Placement\n // this.calculateBeams(); // does nothing for now, because layoutBeams() is an empty method\n // possible Displacement of RestNotes\n this.optimizeRestPlacement();\n // possible Displacement of RestNotes\n this.calculateStaffEntryArticulationMarks();\n if (this.rules.RenderSlurs) { // technically we should separate slurs and ties, but shouldn't be relevant for now\n // calculate Ties\n this.calculateTieCurves();\n }\n }\n // calculate Sky- and BottomLine\n // will have reasonable values only between ObjectsBorders (eg StaffEntries)\n this.calculateSkyBottomLines();\n // calculate TupletsNumbers\n this.calculateTupletNumbers();\n\n // calculate MeasureNumbers\n if (this.rules.RenderMeasureNumbers) {\n for (let idx: number = 0, len: number = this.musicSystems.length; idx < len; ++idx) {\n const musicSystem: MusicSystem = this.musicSystems[idx];\n this.calculateMeasureNumberPlacement(musicSystem);\n }\n }\n // calculate Slurs\n if (!this.leadSheet && this.rules.RenderSlurs) {\n this.calculateSlurs();\n }\n // calculate StaffEntry Ornaments\n // (must come after Slurs)\n if (!this.leadSheet) {\n this.calculateOrnaments();\n }\n // calculate StaffEntry ChordSymbols\n this.calculateChordSymbols();\n if (!this.leadSheet) {\n // calculate all Instantaneous/Continuous Dynamics Expressions\n this.calculateDynamicExpressions();\n // calculate all Mood and Unknown Expression\n this.calculateMoodAndUnknownExpressions();\n // Calculate the alignment of close expressions\n this.calculateExpressionAlignements();\n // calculate all OctaveShifts\n this.calculateOctaveShifts();\n // calcualte RepetitionInstructions (Dal Segno, Coda, etc)\n this.calculateWordRepetitionInstructions();\n }\n // calculate endings last, so they appear above measure numbers\n this.calculateRepetitionEndings();\n // calcualte all Tempo Expressions\n if (!this.leadSheet) {\n this.calculateTempoExpressions();\n }\n\n // calculate all LyricWords Positions\n this.calculateLyricsPosition();\n\n // update all StaffLine's Borders\n // create temporary Object, just to call the methods (in order to avoid declaring them static)\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n this.updateStaffLineBorders(staffLine);\n }\n }\n\n // calculate Y-spacing -> MusicPages are created here\n musicSystemBuilder.calculateSystemYLayout();\n // calculate Comments for each Staffline\n this.calculateComments();\n // calculate marked Areas for Systems\n this.calculateMarkedAreas();\n\n // the following must be done after Y-spacing, when the MusicSystems's final Dimensions are set\n // set the final yPositions of Objects such as SystemLabels and SystemLinesContainers,\n // create all System Lines, Brackets and MeasureNumbers (for all systems and for all pages)\n for (let idx: number = 0, len: number = this.graphicalMusicSheet.MusicPages.length; idx < len; ++idx) {\n const graphicalMusicPage: GraphicalMusicPage = this.graphicalMusicSheet.MusicPages[idx];\n for (let idx2: number = 0, len2: number = graphicalMusicPage.MusicSystems.length; idx2 < len2; ++idx2) {\n const isFirstSystem: boolean = idx === 0 && idx2 === 0;\n const musicSystem: MusicSystem = graphicalMusicPage.MusicSystems[idx2];\n musicSystem.setMusicSystemLabelsYPosition();\n if (!this.leadSheet) {\n musicSystem.setYPositionsToVerticalLineObjectsAndCreateLines(this.rules);\n musicSystem.createSystemLeftLine(this.rules.SystemThinLineWidth, this.rules.SystemLabelsRightMargin, isFirstSystem);\n musicSystem.createInstrumentBrackets(this.graphicalMusicSheet.ParentMusicSheet.Instruments, this.rules.StaffHeight);\n musicSystem.createGroupBrackets(this.graphicalMusicSheet.ParentMusicSheet.InstrumentalGroups, this.rules.StaffHeight, 0);\n musicSystem.alignBeginInstructions();\n } else if (musicSystem === musicSystem.Parent.MusicSystems[0]) {\n musicSystem.createSystemLeftLine(this.rules.SystemThinLineWidth, this.rules.SystemLabelsRightMargin, isFirstSystem);\n }\n musicSystem.calculateBorders(this.rules);\n }\n const distance: number = graphicalMusicPage.MusicSystems[0].PositionAndShape.BorderTop;\n for (let idx2: number = 0, len2: number = graphicalMusicPage.MusicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = graphicalMusicPage.MusicSystems[idx2];\n // let newPosition: PointF2D = new PointF2D(musicSystem.PositionAndShape.RelativePosition.x,\n // musicSystem.PositionAndShape.RelativePosition.y - distance);\n musicSystem.PositionAndShape.RelativePosition =\n new PointF2D(musicSystem.PositionAndShape.RelativePosition.x, musicSystem.PositionAndShape.RelativePosition.y - distance);\n }\n for (let idx2: number = 0, len2: number = graphicalMusicPage.MusicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = graphicalMusicPage.MusicSystems[idx2];\n for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n staffLine.addActivitySymbolClickArea();\n }\n }\n\n // calculate TopBottom Borders for all elements recursively\n graphicalMusicPage.PositionAndShape.calculateTopBottomBorders(); // necessary for composer label (page labels) for high notes in first system\n // TODO how much performance does this cost? can we reduce the amount of calculations, e.g. only checking top?\n\n // calculate all Labels's Positions for the first Page\n if (graphicalMusicPage === this.graphicalMusicSheet.MusicPages[0]) {\n this.calculatePageLabels(graphicalMusicPage);\n }\n\n // calculate TopBottom Borders for all elements recursively\n graphicalMusicPage.PositionAndShape.calculateTopBottomBorders(); // this is where top bottom borders were originally calculated (only once)\n }\n }\n\n protected calculateMarkedAreas(): void {\n //log.debug(\"calculateMarkedAreas not implemented\");\n return;\n }\n\n protected calculateComments(): void {\n //log.debug(\"calculateComments not implemented\");\n return;\n }\n\n protected calculateChordSymbols(): void {\n for (const musicSystem of this.musicSystems) {\n for (const staffLine of musicSystem.StaffLines) {\n const sbc: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n for (const measure of staffLine.Measures) {\n for (const staffEntry of measure.staffEntries) {\n if (!staffEntry.graphicalChordContainers || staffEntry.graphicalChordContainers.length === 0) {\n continue;\n }\n for (const graphicalChordContainer of staffEntry.graphicalChordContainers) {\n const sps: BoundingBox = staffEntry.PositionAndShape;\n const gps: BoundingBox = graphicalChordContainer.PositionAndShape;\n const start: number = gps.BorderMarginLeft + sps.AbsolutePosition.x;\n const end: number = gps.BorderMarginRight + sps.AbsolutePosition.x;\n sbc.updateSkyLineInRange(start, end, sps.BorderMarginTop);\n }\n }\n }\n }\n }\n }\n\n /**\n * Do layout on staff measures which only consist of a full rest.\n * @param rest\n * @param gse\n * @param measure\n */\n protected layoutMeasureWithWholeRest(rest: GraphicalNote, gse: GraphicalStaffEntry,\n measure: GraphicalMeasure): void {\n return;\n }\n\n protected layoutBeams(staffEntry: GraphicalStaffEntry): void {\n return;\n }\n\n protected layoutArticulationMarks(articulations: ArticulationEnum[], voiceEntry: VoiceEntry, graphicalStaffEntry: GraphicalStaffEntry): void {\n return;\n }\n\n protected layoutOrnament(ornaments: OrnamentContainer, voiceEntry: VoiceEntry,\n graphicalStaffEntry: GraphicalStaffEntry): void {\n return;\n }\n\n protected calculateRestNotePlacementWithinGraphicalBeam(graphicalStaffEntry: GraphicalStaffEntry,\n restNote: GraphicalNote,\n previousNote: GraphicalNote,\n nextStaffEntry: GraphicalStaffEntry,\n nextNote: GraphicalNote): void {\n return;\n }\n\n protected calculateTupletNumbers(): void {\n return;\n }\n\n protected calculateSlurs(): void {\n return;\n }\n\n protected calculateDynamicExpressionsForMultiExpression(multiExpression: MultiExpression, measureIndex: number, staffIndex: number): void {\n return;\n }\n\n\n /**\n * This method calculates the RelativePosition of a single verbal GraphicalContinuousDynamic.\n * @param graphicalContinuousDynamic Graphical continous dynamic to be calculated\n * @param startPosInStaffline Starting point in staff line\n */\n protected calculateGraphicalVerbalContinuousDynamic(graphicalContinuousDynamic: GraphicalContinuousDynamicExpression,\n startPosInStaffline: PointF2D): void {\n // if ContinuousDynamicExpression is given from words\n const graphLabel: GraphicalLabel = graphicalContinuousDynamic.Label;\n const left: number = startPosInStaffline.x + graphLabel.PositionAndShape.BorderMarginLeft;\n const right: number = startPosInStaffline.x + graphLabel.PositionAndShape.BorderMarginRight;\n // placement always below the currentStaffLine, with the exception of Voice Instrument (-> above)\n const placement: PlacementEnum = graphicalContinuousDynamic.ContinuousDynamic.Placement;\n const staffLine: StaffLine = graphicalContinuousDynamic.ParentStaffLine;\n const skyBottomLineCalculator: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n\n let drawingHeight: number;\n if (placement === PlacementEnum.Below) {\n drawingHeight = skyBottomLineCalculator.getBottomLineMaxInRange(left, right); // Bottom line\n graphLabel.PositionAndShape.RelativePosition = new PointF2D(startPosInStaffline.x, drawingHeight - graphLabel.PositionAndShape.BorderMarginTop);\n } else {\n drawingHeight = skyBottomLineCalculator.getSkyLineMinInRange(left, right);\n graphLabel.PositionAndShape.RelativePosition = new PointF2D(startPosInStaffline.x, drawingHeight - graphLabel.PositionAndShape.BorderMarginBottom);\n }\n }\n\n /**\n * This method calculates the RelativePosition of a single GraphicalContinuousDynamic.\n * @param graphicalContinuousDynamic Graphical continous dynamic to be calculated\n * @param startPosInStaffline Starting point in staff line\n */\n public calculateGraphicalContinuousDynamic(graphicalContinuousDynamic: GraphicalContinuousDynamicExpression, startPosInStaffline: PointF2D): void {\n const staffIndex: number = graphicalContinuousDynamic.ParentStaffLine.ParentStaff.idInMusicSheet;\n // TODO: Previously the staffIndex was passed down. BUT you can (and this function actually does this) get it from\n // the musicSystem OR from the ParentStaffLine. Is this the same index?\n // const staffIndex: number = musicSystem.StaffLines.indexOf(staffLine);\n\n // We know we have an end measure because otherwise we won't be called\n const endMeasure: GraphicalMeasure = this.graphicalMusicSheet.getGraphicalMeasureFromSourceMeasureAndIndex(\n graphicalContinuousDynamic.ContinuousDynamic.EndMultiExpression.SourceMeasureParent, staffIndex);\n if (!endMeasure) {\n log.warn(\"MusicSheetCalculator.calculateGraphicalContinuousDynamic: No endMeasure found\");\n return;\n }\n\n graphicalContinuousDynamic.EndMeasure = endMeasure;\n const staffLine: StaffLine = graphicalContinuousDynamic.ParentStaffLine;\n const endStaffLine: StaffLine = endMeasure.ParentStaffLine;\n\n // check if Expression spreads over the same StaffLine or not\n const sameStaffLine: boolean = endStaffLine && staffLine === endStaffLine;\n\n let isPartOfMultiStaffInstrument: boolean = false;\n if (endStaffLine) { // unfortunately we can't do something like (endStaffLine?.check() || staffLine?.check()) in this typescript version\n isPartOfMultiStaffInstrument = endStaffLine?.isPartOfMultiStaffInstrument();\n } else if (staffLine) {\n isPartOfMultiStaffInstrument = staffLine?.isPartOfMultiStaffInstrument();\n }\n\n const endAbsoluteTimestamp: Fraction = Fraction.createFromFraction(graphicalContinuousDynamic.ContinuousDynamic.EndMultiExpression.AbsoluteTimestamp);\n\n const endPosInStaffLine: PointF2D = this.getRelativePositionInStaffLineFromTimestamp(\n endAbsoluteTimestamp, staffIndex, endStaffLine, isPartOfMultiStaffInstrument, 0);\n\n //currentMusicSystem and currentStaffLine\n const musicSystem: MusicSystem = staffLine.ParentMusicSystem;\n const currentStaffLineIndex: number = musicSystem.StaffLines.indexOf(staffLine);\n const skyBottomLineCalculator: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n // let expressionIndex: number;\n\n // placement always below the currentStaffLine, with the exception of Voice Instrument (-> above)\n const placement: PlacementEnum = graphicalContinuousDynamic.ContinuousDynamic.Placement;\n\n // if ContinuousDynamicExpression is given from wedge\n let secondGraphicalContinuousDynamic: GraphicalContinuousDynamicExpression = undefined;\n\n // last length check\n if (sameStaffLine && endPosInStaffLine.x - startPosInStaffline.x < this.rules.WedgeMinLength) {\n endPosInStaffLine.x = startPosInStaffline.x + this.rules.WedgeMinLength;\n }\n\n // Upper staff wedge always starts at the given position and the lower staff wedge always starts at the begin of measure\n const upperStartX: number = startPosInStaffline.x;\n const lowerStartX: number = endStaffLine.Measures[0].beginInstructionsWidth - this.rules.WedgeHorizontalMargin - 2;\n //TODO fix this when a range of measures to draw is given that doesn't include all the dynamic's measures (e.g. for crescendo)\n let upperEndX: number = 0;\n let lowerEndX: number = 0;\n\n if (!sameStaffLine) {\n upperEndX = staffLine.PositionAndShape.Size.width;\n lowerEndX = endPosInStaffLine.x;\n\n // must create a new Wedge\n secondGraphicalContinuousDynamic = new GraphicalContinuousDynamicExpression(\n graphicalContinuousDynamic.ContinuousDynamic, endStaffLine, endMeasure.parentSourceMeasure);\n secondGraphicalContinuousDynamic.IsSplittedPart = true;\n graphicalContinuousDynamic.IsSplittedPart = true;\n } else {\n upperEndX = endPosInStaffLine.x;\n }\n\n // the Height of the Expression's placement\n let idealY: number = 0;\n let secondIdealY: number = 0;\n\n if (placement === PlacementEnum.Below) {\n // can be a single Staff Instrument or an Instrument with 2 Staves\n let nextStaffLineIndex: number = 0;\n if (currentStaffLineIndex < musicSystem.StaffLines.length - 1) {\n nextStaffLineIndex = currentStaffLineIndex + 1;\n }\n\n // check, maybe currentStaffLine is the last of the MusicSystem (and it has a ContinuousDynamicExpression with placement below)\n if (nextStaffLineIndex > currentStaffLineIndex) {\n // currentStaffLine isn't the last of the MusicSystem\n const nextStaffLine: StaffLine = musicSystem.StaffLines[nextStaffLineIndex];\n\n const distanceBetweenStaffLines: number = nextStaffLine.PositionAndShape.RelativePosition.y -\n staffLine.PositionAndShape.RelativePosition.y -\n this.rules.StaffHeight;\n\n // ideal Height is exactly between the two StaffLines\n idealY = this.rules.StaffHeight + distanceBetweenStaffLines / 2;\n } else {\n // currentStaffLine is the MusicSystem's last\n idealY = this.rules.WedgePlacementBelowY;\n }\n\n // must consider the upperWedge starting/ending tip for the comparison with the BottomLine\n idealY -= this.rules.WedgeOpeningLength / 2;\n if (!sameStaffLine) {\n // Set the value for the splitted y position to the ideal position before we check and modify it with\n // the skybottom calculator detection\n secondIdealY = idealY;\n }\n // must check BottomLine for possible collisions within the Length of the Expression\n // find the corresponding max value for the given Length\n let maxBottomLineValueForExpressionLength: number = skyBottomLineCalculator.getBottomLineMaxInRange(upperStartX, upperEndX);\n\n // if collisions, then set the Height accordingly\n if (maxBottomLineValueForExpressionLength > idealY) {\n idealY = maxBottomLineValueForExpressionLength;\n }\n\n // special case - wedge must be drawn within the boundaries of a crossedBeam\n const withinCrossedBeam: boolean = false;\n\n if (currentStaffLineIndex < musicSystem.StaffLines.length - 1) {\n // find GraphicalStaffEntries closest to wedge's xPositions\n const closestToEndStaffEntry: GraphicalStaffEntry = staffLine.findClosestStaffEntry(upperEndX);\n const closestToStartStaffEntry: GraphicalStaffEntry = staffLine.findClosestStaffEntry(upperStartX);\n\n if (closestToStartStaffEntry && closestToEndStaffEntry) {\n // must check both StaffLines\n const startVerticalContainer: VerticalGraphicalStaffEntryContainer = closestToStartStaffEntry.parentVerticalContainer;\n // const endVerticalContainer: VerticalGraphicalStaffEntryContainer = closestToEndStaffEntry.parentVerticalContainer;\n if (startVerticalContainer) {\n // TODO: Needs to be implemented?\n // withinCrossedBeam = areStaffEntriesWithinCrossedBeam(startVerticalContainer,\n // endVerticalContainer, currentStaffLineIndex, nextStaffLineIndex);\n }\n\n if (withinCrossedBeam) {\n const nextStaffLine: StaffLine = musicSystem.StaffLines[nextStaffLineIndex];\n const nextStaffLineMinSkyLineValue: number = nextStaffLine.SkyBottomLineCalculator.getSkyLineMinInRange(upperStartX, upperEndX);\n const distanceBetweenStaffLines: number = nextStaffLine.PositionAndShape.RelativePosition.y -\n staffLine.PositionAndShape.RelativePosition.y;\n const relativeSkyLineHeight: number = distanceBetweenStaffLines + nextStaffLineMinSkyLineValue;\n\n if (relativeSkyLineHeight - this.rules.WedgeOpeningLength > this.rules.StaffHeight) {\n idealY = relativeSkyLineHeight - this.rules.WedgeVerticalMargin;\n } else {\n idealY = this.rules.StaffHeight + this.rules.WedgeOpeningLength;\n }\n\n graphicalContinuousDynamic.NotToBeRemoved = true;\n }\n }\n }\n\n // do the same in case of a Wedge ending at another StaffLine\n if (!sameStaffLine) {\n maxBottomLineValueForExpressionLength = endStaffLine.SkyBottomLineCalculator.getBottomLineMaxInRange(lowerStartX, lowerEndX);\n\n if (maxBottomLineValueForExpressionLength > secondIdealY) {\n secondIdealY = maxBottomLineValueForExpressionLength;\n }\n\n secondIdealY += this.rules.WedgeOpeningLength / 2;\n secondIdealY += this.rules.WedgeVerticalMargin;\n }\n\n if (!withinCrossedBeam) {\n idealY += this.rules.WedgeOpeningLength / 2;\n idealY += this.rules.WedgeVerticalMargin;\n }\n\n } else if (placement === PlacementEnum.Above) {\n // single Staff Instrument (eg Voice)\n if (staffLine.ParentStaff.ParentInstrument.Staves.length === 1) {\n // single Staff Voice Instrument\n idealY = this.rules.WedgePlacementAboveY;\n } else {\n // Staff = not the first Staff of a 2-staved Instrument\n let previousStaffLineIndex: number = 0;\n if (currentStaffLineIndex > 0) {\n previousStaffLineIndex = currentStaffLineIndex - 1;\n }\n\n const previousStaffLine: StaffLine = musicSystem.StaffLines[previousStaffLineIndex];\n const distanceBetweenStaffLines: number = staffLine.PositionAndShape.RelativePosition.y -\n previousStaffLine.PositionAndShape.RelativePosition.y -\n this.rules.StaffHeight;\n\n // ideal Height is exactly between the two StaffLines\n idealY = -distanceBetweenStaffLines / 2;\n }\n\n // must consider the upperWedge starting/ending tip for the comparison with the SkyLine\n idealY += this.rules.WedgeOpeningLength / 2;\n if (!sameStaffLine) {\n secondIdealY = idealY;\n }\n\n // must check SkyLine for possible collisions within the Length of the Expression\n // find the corresponding min value for the given Length\n let minSkyLineValueForExpressionLength: number = skyBottomLineCalculator.getSkyLineMinInRange(upperStartX, upperEndX);\n\n // if collisions, then set the Height accordingly\n if (minSkyLineValueForExpressionLength < idealY) {\n idealY = minSkyLineValueForExpressionLength;\n }\n const withinCrossedBeam: boolean = false;\n\n // special case - wedge must be drawn within the boundaries of a crossedBeam\n if (staffLine.ParentStaff.ParentInstrument.Staves.length > 1 && currentStaffLineIndex > 0) {\n // find GraphicalStaffEntries closest to wedge's xPositions\n const closestToStartStaffEntry: GraphicalStaffEntry = staffLine.findClosestStaffEntry(upperStartX);\n const closestToEndStaffEntry: GraphicalStaffEntry = staffLine.findClosestStaffEntry(upperEndX);\n\n if (closestToStartStaffEntry && closestToEndStaffEntry) {\n // must check both StaffLines\n const startVerticalContainer: VerticalGraphicalStaffEntryContainer = closestToStartStaffEntry.parentVerticalContainer;\n // const endVerticalContainer: VerticalGraphicalStaffEntryContainer = closestToEndStaffEntry.parentVerticalContainer;\n const formerStaffLineIndex: number = currentStaffLineIndex - 1;\n if (startVerticalContainer) {\n // withinCrossedBeam = this.areStaffEntriesWithinCrossedBeam(startVerticalContainer,\n // endVerticalContainer, currentStaffLineIndex, formerStaffLineIndex);\n }\n\n if (withinCrossedBeam) {\n const formerStaffLine: StaffLine = musicSystem.StaffLines[formerStaffLineIndex];\n const formerStaffLineMaxBottomLineValue: number = formerStaffLine.SkyBottomLineCalculator.\n getBottomLineMaxInRange(upperStartX, upperEndX);\n const distanceBetweenStaffLines: number = staffLine.PositionAndShape.RelativePosition.y -\n formerStaffLine.PositionAndShape.RelativePosition.y;\n const relativeSkyLineHeight: number = distanceBetweenStaffLines - formerStaffLineMaxBottomLineValue;\n idealY = (relativeSkyLineHeight - this.rules.StaffHeight) / 2 + this.rules.StaffHeight;\n }\n }\n }\n\n // do the same in case of a Wedge ending at another StaffLine\n if (!sameStaffLine) {\n minSkyLineValueForExpressionLength = endStaffLine.SkyBottomLineCalculator.getSkyLineMinInRange(lowerStartX, lowerEndX);\n\n if (minSkyLineValueForExpressionLength < secondIdealY) {\n secondIdealY = minSkyLineValueForExpressionLength;\n }\n\n secondIdealY -= this.rules.WedgeOpeningLength / 2;\n }\n\n if (!withinCrossedBeam) {\n idealY -= this.rules.WedgeOpeningLength / 2;\n idealY -= this.rules.WedgeVerticalMargin;\n }\n if (!sameStaffLine) {\n secondIdealY -= this.rules.WedgeVerticalMargin;\n }\n }\n\n // now we have the correct placement Height for the Expression\n // the idealY is calculated relative to the currentStaffLine\n\n // Crescendo (point to the left, opening to the right)\n graphicalContinuousDynamic.Lines.clear();\n if (graphicalContinuousDynamic.ContinuousDynamic.DynamicType === ContDynamicEnum.crescendo) {\n if (sameStaffLine) {\n graphicalContinuousDynamic.createCrescendoLines(upperStartX, upperEndX, idealY);\n graphicalContinuousDynamic.calcPsi();\n } else {\n // two different Wedges\n graphicalContinuousDynamic.createFirstHalfCrescendoLines(upperStartX, upperEndX, idealY);\n graphicalContinuousDynamic.calcPsi();\n\n secondGraphicalContinuousDynamic.createSecondHalfCrescendoLines(lowerStartX, lowerEndX, secondIdealY);\n secondGraphicalContinuousDynamic.calcPsi();\n }\n } else if (graphicalContinuousDynamic.ContinuousDynamic.DynamicType === ContDynamicEnum.diminuendo) {\n if (sameStaffLine) {\n graphicalContinuousDynamic.createDiminuendoLines(upperStartX, upperEndX, idealY);\n graphicalContinuousDynamic.calcPsi();\n } else {\n graphicalContinuousDynamic.createFirstHalfDiminuendoLines(upperStartX, upperEndX, idealY);\n graphicalContinuousDynamic.calcPsi();\n\n secondGraphicalContinuousDynamic.createSecondHalfDiminuendoLines(lowerStartX, lowerEndX, secondIdealY);\n secondGraphicalContinuousDynamic.calcPsi();\n }\n } //End Diminuendo\n }\n\n /**\n * This method calculates the RelativePosition of a single GraphicalInstantaneousDynamicExpression.\n * @param graphicalInstantaneousDynamic Dynamic expression to be calculated\n * @param startPosInStaffline Starting point in staff line\n */\n protected calculateGraphicalInstantaneousDynamicExpression(graphicalInstantaneousDynamic: GraphicalInstantaneousDynamicExpression,\n startPosInStaffline: PointF2D): void {\n // get Margin Dimensions\n const staffLine: StaffLine = graphicalInstantaneousDynamic.ParentStaffLine;\n if (!staffLine) {\n return; // TODO can happen when drawing range modified (osmd.setOptions({drawFromMeasureNumber...}))\n }\n const left: number = startPosInStaffline.x + graphicalInstantaneousDynamic.PositionAndShape.BorderMarginLeft;\n const right: number = startPosInStaffline.x + graphicalInstantaneousDynamic.PositionAndShape.BorderMarginRight;\n const skyBottomLineCalculator: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n let yPosition: number = 0;\n\n // calculate yPosition according to Placement\n if (graphicalInstantaneousDynamic.Placement === PlacementEnum.Above) {\n const skyLineValue: number = skyBottomLineCalculator.getSkyLineMinInRange(left, right);\n\n // if StaffLine part of multiStaff Instrument and not the first one, ideal yPosition middle of distance between Staves\n if (staffLine.isPartOfMultiStaffInstrument() && staffLine.ParentStaff !== staffLine.ParentStaff.ParentInstrument.Staves[0]) {\n const formerStaffLine: StaffLine = staffLine.ParentMusicSystem.StaffLines[staffLine.ParentMusicSystem.StaffLines.indexOf(staffLine) - 1];\n const difference: number = staffLine.PositionAndShape.RelativePosition.y -\n formerStaffLine.PositionAndShape.RelativePosition.y - this.rules.StaffHeight;\n\n // take always into account the size of the Dynamic\n if (skyLineValue > -difference / 2) {\n yPosition = -difference / 2;\n } else {\n yPosition = skyLineValue - graphicalInstantaneousDynamic.PositionAndShape.BorderMarginBottom;\n }\n } else {\n yPosition = skyLineValue - graphicalInstantaneousDynamic.PositionAndShape.BorderMarginBottom;\n }\n\n graphicalInstantaneousDynamic.PositionAndShape.RelativePosition = new PointF2D(startPosInStaffline.x, yPosition);\n } else if (graphicalInstantaneousDynamic.Placement === PlacementEnum.Below) {\n const bottomLineValue: number = skyBottomLineCalculator.getBottomLineMaxInRange(left, right);\n // if StaffLine part of multiStaff Instrument and not the last one, ideal yPosition middle of distance between Staves\n const lastStaff: Staff = staffLine.ParentStaff.ParentInstrument.Staves[staffLine.ParentStaff.ParentInstrument.Staves.length - 1];\n if (staffLine.isPartOfMultiStaffInstrument() && staffLine.ParentStaff !== lastStaff) {\n const nextStaffLine: StaffLine = staffLine.ParentMusicSystem.StaffLines[staffLine.ParentMusicSystem.StaffLines.indexOf(staffLine) + 1];\n const difference: number = nextStaffLine.PositionAndShape.RelativePosition.y -\n staffLine.PositionAndShape.RelativePosition.y - this.rules.StaffHeight;\n const border: number = graphicalInstantaneousDynamic.PositionAndShape.BorderMarginBottom;\n\n // take always into account the size of the Dynamic\n if (bottomLineValue + border < this.rules.StaffHeight + difference / 2) {\n yPosition = this.rules.StaffHeight + difference / 2;\n } else {\n yPosition = bottomLineValue - graphicalInstantaneousDynamic.PositionAndShape.BorderMarginTop;\n }\n } else {\n yPosition = bottomLineValue - graphicalInstantaneousDynamic.PositionAndShape.BorderMarginTop;\n }\n\n graphicalInstantaneousDynamic.PositionAndShape.RelativePosition = new PointF2D(startPosInStaffline.x, yPosition);\n }\n graphicalInstantaneousDynamic.updateSkyBottomLine();\n }\n\n protected calcGraphicalRepetitionEndingsRecursively(repetition: Repetition): void {\n return;\n }\n\n /**\n * Calculate a single GraphicalRepetition.\n * @param start\n * @param end\n * @param numberText\n * @param offset\n * @param leftOpen\n * @param rightOpen\n */\n protected layoutSingleRepetitionEnding(start: GraphicalMeasure, end: GraphicalMeasure, numberText: string,\n offset: number, leftOpen: boolean, rightOpen: boolean): void {\n return;\n }\n\n protected calculateLabel(staffLine: StaffLine,\n relative: PointF2D,\n combinedString: string,\n style: FontStyles,\n placement: PlacementEnum,\n fontHeight: number,\n textAlignment: TextAlignmentEnum = TextAlignmentEnum.CenterBottom): GraphicalLabel {\n const label: Label = new Label(combinedString, textAlignment);\n label.fontStyle = style;\n label.fontHeight = fontHeight;\n\n // TODO_RR: TextHeight from first Entry\n const graphLabel: GraphicalLabel = new GraphicalLabel(label, fontHeight, label.textAlignment, this.rules, staffLine.PositionAndShape);\n const marginFactor: number = 1.1;\n\n if (placement === PlacementEnum.Below) {\n graphLabel.Label.textAlignment = TextAlignmentEnum.LeftTop;\n }\n\n graphLabel.setLabelPositionAndShapeBorders();\n graphLabel.PositionAndShape.BorderMarginBottom *= marginFactor;\n graphLabel.PositionAndShape.BorderMarginTop *= marginFactor;\n graphLabel.PositionAndShape.BorderMarginLeft *= marginFactor;\n graphLabel.PositionAndShape.BorderMarginRight *= marginFactor;\n\n let left: number = relative.x + graphLabel.PositionAndShape.BorderMarginLeft;\n let right: number = relative.x + graphLabel.PositionAndShape.BorderMarginRight;\n\n // check if GraphicalLabel exceeds the StaffLine's borders.\n if (right > staffLine.PositionAndShape.Size.width) {\n right = staffLine.PositionAndShape.Size.width - this.rules.MeasureRightMargin;\n left = right - graphLabel.PositionAndShape.MarginSize.width;\n relative.x = left - graphLabel.PositionAndShape.BorderMarginLeft;\n }\n\n // find allowed position (where the Label can be positioned) from Sky- BottomLine\n let drawingHeight: number;\n const skyBottomLineCalculator: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n if (placement === PlacementEnum.Below) {\n drawingHeight = skyBottomLineCalculator.getBottomLineMaxInRange(left, right);\n } else {\n drawingHeight = skyBottomLineCalculator.getSkyLineMinInRange(left, right);\n }\n\n // set RelativePosition\n graphLabel.PositionAndShape.RelativePosition = new PointF2D(relative.x, drawingHeight);\n\n // update Sky- BottomLine\n if (placement === PlacementEnum.Below) {\n skyBottomLineCalculator.updateBottomLineInRange(left, right, graphLabel.PositionAndShape.BorderMarginBottom + drawingHeight);\n } else {\n skyBottomLineCalculator.updateSkyLineInRange(left, right, graphLabel.PositionAndShape.BorderMarginTop + drawingHeight);\n }\n return graphLabel;\n }\n\n protected calculateTempoExpressionsForMultiTempoExpression(sourceMeasure: SourceMeasure, multiTempoExpression: MultiTempoExpression,\n measureIndex: number): void {\n // calculate absolute Timestamp\n const absoluteTimestamp: Fraction = Fraction.plus(sourceMeasure.AbsoluteTimestamp, multiTempoExpression.Timestamp);\n const measures: GraphicalMeasure[] = this.graphicalMusicSheet.MeasureList[measureIndex];\n let relative: PointF2D = new PointF2D();\n\n if (multiTempoExpression.ContinuousTempo || multiTempoExpression.InstantaneousTempo) {\n // TempoExpressions always on the first visible System's StaffLine // TODO is it though?\n if (this.rules.MinMeasureToDrawIndex > 0) {\n return; // assuming that the tempo is always in measure 1 (idx 0), adding the expression causes issues when we don't draw measure 1\n }\n let staffLine: StaffLine = measures[0].ParentStaffLine;\n let firstVisibleMeasureX: number = measures[0].PositionAndShape.RelativePosition.x;\n let verticalIndex: number = 0;\n for (let j: number = 0; j < measures.length; j++) {\n if (!measures[j].ParentStaffLine || measures[j].ParentStaffLine.Measures.length === 0) {\n continue;\n }\n\n if (measures[j].ParentStaffLine.Measures.length > 0) {\n staffLine = measures[j].ParentStaffLine;\n firstVisibleMeasureX = measures[j].PositionAndShape.RelativePosition.x;\n verticalIndex = j;\n break;\n }\n }\n relative = this.getRelativePositionInStaffLineFromTimestamp(absoluteTimestamp,\n verticalIndex,\n staffLine,\n staffLine.isPartOfMultiStaffInstrument(),\n firstVisibleMeasureX);\n\n // also placement Above\n if (multiTempoExpression.EntriesList.length > 0 &&\n multiTempoExpression.EntriesList[0].Expression instanceof InstantaneousTempoExpression) {\n const instantaniousTempo: InstantaneousTempoExpression = (multiTempoExpression.EntriesList[0].Expression as InstantaneousTempoExpression);\n instantaniousTempo.Placement = PlacementEnum.Above;\n\n // if an InstantaniousTempoExpression exists at the very beginning then\n // check if expression is positioned at first ever StaffEntry and\n // check if MusicSystem is first MusicSystem\n if (staffLine.Measures[0].staffEntries.length > 0 &&\n Math.abs(relative.x - staffLine.Measures[0].staffEntries[0].PositionAndShape.RelativePosition.x) === 0 &&\n staffLine.ParentMusicSystem === this.musicSystems[0]) {\n const firstInstructionEntry: GraphicalStaffEntry = staffLine.Measures[0].FirstInstructionStaffEntry;\n if (firstInstructionEntry) {\n const lastInstruction: AbstractGraphicalInstruction = firstInstructionEntry.GraphicalInstructions.last();\n relative.x = lastInstruction.PositionAndShape.RelativePosition.x;\n }\n if (this.rules.CompactMode) {\n relative.x = staffLine.PositionAndShape.RelativePosition.x +\n staffLine.Measures[0].PositionAndShape.RelativePosition.x;\n }\n }\n }\n\n // const addAtLastList: GraphicalObject[] = [];\n for (const entry of multiTempoExpression.EntriesList) {\n let textAlignment: TextAlignmentEnum = TextAlignmentEnum.CenterBottom;\n if (this.rules.CompactMode) {\n textAlignment = TextAlignmentEnum.LeftBottom;\n }\n const graphLabel: GraphicalLabel = this.calculateLabel(staffLine,\n relative,\n entry.label,\n multiTempoExpression.getFontstyleOfFirstEntry(),\n entry.Expression.Placement,\n this.rules.UnknownTextHeight,\n textAlignment);\n\n if (entry.Expression instanceof InstantaneousTempoExpression) {\n //already added?\n for (const expr of staffLine.AbstractExpressions) {\n if (expr instanceof GraphicalInstantaneousTempoExpression &&\n (expr.SourceExpression as AbstractTempoExpression).Label === entry.Expression.Label) {\n //already added\n continue;\n }\n }\n\n const graphicalTempoExpr: GraphicalInstantaneousTempoExpression = new GraphicalInstantaneousTempoExpression(entry.Expression, graphLabel);\n if (!graphicalTempoExpr.ParentStaffLine) {\n log.warn(\"Adding staffline didn't work\");\n // I am actually fooling the linter here and use the created object. This method needs refactoring,\n // all graphical expression creations should be in one place and have basic stuff like labels, lines, ...\n // in their constructor\n }\n // in case of metronome mark:\n if (this.rules.MetronomeMarksDrawn) {\n if ((entry.Expression as InstantaneousTempoExpression).Enum === TempoEnum.metronomeMark) {\n this.createMetronomeMark((entry.Expression as InstantaneousTempoExpression));\n continue;\n }\n }\n } else if (entry.Expression instanceof ContinuousTempoExpression) {\n // FIXME: Not yet implemented\n // let alreadyAdded: boolean = false;\n // for (const expr of staffLine.AbstractExpressions) {\n // if (expr instanceof GraphicalContinuousTempoExpression &&\n // expr.GetContinuousTempoExpression.Label === entry.Expression.Label) {\n // alreadyAdded = true;\n // }\n // }\n\n // if (alreadyAdded) {\n // continue;\n // }\n\n // staffLine.AbstractExpressions.push(new GraphicalContinuousTempoExpression((ContinuousTempoExpression)(entry.Expression), graphLabel));\n }\n }\n }\n }\n\n protected createMetronomeMark(metronomeExpression: InstantaneousTempoExpression): void {\n throw new Error(\"abstract, not implemented\");\n }\n\n protected graphicalMeasureCreatedCalculations(measure: GraphicalMeasure): void {\n return;\n }\n\n protected clearSystemsAndMeasures(): void {\n for (let idx: number = 0, len: number = this.graphicalMusicSheet.MusicPages.length; idx < len; ++idx) {\n const graphicalMusicPage: GraphicalMusicPage = this.graphicalMusicSheet.MusicPages[idx];\n for (let idx2: number = 0, len2: number = graphicalMusicPage.MusicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = graphicalMusicPage.MusicSystems[idx2];\n for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n for (let idx4: number = 0, len4: number = staffLine.Measures.length; idx4 < len4; ++idx4) {\n const graphicalMeasure: GraphicalMeasure = staffLine.Measures[idx4];\n if (graphicalMeasure.FirstInstructionStaffEntry) {\n const index: number = graphicalMeasure.PositionAndShape.ChildElements.indexOf(\n graphicalMeasure.FirstInstructionStaffEntry.PositionAndShape\n );\n if (index > -1) {\n graphicalMeasure.PositionAndShape.ChildElements.splice(index, 1);\n }\n graphicalMeasure.FirstInstructionStaffEntry = undefined;\n graphicalMeasure.beginInstructionsWidth = 0.0;\n }\n if (graphicalMeasure.LastInstructionStaffEntry) {\n const index: number = graphicalMeasure.PositionAndShape.ChildElements.indexOf(\n graphicalMeasure.LastInstructionStaffEntry.PositionAndShape\n );\n if (index > -1) {\n graphicalMeasure.PositionAndShape.ChildElements.splice(index, 1);\n }\n graphicalMeasure.LastInstructionStaffEntry = undefined;\n graphicalMeasure.endInstructionsWidth = 0.0;\n }\n }\n staffLine.Measures = [];\n staffLine.PositionAndShape.ChildElements = [];\n }\n musicSystem.StaffLines.length = 0;\n musicSystem.PositionAndShape.ChildElements = [];\n }\n graphicalMusicPage.MusicSystems = [];\n graphicalMusicPage.PositionAndShape.ChildElements = [];\n }\n this.graphicalMusicSheet.MusicPages = [];\n }\n\n protected handleVoiceEntry(voiceEntry: VoiceEntry, graphicalStaffEntry: GraphicalStaffEntry,\n accidentalCalculator: AccidentalCalculator, openLyricWords: LyricWord[],\n activeClef: ClefInstruction,\n openTuplets: Tuplet[], openBeams: Beam[],\n octaveShiftValue: OctaveEnum, linkedNotes: Note[] = undefined,\n sourceStaffEntry: SourceStaffEntry = undefined): OctaveEnum {\n if (voiceEntry.StemDirectionXml !== StemDirectionType.Undefined &&\n this.rules.SetWantedStemDirectionByXml &&\n voiceEntry.StemDirectionXml !== undefined) {\n voiceEntry.WantedStemDirection = voiceEntry.StemDirectionXml;\n } else {\n this.calculateStemDirectionFromVoices(voiceEntry);\n }\n // if GraphicalStaffEntry has been created earlier (because of Tie), then the GraphicalNotesLists have also been created\n const gve: GraphicalVoiceEntry = graphicalStaffEntry.findOrCreateGraphicalVoiceEntry(voiceEntry);\n gve.octaveShiftValue = octaveShiftValue;\n // check for Tabs:\n const tabStaffEntry: GraphicalStaffEntry = graphicalStaffEntry.tabStaffEntry;\n let graphicalTabVoiceEntry: GraphicalVoiceEntry;\n if (tabStaffEntry) {\n graphicalTabVoiceEntry = tabStaffEntry.findOrCreateGraphicalVoiceEntry(voiceEntry);\n }\n\n for (let idx: number = 0, len: number = voiceEntry.Notes.length; idx < len; ++idx) {\n const note: Note = voiceEntry.Notes[idx];\n if (!note) {\n continue;\n }\n if (sourceStaffEntry !== undefined && sourceStaffEntry.Link !== undefined && linkedNotes !== undefined && linkedNotes.indexOf(note) > -1) {\n continue;\n }\n let graphicalNote: GraphicalNote;\n if (voiceEntry.IsGrace) {\n graphicalNote = MusicSheetCalculator.symbolFactory.createGraceNote(note, gve, activeClef, octaveShiftValue);\n } else {\n graphicalNote = MusicSheetCalculator.symbolFactory.createNote(note, gve, activeClef, octaveShiftValue, undefined);\n const staffLineCount: number = voiceEntry.ParentSourceStaffEntry.ParentStaff.StafflineCount;\n graphicalNote = MusicSheetCalculator.stafflineNoteCalculator.positionNote(graphicalNote, activeClef, staffLineCount);\n }\n if (note.Pitch) {\n this.checkNoteForAccidental(graphicalNote, accidentalCalculator, activeClef, octaveShiftValue);\n }\n this.resetYPositionForLeadSheet(graphicalNote.PositionAndShape);\n graphicalStaffEntry.addGraphicalNoteToListAtCorrectYPosition(gve, graphicalNote);\n graphicalNote.PositionAndShape.calculateBoundingBox();\n if (!this.leadSheet) {\n if (note.NoteBeam !== undefined && note.PrintObject) {\n this.handleBeam(graphicalNote, note.NoteBeam, openBeams);\n }\n if (note.NoteTuplet !== undefined && note.PrintObject) {\n this.handleTuplet(graphicalNote, note.NoteTuplet, openTuplets);\n }\n }\n\n // handle TabNotes:\n if (graphicalTabVoiceEntry) {\n // notes should be either TabNotes or RestNotes -> add all:\n const graphicalTabNote: GraphicalNote = MusicSheetCalculator.symbolFactory.createNote( note,\n graphicalTabVoiceEntry,\n activeClef,\n octaveShiftValue,\n undefined);\n tabStaffEntry.addGraphicalNoteToListAtCorrectYPosition(graphicalTabVoiceEntry, graphicalTabNote);\n graphicalTabNote.PositionAndShape.calculateBoundingBox();\n\n if (!this.leadSheet) {\n if (note.NoteTuplet) {\n this.handleTuplet(graphicalTabNote, note.NoteTuplet, openTuplets);\n }\n }\n }\n }\n if (voiceEntry.Articulations.length > 0) {\n this.handleVoiceEntryArticulations(voiceEntry.Articulations, voiceEntry, graphicalStaffEntry);\n }\n if (voiceEntry.TechnicalInstructions.length > 0) {\n this.handleVoiceEntryTechnicalInstructions(voiceEntry.TechnicalInstructions, voiceEntry, graphicalStaffEntry);\n }\n if (voiceEntry.LyricsEntries.size() > 0) {\n this.handleVoiceEntryLyrics(voiceEntry, graphicalStaffEntry, openLyricWords);\n }\n if (voiceEntry.OrnamentContainer) {\n this.handleVoiceEntryOrnaments(voiceEntry.OrnamentContainer, voiceEntry, graphicalStaffEntry);\n }\n return octaveShiftValue;\n }\n\n protected resetYPositionForLeadSheet(psi: BoundingBox): void {\n if (this.leadSheet) {\n psi.RelativePosition = new PointF2D(psi.RelativePosition.x, 0.0);\n }\n }\n\n protected layoutVoiceEntries(graphicalStaffEntry: GraphicalStaffEntry): void {\n graphicalStaffEntry.PositionAndShape.RelativePosition = new PointF2D(0.0, 0.0);\n if (!this.leadSheet) {\n for (const gve of graphicalStaffEntry.graphicalVoiceEntries) {\n const graphicalNotes: GraphicalNote[] = gve.notes;\n if (graphicalNotes.length === 0) {\n continue;\n }\n const voiceEntry: VoiceEntry = graphicalNotes[0].sourceNote.ParentVoiceEntry;\n const hasPitchedNote: boolean = graphicalNotes[0].sourceNote.Pitch !== undefined;\n this.layoutVoiceEntry(voiceEntry, graphicalNotes, graphicalStaffEntry, hasPitchedNote);\n }\n }\n }\n\n protected maxInstrNameLabelLength(): number {\n let maxLabelLength: number = 0.0;\n for (const instrument of this.graphicalMusicSheet.ParentMusicSheet.Instruments) {\n if (instrument.Voices.length > 0 && instrument.Voices[0].Visible) {\n let renderedLabel: Label = instrument.NameLabel;\n if (!this.rules.RenderPartNames) {\n renderedLabel = new Label(\"\", renderedLabel.textAlignment, renderedLabel.font);\n }\n const graphicalLabel: GraphicalLabel = new GraphicalLabel(\n renderedLabel, this.rules.InstrumentLabelTextHeight, TextAlignmentEnum.LeftCenter, this.rules);\n graphicalLabel.setLabelPositionAndShapeBorders();\n maxLabelLength = Math.max(maxLabelLength, graphicalLabel.PositionAndShape.MarginSize.width);\n }\n }\n if (!this.rules.RenderPartNames) {\n return 0;\n }\n return maxLabelLength;\n }\n\n protected calculateSheetLabelBoundingBoxes(): void {\n const musicSheet: MusicSheet = this.graphicalMusicSheet.ParentMusicSheet;\n const defaultColorTitle: string = this.rules.DefaultColorTitle; // can be undefined => black\n if (musicSheet.Title !== undefined && this.rules.RenderTitle) {\n const title: GraphicalLabel = new GraphicalLabel(musicSheet.Title, this.rules.SheetTitleHeight, TextAlignmentEnum.CenterBottom, this.rules);\n title.Label.colorDefault = defaultColorTitle;\n this.graphicalMusicSheet.Title = title;\n title.setLabelPositionAndShapeBorders();\n } else if (!this.rules.RenderTitle) {\n this.graphicalMusicSheet.Title = undefined; // clear label if rendering it was disabled after last render\n }\n if (musicSheet.Subtitle !== undefined && this.rules.RenderSubtitle) {\n const subtitle: GraphicalLabel = new GraphicalLabel(\n musicSheet.Subtitle, this.rules.SheetSubtitleHeight, TextAlignmentEnum.CenterCenter, this.rules);\n subtitle.Label.colorDefault = defaultColorTitle;\n this.graphicalMusicSheet.Subtitle = subtitle;\n subtitle.setLabelPositionAndShapeBorders();\n } else if (!this.rules.RenderSubtitle) {\n this.graphicalMusicSheet.Subtitle = undefined;\n }\n if (musicSheet.Composer !== undefined && this.rules.RenderComposer) {\n const composer: GraphicalLabel = new GraphicalLabel(\n musicSheet.Composer, this.rules.SheetComposerHeight, TextAlignmentEnum.RightCenter, this.rules);\n composer.Label.colorDefault = defaultColorTitle;\n this.graphicalMusicSheet.Composer = composer;\n composer.setLabelPositionAndShapeBorders();\n } else if (!this.rules.RenderComposer) {\n this.graphicalMusicSheet.Composer = undefined;\n }\n if (musicSheet.Lyricist !== undefined && this.rules.RenderLyricist) {\n const lyricist: GraphicalLabel = new GraphicalLabel(\n musicSheet.Lyricist, this.rules.SheetAuthorHeight, TextAlignmentEnum.LeftCenter, this.rules);\n lyricist.Label.colorDefault = defaultColorTitle;\n this.graphicalMusicSheet.Lyricist = lyricist;\n lyricist.setLabelPositionAndShapeBorders();\n } else if (!this.rules.RenderLyricist) {\n this.graphicalMusicSheet.Lyricist = undefined;\n }\n }\n\n protected checkMeasuresForWholeRestNotes(): void {\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n for (let idx4: number = 0, len4: number = staffLine.Measures.length; idx4 < len4; ++idx4) {\n const measure: GraphicalMeasure = staffLine.Measures[idx4];\n if (measure.staffEntries.length === 1) {\n const gse: GraphicalStaffEntry = measure.staffEntries[0];\n if (gse.graphicalVoiceEntries.length > 0 && gse.graphicalVoiceEntries[0].notes.length === 1) {\n const graphicalNote: GraphicalNote = gse.graphicalVoiceEntries[0].notes[0];\n if (!graphicalNote.sourceNote.Pitch && (new Fraction(1, 2)).lt(graphicalNote.sourceNote.Length)) {\n this.layoutMeasureWithWholeRest(graphicalNote, gse, measure);\n }\n }\n }\n }\n }\n }\n }\n\n protected optimizeRestNotePlacement(graphicalStaffEntry: GraphicalStaffEntry, measure: GraphicalMeasure): void {\n if (graphicalStaffEntry.graphicalVoiceEntries.length === 0) {\n return;\n }\n const voice1Notes: GraphicalNote[] = graphicalStaffEntry.graphicalVoiceEntries[0].notes;\n if (voice1Notes.length === 0) {\n return;\n }\n const voice1Note1: GraphicalNote = voice1Notes[0];\n const voice1Note1IsRest: boolean = voice1Note1.sourceNote.isRest();\n if (graphicalStaffEntry.graphicalVoiceEntries.length === 2) {\n let voice2Note1IsRest: boolean = false;\n const voice2Notes: GraphicalNote[] = graphicalStaffEntry.graphicalVoiceEntries[1].notes;\n if (voice2Notes.length > 0) {\n const voice2Note1: GraphicalNote = voice2Notes[0];\n voice2Note1IsRest = voice2Note1.sourceNote.isRest();\n }\n if (voice1Note1IsRest && voice2Note1IsRest) {\n this.calculateTwoRestNotesPlacementWithCollisionDetection(graphicalStaffEntry);\n } else if (voice1Note1IsRest || voice2Note1IsRest) {\n this.calculateRestNotePlacementWithCollisionDetectionFromGraphicalNote(graphicalStaffEntry);\n }\n } else if (voice1Note1IsRest && graphicalStaffEntry !== measure.staffEntries[0] &&\n graphicalStaffEntry !== measure.staffEntries[measure.staffEntries.length - 1]) {\n const staffEntryIndex: number = measure.staffEntries.indexOf(graphicalStaffEntry);\n const previousStaffEntry: GraphicalStaffEntry = measure.staffEntries[staffEntryIndex - 1];\n const nextStaffEntry: GraphicalStaffEntry = measure.staffEntries[staffEntryIndex + 1];\n if (previousStaffEntry.graphicalVoiceEntries.length === 1) {\n const previousNote: GraphicalNote = previousStaffEntry.graphicalVoiceEntries[0].notes[0];\n if (previousNote.sourceNote.NoteBeam !== undefined && nextStaffEntry.graphicalVoiceEntries.length === 1) {\n const nextNote: GraphicalNote = nextStaffEntry.graphicalVoiceEntries[0].notes[0];\n if (nextNote.sourceNote.NoteBeam !== undefined && previousNote.sourceNote.NoteBeam === nextNote.sourceNote.NoteBeam) {\n this.calculateRestNotePlacementWithinGraphicalBeam(\n graphicalStaffEntry, voice1Note1, previousNote,\n nextStaffEntry, nextNote\n );\n graphicalStaffEntry.PositionAndShape.calculateBoundingBox();\n }\n }\n }\n }\n }\n\n protected getRelativePositionInStaffLineFromTimestamp(timestamp: Fraction, verticalIndex: number, staffLine: StaffLine,\n multiStaffInstrument: boolean, firstVisibleMeasureRelativeX: number = 0.0): PointF2D {\n let relative: PointF2D = new PointF2D();\n let leftStaffEntry: GraphicalStaffEntry = undefined;\n let rightStaffEntry: GraphicalStaffEntry = undefined;\n const numEntries: number = this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers.length;\n const index: number = this.graphicalMusicSheet.GetInterpolatedIndexInVerticalContainers(timestamp);\n const leftIndex: number = Math.min(Math.floor(index), numEntries - 1);\n const rightIndex: number = Math.min(Math.ceil(index), numEntries - 1);\n if (leftIndex < 0 || verticalIndex < 0) {\n return relative;\n }\n leftStaffEntry = this.getFirstLeftNotNullStaffEntryFromContainer(leftIndex, verticalIndex, multiStaffInstrument);\n rightStaffEntry = this.getFirstRightNotNullStaffEntryFromContainer(rightIndex, verticalIndex, multiStaffInstrument);\n if (leftStaffEntry && rightStaffEntry) {\n let measureRelativeX: number = leftStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x;\n if (firstVisibleMeasureRelativeX > 0) {\n measureRelativeX = firstVisibleMeasureRelativeX;\n }\n let leftX: number = leftStaffEntry.PositionAndShape.RelativePosition.x + measureRelativeX;\n let rightX: number = rightStaffEntry.PositionAndShape.RelativePosition.x + rightStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x;\n if (firstVisibleMeasureRelativeX > 0) {\n rightX = rightStaffEntry.PositionAndShape.RelativePosition.x + measureRelativeX;\n }\n let timestampQuotient: number = 0.0;\n if (leftStaffEntry !== rightStaffEntry) {\n const leftTimestamp: Fraction = leftStaffEntry.getAbsoluteTimestamp();\n const rightTimestamp: Fraction = rightStaffEntry.getAbsoluteTimestamp();\n const leftDifference: Fraction = Fraction.minus(timestamp, leftTimestamp);\n timestampQuotient = leftDifference.RealValue / Fraction.minus(rightTimestamp, leftTimestamp).RealValue;\n }\n if (leftStaffEntry.parentMeasure.ParentStaffLine !== rightStaffEntry.parentMeasure.ParentStaffLine) {\n if (leftStaffEntry.parentMeasure.ParentStaffLine === staffLine) {\n rightX = staffLine.PositionAndShape.Size.width;\n } else {\n leftX = staffLine.PositionAndShape.RelativePosition.x;\n }\n }\n relative = new PointF2D(leftX + (rightX - leftX) * timestampQuotient, 0.0);\n }\n return relative;\n }\n\n protected getRelativeXPositionFromTimestamp(timestamp: Fraction): number {\n const numEntries: number = this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers.length;\n const index: number = this.graphicalMusicSheet.GetInterpolatedIndexInVerticalContainers(timestamp);\n const discreteIndex: number = Math.max(0, Math.min(Math.round(index), numEntries - 1));\n const gse: GraphicalStaffEntry = this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[discreteIndex].getFirstNonNullStaffEntry();\n const posX: number = gse.PositionAndShape.RelativePosition.x + gse.parentMeasure.PositionAndShape.RelativePosition.x;\n return posX;\n }\n\n protected calculatePageLabels(page: GraphicalMusicPage): void {\n if (this.rules.RenderSingleHorizontalStaffline) {\n page.PositionAndShape.BorderRight = page.PositionAndShape.Size.width;\n page.PositionAndShape.calculateBoundingBox();\n this.graphicalMusicSheet.ParentMusicSheet.pageWidth = page.PositionAndShape.Size.width;\n }\n // The PositionAndShape child elements of page need to be manually connected to the lyricist, composer, subtitle, etc.\n // because the page is only available now\n let firstSystemAbsoluteTopMargin: number = 10;\n if (page.MusicSystems.length > 0) {\n const firstMusicSystem: MusicSystem = page.MusicSystems[0];\n firstSystemAbsoluteTopMargin = firstMusicSystem.PositionAndShape.RelativePosition.y + firstMusicSystem.PositionAndShape.BorderTop;\n }\n //const firstStaffLine: StaffLine = this.graphicalMusicSheet.MusicPages[0].MusicSystems[0].StaffLines[0];\n if (this.graphicalMusicSheet.Title) {\n const title: GraphicalLabel = this.graphicalMusicSheet.Title;\n title.PositionAndShape.Parent = page.PositionAndShape;\n //title.PositionAndShape.Parent = firstStaffLine.PositionAndShape;\n const relative: PointF2D = new PointF2D();\n relative.x = this.graphicalMusicSheet.ParentMusicSheet.pageWidth / 2;\n //relative.x = firstStaffLine.PositionAndShape.RelativePosition.x + firstStaffLine.PositionAndShape.Size.width / 2; // half of first staffline width\n relative.y = this.rules.TitleTopDistance + this.rules.SheetTitleHeight;\n title.PositionAndShape.RelativePosition = relative;\n page.Labels.push(title);\n }\n if (this.graphicalMusicSheet.Subtitle) {\n const subtitle: GraphicalLabel = this.graphicalMusicSheet.Subtitle;\n //subtitle.PositionAndShape.Parent = firstStaffLine.PositionAndShape;\n subtitle.PositionAndShape.Parent = page.PositionAndShape;\n const relative: PointF2D = new PointF2D();\n relative.x = this.graphicalMusicSheet.ParentMusicSheet.pageWidth / 2;\n //relative.x = firstStaffLine.PositionAndShape.RelativePosition.x + firstStaffLine.PositionAndShape.Size.width / 2; // half of first staffline width\n relative.y = this.rules.TitleTopDistance + this.rules.SheetTitleHeight + this.rules.SheetMinimumDistanceBetweenTitleAndSubtitle;\n subtitle.PositionAndShape.RelativePosition = relative;\n page.Labels.push(subtitle);\n }\n const composer: GraphicalLabel = this.graphicalMusicSheet.Composer;\n if (composer) {\n composer.PositionAndShape.Parent = page.PositionAndShape; // if using pageWidth. (which can currently be too wide) TODO fix pageWidth (#578)\n //composer.PositionAndShape.Parent = firstStaffLine.PositionAndShape; if using firstStaffLine...width.\n // y-collision problems, harder to y-align with lyrics\n composer.setLabelPositionAndShapeBorders();\n const relative: PointF2D = new PointF2D();\n //const firstStaffLineEndX: number = this.rules.PageLeftMargin + this.rules.SystemLeftMargin + this.rules.left\n // firstStaffLine.PositionAndShape.RelativePosition.x + firstStaffLine.PositionAndShape.Size.width;\n //relative.x = Math.min(this.graphicalMusicSheet.ParentMusicSheet.pageWidth - this.rules.PageRightMargin,\n // firstStaffLineEndX); // awkward with 2-bar score\n relative.x = this.graphicalMusicSheet.ParentMusicSheet.pageWidth - this.rules.PageRightMargin;\n //relative.x = firstStaffLine.PositionAndShape.Size.width;\n relative.y = firstSystemAbsoluteTopMargin - this.rules.SystemComposerDistance;\n //relative.y = - this.rules.SystemComposerDistance;\n //relative.y = -firstStaffLine.PositionAndShape.Size.height;\n // TODO only add measure label height if rendering labels and composer measure has label\n // TODO y-align with lyricist? which is harder if they have different bbox parents (page and firstStaffLine).\n // when the pageWidth gets fixed, we could use page as parent again.\n composer.PositionAndShape.RelativePosition = relative;\n page.Labels.push(composer);\n }\n const lyricist: GraphicalLabel = this.graphicalMusicSheet.Lyricist;\n if (lyricist) {\n lyricist.PositionAndShape.Parent = page.PositionAndShape;\n lyricist.setLabelPositionAndShapeBorders();\n const relative: PointF2D = new PointF2D();\n relative.x = this.rules.PageLeftMargin;\n relative.y = firstSystemAbsoluteTopMargin - this.rules.SystemComposerDistance;\n //relative.y = Math.max(relative.y, composer.PositionAndShape.RelativePosition.y);\n lyricist.PositionAndShape.RelativePosition = relative;\n page.Labels.push(lyricist);\n }\n }\n\n protected createGraphicalTies(): void {\n for (let measureIndex: number = 0; measureIndex < this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length; measureIndex++) {\n const sourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures[measureIndex];\n for (let staffIndex: number = 0; staffIndex < sourceMeasure.CompleteNumberOfStaves; staffIndex++) {\n for (let j: number = 0; j < sourceMeasure.VerticalSourceStaffEntryContainers.length; j++) {\n const sourceStaffEntry: SourceStaffEntry = sourceMeasure.VerticalSourceStaffEntryContainers[j].StaffEntries[staffIndex];\n if (sourceStaffEntry) {\n const startStaffEntry: GraphicalStaffEntry = this.graphicalMusicSheet.findGraphicalStaffEntryFromMeasureList(\n staffIndex, measureIndex, sourceStaffEntry\n );\n for (let idx: number = 0, len: number = sourceStaffEntry.VoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = sourceStaffEntry.VoiceEntries[idx];\n for (let idx2: number = 0, len2: number = voiceEntry.Notes.length; idx2 < len2; ++idx2) {\n const note: Note = voiceEntry.Notes[idx2];\n if (note.NoteTie) {\n const tie: Tie = note.NoteTie;\n this.handleTie(tie, startStaffEntry, staffIndex, measureIndex);\n }\n }\n }\n }\n }\n }\n }\n }\n\n private handleTie(tie: Tie, startGraphicalStaffEntry: GraphicalStaffEntry, staffIndex: number, measureIndex: number): void {\n let startGse: GraphicalStaffEntry = startGraphicalStaffEntry;\n let startNote: GraphicalNote = startGse.findEndTieGraphicalNoteFromNote(tie.StartNote);\n let endGse: GraphicalStaffEntry = undefined;\n let endNote: GraphicalNote = undefined;\n for (let i: number = 1; i < tie.Notes.length; i++) {\n startNote = startGse.findEndTieGraphicalNoteFromNote(tie.Notes[i - 1]);\n endGse = this.graphicalMusicSheet.GetGraphicalFromSourceStaffEntry(tie.Notes[i].ParentStaffEntry);\n if (!endGse) {\n continue;\n }\n endNote = endGse.findEndTieGraphicalNoteFromNote(tie.Notes[i]);\n if (startNote !== undefined && endNote !== undefined && endGse) {\n if (!startNote.sourceNote.PrintObject || !endNote.sourceNote.PrintObject) {\n continue;\n }\n const graphicalTie: GraphicalTie = this.createGraphicalTie(tie, startGse, endGse, startNote, endNote);\n startGse.GraphicalTies.push(graphicalTie);\n if (this.staffEntriesWithGraphicalTies.indexOf(startGse) >= 0) {\n this.staffEntriesWithGraphicalTies.push(startGse);\n }\n }\n startGse = endGse;\n }\n }\n\n private createAccidentalCalculators(): AccidentalCalculator[] {\n const accidentalCalculators: AccidentalCalculator[] = [];\n const firstSourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.getFirstSourceMeasure();\n if (firstSourceMeasure) {\n for (let i: number = 0; i < firstSourceMeasure.CompleteNumberOfStaves; i++) {\n const accidentalCalculator: AccidentalCalculator = new AccidentalCalculator();\n accidentalCalculators.push(accidentalCalculator);\n if (firstSourceMeasure.FirstInstructionsStaffEntries[i]) {\n for (let idx: number = 0, len: number = firstSourceMeasure.FirstInstructionsStaffEntries[i].Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = firstSourceMeasure.FirstInstructionsStaffEntries[i].Instructions[idx];\n if (abstractNotationInstruction instanceof KeyInstruction) {\n const keyInstruction: KeyInstruction = abstractNotationInstruction;\n accidentalCalculator.ActiveKeyInstruction = keyInstruction;\n }\n }\n }\n }\n }\n return accidentalCalculators;\n }\n\n private calculateVerticalContainersList(): void {\n const numberOfEntries: number = this.graphicalMusicSheet.MeasureList[0].length;\n for (let i: number = 0; i < this.graphicalMusicSheet.MeasureList.length; i++) {\n for (let j: number = 0; j < numberOfEntries; j++) {\n const measure: GraphicalMeasure = this.graphicalMusicSheet.MeasureList[i][j];\n for (let idx: number = 0, len: number = measure.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = measure.staffEntries[idx];\n const verticalContainer: VerticalGraphicalStaffEntryContainer =\n this.graphicalMusicSheet.getOrCreateVerticalContainer(graphicalStaffEntry.getAbsoluteTimestamp());\n if (verticalContainer) {\n verticalContainer.StaffEntries[j] = graphicalStaffEntry;\n graphicalStaffEntry.parentVerticalContainer = verticalContainer;\n }\n }\n }\n }\n }\n\n private setIndicesToVerticalGraphicalContainers(): void {\n for (let i: number = 0; i < this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers.length; i++) {\n this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[i].Index = i;\n }\n }\n\n private createGraphicalMeasuresForSourceMeasure(sourceMeasure: SourceMeasure, accidentalCalculators: AccidentalCalculator[],\n openLyricWords: LyricWord[],\n openOctaveShifts: OctaveShiftParams[], activeClefs: ClefInstruction[]): GraphicalMeasure[] {\n this.initGraphicalMeasuresCreation();\n const verticalMeasureList: GraphicalMeasure[] = []; // (VexFlowMeasure, extends GraphicalMeasure)\n const openBeams: Beam[] = [];\n const openTuplets: Tuplet[] = [];\n const staffEntryLinks: StaffEntryLink[] = [];\n for (let staffIndex: number = 0; staffIndex < sourceMeasure.CompleteNumberOfStaves; staffIndex++) {\n const measure: GraphicalMeasure = this.createGraphicalMeasure( // (VexFlowMeasure)\n sourceMeasure, openTuplets, openBeams,\n accidentalCalculators[staffIndex], activeClefs, openOctaveShifts, openLyricWords, staffIndex, staffEntryLinks\n );\n this.graphicalMeasureCreatedCalculations(measure);\n verticalMeasureList.push(measure);\n }\n sourceMeasure.VerticalMeasureList = verticalMeasureList; // much easier way to link sourceMeasure to graphicalMeasures than Dictionary\n //this.graphicalMusicSheet.sourceToGraphicalMeasureLinks.setValue(sourceMeasure, verticalMeasureList); // overwrites entries because:\n //this.graphicalMusicSheet.sourceToGraphicalMeasureLinks[sourceMeasure] = verticalMeasureList; // can't use SourceMeasure as key.\n // to save the reference by dictionary we would need two Dictionaries, id -> sourceMeasure and id -> GraphicalMeasure.\n return verticalMeasureList;\n }\n\n private createGraphicalMeasure(sourceMeasure: SourceMeasure, openTuplets: Tuplet[], openBeams: Beam[],\n accidentalCalculator: AccidentalCalculator, activeClefs: ClefInstruction[],\n openOctaveShifts: OctaveShiftParams[], openLyricWords: LyricWord[], staffIndex: number,\n staffEntryLinks: StaffEntryLink[]): GraphicalMeasure {\n const staff: Staff = this.graphicalMusicSheet.ParentMusicSheet.getStaffFromIndex(staffIndex);\n let measure: GraphicalMeasure = undefined;\n //This property is active...\n if (this.rules.PercussionOneLineCutoff !== undefined && this.rules.PercussionOneLineCutoff !== 0) {\n //We have a percussion clef, check to see if this property applies...\n if (activeClefs[staffIndex].ClefType === ClefEnum.percussion) {\n //-1 means always trigger, or we are under the cutoff number specified\n if (this.rules.PercussionOneLineCutoff === -1 ||\n staff.ParentInstrument.SubInstruments.length < this.rules.PercussionOneLineCutoff) {\n staff.StafflineCount = 1;\n }\n }\n }\n if (activeClefs[staffIndex].ClefType === ClefEnum.TAB) {\n staff.isTab = true;\n measure = MusicSheetCalculator.symbolFactory.createTabStaffMeasure(sourceMeasure, staff);\n } else {\n measure = MusicSheetCalculator.symbolFactory.createGraphicalMeasure(sourceMeasure, staff);\n }\n measure.hasError = sourceMeasure.getErrorInMeasure(staffIndex);\n // check for key instruction changes\n if (sourceMeasure.FirstInstructionsStaffEntries[staffIndex]) {\n for (let idx: number = 0, len: number = sourceMeasure.FirstInstructionsStaffEntries[staffIndex].Instructions.length; idx < len; ++idx) {\n const instruction: AbstractNotationInstruction = sourceMeasure.FirstInstructionsStaffEntries[staffIndex].Instructions[idx];\n if (instruction instanceof KeyInstruction) {\n const key: KeyInstruction = KeyInstruction.copy(instruction);\n if (this.graphicalMusicSheet.ParentMusicSheet.Transpose !== 0 &&\n measure.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion &&\n MusicSheetCalculator.transposeCalculator) {\n MusicSheetCalculator.transposeCalculator.transposeKey(\n key, this.graphicalMusicSheet.ParentMusicSheet.Transpose\n );\n }\n accidentalCalculator.ActiveKeyInstruction = key;\n }\n }\n }\n // check for octave shifts\n for (let idx: number = 0, len: number = sourceMeasure.StaffLinkedExpressions[staffIndex].length; idx < len; ++idx) {\n const multiExpression: MultiExpression = sourceMeasure.StaffLinkedExpressions[staffIndex][idx];\n if (multiExpression.OctaveShiftStart) {\n const openOctaveShift: OctaveShift = multiExpression.OctaveShiftStart;\n let absoluteEnd: Fraction = openOctaveShift?.ParentEndMultiExpression?.AbsoluteTimestamp;\n if (!openOctaveShift?.ParentEndMultiExpression) {\n const measureEndTimestamp: Fraction = Fraction.plus(sourceMeasure.AbsoluteTimestamp, sourceMeasure.Duration);\n absoluteEnd = measureEndTimestamp;\n // TODO better handling if end expression missing\n // old comment:\n // TODO check if octaveshift end exists, otherwise set to last measure end. only necessary if xml was cut manually and is incomplete\n }\n openOctaveShifts[staffIndex] = new OctaveShiftParams(\n openOctaveShift, multiExpression?.AbsoluteTimestamp,\n absoluteEnd\n );\n }\n }\n // create GraphicalStaffEntries - always check for possible null Entry\n for (let entryIndex: number = 0; entryIndex < sourceMeasure.VerticalSourceStaffEntryContainers.length; entryIndex++) {\n const sourceStaffEntry: SourceStaffEntry = sourceMeasure.VerticalSourceStaffEntryContainers[entryIndex].StaffEntries[staffIndex];\n // is there a SourceStaffEntry at this Index\n if (sourceStaffEntry) {\n // a SourceStaffEntry exists\n // is there an inStaff ClefInstruction? -> update activeClef\n for (let idx: number = 0, len: number = sourceStaffEntry.Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = sourceStaffEntry.Instructions[idx];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n activeClefs[staffIndex] = abstractNotationInstruction;\n }\n }\n // create new GraphicalStaffEntry\n const graphicalStaffEntry: GraphicalStaffEntry = MusicSheetCalculator.symbolFactory.createStaffEntry(sourceStaffEntry, measure);\n if (entryIndex < measure.staffEntries.length) {\n // a GraphicalStaffEntry has been inserted already at this Index (from Tie)\n measure.addGraphicalStaffEntryAtTimestamp(graphicalStaffEntry);\n } else {\n measure.addGraphicalStaffEntry(graphicalStaffEntry);\n }\n\n const linkedNotes: Note[] = [];\n if (sourceStaffEntry.Link) {\n sourceStaffEntry.findLinkedNotes(linkedNotes);\n this.handleStaffEntryLink(graphicalStaffEntry, staffEntryLinks);\n }\n // check for possible OctaveShift\n let octaveShiftValue: OctaveEnum = OctaveEnum.NONE;\n if (openOctaveShifts[staffIndex]) {\n if (openOctaveShifts[staffIndex].getAbsoluteStartTimestamp.lte(sourceStaffEntry.AbsoluteTimestamp) &&\n sourceStaffEntry.AbsoluteTimestamp.lte(openOctaveShifts[staffIndex].getAbsoluteEndTimestamp)) {\n octaveShiftValue = openOctaveShifts[staffIndex].getOpenOctaveShift.Type;\n }\n }\n // for each visible Voice create the corresponding GraphicalNotes\n for (let idx: number = 0, len: number = sourceStaffEntry.VoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = sourceStaffEntry.VoiceEntries[idx];\n // Normal Notes...\n octaveShiftValue = this.handleVoiceEntry(\n voiceEntry, graphicalStaffEntry,\n accidentalCalculator, openLyricWords,\n activeClefs[staffIndex], openTuplets,\n openBeams, octaveShiftValue, linkedNotes,\n sourceStaffEntry\n );\n }\n // SourceStaffEntry has inStaff ClefInstruction -> create graphical clef\n if (sourceStaffEntry.Instructions.length > 0) {\n const clefInstruction: ClefInstruction = sourceStaffEntry.Instructions[0];\n MusicSheetCalculator.symbolFactory.createInStaffClef(graphicalStaffEntry, clefInstruction);\n }\n if (sourceStaffEntry.ChordContainers && sourceStaffEntry.ChordContainers.length > 0) {\n sourceStaffEntry.ParentStaff.ParentInstrument.HasChordSymbols = true;\n MusicSheetCalculator.symbolFactory.createChordSymbols(\n sourceStaffEntry,\n graphicalStaffEntry,\n accidentalCalculator.ActiveKeyInstruction,\n this.graphicalMusicSheet.ParentMusicSheet.Transpose);\n }\n }\n }\n\n accidentalCalculator.doCalculationsAtEndOfMeasure();\n // update activeClef given at end of measure if needed\n if (sourceMeasure.LastInstructionsStaffEntries[staffIndex]) {\n const lastStaffEntry: SourceStaffEntry = sourceMeasure.LastInstructionsStaffEntries[staffIndex];\n for (let idx: number = 0, len: number = lastStaffEntry.Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = lastStaffEntry.Instructions[idx];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n activeClefs[staffIndex] = abstractNotationInstruction;\n }\n }\n }\n for (let idx: number = 0, len: number = sourceMeasure.StaffLinkedExpressions[staffIndex].length; idx < len; ++idx) {\n const multiExpression: MultiExpression = sourceMeasure.StaffLinkedExpressions[staffIndex][idx];\n if (multiExpression.OctaveShiftEnd !== undefined && openOctaveShifts[staffIndex] !== undefined &&\n multiExpression.OctaveShiftEnd === openOctaveShifts[staffIndex].getOpenOctaveShift) {\n openOctaveShifts[staffIndex] = undefined;\n }\n }\n // check wantedStemDirections of beam notes at end of measure (e.g. for beam with grace notes)\n for (const staffEntry of measure.staffEntries) {\n for (const voiceEntry of staffEntry.graphicalVoiceEntries) {\n this.setBeamNotesWantedStemDirections(voiceEntry.parentVoiceEntry);\n }\n }\n // if there are no staffEntries in this measure, create a rest for the whole measure:\n // check OSMDOptions.fillEmptyMeasuresWithWholeRest\n if (this.rules.FillEmptyMeasuresWithWholeRest >= 1) { // fill measures with no notes given with whole rests, visible (1) or invisible (2)\n if (measure.staffEntries.length === 0) {\n const sourceStaffEntry: SourceStaffEntry = new SourceStaffEntry(\n new VerticalSourceStaffEntryContainer(measure.parentSourceMeasure,\n measure.parentSourceMeasure.AbsoluteTimestamp,\n measure.parentSourceMeasure.CompleteNumberOfStaves),\n staff);\n const voiceEntry: VoiceEntry = new VoiceEntry(new Fraction(0, 1), staff.Voices[0], sourceStaffEntry);\n const note: Note = new Note(voiceEntry, sourceStaffEntry, Fraction.createFromFraction(sourceMeasure.Duration), undefined);\n note.PrintObject = this.rules.FillEmptyMeasuresWithWholeRest === FillEmptyMeasuresWithWholeRests.YesVisible;\n // don't display whole rest that wasn't given in XML, only for layout/voice completion\n voiceEntry.Notes.push(note);\n const graphicalStaffEntry: GraphicalStaffEntry = MusicSheetCalculator.symbolFactory.createStaffEntry(sourceStaffEntry, measure);\n measure.addGraphicalStaffEntry(graphicalStaffEntry);\n graphicalStaffEntry.relInMeasureTimestamp = voiceEntry.Timestamp;\n const gve: GraphicalVoiceEntry = MusicSheetCalculator.symbolFactory.createVoiceEntry(voiceEntry, graphicalStaffEntry);\n graphicalStaffEntry.graphicalVoiceEntries.push(gve);\n let graphicalNote: GraphicalNote = MusicSheetCalculator.symbolFactory.createNote(note,\n gve,\n new ClefInstruction(),\n OctaveEnum.NONE, undefined);\n const staffLineCount: number = voiceEntry.ParentSourceStaffEntry.ParentStaff.StafflineCount;\n graphicalNote = MusicSheetCalculator.stafflineNoteCalculator.positionNote(graphicalNote, activeClefs[staffIndex], staffLineCount);\n gve.notes.push(graphicalNote);\n }\n }\n return measure;\n }\n\n private checkNoteForAccidental(graphicalNote: GraphicalNote, accidentalCalculator: AccidentalCalculator, activeClef: ClefInstruction,\n octaveEnum: OctaveEnum): void {\n let pitch: Pitch = graphicalNote.sourceNote.Pitch;\n const transpose: number = this.graphicalMusicSheet.ParentMusicSheet.Transpose;\n if (transpose !== 0 && graphicalNote.sourceNote.ParentStaffEntry.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion) {\n pitch = graphicalNote.Transpose(\n accidentalCalculator.ActiveKeyInstruction, activeClef, transpose, octaveEnum\n );\n }\n graphicalNote.sourceNote.halfTone = pitch.getHalfTone();\n accidentalCalculator.checkAccidental(graphicalNote, pitch);\n }\n\n // // needed to disable linter, as it doesn't recognize the existing usage of this method.\n // // ToDo: check if a newer version doesn't have the problem.\n // /* tslint:disable:no-unused-variable */\n // private createStaffEntryForTieNote(measure: StaffMeasure, absoluteTimestamp: Fraction, openTie: Tie): GraphicalStaffEntry {\n // /* tslint:enable:no-unused-variable */\n // let graphicalStaffEntry: GraphicalStaffEntry;\n // graphicalStaffEntry = MusicSheetCalculator.symbolFactory.createStaffEntry(openTie.Start.ParentStaffEntry, measure);\n // graphicalStaffEntry.relInMeasureTimestamp = Fraction.minus(absoluteTimestamp, measure.parentSourceMeasure.AbsoluteTimestamp);\n // this.resetYPositionForLeadSheet(graphicalStaffEntry.PositionAndShape);\n // measure.addGraphicalStaffEntryAtTimestamp(graphicalStaffEntry);\n // return graphicalStaffEntry;\n // }\n\n private handleStaffEntries(): void {\n for (let idx: number = 0, len: number = this.graphicalMusicSheet.MeasureList.length; idx < len; ++idx) {\n const measures: GraphicalMeasure[] = this.graphicalMusicSheet.MeasureList[idx];\n for (let idx2: number = 0, len2: number = measures.length; idx2 < len2; ++idx2) {\n const measure: GraphicalMeasure = measures[idx2];\n for (const graphicalStaffEntry of measure.staffEntries) {\n if (graphicalStaffEntry.parentMeasure !== undefined\n && graphicalStaffEntry.graphicalVoiceEntries.length > 0\n && graphicalStaffEntry.graphicalVoiceEntries[0].notes.length > 0) {\n this.layoutVoiceEntries(graphicalStaffEntry);\n this.layoutStaffEntry(graphicalStaffEntry);\n }\n }\n }\n }\n }\n\n private calculateSkyBottomLines(): void {\n for (const musicSystem of this.musicSystems) {\n for (const staffLine of musicSystem.StaffLines) {\n staffLine.SkyBottomLineCalculator.calculateLines();\n }\n }\n }\n\n /**\n * Re-adjust the x positioning of expressions.\n */\n protected calculateExpressionAlignements(): void {\n // override\n }\n\n // does nothing for now, because layoutBeams() is an empty method\n // private calculateBeams(): void {\n // for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n // const musicSystem: MusicSystem = this.musicSystems[idx2];\n // for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n // const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n // for (let idx4: number = 0, len4: number = staffLine.Measures.length; idx4 < len4; ++idx4) {\n // const measure: GraphicalMeasure = staffLine.Measures[idx4];\n // for (let idx5: number = 0, len5: number = measure.staffEntries.length; idx5 < len5; ++idx5) {\n // const staffEntry: GraphicalStaffEntry = measure.staffEntries[idx5];\n // this.layoutBeams(staffEntry);\n // }\n // }\n // }\n // }\n // }\n\n private calculateStaffEntryArticulationMarks(): void {\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const system: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = system.StaffLines.length; idx3 < len3; ++idx3) {\n const line: StaffLine = system.StaffLines[idx3];\n for (let idx4: number = 0, len4: number = line.Measures.length; idx4 < len4; ++idx4) {\n const measure: GraphicalMeasure = line.Measures[idx4];\n for (let idx5: number = 0, len5: number = measure.staffEntries.length; idx5 < len5; ++idx5) {\n const graphicalStaffEntry: GraphicalStaffEntry = measure.staffEntries[idx5];\n for (let idx6: number = 0, len6: number = graphicalStaffEntry.sourceStaffEntry.VoiceEntries.length; idx6 < len6; ++idx6) {\n const voiceEntry: VoiceEntry = graphicalStaffEntry.sourceStaffEntry.VoiceEntries[idx6];\n if (voiceEntry.Articulations.length > 0) {\n this.layoutArticulationMarks(voiceEntry.Articulations, voiceEntry, graphicalStaffEntry);\n }\n }\n }\n }\n }\n }\n }\n\n private calculateOrnaments(): void {\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const system: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = system.StaffLines.length; idx3 < len3; ++idx3) {\n const line: StaffLine = system.StaffLines[idx3];\n for (let idx4: number = 0, len4: number = line.Measures.length; idx4 < len4; ++idx4) {\n const measure: GraphicalMeasure = line.Measures[idx4];\n for (let idx5: number = 0, len5: number = measure.staffEntries.length; idx5 < len5; ++idx5) {\n const graphicalStaffEntry: GraphicalStaffEntry = measure.staffEntries[idx5];\n for (let idx6: number = 0, len6: number = graphicalStaffEntry.sourceStaffEntry.VoiceEntries.length; idx6 < len6; ++idx6) {\n const voiceEntry: VoiceEntry = graphicalStaffEntry.sourceStaffEntry.VoiceEntries[idx6];\n if (voiceEntry.OrnamentContainer) {\n if (voiceEntry.hasTie() && !graphicalStaffEntry.relInMeasureTimestamp.Equals(voiceEntry.Timestamp)) {\n continue;\n }\n this.layoutOrnament(voiceEntry.OrnamentContainer, voiceEntry, graphicalStaffEntry);\n if (!(this.staffEntriesWithOrnaments.indexOf(graphicalStaffEntry) !== -1)) {\n this.staffEntriesWithOrnaments.push(graphicalStaffEntry);\n }\n }\n }\n }\n }\n }\n }\n }\n\n private optimizeRestPlacement(): void {\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const system: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = system.StaffLines.length; idx3 < len3; ++idx3) {\n const line: StaffLine = system.StaffLines[idx3];\n for (let idx4: number = 0, len4: number = line.Measures.length; idx4 < len4; ++idx4) {\n const measure: GraphicalMeasure = line.Measures[idx4];\n for (let idx5: number = 0, len5: number = measure.staffEntries.length; idx5 < len5; ++idx5) {\n const graphicalStaffEntry: GraphicalStaffEntry = measure.staffEntries[idx5];\n this.optimizeRestNotePlacement(graphicalStaffEntry, measure);\n }\n }\n }\n }\n }\n\n private calculateTwoRestNotesPlacementWithCollisionDetection(graphicalStaffEntry: GraphicalStaffEntry): void {\n const firstRestNote: GraphicalNote = graphicalStaffEntry.graphicalVoiceEntries[0].notes[0];\n const secondRestNote: GraphicalNote = graphicalStaffEntry.graphicalVoiceEntries[1].notes[0];\n secondRestNote.PositionAndShape.RelativePosition = new PointF2D(0.0, 2.5);\n graphicalStaffEntry.PositionAndShape.calculateAbsolutePositionsRecursiveWithoutTopelement();\n firstRestNote.PositionAndShape.computeNonOverlappingPositionWithMargin(\n graphicalStaffEntry.PositionAndShape, ColDirEnum.Up,\n new PointF2D(0.0, secondRestNote.PositionAndShape.RelativePosition.y)\n );\n const relative: PointF2D = firstRestNote.PositionAndShape.RelativePosition;\n relative.y -= 1.0;\n firstRestNote.PositionAndShape.RelativePosition = relative;\n graphicalStaffEntry.PositionAndShape.calculateBoundingBox();\n }\n\n private calculateRestNotePlacementWithCollisionDetectionFromGraphicalNote(graphicalStaffEntry: GraphicalStaffEntry): void {\n let restNote: GraphicalNote;\n let graphicalNotes: GraphicalNote[];\n if (graphicalStaffEntry.graphicalVoiceEntries[0].notes[0].sourceNote.isRest()) {\n restNote = graphicalStaffEntry.graphicalVoiceEntries[0].notes[0];\n graphicalNotes = graphicalStaffEntry.graphicalVoiceEntries[1].notes;\n } else {\n graphicalNotes = graphicalStaffEntry.graphicalVoiceEntries[0].notes;\n restNote = graphicalStaffEntry.graphicalVoiceEntries[1].notes[0];\n }\n //restNote.parallelVoiceEntryNotes = graphicalNotes; // TODO maybe save potentially colliding notes, check them in VexFlowConverter.StaveNote\n let collision: boolean = false;\n graphicalStaffEntry.PositionAndShape.calculateAbsolutePositionsRecursiveWithoutTopelement();\n for (let idx: number = 0, len: number = graphicalNotes.length; idx < len; ++idx) {\n const graphicalNote: GraphicalNote = graphicalNotes[idx];\n if (restNote.PositionAndShape.marginCollisionDetection(graphicalNote.PositionAndShape)) {\n // TODO bounding box of graphical note isn't set correctly yet.\n // we could do manual collision checking here\n collision = true;\n break;\n }\n }\n if (collision) {\n if (restNote.sourceNote.ParentVoiceEntry.ParentVoice instanceof LinkedVoice) {\n const bottomBorder: number = graphicalNotes[0].PositionAndShape.BorderMarginBottom + graphicalNotes[0].PositionAndShape.RelativePosition.y;\n restNote.PositionAndShape.RelativePosition = new PointF2D(0.0, bottomBorder - restNote.PositionAndShape.BorderMarginTop + 0.5);\n } else {\n const last: GraphicalNote = graphicalNotes[graphicalNotes.length - 1];\n const topBorder: number = last.PositionAndShape.BorderMarginTop + last.PositionAndShape.RelativePosition.y;\n if (graphicalNotes[0].sourceNote.ParentVoiceEntry.ParentVoice instanceof LinkedVoice) {\n restNote.PositionAndShape.RelativePosition = new PointF2D(0.0, topBorder - restNote.PositionAndShape.BorderMarginBottom - 0.5);\n } else {\n const bottomBorder: number = graphicalNotes[0].PositionAndShape.BorderMarginBottom + graphicalNotes[0].PositionAndShape.RelativePosition.y;\n if (bottomBorder < 2.0) {\n restNote.PositionAndShape.RelativePosition = new PointF2D(0.0, bottomBorder - restNote.PositionAndShape.BorderMarginTop + 0.5);\n } else {\n restNote.PositionAndShape.RelativePosition = new PointF2D(0.0, topBorder - restNote.PositionAndShape.BorderMarginBottom - 0.0);\n }\n }\n }\n }\n graphicalStaffEntry.PositionAndShape.calculateBoundingBox();\n }\n\n private calculateTieCurves(): void {\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n for (let idx4: number = 0, len5: number = staffLine.Measures.length; idx4 < len5; ++idx4) {\n const measure: GraphicalMeasure = staffLine.Measures[idx4];\n for (let idx6: number = 0, len6: number = measure.staffEntries.length; idx6 < len6; ++idx6) {\n const staffEntry: GraphicalStaffEntry = measure.staffEntries[idx6];\n const graphicalTies: GraphicalTie[] = staffEntry.GraphicalTies;\n for (let idx7: number = 0, len7: number = graphicalTies.length; idx7 < len7; ++idx7) {\n const graphicalTie: GraphicalTie = graphicalTies[idx7];\n if (graphicalTie.StartNote !== undefined && graphicalTie.StartNote.parentVoiceEntry.parentStaffEntry === staffEntry) {\n const tieIsAtSystemBreak: boolean = (\n graphicalTie.StartNote.parentVoiceEntry.parentStaffEntry.parentMeasure.ParentStaffLine !==\n graphicalTie.EndNote.parentVoiceEntry.parentStaffEntry.parentMeasure.ParentStaffLine\n );\n this.layoutGraphicalTie(graphicalTie, tieIsAtSystemBreak);\n }\n }\n }\n }\n }\n }\n }\n\n private calculateLyricsPosition(): void {\n const lyricStaffEntriesDict: Dictionary = new Dictionary();\n // sort the lyriceVerseNumbers for every Instrument that has Lyrics\n for (let idx: number = 0, len: number = this.graphicalMusicSheet.ParentMusicSheet.Instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.graphicalMusicSheet.ParentMusicSheet.Instruments[idx];\n if (instrument.HasLyrics && instrument.LyricVersesNumbers.length > 0) {\n instrument.LyricVersesNumbers.sort();\n }\n }\n // first calc lyrics text positions\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n const lyricsStaffEntries: GraphicalStaffEntry[] =\n this.calculateSingleStaffLineLyricsPosition(staffLine, staffLine.ParentStaff.ParentInstrument.LyricVersesNumbers);\n lyricStaffEntriesDict.setValue(staffLine, lyricsStaffEntries);\n this.calculateLyricsExtendsAndDashes(lyricStaffEntriesDict.getValue(staffLine));\n }\n }\n // then fill in the lyric word dashes and lyrics extends/underscores\n for (let idx2: number = 0, len2: number = this.musicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = this.musicSystems[idx2];\n for (let idx3: number = 0, len3: number = musicSystem.StaffLines.length; idx3 < len3; ++idx3) {\n const staffLine: StaffLine = musicSystem.StaffLines[idx3];\n this.calculateLyricsExtendsAndDashes(lyricStaffEntriesDict.getValue(staffLine));\n }\n }\n }\n\n /**\n * This method calculates the dashes within the syllables of a LyricWord\n * @param lyricEntry\n */\n private calculateSingleLyricWord(lyricEntry: GraphicalLyricEntry): void {\n // const skyBottomLineCalculator: SkyBottomLineCalculator = new SkyBottomLineCalculator (this.rules);\n const graphicalLyricWord: GraphicalLyricWord = lyricEntry.ParentLyricWord;\n const index: number = graphicalLyricWord.GraphicalLyricsEntries.indexOf(lyricEntry);\n let nextLyricEntry: GraphicalLyricEntry = undefined;\n if (index >= 0) {\n nextLyricEntry = graphicalLyricWord.GraphicalLyricsEntries[index + 1];\n }\n if (!nextLyricEntry) {\n return;\n }\n const startStaffLine: StaffLine = lyricEntry.StaffEntryParent.parentMeasure.ParentStaffLine;\n const nextStaffLine: StaffLine = nextLyricEntry.StaffEntryParent.parentMeasure.ParentStaffLine;\n const startStaffEntry: GraphicalStaffEntry = lyricEntry.StaffEntryParent;\n const endStaffentry: GraphicalStaffEntry = nextLyricEntry.StaffEntryParent;\n\n // if on the same StaffLine\n if (lyricEntry.StaffEntryParent.parentMeasure.ParentStaffLine === nextLyricEntry.StaffEntryParent.parentMeasure.ParentStaffLine) {\n // start- and End margins from the text Labels\n const startX: number = startStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x +\n startStaffEntry.PositionAndShape.RelativePosition.x +\n lyricEntry.GraphicalLabel.PositionAndShape.RelativePosition.x +\n lyricEntry.GraphicalLabel.PositionAndShape.BorderMarginRight;\n\n const endX: number = endStaffentry.parentMeasure.PositionAndShape.RelativePosition.x +\n endStaffentry.PositionAndShape.RelativePosition.x +\n lyricEntry.GraphicalLabel.PositionAndShape.RelativePosition.x +\n nextLyricEntry.GraphicalLabel.PositionAndShape.BorderMarginLeft;\n const y: number = lyricEntry.GraphicalLabel.PositionAndShape.RelativePosition.y;\n let numberOfDashes: number = 1;\n if ((endX - startX) > this.rules.MinimumDistanceBetweenDashes * 3) {\n // *3: need distance between word to first dash, dash to dash, dash to next word\n numberOfDashes = Math.floor((endX - startX) / this.rules.MinimumDistanceBetweenDashes) - 1;\n }\n // check distance and create the adequate number of Dashes\n if (numberOfDashes === 1) {\n // distance between the two GraphicalLyricEntries is big for only one Dash, position in the middle\n this.calculateSingleDashForLyricWord(startStaffLine, startX, endX, y);\n } else {\n // distance is big enough for more Dashes\n // calculate the adequate number of Dashes from the distance between the two LyricEntries\n // distance between the Dashes should be equal\n this.calculateDashes(startStaffLine, startX, endX, y);\n }\n } else {\n // start and end on different StaffLines\n // start margin from the text Label until the End of StaffLine\n const startX: number = startStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x +\n startStaffEntry.PositionAndShape.RelativePosition.x +\n lyricEntry.GraphicalLabel.PositionAndShape.BorderMarginRight;\n const lastGraphicalMeasure: GraphicalMeasure = startStaffLine.Measures[startStaffLine.Measures.length - 1];\n const endX: number = lastGraphicalMeasure.PositionAndShape.RelativePosition.x + lastGraphicalMeasure.PositionAndShape.Size.width;\n let y: number = lyricEntry.GraphicalLabel.PositionAndShape.RelativePosition.y;\n\n // calculate Dashes for the first StaffLine\n this.calculateDashes(startStaffLine, startX, endX, y);\n\n // calculate Dashes for the second StaffLine (only if endStaffEntry isn't the first StaffEntry of the StaffLine)\n if (nextStaffLine && // check for undefined objects e.g. when drawingRange given\n nextStaffLine.Measures[0] &&\n endStaffentry.parentMeasure.ParentStaffLine &&\n !(endStaffentry === endStaffentry.parentMeasure.staffEntries[0] &&\n endStaffentry.parentMeasure === endStaffentry.parentMeasure.ParentStaffLine.Measures[0])) {\n const secondStartX: number = nextStaffLine.Measures[0].staffEntries[0].PositionAndShape.RelativePosition.x;\n const secondEndX: number = endStaffentry.parentMeasure.PositionAndShape.RelativePosition.x +\n endStaffentry.PositionAndShape.RelativePosition.x +\n nextLyricEntry.GraphicalLabel.PositionAndShape.BorderMarginLeft;\n y = nextLyricEntry.GraphicalLabel.PositionAndShape.RelativePosition.y;\n this.calculateDashes(nextStaffLine, secondStartX, secondEndX, y);\n }\n }\n }\n\n /**\n * This method calculates Dashes for a LyricWord.\n * @param staffLine\n * @param startX\n * @param endX\n * @param y\n */\n private calculateDashes(staffLine: StaffLine, startX: number, endX: number, y: number): void {\n let distance: number = endX - startX;\n if (distance < this.rules.MinimumDistanceBetweenDashes * 3) {\n this.calculateSingleDashForLyricWord(staffLine, startX, endX, y);\n } else {\n // enough distance for more Dashes\n const numberOfDashes: number = Math.floor(distance / this.rules.MinimumDistanceBetweenDashes) - 1;\n const distanceBetweenDashes: number = distance / (numberOfDashes + 1);\n let counter: number = 0;\n\n startX += distanceBetweenDashes;\n endX -= distanceBetweenDashes;\n while (counter <= Math.floor(numberOfDashes / 2.0) && endX > startX) {\n distance = this.calculateRightAndLeftDashesForLyricWord(staffLine, startX, endX, y);\n startX += distanceBetweenDashes;\n endX -= distanceBetweenDashes;\n counter++;\n }\n\n // if the remaining distance isn't big enough for two Dashes,\n // but long enough for a middle dash inbetween,\n // then put the last Dash in the middle of the remaining distance\n if (distance > distanceBetweenDashes * 2) {\n this.calculateSingleDashForLyricWord(staffLine, startX, endX, y);\n }\n }\n }\n\n /**\n * This method calculates a single Dash for a LyricWord, positioned in the middle of the given distance.\n * @param {StaffLine} staffLine\n * @param {number} startX\n * @param {number} endX\n * @param {number} y\n */\n private calculateSingleDashForLyricWord(staffLine: StaffLine, startX: number, endX: number, y: number): void {\n const label: Label = new Label(\"-\");\n const dash: GraphicalLabel = new GraphicalLabel(\n label, this.rules.LyricsHeight, TextAlignmentEnum.CenterBottom, this.rules);\n dash.setLabelPositionAndShapeBorders();\n staffLine.LyricsDashes.push(dash);\n if (this.staffLinesWithLyricWords.indexOf(staffLine) === -1) {\n this.staffLinesWithLyricWords.push(staffLine);\n }\n dash.PositionAndShape.Parent = staffLine.PositionAndShape;\n const relative: PointF2D = new PointF2D(startX + (endX - startX) / 2, y);\n dash.PositionAndShape.RelativePosition = relative;\n }\n\n /**\n * Layouts the underscore line when a lyric entry is marked as extend\n * @param {GraphicalLyricEntry} lyricEntry\n */\n private calculateLyricExtend(lyricEntry: GraphicalLyricEntry): void {\n let startY: number = lyricEntry.GraphicalLabel.PositionAndShape.RelativePosition.y;\n const startStaffEntry: GraphicalStaffEntry = lyricEntry.StaffEntryParent;\n const startStaffLine: StaffLine = startStaffEntry.parentMeasure.ParentStaffLine;\n\n // find endstaffEntry and staffLine\n let endStaffEntry: GraphicalStaffEntry = undefined;\n let endStaffLine: StaffLine = undefined;\n const staffIndex: number = startStaffEntry.parentMeasure.ParentStaff.idInMusicSheet;\n for (let index: number = startStaffEntry.parentVerticalContainer.Index + 1;\n index < this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers.length;\n ++index) {\n const gse: GraphicalStaffEntry = this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[index].StaffEntries[staffIndex];\n if (!gse) {\n continue;\n }\n if (gse.hasOnlyRests()) {\n break;\n }\n if (gse.LyricsEntries.length > 0) {\n break;\n }\n endStaffEntry = gse;\n endStaffLine = endStaffEntry.parentMeasure.ParentStaffLine;\n }\n if (!endStaffEntry) {\n return;\n }\n // if on the same StaffLine\n if (startStaffLine === endStaffLine) {\n // start- and End margins from the text Labels\n const startX: number = startStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x +\n startStaffEntry.PositionAndShape.RelativePosition.x +\n lyricEntry.GraphicalLabel.PositionAndShape.BorderMarginRight;\n // + startStaffLine.PositionAndShape.AbsolutePosition.x; // doesn't work, done in drawer\n const endX: number = endStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x +\n endStaffEntry.PositionAndShape.RelativePosition.x +\n endStaffEntry.PositionAndShape.BorderMarginRight;\n // + endStaffLine.PositionAndShape.AbsolutePosition.x; // doesn't work, done in drawer\n // TODO maybe add half-width of following note.\n // though we don't have the vexflow note's bbox yet and extend layouting is unconstrained,\n // we have more room for spacing without it.\n // needed in order to line up with the Label's text bottom line (is the y position of the underscore)\n startY -= lyricEntry.GraphicalLabel.PositionAndShape.Size.height / 4;\n // create a Line (as underscore after the LyricLabel's End)\n this.calculateSingleLyricWordWithUnderscore(startStaffLine, startX, endX, startY);\n } else { // start and end on different StaffLines\n // start margin from the text Label until the End of StaffLine\n const lastMeasureBb: BoundingBox = startStaffLine.Measures[startStaffLine.Measures.length - 1].PositionAndShape;\n const startX: number = startStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x +\n startStaffEntry.PositionAndShape.RelativePosition.x +\n lyricEntry.GraphicalLabel.PositionAndShape.BorderMarginRight;\n const endX: number = lastMeasureBb.RelativePosition.x +\n lastMeasureBb.Size.width;\n // needed in order to line up with the Label's text bottom line\n startY -= lyricEntry.GraphicalLabel.PositionAndShape.Size.height / 4;\n // first Underscore until the StaffLine's End\n this.calculateSingleLyricWordWithUnderscore(startStaffLine, startX, endX, startY);\n if (!endStaffEntry) {\n return;\n }\n // second Underscore in the endStaffLine until endStaffEntry (if endStaffEntry isn't the first StaffEntry of the StaffLine))\n if (!(endStaffEntry === endStaffEntry.parentMeasure.staffEntries[0] &&\n endStaffEntry.parentMeasure === endStaffEntry.parentMeasure.ParentStaffLine.Measures[0])) {\n const secondStartX: number = endStaffLine.Measures[0].staffEntries[0].PositionAndShape.RelativePosition.x;\n const secondEndX: number = endStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x +\n endStaffEntry.PositionAndShape.RelativePosition.x +\n endStaffEntry.PositionAndShape.BorderMarginRight;\n this.calculateSingleLyricWordWithUnderscore(endStaffLine, secondStartX, secondEndX, startY);\n }\n }\n }\n\n /**\n * This method calculates a single underscoreLine.\n * @param staffLine\n * @param startX\n * @param end\n * @param y\n */\n private calculateSingleLyricWordWithUnderscore(staffLine: StaffLine, startX: number, endX: number, y: number): void {\n const lineStart: PointF2D = new PointF2D(startX, y);\n const lineEnd: PointF2D = new PointF2D(endX, y);\n const graphicalLine: GraphicalLine = new GraphicalLine(lineStart, lineEnd, this.rules.LyricUnderscoreLineWidth);\n staffLine.LyricLines.push(graphicalLine);\n if (this.staffLinesWithLyricWords.indexOf(staffLine) === -1) {\n this.staffLinesWithLyricWords.push(staffLine);\n }\n }\n\n /**\n * This method calculates two Dashes for a LyricWord, positioned at the the two ends of the given distance.\n * @param {StaffLine} staffLine\n * @param {number} startX\n * @param {number} endX\n * @param {number} y\n * @returns {number}\n */\n private calculateRightAndLeftDashesForLyricWord(staffLine: StaffLine, startX: number, endX: number, y: number): number {\n const leftLabel: Label = new Label(\"-\");\n const leftDash: GraphicalLabel = new GraphicalLabel(\n leftLabel, this.rules.LyricsHeight, TextAlignmentEnum.CenterBottom, this.rules);\n leftDash.setLabelPositionAndShapeBorders();\n staffLine.LyricsDashes.push(leftDash);\n if (this.staffLinesWithLyricWords.indexOf(staffLine) === -1) {\n this.staffLinesWithLyricWords.push(staffLine);\n }\n leftDash.PositionAndShape.Parent = staffLine.PositionAndShape;\n const leftDashRelative: PointF2D = new PointF2D(startX, y);\n leftDash.PositionAndShape.RelativePosition = leftDashRelative;\n\n const rightLabel: Label = new Label(\"-\");\n const rightDash: GraphicalLabel = new GraphicalLabel(\n rightLabel, this.rules.LyricsHeight, TextAlignmentEnum.CenterBottom, this.rules);\n rightDash.setLabelPositionAndShapeBorders();\n staffLine.LyricsDashes.push(rightDash);\n rightDash.PositionAndShape.Parent = staffLine.PositionAndShape;\n const rightDashRelative: PointF2D = new PointF2D(endX, y);\n rightDash.PositionAndShape.RelativePosition = rightDashRelative;\n return (rightDash.PositionAndShape.RelativePosition.x - leftDash.PositionAndShape.RelativePosition.x);\n }\n\n private calculateDynamicExpressions(): void {\n const maxIndex: number = Math.min(this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length - 1, this.rules.MaxMeasureToDrawIndex);\n const minIndex: number = Math.min(this.rules.MinMeasureToDrawIndex, this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length);\n for (let i: number = minIndex; i <= maxIndex; i++) {\n const sourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures[i];\n for (let j: number = 0; j < sourceMeasure.StaffLinkedExpressions.length; j++) {\n if (this.graphicalMusicSheet.MeasureList[i][j].ParentStaff.ParentInstrument.Visible) {\n for (let k: number = 0; k < sourceMeasure.StaffLinkedExpressions[j].length; k++) {\n if (sourceMeasure.StaffLinkedExpressions[j][k].InstantaneousDynamic !== undefined ||\n (sourceMeasure.StaffLinkedExpressions[j][k].StartingContinuousDynamic !== undefined &&\n sourceMeasure.StaffLinkedExpressions[j][k].StartingContinuousDynamic.StartMultiExpression ===\n sourceMeasure.StaffLinkedExpressions[j][k] && sourceMeasure.StaffLinkedExpressions[j][k].UnknownList.length === 0)\n ) {\n this.calculateDynamicExpressionsForMultiExpression(sourceMeasure.StaffLinkedExpressions[j][k], i, j);\n }\n }\n }\n }\n }\n }\n\n private calculateOctaveShifts(): void {\n for (let i: number = 0; i < this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length; i++) {\n const sourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures[i];\n for (let j: number = 0; j < sourceMeasure.StaffLinkedExpressions.length; j++) {\n if (this.graphicalMusicSheet.MeasureList[i][j].ParentStaff.ParentInstrument.Visible) {\n for (let k: number = 0; k < sourceMeasure.StaffLinkedExpressions[j].length; k++) {\n if ((sourceMeasure.StaffLinkedExpressions[j][k].OctaveShiftStart)) {\n this.calculateSingleOctaveShift(sourceMeasure, sourceMeasure.StaffLinkedExpressions[j][k], i, j);\n }\n }\n }\n }\n }\n }\n\n private getFirstLeftNotNullStaffEntryFromContainer(horizontalIndex: number, verticalIndex: number, multiStaffInstrument: boolean): GraphicalStaffEntry {\n if (this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[horizontalIndex].StaffEntries[verticalIndex]) {\n return this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[horizontalIndex].StaffEntries[verticalIndex];\n }\n for (let i: number = horizontalIndex - 1; i >= 0; i--) {\n if (this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[i].StaffEntries[verticalIndex]) {\n return this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[i].StaffEntries[verticalIndex];\n }\n }\n return undefined;\n }\n\n private getFirstRightNotNullStaffEntryFromContainer(horizontalIndex: number, verticalIndex: number, multiStaffInstrument: boolean): GraphicalStaffEntry {\n if (this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[horizontalIndex].StaffEntries[verticalIndex]) {\n return this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[horizontalIndex].StaffEntries[verticalIndex];\n }\n for (let i: number = horizontalIndex + 1; i < this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers.length; i++) {\n if (this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[i].StaffEntries[verticalIndex]) {\n return this.graphicalMusicSheet.VerticalGraphicalStaffEntryContainers[i].StaffEntries[verticalIndex];\n }\n }\n return undefined;\n }\n\n private calculateWordRepetitionInstructions(): void {\n for (let i: number = 0; i < this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length; i++) {\n const sourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures[i];\n for (let idx: number = 0, len: number = sourceMeasure.FirstRepetitionInstructions.length; idx < len; ++idx) {\n const instruction: RepetitionInstruction = sourceMeasure.FirstRepetitionInstructions[idx];\n this.calculateWordRepetitionInstruction(instruction, i);\n }\n for (let idx: number = 0, len: number = sourceMeasure.LastRepetitionInstructions.length; idx < len; ++idx) {\n const instruction: RepetitionInstruction = sourceMeasure.LastRepetitionInstructions[idx];\n this.calculateWordRepetitionInstruction(instruction, i);\n }\n }\n }\n\n private calculateRepetitionEndings(): void {\n const musicsheet: MusicSheet = this.graphicalMusicSheet.ParentMusicSheet;\n for (let idx: number = 0, len: number = musicsheet.Repetitions.length; idx < len; ++idx) {\n const repetition: Repetition = musicsheet.Repetitions[idx];\n this.calcGraphicalRepetitionEndingsRecursively(repetition);\n }\n }\n\n private calculateTempoExpressions(): void {\n const maxIndex: number = Math.min(this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length - 1, this.rules.MaxMeasureToDrawIndex);\n const minIndex: number = this.rules.MinMeasureToDrawIndex;\n for (let i: number = minIndex; i <= maxIndex; i++) {\n const sourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures[i];\n for (let j: number = 0; j < sourceMeasure.TempoExpressions.length; j++) {\n this.calculateTempoExpressionsForMultiTempoExpression(sourceMeasure, sourceMeasure.TempoExpressions[j], i);\n }\n }\n }\n\n private calculateMoodAndUnknownExpressions(): void {\n for (let i: number = 0; i < this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length; i++) {\n const sourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures[i];\n for (let j: number = 0; j < sourceMeasure.StaffLinkedExpressions.length; j++) {\n if (this.graphicalMusicSheet.MeasureList[i][j].ParentStaff.ParentInstrument.Visible) {\n for (let k: number = 0; k < sourceMeasure.StaffLinkedExpressions[j].length; k++) {\n if ((sourceMeasure.StaffLinkedExpressions[j][k].MoodList.length > 0) ||\n (sourceMeasure.StaffLinkedExpressions[j][k].UnknownList.length > 0)) {\n this.calculateMoodAndUnknownExpression(sourceMeasure.StaffLinkedExpressions[j][k], i, j);\n }\n }\n }\n }\n }\n }\n\n /**\n * Calculates the desired stem direction depending on the number (or type) of voices.\n * If more than one voice is there, the main voice (typically the first or upper voice) will get stem up direction.\n * The others get stem down direction.\n * @param voiceEntry the voiceEntry for which the stem direction has to be calculated\n */\n private calculateStemDirectionFromVoices(voiceEntry: VoiceEntry): void {\n // Stem direction calculation:\n const hasLink: boolean = voiceEntry.ParentSourceStaffEntry.Link !== undefined;\n if (hasLink) {\n // in case of StaffEntryLink don't check mainVoice / linkedVoice\n if (voiceEntry === voiceEntry.ParentSourceStaffEntry.VoiceEntries[0]) {\n // set stem up:\n voiceEntry.WantedStemDirection = StemDirectionType.Up;\n return;\n } else {\n // set stem down:\n voiceEntry.WantedStemDirection = StemDirectionType.Down;\n return;\n }\n } else {\n if (voiceEntry.ParentVoice instanceof LinkedVoice) {\n // Linked voice: set stem down:\n voiceEntry.WantedStemDirection = StemDirectionType.Down;\n } else {\n // if this voiceEntry belongs to the mainVoice:\n // check first that there are also more voices present:\n if (voiceEntry.ParentSourceStaffEntry.VoiceEntries.length > 1) {\n // as this voiceEntry belongs to the mainVoice: stem Up\n voiceEntry.WantedStemDirection = StemDirectionType.Up;\n }\n }\n }\n // setBeamNotesWantedStemDirections() will be called at end of measure (createGraphicalMeasure)\n }\n\n /** Sets a voiceEntry's stem direction to one already set in other notes in its beam, if it has one. */\n private setBeamNotesWantedStemDirections(voiceEntry: VoiceEntry): void {\n if (voiceEntry.WantedStemDirection === StemDirectionType.Undefined &&\n voiceEntry.Notes.length > 0) {\n const beam: Beam = voiceEntry.Notes[0].NoteBeam;\n if (beam) {\n // if there is a beam, find any already set stemDirection in the beam:\n for (const note of beam.Notes) {\n if (note.ParentVoiceEntry === voiceEntry) {\n continue;\n } else if (note.ParentVoiceEntry.WantedStemDirection !== StemDirectionType.Undefined) {\n // set the stem direction\n voiceEntry.WantedStemDirection = note.ParentVoiceEntry.WantedStemDirection;\n break;\n }\n }\n }\n }\n }\n}\n","import {AbstractNotationInstruction} from \"./AbstractNotationInstruction\";\nimport {SourceStaffEntry} from \"../SourceStaffEntry\";\nimport {NoteEnum} from \"../../../Common/DataObjects/Pitch\";\nimport {AccidentalEnum} from \"../../../Common/DataObjects/Pitch\";\nimport {Pitch} from \"../../../Common/DataObjects/Pitch\";\n\n/**\n * A [[KeyInstruction]] is a key signature denoting which notes are to be sharpened or flattened.\n */\nexport class KeyInstruction extends AbstractNotationInstruction {\n constructor(sourceStaffEntry: SourceStaffEntry = undefined, key: number = 0, mode: KeyEnum = KeyEnum.major) {\n super(sourceStaffEntry);\n this.Key = key;\n this.mode = mode;\n this.alteratedNotes = this.calcAlteratedNotes();\n }\n\n private static sharpPositionList: NoteEnum[] = [NoteEnum.F, NoteEnum.C, NoteEnum.G, NoteEnum.D, NoteEnum.A, NoteEnum.E, NoteEnum.B];\n private static flatPositionList: NoteEnum[] = [NoteEnum.B, NoteEnum.E, NoteEnum.A, NoteEnum.D, NoteEnum.G, NoteEnum.C, NoteEnum.F];\n\n private keyType: number;\n private mode: KeyEnum;\n private alteratedNotes: NoteEnum[];\n\n public static copy(keyInstruction: KeyInstruction): KeyInstruction {\n const newKeyInstruction: KeyInstruction = new KeyInstruction(keyInstruction.parent, keyInstruction.Key, keyInstruction.Mode);\n return newKeyInstruction;\n }\n\n public static getAllPossibleMajorKeyInstructions(): KeyInstruction[] {\n const keyInstructionList: KeyInstruction[] = [];\n for (let keyType: number = -7; keyType < 7; keyType++) {\n const currentKeyInstruction: KeyInstruction = new KeyInstruction(undefined, keyType, KeyEnum.major);\n keyInstructionList.push(currentKeyInstruction);\n }\n return keyInstructionList;\n }\n\n public get Key(): number {\n return this.keyType;\n }\n\n public set Key(value: number) {\n this.keyType = value;\n this.alteratedNotes = this.calcAlteratedNotes();\n }\n\n public get Mode(): KeyEnum {\n return this.mode;\n }\n\n public set Mode(value: KeyEnum) {\n this.mode = value;\n }\n\n public get AlteratedNotes(): NoteEnum[] {\n return this.alteratedNotes;\n }\n\n private calcAlteratedNotes(): NoteEnum[] {\n const noteList: NoteEnum[] = [];\n if (this.keyType > 0) {\n for (let i: number = 0; i < this.keyType; i++) {\n noteList.push(KeyInstruction.sharpPositionList[i]);\n }\n } else if (this.keyType < 0) {\n for (let i: number = 0; i < -this.keyType; i++) {\n noteList.push(KeyInstruction.flatPositionList[i]);\n }\n }\n return noteList;\n }\n\n public willAlterateNote(note: NoteEnum): boolean {\n if (this.alteratedNotes.indexOf(note) >= 0) {\n return true;\n }\n return false;\n }\n\n public getAlterationForPitch(pitch: Pitch): AccidentalEnum {\n if (this.keyType > 0 && this.alteratedNotes.indexOf(pitch.FundamentalNote) <= this.keyType) {\n return AccidentalEnum.SHARP;\n } else if (this.keyType < 0 && this.alteratedNotes.indexOf(pitch.FundamentalNote) <= Math.abs(this.keyType)) {\n return AccidentalEnum.FLAT;\n }\n return AccidentalEnum.NONE;\n }\n\n public ToString(): string {\n return \"Key: \" + this.keyType + \"\" + this.mode;\n }\n\n public OperatorEquals(key2: KeyInstruction): boolean {\n const key1: KeyInstruction = this;\n if (key1 === key2) {\n return true;\n }\n if (!key1 || !key2) {\n return false;\n }\n return (key1.Key === key2.Key && key1.Mode === key2.Mode);\n }\n\n public OperatorNotEqual(key2: KeyInstruction): boolean {\n return !(this.OperatorEquals(key2));\n }\n}\n\nexport class NoteEnumToHalfToneLink {\n constructor(note: NoteEnum, halftone: number) {\n this.note = note;\n this.halfTone = halftone;\n }\n\n public note: NoteEnum;\n public halfTone: number;\n}\n\nexport enum KeyEnum {\n major = 0,\n minor = 1,\n none = 2,\n dorian = 3,\n phrygian = 4,\n lydian = 5,\n mixolydian = 6,\n aeolian = 7,\n ionian = 8,\n locrian = 9,\n}\n","import {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {Voice} from \"./Voice\";\nimport {SourceStaffEntry} from \"./SourceStaffEntry\";\nimport {Note} from \"./Note\";\nimport {Pitch} from \"../../Common/DataObjects/Pitch\";\nimport {LyricsEntry} from \"./Lyrics/LyricsEntry\";\nimport {TechnicalInstruction} from \"./Instructions/TechnicalInstruction\";\nimport {OrnamentContainer} from \"./OrnamentContainer\";\nimport {KeyInstruction} from \"./Instructions/KeyInstruction\";\nimport {OrnamentEnum} from \"./OrnamentContainer\";\nimport {AccidentalEnum} from \"../../Common/DataObjects/Pitch\";\nimport Dictionary from \"typescript-collections/dist/lib/Dictionary\";\nimport {Arpeggio} from \"./Arpeggio\";\n\n/**\n * A [[VoiceEntry]] contains the notes in a voice at a timestamp.\n */\nexport class VoiceEntry {\n /**\n *\n * @param timestamp The relative timestamp within the source measure.\n * @param parentVoice\n * @param parentSourceStaffEntry\n * @param isGrace States whether the VoiceEntry has (only) grace notes.\n * @param graceNoteSlash States whether the grace note(s) have a slash (Acciaccatura, played before the beat)\n */\n constructor(timestamp: Fraction, parentVoice: Voice, parentSourceStaffEntry: SourceStaffEntry,\n isGrace: boolean = false, graceNoteSlash: boolean = false, graceSlur: boolean = false) {\n this.timestamp = timestamp;\n this.parentVoice = parentVoice;\n this.parentSourceStaffEntry = parentSourceStaffEntry;\n this.isGrace = isGrace;\n this.graceAfterMainNote = false;\n this.graceNoteSlash = graceNoteSlash;\n this.graceSlur = graceSlur;\n }\n\n private parentVoice: Voice;\n private parentSourceStaffEntry: SourceStaffEntry;\n private timestamp: Fraction;\n private notes: Note[] = [];\n private isGrace: boolean;\n /** States whether the grace notes come after a main note (at end of measure). */\n private graceAfterMainNote: boolean;\n private graceNoteSlash: boolean;\n private graceSlur: boolean; // TODO grace slur system could be refined to be non-binary\n private articulations: ArticulationEnum[] = [];\n private technicalInstructions: TechnicalInstruction[] = [];\n private lyricsEntries: Dictionary = new Dictionary();\n /** The Arpeggio consisting of this VoiceEntry's notes. Undefined if no arpeggio exists. */\n private arpeggio: Arpeggio;\n private ornamentContainer: OrnamentContainer;\n private wantedStemDirection: StemDirectionType = StemDirectionType.Undefined;\n /** Stem direction specified in the xml stem element. */\n private stemDirectionXml: StemDirectionType = StemDirectionType.Undefined;\n private stemDirection: StemDirectionType = StemDirectionType.Undefined;\n /** Color of the stem given in XML. RGB Hexadecimal, like #00FF00. */\n private stemColorXml: string;\n /** Color of the stem currently set. RGB Hexadecimal, like #00FF00. */\n private stemColor: string;\n\n public get ParentSourceStaffEntry(): SourceStaffEntry {\n return this.parentSourceStaffEntry;\n }\n public get ParentVoice(): Voice {\n return this.parentVoice;\n }\n public get Timestamp(): Fraction {\n return this.timestamp;\n }\n public set Timestamp(value: Fraction) {\n this.timestamp = value;\n }\n public get Notes(): Note[] {\n return this.notes;\n }\n public get IsGrace(): boolean {\n return this.isGrace;\n }\n public set IsGrace(value: boolean) {\n this.isGrace = value;\n }\n public get GraceAfterMainNote(): boolean {\n return this.graceAfterMainNote;\n }\n public set GraceAfterMainNote(value: boolean) {\n this.graceAfterMainNote = value;\n }\n public get GraceNoteSlash(): boolean {\n return this.graceNoteSlash;\n }\n public set GraceNoteSlash(value: boolean) {\n this.graceNoteSlash = value;\n }\n public get GraceSlur(): boolean {\n return this.graceSlur;\n }\n public set GraceSlur(value: boolean) {\n this.graceSlur = value;\n }\n public get Articulations(): ArticulationEnum[] {\n return this.articulations;\n }\n public get TechnicalInstructions(): TechnicalInstruction[] {\n return this.technicalInstructions;\n }\n public get LyricsEntries(): Dictionary {\n return this.lyricsEntries;\n }\n public get Arpeggio(): Arpeggio {\n return this.arpeggio;\n }\n public set Arpeggio(value: Arpeggio) {\n this.arpeggio = value;\n }\n public get OrnamentContainer(): OrnamentContainer {\n return this.ornamentContainer;\n }\n public set OrnamentContainer(value: OrnamentContainer) {\n this.ornamentContainer = value;\n }\n\n // WantedStemDirection provides the stem direction to VexFlow in case of more than 1 voice\n // for optimal graphical appearance\n public set WantedStemDirection(value: StemDirectionType) {\n this.wantedStemDirection = value;\n }\n public get WantedStemDirection(): StemDirectionType {\n return this.wantedStemDirection;\n }\n public set StemDirectionXml(value: StemDirectionType) {\n this.stemDirectionXml = value;\n }\n public get StemDirectionXml(): StemDirectionType {\n return this.stemDirectionXml;\n }\n // StemDirection holds the actual value of the stem\n public set StemDirection(value: StemDirectionType) {\n this.stemDirection = value;\n }\n public get StemDirection(): StemDirectionType {\n return this.stemDirection;\n }\n public get StemColorXml(): string {\n return this.stemColorXml;\n }\n public set StemColorXml(value: string) {\n this.stemColorXml = value;\n }\n public get StemColor(): string {\n return this.stemColor;\n }\n public set StemColor(value: string) {\n this.stemColor = value;\n }\n\n public static isSupportedArticulation(articulation: ArticulationEnum): boolean {\n switch (articulation) {\n case ArticulationEnum.accent:\n case ArticulationEnum.strongaccent:\n case ArticulationEnum.invertedstrongaccent:\n case ArticulationEnum.staccato:\n case ArticulationEnum.staccatissimo:\n case ArticulationEnum.spiccato:\n case ArticulationEnum.tenuto:\n case ArticulationEnum.fermata:\n case ArticulationEnum.invertedfermata:\n case ArticulationEnum.breathmark:\n case ArticulationEnum.caesura:\n case ArticulationEnum.lefthandpizzicato:\n case ArticulationEnum.naturalharmonic:\n case ArticulationEnum.snappizzicato:\n case ArticulationEnum.upbow:\n case ArticulationEnum.downbow:\n return true;\n default:\n return false;\n }\n }\n public hasTie(): boolean {\n for (let idx: number = 0, len: number = this.Notes.length; idx < len; ++idx) {\n const note: Note = this.Notes[idx];\n if (note.NoteTie) { return true; }\n }\n return false;\n }\n public hasSlur(): boolean {\n for (let idx: number = 0, len: number = this.Notes.length; idx < len; ++idx) {\n const note: Note = this.Notes[idx];\n if (note.NoteSlurs.length > 0) { return true; }\n }\n return false;\n }\n public isStaccato(): boolean {\n for (let idx: number = 0, len: number = this.Articulations.length; idx < len; ++idx) {\n const articulation: ArticulationEnum = this.Articulations[idx];\n if (articulation === ArticulationEnum.staccato) { return true; }\n }\n return false;\n }\n public isAccent(): boolean {\n for (let idx: number = 0, len: number = this.Articulations.length; idx < len; ++idx) {\n const articulation: ArticulationEnum = this.Articulations[idx];\n if (articulation === ArticulationEnum.accent || articulation === ArticulationEnum.strongaccent) {\n return true;\n }\n }\n return false;\n }\n public getVerseNumberForLyricEntry(lyricsEntry: LyricsEntry): number {\n let verseNumber: number = 1;\n this.lyricsEntries.forEach((key: number, value: LyricsEntry): void => {\n if (lyricsEntry === value) {\n verseNumber = key;\n }\n });\n return verseNumber;\n }\n //public createVoiceEntriesForOrnament(activeKey: KeyInstruction): VoiceEntry[] {\n // return this.createVoiceEntriesForOrnament(this, activeKey);\n //}\n public createVoiceEntriesForOrnament(voiceEntryWithOrnament: VoiceEntry, activeKey: KeyInstruction): VoiceEntry[] {\n if (!voiceEntryWithOrnament) {\n voiceEntryWithOrnament = this;\n }\n const voiceEntries: VoiceEntry[] = [];\n if (!voiceEntryWithOrnament.ornamentContainer) {\n return;\n }\n const baseNote: Note = this.notes[0];\n const baselength: Fraction = baseNote.Length;\n const baseVoice: Voice = voiceEntryWithOrnament.ParentVoice;\n const baseTimestamp: Fraction = voiceEntryWithOrnament.Timestamp;\n let currentTimestamp: Fraction = Fraction.createFromFraction(baseTimestamp);\n //let length: Fraction;\n switch (voiceEntryWithOrnament.ornamentContainer.GetOrnament) {\n case OrnamentEnum.Trill: {\n const length: Fraction = new Fraction(baselength.Numerator, baselength.Denominator * 8);\n const higherPitch: Pitch = baseNote.Pitch.getTransposedPitch(1);\n let alteration: AccidentalEnum = activeKey.getAlterationForPitch(higherPitch);\n if (voiceEntryWithOrnament.OrnamentContainer.AccidentalAbove !== AccidentalEnum.NONE) {\n alteration = voiceEntryWithOrnament.ornamentContainer.AccidentalAbove;\n }\n for (let i: number = 0; i < 8; i++) {\n currentTimestamp = Fraction.plus(baseTimestamp, new Fraction(i * length.Numerator, length.Denominator));\n if ((i % 2) === 0) {\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n } else {\n this.createAlteratedVoiceEntry(currentTimestamp, length, baseVoice, higherPitch, alteration, voiceEntries);\n }\n }\n break;\n }\n case OrnamentEnum.Turn: {\n const length: Fraction = new Fraction(baselength.Numerator, baselength.Denominator * 4);\n const lowerPitch: Pitch = baseNote.Pitch.getTransposedPitch(-1);\n const lowerAlteration: AccidentalEnum = activeKey.getAlterationForPitch(lowerPitch);\n const higherPitch: Pitch = baseNote.Pitch.getTransposedPitch(1);\n const higherAlteration: AccidentalEnum = activeKey.getAlterationForPitch(higherPitch);\n this.createAlteratedVoiceEntry(\n currentTimestamp, length, baseVoice, higherPitch, higherAlteration, voiceEntries\n );\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp.Add(length);\n this.createAlteratedVoiceEntry(\n currentTimestamp, length, baseVoice, lowerPitch, lowerAlteration, voiceEntries\n );\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n break;\n }\n case OrnamentEnum.InvertedTurn: {\n const length: Fraction = new Fraction(baselength.Numerator, baselength.Denominator * 4);\n const lowerPitch: Pitch = baseNote.Pitch.getTransposedPitch(-1);\n const lowerAlteration: AccidentalEnum = activeKey.getAlterationForPitch(lowerPitch);\n const higherPitch: Pitch = baseNote.Pitch.getTransposedPitch(1);\n const higherAlteration: AccidentalEnum = activeKey.getAlterationForPitch(higherPitch);\n this.createAlteratedVoiceEntry(\n currentTimestamp, length, baseVoice, lowerPitch, lowerAlteration, voiceEntries\n );\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp.Add(length);\n this.createAlteratedVoiceEntry(\n currentTimestamp, length, baseVoice, higherPitch, higherAlteration, voiceEntries\n );\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n break;\n }\n case OrnamentEnum.DelayedTurn: {\n const length: Fraction = new Fraction(baselength.Numerator, baselength.Denominator * 2);\n const lowerPitch: Pitch = baseNote.Pitch.getTransposedPitch(-1);\n const lowerAlteration: AccidentalEnum = activeKey.getAlterationForPitch(lowerPitch);\n const higherPitch: Pitch = baseNote.Pitch.getTransposedPitch(1);\n const higherAlteration: AccidentalEnum = activeKey.getAlterationForPitch(higherPitch);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp = Fraction.plus(baseTimestamp, length);\n length.Denominator = baselength.Denominator * 8;\n this.createAlteratedVoiceEntry(currentTimestamp, length, baseVoice, higherPitch, higherAlteration, voiceEntries);\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp.Add(length);\n this.createAlteratedVoiceEntry(currentTimestamp, length, baseVoice, lowerPitch, lowerAlteration, voiceEntries);\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n break;\n }\n case OrnamentEnum.DelayedInvertedTurn: {\n const length: Fraction = new Fraction(baselength.Numerator, baselength.Denominator * 2);\n const lowerPitch: Pitch = baseNote.Pitch.getTransposedPitch(-1);\n const lowerAlteration: AccidentalEnum = activeKey.getAlterationForPitch(lowerPitch);\n const higherPitch: Pitch = baseNote.Pitch.getTransposedPitch(1);\n const higherAlteration: AccidentalEnum = activeKey.getAlterationForPitch(higherPitch);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp = Fraction.plus(baseTimestamp, length);\n length.Denominator = baselength.Denominator * 8;\n this.createAlteratedVoiceEntry(currentTimestamp, length, baseVoice, lowerPitch, lowerAlteration, voiceEntries);\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp.Add(length);\n this.createAlteratedVoiceEntry(currentTimestamp, length, baseVoice, higherPitch, higherAlteration, voiceEntries);\n currentTimestamp.Add(length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n break;\n }\n case OrnamentEnum.Mordent: {\n const length: Fraction = new Fraction(baselength.Numerator, baselength.Denominator * 4);\n const higherPitch: Pitch = baseNote.Pitch.getTransposedPitch(1);\n const alteration: AccidentalEnum = activeKey.getAlterationForPitch(higherPitch);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp.Add(length);\n this.createAlteratedVoiceEntry(currentTimestamp, length, baseVoice, higherPitch, alteration, voiceEntries);\n length.Denominator = baselength.Denominator * 2;\n currentTimestamp = Fraction.plus(baseTimestamp, length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n break;\n }\n case OrnamentEnum.InvertedMordent: {\n const length: Fraction = new Fraction(baselength.Numerator, baselength.Denominator * 4);\n const lowerPitch: Pitch = baseNote.Pitch.getTransposedPitch(-1);\n const alteration: AccidentalEnum = activeKey.getAlterationForPitch(lowerPitch);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n currentTimestamp.Add(length);\n this.createAlteratedVoiceEntry(currentTimestamp, length, baseVoice, lowerPitch, alteration, voiceEntries);\n length.Denominator = baselength.Denominator * 2;\n currentTimestamp = Fraction.plus(baseTimestamp, length);\n this.createBaseVoiceEntry(currentTimestamp, length, baseVoice, baseNote, voiceEntries);\n break;\n }\n default:\n throw new RangeError();\n }\n return voiceEntries;\n }\n private createBaseVoiceEntry(\n currentTimestamp: Fraction, length: Fraction, baseVoice: Voice, baseNote: Note, voiceEntries: VoiceEntry[]\n ): void {\n const voiceEntry: VoiceEntry = new VoiceEntry(currentTimestamp, baseVoice, baseNote.ParentStaffEntry);\n const pitch: Pitch = new Pitch(baseNote.Pitch.FundamentalNote, baseNote.Pitch.Octave, baseNote.Pitch.Accidental);\n const note: Note = new Note(voiceEntry, undefined, length, pitch);\n voiceEntry.Notes.push(note);\n voiceEntries.push(voiceEntry);\n }\n private createAlteratedVoiceEntry(\n currentTimestamp: Fraction, length: Fraction, baseVoice: Voice, higherPitch: Pitch,\n alteration: AccidentalEnum, voiceEntries: VoiceEntry[]\n ): void {\n const voiceEntry: VoiceEntry = new VoiceEntry(currentTimestamp, baseVoice, undefined);\n const pitch: Pitch = new Pitch(higherPitch.FundamentalNote, higherPitch.Octave, alteration);\n const note: Note = new Note(voiceEntry, undefined, length, pitch);\n voiceEntry.Notes.push(note);\n voiceEntries.push(voiceEntry);\n }\n\n}\n\nexport enum ArticulationEnum {\n accent,\n strongaccent,\n invertedstrongaccent,\n staccato,\n staccatissimo,\n spiccato,\n tenuto,\n fermata,\n invertedfermata,\n breathmark,\n caesura,\n lefthandpizzicato,\n naturalharmonic,\n snappizzicato,\n upbow,\n downbow,\n scoop,\n plop,\n doit,\n falloff,\n stress,\n unstress,\n detachedlegato,\n otherarticulation\n}\n\nexport enum StemDirectionType {\n Undefined = -1,\n Up = 0,\n Down = 1,\n None = 2,\n Double = 3\n}\n","import {AbstractNotationInstruction} from \"./AbstractNotationInstruction\";\nimport {Fraction} from \"../../../Common/DataObjects/Fraction\";\n\n/**\n * A [[RhythmInstruction]] is the time signature which specifies the number of beats in each bar, and the value of one beat.\n */\nexport class RhythmInstruction extends AbstractNotationInstruction {\n constructor(rhythm: Fraction, rhythmSymbolEnum: RhythmSymbolEnum) {\n super(undefined); // FIXME no parent SourceStaffEntry\n this.rhythm = rhythm;\n this.numerator = rhythm.Numerator;\n this.denominator = rhythm.Denominator;\n this.symbolEnum = rhythmSymbolEnum;\n }\n\n private numerator: number;\n private denominator: number;\n private rhythm: Fraction;\n private symbolEnum: RhythmSymbolEnum;\n\n public get Rhythm(): Fraction {\n return this.rhythm;\n }\n\n public set Rhythm(value: Fraction) {\n this.rhythm = value;\n }\n\n public get SymbolEnum(): RhythmSymbolEnum {\n return this.symbolEnum;\n }\n\n public set SymbolEnum(value: RhythmSymbolEnum) {\n this.symbolEnum = value;\n }\n\n public clone(): RhythmInstruction {\n return new RhythmInstruction(this.rhythm.clone(), this.symbolEnum);\n }\n\n public OperatorEquals(rhythm2: RhythmInstruction): boolean {\n const rhythm1: RhythmInstruction = this;\n if (rhythm1 === rhythm2) {\n return true;\n }\n if (!rhythm1 || !rhythm2) {\n return false;\n }\n return (rhythm1.numerator === rhythm2.numerator && rhythm1.denominator === rhythm2.denominator);\n }\n\n public OperatorNotEqual(rhythm2: RhythmInstruction): boolean {\n const rhythm1: RhythmInstruction = this;\n return !(rhythm1 === rhythm2);\n }\n\n public ToString(): string {\n return \"Rhythm: \" + this.rhythm.toString();\n }\n}\n\nexport enum RhythmSymbolEnum {\n NONE = 0,\n COMMON = 1,\n CUT = 2,\n}\n","import Vex from \"vexflow\";\nimport {ClefEnum} from \"../../VoiceData/Instructions/ClefInstruction\";\nimport {ClefInstruction} from \"../../VoiceData/Instructions/ClefInstruction\";\nimport {Pitch} from \"../../../Common/DataObjects/Pitch\";\nimport {Fraction} from \"../../../Common/DataObjects/Fraction\";\nimport {RhythmInstruction} from \"../../VoiceData/Instructions/RhythmInstruction\";\nimport {RhythmSymbolEnum} from \"../../VoiceData/Instructions/RhythmInstruction\";\nimport {KeyInstruction} from \"../../VoiceData/Instructions/KeyInstruction\";\nimport {KeyEnum} from \"../../VoiceData/Instructions/KeyInstruction\";\nimport {AccidentalEnum} from \"../../../Common/DataObjects/Pitch\";\nimport {NoteEnum} from \"../../../Common/DataObjects/Pitch\";\nimport {VexFlowGraphicalNote} from \"./VexFlowGraphicalNote\";\nimport {GraphicalNote} from \"../GraphicalNote\";\nimport {SystemLinesEnum} from \"../SystemLinesEnum\";\nimport {FontStyles} from \"../../../Common/Enums/FontStyles\";\nimport {Fonts} from \"../../../Common/Enums/Fonts\";\nimport {OutlineAndFillStyleEnum, OUTLINE_AND_FILL_STYLE_DICT} from \"../DrawingEnums\";\nimport log from \"loglevel\";\nimport { ArticulationEnum, StemDirectionType } from \"../../VoiceData/VoiceEntry\";\nimport { SystemLinePosition } from \"../SystemLinePosition\";\nimport { GraphicalVoiceEntry } from \"../GraphicalVoiceEntry\";\nimport { OrnamentEnum, OrnamentContainer } from \"../../VoiceData/OrnamentContainer\";\nimport { Notehead, NoteHeadShape } from \"../../VoiceData/Notehead\";\nimport { unitInPixels } from \"./VexFlowMusicSheetDrawer\";\nimport { EngravingRules } from \"../EngravingRules\";\nimport { Note } from \"../..\";\nimport StaveNote = Vex.Flow.StaveNote;\nimport { ArpeggioType } from \"../../VoiceData\";\nimport { TabNote } from \"../../VoiceData/TabNote\";\n\n/**\n * Helper class, which contains static methods which actually convert\n * from OSMD objects to VexFlow objects.\n */\nexport class VexFlowConverter {\n /**\n * Mapping from numbers of alterations on the key signature to major keys\n * @type {[alterationsNo: number]: string; }\n */\n private static majorMap: {[_: number]: string; } = {\n \"-1\": \"F\", \"-2\": \"Bb\", \"-3\": \"Eb\", \"-4\": \"Ab\", \"-5\": \"Db\", \"-6\": \"Gb\", \"-7\": \"Cb\", \"-8\": \"Fb\",\n \"0\": \"C\", \"1\": \"G\", \"2\": \"D\", \"3\": \"A\", \"4\": \"E\", \"5\": \"B\", \"6\": \"F#\", \"7\": \"C#\", \"8\": \"G#\"\n };\n /**\n * Mapping from numbers of alterations on the key signature to minor keys\n * @type {[alterationsNo: number]: string; }\n */\n private static minorMap: {[_: number]: string; } = {\n \"-1\": \"D\", \"-2\": \"G\", \"-3\": \"C\", \"-4\": \"F\", \"-5\": \"Bb\", \"-6\": \"Eb\", \"-7\": \"Ab\", \"-8\": \"Db\",\n \"0\": \"A\", \"1\": \"E\", \"2\": \"B\", \"3\": \"F#\", \"4\": \"C#\", \"5\": \"G#\", \"6\": \"D#\", \"7\": \"A#\", \"8\": \"E#\"\n };\n\n /**\n * Convert a fraction to a string which represents a duration in VexFlow\n * @param fraction a fraction representing the duration of a note\n * @returns {string}\n */\n public static duration(fraction: Fraction, isTuplet: boolean): string {\n const dur: number = fraction.RealValue;\n\n if (dur >= 1) {\n return \"w\";\n } else if (dur < 1 && dur >= 0.5) {\n // change to the next higher straight note to get the correct note display type\n if (isTuplet && dur > 0.5) {\n return \"w\";\n }\n return \"h\";\n } else if (dur < 0.5 && dur >= 0.25) {\n // change to the next higher straight note to get the correct note display type\n if (isTuplet && dur > 0.25) {\n return \"h\";\n }\n return \"q\";\n } else if (dur < 0.25 && dur >= 0.125) {\n // change to the next higher straight note to get the correct note display type\n if (isTuplet && dur > 0.125) {\n return \"q\";\n }\n return \"8\";\n } else if (dur < 0.125 && dur >= 0.0625) {\n // change to the next higher straight note to get the correct note display type\n if (isTuplet && dur > 0.0625) {\n return \"8\";\n }\n return \"16\";\n } else if (dur < 0.0625 && dur >= 0.03125) {\n // change to the next higher straight note to get the correct note display type\n if (isTuplet && dur > 0.03125) {\n return \"16\";\n }\n return \"32\";\n } else if (dur < 0.03125 && dur >= 0.015625) {\n // change to the next higher straight note to get the correct note display type\n if (isTuplet && dur > 0.015625) {\n return \"32\";\n }\n return \"64\";\n }\n\n if (isTuplet) {\n return \"64\";\n }\n return \"128\";\n }\n\n /**\n * Takes a Pitch and returns a string representing a VexFlow pitch,\n * which has the form \"b/4\", plus its alteration (accidental)\n * @param pitch\n * @returns {string[]}\n */\n public static pitch(note: VexFlowGraphicalNote, pitch: Pitch): [string, string, ClefInstruction] {\n const fund: string = NoteEnum[pitch.FundamentalNote].toLowerCase();\n const acc: string = Pitch.accidentalVexflow(pitch.Accidental);\n // The octave seems to need a shift of three FIXME?\n const octave: number = pitch.Octave - note.Clef().OctaveOffset + 3;\n const notehead: Notehead = note.sourceNote.Notehead;\n let noteheadCode: string = \"\";\n if (notehead) {\n noteheadCode = this.NoteHeadCode(notehead);\n }\n return [fund + \"n/\" + octave + noteheadCode, acc, note.Clef()];\n }\n\n /** returns the Vexflow code for a note head. Some are still unsupported, see Vexflow/tables.js */\n public static NoteHeadCode(notehead: Notehead): string {\n const codeStart: string = \"/\";\n const codeFilled: string = notehead.Filled ? \"2\" : \"1\"; // filled/unfilled notehead code in most vexflow glyphs\n switch (notehead.Shape) {\n case NoteHeadShape.NORMAL:\n return \"\";\n case NoteHeadShape.DIAMOND:\n return codeStart + \"D\" + codeFilled;\n case NoteHeadShape.TRIANGLE:\n return codeStart + \"T\" + codeFilled;\n case NoteHeadShape.X:\n return codeStart + \"X\" + codeFilled;\n case NoteHeadShape.CIRCLEX:\n return codeStart + \"X3\";\n case NoteHeadShape.RECTANGLE:\n return codeStart + \"R\" + codeFilled;\n case NoteHeadShape.SQUARE:\n return codeStart + \"S\" + codeFilled;\n case NoteHeadShape.SLASH:\n return \"\"; // slash is specified at end of duration string in Vexflow\n default:\n return \"\";\n }\n }\n\n public static GhostNote(frac: Fraction): Vex.Flow.GhostNote {\n return new Vex.Flow.GhostNote({\n duration: VexFlowConverter.duration(frac, false),\n });\n }\n\n /**\n * Convert a GraphicalVoiceEntry to a VexFlow StaveNote\n * @param gve the GraphicalVoiceEntry which can hold a note or a chord on the staff belonging to one voice\n * @returns {Vex.Flow.StaveNote}\n */\n public static StaveNote(gve: GraphicalVoiceEntry): Vex.Flow.StaveNote {\n // sort notes\n /* seems unnecessary for now\n if (gve.octaveShiftValue !== undefined && gve.octaveShiftValue !== OctaveEnum.NONE) {\n gve.sort(); // gves with accidentals in octave shift brackets can be unsorted\n } */\n // VexFlow needs the notes ordered vertically in the other direction:\n const notes: GraphicalNote[] = gve.notes.reverse();\n const rules: EngravingRules = gve.parentStaffEntry.parentMeasure.parentSourceMeasure.Rules;\n\n const baseNote: GraphicalNote = notes[0];\n let keys: string[] = [];\n const accidentals: string[] = [];\n const frac: Fraction = baseNote.graphicalNoteLength;\n const isTuplet: boolean = baseNote.sourceNote.NoteTuplet !== undefined;\n let duration: string = VexFlowConverter.duration(frac, isTuplet);\n if (baseNote.sourceNote.TypeLength !== undefined && baseNote.sourceNote.TypeLength !== frac) {\n duration = VexFlowConverter.duration(baseNote.sourceNote.TypeLength, isTuplet);\n }\n let vfClefType: string = undefined;\n let numDots: number = baseNote.numberOfDots;\n let alignCenter: boolean = false;\n let xShift: number = 0;\n let slashNoteHead: boolean = false;\n let isRest: boolean = false;\n for (const note of notes) {\n if (numDots < note.numberOfDots) {\n numDots = note.numberOfDots;\n }\n\n // if it is a rest:\n if (note.sourceNote.isRest()) {\n isRest = true;\n keys = [\"b/4\"];\n // TODO do collision checking, place rest e.g. either below staff (A3, for stem direction below voice) or above (C5)\n // if it is a full measure rest:\n if (note.parentVoiceEntry.parentStaffEntry.parentMeasure.parentSourceMeasure.Duration.RealValue <= frac.RealValue) {\n keys = [\"d/5\"];\n duration = \"w\";\n numDots = 0;\n // If it's a whole rest we want it smack in the middle. Apparently there is still an issue in vexflow:\n // https://github.com/0xfe/vexflow/issues/579 The author reports that he needs to add some negative x shift\n // if the measure has no modifiers.\n alignCenter = true;\n xShift = rules.WholeRestXShiftVexflow * unitInPixels; // TODO find way to make dependent on the modifiers\n // affects VexFlowStaffEntry.calculateXPosition()\n }\n if (note.sourceNote.ParentStaff.Voices.length > 1) {\n let visibleVoiceEntries: number = 0;\n //Find all visible voice entries (don't want invisible rests/notes causing visible shift)\n for (let idx: number = 0; idx < note.sourceNote.ParentStaffEntry.VoiceEntries.length ; idx++) {\n if (note.sourceNote.ParentStaffEntry.VoiceEntries[idx].Notes[0].PrintObject) {\n visibleVoiceEntries++;\n }\n }\n //If we have more than one visible voice entry, shift the rests so no collision occurs\n if (visibleVoiceEntries > 1) {\n switch (note.sourceNote.ParentVoiceEntry?.ParentVoice?.VoiceId) {\n case 1:\n keys = [\"e/5\"];\n break;\n case 2:\n keys = [\"f/4\"];\n break;\n default:\n break;\n }\n }\n }\n break;\n }\n\n if (note.sourceNote.Notehead) {\n if (note.sourceNote.Notehead.Shape === NoteHeadShape.SLASH) {\n slashNoteHead = true;\n // if we have slash heads and other heads in the voice entry, this will create the same head for all.\n // same problem with numDots. The slash case should be extremely rare though.\n }\n }\n\n const pitch: [string, string, ClefInstruction] = (note as VexFlowGraphicalNote).vfpitch;\n keys.push(pitch[0]);\n accidentals.push(pitch[1]);\n if (!vfClefType) {\n const vfClef: {type: string, annotation: string} = VexFlowConverter.Clef(pitch[2]);\n vfClefType = vfClef.type;\n }\n }\n\n for (let i: number = 0, len: number = numDots; i < len; ++i) {\n duration += \"d\";\n }\n if (slashNoteHead) {\n duration += \"s\"; // we have to specify a slash note head like this in Vexflow\n }\n if (isRest) {\n // \"r\" has to be put after the \"d\"s for rest notes.\n duration += \"r\";\n }\n\n let vfnote: Vex.Flow.StaveNote;\n\n const vfnoteStruct: any = {\n align_center: alignCenter,\n auto_stem: true,\n clef: vfClefType,\n duration: duration,\n keys: keys,\n slash: gve.parentVoiceEntry.GraceNoteSlash,\n };\n\n const firstNote: Note = gve.notes[0].sourceNote;\n if (firstNote.IsCueNote) {\n vfnoteStruct.glyph_font_scale = Vex.Flow.DEFAULT_NOTATION_FONT_SCALE * Vex.Flow.GraceNote.SCALE;\n vfnoteStruct.stroke_px = Vex.Flow.GraceNote.LEDGER_LINE_OFFSET;\n }\n\n if (gve.parentVoiceEntry.IsGrace || gve.notes[0].sourceNote.IsCueNote) {\n vfnote = new Vex.Flow.GraceNote(vfnoteStruct);\n } else {\n vfnote = new Vex.Flow.StaveNote(vfnoteStruct);\n }\n if (rules.LedgerLineWidth || rules.LedgerLineStrokeStyle) {\n if (!((vfnote as any).ledgerLineStyle)) {\n (vfnote as any).ledgerLineStyle = {};\n }\n if (rules.LedgerLineWidth) {\n (vfnote as any).ledgerLineStyle.lineWidth = rules.LedgerLineWidth;\n }\n if (rules.LedgerLineStrokeStyle) {\n (vfnote as any).ledgerLineStyle.strokeStyle = rules.LedgerLineStrokeStyle;\n }\n }\n\n if (rules.ColoringEnabled) {\n const defaultColorStem: string = rules.DefaultColorStem;\n let stemColor: string = gve.parentVoiceEntry.StemColor;\n if (!stemColor && defaultColorStem) {\n stemColor = defaultColorStem;\n }\n const stemStyle: Object = { fillStyle: stemColor, strokeStyle: stemColor };\n\n if (stemColor) {\n gve.parentVoiceEntry.StemColor = stemColor;\n vfnote.setStemStyle(stemStyle);\n if (vfnote.flag && rules.ColorFlags) {\n vfnote.setFlagStyle(stemStyle);\n }\n }\n }\n\n vfnote.x_shift = xShift;\n\n if (gve.parentVoiceEntry.IsGrace && gve.notes[0].sourceNote.NoteBeam) {\n // Vexflow seems to have issues with wanted stem direction for beamed grace notes,\n // when the stem is connected to a beamed main note (e.g. Haydn Concertante bar 57)\n gve.parentVoiceEntry.WantedStemDirection = gve.notes[0].sourceNote.NoteBeam.Notes[0].ParentVoiceEntry.WantedStemDirection;\n }\n if (gve.parentVoiceEntry) {\n const wantedStemDirection: StemDirectionType = gve.parentVoiceEntry.WantedStemDirection;\n switch (wantedStemDirection) {\n case(StemDirectionType.Up):\n vfnote.setStemDirection(Vex.Flow.Stem.UP);\n break;\n case (StemDirectionType.Down):\n vfnote.setStemDirection(Vex.Flow.Stem.DOWN);\n break;\n default:\n }\n }\n\n // add accidentals\n for (let i: number = 0, len: number = notes.length; i < len; i += 1) {\n (notes[i] as VexFlowGraphicalNote).setIndex(vfnote, i);\n if (accidentals[i]) {\n if (accidentals[i] === \"++\") { // triple sharp\n vfnote.addAccidental(i, new Vex.Flow.Accidental(\"##\"));\n vfnote.addAccidental(i, new Vex.Flow.Accidental(\"#\"));\n continue;\n } else if (accidentals[i] === \"bbs\") { // triple flat\n vfnote.addAccidental(i, new Vex.Flow.Accidental(\"bb\"));\n vfnote.addAccidental(i, new Vex.Flow.Accidental(\"b\"));\n continue;\n }\n vfnote.addAccidental(i, new Vex.Flow.Accidental(accidentals[i])); // normal accidental\n }\n\n // add Tremolo strokes (only single note tremolos for now, Vexflow doesn't have beams for two-note tremolos yet)\n const tremoloStrokes: number = notes[i].sourceNote.TremoloStrokes;\n if (tremoloStrokes > 0) {\n vfnote.addModifier(i, new Vex.Flow.Tremolo(tremoloStrokes));\n }\n }\n\n // half note tremolo: set notehead to half note (Vexflow otherwise takes the notehead from duration) (Hack)\n if (firstNote.Length.RealValue === 0.25 && firstNote.Notehead && firstNote.Notehead.Filled === false) {\n const keyProps: Object[] = vfnote.getKeyProps();\n for (let i: number = 0; i < keyProps.length; i++) {\n (keyProps[i]).code = \"v81\";\n }\n }\n\n for (let i: number = 0, len: number = numDots; i < len; ++i) {\n vfnote.addDotToAll();\n }\n return vfnote;\n }\n\n public static generateArticulations(vfnote: Vex.Flow.StemmableNote, articulations: ArticulationEnum[]): void {\n if (!vfnote || vfnote.getAttribute(\"type\") === \"GhostNote\") {\n return;\n }\n // Articulations:\n let vfArtPosition: number = Vex.Flow.Modifier.Position.ABOVE;\n\n if (vfnote.getStemDirection() === Vex.Flow.Stem.UP) {\n vfArtPosition = Vex.Flow.Modifier.Position.BELOW;\n }\n\n for (const articulation of articulations) {\n // tslint:disable-next-line:switch-default\n let vfArt: Vex.Flow.Articulation = undefined;\n switch (articulation) {\n case ArticulationEnum.accent: {\n vfArt = new Vex.Flow.Articulation(\"a>\");\n break;\n }\n case ArticulationEnum.downbow: {\n vfArt = new Vex.Flow.Articulation(\"am\");\n break;\n }\n case ArticulationEnum.fermata: {\n vfArt = new Vex.Flow.Articulation(\"a@a\");\n vfArtPosition = Vex.Flow.Modifier.Position.ABOVE;\n break;\n }\n case ArticulationEnum.invertedfermata: {\n vfArt = new Vex.Flow.Articulation(\"a@u\");\n vfArtPosition = Vex.Flow.Modifier.Position.BELOW;\n break;\n }\n case ArticulationEnum.lefthandpizzicato: {\n vfArt = new Vex.Flow.Articulation(\"a+\");\n break;\n }\n case ArticulationEnum.snappizzicato: {\n vfArt = new Vex.Flow.Articulation(\"ao\");\n break;\n }\n case ArticulationEnum.staccatissimo: {\n vfArt = new Vex.Flow.Articulation(\"av\");\n break;\n }\n case ArticulationEnum.staccato: {\n vfArt = new Vex.Flow.Articulation(\"a.\");\n break;\n }\n case ArticulationEnum.tenuto: {\n vfArt = new Vex.Flow.Articulation(\"a-\");\n break;\n }\n case ArticulationEnum.upbow: {\n vfArt = new Vex.Flow.Articulation(\"a|\");\n break;\n }\n case ArticulationEnum.strongaccent: {\n vfArt = new Vex.Flow.Articulation(\"a^\");\n break;\n }\n default: {\n break;\n }\n }\n if (vfArt) {\n vfArt.setPosition(vfArtPosition);\n (vfnote as StaveNote).addModifier(0, vfArt);\n }\n }\n }\n\n public static generateOrnaments(vfnote: Vex.Flow.StemmableNote, oContainer: OrnamentContainer): void {\n let vfPosition: number = Vex.Flow.Modifier.Position.ABOVE;\n if (vfnote.getStemDirection() === Vex.Flow.Stem.UP) {\n vfPosition = Vex.Flow.Modifier.Position.BELOW;\n }\n\n let vfOrna: Vex.Flow.Ornament = undefined;\n switch (oContainer.GetOrnament) {\n case OrnamentEnum.DelayedInvertedTurn: {\n vfOrna = new Vex.Flow.Ornament(\"turn_inverted\");\n vfOrna.setDelayed(true);\n break;\n }\n case OrnamentEnum.DelayedTurn: {\n vfOrna = new Vex.Flow.Ornament(\"turn\");\n vfOrna.setDelayed(true);\n break;\n }\n case OrnamentEnum.InvertedMordent: {\n vfOrna = new Vex.Flow.Ornament(\"mordent_inverted\");\n vfOrna.setDelayed(false);\n break;\n }\n case OrnamentEnum.InvertedTurn: {\n vfOrna = new Vex.Flow.Ornament(\"turn_inverted\");\n vfOrna.setDelayed(false);\n break;\n }\n case OrnamentEnum.Mordent: {\n vfOrna = new Vex.Flow.Ornament(\"mordent\");\n vfOrna.setDelayed(false);\n break;\n }\n case OrnamentEnum.Trill: {\n vfOrna = new Vex.Flow.Ornament(\"tr\");\n vfOrna.setDelayed(false);\n break;\n }\n case OrnamentEnum.Turn: {\n vfOrna = new Vex.Flow.Ornament(\"turn\");\n vfOrna.setDelayed(false);\n break;\n }\n default: {\n log.warn(\"unhandled OrnamentEnum type: \" + oContainer.GetOrnament);\n return;\n }\n }\n if (vfOrna) {\n if (oContainer.AccidentalBelow !== AccidentalEnum.NONE) {\n vfOrna.setLowerAccidental(Pitch.accidentalVexflow(oContainer.AccidentalBelow));\n }\n if (oContainer.AccidentalAbove !== AccidentalEnum.NONE) {\n vfOrna.setUpperAccidental(Pitch.accidentalVexflow(oContainer.AccidentalAbove));\n }\n vfOrna.setPosition(vfPosition);\n (vfnote as StaveNote).addModifier(0, vfOrna);\n }\n }\n\n public static StrokeTypeFromArpeggioType(arpeggioType: ArpeggioType): Vex.Flow.Stroke.Type {\n switch (arpeggioType) {\n case ArpeggioType.ARPEGGIO_DIRECTIONLESS:\n return Vex.Flow.Stroke.Type.ARPEGGIO_DIRECTIONLESS;\n case ArpeggioType.BRUSH_DOWN:\n return Vex.Flow.Stroke.Type.BRUSH_UP; // TODO somehow up and down are mixed up in Vexflow right now\n case ArpeggioType.BRUSH_UP:\n return Vex.Flow.Stroke.Type.BRUSH_DOWN; // TODO somehow up and down are mixed up in Vexflow right now\n case ArpeggioType.RASQUEDO_DOWN:\n return Vex.Flow.Stroke.Type.RASQUEDO_UP;\n case ArpeggioType.RASQUEDO_UP:\n return Vex.Flow.Stroke.Type.RASQUEDO_DOWN;\n case ArpeggioType.ROLL_DOWN:\n return Vex.Flow.Stroke.Type.ROLL_UP; // TODO somehow up and down are mixed up in Vexflow right now\n case ArpeggioType.ROLL_UP:\n return Vex.Flow.Stroke.Type.ROLL_DOWN; // TODO somehow up and down are mixed up in Vexflow right now\n default:\n return Vex.Flow.Stroke.Type.ARPEGGIO_DIRECTIONLESS;\n }\n }\n\n /**\n * Convert a set of GraphicalNotes to a VexFlow StaveNote\n * @param notes form a chord on the staff\n * @returns {Vex.Flow.StaveNote}\n */\n public static CreateTabNote(gve: GraphicalVoiceEntry): Vex.Flow.TabNote {\n const tabPositions: {str: number, fret: number}[] = [];\n const frac: Fraction = gve.notes[0].graphicalNoteLength;\n const isTuplet: boolean = gve.notes[0].sourceNote.NoteTuplet !== undefined;\n let duration: string = VexFlowConverter.duration(frac, isTuplet);\n let numDots: number = 0;\n for (const note of gve.notes) {\n const tabNote: TabNote = note.sourceNote as TabNote;\n const tabPosition: {str: number, fret: number} = {str: tabNote.StringNumber, fret: tabNote.FretNumber};\n tabPositions.push(tabPosition);\n\n if (numDots < note.numberOfDots) {\n numDots = note.numberOfDots;\n }\n }\n for (let i: number = 0, len: number = numDots; i < len; ++i) {\n duration += \"d\";\n }\n const vfnote: Vex.Flow.TabNote = new Vex.Flow.TabNote({\n duration: duration,\n positions: tabPositions,\n });\n\n return vfnote;\n }\n\n /**\n * Convert a ClefInstruction to a string represention of a clef type in VexFlow.\n *\n * @param clef The OSMD object to be converted representing the clef\n * @param size The VexFlow size to be used. Can be `default` or `small`. As soon as\n * #118 is done, this parameter will be dispensable.\n * @returns A string representation of a VexFlow clef\n * @see https://github.com/0xfe/vexflow/blob/master/src/clef.js\n * @see https://github.com/0xfe/vexflow/blob/master/tests/clef_tests.js\n */\n public static Clef(clef: ClefInstruction, size: string = \"default\"): { type: string, size: string, annotation: string } {\n let type: string;\n let annotation: string;\n\n // Make sure size is either \"default\" or \"small\"\n if (size !== \"default\" && size !== \"small\") {\n log.warn(`Invalid VexFlow clef size \"${size}\" specified. Using \"default\".`);\n size = \"default\";\n }\n\n /*\n * For all of the following conversions, OSMD uses line numbers 1-5 starting from\n * the bottom, while VexFlow uses 0-4 starting from the top.\n */\n switch (clef.ClefType) {\n\n // G Clef\n case ClefEnum.G:\n switch (clef.Line) {\n case 1:\n type = \"french\"; // VexFlow line 4\n break;\n case 2:\n type = \"treble\"; // VexFlow line 3\n break;\n default:\n type = \"treble\";\n log.error(`Clef ${ClefEnum[clef.ClefType]} on line ${clef.Line} not supported by VexFlow. Using default value \"${type}\".`);\n }\n break;\n\n // F Clef\n case ClefEnum.F:\n switch (clef.Line) {\n case 4:\n type = \"bass\"; // VexFlow line 1\n break;\n case 3:\n type = \"baritone-f\"; // VexFlow line 2\n break;\n case 5:\n type = \"subbass\"; // VexFlow line 0\n break;\n default:\n type = \"bass\";\n log.error(`Clef ${ClefEnum[clef.ClefType]} on line ${clef.Line} not supported by VexFlow. Using default value \"${type}\".`);\n }\n break;\n\n // C Clef\n case ClefEnum.C:\n switch (clef.Line) {\n case 3:\n type = \"alto\"; // VexFlow line 2\n break;\n case 4:\n type = \"tenor\"; // VexFlow line 1\n break;\n case 1:\n type = \"soprano\"; // VexFlow line 4\n break;\n case 2:\n type = \"mezzo-soprano\"; // VexFlow line 3\n break;\n default:\n type = \"alto\";\n log.error(`Clef ${ClefEnum[clef.ClefType]} on line ${clef.Line} not supported by VexFlow. Using default value \"${type}\".`);\n }\n break;\n\n // Percussion Clef\n case ClefEnum.percussion:\n type = \"percussion\";\n break;\n\n // TAB Clef\n case ClefEnum.TAB:\n // only used currently for creating the notes in the normal stave: There we need a normal treble clef\n type = \"treble\";\n break;\n default:\n }\n\n // annotations in vexflow don't allow bass and 8va. No matter the offset :(\n if (clef.OctaveOffset === 1 && type !== \"bass\" ) {\n annotation = \"8va\";\n } else if (clef.OctaveOffset === -1) {\n annotation = \"8vb\";\n }\n return { type, size, annotation };\n }\n\n /**\n * Convert a RhythmInstruction to a VexFlow TimeSignature object\n * @param rhythm\n * @returns {Vex.Flow.TimeSignature}\n * @constructor\n */\n public static TimeSignature(rhythm: RhythmInstruction): Vex.Flow.TimeSignature {\n let timeSpec: string;\n switch (rhythm.SymbolEnum) {\n case RhythmSymbolEnum.NONE:\n timeSpec = rhythm.Rhythm.Numerator + \"/\" + rhythm.Rhythm.Denominator;\n break;\n case RhythmSymbolEnum.COMMON:\n timeSpec = \"C\";\n break;\n case RhythmSymbolEnum.CUT:\n timeSpec = \"C|\";\n break;\n default:\n }\n return new Vex.Flow.TimeSignature(timeSpec);\n }\n\n /**\n * Convert a KeyInstruction to a string representing in VexFlow a key\n * @param key\n * @returns {string}\n */\n public static keySignature(key: KeyInstruction): string {\n if (!key) {\n return undefined;\n }\n let ret: string;\n switch (key.Mode) {\n case KeyEnum.minor:\n ret = VexFlowConverter.minorMap[key.Key] + \"m\";\n break;\n case KeyEnum.major:\n ret = VexFlowConverter.majorMap[key.Key];\n break;\n // some XMLs don't have the mode set despite having a key signature.\n case KeyEnum.none:\n ret = VexFlowConverter.majorMap[key.Key];\n break;\n default:\n ret = \"C\";\n }\n return ret;\n }\n\n /**\n * Converts a lineType to a VexFlow StaveConnector type\n * @param lineType\n * @returns {any}\n */\n public static line(lineType: SystemLinesEnum, linePosition: SystemLinePosition): any {\n switch (lineType) {\n case SystemLinesEnum.SingleThin:\n if (linePosition === SystemLinePosition.MeasureBegin) {\n return Vex.Flow.StaveConnector.type.SINGLE;\n }\n return Vex.Flow.StaveConnector.type.SINGLE_RIGHT;\n case SystemLinesEnum.DoubleThin:\n return Vex.Flow.StaveConnector.type.DOUBLE;\n case SystemLinesEnum.ThinBold:\n return Vex.Flow.StaveConnector.type.BOLD_DOUBLE_RIGHT;\n case SystemLinesEnum.BoldThinDots:\n return Vex.Flow.StaveConnector.type.BOLD_DOUBLE_LEFT;\n case SystemLinesEnum.DotsThinBold:\n return Vex.Flow.StaveConnector.type.BOLD_DOUBLE_RIGHT;\n case SystemLinesEnum.DotsBoldBoldDots:\n return Vex.Flow.StaveConnector.type.BOLD_DOUBLE_RIGHT;\n case SystemLinesEnum.None:\n return Vex.Flow.StaveConnector.type.NONE;\n default:\n }\n }\n\n /**\n * Construct a string which can be used in a CSS font property\n * @param fontSize\n * @param fontStyle\n * @param font\n * @returns {string}\n */\n public static font(fontSize: number, fontStyle: FontStyles = FontStyles.Regular,\n font: Fonts = Fonts.TimesNewRoman, rules: EngravingRules, fontFamily: string = undefined): string {\n let style: string = \"normal\";\n let weight: string = \"normal\";\n let family: string = `'${rules.DefaultFontFamily}'`; // default \"'Times New Roman'\"\n\n switch (fontStyle) {\n case FontStyles.Bold:\n weight = \"bold\";\n break;\n case FontStyles.Italic:\n style = \"italic\";\n break;\n case FontStyles.BoldItalic:\n style = \"italic\";\n weight = \"bold\";\n break;\n case FontStyles.Underlined:\n // TODO\n break;\n default:\n break;\n }\n\n switch (font) { // currently not used\n case Fonts.Kokila:\n // TODO Not Supported\n break;\n default:\n }\n\n if (fontFamily && fontFamily !== \"default\") {\n family = `'${fontFamily}'`;\n }\n\n return style + \" \" + weight + \" \" + Math.floor(fontSize) + \"px \" + family;\n }\n\n /**\n * Converts the style into a string that VexFlow RenderContext can understand\n * as the weight of the font\n */\n public static fontStyle(style: FontStyles): string {\n switch (style) {\n case FontStyles.Bold:\n return \"bold\";\n case FontStyles.Italic:\n return \"italic\";\n case FontStyles.BoldItalic:\n return \"italic bold\";\n default:\n return \"normal\";\n }\n }\n\n /**\n * Convert OutlineAndFillStyle to CSS properties\n * @param styleId\n * @returns {string}\n */\n public static style(styleId: OutlineAndFillStyleEnum): string {\n const ret: string = OUTLINE_AND_FILL_STYLE_DICT.getValue(styleId);\n return ret;\n }\n}\n\n\n","import Vex from \"vexflow\";\nimport { MusicSheetDrawer } from \"../MusicSheetDrawer\";\nimport { RectangleF2D } from \"../../../Common/DataObjects/RectangleF2D\";\nimport { VexFlowMeasure } from \"./VexFlowMeasure\";\nimport { PointF2D } from \"../../../Common/DataObjects/PointF2D\";\nimport { GraphicalLabel } from \"../GraphicalLabel\";\nimport { VexFlowTextMeasurer } from \"./VexFlowTextMeasurer\";\nimport { MusicSystem } from \"../MusicSystem\";\nimport { GraphicalObject } from \"../GraphicalObject\";\nimport { GraphicalLayers } from \"../DrawingEnums\";\nimport { GraphicalStaffEntry } from \"../GraphicalStaffEntry\";\nimport { VexFlowBackend } from \"./VexFlowBackend\";\nimport { VexFlowOctaveShift } from \"./VexFlowOctaveShift\";\nimport { VexFlowInstantaneousDynamicExpression } from \"./VexFlowInstantaneousDynamicExpression\";\nimport { VexFlowInstrumentBracket } from \"./VexFlowInstrumentBracket\";\nimport { VexFlowInstrumentBrace } from \"./VexFlowInstrumentBrace\";\nimport { GraphicalLyricEntry } from \"../GraphicalLyricEntry\";\nimport { VexFlowStaffLine } from \"./VexFlowStaffLine\";\nimport { StaffLine } from \"../StaffLine\";\nimport { GraphicalSlur } from \"../GraphicalSlur\";\nimport { PlacementEnum } from \"../../VoiceData/Expressions/AbstractExpression\";\nimport { GraphicalInstantaneousTempoExpression } from \"../GraphicalInstantaneousTempoExpression\";\nimport { GraphicalInstantaneousDynamicExpression } from \"../GraphicalInstantaneousDynamicExpression\";\nimport log = require(\"loglevel\");\nimport { GraphicalContinuousDynamicExpression } from \"../GraphicalContinuousDynamicExpression\";\nimport { VexFlowContinuousDynamicExpression } from \"./VexFlowContinuousDynamicExpression\";\nimport { DrawingParameters } from \"../DrawingParameters\";\nimport { GraphicalMusicPage } from \"../GraphicalMusicPage\";\nimport { GraphicalMusicSheet } from \"../GraphicalMusicSheet\";\nimport { GraphicalUnknownExpression } from \"../GraphicalUnknownExpression\";\n\n/**\n * This is a global constant which denotes the height in pixels of the space between two lines of the stave\n * (when zoom = 1.0)\n * @type number\n */\nexport const unitInPixels: number = 10;\n\nexport class VexFlowMusicSheetDrawer extends MusicSheetDrawer {\n private backend: VexFlowBackend;\n private backends: VexFlowBackend[] = [];\n private zoom: number = 1.0;\n private pageIdx: number = 0; // this is a bad solution, should use MusicPage.PageNumber instead.\n\n constructor(drawingParameters: DrawingParameters = new DrawingParameters()) {\n super(new VexFlowTextMeasurer(drawingParameters.Rules), drawingParameters);\n }\n\n public get Backends(): VexFlowBackend[] {\n return this.backends;\n }\n\n public drawSheet(graphicalMusicSheet: GraphicalMusicSheet): void {\n this.pageIdx = 0;\n for (const graphicalMusicPage of graphicalMusicSheet.MusicPages) {\n const backend: VexFlowBackend = this.backends[this.pageIdx];\n backend.graphicalMusicPage = graphicalMusicPage;\n backend.scale(this.zoom);\n //backend.resize(graphicalMusicSheet.ParentMusicSheet.pageWidth * unitInPixels * this.zoom,\n // EngravingRules.Rules.PageHeight * unitInPixels * this.zoom);\n this.pageIdx += 1;\n }\n\n this.pageIdx = 0;\n this.backend = this.backends[0];\n super.drawSheet(graphicalMusicSheet);\n }\n\n protected drawPage(page: GraphicalMusicPage): void {\n this.backend = this.backends[page.PageNumber - 1]; // TODO we may need to set this in a couple of other places. this.pageIdx is a bad solution\n super.drawPage(page);\n this.pageIdx += 1;\n this.backend = this.backends[this.pageIdx];\n }\n\n public clear(): void {\n for (const backend of this.backends) {\n backend.clear();\n }\n }\n\n public setZoom(zoom: number): void {\n this.zoom = zoom;\n }\n\n /**\n * Converts a distance from unit to pixel space.\n * @param unitDistance the distance in units\n * @returns {number} the distance in pixels\n */\n public calculatePixelDistance(unitDistance: number): number {\n return unitDistance * unitInPixels;\n }\n\n protected drawStaffLine(staffLine: StaffLine): void {\n super.drawStaffLine(staffLine);\n const absolutePos: PointF2D = staffLine.PositionAndShape.AbsolutePosition;\n if (this.rules.RenderSlurs) {\n this.drawSlurs(staffLine as VexFlowStaffLine, absolutePos);\n }\n }\n\n private drawSlurs(vfstaffLine: VexFlowStaffLine, absolutePos: PointF2D): void {\n for (const graphicalSlur of vfstaffLine.GraphicalSlurs) {\n // don't draw crossed slurs, as their curve calculation is not implemented yet:\n if (graphicalSlur.slur.isCrossed()) {\n continue;\n }\n this.drawSlur(graphicalSlur, absolutePos);\n }\n }\n\n private drawSlur(graphicalSlur: GraphicalSlur, abs: PointF2D): void {\n const curvePointsInPixels: PointF2D[] = [];\n // 1) create inner or original curve:\n const p1: PointF2D = new PointF2D(graphicalSlur.bezierStartPt.x + abs.x, graphicalSlur.bezierStartPt.y + abs.y);\n const p2: PointF2D = new PointF2D(graphicalSlur.bezierStartControlPt.x + abs.x, graphicalSlur.bezierStartControlPt.y + abs.y);\n const p3: PointF2D = new PointF2D(graphicalSlur.bezierEndControlPt.x + abs.x, graphicalSlur.bezierEndControlPt.y + abs.y);\n const p4: PointF2D = new PointF2D(graphicalSlur.bezierEndPt.x + abs.x, graphicalSlur.bezierEndPt.y + abs.y);\n\n // put screen transformed points into array\n curvePointsInPixels.push(this.applyScreenTransformation(p1));\n curvePointsInPixels.push(this.applyScreenTransformation(p2));\n curvePointsInPixels.push(this.applyScreenTransformation(p3));\n curvePointsInPixels.push(this.applyScreenTransformation(p4));\n\n // 2) create second outer curve to create a thickness for the curve:\n if (graphicalSlur.placement === PlacementEnum.Above) {\n p1.y -= 0.05;\n p2.y -= 0.3;\n p3.y -= 0.3;\n p4.y -= 0.05;\n } else {\n p1.y += 0.05;\n p2.y += 0.3;\n p3.y += 0.3;\n p4.y += 0.05;\n }\n\n // put screen transformed points into array\n curvePointsInPixels.push(this.applyScreenTransformation(p1));\n curvePointsInPixels.push(this.applyScreenTransformation(p2));\n curvePointsInPixels.push(this.applyScreenTransformation(p3));\n curvePointsInPixels.push(this.applyScreenTransformation(p4));\n this.backend.renderCurve(curvePointsInPixels);\n }\n\n protected drawMeasure(measure: VexFlowMeasure): void {\n measure.setAbsoluteCoordinates(\n measure.PositionAndShape.AbsolutePosition.x * unitInPixels,\n measure.PositionAndShape.AbsolutePosition.y * unitInPixels\n );\n try {\n measure.draw(this.backend.getContext());\n // Vexflow errors can happen here. If we don't catch errors, rendering will stop after this measure.\n } catch (ex) {\n log.warn(\"VexFlowMusicSheetDrawer.drawMeasure\", ex);\n }\n\n // Draw the StaffEntries\n for (const staffEntry of measure.staffEntries) {\n this.drawStaffEntry(staffEntry);\n }\n }\n\n // private drawPixel(coord: PointF2D): void {\n // coord = this.applyScreenTransformation(coord);\n // const ctx: any = this.backend.getContext();\n // const oldStyle: string = ctx.fillStyle;\n // ctx.fillStyle = \"#00FF00FF\";\n // ctx.fillRect( coord.x, coord.y, 2, 2 );\n // ctx.fillStyle = oldStyle;\n // }\n\n /** Draws a line in the current backend. Only usable while pages are drawn sequentially, because backend reference is updated in that process.\n * To add your own lines after rendering, use DrawOverlayLine.\n */\n protected drawLine(start: PointF2D, stop: PointF2D, color: string = \"#FF0000FF\", lineWidth: number = 0.2): void {\n // TODO maybe the backend should be given as an argument here as well, otherwise this can't be used after rendering of multiple pages is done.\n start = this.applyScreenTransformation(start);\n stop = this.applyScreenTransformation(stop);\n /*if (!this.backend) {\n this.backend = this.backends[0];\n }*/\n this.backend.renderLine(start, stop, color, lineWidth * unitInPixels);\n }\n\n /** Lets a user/developer draw an overlay line on the score. Use this instead of drawLine, which is for OSMD internally only.\n * The MusicPage has to be specified, because each page and Vexflow backend has its own relative coordinates.\n * (the AbsolutePosition of a GraphicalNote is relative to its backend)\n * To get a MusicPage, use GraphicalNote.ParentMusicPage.\n */\n public DrawOverlayLine(start: PointF2D, stop: PointF2D, musicPage: GraphicalMusicPage,\n color: string = \"#FF0000FF\", lineWidth: number = 0.2): void {\n if (!musicPage.PageNumber || musicPage.PageNumber > this.backends.length || musicPage.PageNumber < 1) {\n console.log(\"VexFlowMusicSheetDrawer.drawOverlayLine: invalid page number / music page number doesn't correspond to an existing backend.\");\n return;\n }\n const musicPageIndex: number = musicPage.PageNumber - 1;\n const backendToUse: VexFlowBackend = this.backends[musicPageIndex];\n\n start = this.applyScreenTransformation(start);\n stop = this.applyScreenTransformation(stop);\n backendToUse.renderLine(start, stop, color, lineWidth * unitInPixels);\n }\n\n protected drawSkyLine(staffline: StaffLine): void {\n const startPosition: PointF2D = staffline.PositionAndShape.AbsolutePosition;\n const width: number = staffline.PositionAndShape.Size.width;\n this.drawSampledLine(staffline.SkyLine, startPosition, width);\n }\n\n protected drawBottomLine(staffline: StaffLine): void {\n const startPosition: PointF2D = new PointF2D(staffline.PositionAndShape.AbsolutePosition.x,\n staffline.PositionAndShape.AbsolutePosition.y);\n const width: number = staffline.PositionAndShape.Size.width;\n this.drawSampledLine(staffline.BottomLine, startPosition, width, \"#0000FFFF\");\n }\n\n /**\n * Draw a line with a width and start point in a chosen color (used for skyline/bottom line debugging) from\n * a simple array\n * @param line numeric array. 0 marks the base line. Direction given by sign. Dimensions in units\n * @param startPosition Start position in units\n * @param width Max line width in units\n * @param color Color to paint in. Default is red\n */\n private drawSampledLine(line: number[], startPosition: PointF2D, width: number, color: string = \"#FF0000FF\"): void {\n const indices: number[] = [];\n let currentValue: number = 0;\n //Loops through bottom line, grabs all indices that don't equal the previously grabbed index\n //Starting with 0 (gets index of all line changes)\n for (let i: number = 0; i < line.length; i++) {\n if (line[i] !== currentValue) {\n indices.push(i);\n currentValue = line[i];\n }\n }\n\n const absolute: PointF2D = startPosition;\n if (indices.length > 0) {\n const samplingUnit: number = this.rules.SamplingUnit;\n\n let horizontalStart: PointF2D = new PointF2D(absolute.x, absolute.y);\n let horizontalEnd: PointF2D = new PointF2D(indices[0] / samplingUnit + absolute.x, absolute.y);\n this.drawLine(horizontalStart, horizontalEnd, color);\n\n let verticalStart: PointF2D;\n let verticalEnd: PointF2D;\n\n if (line[0] >= 0) {\n verticalStart = new PointF2D(indices[0] / samplingUnit + absolute.x, absolute.y);\n verticalEnd = new PointF2D(indices[0] / samplingUnit + absolute.x, absolute.y + line[indices[0]]);\n this.drawLine(verticalStart, verticalEnd, color);\n }\n\n for (let i: number = 1; i < indices.length; i++) {\n horizontalStart = new PointF2D(indices[i - 1] / samplingUnit + absolute.x, absolute.y + line[indices[i - 1]]);\n horizontalEnd = new PointF2D(indices[i] / samplingUnit + absolute.x, absolute.y + line[indices[i - 1]]);\n this.drawLine(horizontalStart, horizontalEnd, color);\n\n verticalStart = new PointF2D(indices[i] / samplingUnit + absolute.x, absolute.y + line[indices[i - 1]]);\n verticalEnd = new PointF2D(indices[i] / samplingUnit + absolute.x, absolute.y + line[indices[i]]);\n this.drawLine(verticalStart, verticalEnd, color);\n }\n\n if (indices[indices.length - 1] < line.length) {\n horizontalStart = new PointF2D(indices[indices.length - 1] / samplingUnit + absolute.x, absolute.y + line[indices[indices.length - 1]]);\n horizontalEnd = new PointF2D(absolute.x + width, absolute.y + line[indices[indices.length - 1]]);\n this.drawLine(horizontalStart, horizontalEnd, color);\n } else {\n horizontalStart = new PointF2D(indices[indices.length - 1] / samplingUnit + absolute.x, absolute.y);\n horizontalEnd = new PointF2D(absolute.x + width, absolute.y);\n this.drawLine(horizontalStart, horizontalEnd, color);\n }\n } else {\n // Flat line\n const start: PointF2D = new PointF2D(absolute.x, absolute.y);\n const end: PointF2D = new PointF2D(absolute.x + width, absolute.y);\n this.drawLine(start, end, color);\n }\n }\n\n\n\n private drawStaffEntry(staffEntry: GraphicalStaffEntry): void {\n // Draw ChordSymbols\n if (staffEntry.graphicalChordContainers !== undefined && staffEntry.graphicalChordContainers.length > 0) {\n for (const graphicalChordContainer of staffEntry.graphicalChordContainers) {\n this.drawLabel(graphicalChordContainer.GetGraphicalLabel, GraphicalLayers.Notes);\n }\n }\n if (this.rules.RenderLyrics) {\n if (staffEntry.LyricsEntries.length > 0) {\n this.drawLyrics(staffEntry.LyricsEntries, GraphicalLayers.Notes);\n }\n }\n }\n\n /**\n * Draw all lyrics to the canvas\n * @param lyricEntries Array of lyric entries to be drawn\n * @param layer Number of the layer that the lyrics should be drawn in\n */\n private drawLyrics(lyricEntries: GraphicalLyricEntry[], layer: number): void {\n lyricEntries.forEach(lyricsEntry => this.drawLabel(lyricsEntry.GraphicalLabel, layer));\n }\n\n protected drawInstrumentBrace(brace: GraphicalObject, system: MusicSystem): void {\n // Draw InstrumentBrackets at beginning of line\n const vexBrace: VexFlowInstrumentBrace = (brace as VexFlowInstrumentBrace);\n vexBrace.draw(this.backend.getContext());\n }\n\n protected drawGroupBracket(bracket: GraphicalObject, system: MusicSystem): void {\n // Draw InstrumentBrackets at beginning of line\n const vexBrace: VexFlowInstrumentBracket = (bracket as VexFlowInstrumentBracket);\n vexBrace.draw(this.backend.getContext());\n }\n\n protected drawOctaveShifts(staffLine: StaffLine): void {\n for (const graphicalOctaveShift of staffLine.OctaveShifts) {\n if (graphicalOctaveShift) {\n const vexFlowOctaveShift: VexFlowOctaveShift = graphicalOctaveShift as VexFlowOctaveShift;\n const ctx: Vex.IRenderContext = this.backend.getContext();\n const textBracket: Vex.Flow.TextBracket = vexFlowOctaveShift.getTextBracket();\n textBracket.setContext(ctx);\n textBracket.draw();\n }\n }\n }\n\n protected drawExpressions(staffline: StaffLine): void {\n // Draw all Expressions\n for (const abstractGraphicalExpression of staffline.AbstractExpressions) {\n // Draw InstantaniousDynamics\n if (abstractGraphicalExpression instanceof GraphicalInstantaneousDynamicExpression) {\n this.drawInstantaneousDynamic((abstractGraphicalExpression as VexFlowInstantaneousDynamicExpression));\n // Draw InstantaniousTempo\n } else if (abstractGraphicalExpression instanceof GraphicalInstantaneousTempoExpression) {\n this.drawLabel((abstractGraphicalExpression as GraphicalInstantaneousTempoExpression).GraphicalLabel, GraphicalLayers.Notes);\n // Draw ContinuousDynamics\n } else if (abstractGraphicalExpression instanceof GraphicalContinuousDynamicExpression) {\n this.drawContinuousDynamic((abstractGraphicalExpression as VexFlowContinuousDynamicExpression));\n // Draw ContinuousTempo\n // } else if (abstractGraphicalExpression instanceof GraphicalContinuousTempoExpression) {\n // this.drawLabel((abstractGraphicalExpression as GraphicalContinuousTempoExpression).GraphicalLabel, GraphicalLayers.Notes);\n // // Draw Mood\n // } else if (abstractGraphicalExpression instanceof GraphicalMoodExpression) {\n // GraphicalMoodExpression; graphicalMood = (GraphicalMoodExpression); abstractGraphicalExpression;\n // drawLabel(graphicalMood.GetGraphicalLabel, GraphicalLayers.Notes);\n // Draw Unknown\n } else if (abstractGraphicalExpression instanceof GraphicalUnknownExpression) {\n this.drawLabel(abstractGraphicalExpression.Label, GraphicalLayers.Notes);\n } else {\n log.warn(\"Unkown type of expression!\");\n }\n }\n }\n\n protected drawInstantaneousDynamic(instantaneousDynamic: GraphicalInstantaneousDynamicExpression): void {\n this.drawLabel((instantaneousDynamic as VexFlowInstantaneousDynamicExpression).Label, GraphicalLayers.Notes);\n }\n\n protected drawContinuousDynamic(graphicalExpression: VexFlowContinuousDynamicExpression): void {\n if (graphicalExpression.IsVerbal) {\n this.drawLabel(graphicalExpression.Label, GraphicalLayers.Notes);\n } else {\n for (const line of graphicalExpression.Lines) {\n const start: PointF2D = new PointF2D(graphicalExpression.ParentStaffLine.PositionAndShape.AbsolutePosition.x + line.Start.x,\n graphicalExpression.ParentStaffLine.PositionAndShape.AbsolutePosition.y + line.Start.y);\n const end: PointF2D = new PointF2D(graphicalExpression.ParentStaffLine.PositionAndShape.AbsolutePosition.x + line.End.x,\n graphicalExpression.ParentStaffLine.PositionAndShape.AbsolutePosition.y + line.End.y);\n this.drawLine(start, end, \"black\", line.Width);\n }\n }\n }\n\n /**\n * Renders a Label to the screen (e.g. Title, composer..)\n * @param graphicalLabel holds the label string, the text height in units and the font parameters\n * @param layer is the current rendering layer. There are many layers on top of each other to which can be rendered. Not needed for now.\n * @param bitmapWidth Not needed for now.\n * @param bitmapHeight Not needed for now.\n * @param heightInPixel the height of the text in screen coordinates\n * @param screenPosition the position of the lower left corner of the text in screen coordinates\n */\n protected renderLabel(graphicalLabel: GraphicalLabel, layer: number, bitmapWidth: number,\n bitmapHeight: number, heightInPixel: number, screenPosition: PointF2D): void {\n const height: number = graphicalLabel.Label.fontHeight * unitInPixels;\n const { font, text } = graphicalLabel.Label;\n let color: string;\n if (this.rules.ColoringEnabled) {\n color = graphicalLabel.Label.colorDefault;\n if (!color) {\n color = this.rules.DefaultColorLabel;\n }\n }\n let { fontStyle, fontFamily } = graphicalLabel.Label;\n if (!fontStyle) {\n fontStyle = this.rules.DefaultFontStyle;\n }\n if (!fontFamily) {\n fontFamily = this.rules.DefaultFontFamily;\n }\n this.backend.renderText(height, fontStyle, font, text, heightInPixel, screenPosition, color, graphicalLabel.Label.fontFamily);\n // font currently unused, replaced by fontFamily\n }\n\n /**\n * Renders a rectangle with the given style to the screen.\n * It is given in screen coordinates.\n * @param rectangle the rect in screen coordinates\n * @param layer is the current rendering layer. There are many layers on top of each other to which can be rendered. Not needed for now.\n * @param styleId the style id\n * @param alpha alpha value between 0 and 1\n */\n protected renderRectangle(rectangle: RectangleF2D, layer: number, styleId: number, alpha: number): void {\n this.backend.renderRectangle(rectangle, styleId, alpha);\n }\n\n /**\n * Converts a point from unit to pixel space.\n * @param point\n * @returns {PointF2D}\n */\n protected applyScreenTransformation(point: PointF2D): PointF2D {\n return new PointF2D(point.x * unitInPixels, point.y * unitInPixels);\n }\n\n /**\n * Converts a rectangle from unit to pixel space.\n * @param rectangle\n * @returns {RectangleF2D}\n */\n protected applyScreenTransformationForRect(rectangle: RectangleF2D): RectangleF2D {\n return new RectangleF2D(rectangle.x * unitInPixels, rectangle.y * unitInPixels, rectangle.width * unitInPixels, rectangle.height * unitInPixels);\n }\n}\n","\nimport {OutlineAndFillStyleEnum} from \"./DrawingEnums\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\n\nexport class GraphicalLine {\n constructor(start: PointF2D, end: PointF2D, width: number = 0, styleEnum: OutlineAndFillStyleEnum = OutlineAndFillStyleEnum.BaseWritingColor) {\n this.start = start;\n this.end = end;\n this.width = width;\n this.styleId = styleEnum;\n }\n public styleId: number;\n\n private start: PointF2D;\n private end: PointF2D;\n private width: number;\n\n public get Start(): PointF2D {\n return this.start;\n }\n public set Start(value: PointF2D) {\n this.start = value;\n }\n public get End(): PointF2D {\n return this.end;\n }\n public set End(value: PointF2D) {\n this.end = value;\n }\n public get Width(): number {\n return this.width;\n }\n public set Width(value: number) {\n this.width = value;\n }\n}\n","// import * as Collections from \"typescript-collections\";\nimport Collections = require(\"typescript-collections\");\n\n/**\n * The supported styles to draw a rectangle on the music sheet\n */\nexport enum OutlineAndFillStyleEnum {\n BaseWritingColor,\n FollowingCursor,\n AlternativeFollowingCursor,\n PlaybackCursor,\n Highlighted,\n ErrorUnderlay,\n Selected,\n SelectionSymbol,\n DebugColor1,\n DebugColor2,\n DebugColor3,\n SplitScreenDivision,\n GreyTransparentOverlay,\n MarkedArea1,\n MarkedArea2,\n MarkedArea3,\n MarkedArea4,\n MarkedArea5,\n MarkedArea6,\n MarkedArea7,\n MarkedArea8,\n MarkedArea9,\n MarkedArea10,\n Comment1,\n Comment2,\n Comment3,\n Comment4,\n Comment5,\n Comment6,\n Comment7,\n Comment8,\n Comment9,\n Comment10\n}\n\n// tslint:disable-next-line:max-line-length A linebreak would be more confusing here\nexport const OUTLINE_AND_FILL_STYLE_DICT: Collections.Dictionary =\n new Collections.Dictionary();\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.BaseWritingColor, \"Thistle\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.FollowingCursor, \"Aqua\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.AlternativeFollowingCursor, \"Azure\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.PlaybackCursor, \"Bisque\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Highlighted, \"CadetBlue\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.ErrorUnderlay, \"DarkBlue\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Selected, \"DarkGoldenRod\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.SelectionSymbol, \"BlanchedAlmond\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.DebugColor1, \"Chartreuse\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.DebugColor2, \"DarkGreen\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.DebugColor3, \"DarkOrange\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.SplitScreenDivision, \"FireBrick\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.GreyTransparentOverlay, \"DarkSalmon\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea1, \"DarkSeaGreen\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea2, \"DarkOrchid\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea3, \"Aquamarine\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea4, \"DarkKhaki\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea5, \"ForestGreen\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea6, \"AliceBlue\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea7, \"DeepPink\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea8, \"Coral\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea9, \"DarkOliveGreen\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.MarkedArea10, \"Chocolate\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment1, \"DodgerBlue\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment2, \"Blue\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment3, \"Beige\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment4, \"Crimson\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment5, \"Fuchsia\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment6, \"Brown\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment7, \"BlanchedAlmond\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment8, \"CornflowerBlue\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment9, \"Cornsilk\");\nOUTLINE_AND_FILL_STYLE_DICT.setValue(OutlineAndFillStyleEnum.Comment10, \"DarkGrey\");\n\nexport enum StyleSets {\n MarkedArea,\n Comment\n}\n\n/**\n * The layers which one can draw on (not supported)\n */\nexport enum GraphicalLayers {\n Background,\n Highlight,\n MeasureError,\n SelectionSymbol,\n Cursor,\n PSI_Debug,\n Notes,\n Comment,\n Debug_above\n}\n\nexport enum NoteState {\n Normal,\n Selected,\n Follow_Confirmed,\n QFeedback_NotFound,\n QFeedback_OK,\n QFeedback_Perfect,\n Debug1,\n Debug2,\n Debug3\n}\n\nexport enum AutoColorSet {\n /* different (boomwhacker-like) color set*/\n C = \"#d82c6b\",\n D = \"#F89D15\",\n E = \"#FFE21A\",\n F = \"#4dbd5c\",\n G = \"#009D96\",\n A = \"#43469d\",\n B = \"#76429c\",\n Rest = \"#000000\"\n\n // color set from MuseScore Color notehead plugin version 1.1 by Werner Schweer and others\n /*C = \"#eeee00\",\n D = \"#9b30ff\",\n E = \"#ee9a00\",\n F = \"#8b4513\",\n G = \"#ff0000\",\n A = \"#1e90ff\",\n B = \"#00ff00\"*/\n}\n","import { TextAlignmentEnum } from \"../../Common/Enums/TextAlignment\";\nimport { Label } from \"../Label\";\nimport { BoundingBox } from \"./BoundingBox\";\nimport { Clickable } from \"./Clickable\";\nimport { EngravingRules } from \"./EngravingRules\";\nimport { MusicSheetCalculator } from \"./MusicSheetCalculator\";\n\n/**\n * The graphical counterpart of a Label\n */\nexport class GraphicalLabel extends Clickable {\n private label: Label;\n private rules: EngravingRules;\n\n /**\n * Creates a new GraphicalLabel from a Label\n * @param label label object containing text\n * @param textHeight Height of text\n * @param alignment Alignement like left, right, top, ...\n * @param parent Parent Bounding Box where the label is attached to\n */\n constructor(label: Label, textHeight: number, alignment: TextAlignmentEnum, rules: EngravingRules,\n parent: BoundingBox = undefined, ) {\n super();\n this.label = label;\n this.boundingBox = new BoundingBox(this, parent);\n this.label.fontHeight = textHeight;\n this.label.textAlignment = alignment;\n this.rules = rules;\n }\n\n public get Label(): Label {\n return this.label;\n }\n\n public toString(): string {\n return `${this.label.text} (${this.boundingBox.RelativePosition.x},${this.boundingBox.RelativePosition.y})`;\n }\n\n /**\n * Calculate GraphicalLabel's Borders according to its Alignment\n */\n public setLabelPositionAndShapeBorders(): void {\n if (this.Label.text.trim() === \"\") {\n return;\n }\n const labelMarginBorderFactor: number = this.rules?.LabelMarginBorderFactor ?? 0.1;\n\n const widthToHeightRatio: number =\n MusicSheetCalculator.TextMeasurer.computeTextWidthToHeightRatio(\n this.Label.text, this.Label.font, this.Label.fontStyle, this.label.fontFamily);\n const height: number = this.Label.fontHeight;\n const width: number = height * widthToHeightRatio;\n const bbox: BoundingBox = this.PositionAndShape;\n\n switch (this.Label.textAlignment) {\n case TextAlignmentEnum.CenterBottom:\n bbox.BorderTop = -height;\n bbox.BorderLeft = -width / 2;\n bbox.BorderBottom = 0;\n bbox.BorderRight = width / 2;\n break;\n case TextAlignmentEnum.CenterCenter:\n bbox.BorderTop = -height / 2;\n bbox.BorderLeft = -width / 2;\n bbox.BorderBottom = height / 2;\n bbox.BorderRight = width / 2;\n break;\n case TextAlignmentEnum.CenterTop:\n bbox.BorderTop = 0;\n bbox.BorderLeft = -width / 2;\n bbox.BorderBottom = height;\n bbox.BorderRight = width / 2;\n break;\n case TextAlignmentEnum.LeftBottom:\n bbox.BorderTop = -height;\n bbox.BorderLeft = 0;\n bbox.BorderBottom = 0;\n bbox.BorderRight = width;\n break;\n case TextAlignmentEnum.LeftCenter:\n bbox.BorderTop = -height / 2;\n bbox.BorderLeft = 0;\n bbox.BorderBottom = height / 2;\n bbox.BorderRight = width;\n break;\n case TextAlignmentEnum.LeftTop:\n bbox.BorderTop = 0;\n bbox.BorderLeft = 0;\n bbox.BorderBottom = height;\n bbox.BorderRight = width;\n break;\n case TextAlignmentEnum.RightBottom:\n bbox.BorderTop = -height;\n bbox.BorderLeft = -width;\n bbox.BorderBottom = 0;\n bbox.BorderRight = 0;\n break;\n case TextAlignmentEnum.RightCenter:\n bbox.BorderTop = -height / 2;\n bbox.BorderLeft = -width;\n bbox.BorderBottom = height / 2;\n bbox.BorderRight = 0;\n break;\n case TextAlignmentEnum.RightTop:\n bbox.BorderTop = 0;\n bbox.BorderLeft = -width;\n bbox.BorderBottom = height;\n bbox.BorderRight = 0;\n break;\n default:\n }\n bbox.BorderMarginTop = bbox.BorderTop - height * labelMarginBorderFactor;\n bbox.BorderMarginLeft = bbox.BorderLeft - height * labelMarginBorderFactor;\n bbox.BorderMarginBottom = bbox.BorderBottom + height * labelMarginBorderFactor;\n bbox.BorderMarginRight = bbox.BorderRight + height * labelMarginBorderFactor;\n }\n}\n","/**\n * The styles available to write text on the music sheet\n */\nexport enum FontStyles {\n Regular = 0,\n Bold = 1,\n Italic = 2,\n BoldItalic = 3,\n Underlined = 4\n}\n","import Dictionary from \"typescript-collections/dist/lib/Dictionary\";\n\ndeclare global {\n interface Array {\n /** Returns the last element from an array */\n last(): T;\n /** Deletes all elements from an array */\n clear(): void;\n /** Returns true if the element is found in the array */\n contains(elem: T): boolean;\n }\n}\n\nif (!Array.prototype.last) {\n Array.prototype.last = function(): T {\n return this[this.length - 1];\n };\n}\n\nif (!Array.prototype.clear) {\n Array.prototype.clear = function(): void {\n this.length = 0;\n };\n}\n\nif (!Array.prototype.contains) {\n Array.prototype.contains = function(elem: T): boolean {\n return this.indexOf(elem) !== -1;\n };\n}\n\n/**\n * This class implements static methods to perform useful operations on lists, dictionaries, ...\n */\nexport class CollectionUtil {\n\n public static contains2(array: any[], object: any): boolean {\n for (let i: number = 0; i < array.length; i++) {\n if (array[i] === object) {\n return true;\n }\n }\n\n return false;\n }\n\n public static last(array: any[]): any {\n return array[array.length - 1];\n }\n\n /**\n * Iterates through a dictionary and calls iterationFunction.\n * If iterationFunction returns true the key gets stored.\n * all stored key will finally be removed from the dictionary.\n * @param dict\n * @param iterationFunction\n */\n public static removeDictElementIfTrue(thisPointer: S, dict: Dictionary,\n iterationFunction: (thisPointer: S, key: T, value: V) => boolean): void {\n const toDeleteEntries: T[] = [];\n dict.forEach(function (key: T, value: V): void {\n const shallDelete: boolean = iterationFunction(thisPointer, key, value);\n if (shallDelete) {\n toDeleteEntries.push(key);\n }\n });\n\n for (let i: number = 0; i < toDeleteEntries.length; i++) {\n dict.remove(toDeleteEntries[i]);\n }\n }\n\n public static getLastElement(array: T[]): T {\n return array[array.length - 1];\n }\n\n public static binarySearch(array: T[],\n element: T,\n cmp: (elem1: T, elem2: T) => number,\n startIndex: number = 0,\n endIndex: number = array.length - 1): number {\n let mid: number = 1;\n while (startIndex < endIndex) {\n mid = Math.floor((startIndex + endIndex) / 2);\n const c: number = cmp(array[mid], element);\n if (c === 0) {\n return mid;\n }\n if (c < 0) {\n startIndex = mid + 1;\n }\n if (0 < c) {\n endIndex = mid;\n }\n }\n\n return -mid;\n }\n}\n","import {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {VerticalSourceStaffEntryContainer} from \"./VerticalSourceStaffEntryContainer\";\nimport {Staff} from \"./Staff\";\nimport {AbstractNotationInstruction} from \"./Instructions/AbstractNotationInstruction\";\nimport {VoiceEntry} from \"./VoiceEntry\";\nimport {Note} from \"./Note\";\nimport {StaffEntryLink} from \"./StaffEntryLink\";\nimport {ChordSymbolContainer} from \"./ChordSymbolContainer\";\nimport {ClefInstruction} from \"./Instructions/ClefInstruction\";\nimport {KeyInstruction} from \"./Instructions/KeyInstruction\";\nimport {RhythmInstruction} from \"./Instructions/RhythmInstruction\";\n\n/**\n * A [[SourceStaffEntry]] is a container spanning all the [[VoiceEntry]]s at one timestamp for one [[StaffLine]].\n */\nexport class SourceStaffEntry {\n constructor(verticalContainerParent: VerticalSourceStaffEntryContainer, parentStaff: Staff) {\n this.verticalContainerParent = verticalContainerParent;\n this.parentStaff = parentStaff;\n }\n\n private parentStaff: Staff;\n private verticalContainerParent: VerticalSourceStaffEntryContainer;\n private voiceEntries: VoiceEntry[] = [];\n private staffEntryLink: StaffEntryLink;\n private instructions: AbstractNotationInstruction[] = [];\n private chordSymbolContainers: ChordSymbolContainer[] = [];\n\n public get ParentStaff(): Staff {\n return this.parentStaff;\n }\n\n public get VerticalContainerParent(): VerticalSourceStaffEntryContainer {\n return this.verticalContainerParent;\n }\n\n public get Timestamp(): Fraction {\n if (this.VerticalContainerParent) {\n return this.VerticalContainerParent.Timestamp;\n }\n return undefined;\n }\n\n public get AbsoluteTimestamp(): Fraction {\n if (this.VerticalContainerParent) {\n return Fraction.plus(this.VerticalContainerParent.ParentMeasure.AbsoluteTimestamp, this.VerticalContainerParent.Timestamp);\n }\n return undefined;\n }\n\n public get VoiceEntries(): VoiceEntry[] {\n return this.voiceEntries;\n }\n\n public set VoiceEntries(value: VoiceEntry[]) {\n this.voiceEntries = value;\n }\n\n public get Link(): StaffEntryLink {\n return this.staffEntryLink;\n }\n\n public set Link(value: StaffEntryLink) {\n this.staffEntryLink = value;\n }\n\n public get Instructions(): AbstractNotationInstruction[] {\n return this.instructions;\n }\n\n public set Instructions(value: AbstractNotationInstruction[]) {\n this.instructions = value;\n }\n\n public get ChordContainers(): ChordSymbolContainer[] {\n return this.chordSymbolContainers;\n }\n\n public set ChordContainers(value: ChordSymbolContainer[]) {\n this.chordSymbolContainers = value;\n }\n\n // public removeAllInstructionsOfType(type: AbstractNotationInstruction): number {\n // let i: number = 0;\n // let ret: number = 0;\n // while (i < this.instructions.length) {\n // let instruction: AbstractNotationInstruction = this.instructions[i];\n // if (instruction instanceof type) {\n // this.instructions.splice(i, 1);\n // ret++;\n // } else {\n // i++;\n // }\n // }\n // return ret;\n // }\n //\n // public removeFirstInstructionOfType(type: AbstractNotationInstruction): boolean {\n // for (let i: number = 0; i < this.instructions.length; i++) {\n // if (this.instructions[i] instanceof type) {\n // this.instructions.splice(i, 1);\n // return true;\n // }\n // }\n // return false;\n // }\n\n public removeAllInstructionsOfTypeClefInstruction(): number {\n let i: number = 0;\n let ret: number = 0;\n while (i < this.instructions.length) {\n if (this.instructions[i] instanceof ClefInstruction) {\n this.instructions.splice(i, 1);\n ret++;\n } else {\n i++;\n }\n }\n return ret;\n }\n\n /**\n * Similar to RemoveAllInstructionsOfType but faster,\n * because it stops searching when the first instruction of the given type is found.\n * @returns {boolean}\n */\n public removeFirstInstructionOfTypeClefInstruction(): boolean {\n for (let i: number = 0; i < this.instructions.length; i++) {\n if (this.instructions[i] instanceof ClefInstruction) {\n this.instructions.splice(i, 1);\n return true;\n }\n }\n return false;\n }\n\n public removeAllInstructionsOfTypeKeyInstruction(): number {\n let i: number = 0;\n let ret: number = 0;\n while (i < this.instructions.length) {\n if (this.instructions[i] instanceof KeyInstruction) {\n this.instructions.splice(i, 1);\n ret++;\n } else {\n i++;\n }\n }\n return ret;\n }\n\n /**\n * Similar to RemoveAllInstructionsOfType but faster,\n * because it stops searching when the first instruction of the given type is found.\n * @returns {boolean}\n */\n public removeFirstInstructionOfTypeKeyInstruction(): boolean {\n for (let i: number = 0; i < this.instructions.length; i++) {\n if (this.instructions[i] instanceof KeyInstruction) {\n this.instructions.splice(i, 1);\n return true;\n }\n }\n return false;\n }\n\n public removeAllInstructionsOfTypeRhythmInstruction(): number {\n let i: number = 0;\n let ret: number = 0;\n while (i < this.instructions.length) {\n if (this.instructions[i] instanceof RhythmInstruction) {\n this.instructions.splice(i, 1);\n ret++;\n } else {\n i++;\n }\n }\n return ret;\n }\n\n public removeFirstInstructionOfTypeRhythmInstruction(): boolean {\n for (let i: number = 0; i < this.instructions.length; i++) {\n if (this.instructions[i] instanceof RhythmInstruction) {\n this.instructions.splice(i, 1);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Calculate the [[SourceStaffEntry]]'s minimum NoteLength.\n * @returns {Fraction}\n */\n public calculateMinNoteLength(): Fraction {\n let duration: Fraction = new Fraction(Number.MAX_VALUE, 1);\n for (let idx: number = 0, len: number = this.VoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = this.VoiceEntries[idx];\n for (let idx2: number = 0, len2: number = voiceEntry.Notes.length; idx2 < len2; ++idx2) {\n const note: Note = voiceEntry.Notes[idx2];\n if (note.Length.lt(duration)) {\n duration = note.Length;\n }\n }\n }\n return duration;\n }\n\n public calculateMaxNoteLength(): Fraction {\n let duration: Fraction = new Fraction(0, 1);\n for (let idx: number = 0, len: number = this.VoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = this.VoiceEntries[idx];\n for (let idx2: number = 0, len2: number = voiceEntry.Notes.length; idx2 < len2; ++idx2) {\n const note: Note = voiceEntry.Notes[idx2];\n if (note.NoteTie) {\n // only add notes from this and after this sse!!\n const tieRestDuration: Fraction = Fraction.createFromFraction(note.Length);\n let addFollowingNotes: boolean = false;\n for (const n of note.NoteTie.Notes) {\n if (n === note) {\n addFollowingNotes = true;\n continue;\n }\n if (addFollowingNotes) {\n tieRestDuration.Add(n.Length);\n }\n }\n if (duration.lt(tieRestDuration)) {\n duration = tieRestDuration;\n }\n } else if (duration.lt(note.Length)) {\n duration = note.Length;\n }\n }\n }\n return duration;\n }\n\n public hasNotes(): boolean {\n for (let idx: number = 0, len: number = this.VoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = this.VoiceEntries[idx];\n if (voiceEntry.Notes.length > 0) {\n return true;\n }\n }\n return false;\n }\n\n public hasTie(): boolean {\n for (let idx: number = 0, len: number = this.VoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = this.VoiceEntries[idx];\n if (voiceEntry.hasTie()) {\n return true;\n }\n }\n return false;\n }\n\n public findLinkedNotes(linkedNotes: Note[]): void {\n for (let idx: number = 0, len: number = this.voiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = this.voiceEntries[idx];\n for (let idx2: number = 0, len2: number = voiceEntry.Notes.length; idx2 < len2; ++idx2) {\n const note: Note = voiceEntry.Notes[idx2];\n if (note.ParentStaffEntry === this) {\n linkedNotes.push(note);\n }\n }\n }\n }\n}\n","import {Repetition} from \"../../MusicSource/Repetition\";\n\nexport class RepetitionInstructionComparer /*implements IComparer*/ {\n public static Compare(x: RepetitionInstruction, y: RepetitionInstruction): number {\n if (x.parentRepetition !== undefined && y.parentRepetition) {\n if (x.alignment === AlignmentType.End && y.alignment === AlignmentType.End) {\n if (x.parentRepetition.StartIndex < y.parentRepetition.StartIndex) {\n return 1;\n }\n if (x.parentRepetition.StartIndex > y.parentRepetition.StartIndex) {\n return -1;\n }\n }\n if (x.alignment === AlignmentType.Begin && y.alignment === AlignmentType.Begin) {\n if (x.parentRepetition.EndIndex < y.parentRepetition.EndIndex) {\n return 1;\n }\n if (x.parentRepetition.EndIndex > y.parentRepetition.EndIndex) {\n return -1;\n }\n }\n }\n return 0;\n }\n}\n\nexport class RepetitionInstruction /*implements IComparable*/ {\n /* FIXME: Check constructor calling from other classes\n constructor(measureIndex: number, type: RepetitionInstructionEnum) {\n this(measureIndex, [], type, AlignmentType.End, undefined);\n if (type === RepetitionInstructionEnum.StartLine || type === RepetitionInstructionEnum.Segno || type === RepetitionInstructionEnum.Coda) {\n this.alignment = AlignmentType.Begin;\n }\n }\n constructor(measureIndex: number, type: RepetitionInstructionEnum, alignment: AlignmentType, parentRepetition: Repetition) {\n this(measureIndex, [], type, alignment, parentRepetition);\n\n }\n constructor(measureIndex: number, endingIndex: number, type: RepetitionInstructionEnum, alignment: AlignmentType, parentRepetition: Repetition) {\n this(measureIndex, [endingIndex], type, alignment, parentRepetition);\n\n }\n */\n constructor(measureIndex: number, type: RepetitionInstructionEnum, alignment: AlignmentType = AlignmentType.End,\n parentRepetition: Repetition = undefined, endingIndices: number[] = undefined) {\n this.measureIndex = measureIndex;\n if (endingIndices) {\n this.endingIndices = endingIndices.slice(); // slice=arrayCopy\n }\n this.type = type;\n this.alignment = alignment;\n this.parentRepetition = parentRepetition;\n }\n\n public measureIndex: number;\n public endingIndices: number[] = undefined;\n public type: RepetitionInstructionEnum;\n public alignment: AlignmentType;\n public parentRepetition: Repetition;\n\n public CompareTo(obj: Object): number {\n const other: RepetitionInstruction = obj;\n if (this.measureIndex > other.measureIndex) {\n return 1;\n } else if (this.measureIndex < other.measureIndex) {\n return -1;\n }\n if (this.alignment === AlignmentType.Begin) {\n if (other.alignment === AlignmentType.End) {\n return -1;\n }\n switch (this.type) {\n case RepetitionInstructionEnum.Ending:\n return 1;\n case RepetitionInstructionEnum.StartLine:\n if (other.type === RepetitionInstructionEnum.Ending) {\n return -1;\n }\n return 1;\n case RepetitionInstructionEnum.Coda:\n case RepetitionInstructionEnum.Segno:\n if (other.type === RepetitionInstructionEnum.Coda) {\n return 1;\n }\n return -1;\n default:\n }\n } else {\n if (other.alignment === AlignmentType.Begin) {\n return 1;\n }\n switch (this.type) {\n case RepetitionInstructionEnum.Ending:\n return -1;\n case RepetitionInstructionEnum.Fine:\n case RepetitionInstructionEnum.ToCoda:\n if (other.type === RepetitionInstructionEnum.Ending) {\n return 1;\n }\n return -1;\n case RepetitionInstructionEnum.ForwardJump:\n switch (other.type) {\n case RepetitionInstructionEnum.Ending:\n case RepetitionInstructionEnum.Fine:\n case RepetitionInstructionEnum.ToCoda:\n return 1;\n default:\n }\n return -1;\n case RepetitionInstructionEnum.DalSegnoAlFine:\n case RepetitionInstructionEnum.DaCapoAlFine:\n case RepetitionInstructionEnum.DalSegnoAlCoda:\n case RepetitionInstructionEnum.DaCapoAlCoda:\n case RepetitionInstructionEnum.DaCapo:\n case RepetitionInstructionEnum.DalSegno:\n case RepetitionInstructionEnum.BackJumpLine:\n return 1;\n default:\n }\n }\n return 0;\n }\n\n public equals(other: RepetitionInstruction): boolean {\n if (\n this.measureIndex !== other.measureIndex\n || this.type !== other.type\n || this.alignment !== other.alignment\n ) {\n return false;\n }\n if (this.endingIndices === other.endingIndices) {\n return true;\n }\n if (!this.endingIndices || !other.endingIndices ||\n this.endingIndices.length !== other.endingIndices.length) {\n return false;\n }\n for (let i: number = 0; i < this.endingIndices.length; i++) {\n if (this.endingIndices[i] !== other.endingIndices[i]) {\n return false;\n }\n }\n return true;\n }\n}\n\nexport enum RepetitionInstructionEnum {\n StartLine,\n ForwardJump,\n BackJumpLine,\n Ending,\n DaCapo,\n DalSegno,\n Fine,\n ToCoda,\n DalSegnoAlFine,\n DaCapoAlFine,\n DalSegnoAlCoda,\n DaCapoAlCoda,\n Coda,\n Segno,\n None,\n}\n\nexport enum AlignmentType {\n Begin,\n End,\n}\n","export class ITextTranslation {\n public static defaultTextTranslation: ITextTranslation;\n\n public static translateText(tag: string, text: string): string {\n if (!this.defaultTextTranslation) {\n return text;\n }\n\n //return this.DefaultTextTranslation.translate(tag, text);\n }\n\n //declare public translate(tag: string, text: string): string;\n}\n","import { EngravingRules } from \"./EngravingRules\";\nimport { PlacementEnum } from \"../VoiceData/Expressions/AbstractExpression\";\n\nexport enum ColoringModes {\n XML = 0,\n AutoColoring = 1,\n CustomColorSet = 2\n}\n\nexport enum DrawingParametersEnum {\n allon = \"allon\",\n compact = \"compact\",\n compacttight = \"compacttight\",\n default = \"default\",\n leadsheet = \"leadsheet\",\n preview = \"preview\",\n thumbnail = \"thumbnail\",\n}\n\n/** Internal drawing/rendering parameters and broad modes like compact and thumbnail. Overlap with EngravingRules. */\nexport class DrawingParameters {\n /** will set other settings if changed with set method */\n private drawingParametersEnum: DrawingParametersEnum;\n private rules: EngravingRules = new EngravingRules();\n public drawHighlights: boolean;\n public drawErrors: boolean;\n public drawSelectionStartSymbol: boolean;\n public drawSelectionEndSymbol: boolean;\n public drawCursors: boolean;\n public drawActivitySymbols: boolean;\n public drawScrollIndicator: boolean;\n public drawComments: boolean;\n public drawMarkedAreas: boolean;\n public drawTitle: boolean = true;\n public drawSubtitle: boolean = true;\n public drawLyricist: boolean = true;\n public drawComposer: boolean = true;\n public drawCredits: boolean = true;\n public drawPartNames: boolean = true;\n public coloringMode: ColoringModes;\n public fingeringPosition: PlacementEnum = PlacementEnum.Left;\n /** Draw notes set to be invisible (print-object=\"no\" in XML). */\n public drawHiddenNotes: boolean = false;\n\n constructor(drawingParameters: DrawingParametersEnum = DrawingParametersEnum.default) {\n this.DrawingParametersEnum = drawingParameters;\n }\n\n /** Sets drawing parameters enum and changes settings flags accordingly. */\n public set DrawingParametersEnum(drawingParametersEnum: DrawingParametersEnum) {\n this.drawingParametersEnum = drawingParametersEnum;\n switch (drawingParametersEnum) {\n case DrawingParametersEnum.allon:\n this.setForAllOn();\n break;\n case DrawingParametersEnum.thumbnail:\n this.setForThumbnail();\n break;\n case DrawingParametersEnum.leadsheet:\n this.setForLeadsheet();\n break;\n case DrawingParametersEnum.compact:\n this.setForCompactMode();\n break;\n case DrawingParametersEnum.compacttight:\n this.setForCompactTightMode();\n break;\n case DrawingParametersEnum.default:\n default:\n this.setForDefault();\n }\n }\n\n public get DrawingParametersEnum(): DrawingParametersEnum {\n return this.drawingParametersEnum;\n }\n\n public setForAllOn(): void {\n this.drawHighlights = true;\n this.drawErrors = true;\n this.drawSelectionStartSymbol = true;\n this.drawSelectionEndSymbol = true;\n this.drawCursors = true;\n this.drawActivitySymbols = true;\n this.drawScrollIndicator = true;\n this.drawComments = true;\n this.drawMarkedAreas = true;\n this.DrawTitle = true;\n this.DrawSubtitle = true;\n this.DrawComposer = true;\n this.DrawLyricist = true;\n this.drawCredits = true;\n this.DrawPartNames = true;\n this.drawHiddenNotes = true;\n this.rules.CompactMode = false;\n }\n\n public setForDefault(): void {\n this.setForAllOn();\n this.drawHiddenNotes = false;\n }\n\n public setForThumbnail(): void {\n this.drawHighlights = false;\n this.drawErrors = false;\n this.drawSelectionStartSymbol = false;\n this.drawSelectionStartSymbol = false;\n this.drawCursors = false;\n this.drawActivitySymbols = false;\n this.drawScrollIndicator = false;\n this.drawComments = true;\n this.drawMarkedAreas = true;\n this.drawHiddenNotes = false;\n }\n\n public setForCompactMode(): void {\n this.setForDefault();\n this.rules.CompactMode = true;\n this.DrawCredits = false; // sets DrawComposer, DrawTitle, DrawLyricist to false\n // this.DrawPartNames = true; // unnecessary\n this.drawHiddenNotes = false;\n }\n\n public setForCompactTightMode(): void {\n this.setForCompactMode(); // also sets CompactMode = true\n this.DrawPartNames = false;\n\n // tight rendering mode, lower margins and safety distances between systems, staffs etc. may cause overlap.\n // these options can afterwards be finetuned by setting osmd.rules.BetweenStaffDistance for example\n this.rules.MinSkyBottomDistBetweenStaves = 1.0; // default 1.0. this can cause collisions with slurs and dynamics sometimes\n this.rules.MinSkyBottomDistBetweenSystems = 2.0; // default 5.0\n // note that this.rules === osmd.rules, since it's passed as a reference\n\n this.rules.BetweenStaffDistance = 2.5;\n this.rules.StaffDistance = 3.5;\n this.rules.MinimumDistanceBetweenSystems = 1;\n // this.rules.PageTopMargin = 0.0; // see this.rules.PageTopMarginNarrow used in compact mode\n this.rules.PageBottomMargin = 1.0;\n this.rules.PageLeftMargin = 2.0;\n this.rules.PageRightMargin = 2.0;\n // this.BetweenStaffDistance = 2.5 // etc needs to be set in OSMD.rules\n // this.StaffDistance = 3.5\n // this.MinimumDistanceBetweenSystems = 1\n }\n\n public setForLeadsheet(): void {\n this.drawHighlights = false;\n this.drawErrors = false;\n this.drawSelectionStartSymbol = true;\n this.drawSelectionEndSymbol = true;\n this.drawCursors = true;\n this.drawActivitySymbols = false;\n this.drawScrollIndicator = true;\n this.drawComments = true;\n this.drawMarkedAreas = true;\n }\n\n //#region GETTER / SETTER\n public get DrawCredits(): boolean {\n return this.drawCredits;\n }\n\n public set DrawCredits(value: boolean) {\n this.drawCredits = value;\n this.DrawComposer = value;\n this.DrawTitle = value;\n this.DrawSubtitle = value;\n this.DrawLyricist = value;\n }\n // TODO these drawCredits settings are duplicate in drawingParameters and EngravingRules. Maybe we only need them in EngravingRules.\n // this sets the parameter in DrawingParameters, which in turn sets the parameter in EngravingRules.\n // see settings below that don't call drawingParameters for the immediate approach.\n // on the other hand, DrawingParameters has the added option of setting broad modes (e.g. compact), though they aren't that useful\n\n public get DrawTitle(): boolean {\n return this.drawTitle;\n }\n\n /** Enable or disable drawing the Title of the piece. If disabled, will disable drawing Subtitle as well. */\n public set DrawTitle(value: boolean) {\n this.drawTitle = value;\n this.rules.RenderTitle = value;\n if (!value) { // don't draw subtitle if title isn't drawn\n this.DrawSubtitle = false;\n }\n }\n\n public get DrawSubtitle(): boolean {\n return this.drawSubtitle;\n }\n\n /** Enable or disable drawing the Subtitle of the piece. If enabled, will enable drawing Title as well. */\n public set DrawSubtitle(value: boolean) {\n this.drawSubtitle = value;\n this.rules.RenderSubtitle = value;\n if (value) {\n this.DrawTitle = true; // if subtitle is drawn, title needs to be drawn as well\n }\n }\n\n public get DrawComposer(): boolean {\n return this.drawComposer;\n }\n\n /** Enable or disable drawing a label for the Composer of the piece. */\n public set DrawComposer(value: boolean) {\n this.drawComposer = value;\n this.rules.RenderComposer = value;\n }\n\n public get DrawLyricist(): boolean {\n return this.drawLyricist;\n }\n\n public set DrawLyricist(value: boolean) {\n this.drawLyricist = value;\n this.rules.RenderLyricist = value;\n }\n\n public get DrawPartNames(): boolean {\n return this.drawPartNames;\n }\n\n public set DrawPartNames(value: boolean) {\n this.drawPartNames = value;\n this.rules.RenderPartNames = value;\n if (!this.rules.RenderPartNames) {\n this.rules.RenderPartAbbreviations = false;\n }\n }\n\n public get FingeringPosition(): PlacementEnum {\n return this.fingeringPosition;\n }\n\n public set FingeringPosition(value: PlacementEnum) {\n this.fingeringPosition = value;\n this.rules.FingeringPosition = value;\n }\n\n public get Rules(): EngravingRules {\n return this.rules;\n }\n\n public set Rules(value: EngravingRules) {\n this.rules = value;\n }\n}\n","import { PagePlacementEnum } from \"./GraphicalMusicPage\";\n//import {MusicSymbol} from \"./MusicSymbol\";\nimport log from \"loglevel\";\nimport { TextAlignmentEnum } from \"../../Common/Enums/TextAlignment\";\nimport { PlacementEnum } from \"../VoiceData/Expressions/AbstractExpression\";\nimport { AutoBeamOptions, AlignRestOption, FillEmptyMeasuresWithWholeRests } from \"../../OpenSheetMusicDisplay/OSMDOptions\";\nimport { ColoringModes as ColoringMode } from \"./DrawingParameters\";\nimport { Dictionary } from \"typescript-collections\";\nimport { FontStyles } from \"../../Common/Enums\";\nimport { NoteEnum } from \"../../Common/DataObjects/Pitch\";\nimport { ChordSymbolEnum } from \"../../MusicalScore/VoiceData/ChordSymbolContainer\";\n\nexport class EngravingRules {\n /** A unit of distance. 1.0 is the distance between lines of a stave for OSMD, which is 10 pixels in Vexflow. */\n private static unit: number = 1.0;\n private samplingUnit: number;\n private staccatoShorteningFactor: number;\n /** Height (size) of the sheet title. */\n private sheetTitleHeight: number;\n private sheetSubtitleHeight: number;\n private sheetMinimumDistanceBetweenTitleAndSubtitle: number;\n private sheetComposerHeight: number;\n private sheetAuthorHeight: number;\n private compactMode: boolean;\n private pagePlacementEnum: PagePlacementEnum;\n private pageHeight: number;\n private pageTopMargin: number;\n private pageTopMarginNarrow: number;\n private pageBottomMargin: number;\n private pageLeftMargin: number;\n private pageRightMargin: number;\n private titleTopDistance: number;\n private titleBottomDistance: number;\n private systemLeftMargin: number;\n private systemRightMargin: number;\n private firstSystemMargin: number;\n private systemLabelsRightMargin: number;\n private systemComposerDistance: number;\n private instrumentLabelTextHeight: number;\n private minimumDistanceBetweenSystems: number;\n private minSkyBottomDistBetweenSystems: number;\n private lastSystemMaxScalingFactor: number;\n private staffDistance: number;\n private betweenStaffDistance: number;\n private staffHeight: number;\n private tabStaffInterlineHeight: number;\n private betweenStaffLinesDistance: number;\n /** Whether to automatically beam notes that don't already have beams in XML. */\n private autoBeamNotes: boolean;\n /** Options for autoBeaming like whether to beam over rests. See AutoBeamOptions interface. */\n private autoBeamOptions: AutoBeamOptions;\n private beamWidth: number;\n private beamSpaceWidth: number;\n private beamForwardLength: number;\n private clefLeftMargin: number;\n private clefRightMargin: number;\n private percussionOneLineCutoff: number;\n private percussionForceVoicesOneLineCutoff: number;\n private betweenKeySymbolsDistance: number;\n private keyRightMargin: number;\n private rhythmRightMargin: number;\n private showRhythmAgainAfterPartEndOrFinalBarline: boolean;\n private inStaffClefScalingFactor: number;\n private distanceBetweenNaturalAndSymbolWhenCancelling: number;\n private noteHelperLinesOffset: number;\n private measureLeftMargin: number;\n private measureRightMargin: number;\n private distanceBetweenLastInstructionAndRepetitionBarline: number;\n private arpeggioDistance: number;\n private idealStemLength: number;\n private stemNoteHeadBorderYOffset: number;\n private stemWidth: number;\n private stemMargin: number;\n private stemMinLength: number;\n private stemMaxLength: number;\n private beamSlopeMaxAngle: number;\n private stemMinAllowedDistanceBetweenNoteHeadAndBeamLine: number;\n private setWantedStemDirectionByXml: boolean;\n private graceNoteScalingFactor: number;\n private graceNoteXOffset: number;\n private wedgeOpeningLength: number;\n private wedgeMeasureEndOpeningLength: number;\n private wedgeMeasureBeginOpeningLength: number;\n private wedgePlacementAboveY: number;\n private wedgePlacementBelowY: number;\n private wedgeHorizontalMargin: number;\n private wedgeVerticalMargin: number;\n private distanceOffsetBetweenTwoHorizontallyCrossedWedges: number;\n private wedgeMinLength: number;\n private distanceBetweenAdjacentDynamics: number;\n private tempoChangeMeasureValidity: number;\n private tempoContinousFactor: number;\n private staccatoScalingFactor: number;\n private betweenDotsDistance: number;\n private ornamentAccidentalScalingFactor: number;\n private chordSymbolTextHeight: number;\n private chordSymbolXSpacing: number;\n private chordSymbolYOffset: number;\n private chordSymbolLabelTexts: Dictionary;\n private measureNumberLabelHeight: number;\n private measureNumberLabelOffset: number;\n private measureNumberLabelXOffset: number;\n /** Whether tuplets should display ratio (3:2 instead of 3 for triplet). Default false. */\n private tupletsRatioed: boolean;\n /** Whether all tuplets should be bracketed (e.g. |--5--| instead of 5). Default false.\n * If false, only tuplets given as bracketed in XML (bracket=\"yes\") will be bracketed.\n * (If not given in XML, bracketing is implementation-dependent according to standard)\n */\n private tupletsBracketed: boolean;\n /** Whether all triplets should be bracketed. Overrides tupletsBracketed for triplets.\n * If false, only triplets given as bracketed in XML (bracket=\"yes\") will be bracketed.\n * (Bracketing all triplets can be cluttering)\n */\n private tripletsBracketed: boolean;\n private tupletNumberLabelHeight: number;\n private tupletNumberYOffset: number;\n private labelMarginBorderFactor: number;\n private tupletVerticalLineLength: number;\n private repetitionEndingLabelHeight: number;\n private repetitionEndingLabelXOffset: number;\n private repetitionEndingLabelYOffset: number;\n private repetitionEndingLineYLowerOffset: number;\n private repetitionEndingLineYUpperOffset: number;\n private voltaOffset: number;\n /** Default alignment of lyrics.\n * Left alignments will extend text to the right of the bounding box,\n * which facilitates spacing by extending measure width.\n */\n private lyricsAlignmentStandard: TextAlignmentEnum;\n private lyricsHeight: number;\n private lyricsYOffsetToStaffHeight: number;\n private verticalBetweenLyricsDistance: number;\n private horizontalBetweenLyricsDistance: number;\n private betweenSyllableMaximumDistance: number;\n private betweenSyllableMinimumDistance: number;\n private lyricOverlapAllowedIntoNextMeasure: number;\n private minimumDistanceBetweenDashes: number;\n private bezierCurveStepSize: number;\n private tPower3: number[];\n private oneMinusTPower3: number[];\n private factorOne: number[];\n private factorTwo: number[];\n private tieGhostObjectWidth: number;\n private tieYPositionOffsetFactor: number;\n private minimumNeededXspaceForTieGhostObject: number;\n private tieHeightMinimum: number;\n private tieHeightMaximum: number;\n private tieHeightInterpolationK: number;\n private tieHeightInterpolationD: number;\n private slurNoteHeadYOffset: number;\n private slurStemXOffset: number;\n private slurSlopeMaxAngle: number;\n private slurTangentMinAngle: number;\n private slurTangentMaxAngle: number;\n private slursStartingAtSameStaffEntryYOffset: number;\n private instantaneousTempoTextHeight: number;\n private continuousDynamicTextHeight: number;\n private moodTextHeight: number;\n private unknownTextHeight: number;\n private continuousTempoTextHeight: number;\n private staffLineWidth: number;\n private ledgerLineWidth: number;\n private ledgerLineStrokeStyle: string;\n private wedgeLineWidth: number;\n private tupletLineWidth: number;\n private lyricUnderscoreLineWidth: number;\n private systemThinLineWidth: number;\n private systemBoldLineWidth: number;\n private systemRepetitionEndingLineWidth: number;\n private systemDotWidth: number;\n private distanceBetweenVerticalSystemLines: number;\n private distanceBetweenDotAndLine: number;\n private octaveShiftLineWidth: number;\n private octaveShiftVerticalLineLength: number;\n private graceLineWidth: number;\n private minimumStaffLineDistance: number;\n private minSkyBottomDistBetweenStaves: number;\n private minimumCrossedBeamDifferenceMargin: number;\n private displacedNoteMargin: number;\n private minNoteDistance: number;\n private subMeasureXSpacingThreshold: number;\n private measureDynamicsMaxScalingFactor: number;\n private wholeRestXShiftVexflow: number;\n private metronomeMarksDrawn: boolean;\n private metronomeMarkXShift: number;\n private metronomeMarkYShift: number;\n private maxInstructionsConstValue: number;\n private noteDistances: number[] = [1.0, 1.0, 1.3, 1.6, 2.0, 2.5, 3.0, 4.0];\n private noteDistancesScalingFactors: number[] = [1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0];\n private durationDistanceDict: {[_: number]: number; } = {};\n private durationScalingDistanceDict: {[_: number]: number; } = {};\n\n private alignRests: number; // 0 = false, 1 = true, 2 = auto\n private fillEmptyMeasuresWithWholeRest: FillEmptyMeasuresWithWholeRests | number;\n private arpeggiosGoAcrossVoices: boolean;\n private renderArpeggios: boolean;\n private renderSlurs: boolean;\n private coloringMode: ColoringMode;\n private coloringEnabled: boolean;\n private colorStemsLikeNoteheads: boolean;\n private colorFlags: boolean;\n private colorBeams: boolean;\n private coloringSetCustom: Dictionary;\n private defaultColorNotehead: string;\n private defaultColorRest: string;\n private defaultColorStem: string;\n private defaultColorLabel: string;\n private defaultColorTitle: string;\n private defaultFontFamily: string;\n private defaultFontStyle: FontStyles;\n private maxMeasureToDrawIndex: number;\n private minMeasureToDrawIndex: number;\n /** Whether to render a label for the composer of the piece at the top of the sheet. */\n private renderComposer: boolean;\n private renderTitle: boolean;\n private renderSubtitle: boolean;\n private renderLyricist: boolean;\n private renderPartNames: boolean;\n private renderPartAbbreviations: boolean;\n private renderFingerings: boolean;\n private renderMeasureNumbers: boolean;\n private renderLyrics: boolean;\n private dynamicExpressionMaxDistance: number;\n private dynamicExpressionSpacer: number;\n /** Position of fingering label in relation to corresponding note (left, right supported, above, below experimental) */\n private fingeringPosition: PlacementEnum;\n private fingeringInsideStafflines: boolean;\n private fingeringLabelFontHeight: number;\n private fingeringOffsetX: number;\n private newSystemAtXMLNewSystemAttribute: boolean;\n private newPageAtXMLNewPageAttribute: boolean;\n private pageFormat: PageFormat;\n private pageBackgroundColor: string; // vexflow-color-string (#FFFFFF). Default undefined/transparent.\n private renderSingleHorizontalStaffline: boolean;\n private restoreCursorAfterRerender: boolean;\n\n private static fixStafflineBoundingBox: boolean; // TODO temporary workaround\n\n constructor() {\n // global variables\n this.samplingUnit = EngravingRules.unit * 3;\n\n // Page Label Variables\n this.sheetTitleHeight = 4.0;\n this.sheetSubtitleHeight = 2.0;\n this.sheetMinimumDistanceBetweenTitleAndSubtitle = 1.0;\n this.sheetComposerHeight = 2.0;\n this.sheetAuthorHeight = 2.0;\n\n // Staff sizing Variables\n this.compactMode = false;\n this.pagePlacementEnum = PagePlacementEnum.Down;\n this.pageHeight = 100001.0;\n this.pageTopMargin = 5.0;\n this.pageTopMarginNarrow = 0.0; // for compact mode\n this.pageBottomMargin = 5.0;\n this.pageLeftMargin = 5.0;\n this.pageRightMargin = 5.0;\n this.titleTopDistance = 9.0;\n this.titleBottomDistance = 1.0;\n this.staffDistance = 7.0;\n this.betweenStaffDistance = 5.0;\n this.minimumStaffLineDistance = 4.0;\n this.minSkyBottomDistBetweenStaves = 1.0; // default. compacttight mode sets it to 1.0 (as well).\n\n // System Sizing and Label Variables\n this.staffHeight = 4.0;\n this.tabStaffInterlineHeight = 1.1111;\n this.betweenStaffLinesDistance = EngravingRules.unit;\n this.systemLeftMargin = 0.0;\n this.systemRightMargin = 0.0;\n this.firstSystemMargin = 15.0;\n this.systemLabelsRightMargin = 2.0;\n this.systemComposerDistance = 2.0;\n this.instrumentLabelTextHeight = 2;\n this.minimumDistanceBetweenSystems = 7.0;\n this.minSkyBottomDistBetweenSystems = 5.0;\n this.lastSystemMaxScalingFactor = 1.4;\n\n // autoBeam options\n this.autoBeamNotes = false;\n this.autoBeamOptions = {\n beam_middle_rests_only: false,\n beam_rests: false,\n maintain_stem_directions: false\n };\n\n // Beam Sizing Variables\n this.beamWidth = EngravingRules.unit / 2.0;\n this.beamSpaceWidth = EngravingRules.unit / 3.0;\n this.beamForwardLength = 1.25 * EngravingRules.unit;\n\n // Beam Sizing Variables\n this.clefLeftMargin = 0.5;\n this.clefRightMargin = 0.75;\n this.percussionOneLineCutoff = 4;\n this.percussionForceVoicesOneLineCutoff = 3;\n this.betweenKeySymbolsDistance = 0.2;\n this.keyRightMargin = 0.75;\n this.rhythmRightMargin = 1.25;\n this.showRhythmAgainAfterPartEndOrFinalBarline = true;\n this.inStaffClefScalingFactor = 0.8;\n this.distanceBetweenNaturalAndSymbolWhenCancelling = 0.4;\n\n // Beam Sizing Variables\n this.noteHelperLinesOffset = 0.25;\n this.measureLeftMargin = 0.7;\n this.measureRightMargin = 0.0;\n this.distanceBetweenLastInstructionAndRepetitionBarline = 1.0;\n this.arpeggioDistance = 0.6;\n\n // Stems Variables\n this.staccatoShorteningFactor = 2;\n this.idealStemLength = 3.0;\n this.stemNoteHeadBorderYOffset = 0.2;\n this.stemWidth = 0.13;\n this.stemMargin = 0.2;\n this.stemMinLength = 2.5;\n this.stemMaxLength = 4.5;\n this.beamSlopeMaxAngle = 10.0;\n this.stemMinAllowedDistanceBetweenNoteHeadAndBeamLine = 1.0;\n this.setWantedStemDirectionByXml = true;\n\n // GraceNote Variables\n this.graceNoteScalingFactor = 0.6;\n this.graceNoteXOffset = 0.2;\n\n // Wedge Variables\n this.wedgeOpeningLength = 1.2;\n this.wedgeMeasureEndOpeningLength = 0.75;\n this.wedgeMeasureBeginOpeningLength = 0.75;\n this.wedgePlacementAboveY = -1.5;\n this.wedgePlacementBelowY = 1.5;\n this.wedgeHorizontalMargin = 0.6;\n this.wedgeVerticalMargin = 0.5;\n this.distanceOffsetBetweenTwoHorizontallyCrossedWedges = 0.3;\n this.wedgeMinLength = 2.0;\n this.distanceBetweenAdjacentDynamics = 0.75;\n\n // Tempo Variables\n this.tempoChangeMeasureValidity = 4;\n this.tempoContinousFactor = 0.7;\n\n // various\n this.staccatoScalingFactor = 0.8;\n this.betweenDotsDistance = 0.8;\n this.ornamentAccidentalScalingFactor = 0.65;\n this.chordSymbolTextHeight = 2.0;\n this.chordSymbolXSpacing = 1.0;\n this.chordSymbolYOffset = 2.0;\n this.chordSymbolLabelTexts = new Dictionary();\n this.resetChordSymbolLabelTexts(this.chordSymbolLabelTexts);\n\n\n // Tuplets, MeasureNumber and TupletNumber Labels\n this.measureNumberLabelHeight = 1.5 * EngravingRules.unit;\n this.measureNumberLabelOffset = 2;\n this.measureNumberLabelXOffset = -0.5;\n this.tupletsRatioed = false;\n this.tupletsBracketed = false;\n this.tripletsBracketed = false; // special setting for triplets, overrides tuplet setting (for triplets only)\n this.tupletNumberLabelHeight = 1.5 * EngravingRules.unit;\n this.tupletNumberYOffset = 0.5;\n this.labelMarginBorderFactor = 0.1;\n this.tupletVerticalLineLength = 0.5;\n\n // Slur and Tie variables\n this.bezierCurveStepSize = 1000;\n this.calculateCurveParametersArrays();\n this.tieGhostObjectWidth = 0.75;\n this.tieYPositionOffsetFactor = 0.3;\n this.minimumNeededXspaceForTieGhostObject = 1.0;\n this.tieHeightMinimum = 0.28;\n this.tieHeightMaximum = 1.2;\n this.tieHeightInterpolationK = 0.0288;\n this.tieHeightInterpolationD = 0.136;\n this.slurNoteHeadYOffset = 0.5;\n this.slurStemXOffset = 0.3;\n this.slurSlopeMaxAngle = 15.0;\n this.slurTangentMinAngle = 30.0;\n this.slurTangentMaxAngle = 80.0;\n this.slursStartingAtSameStaffEntryYOffset = 0.8;\n\n // Repetitions\n this.repetitionEndingLabelHeight = 2.0;\n this.repetitionEndingLabelXOffset = 0.5;\n this.repetitionEndingLabelYOffset = 0.3;\n this.repetitionEndingLineYLowerOffset = 0.5;\n this.repetitionEndingLineYUpperOffset = 0.3;\n this.voltaOffset = 2.5;\n\n // Lyrics\n this.lyricsAlignmentStandard = TextAlignmentEnum.LeftBottom; // CenterBottom and LeftBottom tested, spacing-optimized\n this.lyricsHeight = 2.0; // actually size of lyrics\n this.lyricsYOffsetToStaffHeight = 3.0; // distance between lyrics and staff. could partly be even lower/dynamic\n this.verticalBetweenLyricsDistance = 0.5;\n this.horizontalBetweenLyricsDistance = 0.2;\n this.betweenSyllableMaximumDistance = 10.0;\n this.betweenSyllableMinimumDistance = 0.5; // + 1.0 for CenterAlignment added in lyrics spacing\n this.lyricOverlapAllowedIntoNextMeasure = 3.4; // optimal for dashed last lyric, see Land der Berge\n this.minimumDistanceBetweenDashes = 10;\n\n // expressions variables\n this.instantaneousTempoTextHeight = 2.3;\n this.continuousDynamicTextHeight = 2.3;\n this.moodTextHeight = 2.3;\n this.unknownTextHeight = 2.0;\n this.continuousTempoTextHeight = 2.3;\n this.dynamicExpressionMaxDistance = 2;\n this.dynamicExpressionSpacer = 0.5;\n\n // Line Widths\n this.staffLineWidth = 0.12;\n this.ledgerLineWidth = undefined; // if not undefined, the vexflow default will be overwritten\n this.ledgerLineStrokeStyle = undefined; // if not undefined, the vexflow default will be overwritten\n this.wedgeLineWidth = 0.12;\n this.tupletLineWidth = 0.12;\n this.lyricUnderscoreLineWidth = 0.12;\n this.systemThinLineWidth = 0.12;\n this.systemBoldLineWidth = EngravingRules.unit / 2.0;\n this.systemRepetitionEndingLineWidth = 0.12;\n this.systemDotWidth = EngravingRules.unit / 5.0;\n this.distanceBetweenVerticalSystemLines = 0.35;\n this.distanceBetweenDotAndLine = 0.7;\n this.octaveShiftLineWidth = 0.12;\n this.octaveShiftVerticalLineLength = EngravingRules.unit;\n this.graceLineWidth = this.staffLineWidth * this.GraceNoteScalingFactor;\n\n // Line Widths\n this.minimumCrossedBeamDifferenceMargin = 0.0001;\n\n // xSpacing Variables\n this.displacedNoteMargin = 0.1;\n this.minNoteDistance = 2.0;\n this.subMeasureXSpacingThreshold = 35;\n this.measureDynamicsMaxScalingFactor = 2.5;\n this.wholeRestXShiftVexflow = -2.5; // VexFlow draws rest notes too far to the right\n this.metronomeMarksDrawn = true;\n this.metronomeMarkXShift = -6; // our unit, is taken * unitInPixels\n this.metronomeMarkYShift = -0.5;\n\n // Render options (whether to render specific or invisible elements)\n this.alignRests = AlignRestOption.Never; // 0 = false, 1 = true, 2 = auto\n this.fillEmptyMeasuresWithWholeRest = FillEmptyMeasuresWithWholeRests.No;\n this.arpeggiosGoAcrossVoices = false; // safe option, as otherwise arpeggios will always go across all voices in Vexflow, which is often unwanted\n this.renderArpeggios = true;\n this.renderSlurs = true;\n this.coloringMode = ColoringMode.XML;\n this.coloringEnabled = true;\n this.colorStemsLikeNoteheads = false;\n this.colorBeams = true;\n this.colorFlags = true;\n this.defaultColorNotehead = \"#000000\"; // black. undefined is only black if a note's color hasn't been changed before.\n this.defaultColorRest = this.defaultColorNotehead;\n this.defaultColorStem = this.defaultColorNotehead;\n this.defaultColorLabel = this.defaultColorNotehead;\n this.defaultColorTitle = this.defaultColorNotehead;\n this.defaultFontFamily = \"Times New Roman\"; // what OSMD was initially optimized for\n this.defaultFontStyle = FontStyles.Regular;\n this.maxMeasureToDrawIndex = Number.MAX_VALUE;\n this.minMeasureToDrawIndex = 0;\n this.renderComposer = true;\n this.renderTitle = true;\n this.renderSubtitle = true;\n this.renderLyricist = true;\n this.renderPartNames = true;\n this.renderPartAbbreviations = true;\n this.renderFingerings = true;\n this.renderMeasureNumbers = true;\n this.renderLyrics = true;\n this.fingeringPosition = PlacementEnum.Left; // easier to get bounding box, and safer for vertical layout\n this.fingeringInsideStafflines = false;\n this.fingeringLabelFontHeight = 1.7;\n this.fingeringOffsetX = 0.0;\n this.newSystemAtXMLNewSystemAttribute = false;\n this.newPageAtXMLNewPageAttribute = false;\n this.restoreCursorAfterRerender = true;\n\n EngravingRules.FixStafflineBoundingBox = false; // TODO temporary workaround\n\n this.pageFormat = PageFormat.UndefinedPageFormat; // default: undefined / 'infinite' height page, using the canvas'/container's width and height\n this.pageBackgroundColor = undefined; // default: transparent. half-transparent white: #FFFFFF88\"\n this.renderSingleHorizontalStaffline = false;\n\n this.populateDictionaries();\n try {\n this.maxInstructionsConstValue = this.ClefLeftMargin + this.ClefRightMargin + this.KeyRightMargin + this.RhythmRightMargin + 11;\n //if (FontInfo.Info) {\n // this.maxInstructionsConstValue += FontInfo.Info.getBoundingBox(MusicSymbol.G_CLEF).width\n // + FontInfo.Info.getBoundingBox(MusicSymbol.FOUR).width\n // + 7 * FontInfo.Info.getBoundingBox(MusicSymbol.SHARP).width;\n //}\n } catch (ex) {\n log.info(\"EngravingRules()\", ex);\n }\n }\n\n // these two need to be static so that we can avoid passing EngravingRules to BoundingBox in lots of code\n public static get FixStafflineBoundingBox(): boolean {\n return EngravingRules.fixStafflineBoundingBox;\n }\n public static set FixStafflineBoundingBox(value: boolean) {\n EngravingRules.fixStafflineBoundingBox = value;\n }\n public get SamplingUnit(): number {\n return this.samplingUnit;\n }\n public get SheetTitleHeight(): number {\n return this.sheetTitleHeight;\n }\n public set SheetTitleHeight(value: number) {\n this.sheetTitleHeight = value;\n }\n public get SheetSubtitleHeight(): number {\n return this.sheetSubtitleHeight;\n }\n public set SheetSubtitleHeight(value: number) {\n this.sheetSubtitleHeight = value;\n }\n public get SheetMinimumDistanceBetweenTitleAndSubtitle(): number {\n return this.sheetMinimumDistanceBetweenTitleAndSubtitle;\n }\n public set SheetMinimumDistanceBetweenTitleAndSubtitle(value: number) {\n this.sheetMinimumDistanceBetweenTitleAndSubtitle = value;\n }\n public get SheetComposerHeight(): number {\n return this.sheetComposerHeight;\n }\n public set SheetComposerHeight(value: number) {\n this.sheetComposerHeight = value;\n }\n public get SheetAuthorHeight(): number {\n return this.sheetAuthorHeight;\n }\n public set SheetAuthorHeight(value: number) {\n this.sheetAuthorHeight = value;\n }\n public get PagePlacement(): PagePlacementEnum {\n return this.pagePlacementEnum;\n }\n public set PagePlacement(value: PagePlacementEnum) {\n this.pagePlacementEnum = value;\n }\n public get CompactMode(): boolean {\n return this.compactMode;\n }\n public set CompactMode(value: boolean) {\n this.compactMode = value;\n }\n public get PageHeight(): number {\n return this.pageHeight;\n }\n public set PageHeight(value: number) {\n this.pageHeight = value;\n }\n public get PageTopMargin(): number {\n return this.pageTopMargin;\n }\n public set PageTopMargin(value: number) {\n this.pageTopMargin = value;\n }\n public get PageTopMarginNarrow(): number {\n return this.pageTopMarginNarrow;\n }\n public set PageTopMarginNarrow(value: number) {\n this.pageTopMarginNarrow = value;\n }\n public get PageBottomMargin(): number {\n return this.pageBottomMargin;\n }\n public set PageBottomMargin(value: number) {\n this.pageBottomMargin = value;\n }\n public get PageLeftMargin(): number {\n return this.pageLeftMargin;\n }\n public set PageLeftMargin(value: number) {\n this.pageLeftMargin = value;\n }\n public get PageRightMargin(): number {\n return this.pageRightMargin;\n }\n public set PageRightMargin(value: number) {\n this.pageRightMargin = value;\n }\n public get TitleTopDistance(): number {\n return this.titleTopDistance;\n }\n public set TitleTopDistance(value: number) {\n this.titleTopDistance = value;\n }\n public get TitleBottomDistance(): number {\n return this.titleBottomDistance;\n }\n public set TitleBottomDistance(value: number) {\n this.titleBottomDistance = value;\n }\n public get SystemComposerDistance(): number {\n return this.systemComposerDistance;\n }\n public set SystemComposerDistance(value: number) {\n this.systemComposerDistance = value;\n }\n public get InstrumentLabelTextHeight(): number {\n return this.instrumentLabelTextHeight;\n }\n public set InstrumentLabelTextHeight(value: number) {\n this.instrumentLabelTextHeight = value;\n }\n public get SystemLeftMargin(): number {\n return this.systemLeftMargin;\n }\n public set SystemLeftMargin(value: number) {\n this.systemLeftMargin = value;\n }\n public get SystemRightMargin(): number {\n return this.systemRightMargin;\n }\n public set SystemRightMargin(value: number) {\n this.systemRightMargin = value;\n }\n public get FirstSystemMargin(): number {\n return this.firstSystemMargin;\n }\n public set FirstSystemMargin(value: number) {\n this.firstSystemMargin = value;\n }\n public get SystemLabelsRightMargin(): number {\n return this.systemLabelsRightMargin;\n }\n public set SystemLabelsRightMargin(value: number) {\n this.systemLabelsRightMargin = value;\n }\n public get MinimumDistanceBetweenSystems(): number {\n return this.minimumDistanceBetweenSystems;\n }\n public set MinimumDistanceBetweenSystems(value: number) {\n this.minimumDistanceBetweenSystems = value;\n }\n public get MinSkyBottomDistBetweenSystems(): number {\n return this.minSkyBottomDistBetweenSystems;\n }\n public set MinSkyBottomDistBetweenSystems(value: number) {\n this.minSkyBottomDistBetweenSystems = value;\n }\n public get LastSystemMaxScalingFactor(): number {\n return this.lastSystemMaxScalingFactor;\n }\n public set LastSystemMaxScalingFactor(value: number) {\n this.lastSystemMaxScalingFactor = value;\n }\n public get StaffDistance(): number {\n return this.staffDistance;\n }\n public set StaffDistance(value: number) {\n this.staffDistance = value;\n }\n public get BetweenStaffDistance(): number {\n return this.betweenStaffDistance;\n }\n public set BetweenStaffDistance(value: number) {\n this.betweenStaffDistance = value;\n }\n public get StaffHeight(): number {\n return this.staffHeight;\n }\n public set StaffHeight(value: number) {\n this.staffHeight = value;\n }\n public get TabStaffInterlineHeight(): number {\n return this.tabStaffInterlineHeight;\n }\n public set TabStaffInterlineHeight(value: number) {\n this.tabStaffInterlineHeight = value;\n }\n public get BetweenStaffLinesDistance(): number {\n return this.betweenStaffLinesDistance;\n }\n public set BetweenStaffLinesDistance(value: number) {\n this.betweenStaffLinesDistance = value;\n }\n public get AutoBeamNotes(): boolean {\n return this.autoBeamNotes;\n }\n public set AutoBeamNotes(value: boolean) {\n this.autoBeamNotes = value;\n }\n public get AutoBeamOptions(): AutoBeamOptions {\n return this.autoBeamOptions;\n }\n public set AutoBeamOptions(value: AutoBeamOptions) {\n this.autoBeamOptions = value;\n }\n public get BeamWidth(): number {\n return this.beamWidth;\n }\n public set BeamWidth(value: number) {\n this.beamWidth = value;\n }\n public get BeamSpaceWidth(): number {\n return this.beamSpaceWidth;\n }\n public set BeamSpaceWidth(value: number) {\n this.beamSpaceWidth = value;\n }\n public get BeamForwardLength(): number {\n return this.beamForwardLength;\n }\n public set BeamForwardLength(value: number) {\n this.beamForwardLength = value;\n }\n public get BetweenKeySymbolsDistance(): number {\n return this.betweenKeySymbolsDistance;\n }\n public set BetweenKeySymbolsDistance(value: number) {\n this.betweenKeySymbolsDistance = value;\n }\n public get ClefLeftMargin(): number {\n return this.clefLeftMargin;\n }\n public set ClefLeftMargin(value: number) {\n this.clefLeftMargin = value;\n }\n public get ClefRightMargin(): number {\n return this.clefRightMargin;\n }\n public set ClefRightMargin(value: number) {\n this.clefRightMargin = value;\n }\n public get PercussionOneLineCutoff(): number {\n return this.percussionOneLineCutoff;\n }\n public set PercussionOneLineCutoff(value: number) {\n this.percussionOneLineCutoff = value;\n }\n public get PercussionForceVoicesOneLineCutoff(): number {\n return this.percussionForceVoicesOneLineCutoff;\n }\n public set PercussionForceVoicesOneLineCutoff(value: number) {\n this.percussionForceVoicesOneLineCutoff = value;\n }\n public get KeyRightMargin(): number {\n return this.keyRightMargin;\n }\n public set KeyRightMargin(value: number) {\n this.keyRightMargin = value;\n }\n public get RhythmRightMargin(): number {\n return this.rhythmRightMargin;\n }\n public set RhythmRightMargin(value: number) {\n this.rhythmRightMargin = value;\n }\n public get ShowRhythmAgainAfterPartEndOrFinalBarline(): boolean {\n return this.showRhythmAgainAfterPartEndOrFinalBarline;\n }\n public set ShowRhythmAgainAfterPartEndOrFinalBarline(value: boolean) {\n this.showRhythmAgainAfterPartEndOrFinalBarline = value;\n }\n public get InStaffClefScalingFactor(): number {\n return this.inStaffClefScalingFactor;\n }\n public set InStaffClefScalingFactor(value: number) {\n this.inStaffClefScalingFactor = value;\n }\n public get DistanceBetweenNaturalAndSymbolWhenCancelling(): number {\n return this.distanceBetweenNaturalAndSymbolWhenCancelling;\n }\n public set DistanceBetweenNaturalAndSymbolWhenCancelling(value: number) {\n this.distanceBetweenNaturalAndSymbolWhenCancelling = value;\n }\n public get NoteHelperLinesOffset(): number {\n return this.noteHelperLinesOffset;\n }\n public set NoteHelperLinesOffset(value: number) {\n this.noteHelperLinesOffset = value;\n }\n public get MeasureLeftMargin(): number {\n return this.measureLeftMargin;\n }\n public set MeasureLeftMargin(value: number) {\n this.measureLeftMargin = value;\n }\n public get MeasureRightMargin(): number {\n return this.measureRightMargin;\n }\n public set MeasureRightMargin(value: number) {\n this.measureRightMargin = value;\n }\n public get DistanceBetweenLastInstructionAndRepetitionBarline(): number {\n return this.distanceBetweenLastInstructionAndRepetitionBarline;\n }\n public set DistanceBetweenLastInstructionAndRepetitionBarline(value: number) {\n this.distanceBetweenLastInstructionAndRepetitionBarline = value;\n }\n public get ArpeggioDistance(): number {\n return this.arpeggioDistance;\n }\n public set ArpeggioDistance(value: number) {\n this.arpeggioDistance = value;\n }\n public get StaccatoShorteningFactor(): number {\n return this.staccatoShorteningFactor;\n }\n public set StaccatoShorteningFactor(value: number) {\n this.staccatoShorteningFactor = value;\n }\n public get IdealStemLength(): number {\n return this.idealStemLength;\n }\n public set IdealStemLength(value: number) {\n this.idealStemLength = value;\n }\n public get StemNoteHeadBorderYOffset(): number {\n return this.stemNoteHeadBorderYOffset;\n }\n public set StemNoteHeadBorderYOffset(value: number) {\n this.stemNoteHeadBorderYOffset = value;\n }\n public get StemWidth(): number {\n return this.stemWidth;\n }\n public set StemWidth(value: number) {\n this.stemWidth = value;\n }\n public get StemMargin(): number {\n return this.stemMargin;\n }\n public set StemMargin(value: number) {\n this.stemMargin = value;\n }\n public get StemMinLength(): number {\n return this.stemMinLength;\n }\n public set StemMinLength(value: number) {\n this.stemMinLength = value;\n }\n public get StemMaxLength(): number {\n return this.stemMaxLength;\n }\n public set StemMaxLength(value: number) {\n this.stemMaxLength = value;\n }\n public get BeamSlopeMaxAngle(): number {\n return this.beamSlopeMaxAngle;\n }\n public set BeamSlopeMaxAngle(value: number) {\n this.beamSlopeMaxAngle = value;\n }\n public get StemMinAllowedDistanceBetweenNoteHeadAndBeamLine(): number {\n return this.stemMinAllowedDistanceBetweenNoteHeadAndBeamLine;\n }\n public set StemMinAllowedDistanceBetweenNoteHeadAndBeamLine(value: number) {\n this.stemMinAllowedDistanceBetweenNoteHeadAndBeamLine = value;\n }\n public get SetWantedStemDirectionByXml(): boolean {\n return this.setWantedStemDirectionByXml;\n }\n public set SetWantedStemDirectionByXml(value: boolean) {\n this.setWantedStemDirectionByXml = value;\n }\n public get GraceNoteScalingFactor(): number {\n return this.graceNoteScalingFactor;\n }\n public set GraceNoteScalingFactor(value: number) {\n this.graceNoteScalingFactor = value;\n }\n public get GraceNoteXOffset(): number {\n return this.graceNoteXOffset;\n }\n public set GraceNoteXOffset(value: number) {\n this.graceNoteXOffset = value;\n }\n public get WedgeOpeningLength(): number {\n return this.wedgeOpeningLength;\n }\n public set WedgeOpeningLength(value: number) {\n this.wedgeOpeningLength = value;\n }\n public get WedgeMeasureEndOpeningLength(): number {\n return this.wedgeMeasureEndOpeningLength;\n }\n public set WedgeMeasureEndOpeningLength(value: number) {\n this.wedgeMeasureEndOpeningLength = value;\n }\n public get WedgeMeasureBeginOpeningLength(): number {\n return this.wedgeMeasureBeginOpeningLength;\n }\n public set WedgeMeasureBeginOpeningLength(value: number) {\n this.wedgeMeasureBeginOpeningLength = value;\n }\n public get WedgePlacementAboveY(): number {\n return this.wedgePlacementAboveY;\n }\n public set WedgePlacementAboveY(value: number) {\n this.wedgePlacementAboveY = value;\n }\n public get WedgePlacementBelowY(): number {\n return this.wedgePlacementBelowY;\n }\n public set WedgePlacementBelowY(value: number) {\n this.wedgePlacementBelowY = value;\n }\n public get WedgeHorizontalMargin(): number {\n return this.wedgeHorizontalMargin;\n }\n public set WedgeHorizontalMargin(value: number) {\n this.wedgeHorizontalMargin = value;\n }\n public get WedgeVerticalMargin(): number {\n return this.wedgeVerticalMargin;\n }\n public set WedgeVerticalMargin(value: number) {\n this.wedgeVerticalMargin = value;\n }\n public get DistanceOffsetBetweenTwoHorizontallyCrossedWedges(): number {\n return this.distanceOffsetBetweenTwoHorizontallyCrossedWedges;\n }\n public set DistanceOffsetBetweenTwoHorizontallyCrossedWedges(value: number) {\n this.distanceOffsetBetweenTwoHorizontallyCrossedWedges = value;\n }\n public get WedgeMinLength(): number {\n return this.wedgeMinLength;\n }\n public set WedgeMinLength(value: number) {\n this.wedgeMinLength = value;\n }\n public get DistanceBetweenAdjacentDynamics(): number {\n return this.distanceBetweenAdjacentDynamics;\n }\n public set DistanceBetweenAdjacentDynamics(value: number) {\n this.distanceBetweenAdjacentDynamics = value;\n }\n public get TempoChangeMeasureValidity(): number {\n return this.tempoChangeMeasureValidity;\n }\n public set TempoChangeMeasureValidity(value: number) {\n this.tempoChangeMeasureValidity = value;\n }\n public get TempoContinousFactor(): number {\n return this.tempoContinousFactor;\n }\n public set TempoContinousFactor(value: number) {\n this.tempoContinousFactor = value;\n }\n public get StaccatoScalingFactor(): number {\n return this.staccatoScalingFactor;\n }\n public set StaccatoScalingFactor(value: number) {\n this.staccatoScalingFactor = value;\n }\n public get BetweenDotsDistance(): number {\n return this.betweenDotsDistance;\n }\n public set BetweenDotsDistance(value: number) {\n this.betweenDotsDistance = value;\n }\n public get OrnamentAccidentalScalingFactor(): number {\n return this.ornamentAccidentalScalingFactor;\n }\n public set OrnamentAccidentalScalingFactor(value: number) {\n this.ornamentAccidentalScalingFactor = value;\n }\n public get ChordSymbolTextHeight(): number {\n return this.chordSymbolTextHeight;\n }\n public set ChordSymbolTextHeight(value: number) {\n this.chordSymbolTextHeight = value;\n }\n public get ChordSymbolXSpacing(): number {\n return this.chordSymbolXSpacing;\n }\n public set ChordSymbolXSpacing(value: number) {\n this.chordSymbolXSpacing = value;\n }\n public get ChordSymbolYOffset(): number {\n return this.chordSymbolYOffset;\n }\n public set ChordSymbolYOffset(value: number) {\n this.chordSymbolYOffset = value;\n }\n public setChordSymbolLabelText(key: ChordSymbolEnum, value: string): void {\n this.chordSymbolLabelTexts.setValue(key, value);\n }\n public get ChordSymbolLabelTexts(): Dictionary {\n return this.chordSymbolLabelTexts;\n }\n public set ChordSymbolLabelTexts(value: Dictionary) {\n this.chordSymbolLabelTexts = value;\n }\n public get MeasureNumberLabelHeight(): number {\n return this.measureNumberLabelHeight;\n }\n public set MeasureNumberLabelHeight(value: number) {\n this.measureNumberLabelHeight = value;\n }\n public get MeasureNumberLabelOffset(): number {\n return this.measureNumberLabelOffset;\n }\n public set MeasureNumberLabelOffset(value: number) {\n this.measureNumberLabelOffset = value;\n }\n public get MeasureNumberLabelXOffset(): number {\n return this.measureNumberLabelXOffset;\n }\n public set MeasureNumberLabelXOffset(value: number) {\n this.measureNumberLabelXOffset = value;\n }\n public get TupletsRatioed(): boolean {\n return this.tupletsRatioed;\n }\n public set TupletsRatioed(value: boolean) {\n this.tupletsRatioed = value;\n }\n public get TupletsBracketed(): boolean {\n return this.tupletsBracketed;\n }\n public set TupletsBracketed(value: boolean) {\n this.tupletsBracketed = value;\n }\n public get TripletsBracketed(): boolean {\n return this.tripletsBracketed;\n }\n public set TripletsBracketed(value: boolean) {\n this.tripletsBracketed = value;\n }\n public get TupletNumberLabelHeight(): number {\n return this.tupletNumberLabelHeight;\n }\n public set TupletNumberLabelHeight(value: number) {\n this.tupletNumberLabelHeight = value;\n }\n public get TupletNumberYOffset(): number {\n return this.tupletNumberYOffset;\n }\n public set TupletNumberYOffset(value: number) {\n this.tupletNumberYOffset = value;\n }\n public get LabelMarginBorderFactor(): number {\n return this.labelMarginBorderFactor;\n }\n public set LabelMarginBorderFactor(value: number) {\n this.labelMarginBorderFactor = value;\n }\n public get TupletVerticalLineLength(): number {\n return this.tupletVerticalLineLength;\n }\n public set TupletVerticalLineLength(value: number) {\n this.tupletVerticalLineLength = value;\n }\n public get RepetitionEndingLabelHeight(): number {\n return this.repetitionEndingLabelHeight;\n }\n public set RepetitionEndingLabelHeight(value: number) {\n this.repetitionEndingLabelHeight = value;\n }\n public get RepetitionEndingLabelXOffset(): number {\n return this.repetitionEndingLabelXOffset;\n }\n public set RepetitionEndingLabelXOffset(value: number) {\n this.repetitionEndingLabelXOffset = value;\n }\n public get RepetitionEndingLabelYOffset(): number {\n return this.repetitionEndingLabelYOffset;\n }\n public set RepetitionEndingLabelYOffset(value: number) {\n this.repetitionEndingLabelYOffset = value;\n }\n public get RepetitionEndingLineYLowerOffset(): number {\n return this.repetitionEndingLineYLowerOffset;\n }\n public set RepetitionEndingLineYLowerOffset(value: number) {\n this.repetitionEndingLineYLowerOffset = value;\n }\n public get RepetitionEndingLineYUpperOffset(): number {\n return this.repetitionEndingLineYUpperOffset;\n }\n public set RepetitionEndingLineYUpperOffset(value: number) {\n this.repetitionEndingLineYUpperOffset = value;\n }\n public get VoltaOffset(): number {\n return this.voltaOffset;\n }\n public set VoltaOffset(value: number) {\n this.voltaOffset = value;\n }\n public get LyricsAlignmentStandard(): TextAlignmentEnum {\n return this.lyricsAlignmentStandard;\n }\n public set LyricsAlignmentStandard(value: TextAlignmentEnum) {\n this.lyricsAlignmentStandard = value;\n }\n public get LyricsHeight(): number {\n return this.lyricsHeight;\n }\n public set LyricsHeight(value: number) {\n this.lyricsHeight = value;\n }\n public get LyricsYOffsetToStaffHeight(): number {\n return this.lyricsYOffsetToStaffHeight;\n }\n public set LyricsYOffsetToStaffHeight(value: number) {\n this.lyricsYOffsetToStaffHeight = value;\n }\n public get VerticalBetweenLyricsDistance(): number {\n return this.verticalBetweenLyricsDistance;\n }\n public set VerticalBetweenLyricsDistance(value: number) {\n this.verticalBetweenLyricsDistance = value;\n }\n public get HorizontalBetweenLyricsDistance(): number {\n return this.horizontalBetweenLyricsDistance;\n }\n public set HorizontalBetweenLyricsDistance(value: number) {\n this.horizontalBetweenLyricsDistance = value;\n }\n public get BetweenSyllableMaximumDistance(): number {\n return this.betweenSyllableMaximumDistance;\n }\n public set BetweenSyllableMaximumDistance(value: number) {\n this.betweenSyllableMaximumDistance = value;\n }\n public get BetweenSyllableMinimumDistance(): number {\n return this.betweenSyllableMinimumDistance;\n }\n public set BetweenSyllableMinimumDistance(value: number) {\n this.betweenSyllableMinimumDistance = value;\n }\n public get LyricOverlapAllowedIntoNextMeasure(): number {\n return this.lyricOverlapAllowedIntoNextMeasure;\n }\n public set LyricOverlapAllowedIntoNextMeasure(value: number) {\n this.lyricOverlapAllowedIntoNextMeasure = value;\n }\n public get MinimumDistanceBetweenDashes(): number {\n return this.minimumDistanceBetweenDashes;\n }\n public set MinimumDistanceBetweenDashes(value: number) {\n this.minimumDistanceBetweenDashes = value;\n }\n public get BezierCurveStepSize(): number {\n return this.bezierCurveStepSize;\n }\n public set BezierCurveStepSize(value: number) {\n this.bezierCurveStepSize = value;\n }\n public get TPow3(): number[] {\n return this.tPower3;\n }\n public set TPow3(value: number[]) {\n this.tPower3 = value;\n }\n public get OneMinusTPow3(): number[] {\n return this.oneMinusTPower3;\n }\n public set OneMinusTPow3(value: number[]) {\n this.oneMinusTPower3 = value;\n }\n public get BezierFactorOne(): number[] {\n return this.factorOne;\n }\n public set BezierFactorOne(value: number[]) {\n this.factorOne = value;\n }\n public get BezierFactorTwo(): number[] {\n return this.factorTwo;\n }\n public set BezierFactorTwo(value: number[]) {\n this.factorTwo = value;\n }\n public get TieGhostObjectWidth(): number {\n return this.tieGhostObjectWidth;\n }\n public set TieGhostObjectWidth(value: number) {\n this.tieGhostObjectWidth = value;\n }\n public get TieYPositionOffsetFactor(): number {\n return this.tieYPositionOffsetFactor;\n }\n public set TieYPositionOffsetFactor(value: number) {\n this.tieYPositionOffsetFactor = value;\n }\n public get MinimumNeededXspaceForTieGhostObject(): number {\n return this.minimumNeededXspaceForTieGhostObject;\n }\n public set MinimumNeededXspaceForTieGhostObject(value: number) {\n this.minimumNeededXspaceForTieGhostObject = value;\n }\n public get TieHeightMinimum(): number {\n return this.tieHeightMinimum;\n }\n public set TieHeightMinimum(value: number) {\n this.tieHeightMinimum = value;\n }\n public get TieHeightMaximum(): number {\n return this.tieHeightMaximum;\n }\n public set TieHeightMaximum(value: number) {\n this.tieHeightMaximum = value;\n }\n public get TieHeightInterpolationK(): number {\n return this.tieHeightInterpolationK;\n }\n public set TieHeightInterpolationK(value: number) {\n this.tieHeightInterpolationK = value;\n }\n public get TieHeightInterpolationD(): number {\n return this.tieHeightInterpolationD;\n }\n public set TieHeightInterpolationD(value: number) {\n this.tieHeightInterpolationD = value;\n }\n public get SlurNoteHeadYOffset(): number {\n return this.slurNoteHeadYOffset;\n }\n public set SlurNoteHeadYOffset(value: number) {\n this.slurNoteHeadYOffset = value;\n }\n public get SlurStemXOffset(): number {\n return this.slurStemXOffset;\n }\n public set SlurStemXOffset(value: number) {\n this.slurStemXOffset = value;\n }\n public get SlurSlopeMaxAngle(): number {\n return this.slurSlopeMaxAngle;\n }\n public set SlurSlopeMaxAngle(value: number) {\n this.slurSlopeMaxAngle = value;\n }\n public get SlurTangentMinAngle(): number {\n return this.slurTangentMinAngle;\n }\n public set SlurTangentMinAngle(value: number) {\n this.slurTangentMinAngle = value;\n }\n public get SlurTangentMaxAngle(): number {\n return this.slurTangentMaxAngle;\n }\n public set SlurTangentMaxAngle(value: number) {\n this.slurTangentMaxAngle = value;\n }\n public get SlursStartingAtSameStaffEntryYOffset(): number {\n return this.slursStartingAtSameStaffEntryYOffset;\n }\n public set SlursStartingAtSameStaffEntryYOffset(value: number) {\n this.slursStartingAtSameStaffEntryYOffset = value;\n }\n public get InstantaneousTempoTextHeight(): number {\n return this.instantaneousTempoTextHeight;\n }\n public set InstantaneousTempoTextHeight(value: number) {\n this.instantaneousTempoTextHeight = value;\n }\n public get ContinuousDynamicTextHeight(): number {\n return this.continuousDynamicTextHeight;\n }\n public set ContinuousDynamicTextHeight(value: number) {\n this.continuousDynamicTextHeight = value;\n }\n public get MoodTextHeight(): number {\n return this.moodTextHeight;\n }\n public set MoodTextHeight(value: number) {\n this.moodTextHeight = value;\n }\n public get ContinuousTempoTextHeight(): number {\n return this.continuousTempoTextHeight;\n }\n public set ContinuousTempoTextHeight(value: number) {\n this.continuousTempoTextHeight = value;\n }\n /** Distance of expressions inside a group */\n public get DynamicExpressionMaxDistance(): number {\n return this.dynamicExpressionMaxDistance;\n }\n public set DynamicExpressionMaxDistance(value: number) {\n this.dynamicExpressionMaxDistance = value;\n }\n /** Space between expressions in a group */\n public get DynamicExpressionSpacer(): number {\n return this.dynamicExpressionSpacer;\n }\n public set DynamicExpressionSpacer(value: number) {\n this.dynamicExpressionSpacer = value;\n }\n\n public get UnknownTextHeight(): number {\n return this.unknownTextHeight;\n }\n public set UnknownTextHeight(value: number) {\n this.unknownTextHeight = value;\n }\n public get StaffLineWidth(): number {\n return this.staffLineWidth;\n }\n public set StaffLineWidth(value: number) {\n this.staffLineWidth = value;\n }\n public get LedgerLineWidth(): number {\n return this.ledgerLineWidth;\n }\n public set LedgerLineWidth(value: number) {\n this.ledgerLineWidth = value;\n }\n public get LedgerLineStrokeStyle(): string {\n return this.ledgerLineStrokeStyle;\n }\n public set LedgerLineStrokeStyle(value: string) {\n this.ledgerLineStrokeStyle = value;\n }\n public get WedgeLineWidth(): number {\n return this.wedgeLineWidth;\n }\n public set WedgeLineWidth(value: number) {\n this.wedgeLineWidth = value;\n }\n public get TupletLineWidth(): number {\n return this.tupletLineWidth;\n }\n public set TupletLineWidth(value: number) {\n this.tupletLineWidth = value;\n }\n public get LyricUnderscoreLineWidth(): number {\n return this.lyricUnderscoreLineWidth;\n }\n public set LyricUnderscoreLineWidth(value: number) {\n this.lyricUnderscoreLineWidth = value;\n }\n public get SystemThinLineWidth(): number {\n return this.systemThinLineWidth;\n }\n public set SystemThinLineWidth(value: number) {\n this.systemThinLineWidth = value;\n }\n public get SystemBoldLineWidth(): number {\n return this.systemBoldLineWidth;\n }\n public set SystemBoldLineWidth(value: number) {\n this.systemBoldLineWidth = value;\n }\n public get SystemRepetitionEndingLineWidth(): number {\n return this.systemRepetitionEndingLineWidth;\n }\n public set SystemRepetitionEndingLineWidth(value: number) {\n this.systemRepetitionEndingLineWidth = value;\n }\n public get SystemDotWidth(): number {\n return this.systemDotWidth;\n }\n public set SystemDotWidth(value: number) {\n this.systemDotWidth = value;\n }\n public get DistanceBetweenVerticalSystemLines(): number {\n return this.distanceBetweenVerticalSystemLines;\n }\n public set DistanceBetweenVerticalSystemLines(value: number) {\n this.distanceBetweenVerticalSystemLines = value;\n }\n public get DistanceBetweenDotAndLine(): number {\n return this.distanceBetweenDotAndLine;\n }\n public set DistanceBetweenDotAndLine(value: number) {\n this.distanceBetweenDotAndLine = value;\n }\n public get OctaveShiftLineWidth(): number {\n return this.octaveShiftLineWidth;\n }\n public set OctaveShiftLineWidth(value: number) {\n this.octaveShiftLineWidth = value;\n }\n public get OctaveShiftVerticalLineLength(): number {\n return this.octaveShiftVerticalLineLength;\n }\n public set OctaveShiftVerticalLineLength(value: number) {\n this.octaveShiftVerticalLineLength = value;\n }\n public get GraceLineWidth(): number {\n return this.graceLineWidth;\n }\n public set GraceLineWidth(value: number) {\n this.graceLineWidth = value;\n }\n public get MinimumStaffLineDistance(): number {\n return this.minimumStaffLineDistance;\n }\n public set MinimumStaffLineDistance(value: number) {\n this.minimumStaffLineDistance = value;\n }\n public get MinSkyBottomDistBetweenStaves(): number {\n return this.minSkyBottomDistBetweenStaves;\n }\n public set MinSkyBottomDistBetweenStaves(value: number) {\n this.minSkyBottomDistBetweenStaves = value;\n }\n public get MinimumCrossedBeamDifferenceMargin(): number {\n return this.minimumCrossedBeamDifferenceMargin;\n }\n public set MinimumCrossedBeamDifferenceMargin(value: number) {\n this.minimumCrossedBeamDifferenceMargin = value;\n }\n public get DisplacedNoteMargin(): number {\n return this.displacedNoteMargin;\n }\n public set DisplacedNoteMargin(value: number) {\n this.displacedNoteMargin = value;\n }\n public get MinNoteDistance(): number {\n return this.minNoteDistance;\n }\n public set MinNoteDistance(value: number) {\n this.minNoteDistance = value;\n }\n public get SubMeasureXSpacingThreshold(): number {\n return this.subMeasureXSpacingThreshold;\n }\n public set SubMeasureXSpacingThreshold(value: number) {\n this.subMeasureXSpacingThreshold = value;\n }\n public get MeasureDynamicsMaxScalingFactor(): number {\n return this.measureDynamicsMaxScalingFactor;\n }\n public set MeasureDynamicsMaxScalingFactor(value: number) {\n this.measureDynamicsMaxScalingFactor = value;\n }\n public get WholeRestXShiftVexflow(): number {\n return this.wholeRestXShiftVexflow;\n }\n public set WholeRestXShiftVexflow(value: number) {\n this.wholeRestXShiftVexflow = value;\n }\n public get MetronomeMarksDrawn(): boolean {\n return this.metronomeMarksDrawn;\n }\n public set MetronomeMarksDrawn(value: boolean) {\n this.metronomeMarksDrawn = value;\n }\n public get MetronomeMarkXShift(): number {\n return this.metronomeMarkXShift;\n }\n public set MetronomeMarkXShift(value: number) {\n this.metronomeMarkXShift = value;\n }\n public get MetronomeMarkYShift(): number {\n return this.metronomeMarkYShift;\n }\n public set MetronomeMarkYShift(value: number) {\n this.metronomeMarkYShift = value;\n }\n public get MaxInstructionsConstValue(): number {\n return this.maxInstructionsConstValue;\n }\n public set MaxInstructionsConstValue(value: number) {\n this.maxInstructionsConstValue = value;\n }\n public get NoteDistances(): number[] {\n return this.noteDistances;\n }\n public set NoteDistances(value: number[]) {\n this.noteDistances = value;\n }\n public get NoteDistancesScalingFactors(): number[] {\n return this.noteDistancesScalingFactors;\n }\n public set NoteDistancesScalingFactors(value: number[]) {\n this.noteDistancesScalingFactors = value;\n }\n public get DurationDistanceDict(): {[_: number]: number; } {\n return this.durationDistanceDict;\n }\n public get DurationScalingDistanceDict(): {[_: number]: number; } {\n return this.durationScalingDistanceDict;\n }\n public get AlignRests(): number {\n return this.alignRests;\n }\n public set AlignRests(value: number) {\n this.alignRests = value;\n }\n public get FillEmptyMeasuresWithWholeRest(): FillEmptyMeasuresWithWholeRests | number {\n return this.fillEmptyMeasuresWithWholeRest;\n }\n public set FillEmptyMeasuresWithWholeRest(value: FillEmptyMeasuresWithWholeRests | number) {\n this.fillEmptyMeasuresWithWholeRest = value;\n }\n public get ArpeggiosGoAcrossVoices(): boolean {\n return this.arpeggiosGoAcrossVoices;\n }\n public set ArpeggiosGoAcrossVoices(value: boolean) {\n this.arpeggiosGoAcrossVoices = value;\n }\n public get RenderArpeggios(): boolean {\n return this.renderArpeggios;\n }\n public set RenderArpeggios(value: boolean) {\n this.renderArpeggios = value;\n }\n\n public get RenderSlurs(): boolean {\n return this.renderSlurs;\n }\n public set RenderSlurs(value: boolean) {\n this.renderSlurs = value;\n }\n public get ColoringMode(): ColoringMode {\n return this.coloringMode;\n }\n public set ColoringMode(value: ColoringMode) {\n this.coloringMode = value;\n }\n public get ColoringEnabled(): boolean {\n return this.coloringEnabled;\n }\n public set ColoringEnabled(value: boolean) {\n this.coloringEnabled = value;\n }\n public get ColorStemsLikeNoteheads(): boolean {\n return this.colorStemsLikeNoteheads;\n }\n public set ColorStemsLikeNoteheads(value: boolean) {\n this.colorStemsLikeNoteheads = value;\n }\n public get ColorFlags(): boolean {\n return this.colorFlags;\n }\n public set ColorFlags(value: boolean) {\n this.colorFlags = value;\n }\n public get ColorBeams(): boolean {\n return this.colorBeams;\n }\n public set ColorBeams(value: boolean) {\n this.colorBeams = value;\n }\n public get ColoringSetCurrent(): Dictionary {\n return this.coloringSetCustom;\n }\n public set ColoringSetCurrent(value: Dictionary) {\n this.coloringSetCustom = value;\n }\n public get DefaultColorNotehead(): string {\n return this.defaultColorNotehead;\n }\n public set DefaultColorNotehead(value: string) {\n this.defaultColorNotehead = value;\n }\n public get DefaultColorRest(): string {\n return this.defaultColorRest;\n }\n public set DefaultColorRest(value: string) {\n this.defaultColorRest = value;\n }\n public get DefaultColorStem(): string {\n return this.defaultColorStem;\n }\n public set DefaultColorStem(value: string) {\n this.defaultColorStem = value;\n }\n public get DefaultColorLabel(): string {\n return this.defaultColorLabel;\n }\n public set DefaultColorLabel(value: string) {\n this.defaultColorLabel = value;\n }\n public get DefaultColorTitle(): string {\n return this.defaultColorTitle;\n }\n public set DefaultColorTitle(value: string) {\n this.defaultColorTitle = value;\n }\n public get DefaultFontFamily(): string {\n return this.defaultFontFamily;\n }\n public set DefaultFontFamily(value: string) {\n this.defaultFontFamily = value;\n }\n public get DefaultFontStyle(): FontStyles {\n return this.defaultFontStyle;\n }\n public set DefaultFontStyle(value: FontStyles) {\n this.defaultFontStyle = value;\n }\n public get MaxMeasureToDrawIndex(): number {\n return this.maxMeasureToDrawIndex;\n }\n public set MaxMeasureToDrawIndex(value: number) {\n this.maxMeasureToDrawIndex = value;\n }\n public get MinMeasureToDrawIndex(): number {\n return this.minMeasureToDrawIndex;\n }\n public set MinMeasureToDrawIndex(value: number) {\n this.minMeasureToDrawIndex = value;\n }\n public get RenderComposer(): boolean {\n return this.renderComposer;\n }\n public set RenderComposer(value: boolean) {\n this.renderComposer = value;\n }\n public get RenderTitle(): boolean {\n return this.renderTitle;\n }\n public set RenderTitle(value: boolean) {\n this.renderTitle = value;\n }\n public get RenderSubtitle(): boolean {\n return this.renderSubtitle;\n }\n public set RenderSubtitle(value: boolean) {\n this.renderSubtitle = value;\n }\n public get RenderLyricist(): boolean {\n return this.renderLyricist;\n }\n public set RenderLyricist(value: boolean) {\n this.renderLyricist = value;\n }\n public get RenderPartNames(): boolean {\n return this.renderPartNames;\n }\n public set RenderPartNames(value: boolean) {\n this.renderPartNames = value;\n if (!this.renderPartNames) {\n this.renderPartAbbreviations = false;\n }\n }\n public get RenderPartAbbreviations(): boolean {\n return this.renderPartAbbreviations;\n }\n public set RenderPartAbbreviations(value: boolean) {\n this.renderPartAbbreviations = value;\n }\n public get RenderFingerings(): boolean {\n return this.renderFingerings;\n }\n public set RenderFingerings(value: boolean) {\n this.renderFingerings = value;\n }\n public get RenderMeasureNumbers(): boolean {\n return this.renderMeasureNumbers;\n }\n public set RenderMeasureNumbers(value: boolean) {\n this.renderMeasureNumbers = value;\n }\n public get RenderLyrics(): boolean {\n return this.renderLyrics;\n }\n public set RenderLyrics(value: boolean) {\n this.renderLyrics = value;\n }\n public get FingeringPosition(): PlacementEnum {\n return this.fingeringPosition;\n }\n public set FingeringPosition(value: PlacementEnum) {\n this.fingeringPosition = value;\n }\n public get FingeringInsideStafflines(): boolean {\n return this.fingeringInsideStafflines;\n }\n public set FingeringInsideStafflines(value: boolean) {\n this.fingeringInsideStafflines = value;\n }\n public get FingeringLabelFontHeight(): number {\n return this.fingeringLabelFontHeight;\n }\n public set FingeringLabelFontHeight(value: number) {\n this.fingeringLabelFontHeight = value;\n }\n public get FingeringOffsetX(): number {\n return this.fingeringOffsetX;\n }\n public set FingeringOffsetX(value: number) {\n this.fingeringOffsetX = value;\n }\n public get NewSystemAtXMLNewSystemAttribute(): boolean {\n return this.newSystemAtXMLNewSystemAttribute;\n }\n public set NewSystemAtXMLNewSystemAttribute(value: boolean) {\n this.newSystemAtXMLNewSystemAttribute = value;\n }\n public get NewPageAtXMLNewPageAttribute(): boolean {\n return this.newPageAtXMLNewPageAttribute;\n }\n public set NewPageAtXMLNewPageAttribute(value: boolean) {\n this.newPageAtXMLNewPageAttribute = value;\n }\n public get PageFormat(): PageFormat {\n return this.pageFormat;\n }\n public set PageFormat(value: PageFormat) {\n this.pageFormat = value;\n }\n public get PageBackgroundColor(): string {\n return this.pageBackgroundColor;\n }\n public set PageBackgroundColor(value: string) {\n this.pageBackgroundColor = value;\n }\n public get RenderSingleHorizontalStaffline(): boolean {\n return this.renderSingleHorizontalStaffline;\n }\n public set RenderSingleHorizontalStaffline(value: boolean) {\n this.renderSingleHorizontalStaffline = value;\n }\n public get RestoreCursorAfterRerender(): boolean {\n return this.restoreCursorAfterRerender;\n }\n public set RestoreCursorAfterRerender(value: boolean) {\n this.restoreCursorAfterRerender = value;\n }\n\n public resetChordSymbolLabelTexts(chordtexts: Dictionary): Dictionary {\n chordtexts.setValue(ChordSymbolEnum.minor, \"m\");\n chordtexts.setValue(ChordSymbolEnum.augmented, \"aug\");\n chordtexts.setValue(ChordSymbolEnum.diminished, \"dim\");\n chordtexts.setValue(ChordSymbolEnum.dominant, \"7\");\n chordtexts.setValue(ChordSymbolEnum.majorseventh, \"maj7\");\n chordtexts.setValue(ChordSymbolEnum.minorseventh, \"m7\");\n chordtexts.setValue(ChordSymbolEnum.diminishedseventh, \"dim7\");\n chordtexts.setValue(ChordSymbolEnum.augmentedseventh, \"aug7\");\n chordtexts.setValue(ChordSymbolEnum.halfdiminished, \"m7b5\");\n chordtexts.setValue(ChordSymbolEnum.majorminor, \"m(maj7)\");\n chordtexts.setValue(ChordSymbolEnum.majorsixth, \"maj6\");\n chordtexts.setValue(ChordSymbolEnum.minorsixth, \"m6\");\n chordtexts.setValue(ChordSymbolEnum.dominantninth, \"9\");\n chordtexts.setValue(ChordSymbolEnum.majorninth, \"maj9\");\n chordtexts.setValue(ChordSymbolEnum.minorninth, \"m9\");\n chordtexts.setValue(ChordSymbolEnum.dominant11th, \"11\");\n chordtexts.setValue(ChordSymbolEnum.major11th, \"maj11\");\n chordtexts.setValue(ChordSymbolEnum.minor11th, \"m11\");\n chordtexts.setValue(ChordSymbolEnum.dominant13th, \"13\");\n chordtexts.setValue(ChordSymbolEnum.major13th, \"maj13\");\n chordtexts.setValue(ChordSymbolEnum.minor13th, \"m13\");\n chordtexts.setValue(ChordSymbolEnum.suspendedsecond, \"sus2\");\n chordtexts.setValue(ChordSymbolEnum.suspendedfourth, \"sus4\");\n chordtexts.setValue(ChordSymbolEnum.power, \"5\");\n\n return chordtexts;\n }\n\n /**\n * This method maps NoteDurations to Distances and DistancesScalingFactors.\n */\n private populateDictionaries(): void {\n for (let i: number = 0; i < this.noteDistances.length; i++) {\n switch (i) {\n case 0:\n this.durationDistanceDict[0.015625] = this.noteDistances[i];\n this.durationScalingDistanceDict[0.015625] = this.noteDistancesScalingFactors[i];\n break;\n case 1:\n this.durationDistanceDict[0.03125] = this.noteDistances[i];\n this.durationScalingDistanceDict[0.03125] = this.noteDistancesScalingFactors[i];\n break;\n case 2:\n this.durationDistanceDict[0.0625] = this.noteDistances[i];\n this.durationScalingDistanceDict[0.0625] = this.noteDistancesScalingFactors[i];\n break;\n case 3:\n this.durationDistanceDict[0.125] = this.noteDistances[i];\n this.durationScalingDistanceDict[0.125] = this.noteDistancesScalingFactors[i];\n break;\n case 4:\n this.durationDistanceDict[0.25] = this.noteDistances[i];\n this.durationScalingDistanceDict[0.25] = this.noteDistancesScalingFactors[i];\n break;\n case 5:\n this.durationDistanceDict[0.5] = this.noteDistances[i];\n this.durationScalingDistanceDict[0.5] = this.noteDistancesScalingFactors[i];\n break;\n case 6:\n this.durationDistanceDict[1.0] = this.noteDistances[i];\n this.durationScalingDistanceDict[1.0] = this.noteDistancesScalingFactors[i];\n break;\n case 7:\n this.durationDistanceDict[2.0] = this.noteDistances[i];\n this.durationScalingDistanceDict[2.0] = this.noteDistancesScalingFactors[i];\n break;\n default:\n // FIXME\n }\n }\n }\n\n /**\n * Calculate Curve-independend factors, to be used later in the Slur- and TieCurvePoints calculation\n */\n private calculateCurveParametersArrays(): void {\n this.tPower3 = new Array(this.bezierCurveStepSize);\n this.oneMinusTPower3 = new Array(this.bezierCurveStepSize);\n this.factorOne = new Array(this.bezierCurveStepSize);\n this.factorTwo = new Array(this.bezierCurveStepSize);\n for (let i: number = 0; i < this.bezierCurveStepSize; i++) {\n const t: number = i / this.bezierCurveStepSize;\n this.tPower3[i] = Math.pow(t, 3);\n this.oneMinusTPower3[i] = Math.pow((1 - t), 3);\n this.factorOne[i] = 3 * Math.pow((1 - t), 2) * t;\n this.factorTwo[i] = 3 * (1 - t) * Math.pow(t, 2);\n }\n }\n}\n\n// TODO maybe this should be moved to OSMDOptions. Also see OpenSheetMusicDisplay.PageFormatStandards\nexport class PageFormat {\n constructor(width: number, height: number, idString: string = \"noIdStringGiven\") {\n this.width = width;\n this.height = height;\n this.idString = idString;\n }\n public width: number;\n public height: number;\n public idString: string;\n public get aspectRatio(): number {\n if (!this.IsUndefined) {\n return this.width / this.height;\n } else {\n return 0; // infinite page height\n }\n }\n /** Undefined page format: use default page format. */\n public get IsUndefined(): boolean {\n return this.width === undefined || this.height === undefined || this.height === 0 || this.width === 0;\n }\n\n public static get UndefinedPageFormat(): PageFormat {\n return new PageFormat(0, 0);\n }\n\n public Equals(otherPageFormat: PageFormat): boolean {\n if (!otherPageFormat) {\n return false;\n }\n return otherPageFormat.width === this.width && otherPageFormat.height === this.height;\n }\n}\n","import {VoiceEntry, StemDirectionType} from \"./VoiceEntry\";\nimport {SourceStaffEntry} from \"./SourceStaffEntry\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {Pitch} from \"../../Common/DataObjects/Pitch\";\nimport {Beam} from \"./Beam\";\nimport {Tuplet} from \"./Tuplet\";\nimport {Tie} from \"./Tie\";\nimport {Staff} from \"./Staff\";\nimport {Slur} from \"./Expressions/ContinuousExpressions/Slur\";\nimport {NoteState} from \"../Graphical/DrawingEnums\";\nimport {Notehead} from \"./Notehead\";\nimport {Arpeggio} from \"./Arpeggio\";\nimport {NoteType} from \"./NoteType\";\n\n/**\n * Represents a single pitch with a duration (length)\n */\nexport class Note {\n\n constructor(voiceEntry: VoiceEntry, parentStaffEntry: SourceStaffEntry, length: Fraction, pitch: Pitch) {\n this.voiceEntry = voiceEntry;\n this.parentStaffEntry = parentStaffEntry;\n this.length = length;\n this.pitch = pitch;\n if (pitch) {\n this.halfTone = pitch.getHalfTone();\n } else {\n this.halfTone = 0;\n }\n }\n\n /**\n * The transposed (!!!) HalfTone of this note.\n */\n public halfTone: number;\n public state: NoteState;\n private voiceEntry: VoiceEntry;\n private parentStaffEntry: SourceStaffEntry;\n private length: Fraction;\n /** The length/duration given in the tag. different from length for tuplets/tremolos. */\n private typeLength: Fraction;\n /** The NoteType given in the XML, e.g. quarter, which can be a normal quarter or tuplet quarter -> can have different length/fraction */\n private noteTypeXml: NoteType;\n /** The amount of notes the tuplet of this note (if there is one) replaces. */\n private normalNotes: number;\n /**\n * The untransposed (!!!) source data.\n */\n private pitch: Pitch;\n private beam: Beam;\n private tuplet: Tuplet;\n private tie: Tie;\n private slurs: Slur[] = [];\n private playbackInstrumentId: string = undefined;\n private notehead: Notehead = undefined;\n /** States whether the note should be displayed. False if xmlNode.attribute(\"print-object\").value = \"no\". */\n private printObject: boolean = true;\n /** The Arpeggio this note is part of. */\n private arpeggio: Arpeggio;\n /** States whether this is a cue note (Stichnote) (smaller size). */\n private isCueNote: boolean;\n /** The stem direction asked for in XML. Not necessarily final or wanted stem direction. */\n private stemDirectionXml: StemDirectionType;\n /** The number of tremolo strokes this note has (16th tremolo = 2 strokes).\n * Could be a Tremolo object in future when there is more data like tremolo between two notes.\n */\n private tremoloStrokes: number;\n /** Color of the stem given in the XML Stem tag. RGB Hexadecimal, like #00FF00.\n * This is not used for rendering, which takes VoiceEntry.StemColor.\n * It is merely given in the note's stem element in XML and stored here for reference.\n * So, to read or change the stem color of a note, modify note.ParentVoiceEntry.StemColor.\n */\n private stemColorXml: string;\n /** Color of the notehead given in the XML Notehead tag. RGB Hexadecimal, like #00FF00.\n * This should not be changed, instead noteheadColor is used and modifiable for Rendering.\n * Needs to be stored here and not in Note.Notehead,\n * because Note.Notehead is undefined for normal Noteheads to save space and time.\n */\n private noteheadColorXml: string;\n /** Color of the notehead currently set/desired for next render. RGB Hexadecimal, like #00FF00.\n * Needs to be stored here and not in Note.Notehead,\n * because Note.Notehead is undefined for normal Noteheads to save space and time.\n */\n private noteheadColor: string;\n private noteheadColorCurrentlyRendered: string;\n\n public get ParentVoiceEntry(): VoiceEntry {\n return this.voiceEntry;\n }\n public set ParentVoiceEntry(value: VoiceEntry) {\n this.voiceEntry = value;\n }\n public get ParentStaffEntry(): SourceStaffEntry {\n return this.parentStaffEntry;\n }\n public get ParentStaff(): Staff {\n return this.parentStaffEntry.ParentStaff;\n }\n public get Length(): Fraction {\n return this.length;\n }\n public set Length(value: Fraction) {\n this.length = value;\n }\n public get TypeLength(): Fraction {\n return this.typeLength;\n }\n public set TypeLength(value: Fraction) {\n this.typeLength = value;\n }\n public get NoteTypeXml(): NoteType {\n return this.noteTypeXml;\n }\n public set NoteTypeXml(value: NoteType) {\n this.noteTypeXml = value;\n }\n public get NormalNotes(): number {\n return this.normalNotes;\n }\n public set NormalNotes(value: number) {\n this.normalNotes = value;\n }\n public get Pitch(): Pitch {\n return this.pitch;\n }\n public get NoteBeam(): Beam {\n return this.beam;\n }\n public set NoteBeam(value: Beam) {\n this.beam = value;\n }\n public set Notehead(value: Notehead) {\n this.notehead = value;\n }\n public get Notehead(): Notehead {\n return this.notehead;\n }\n public get NoteTuplet(): Tuplet {\n return this.tuplet;\n }\n public set NoteTuplet(value: Tuplet) {\n this.tuplet = value;\n }\n public get NoteTie(): Tie {\n return this.tie;\n }\n public set NoteTie(value: Tie) {\n this.tie = value;\n }\n public get NoteSlurs(): Slur[] {\n return this.slurs;\n }\n public set NoteSlurs(value: Slur[]) {\n this.slurs = value;\n }\n public get PlaybackInstrumentId(): string {\n return this.playbackInstrumentId;\n }\n public set PlaybackInstrumentId(value: string) {\n this.playbackInstrumentId = value;\n }\n public get PrintObject(): boolean {\n return this.printObject;\n }\n public set PrintObject(value: boolean) {\n this.printObject = value;\n }\n public get Arpeggio(): Arpeggio {\n return this.arpeggio;\n }\n public set Arpeggio(value: Arpeggio) {\n this.arpeggio = value;\n }\n public get IsCueNote(): boolean {\n return this.isCueNote;\n }\n public set IsCueNote(value: boolean) {\n this.isCueNote = value;\n }\n public get StemDirectionXml(): StemDirectionType {\n return this.stemDirectionXml;\n }\n public set StemDirectionXml(value: StemDirectionType) {\n this.stemDirectionXml = value;\n }\n public get TremoloStrokes(): number {\n return this.tremoloStrokes;\n }\n public set TremoloStrokes(value: number) {\n this.tremoloStrokes = value;\n }\n public get StemColorXml(): string {\n return this.stemColorXml;\n }\n public set StemColorXml(value: string) {\n this.stemColorXml = value;\n }\n public get NoteheadColorXml(): string {\n return this.noteheadColorXml;\n }\n public set NoteheadColorXml(value: string) {\n this.noteheadColorXml = value;\n }\n /** The desired notehead color for the next render. */\n public get NoteheadColor(): string {\n return this.noteheadColor;\n }\n public set NoteheadColor(value: string) {\n this.noteheadColor = value;\n }\n public get NoteheadColorCurrentlyRendered(): string {\n return this.noteheadColorCurrentlyRendered;\n }\n public set NoteheadColorCurrentlyRendered(value: string) {\n this.noteheadColorCurrentlyRendered = value;\n }\n\n public isRest(): boolean {\n return this.Pitch === undefined || this.Pitch === null;\n }\n\n /** Note: May be dangerous to use if ParentStaffEntry.VerticalContainerParent etc is not set.\n * better calculate this directly when you have access to the note's measure.\n * whole rest: length = measure length. (4/4 in a 4/4 time signature, 3/4 in a 3/4 time signature, 1/4 in a 1/4 time signature, etc.)\n * TODO give a Note a reference to its measure?\n */\n public isWholeRest(): boolean {\n return this.isRest() && this.Length.RealValue === this.ParentStaffEntry.VerticalContainerParent.ParentMeasure.ActiveTimeSignature.RealValue;\n }\n\n public ToString(): string {\n if (this.pitch) {\n return this.Pitch.ToString() + \", length: \" + this.length.toString();\n } else {\n return \"rest note, length: \" + this.length.toString();\n }\n }\n public getAbsoluteTimestamp(): Fraction {\n return Fraction.plus(\n this.voiceEntry.Timestamp,\n this.parentStaffEntry.VerticalContainerParent.ParentMeasure.AbsoluteTimestamp\n );\n }\n public checkForDoubleSlur(slur: Slur): boolean {\n for (let idx: number = 0, len: number = this.slurs.length; idx < len; ++idx) {\n const noteSlur: Slur = this.slurs[idx];\n if (\n noteSlur.StartNote !== undefined &&\n noteSlur.EndNote !== undefined &&\n slur.StartNote !== undefined &&\n slur.StartNote === noteSlur.StartNote &&\n noteSlur.EndNote === this\n ) { return true; }\n }\n return false;\n }\n}\n\nexport enum Appearance {\n Normal,\n Grace,\n Cue\n}\n","import {MultiExpression} from \"../MultiExpression\";\nimport { Pitch } from \"../../../../Common/DataObjects/Pitch\";\n\nexport class OctaveShift {\n constructor(type: string, octave: number) {\n this.setOctaveShiftValue(type, octave);\n }\n\n private octaveValue: OctaveEnum;\n private staffNumber: number;\n private startMultiExpression: MultiExpression;\n private endMultiExpression: MultiExpression;\n\n public get Type(): OctaveEnum {\n return this.octaveValue;\n }\n public set Type(value: OctaveEnum) {\n this.octaveValue = value;\n }\n public get StaffNumber(): number {\n return this.staffNumber;\n }\n public set StaffNumber(value: number) {\n this.staffNumber = value;\n }\n public get ParentStartMultiExpression(): MultiExpression {\n return this.startMultiExpression;\n }\n public set ParentStartMultiExpression(value: MultiExpression) {\n this.startMultiExpression = value;\n }\n public get ParentEndMultiExpression(): MultiExpression {\n return this.endMultiExpression;\n }\n public set ParentEndMultiExpression(value: MultiExpression) {\n this.endMultiExpression = value;\n }\n\n private setOctaveShiftValue(type: string, octave: number): void {\n if (octave === 1 && type === \"down\") {\n this.octaveValue = OctaveEnum.VA8;\n } else if (octave === 1 && type === \"up\") {\n this.octaveValue = OctaveEnum.VB8;\n } else if (octave === 2 && type === \"down\") {\n this.octaveValue = OctaveEnum.MA15;\n } else if (octave === 2 && type === \"up\") {\n this.octaveValue = OctaveEnum.MB15;\n } else {\n this.octaveValue = OctaveEnum.NONE;\n }\n }\n\n /**\n * Convert a source (XML) pitch of a note to the pitch needed to draw. E.g. 8va would draw +1 octave so we reduce by 1\n * @param pitch Original pitch\n * @param octaveShiftValue octave shift\n * @returns New pitch with corrected octave shift\n */\n public static getPitchFromOctaveShift(pitch: Pitch, octaveShiftValue: OctaveEnum): Pitch {\n let result: number = pitch.Octave;\n switch (octaveShiftValue) {\n case OctaveEnum.VA8:\n result -= 1;\n break;\n case OctaveEnum.VB8:\n result += 1;\n break;\n case OctaveEnum.MA15:\n result -= 2;\n break;\n case OctaveEnum.MB15:\n result += 2;\n break;\n case OctaveEnum.NONE:\n default:\n result += 0;\n }\n return new Pitch(pitch.FundamentalNote, result, pitch.Accidental);\n }\n}\n\nexport enum OctaveEnum {\n VA8,\n VB8,\n MA15,\n MB15,\n NONE\n}\n","export enum SystemLinesEnum {\n SingleThin = 0, /*SINGLE, [bar-style=regular]*/\n DoubleThin = 1, /*DOUBLE, [bar-style=light-light]*/\n ThinBold = 2, /*END, [bar-style=light-heavy]*/\n BoldThinDots = 3, /*REPEAT_BEGIN, repeat[direction=forward]*/\n DotsThinBold = 4, /*REPEAT_END, repeat[direction=backward]*/\n DotsBoldBoldDots = 5, /*REPEAT_BOTH*/\n None = 6, /* [bar-style=none]*/\n Dotted = 7, /* [bar-style=dotted]*/\n Dashed = 8, /* [bar-style=dashed]*/\n Bold = 9, /* [bar-style=heavy]*/\n BoldThin = 10, /* [bar-style=heavy-light]*/\n DoubleBold = 11, /* [bar-style=heavy-heavy]*/\n Tick = 12, /* [bar-style=tick]*/\n Short = 13 /* [bar-style=short]*/\n}\n\nexport class SystemLinesEnumHelper {\n public static xmlBarlineStyleToSystemLinesEnum(xmlValue: string): SystemLinesEnum {\n if (xmlValue === \"regular\") {\n return SystemLinesEnum.SingleThin;\n } else if (xmlValue === \"dotted\") {\n return SystemLinesEnum.Dotted;\n } else if (xmlValue === \"dashed\") {\n return SystemLinesEnum.Dashed;\n } else if (xmlValue === \"heavy\") {\n return SystemLinesEnum.Bold;\n } else if (xmlValue === \"light-light\") {\n return SystemLinesEnum.DoubleThin;\n } else if (xmlValue === \"light-heavy\") {\n return SystemLinesEnum.ThinBold;\n } else if (xmlValue === \"heavy-light\") {\n return SystemLinesEnum.BoldThin;\n } else if (xmlValue === \"heavy-heavy\") {\n return SystemLinesEnum.DoubleBold;\n } else if (xmlValue === \"tick\") {\n return SystemLinesEnum.Tick;\n } else if (xmlValue === \"short\") {\n return SystemLinesEnum.Short;\n } else if (xmlValue === \"none\") {\n return SystemLinesEnum.None;\n }\n return SystemLinesEnum.SingleThin;\n }\n}\n","import {PlacementEnum, AbstractExpression} from \"../AbstractExpression\";\nimport {MultiExpression} from \"../MultiExpression\";\nimport {Fraction} from \"../../../../Common/DataObjects/Fraction\";\nimport {SourceMeasure} from \"../../SourceMeasure\";\n\nexport class ContinuousDynamicExpression extends AbstractExpression {\n constructor(dynamicType: ContDynamicEnum, placement: PlacementEnum, staffNumber: number, measure: SourceMeasure,\n label: string = \"\") {\n super(placement);\n super.parentMeasure = measure;\n this.dynamicType = dynamicType;\n this.label = label;\n this.staffNumber = staffNumber;\n this.startVolume = -1;\n this.endVolume = -1;\n if (label !== \"\") {\n this.setType();\n }\n }\n\n private static listContinuousDynamicIncreasing: string[] = [\"crescendo\", \"cresc\", \"cresc.\", \"cres.\"];\n private static listContinuousDynamicDecreasing: string[] = [\"decrescendo\", \"decresc\", \"decr.\", \"diminuendo\", \"dim.\", \"dim\"];\n // private static listContinuousDynamicGeneral: string[] = [\"subito\",\"al niente\",\"piu\",\"meno\"];\n private dynamicType: ContDynamicEnum;\n private startMultiExpression: MultiExpression;\n private endMultiExpression: MultiExpression;\n private startVolume: number;\n private endVolume: number;\n private staffNumber: number;\n private label: string;\n\n public get DynamicType(): ContDynamicEnum {\n return this.dynamicType;\n }\n public set DynamicType(value: ContDynamicEnum) {\n this.dynamicType = value;\n }\n public get StartMultiExpression(): MultiExpression {\n return this.startMultiExpression;\n }\n public set StartMultiExpression(value: MultiExpression) {\n this.startMultiExpression = value;\n }\n public get EndMultiExpression(): MultiExpression {\n return this.endMultiExpression;\n }\n public set EndMultiExpression(value: MultiExpression) {\n this.endMultiExpression = value;\n }\n public get Placement(): PlacementEnum {\n return this.placement;\n }\n public set Placement(value: PlacementEnum) {\n this.placement = value;\n }\n public get StartVolume(): number {\n return this.startVolume;\n }\n public set StartVolume(value: number) {\n this.startVolume = value;\n }\n public get EndVolume(): number {\n return this.endVolume;\n }\n public set EndVolume(value: number) {\n this.endVolume = value;\n }\n public get StaffNumber(): number {\n return this.staffNumber;\n }\n public set StaffNumber(value: number) {\n this.staffNumber = value;\n }\n public get Label(): string {\n return this.label;\n }\n public set Label(value: string) {\n this.label = value;\n this.setType();\n }\n public static isInputStringContinuousDynamic(inputString: string): boolean {\n if (!inputString) { return false; }\n return (\n ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicIncreasing, inputString)\n || ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicDecreasing, inputString)\n );\n }\n public getInterpolatedDynamic(currentAbsoluteTimestamp: Fraction): number {\n const continuousAbsoluteStartTimestamp: Fraction = this.StartMultiExpression.AbsoluteTimestamp;\n let continuousAbsoluteEndTimestamp: Fraction;\n if (this.EndMultiExpression) {\n continuousAbsoluteEndTimestamp = this.EndMultiExpression.AbsoluteTimestamp;\n } else {\n continuousAbsoluteEndTimestamp = Fraction.plus(\n this.startMultiExpression.SourceMeasureParent.AbsoluteTimestamp, this.startMultiExpression.SourceMeasureParent.Duration\n );\n }\n if (currentAbsoluteTimestamp.lt(continuousAbsoluteStartTimestamp)) { return -1; }\n if (continuousAbsoluteEndTimestamp.lt(currentAbsoluteTimestamp)) { return -2; }\n const interpolationRatio: number =\n Fraction.minus(currentAbsoluteTimestamp, continuousAbsoluteStartTimestamp).RealValue\n / Fraction.minus(continuousAbsoluteEndTimestamp, continuousAbsoluteStartTimestamp).RealValue;\n const interpolatedVolume: number = Math.max(0.0, Math.min(99.9, this.startVolume + (this.endVolume - this.startVolume) * interpolationRatio));\n return interpolatedVolume;\n }\n public isWedge(): boolean {\n return !this.label;\n }\n private setType(): void {\n if (ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicIncreasing, this.label)) {\n this.dynamicType = ContDynamicEnum.crescendo;\n } else if (ContinuousDynamicExpression.isStringInStringList(ContinuousDynamicExpression.listContinuousDynamicDecreasing, this.label)) {\n this.dynamicType = ContDynamicEnum.diminuendo;\n }\n }\n}\n\nexport enum ContDynamicEnum {\n crescendo = 0,\n /** Diminuendo/Decrescendo. These terms are apparently sometimes synonyms, and a falling wedge is given in MusicXML as type=\"diminuendo\". */\n diminuendo = 1\n}\n","// created from 'create-ts-index'\n\nexport * from \"./AJAX\";\nexport * from \"./Cursor\";\nexport * from \"./OSMDOptions\";\nexport * from \"./OpenSheetMusicDisplay\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\n/**\n * Returns the position of the first occurrence of the specified item\n * within the specified array.4\n * @param {*} array the array in which to search the element.\n * @param {Object} item the element to search.\n * @param {function(Object,Object):boolean=} equalsFunction optional function used to\n * check equality between 2 elements.\n * @return {number} the position of the first occurrence of the specified element\n * within the specified array, or -1 if not found.\n */\nfunction indexOf(array, item, equalsFunction) {\n var equals = equalsFunction || util.defaultEquals;\n var length = array.length;\n for (var i = 0; i < length; i++) {\n if (equals(array[i], item)) {\n return i;\n }\n }\n return -1;\n}\nexports.indexOf = indexOf;\n/**\n * Returns the position of the last occurrence of the specified element\n * within the specified array.\n * @param {*} array the array in which to search the element.\n * @param {Object} item the element to search.\n * @param {function(Object,Object):boolean=} equalsFunction optional function used to\n * check equality between 2 elements.\n * @return {number} the position of the last occurrence of the specified element\n * within the specified array or -1 if not found.\n */\nfunction lastIndexOf(array, item, equalsFunction) {\n var equals = equalsFunction || util.defaultEquals;\n var length = array.length;\n for (var i = length - 1; i >= 0; i--) {\n if (equals(array[i], item)) {\n return i;\n }\n }\n return -1;\n}\nexports.lastIndexOf = lastIndexOf;\n/**\n * Returns true if the specified array contains the specified element.\n * @param {*} array the array in which to search the element.\n * @param {Object} item the element to search.\n * @param {function(Object,Object):boolean=} equalsFunction optional function to\n * check equality between 2 elements.\n * @return {boolean} true if the specified array contains the specified element.\n */\nfunction contains(array, item, equalsFunction) {\n return indexOf(array, item, equalsFunction) >= 0;\n}\nexports.contains = contains;\n/**\n * Removes the first ocurrence of the specified element from the specified array.\n * @param {*} array the array in which to search element.\n * @param {Object} item the element to search.\n * @param {function(Object,Object):boolean=} equalsFunction optional function to\n * check equality between 2 elements.\n * @return {boolean} true if the array changed after this call.\n */\nfunction remove(array, item, equalsFunction) {\n var index = indexOf(array, item, equalsFunction);\n if (index < 0) {\n return false;\n }\n array.splice(index, 1);\n return true;\n}\nexports.remove = remove;\n/**\n * Returns the number of elements in the specified array equal\n * to the specified object.\n * @param {Array} array the array in which to determine the frequency of the element.\n * @param {Object} item the element whose frequency is to be determined.\n * @param {function(Object,Object):boolean=} equalsFunction optional function used to\n * check equality between 2 elements.\n * @return {number} the number of elements in the specified array\n * equal to the specified object.\n */\nfunction frequency(array, item, equalsFunction) {\n var equals = equalsFunction || util.defaultEquals;\n var length = array.length;\n var freq = 0;\n for (var i = 0; i < length; i++) {\n if (equals(array[i], item)) {\n freq++;\n }\n }\n return freq;\n}\nexports.frequency = frequency;\n/**\n * Returns true if the two specified arrays are equal to one another.\n * Two arrays are considered equal if both arrays contain the same number\n * of elements, and all corresponding pairs of elements in the two\n * arrays are equal and are in the same order.\n * @param {Array} array1 one array to be tested for equality.\n * @param {Array} array2 the other array to be tested for equality.\n * @param {function(Object,Object):boolean=} equalsFunction optional function used to\n * check equality between elemements in the arrays.\n * @return {boolean} true if the two arrays are equal\n */\nfunction equals(array1, array2, equalsFunction) {\n var equals = equalsFunction || util.defaultEquals;\n if (array1.length !== array2.length) {\n return false;\n }\n var length = array1.length;\n for (var i = 0; i < length; i++) {\n if (!equals(array1[i], array2[i])) {\n return false;\n }\n }\n return true;\n}\nexports.equals = equals;\n/**\n * Returns shallow a copy of the specified array.\n * @param {*} array the array to copy.\n * @return {Array} a copy of the specified array\n */\nfunction copy(array) {\n return array.concat();\n}\nexports.copy = copy;\n/**\n * Swaps the elements at the specified positions in the specified array.\n * @param {Array} array The array in which to swap elements.\n * @param {number} i the index of one element to be swapped.\n * @param {number} j the index of the other element to be swapped.\n * @return {boolean} true if the array is defined and the indexes are valid.\n */\nfunction swap(array, i, j) {\n if (i < 0 || i >= array.length || j < 0 || j >= array.length) {\n return false;\n }\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n return true;\n}\nexports.swap = swap;\nfunction toString(array) {\n return '[' + array.toString() + ']';\n}\nexports.toString = toString;\n/**\n * Executes the provided function once for each element present in this array\n * starting from index 0 to length - 1.\n * @param {Array} array The array in which to iterate.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element value, to break the iteration you can\n * optionally return false.\n */\nfunction forEach(array, callback) {\n for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {\n var ele = array_1[_i];\n if (callback(ele) === false) {\n return;\n }\n }\n}\nexports.forEach = forEach;\n//# sourceMappingURL=arrays.js.map","export enum SystemLinePosition {\n MeasureBegin,\n MeasureEnd\n}\n","import {Voice} from \"./Voice\";\nimport {Instrument} from \"../Instrument\";\n\nexport class LinkedVoice extends Voice {\n\n constructor(parent: Instrument, voiceId: number, master: Voice) {\n super(parent, voiceId);\n this.master = master;\n }\n\n private master: Voice;\n public get Master(): Voice {\n return this.master;\n }\n\n}\n","import { GraphicalObject } from \"./GraphicalObject\";\nimport { GraphicalLabel } from \"./GraphicalLabel\";\nimport { StaffLine } from \"./StaffLine\";\nimport { BoundingBox } from \"./BoundingBox\";\nimport { AbstractExpression, PlacementEnum } from \"../VoiceData/Expressions/AbstractExpression\";\nimport { EngravingRules } from \"./EngravingRules\";\nimport { SourceMeasure } from \"../VoiceData\";\n\nexport abstract class AbstractGraphicalExpression extends GraphicalObject {\n protected label: GraphicalLabel;\n protected parentStaffLine: StaffLine;\n /** Internal cache of read expression */\n protected expression: AbstractExpression;\n /** EngravingRules for positioning */\n protected rules: EngravingRules;\n protected parentMeasure: SourceMeasure;\n\n constructor(parentStaffline: StaffLine, expression: AbstractExpression, measure: SourceMeasure) {\n super();\n this.expression = expression;\n this.parentMeasure = measure; // could be undefined!\n this.boundingBox = new BoundingBox(this, parentStaffline.PositionAndShape);\n this.parentStaffLine = parentStaffline;\n this.parentStaffLine.AbstractExpressions.push(this);\n this.rules = parentStaffline.ParentMusicSystem.rules;\n }\n\n /** Graphical label of the expression if available */\n get Label(): GraphicalLabel { return this.label; }\n /** Staffline where the expression is attached to */\n public get ParentStaffLine(): StaffLine { return this.parentStaffLine; }\n public get SourceExpression(): AbstractExpression { return this.expression; }\n public get Placement(): PlacementEnum { return this.expression.Placement; }\n\n //#region abstract methods\n public abstract updateSkyBottomLine(): void;\n //#endregion\n}\n","// created from 'create-ts-index'\n\nexport * from \"./Arpeggio\";\nexport * from \"./Beam\";\nexport * from \"./ChordSymbolContainer\";\nexport * from \"./LinkedVoice\";\nexport * from \"./Note\";\nexport * from \"./Notehead\";\nexport * from \"./NoteType\";\nexport * from \"./OrnamentContainer\";\nexport * from \"./SourceMeasure\";\nexport * from \"./SourceStaffEntry\";\nexport * from \"./Staff\";\nexport * from \"./StaffEntryLink\";\nexport * from \"./Tie\";\nexport * from \"./Tuplet\";\nexport * from \"./VerticalSourceStaffEntryContainer\";\nexport * from \"./Voice\";\nexport * from \"./VoiceEntry\";\nexport * from \"./Instructions\";\nexport * from \"./Note\";\nexport * from \"./NoteType\";\nexport * from \"./SourceMeasure\";\nexport * from \"./SourceStaffEntry\";\nexport * from \"./VerticalSourceStaffEntryContainer\";\nexport * from \"./Tie\";\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","import { DrawingParametersEnum, ColoringModes } from \"../MusicalScore/Graphical/DrawingParameters\";\nimport { FontStyles } from \"../Common/Enums/FontStyles\";\n\n/** Possible options for the OpenSheetMusicDisplay constructor and osmd.setOptions(). None are mandatory.\n * Note that after using setOptions(), you have to call osmd.render() again to make changes visible.\n * Example: osmd.setOptions({defaultColorRest: \"#AAAAAA\", drawSubtitle: false}); osmd.render();\n */\nexport interface IOSMDOptions {\n /** Whether to let Vexflow align rests to preceding or following notes (Vexflow option). Default false (0).\n * This can naturally reduce collisions of rest notes with other notes.\n * Auto mode (2) only aligns rests when there are multiple voices in a measure, and at least once at the same x-coordinate.\n * Auto is the recommended setting, and would be default, if it couldn't in rare cases deteriorate rest placement for existing users.\n * The on mode (1) always aligns rests, also changing their position when there is no simultaneous note at the same x-coordinate, which is nonstandard.\n */\n alignRests?: AlignRestOption | number;\n /** Whether to automatically create beams for notes that don't have beams set in XML. */\n autoBeam?: boolean;\n /** Options for autoBeaming like whether to beam over rests. See AutoBeamOptions interface. */\n autoBeamOptions?: AutoBeamOptions;\n /** Automatically resize score with canvas size. Default is true. */\n autoResize?: boolean;\n /** Render Backend, will be SVG if given undefined, \"SVG\" or \"svg\", otherwise Canvas. */\n backend?: string;\n /** Defines the mode that is used for coloring: XML (0), Boomwhacker(1), CustomColorSet (2). Default XML.\n * If coloringMode.CustomColorSet (2) is chosen, a coloringSetCustom parameter must be added.\n */\n coloringMode?: ColoringModes;\n /** Set of 8 colors for automatic coloring of 7 notes from C to B + rest note in HTML form (e.g. \"#00ff00\" for green). */\n coloringSetCustom?: string[];\n /** Whether to enable coloring noteheads and stems, depending on coloringMode. */\n coloringEnabled?: boolean;\n /** Whether to color the stems of notes the same as their noteheads. Default false. */\n colorStemsLikeNoteheads?: boolean;\n /** Default color for a note head (without stem). Default black (undefined).\n * Only considered before loading a sample, not before render.\n * To change the color after loading a sample and before render, use note(.sourceNote).NoteheadColor.\n * The format is Vexflow format, either \"#rrggbb\" or \"#rrggbbtt\" where is transparency. All hex values.\n * E.g., a half-transparent red would be \"#FF000080\", invisible/transparent would be \"#00000000\" or \"#12345600\".\n */\n defaultColorNotehead?: string;\n /** Default color for a note stem. Default black (undefined). */\n defaultColorStem?: string;\n /** Default color for rests. Default black (undefined). */\n defaultColorRest?: string;\n /** Default color for Labels like title or lyrics. Default black (undefined). */\n defaultColorLabel?: string;\n /** Default color for labels in the title. Overrides defaultColorLabel for title labels like composer. Default black (undefined). */\n defaultColorTitle?: string;\n /** Default font used for text and labels, e.g. title or lyrics. Default Times New Roman\n * Note that OSMD originally always used Times New Roman, so things like layout and spacing may still be optimized for it.\n * Valid options are CSS font families available in the browser used for rendering, e.g. Times New Roman, Helvetica.\n */\n defaultFontFamily?: string;\n /** Default font style, e.g. FontStyles.Bold (1). Default Regular (0). */\n defaultFontStyle?: FontStyles;\n /** Don't show/load cursor. Will override disableCursor in drawingParameters. */\n disableCursor?: boolean;\n /** Follow Cursor: Scroll the page when cursor.next() is called and the cursor moves into a new system outside of the current view frame. */\n followCursor?: boolean;\n /** Broad Parameters like compact or preview mode.\n * Also try \"compacttight\", which is like compact but also reduces margins.\n * To see what this mode does and maybe adjust the spacing parameters yourself instead of using the mode,\n * see DrawingParameters.ts:setForCompactTightMode().\n */\n drawingParameters?: string | DrawingParametersEnum;\n /** Whether to draw credits (title, subtitle, composer, lyricist) (in future: copyright etc., see ). */\n drawCredits?: boolean;\n /** Whether to draw the title of the piece. If false, disables drawing Subtitle as well. */\n drawTitle?: boolean;\n /** Whether to draw the subtitle of the piece. If true, enables drawing Title as well. */\n drawSubtitle?: boolean;\n /** Whether to draw the composer name (top right of the score). */\n drawComposer?: boolean;\n /** Whether to draw the lyricist's name, if given (top left of the score). */\n drawLyricist?: boolean;\n /** Whether to draw metronome marks. Default true. (currently OSMD can only draw one at the beginning) */\n drawMetronomeMarks?: boolean;\n /** Whether to draw part (instrument) names. Setting this to false also disables drawPartAbbreviations,\n * unless explicitly enabled (drawPartNames: false, drawPartAbbreviations: true).\n */\n drawPartNames?: boolean;\n /** Whether to draw part (instrument) name abbreviations each system after the first. Only draws if drawPartNames. Default true. */\n drawPartAbbreviations?: boolean;\n /** Whether to draw measure numbers (labels). Default true.\n * Draws a measure number label at first measure, system start measure, and every [measureNumberInterval] measures.\n * See the [measureNumberInterval] option, default is 2.\n */\n drawMeasureNumbers?: boolean;\n /** The interval of measure numbers to draw, i.e. it draws the measure number above the beginning label every x measures. Default 2. */\n measureNumberInterval?: number;\n /** Whether to draw fingerings (only left to the note for now). Default true (unless solo part). */\n drawFingerings?: boolean;\n /** Where to draw fingerings (left, right, above, below, auto).\n * Default left. Auto, above, below experimental (potential collisions because bounding box not correct)\n */\n fingeringPosition?: string;\n /** For above/below fingerings, whether to draw them directly above/below notes (default), or above/below staffline. */\n fingeringInsideStafflines?: boolean;\n /** Whether to draw hidden/invisible notes (print-object=\"no\" in XML). Default false. Not yet supported. */ // TODO\n drawHiddenNotes?: boolean;\n /** Whether to draw lyrics (and their extensions and dashes). */\n drawLyrics?: boolean;\n /** Whether to calculate extra slurs with bezier curves not covered by Vexflow slurs. Default true. */\n drawSlurs?: boolean;\n /** Only draw measure n to m, where m is the number you specify. */\n drawUpToMeasureNumber?: number;\n /** Only draw measure n to m, where n is the number you specify. */\n drawFromMeasureNumber?: number;\n /** Whether to fill measures that don't have notes given in the XML with whole rests (visible = 1, invisible = 2, for layouting). Default No (0). */\n fillEmptyMeasuresWithWholeRest?: FillEmptyMeasuresWithWholeRests | number;\n /** Whether to set the wanted stem direction by xml (default) or automatically. */\n setWantedStemDirectionByXml?: boolean;\n /** Whether tuplets are labeled with ratio (e.g. 5:2 instead of 5 for quintuplets). Default false. */\n tupletsRatioed?: boolean;\n /** Whether all tuplets should be bracketed (e.g. |--5--| instead of 5). Default false.\n * If false, only tuplets given as bracketed in XML (bracket=\"yes\") will be bracketed.\n */\n tupletsBracketed?: boolean;\n /** Whether all triplets should be bracketed. Overrides tupletsBracketed for triplets.\n * If false, only triplets given as bracketed in XML (bracket=\"yes\") will be bracketed.\n * (Bracketing all triplets can be cluttering)\n */\n tripletsBracketed?: boolean;\n /** See OpenSheetMusicDisplay.PageFormatStandards for standard options like \"A4 P\" or \"Endless\". Default Endless.\n * Uses OpenSheetMusicDisplay.StringToPageFormat(). Unfortunately it would be error-prone to set a PageFormat type directly.\n */\n pageFormat?: string;\n /** A custom page/canvas background color. Default undefined/transparent.\n * Example: \"#FFFFFF\" = white. \"#12345600\" = transparent.\n * This can be useful when you want to export an image with e.g. white background color instead of transparent,\n * from a CanvasBackend.\n * Note: Using a background color will prevent the cursor from being visible for now (will be fixed at some point).\n */\n pageBackgroundColor?: string;\n /** This makes OSMD render on one single horizontal (staff-)line.\n * This option should be set before loading a score. It only starts working after load(),\n * calling setOptions() after load and then render() doesn't work in this case.\n */\n renderSingleHorizontalStaffline?: boolean;\n /** Whether to begin a new system (\"line break\") when given in XML ('new-system=\"yes\"').\n * Default false, because OSMD does its own layout that will do line breaks interactively\n * at different measures. So this option may result in a system break after a single measure in a system.\n */\n newSystemFromXML?: boolean;\n /** Whether to begin a new page (\"page break\") when given in XML ('new-page=\"yes\"').\n * Default false, because OSMD does its own layout that will do page breaks interactively (when given a PageFormat)\n * at different measures. So this option may result in a page break after a single measure on a page.\n */\n newPageFromXML?: boolean;\n /** The cutoff number for rendering percussion clef stafflines as a single line. Default is 4.\n * This is number of instruments specified, e.g. a drumset:\n * \n * Drumset\n * D. Set\n * \n * Acoustic Bass Drum\n * \n * \n * Bass Drum 1\n * \n * \n * Side Stick\n * \n * \n * Acoustic Snare\n * \n * ...\n * Would still render as 5 stafflines by default, since we have 4 (or greater) instruments in this part.\n * While a snare:\n * \n * Concert Snare Drum\n * Con. Sn.\n * \n * Side Stick\n * \n * \n * Acoustic Snare\n * \n * ...\n * Would render with 1 line on the staff, since we only have 2 voices.\n * If this value is 0, the feature is turned off.\n * If this value is -1, it will render all percussion clefs as a single line.\n */\n percussionOneLineCutoff?: number;\n /** This property is only active if the above property is active (percussionOneLineCutoff)\n * This is the cutoff for forcing all voices to the single line, instead of rendering them at different\n * positions above/below the line.\n * The default is 3, so if a part has less than voices, all of them will be rendered on the line.\n * This is for cases like a Concert snare, which has multiple 'instruments' available (snare, side stick)\n * should still render only on the line since there is no ambiguity.\n * If this value is 0, the feature is turned off.\n * IF this value is -1, it will render all percussion clef voices on the single line.\n */\n percussionForceVoicesOneLineCutoff?: number;\n}\n\nexport enum AlignRestOption {\n Never = 0, // false should also work\n Always = 1, // true should also work\n Auto = 2\n}\n\nexport enum FillEmptyMeasuresWithWholeRests {\n No = 0,\n YesVisible = 1,\n YesInvisible = 2\n}\n\nexport enum BackendType {\n SVG = 0,\n Canvas = 1\n}\n\n/** Handles [[IOSMDOptions]], e.g. returning default options with OSMDOptionsStandard() */\nexport class OSMDOptions {\n /** Returns the default options for OSMD.\n * These are e.g. used if no options are given in the [[OpenSheetMusicDisplay]] constructor.\n */\n public static OSMDOptionsStandard(): IOSMDOptions {\n return {\n autoResize: true,\n backend: \"svg\",\n drawingParameters: DrawingParametersEnum.default,\n };\n }\n\n public static BackendTypeFromString(value: string): BackendType {\n if (value && value.toLowerCase() === \"canvas\") {\n return BackendType.Canvas;\n } else {\n return BackendType.SVG;\n }\n }\n}\n\nexport interface AutoBeamOptions {\n /** Whether to extend beams over rests. Default false. */\n beam_rests?: boolean;\n /** Whether to extend beams only over rests that are in the middle of a potential beam. Default false. */\n beam_middle_rests_only?: boolean;\n /** Whether to maintain stem direction of autoBeamed notes. Discouraged, reduces beams. Default false. */\n maintain_stem_directions?: boolean;\n /** Groups of notes (fractions) to beam within a measure.\n * List of fractions, each fraction being [nominator, denominator].\n * E.g. [[3,4],[1,4]] will beam the first 3 quarters of a measure, then the last quarter.\n */\n groups?: [number[]];\n}\n","import {BoundingBox} from \"./BoundingBox\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {GraphicalLabel} from \"./GraphicalLabel\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {EngravingRules} from \"./EngravingRules\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {GraphicalMusicSheet} from \"./GraphicalMusicSheet\";\n\nexport class GraphicalMusicPage extends GraphicalObject {\n private musicSystems: MusicSystem[] = [];\n private labels: GraphicalLabel[] = [];\n private parent: GraphicalMusicSheet;\n private pageNumber: number;\n\n constructor(parent: GraphicalMusicSheet) {\n super();\n this.parent = parent;\n this.boundingBox = new BoundingBox(this, undefined);\n }\n\n public get MusicSystems(): MusicSystem[] {\n return this.musicSystems;\n }\n\n public set MusicSystems(value: MusicSystem[]) {\n this.musicSystems = value;\n }\n\n public get Labels(): GraphicalLabel[] {\n return this.labels;\n }\n\n public set Labels(value: GraphicalLabel[]) {\n this.labels = value;\n }\n\n public get Parent(): GraphicalMusicSheet {\n return this.parent;\n }\n\n public set Parent(value: GraphicalMusicSheet) {\n this.parent = value;\n }\n\n public get PageNumber(): number {\n return this.pageNumber;\n }\n\n public set PageNumber(value: number) {\n this.pageNumber = value;\n }\n\n /**\n * This method calculates the absolute Position of each GraphicalMusicPage according to a given placement\n * @param pageIndex\n * @param rules\n * @returns {PointF2D}\n */\n public setMusicPageAbsolutePosition(pageIndex: number, rules: EngravingRules): PointF2D {\n return new PointF2D(0.0, 0.0);\n\n // use this code if pages are rendered on only one canvas:\n // if (rules.PagePlacement === PagePlacementEnum.Down) {\n // return new PointF2D(0.0, pageIndex * rules.PageHeight);\n // } else if (rules.PagePlacement === PagePlacementEnum.Right) {\n // return new PointF2D(pageIndex * this.parent.ParentMusicSheet.pageWidth, 0.0);\n // } else {\n // // placement RightDown\n // if (pageIndex % 2 === 0) {\n // if (pageIndex === 0) {\n // return new PointF2D(0.0, pageIndex * rules.PageHeight);\n // } else {\n // return new PointF2D(0.0, (pageIndex - 1) * rules.PageHeight);\n // }\n // } else {\n // if (pageIndex === 1) {\n // return new PointF2D(this.parent.ParentMusicSheet.pageWidth, (pageIndex - 1) * rules.PageHeight);\n // } else {\n // return new PointF2D(this.parent.ParentMusicSheet.pageWidth, (pageIndex - 2) * rules.PageHeight);\n // }\n // }\n // }\n }\n}\n\nexport enum PagePlacementEnum {\n Down,\n Right,\n RightDown\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Copyright 2013 Basarat Ali Syed. All Rights Reserved.\n//\n// Licensed under MIT open source license http://opensource.org/licenses/MIT\n//\n// Orginal javascript code was by Mauricio Santos\n//\nvar _arrays = require(\"./arrays\");\nexports.arrays = _arrays;\nvar Bag_1 = require(\"./Bag\");\nexports.Bag = Bag_1.default;\nvar BSTree_1 = require(\"./BSTree\");\nexports.BSTree = BSTree_1.default;\nvar BSTreeKV_1 = require(\"./BSTreeKV\");\nexports.BSTreeKV = BSTreeKV_1.default;\nvar Dictionary_1 = require(\"./Dictionary\");\nexports.Dictionary = Dictionary_1.default;\nvar Heap_1 = require(\"./Heap\");\nexports.Heap = Heap_1.default;\nvar LinkedDictionary_1 = require(\"./LinkedDictionary\");\nexports.LinkedDictionary = LinkedDictionary_1.default;\nvar LinkedList_1 = require(\"./LinkedList\");\nexports.LinkedList = LinkedList_1.default;\nvar MultiDictionary_1 = require(\"./MultiDictionary\");\nexports.MultiDictionary = MultiDictionary_1.default;\nvar FactoryDictionary_1 = require(\"./FactoryDictionary\");\nexports.FactoryDictionary = FactoryDictionary_1.default;\nvar FactoryDictionary_2 = require(\"./FactoryDictionary\");\nexports.DefaultDictionary = FactoryDictionary_2.default;\nvar Queue_1 = require(\"./Queue\");\nexports.Queue = Queue_1.default;\nvar PriorityQueue_1 = require(\"./PriorityQueue\");\nexports.PriorityQueue = PriorityQueue_1.default;\nvar Set_1 = require(\"./Set\");\nexports.Set = Set_1.default;\nvar Stack_1 = require(\"./Stack\");\nexports.Stack = Stack_1.default;\nvar MultiRootTree_1 = require(\"./MultiRootTree\");\nexports.MultiRootTree = MultiRootTree_1.default;\nvar _util = require(\"./util\");\nexports.util = _util;\n//# sourceMappingURL=index.js.map","import {Pitch} from \"../../Common/DataObjects/Pitch\";\nimport {KeyInstruction} from \"./Instructions/KeyInstruction\";\nimport {MusicSheetCalculator} from \"../Graphical/MusicSheetCalculator\";\nimport {AccidentalEnum} from \"../../Common/DataObjects/Pitch\";\nimport { EngravingRules } from \"../Graphical\";\n\nexport class ChordSymbolContainer {\n private rootPitch: Pitch;\n private chordKind: ChordSymbolEnum;\n private bassPitch: Pitch;\n private degree: Degree;\n private rules: EngravingRules;\n\n constructor(rootPitch: Pitch, chordKind: ChordSymbolEnum, bassPitch: Pitch, chordDegree: Degree, rules: EngravingRules) {\n this.rootPitch = rootPitch;\n this.chordKind = chordKind;\n this.bassPitch = bassPitch;\n this.degree = chordDegree;\n this.rules = rules;\n }\n\n public get RootPitch(): Pitch {\n return this.rootPitch;\n }\n\n public get ChordKind(): ChordSymbolEnum {\n return this.chordKind;\n }\n\n public get BassPitch(): Pitch {\n return this.bassPitch;\n }\n\n public get ChordDegree(): Degree {\n return this.degree;\n }\n\n public static calculateChordText(chordSymbol: ChordSymbolContainer, transposeHalftones: number, keyInstruction: KeyInstruction): string {\n let transposedRootPitch: Pitch = chordSymbol.RootPitch;\n\n if (MusicSheetCalculator.transposeCalculator) {\n transposedRootPitch = MusicSheetCalculator.transposeCalculator.transposePitch(\n chordSymbol.RootPitch,\n keyInstruction,\n transposeHalftones\n );\n }\n // main Note\n let text: string = Pitch.getNoteEnumString(transposedRootPitch.FundamentalNote);\n // main alteration\n if (transposedRootPitch.Accidental !== AccidentalEnum.NONE) {\n text += this.getTextForAccidental(transposedRootPitch.Accidental);\n }\n // chord kind text\n text += chordSymbol.getTextFromChordKindEnum(chordSymbol.ChordKind);\n // degree\n if (chordSymbol.ChordDegree) {\n switch (chordSymbol.ChordDegree.text) {\n case ChordDegreeText.add:\n text += \"add\";\n text += chordSymbol.ChordDegree.value.toString();\n break;\n case ChordDegreeText.alter:\n if (chordSymbol.ChordDegree.alteration !== AccidentalEnum.NONE) {\n text += this.getTextForAccidental(chordSymbol.ChordDegree.alteration);\n }\n text += chordSymbol.ChordDegree.value.toString();\n break;\n case ChordDegreeText.subtract:\n text += \"(omit\";\n text += chordSymbol.ChordDegree.value.toString();\n text += \")\";\n break;\n default:\n }\n }\n // bass\n if (chordSymbol.BassPitch) {\n let transposedBassPitch: Pitch = chordSymbol.BassPitch;\n if (MusicSheetCalculator.transposeCalculator) {\n transposedBassPitch = MusicSheetCalculator.transposeCalculator.transposePitch(\n chordSymbol.BassPitch,\n keyInstruction,\n transposeHalftones\n );\n }\n text += \"/\";\n text += Pitch.getNoteEnumString(transposedBassPitch.FundamentalNote);\n text += this.getTextForAccidental(transposedBassPitch.Accidental);\n }\n return text;\n }\n\n private static getTextForAccidental(alteration: AccidentalEnum): string {\n let text: string = \"\";\n switch (alteration) {\n case AccidentalEnum.DOUBLEFLAT:\n text += \"bb\";\n break;\n case AccidentalEnum.FLAT:\n text += \"b\";\n break;\n case AccidentalEnum.SHARP:\n text += \"#\";\n break;\n case AccidentalEnum.DOUBLESHARP:\n text += \"x\";\n break;\n default:\n }\n return text;\n }\n\n private getTextFromChordKindEnum(kind: ChordSymbolEnum): string {\n return this.rules.ChordSymbolLabelTexts.getValue(kind) ?? \"\";\n }\n\n}\n\nexport class Degree {\n constructor(value: number, alteration: AccidentalEnum, text: ChordDegreeText) {\n this.value = value;\n this.alteration = alteration;\n this.text = text;\n }\n\n public value: number;\n public alteration: AccidentalEnum;\n public text: ChordDegreeText;\n}\n\nexport enum ChordDegreeText {\n add,\n alter,\n subtract\n}\n\nexport enum ChordSymbolEnum {\n major,\n minor,\n augmented,\n diminished,\n dominant,\n majorseventh,\n minorseventh,\n diminishedseventh,\n augmentedseventh,\n halfdiminished,\n majorminor,\n majorsixth,\n minorsixth,\n dominantninth,\n majorninth,\n minorninth,\n dominant11th,\n major11th,\n minor11th,\n dominant13th,\n major13th,\n minor13th,\n suspendedsecond,\n suspendedfourth,\n Neapolitan,\n Italian,\n French,\n German,\n pedal,\n power,\n Tristan\n}\n","import {SourceStaffEntry} from \"../SourceStaffEntry\";\n\nexport abstract class AbstractNotationInstruction {\n\n constructor(parent: SourceStaffEntry) {\n this.parent = parent;\n }\n\n protected parent: SourceStaffEntry;\n /** States whether the object should be displayed. False if xmlNode.attribute(\"print-object\").value = \"no\". */\n private printObject: boolean = true;\n\n public get Parent(): SourceStaffEntry {\n return this.parent;\n }\n public set Parent(value: SourceStaffEntry) {\n this.parent = value;\n }\n\n public get PrintObject(): boolean {\n return this.printObject;\n }\n\n public set PrintObject(value: boolean) {\n this.printObject = value;\n }\n}\n","import {AccidentalEnum} from \"../../Common/DataObjects/Pitch\";\n\nexport class OrnamentContainer {\n\n constructor(ornament: OrnamentEnum) {\n this.ornament = ornament;\n }\n\n private ornament: OrnamentEnum;\n private accidentalAbove: AccidentalEnum = AccidentalEnum.NONE;\n private accidentalBelow: AccidentalEnum = AccidentalEnum.NONE;\n\n public get GetOrnament(): OrnamentEnum {\n return this.ornament;\n }\n public get AccidentalAbove(): AccidentalEnum {\n return this.accidentalAbove;\n }\n public set AccidentalAbove(value: AccidentalEnum) {\n this.accidentalAbove = value;\n }\n public get AccidentalBelow(): AccidentalEnum {\n return this.accidentalBelow;\n }\n public set AccidentalBelow(value: AccidentalEnum) {\n this.accidentalBelow = value;\n }\n\n}\n\nexport enum OrnamentEnum {\n Trill,\n Turn,\n InvertedTurn,\n DelayedTurn,\n DelayedInvertedTurn,\n Mordent,\n InvertedMordent,\n // the following ornaments are not yet supported by MusicXML (3.1).\n // there is a \"other-ornament\"-node, but most programs probably don't export as such, e.g. Musescore\n // see musicXML manuals -> Ornaments\n /*\n UpPrall,\n DownPrall,\n PrallUp,\n PrallDown,\n UpMordent,\n DownMordent,\n LinePrall,\n PrallPrall\n */\n}\n","import {Instrument} from \"../Instrument\";\nimport {VoiceEntry} from \"./VoiceEntry\";\n\n/**\n * A [[Voice]] contains all the [[VoiceEntry]]s in a voice in a [[StaffLine]].\n */\nexport class Voice {\n\n private voiceEntries: VoiceEntry[] = [];\n private parent: Instrument;\n private visible: boolean;\n private audible: boolean;\n private following: boolean;\n /**\n * The Id given in the MusicXMl file to distinguish the different voices. It is unique per instrument.\n */\n private voiceId: number;\n private volume: number = 1;\n\n constructor(parent: Instrument, voiceId: number) {\n this.parent = parent;\n this.visible = true;\n this.audible = true;\n this.following = true;\n this.voiceId = voiceId;\n }\n\n public get VoiceEntries(): VoiceEntry[] {\n return this.voiceEntries;\n }\n public get Parent(): Instrument {\n return this.parent;\n }\n public get Visible(): boolean {\n return this.visible;\n }\n public set Visible(value: boolean) {\n this.visible = value;\n }\n public get Audible(): boolean {\n return this.audible;\n }\n public set Audible(value: boolean) {\n this.audible = value;\n }\n public get Following(): boolean {\n return this.following;\n }\n public set Following(value: boolean) {\n this.following = value;\n }\n public get VoiceId(): number {\n return this.voiceId;\n }\n public get Volume(): number {\n return this.volume;\n }\n public set Volume(value: number) {\n this.volume = value;\n }\n\n}\n","import {SourceMeasure} from \"./SourceMeasure\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {SourceStaffEntry} from \"./SourceStaffEntry\";\n\n/**\n * A [[VerticalSourceStaffEntryContainer]] contains the [[StaffEntry]]s at one timestamp through all the [[StaffLine]]s.\n */\nexport class VerticalSourceStaffEntryContainer {\n\n constructor(parentMeasure: SourceMeasure, timestamp: Fraction, size: number) {\n this.timestamp = timestamp;\n this.staffEntries = new Array(size);\n this.parentMeasure = parentMeasure;\n }\n\n private timestamp: Fraction;\n private staffEntries: SourceStaffEntry[] = [];\n private comments: Comment[] = [];\n private parentMeasure: SourceMeasure;\n\n public $get$(index: number): SourceStaffEntry {\n return this.staffEntries[index];\n }\n public $set$(index: number, value: SourceStaffEntry): void {\n this.staffEntries[index] = value;\n }\n public get Timestamp(): Fraction {\n return this.timestamp;\n }\n public set Timestamp(value: Fraction) {\n this.timestamp = value;\n }\n public get StaffEntries(): SourceStaffEntry[] {\n return this.staffEntries;\n }\n public set StaffEntries(value: SourceStaffEntry[]) {\n this.staffEntries = value;\n }\n public get Comments(): Comment[] {\n return this.comments;\n }\n public set Comments(value: Comment[]) {\n this.comments = value;\n }\n public get ParentMeasure(): SourceMeasure {\n return this.parentMeasure;\n }\n public set ParentMeasure(value: SourceMeasure) {\n this.parentMeasure = value;\n }\n public getAbsoluteTimestamp(): Fraction {\n return Fraction.plus(this.timestamp, this.parentMeasure.AbsoluteTimestamp);\n }\n\n}\n","import { GraphicalLine } from \"./GraphicalLine\";\nimport { StaffLine } from \"./StaffLine\";\nimport { GraphicalMeasure } from \"./GraphicalMeasure\";\nimport { ContDynamicEnum, ContinuousDynamicExpression } from \"../VoiceData/Expressions/ContinuousExpressions/ContinuousDynamicExpression\";\nimport { PointF2D } from \"../../Common/DataObjects/PointF2D\";\nimport { AbstractGraphicalExpression } from \"./AbstractGraphicalExpression\";\nimport { PlacementEnum } from \"../VoiceData/Expressions/AbstractExpression\";\nimport { SkyBottomLineCalculator } from \"./SkyBottomLineCalculator\";\nimport { ISqueezable } from \"./ISqueezable\";\nimport log from \"loglevel\";\nimport { SourceMeasure } from \"../VoiceData\";\n\n/**\n * This class prepares the graphical elements for a continuous expression. It calculates the wedges and\n * wrappings if they are split over system breaks.\n */\nexport class GraphicalContinuousDynamicExpression extends AbstractGraphicalExpression implements ISqueezable {\n /** True if expression is split over system borders */\n private isSplittedPart: boolean;\n /** True if this expression should not be removed if re-rendered */\n private notToBeRemoved: boolean;\n /** Holds the line objects that can be drawn via implementation */\n private lines: GraphicalLine[] = [];\n private startMeasure: GraphicalMeasure;\n private endMeasure: GraphicalMeasure;\n\n /**\n * Create a new instance of the GraphicalContinuousDynamicExpression\n * @param continuousDynamic The continuous dynamic instruction read via ExpressionReader\n * @param staffLine The staffline where the expression is attached\n */\n constructor(continuousDynamic: ContinuousDynamicExpression, staffLine: StaffLine, measure: SourceMeasure) {\n super(staffLine, continuousDynamic, measure);\n\n this.isSplittedPart = false;\n this.notToBeRemoved = false;\n }\n\n //#region Getter / Setter\n\n /** The graphical measure where the parent continuous dynamic expression starts */\n public get StartMeasure(): GraphicalMeasure { return this.startMeasure; }\n public set StartMeasure(value: GraphicalMeasure) { this.startMeasure = value; }\n /** The graphical measure where the parent continuous dynamic expression ends */\n public get EndMeasure(): GraphicalMeasure { return this.endMeasure; }\n public set EndMeasure(value: GraphicalMeasure) { this.endMeasure = value; }\n /** The staff lin where the graphical dynamic expressions ends */\n public get EndStaffLine(): StaffLine { return this.endMeasure ? this.endMeasure.ParentStaffLine : undefined; }\n /** Is true if this continuous expression is a wedge, that reaches over a system border and needs to be split into two. */\n public get IsSplittedPart(): boolean { return this.isSplittedPart; }\n public set IsSplittedPart(value: boolean) { this.isSplittedPart = value; }\n /** Is true if the dynamic is not a symbol but a text instruction. E.g. \"decrescendo\" */\n public get IsVerbal(): boolean { return this.ContinuousDynamic.Label && this.ContinuousDynamic.Label.length > 0; }\n /** True if this expression should not be removed if re-rendered */\n public get NotToBeRemoved(): boolean { return this.notToBeRemoved; }\n public set NotToBeRemoved(value: boolean) { this.notToBeRemoved = value; }\n /** Holds the line objects that can be drawn via implementation */\n public get Lines(): GraphicalLine[] { return this.lines; }\n\n public get ContinuousDynamic(): ContinuousDynamicExpression { return this.SourceExpression as ContinuousDynamicExpression; }\n //#endregion\n\n //#region Public methods\n\n public updateSkyBottomLine(): void {\n // update Sky-BottomLine\n const skyBottomLineCalculator: SkyBottomLineCalculator = this.parentStaffLine.SkyBottomLineCalculator;\n const left: number = this.IsVerbal ? this.label.PositionAndShape.RelativePosition.x + this.label.PositionAndShape.BorderMarginLeft : 0;\n const right: number = this.IsVerbal ? this.label.PositionAndShape.RelativePosition.x + this.label.PositionAndShape.BorderMarginRight : 0;\n if (!this.IsVerbal && this.lines.length < 2) {\n log.warn(\"Not enough lines for SkyBottomLine calculation\");\n }\n if (!this.IsVerbal) {\n if (this.ContinuousDynamic.DynamicType !== ContDynamicEnum.crescendo &&\n this.ContinuousDynamic.DynamicType !== ContDynamicEnum.diminuendo) {\n // for now there is only crescendo or decrescendo anyways, but this will catch errors when we add new types in the future\n log.warn(\"GraphicalContinuousDynamicExpression.updateSkyBottomLine(): \" +\n \"unhandled continuous dynamic type. start measure: \" + this.startMeasure?.MeasureNumber);\n }\n }\n switch (this.Placement) {\n case PlacementEnum.Above:\n if (!this.IsVerbal) {\n if (this.ContinuousDynamic.DynamicType === ContDynamicEnum.crescendo) {\n skyBottomLineCalculator.updateSkyLineWithWedge(this.lines[0].Start, this.lines[0].End);\n } else if (this.ContinuousDynamic.DynamicType === ContDynamicEnum.diminuendo) {\n skyBottomLineCalculator.updateSkyLineWithWedge(this.lines[0].End, this.lines[0].Start);\n } // else covered with the log.warn above\n } else {\n const yValue: number = this.label.PositionAndShape.BorderMarginTop + this.label.PositionAndShape.RelativePosition.y;\n skyBottomLineCalculator.updateSkyLineInRange(left, right, yValue);\n }\n break;\n case PlacementEnum.Below:\n if (!this.IsVerbal) {\n // console.log(`id: ${this.parentStaffLine.ParentStaff.Id}`);\n if (this.ContinuousDynamic.DynamicType === ContDynamicEnum.crescendo) {\n skyBottomLineCalculator.updateBottomLineWithWedge(this.lines[1].Start, this.lines[1].End);\n } else if (this.ContinuousDynamic.DynamicType === ContDynamicEnum.diminuendo) {\n skyBottomLineCalculator.updateBottomLineWithWedge(this.lines[1].End, this.lines[1].Start);\n } // else covered with the log.warn above\n } else {\n const yValue: number = this.label.PositionAndShape.BorderMarginBottom + this.label.PositionAndShape.RelativePosition.y;\n skyBottomLineCalculator.updateBottomLineInRange(left, right, yValue);\n }\n break;\n default:\n log.error(\"Placement for GraphicalContinuousDynamicExpression is unknown\");\n }\n }\n\n /**\n * Calculate crescendo lines for (full).\n * @param startX left most starting point\n * @param endX right mist ending point\n * @param y y placement\n * @param wedgeOpeningLength length of the opening\n * @param wedgeLineWidth line width of the wedge\n */\n public createCrescendoLines(startX: number, endX: number, y: number,\n wedgeOpeningLength: number = this.rules.WedgeOpeningLength, wedgeLineWidth: number = this.rules.WedgeLineWidth): void {\n const lineStart: PointF2D = new PointF2D(startX, y);\n const upperLineEnd: PointF2D = new PointF2D(endX, y - wedgeOpeningLength / 2);\n const lowerLineEnd: PointF2D = new PointF2D(endX, y + wedgeOpeningLength / 2);\n this.addWedgeLines(lineStart, upperLineEnd, lowerLineEnd, wedgeLineWidth);\n }\n\n /**\n * Calculate crescendo lines for system break (first part).\n * @param startX left most starting point\n * @param endX right mist ending point\n * @param y y placement\n * @param wedgeMeasureEndOpeningLength length of opening at measure end\n * @param wedgeOpeningLength length of the opening\n * @param wedgeLineWidth line width of the wedge\n */\n public createFirstHalfCrescendoLines(startX: number, endX: number, y: number,\n wedgeMeasureEndOpeningLength: number = this.rules.WedgeMeasureEndOpeningLength,\n wedgeLineWidth: number = this.rules.WedgeLineWidth): void {\n const lineStart: PointF2D = new PointF2D(startX, y);\n const upperLineEnd: PointF2D = new PointF2D(endX, y - wedgeMeasureEndOpeningLength / 2);\n const lowerLineEnd: PointF2D = new PointF2D(endX, y + wedgeMeasureEndOpeningLength / 2);\n this.addWedgeLines(lineStart, upperLineEnd, lowerLineEnd, wedgeLineWidth);\n }\n\n\n /**\n * Calculate crescendo lines for system break (second part).\n * @param startX left most starting point\n * @param endX right mist ending point\n * @param y y placement\n * @param wedgeMeasureBeginOpeningLength length of opening at measure start\n * @param wedgeOpeningLength length of the opening\n * @param wedgeLineWidth line width of the wedge\n */\n public createSecondHalfCrescendoLines(startX: number, endX: number, y: number,\n wedgeMeasureBeginOpeningLength: number = this.rules.WedgeMeasureBeginOpeningLength,\n wedgeOpeningLength: number = this.rules.WedgeOpeningLength,\n wedgeLineWidth: number = this.rules.WedgeLineWidth): void {\n const upperLineStart: PointF2D = new PointF2D(startX, y - wedgeMeasureBeginOpeningLength / 2);\n const lowerLineStart: PointF2D = new PointF2D(startX, y + wedgeMeasureBeginOpeningLength / 2);\n const upperLineEnd: PointF2D = new PointF2D(endX, y - wedgeOpeningLength / 2);\n const lowerLineEnd: PointF2D = new PointF2D(endX, y + wedgeOpeningLength / 2);\n this.addDoubleLines(upperLineStart, upperLineEnd, lowerLineStart, lowerLineEnd, wedgeLineWidth);\n }\n\n /**\n * This method recalculates the Crescendo Lines (for all cases).\n * @param startX left most starting point\n * @param endX right most ending point\n * @param y y placement\n */\n public recalculateCrescendoLines(startX: number, endX: number, y: number): void {\n const isSecondHalfSplit: boolean = Math.abs(this.lines[0].Start.y - this.lines[1].Start.y) > 0.0001;\n this.lines.clear();\n\n if (isSecondHalfSplit) {\n this.createSecondHalfCrescendoLines(startX, endX, y);\n } else if (this.isSplittedPart) {\n this.createFirstHalfCrescendoLines(startX, endX, y);\n } else {\n this.createCrescendoLines(startX, endX, y);\n }\n }\n\n /**\n * Calculate diminuendo lines for system break (full).\n * @param startX left most starting point\n * @param endX right mist ending point\n * @param y y placement\n * @param wedgeOpeningLength length of the opening\n * @param wedgeLineWidth line width of the wedge\n */\n public createDiminuendoLines(startX: number, endX: number, y: number,\n wedgeOpeningLength: number = this.rules.WedgeOpeningLength, wedgeLineWidth: number = this.rules.WedgeLineWidth): void {\n const upperWedgeStart: PointF2D = new PointF2D(startX, y - wedgeOpeningLength / 2);\n const lowerWedgeStart: PointF2D = new PointF2D(startX, y + wedgeOpeningLength / 2);\n const wedgeEnd: PointF2D = new PointF2D(endX, y);\n this.addWedgeLines(wedgeEnd, upperWedgeStart, lowerWedgeStart, wedgeLineWidth);\n }\n\n /**\n * Calculate diminuendo lines for system break (first part).\n * @param startX left most starting point\n * @param endX right mist ending point\n * @param y y placement\n * @param wedgeOpeningLength length of the opening\n * @param wedgeMeasureEndOpeningLength length of opening at measure end\n * @param wedgeLineWidth line width of the wedge\n */\n public createFirstHalfDiminuendoLines(startX: number, endX: number, y: number,\n wedgeOpeningLength: number = this.rules.WedgeOpeningLength,\n wedgeMeasureEndOpeningLength: number = this.rules.WedgeMeasureEndOpeningLength,\n wedgeLineWidth: number = this.rules.WedgeLineWidth): void {\n const upperLineStart: PointF2D = new PointF2D(startX, y - wedgeOpeningLength / 2);\n const lowerLineStart: PointF2D = new PointF2D(startX, y + wedgeOpeningLength / 2);\n const upperLineEnd: PointF2D = new PointF2D(endX, y - wedgeMeasureEndOpeningLength / 2);\n const lowerLineEnd: PointF2D = new PointF2D(endX, y + wedgeMeasureEndOpeningLength / 2);\n this.addDoubleLines(upperLineStart, upperLineEnd, lowerLineStart, lowerLineEnd, wedgeLineWidth);\n }\n\n /**\n * Calculate diminuendo lines for system break (second part).\n * @param startX left most starting point\n * @param endX right mist ending point\n * @param y y placement\n * @param wedgeMeasureBeginOpeningLength length of opening at measure start\n * @param wedgeLineWidth line width of the wedge\n */\n public createSecondHalfDiminuendoLines(startX: number, endX: number, y: number,\n wedgeMeasureBeginOpeningLength: number = this.rules.WedgeMeasureBeginOpeningLength,\n wedgeLineWidth: number = this.rules.WedgeLineWidth): void {\n const upperLineStart: PointF2D = new PointF2D(startX, y - wedgeMeasureBeginOpeningLength / 2);\n const lowerLineStart: PointF2D = new PointF2D(startX, y + wedgeMeasureBeginOpeningLength / 2);\n const lineEnd: PointF2D = new PointF2D(endX, y);\n this.addWedgeLines(lineEnd, upperLineStart, lowerLineStart, wedgeLineWidth);\n }\n\n /**\n * This method recalculates the diminuendo lines (for all cases).\n * @param startX left most starting point\n * @param endX right most ending point\n * @param y y placement\n */\n public recalculateDiminuendoLines(startX: number, endX: number, yPosition: number): void {\n const isFirstHalfSplit: boolean = Math.abs(this.lines[0].End.y - this.lines[1].End.y) > 0.0001;\n this.lines.clear();\n if (isFirstHalfSplit) {\n this.createFirstHalfDiminuendoLines(startX, endX, yPosition);\n } else if (this.isSplittedPart) {\n this.createSecondHalfDiminuendoLines(startX, endX, yPosition);\n } else {\n this.createDiminuendoLines(startX, endX, yPosition);\n }\n }\n\n /**\n * Calculate the BoundingBox (as a box around the Wedge).\n */\n public calcPsi(): void {\n if (this.IsVerbal) {\n this.PositionAndShape.calculateBoundingBox();\n return;\n }\n this.PositionAndShape.RelativePosition = this.lines[0].Start;\n this.PositionAndShape.BorderMarginTop = this.lines[0].End.y - this.lines[0].Start.y;\n this.PositionAndShape.BorderMarginBottom = this.lines[1].End.y - this.lines[1].Start.y;\n this.PositionAndShape.Center.y = (this.PositionAndShape.BorderMarginTop + this.PositionAndShape.BorderMarginBottom) / 2;\n // TODO is the center position correct? it wasn't set before, important for AlignmentManager.alignDynamicExpressions()\n // console.log(`relative y, center y: ${this.PositionAndShape.RelativePosition.y},${this.PositionAndShape.Center.y})`);\n\n\n if (this.ContinuousDynamic.DynamicType === ContDynamicEnum.crescendo) {\n this.PositionAndShape.BorderMarginLeft = 0;\n this.PositionAndShape.BorderMarginRight = this.lines[0].End.x - this.lines[0].Start.x;\n } else {\n this.PositionAndShape.BorderMarginLeft = this.lines[0].End.x - this.lines[0].Start.x;\n this.PositionAndShape.BorderMarginRight = 0;\n }\n }\n\n /**\n * Clear Lines\n */\n public cleanUp(): void {\n this.lines.clear();\n }\n\n /**\n * Shift wedge in y position\n * @param shift Number to shift\n */\n public shiftYPosition(shift: number): void {\n if (this.IsVerbal) {\n this.PositionAndShape.RelativePosition.y += shift;\n this.PositionAndShape.calculateBoundingBox();\n } else {\n this.lines[0].Start.y += shift;\n this.lines[0].End.y += shift;\n this.lines[1].End.y += shift;\n }\n }\n\n public squeeze(value: number): void {\n // Verbal expressions are not squeezable and squeezing below the width is also not possible\n if (this.IsVerbal) {\n return;\n }\n const width: number = Math.abs(this.lines[0].End.x - this.lines[0].Start.x);\n if (width < Math.abs(value)) {\n return;\n }\n if (this.ContinuousDynamic.DynamicType === ContDynamicEnum.crescendo) {\n if (value > 0) {\n this.lines[0].Start.x += value;\n } else {\n this.lines[0].End.x += value;\n this.lines[1].End.x += value;\n }\n } else {\n if (value < 0) {\n this.lines[0].Start.x += value;\n } else {\n this.lines[0].End.x += value;\n this.lines[1].End.x += value;\n }\n }\n this.calcPsi();\n }\n\n //#endregion\n\n //#region Private methods\n\n /**\n * Create lines from points and add them to the memory\n * @param wedgePoint start of the expression\n * @param upperWedgeEnd end of the upper line\n * @param lowerWedgeEnd end of lower line\n * @param wedgeLineWidth line width\n */\n private addWedgeLines(wedgePoint: PointF2D, upperWedgeEnd: PointF2D, lowerWedgeEnd: PointF2D, wedgeLineWidth: number): void {\n const upperLine: GraphicalLine = new GraphicalLine(wedgePoint, upperWedgeEnd, wedgeLineWidth);\n const lowerLine: GraphicalLine = new GraphicalLine(wedgePoint, lowerWedgeEnd, wedgeLineWidth);\n\n this.lines.push(upperLine);\n this.lines.push(lowerLine);\n }\n\n /**\n * Create top and bottom lines for continuing wedges\n * @param upperLineStart start of the upper line\n * @param upperLineEnd end of the upper line\n * @param lowerLineStart start of the lower line\n * @param lowerLineEnd end of lower line\n * @param wedgeLineWidth line width\n */\n private addDoubleLines(upperLineStart: PointF2D, upperLineEnd: PointF2D, lowerLineStart: PointF2D, lowerLineEnd: PointF2D, wedgeLineWidth: number): void {\n const upperLine: GraphicalLine = new GraphicalLine(upperLineStart, upperLineEnd, wedgeLineWidth);\n const lowerLine: GraphicalLine = new GraphicalLine(lowerLineStart, lowerLineEnd, wedgeLineWidth);\n\n this.lines.push(upperLine);\n this.lines.push(lowerLine);\n }\n\n //#endregion\n}\n","// created from 'create-ts-index'\n\nexport * from \"./AbstractGraphicalExpression\";\nexport * from \"./AbstractGraphicalInstruction\";\nexport * from \"./AccidentalCalculator\";\nexport * from \"./VexFlow/AlignmentManager\";\nexport * from \"./BoundingBox\";\nexport * from \"./Clickable\";\nexport * from \"./DrawingEnums\";\nexport * from \"./DrawingMode\";\nexport * from \"./DrawingParameters\";\nexport * from \"./EngravingRules\";\nexport * from \"./GraphicalChordSymbolContainer\";\nexport * from \"./GraphicalComment\";\nexport * from \"./GraphicalContinuousDynamicExpression\";\nexport * from \"./GraphicalCurve\";\nexport * from \"./GraphicalInstantaneousDynamicExpression\";\nexport * from \"./GraphicalInstantaneousTempoExpression\";\nexport * from \"./GraphicalLabel\";\nexport * from \"./GraphicalLine\";\nexport * from \"./GraphicalLyricEntry\";\nexport * from \"./GraphicalLyricWord\";\nexport * from \"./GraphicalMarkedArea\";\nexport * from \"./GraphicalMeasure\";\nexport * from \"./GraphicalMusicPage\";\nexport * from \"./GraphicalMusicSheet\";\nexport * from \"./GraphicalNote\";\nexport * from \"./GraphicalObject\";\nexport * from \"./GraphicalOctaveShift\";\nexport * from \"./GraphicalRectangle\";\nexport * from \"./GraphicalSlur\";\nexport * from \"./GraphicalStaffEntry\";\nexport * from \"./GraphicalStaffEntryLink\";\nexport * from \"./GraphicalTie\";\nexport * from \"./GraphicalVoiceEntry\";\nexport * from \"./ISqueezable\";\nexport * from \"./MusicSheetCalculator\";\nexport * from \"./MusicSheetDrawer\";\nexport * from \"./MusicSymbol\";\nexport * from \"./MusicSystem\";\nexport * from \"./MusicSystemBuilder\";\nexport * from \"./OctaveShiftParams\";\nexport * from \"./SelectionEndSymbol\";\nexport * from \"./SelectionStartSymbol\";\nexport * from \"./SkyBottomLineCalculator\";\nexport * from \"./StaffLine\";\nexport * from \"./StaffLineActivitySymbol\";\nexport * from \"./SystemLine\";\nexport * from \"./SystemLinePosition\";\nexport * from \"./SystemLinesEnum\";\nexport * from \"./VerticalGraphicalStaffEntryContainer\";\nexport * from \"./VexFlow\";\n","import {PlacementEnum, AbstractExpression} from \"./AbstractExpression\";\nimport {MultiExpression} from \"./MultiExpression\";\nimport {DynamicExpressionSymbolEnum} from \"./DynamicExpressionSymbolEnum\";\n//import {ArgumentOutOfRangeException} from \"../../Exceptions\";\nimport {InvalidEnumArgumentException} from \"../../Exceptions\";\nimport log from \"loglevel\";\nimport { SourceMeasure } from \"../SourceMeasure\";\n\nexport class InstantaneousDynamicExpression extends AbstractExpression {\n constructor(dynamicExpression: string, soundDynamics: number, placement: PlacementEnum, staffNumber: number,\n measure: SourceMeasure) {\n super(placement);\n super.parentMeasure = measure;\n this.dynamicEnum = DynamicEnum[dynamicExpression.toLowerCase()];\n this.soundDynamic = soundDynamics;\n this.staffNumber = staffNumber;\n }\n public static dynamicToRelativeVolumeDict: { [_: string]: number; } = {\n \"f\": 92.0 / 127.0,\n \"ff\": 108.0 / 127.0,\n \"fff\": 124.0 / 127.0,\n \"ffff\": 125.0 / 127.0,\n \"fffff\": (126.0 / 127.0) ,\n \"ffffff\": (127.0 / 127.0),\n \"fp\": 0.5,\n \"fz\": 0.5,\n \"mf\": 76.0 / 127.0,\n \"mp\": 60.0 / 127.0,\n \"p\": 44.0 / 127.0,\n \"pp\": 28.0 / 127.0,\n \"ppp\": 12.0 / 127.0,\n \"pppp\": 10.0 / 127.0,\n \"ppppp\": 8.0 / 127.0,\n \"pppppp\": 6.0 / 127.0,\n \"rf\": 0.5,\n \"rfz\": 0.5,\n \"sf\": 0.5,\n \"sff\": 0.5,\n \"sffz\": 0.5,\n \"sfp\": 0.5,\n \"sfpp\": 0.5,\n \"sfz\": 0.5\n };\n\n //private static weight: number;\n private static listInstantaneousDynamics: string[] = [\n \"pppppp\", \"ppppp\", \"pppp\", \"ppp\", \"pp\", \"p\",\n \"ffffff\", \"fffff\", \"ffff\", \"fff\", \"ff\", \"f\",\n \"mf\", \"mp\", \"sf\", \"sff\", \"sp\", \"spp\", \"fp\", \"rf\", \"rfz\", \"sfz\", \"sffz\", \"fz\",\n ];\n\n private multiExpression: MultiExpression;\n private dynamicEnum: DynamicEnum;\n private soundDynamic: number;\n private staffNumber: number;\n private length: number;\n\n public get ParentMultiExpression(): MultiExpression {\n return this.multiExpression;\n }\n public set ParentMultiExpression(value: MultiExpression) {\n this.multiExpression = value;\n }\n public get DynEnum(): DynamicEnum {\n return this.dynamicEnum;\n }\n public set DynEnum(value: DynamicEnum) {\n this.dynamicEnum = value;\n }\n public get SoundDynamic(): number {\n return this.soundDynamic;\n }\n public set SoundDynamic(value: number) {\n this.soundDynamic = value;\n }\n public get Placement(): PlacementEnum {\n return this.placement;\n }\n public set Placement(value: PlacementEnum) {\n this.placement = value;\n }\n public get StaffNumber(): number {\n return this.staffNumber;\n }\n public set StaffNumber(value: number) {\n this.staffNumber = value;\n }\n public get Length(): number {\n if (Math.abs(this.length) < 0.0001) {\n this.length = this.calculateLength();\n }\n return this.length;\n }\n public get MidiVolume(): number {\n return InstantaneousDynamicExpression.dynamicToRelativeVolumeDict[this.dynamicEnum] * 127;\n }\n public static isInputStringInstantaneousDynamic(inputString: string): boolean {\n if (!inputString) { return false; }\n return InstantaneousDynamicExpression.isStringInStringList(InstantaneousDynamicExpression.listInstantaneousDynamics, inputString);\n }\n\n //public getInstantaneousDynamicSymbol(expressionSymbolEnum:DynamicExpressionSymbolEnum): FontInfo.MusicFontSymbol {\n // switch (expressionSymbolEnum) {\n // case DynamicExpressionSymbolEnum.p:\n // return FontInfo.MusicFontSymbol.P;\n // case DynamicExpressionSymbolEnum.f:\n // return FontInfo.MusicFontSymbol.F;\n // case DynamicExpressionSymbolEnum.s:\n // return FontInfo.MusicFontSymbol.S;\n // case DynamicExpressionSymbolEnum.z:\n // return FontInfo.MusicFontSymbol.Z;\n // case DynamicExpressionSymbolEnum.m:\n // return FontInfo.MusicFontSymbol.M;\n // case DynamicExpressionSymbolEnum.r:\n // return FontInfo.MusicFontSymbol.R;\n // default:\n // throw new ArgumentOutOfRangeException(\"expressionSymbolEnum\");\n // }\n //}\n public getDynamicExpressionSymbol(c: string): DynamicExpressionSymbolEnum {\n switch (c) {\n case \"p\":\n return DynamicExpressionSymbolEnum.p;\n case \"f\":\n return DynamicExpressionSymbolEnum.f;\n case \"s\":\n return DynamicExpressionSymbolEnum.s;\n case \"z\":\n return DynamicExpressionSymbolEnum.z;\n case \"m\":\n return DynamicExpressionSymbolEnum.m;\n case \"r\":\n return DynamicExpressionSymbolEnum.r;\n default:\n throw new InvalidEnumArgumentException(\"unknown DynamicExpressionSymbolEnum: \" + c);\n }\n }\n private calculateLength(): number {\n //let length: number = 0.0;\n //let dynamic: string = DynamicEnum[this.dynamicEnum];\n //for (let idx: number = 0, len: number = dynamic.length; idx < len; ++idx) {\n // let c: string = dynamic[idx];\n // let dynamicExpressionSymbol: DynamicExpressionSymbolEnum = this.getDynamicExpressionSymbol(c);\n // let symbol: FontInfo.MusicFontSymbol = this.getInstantaneousDynamicSymbol(dynamicExpressionSymbol);\n // length += FontInfo.Info.getBoundingBox(symbol).Width;\n //}\n //return length;\n log.debug(\"[Andrea] instantaneousDynamicExpression: not implemented: calculateLength!\");\n return 0.0;\n }\n\n}\n\nexport enum DynamicEnum {\n pppppp = 0,\n ppppp = 1,\n pppp = 2,\n ppp = 3,\n pp = 4,\n p = 5,\n mp = 6,\n mf = 7,\n f = 8,\n ff = 9,\n fff = 10,\n ffff = 11,\n fffff = 12,\n ffffff = 13,\n sf = 14,\n sff = 15,\n sfp = 16,\n sfpp = 17,\n fp = 18,\n rf = 19,\n rfz = 20,\n sfz = 21,\n sffz = 22,\n fz = 23,\n other = 24\n}\n","import {SizeF2D} from \"./SizeF2D\";\nimport {PointF2D} from \"./PointF2D\";\n\n/**\n * Represent a rectangle on a plane\n */\nexport class RectangleF2D {\n public x: number = 0;\n public y: number = 0;\n public width: number = 0;\n public height: number = 0;\n\n /**\n *\n * @param x\n * @param y\n * @param width\n * @param height\n */\n constructor(x: number, y: number, width: number, height: number) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n public static createFromLocationAndSize(location: PointF2D, size: SizeF2D): RectangleF2D {\n return new RectangleF2D(location.x, location.y, size.width, size.height);\n }\n public get Location(): PointF2D {\n return new PointF2D(this.x, this.y);\n }\n public get Size(): SizeF2D {\n return new SizeF2D(this.width, this.height);\n }\n}\n","import {GraphicalObject} from \"./GraphicalObject\";\nimport {StaffLine} from \"./StaffLine\";\nimport {BoundingBox} from \"./BoundingBox\";\n\nexport class StaffLineActivitySymbol extends GraphicalObject {\n\n constructor(staffLine: StaffLine) {\n super();\n this.parentStaffLine = staffLine;\n const staffLinePsi: BoundingBox = staffLine.PositionAndShape;\n this.boundingBox = new BoundingBox(this, staffLinePsi);\n this.boundingBox.BorderRight = 6;\n this.boundingBox.BorderBottom = 4.5;\n this.boundingBox.BorderLeft = -1.5;\n this.boundingBox.BorderTop = -1.5;\n }\n\n public parentStaffLine: StaffLine;\n\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\nvar arrays = require(\"./arrays\");\nvar LinkedList = /** @class */ (function () {\n /**\n * Creates an empty Linked List.\n * @class A linked list is a data structure consisting of a group of nodes\n * which together represent a sequence.\n * @constructor\n */\n function LinkedList() {\n /**\n * First node in the list\n * @type {Object}\n * @private\n */\n this.firstNode = null;\n /**\n * Last node in the list\n * @type {Object}\n * @private\n */\n this.lastNode = null;\n /**\n * Number of elements in the list\n * @type {number}\n * @private\n */\n this.nElements = 0;\n }\n /**\n * Adds an element to this list.\n * @param {Object} item element to be added.\n * @param {number=} index optional index to add the element. If no index is specified\n * the element is added to the end of this list.\n * @return {boolean} true if the element was added or false if the index is invalid\n * or if the element is undefined.\n */\n LinkedList.prototype.add = function (item, index) {\n if (util.isUndefined(index)) {\n index = this.nElements;\n }\n if (index < 0 || index > this.nElements || util.isUndefined(item)) {\n return false;\n }\n var newNode = this.createNode(item);\n if (this.nElements === 0 || this.lastNode === null) {\n // First node in the list.\n this.firstNode = newNode;\n this.lastNode = newNode;\n }\n else if (index === this.nElements) {\n // Insert at the end.\n this.lastNode.next = newNode;\n this.lastNode = newNode;\n }\n else if (index === 0) {\n // Change first node.\n newNode.next = this.firstNode;\n this.firstNode = newNode;\n }\n else {\n var prev = this.nodeAtIndex(index - 1);\n if (prev === null) {\n return false;\n }\n newNode.next = prev.next;\n prev.next = newNode;\n }\n this.nElements++;\n return true;\n };\n /**\n * Returns the first element in this list.\n * @return {*} the first element of the list or undefined if the list is\n * empty.\n */\n LinkedList.prototype.first = function () {\n if (this.firstNode !== null) {\n return this.firstNode.element;\n }\n return undefined;\n };\n /**\n * Returns the last element in this list.\n * @return {*} the last element in the list or undefined if the list is\n * empty.\n */\n LinkedList.prototype.last = function () {\n if (this.lastNode !== null) {\n return this.lastNode.element;\n }\n return undefined;\n };\n /**\n * Returns the element at the specified position in this list.\n * @param {number} index desired index.\n * @return {*} the element at the given index or undefined if the index is\n * out of bounds.\n */\n LinkedList.prototype.elementAtIndex = function (index) {\n var node = this.nodeAtIndex(index);\n if (node === null) {\n return undefined;\n }\n return node.element;\n };\n /**\n * Returns the index in this list of the first occurrence of the\n * specified element, or -1 if the List does not contain this element.\n *

If the elements inside this list are\n * not comparable with the === operator a custom equals function should be\n * provided to perform searches, the function must receive two arguments and\n * return true if they are equal, false otherwise. Example:

\n *\n *
\n     * const petsAreEqualByName = function(pet1, pet2) {\n     *  return pet1.name === pet2.name;\n     * }\n     * 
\n * @param {Object} item element to search for.\n * @param {function(Object,Object):boolean=} equalsFunction Optional\n * function used to check if two elements are equal.\n * @return {number} the index in this list of the first occurrence\n * of the specified element, or -1 if this list does not contain the\n * element.\n */\n LinkedList.prototype.indexOf = function (item, equalsFunction) {\n var equalsF = equalsFunction || util.defaultEquals;\n if (util.isUndefined(item)) {\n return -1;\n }\n var currentNode = this.firstNode;\n var index = 0;\n while (currentNode !== null) {\n if (equalsF(currentNode.element, item)) {\n return index;\n }\n index++;\n currentNode = currentNode.next;\n }\n return -1;\n };\n /**\n * Returns true if this list contains the specified element.\n *

If the elements inside the list are\n * not comparable with the === operator a custom equals function should be\n * provided to perform searches, the function must receive two arguments and\n * return true if they are equal, false otherwise. Example:

\n *\n *
\n     * const petsAreEqualByName = function(pet1, pet2) {\n     *  return pet1.name === pet2.name;\n     * }\n     * 
\n * @param {Object} item element to search for.\n * @param {function(Object,Object):boolean=} equalsFunction Optional\n * function used to check if two elements are equal.\n * @return {boolean} true if this list contains the specified element, false\n * otherwise.\n */\n LinkedList.prototype.contains = function (item, equalsFunction) {\n return (this.indexOf(item, equalsFunction) >= 0);\n };\n /**\n * Removes the first occurrence of the specified element in this list.\n *

If the elements inside the list are\n * not comparable with the === operator a custom equals function should be\n * provided to perform searches, the function must receive two arguments and\n * return true if they are equal, false otherwise. Example:

\n *\n *
\n     * const petsAreEqualByName = function(pet1, pet2) {\n     *  return pet1.name === pet2.name;\n     * }\n     * 
\n * @param {Object} item element to be removed from this list, if present.\n * @return {boolean} true if the list contained the specified element.\n */\n LinkedList.prototype.remove = function (item, equalsFunction) {\n var equalsF = equalsFunction || util.defaultEquals;\n if (this.nElements < 1 || util.isUndefined(item)) {\n return false;\n }\n var previous = null;\n var currentNode = this.firstNode;\n while (currentNode !== null) {\n if (equalsF(currentNode.element, item)) {\n if (previous === null) {\n this.firstNode = currentNode.next;\n if (currentNode === this.lastNode) {\n this.lastNode = null;\n }\n }\n else if (currentNode === this.lastNode) {\n this.lastNode = previous;\n previous.next = currentNode.next;\n currentNode.next = null;\n }\n else {\n previous.next = currentNode.next;\n currentNode.next = null;\n }\n this.nElements--;\n return true;\n }\n previous = currentNode;\n currentNode = currentNode.next;\n }\n return false;\n };\n /**\n * Removes all of the elements from this list.\n */\n LinkedList.prototype.clear = function () {\n this.firstNode = null;\n this.lastNode = null;\n this.nElements = 0;\n };\n /**\n * Returns true if this list is equal to the given list.\n * Two lists are equal if they have the same elements in the same order.\n * @param {LinkedList} other the other list.\n * @param {function(Object,Object):boolean=} equalsFunction optional\n * function used to check if two elements are equal. If the elements in the lists\n * are custom objects you should provide a function, otherwise\n * the === operator is used to check equality between elements.\n * @return {boolean} true if this list is equal to the given list.\n */\n LinkedList.prototype.equals = function (other, equalsFunction) {\n var eqF = equalsFunction || util.defaultEquals;\n if (!(other instanceof LinkedList)) {\n return false;\n }\n if (this.size() !== other.size()) {\n return false;\n }\n return this.equalsAux(this.firstNode, other.firstNode, eqF);\n };\n /**\n * @private\n */\n LinkedList.prototype.equalsAux = function (n1, n2, eqF) {\n while (n1 !== null && n2 !== null) {\n if (!eqF(n1.element, n2.element)) {\n return false;\n }\n n1 = n1.next;\n n2 = n2.next;\n }\n return true;\n };\n /**\n * Removes the element at the specified position in this list.\n * @param {number} index given index.\n * @return {*} removed element or undefined if the index is out of bounds.\n */\n LinkedList.prototype.removeElementAtIndex = function (index) {\n if (index < 0 || index >= this.nElements || this.firstNode === null || this.lastNode === null) {\n return undefined;\n }\n var element;\n if (this.nElements === 1) {\n //First node in the list.\n element = this.firstNode.element;\n this.firstNode = null;\n this.lastNode = null;\n }\n else {\n var previous = this.nodeAtIndex(index - 1);\n if (previous === null) {\n element = this.firstNode.element;\n this.firstNode = this.firstNode.next;\n }\n else if (previous.next === this.lastNode) {\n element = this.lastNode.element;\n this.lastNode = previous;\n }\n if (previous !== null && previous.next !== null) {\n element = previous.next.element;\n previous.next = previous.next.next;\n }\n }\n this.nElements--;\n return element;\n };\n /**\n * Executes the provided function once for each element present in this list in order.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element value, to break the iteration you can\n * optionally return false.\n */\n LinkedList.prototype.forEach = function (callback) {\n var currentNode = this.firstNode;\n while (currentNode !== null) {\n if (callback(currentNode.element) === false) {\n break;\n }\n currentNode = currentNode.next;\n }\n };\n /**\n * Reverses the order of the elements in this linked list (makes the last\n * element first, and the first element last).\n */\n LinkedList.prototype.reverse = function () {\n var previous = null;\n var current = this.firstNode;\n var temp = null;\n while (current !== null) {\n temp = current.next;\n current.next = previous;\n previous = current;\n current = temp;\n }\n temp = this.firstNode;\n this.firstNode = this.lastNode;\n this.lastNode = temp;\n };\n /**\n * Returns an array containing all of the elements in this list in proper\n * sequence.\n * @return {Array.<*>} an array containing all of the elements in this list,\n * in proper sequence.\n */\n LinkedList.prototype.toArray = function () {\n var array = [];\n var currentNode = this.firstNode;\n while (currentNode !== null) {\n array.push(currentNode.element);\n currentNode = currentNode.next;\n }\n return array;\n };\n /**\n * Returns the number of elements in this list.\n * @return {number} the number of elements in this list.\n */\n LinkedList.prototype.size = function () {\n return this.nElements;\n };\n /**\n * Returns true if this list contains no elements.\n * @return {boolean} true if this list contains no elements.\n */\n LinkedList.prototype.isEmpty = function () {\n return this.nElements <= 0;\n };\n LinkedList.prototype.toString = function () {\n return arrays.toString(this.toArray());\n };\n /**\n * @private\n */\n LinkedList.prototype.nodeAtIndex = function (index) {\n if (index < 0 || index >= this.nElements) {\n return null;\n }\n if (index === (this.nElements - 1)) {\n return this.lastNode;\n }\n var node = this.firstNode;\n for (var i = 0; i < index && node !== null; i++) {\n node = node.next;\n }\n return node;\n };\n /**\n * @private\n */\n LinkedList.prototype.createNode = function (item) {\n return {\n element: item,\n next: null\n };\n };\n return LinkedList;\n}()); // End of linked list\nexports.default = LinkedList;\n//# sourceMappingURL=LinkedList.js.map","import {MusicSheet} from \"../MusicSheet\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\nimport {GraphicalMeasure} from \"./GraphicalMeasure\";\nimport {GraphicalMusicPage} from \"./GraphicalMusicPage\";\nimport {VerticalGraphicalStaffEntryContainer} from \"./VerticalGraphicalStaffEntryContainer\";\nimport {GraphicalLabel} from \"./GraphicalLabel\";\nimport {GraphicalLine} from \"./GraphicalLine\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\nimport {SourceStaffEntry} from \"../VoiceData/SourceStaffEntry\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {ClefInstruction} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {AbstractNotationInstruction} from \"../VoiceData/Instructions/AbstractNotationInstruction\";\nimport {KeyInstruction} from \"../VoiceData/Instructions/KeyInstruction\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {GraphicalNote} from \"./GraphicalNote\";\nimport {Instrument} from \"../Instrument\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {MusicSheetCalculator} from \"./MusicSheetCalculator\";\nimport log from \"loglevel\";\n//import Dictionary from \"typescript-collections/dist/lib/Dictionary\"; // unused for now\nimport {CollectionUtil} from \"../../Util/CollectionUtil\";\nimport {SelectionStartSymbol} from \"./SelectionStartSymbol\";\nimport {SelectionEndSymbol} from \"./SelectionEndSymbol\";\nimport {OutlineAndFillStyleEnum} from \"./DrawingEnums\";\n\n/**\n * The graphical counterpart of a [[MusicSheet]]\n */\nexport class GraphicalMusicSheet {\n constructor(musicSheet: MusicSheet, calculator: MusicSheetCalculator) {\n this.musicSheet = musicSheet;\n this.numberOfStaves = this.musicSheet.Staves.length;\n this.calculator = calculator;\n this.calculator.initialize(this);\n }\n\n private musicSheet: MusicSheet;\n //private fontInfo: FontInfo = FontInfo.Info;\n private calculator: MusicSheetCalculator;\n private musicPages: GraphicalMusicPage[] = [];\n /** measures (i,j) where i is the measure number and j the staff index (e.g. staff indices 0, 1 for two piano parts) */\n private measureList: GraphicalMeasure[][] = [];\n private verticalGraphicalStaffEntryContainers: VerticalGraphicalStaffEntryContainer[] = [];\n private title: GraphicalLabel;\n private subtitle: GraphicalLabel;\n private composer: GraphicalLabel;\n private lyricist: GraphicalLabel;\n private cursors: GraphicalLine[] = [];\n private selectionStartSymbol: SelectionStartSymbol;\n private selectionEndSymbol: SelectionEndSymbol;\n private minAllowedSystemWidth: number;\n //private systemImages: Dictionary = new Dictionary();\n private numberOfStaves: number;\n private leadSheet: boolean = false;\n\n public get ParentMusicSheet(): MusicSheet {\n return this.musicSheet;\n }\n\n public get GetCalculator(): MusicSheetCalculator {\n return this.calculator;\n }\n\n public get MusicPages(): GraphicalMusicPage[] {\n return this.musicPages;\n }\n\n public set MusicPages(value: GraphicalMusicPage[]) {\n this.musicPages = value;\n }\n\n //public get FontInfo(): FontInfo {\n // return this.fontInfo;\n //}\n\n public get MeasureList(): GraphicalMeasure[][] {\n return this.measureList;\n }\n\n public set MeasureList(value: GraphicalMeasure[][]) {\n this.measureList = value;\n }\n\n public get VerticalGraphicalStaffEntryContainers(): VerticalGraphicalStaffEntryContainer[] {\n return this.verticalGraphicalStaffEntryContainers;\n }\n\n public set VerticalGraphicalStaffEntryContainers(value: VerticalGraphicalStaffEntryContainer[]) {\n this.verticalGraphicalStaffEntryContainers = value;\n }\n\n public get Title(): GraphicalLabel {\n return this.title;\n }\n\n public set Title(value: GraphicalLabel) {\n this.title = value;\n }\n\n public get Subtitle(): GraphicalLabel {\n return this.subtitle;\n }\n\n public set Subtitle(value: GraphicalLabel) {\n this.subtitle = value;\n }\n\n public get Composer(): GraphicalLabel {\n return this.composer;\n }\n\n public set Composer(value: GraphicalLabel) {\n this.composer = value;\n }\n\n public get Lyricist(): GraphicalLabel {\n return this.lyricist;\n }\n\n public set Lyricist(value: GraphicalLabel) {\n this.lyricist = value;\n }\n\n public get Cursors(): GraphicalLine[] {\n return this.cursors;\n }\n\n public get SelectionStartSymbol(): SelectionStartSymbol {\n return this.selectionStartSymbol;\n }\n\n public get SelectionEndSymbol(): SelectionEndSymbol {\n return this.selectionEndSymbol;\n }\n\n public get MinAllowedSystemWidth(): number {\n return this.minAllowedSystemWidth;\n }\n\n public set MinAllowedSystemWidth(value: number) {\n this.minAllowedSystemWidth = value;\n }\n\n // public get SystemImages(): Dictionary {\n // return this.systemImages;\n // }\n\n public get NumberOfStaves(): number {\n return this.numberOfStaves;\n }\n\n public get LeadSheet(): boolean {\n return this.leadSheet;\n }\n\n public set LeadSheet(value: boolean) {\n this.leadSheet = value;\n }\n\n /**\n * Calculate the Absolute Positions from the Relative Positions.\n * @param graphicalMusicSheet\n */\n public static transformRelativeToAbsolutePosition(graphicalMusicSheet: GraphicalMusicSheet): void {\n for (let i: number = 0; i < graphicalMusicSheet.MusicPages.length; i++) {\n const pageAbsolute: PointF2D = graphicalMusicSheet.MusicPages[i].setMusicPageAbsolutePosition(i, graphicalMusicSheet.ParentMusicSheet.Rules);\n const page: GraphicalMusicPage = graphicalMusicSheet.MusicPages[i];\n page.PositionAndShape.calculateAbsolutePositionsRecursive(pageAbsolute.x, pageAbsolute.y);\n }\n }\n\n public Initialize(): void {\n this.verticalGraphicalStaffEntryContainers = [];\n this.musicPages = [];\n this.measureList = [];\n }\n\n public reCalculate(): void {\n this.calculator.calculate();\n }\n\n public prepare(): void {\n this.calculator.prepareGraphicalMusicSheet();\n }\n\n public EnforceRedrawOfMusicSystems(): void {\n for (let idx: number = 0, len: number = this.musicPages.length; idx < len; ++idx) {\n const graphicalMusicPage: GraphicalMusicPage = this.musicPages[idx];\n for (let idx2: number = 0, len2: number = graphicalMusicPage.MusicSystems.length; idx2 < len2; ++idx2) {\n const musicSystem: MusicSystem = graphicalMusicPage.MusicSystems[idx2];\n musicSystem.needsToBeRedrawn = true;\n }\n }\n }\n\n public getClickedObject(positionOnMusicSheet: PointF2D): T {\n for (let idx: number = 0, len: number = this.MusicPages.length; idx < len; ++idx) {\n const graphicalMusicPage: GraphicalMusicPage = this.MusicPages[idx];\n return graphicalMusicPage.PositionAndShape.getClickedObjectOfType(positionOnMusicSheet);\n }\n return undefined;\n }\n\n /**\n * Search the MeasureList for a certain GraphicalStaffEntry with the given SourceStaffEntry,\n * at a certain verticalIndex (eg a corresponding Staff), starting at a specific horizontalIndex (eg specific GraphicalMeasure).\n * @param staffIndex\n * @param measureIndex\n * @param sourceStaffEntry\n * @returns {any}\n */\n public findGraphicalStaffEntryFromMeasureList(staffIndex: number, measureIndex: number, sourceStaffEntry: SourceStaffEntry): GraphicalStaffEntry {\n for (let i: number = measureIndex; i < this.measureList.length; i++) {\n const graphicalMeasure: GraphicalMeasure = this.measureList[i][staffIndex];\n for (let idx: number = 0, len: number = graphicalMeasure.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = graphicalMeasure.staffEntries[idx];\n if (graphicalStaffEntry.sourceStaffEntry === sourceStaffEntry) {\n return graphicalStaffEntry;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Return the next (to the right) not null GraphicalStaffEntry from a given Index.\n * @param staffIndex\n * @param measureIndex\n * @param graphicalStaffEntry\n * @returns {any}\n */\n public findNextGraphicalStaffEntry(staffIndex: number, measureIndex: number, graphicalStaffEntry: GraphicalStaffEntry): GraphicalStaffEntry {\n const graphicalMeasure: GraphicalMeasure = graphicalStaffEntry.parentMeasure;\n const graphicalStaffEntryIndex: number = graphicalMeasure.staffEntries.indexOf(graphicalStaffEntry);\n if (graphicalStaffEntryIndex < graphicalMeasure.staffEntries.length - 1) {\n return graphicalMeasure.staffEntries[graphicalStaffEntryIndex + 1];\n } else if (measureIndex < this.measureList.length - 1) {\n const nextMeasure: GraphicalMeasure = this.measureList[measureIndex + 1][staffIndex];\n if (nextMeasure.staffEntries.length > 0) {\n return nextMeasure.staffEntries[0];\n }\n }\n return undefined;\n }\n\n public getFirstVisibleMeasuresListFromIndices(start: number, end: number): GraphicalMeasure[] {\n const graphicalMeasures: GraphicalMeasure[] = [];\n const numberOfStaves: number = this.measureList[0].length;\n for (let i: number = start; i <= end; i++) {\n for (let j: number = 0; j < numberOfStaves; j++) {\n if (this.measureList[i][j].isVisible()) {\n graphicalMeasures.push(this.measureList[i][j]);\n break;\n }\n }\n }\n return graphicalMeasures;\n }\n\n public orderMeasuresByStaffLine(measures: GraphicalMeasure[]): GraphicalMeasure[][] {\n const orderedMeasures: GraphicalMeasure[][] = [];\n let mList: GraphicalMeasure[] = [];\n orderedMeasures.push(mList);\n for (let i: number = 0; i < measures.length; i++) {\n if (i === 0) {\n mList.push(measures[0]);\n } else {\n if (measures[i].ParentStaffLine === measures[i - 1].ParentStaffLine) {\n mList.push(measures[i]);\n } else {\n if (orderedMeasures.indexOf(mList) === -1) {\n orderedMeasures.push(mList);\n }\n mList = [];\n orderedMeasures.push(mList);\n mList.push(measures[i]);\n }\n }\n }\n return orderedMeasures;\n }\n\n /**\n * Return the active Clefs at the start of the first SourceMeasure.\n * @returns {ClefInstruction[]}\n */\n public initializeActiveClefs(): ClefInstruction[] {\n const activeClefs: ClefInstruction[] = [];\n const firstSourceMeasure: SourceMeasure = this.musicSheet.getFirstSourceMeasure();\n if (firstSourceMeasure) {\n for (let i: number = 0; i < firstSourceMeasure.CompleteNumberOfStaves; i++) {\n let clef: ClefInstruction = new ClefInstruction();\n if (firstSourceMeasure.FirstInstructionsStaffEntries[i]) {\n for (let idx: number = 0, len: number = firstSourceMeasure.FirstInstructionsStaffEntries[i].Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = firstSourceMeasure.FirstInstructionsStaffEntries[i].Instructions[idx];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n clef = abstractNotationInstruction;\n\n }\n }\n }\n activeClefs.push(clef);\n }\n }\n return activeClefs;\n }\n\n public GetMainKey(): KeyInstruction {\n const firstSourceMeasure: SourceMeasure = this.musicSheet.getFirstSourceMeasure();\n if (firstSourceMeasure) {\n for (let i: number = 0; i < firstSourceMeasure.CompleteNumberOfStaves; i++) {\n for (let idx: number = 0, len: number = firstSourceMeasure.FirstInstructionsStaffEntries[i].Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = firstSourceMeasure.FirstInstructionsStaffEntries[i].Instructions[idx];\n if (abstractNotationInstruction instanceof KeyInstruction) {\n return abstractNotationInstruction;\n }\n }\n }\n }\n return undefined;\n }\n\n /**\n * Create the VerticalContainer and adds it to the List at the correct Timestamp position.\n * @param timestamp\n * @returns {any}\n */\n public getOrCreateVerticalContainer(timestamp: Fraction): VerticalGraphicalStaffEntryContainer {\n if (this.verticalGraphicalStaffEntryContainers.length === 0 ||\n (CollectionUtil.getLastElement(this.verticalGraphicalStaffEntryContainers).AbsoluteTimestamp).lt(timestamp)) {\n const verticalGraphicalStaffEntryContainer: VerticalGraphicalStaffEntryContainer =\n new VerticalGraphicalStaffEntryContainer(this.numberOfStaves, timestamp);\n this.verticalGraphicalStaffEntryContainers.push(verticalGraphicalStaffEntryContainer);\n return verticalGraphicalStaffEntryContainer;\n }\n for (let i: number = this.verticalGraphicalStaffEntryContainers.length - 1; i >= 0; i--) {\n if (this.verticalGraphicalStaffEntryContainers[i].AbsoluteTimestamp.lt(timestamp)) {\n const verticalGraphicalStaffEntryContainer: VerticalGraphicalStaffEntryContainer =\n new VerticalGraphicalStaffEntryContainer(this.numberOfStaves, timestamp);\n this.verticalGraphicalStaffEntryContainers.splice(i + 1, 0, verticalGraphicalStaffEntryContainer);\n return verticalGraphicalStaffEntryContainer;\n }\n if (this.verticalGraphicalStaffEntryContainers[i].AbsoluteTimestamp.Equals(timestamp)) {\n return this.verticalGraphicalStaffEntryContainers[i];\n }\n }\n return undefined;\n }\n\n /**\n * Does a binary search on the container list and returns the VerticalContainer with the given Timestamp.\n * The search begins at startIndex, if given.\n * If the timestamp cannot be found, null is returned.\n * @param timestamp - The timestamp for which the container shall be found.\n * @param startIndex - The index from which the search starts in the container list.\n * @returns {any}\n * @constructor\n */\n public GetVerticalContainerFromTimestamp(timestamp: Fraction, startIndex: number = 0): VerticalGraphicalStaffEntryContainer {\n const index: number = CollectionUtil.binarySearch(this.verticalGraphicalStaffEntryContainers,\n new VerticalGraphicalStaffEntryContainer(0, timestamp),\n VerticalGraphicalStaffEntryContainer.compareByTimestamp,\n startIndex);\n if (index >= 0) {\n return this.verticalGraphicalStaffEntryContainers[index];\n }\n return undefined;\n }\n\n /**\n * Perform a binary search for the absolute given Timestamp in all the GraphicalVerticalContainers.\n * @param musicTimestamp\n * @returns {number}\n * @constructor\n */\n public GetInterpolatedIndexInVerticalContainers(musicTimestamp: Fraction): number {\n const containers: VerticalGraphicalStaffEntryContainer[] = this.verticalGraphicalStaffEntryContainers;\n let leftIndex: number = 0;\n let rightIndex: number = containers.length - 1;\n let foundIndex: number;\n let leftTS: Fraction = undefined;\n let rightTS: Fraction = undefined;\n if (musicTimestamp.lte(containers[containers.length - 1].AbsoluteTimestamp)) {\n while (rightIndex - leftIndex > 1) {\n const middleIndex: number = Math.floor((rightIndex + leftIndex) / 2);\n if (containers[leftIndex].AbsoluteTimestamp.Equals(musicTimestamp)) {\n rightIndex = leftIndex;\n break;\n } else if (containers[rightIndex].AbsoluteTimestamp.Equals(musicTimestamp)) {\n leftIndex = rightIndex;\n break;\n } else if (containers[middleIndex].AbsoluteTimestamp.Equals(musicTimestamp)) {\n return this.verticalGraphicalStaffEntryContainers.indexOf(containers[middleIndex]);\n } else if (musicTimestamp.lt(containers[middleIndex].AbsoluteTimestamp)) {\n rightIndex = middleIndex;\n } else {\n leftIndex = middleIndex;\n }\n }\n\n // no interpolation needed\n if (leftIndex === rightIndex) {\n return this.verticalGraphicalStaffEntryContainers.indexOf(containers[leftIndex]);\n }\n leftTS = containers[leftIndex].AbsoluteTimestamp;\n rightTS = containers[rightIndex].AbsoluteTimestamp;\n } else {\n leftTS = containers[containers.length - 1].AbsoluteTimestamp;\n rightTS = Fraction.plus(this.getLongestStaffEntryDuration(containers.length - 1), leftTS);\n rightIndex = containers.length;\n }\n const diff: number = rightTS.RealValue - leftTS.RealValue;\n const diffTS: number = rightTS.RealValue - musicTimestamp.RealValue;\n\n // estimate the interpolated index\n foundIndex = rightIndex - (diffTS / diff);\n return Math.min(foundIndex, this.verticalGraphicalStaffEntryContainers.length);\n }\n\n /**\n * Get a List with the indices of all the visible GraphicalMeasures and calculates their\n * corresponding indices in the first SourceMeasure, taking into account Instruments with multiple Staves.\n * @param visibleMeasures\n * @returns {number[]}\n */\n public getVisibleStavesIndicesFromSourceMeasure(visibleMeasures: GraphicalMeasure[]): number[] {\n const visibleInstruments: Instrument[] = [];\n const visibleStavesIndices: number[] = [];\n for (let idx: number = 0, len: number = visibleMeasures.length; idx < len; ++idx) {\n const graphicalMeasure: GraphicalMeasure = visibleMeasures[idx];\n const instrument: Instrument = graphicalMeasure.ParentStaff.ParentInstrument;\n if (visibleInstruments.indexOf(instrument) === -1) {\n visibleInstruments.push(instrument);\n }\n }\n for (let idx: number = 0, len: number = visibleInstruments.length; idx < len; ++idx) {\n const instrument: Instrument = visibleInstruments[idx];\n const index: number = this.musicSheet.getGlobalStaffIndexOfFirstStaff(instrument);\n for (let j: number = 0; j < instrument.Staves.length; j++) {\n visibleStavesIndices.push(index + j);\n }\n }\n return visibleStavesIndices;\n }\n\n /**\n * Returns the GraphicalMeasure with the given SourceMeasure as Parent at the given staff index.\n * @param sourceMeasure\n * @param staffIndex\n * @returns {any}\n */\n public getGraphicalMeasureFromSourceMeasureAndIndex(sourceMeasure: SourceMeasure, staffIndex: number): GraphicalMeasure {\n for (let i: number = 0; i < this.measureList.length; i++) {\n if (this.measureList[i][0].parentSourceMeasure === sourceMeasure) {\n return this.measureList[i][staffIndex];\n }\n }\n return undefined;\n }\n\n public getLastGraphicalMeasureFromIndex(staffIndex: number, lastRendered: boolean = true): GraphicalMeasure {\n let measureIndex: number = this.measureList.length - 1;\n if (lastRendered) {\n measureIndex = Math.min(measureIndex, this.musicSheet.Rules.MaxMeasureToDrawIndex);\n }\n return this.measureList[measureIndex][staffIndex];\n }\n\n public getMeasureIndex(graphicalMeasure: GraphicalMeasure, measureIndex: number, inListIndex: number): boolean {\n measureIndex = 0;\n inListIndex = 0;\n for (; measureIndex < this.measureList.length; measureIndex++) {\n for (let idx: number = 0, len: number = this.measureList[measureIndex].length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.measureList[measureIndex][idx];\n if (measure === graphicalMeasure) {\n return true;\n }\n }\n }\n return false;\n }\n\n public GetNearestNote(clickPosition: PointF2D, maxClickDist: PointF2D): GraphicalNote {\n const initialSearchArea: number = 10;\n const foundNotes: GraphicalNote[] = [];\n\n // Prepare search area\n const region: BoundingBox = new BoundingBox();\n region.BorderLeft = clickPosition.x - initialSearchArea;\n region.BorderTop = clickPosition.y - initialSearchArea;\n region.BorderRight = clickPosition.x + initialSearchArea;\n region.BorderBottom = clickPosition.y + initialSearchArea;\n region.AbsolutePosition = new PointF2D(0, 0);\n\n // Search for StaffEntries in region\n for (let idx: number = 0, len: number = this.MusicPages.length; idx < len; ++idx) {\n const graphicalMusicPage: GraphicalMusicPage = this.MusicPages[idx];\n const entries: GraphicalNote[] = graphicalMusicPage.PositionAndShape.getObjectsInRegion(region);\n //let entriesArr: GraphicalNote[] = __as__(entries, GraphicalNote[]) ? ? entries;\n if (!entries) {\n continue;\n } else {\n for (let idx2: number = 0, len2: number = entries.length; idx2 < len2; ++idx2) {\n const note: GraphicalNote = entries[idx2];\n if (Math.abs(note.PositionAndShape.AbsolutePosition.x - clickPosition.x) < maxClickDist.x\n && Math.abs(note.PositionAndShape.AbsolutePosition.y - clickPosition.y) < maxClickDist.y) {\n foundNotes.push(note);\n }\n }\n }\n }\n\n // Get closest entry\n let closest: GraphicalNote = undefined;\n for (let idx: number = 0, len: number = foundNotes.length; idx < len; ++idx) {\n const note: GraphicalNote = foundNotes[idx];\n if (closest === undefined) {\n closest = note;\n } else {\n if (!note.parentVoiceEntry.parentStaffEntry.relInMeasureTimestamp) {\n continue;\n }\n const deltaNew: number = this.CalculateDistance(note.PositionAndShape.AbsolutePosition, clickPosition);\n const deltaOld: number = this.CalculateDistance(closest.PositionAndShape.AbsolutePosition, clickPosition);\n if (deltaNew < deltaOld) {\n closest = note;\n }\n }\n }\n if (closest) {\n return closest;\n }\n // TODO No staff entry was found. Feedback?\n // throw new ArgumentException(\"No staff entry found\");\n return undefined;\n }\n\n public GetClickableLabel(clickPosition: PointF2D): GraphicalLabel {\n const initialSearchAreaX: number = 4;\n const initialSearchAreaY: number = 4;\n // Prepare search area\n const region: BoundingBox = new BoundingBox();\n region.BorderLeft = clickPosition.x - initialSearchAreaX;\n region.BorderTop = clickPosition.y - initialSearchAreaY;\n region.BorderRight = clickPosition.x + initialSearchAreaX;\n region.BorderBottom = clickPosition.y + initialSearchAreaY;\n region.AbsolutePosition = new PointF2D(0, 0);\n for (let idx: number = 0, len: number = this.MusicPages.length; idx < len; ++idx) {\n const graphicalMusicPage: GraphicalMusicPage = this.MusicPages[idx];\n const entries: GraphicalLabel[] = graphicalMusicPage.PositionAndShape.getObjectsInRegion(region);\n if (entries.length !== 1) {\n continue;\n } else {\n for (let idx2: number = 0, len2: number = entries.length; idx2 < len2; ++idx2) {\n const clickedLabel: GraphicalLabel = entries[idx2];\n return clickedLabel;\n }\n }\n }\n return undefined;\n }\n\n public GetNearestStaffEntry(clickPosition: PointF2D): GraphicalStaffEntry {\n const initialSearchArea: number = 10;\n const foundEntries: GraphicalStaffEntry[] = [];\n // Prepare search area\n const region: BoundingBox = new BoundingBox(undefined);\n region.BorderLeft = clickPosition.x - initialSearchArea;\n region.BorderTop = clickPosition.y - initialSearchArea;\n region.BorderRight = clickPosition.x + initialSearchArea;\n region.BorderBottom = clickPosition.y + initialSearchArea;\n region.AbsolutePosition = new PointF2D(0, 0);\n // Search for StaffEntries in region\n for (let idx: number = 0, len: number = this.MusicPages.length; idx < len; ++idx) {\n const graphicalMusicPage: GraphicalMusicPage = this.MusicPages[idx];\n const entries: GraphicalStaffEntry[] = graphicalMusicPage.PositionAndShape.getObjectsInRegion(region, false);\n if (!entries || entries.length === 0) {\n continue;\n } else {\n for (let idx2: number = 0, len2: number = entries.length; idx2 < len2; ++idx2) {\n const gse: GraphicalStaffEntry = entries[idx2];\n foundEntries.push(gse);\n }\n }\n }\n // Get closest entry\n let closest: GraphicalStaffEntry = undefined;\n for (let idx: number = 0, len: number = foundEntries.length; idx < len; ++idx) {\n const gse: GraphicalStaffEntry = foundEntries[idx];\n if (closest === undefined) {\n closest = gse;\n } else {\n if (!gse.relInMeasureTimestamp) {\n continue;\n }\n const deltaNew: number = this.CalculateDistance(gse.PositionAndShape.AbsolutePosition, clickPosition);\n const deltaOld: number = this.CalculateDistance(closest.PositionAndShape.AbsolutePosition, clickPosition);\n if (deltaNew < deltaOld) {\n closest = gse;\n }\n }\n }\n if (closest) {\n return closest;\n }\n // TODO No staff entry was found. Feedback?\n // throw new ArgumentException(\"No staff entry found\");\n return undefined;\n }\n\n public GetPossibleCommentAnchor(clickPosition: PointF2D): SourceStaffEntry {\n const entry: GraphicalStaffEntry = this.GetNearestStaffEntry(clickPosition);\n if (!entry) {\n return undefined;\n }\n return entry.sourceStaffEntry;\n }\n\n public getClickedObjectOfType(positionOnMusicSheet: PointF2D): T {\n for (let idx: number = 0, len: number = this.musicPages.length; idx < len; ++idx) {\n const page: GraphicalMusicPage = this.musicPages[idx];\n const o: Object = page.PositionAndShape.getClickedObjectOfType(positionOnMusicSheet);\n if (o) {\n return (o as T);\n }\n }\n return undefined;\n }\n\n public tryGetTimestampFromPosition(positionOnMusicSheet: PointF2D): Fraction {\n const entry: GraphicalStaffEntry = this.getClickedObjectOfType(positionOnMusicSheet);\n if (!entry) {\n return undefined;\n }\n return entry.getAbsoluteTimestamp();\n }\n\n public tryGetClickableLabel(positionOnMusicSheet: PointF2D): GraphicalLabel {\n try {\n return this.GetClickableLabel(positionOnMusicSheet);\n } catch (ex) {\n log.info(\"GraphicalMusicSheet.tryGetClickableObject\", \"positionOnMusicSheet: \" + positionOnMusicSheet, ex);\n }\n\n return undefined;\n }\n\n public tryGetTimeStampFromPosition(positionOnMusicSheet: PointF2D): Fraction {\n try {\n const entry: GraphicalStaffEntry = this.GetNearestStaffEntry(positionOnMusicSheet);\n if (!entry) {\n return undefined;\n }\n return entry.getAbsoluteTimestamp();\n } catch (ex) {\n log.info(\n \"GraphicalMusicSheet.tryGetTimeStampFromPosition\",\n \"positionOnMusicSheet: \" + positionOnMusicSheet, ex\n );\n }\n\n return undefined;\n }\n\n /**\n * Get visible staffentry for the container given by the index.\n * @param index\n * @returns {GraphicalStaffEntry}\n */\n public getStaffEntry(index: number): GraphicalStaffEntry {\n const container: VerticalGraphicalStaffEntryContainer = this.VerticalGraphicalStaffEntryContainers[index];\n let staffEntry: GraphicalStaffEntry = undefined;\n try {\n for (let idx: number = 0, len: number = container.StaffEntries.length; idx < len; ++idx) {\n const entry: GraphicalStaffEntry = container.StaffEntries[idx];\n if (!entry || !entry.sourceStaffEntry.ParentStaff.ParentInstrument.Visible) {\n continue;\n }\n if (!staffEntry) {\n staffEntry = entry;\n } else if (entry.PositionAndShape && staffEntry.PositionAndShape) {\n if (staffEntry.PositionAndShape.RelativePosition.x > entry.PositionAndShape.RelativePosition.x) {\n staffEntry = entry;\n }\n }\n }\n } catch (ex) {\n log.info(\"GraphicalMusicSheet.getStaffEntry\", ex);\n }\n\n return staffEntry;\n }\n\n /**\n * Returns the index of the closest previous (earlier) vertical container which has at least some visible staff entry, with respect to the given index.\n * @param index\n * @returns {number}\n * @constructor\n */\n public GetPreviousVisibleContainerIndex(index: number): number {\n for (let i: number = index - 1; i >= 0; i--) {\n const entries: GraphicalStaffEntry[] = this.verticalGraphicalStaffEntryContainers[i].StaffEntries;\n for (let idx: number = 0, len: number = entries.length; idx < len; ++idx) {\n const entry: GraphicalStaffEntry = entries[idx];\n if (entry && entry.sourceStaffEntry.ParentStaff.ParentInstrument.Visible) {\n return i;\n }\n }\n }\n return -1;\n }\n\n /**\n * Returns the index of the closest next (later) vertical container which has at least some visible staff entry, with respect to the given index.\n * @param index\n * @returns {number}\n * @constructor\n */\n public GetNextVisibleContainerIndex(index: number): number {\n for (let i: number = index + 1; i < this.verticalGraphicalStaffEntryContainers.length; ++i) {\n const entries: GraphicalStaffEntry[] = this.verticalGraphicalStaffEntryContainers[i].StaffEntries;\n for (let idx: number = 0, len: number = entries.length; idx < len; ++idx) {\n const entry: GraphicalStaffEntry = entries[idx];\n if (entry && entry.sourceStaffEntry.ParentStaff.ParentInstrument.Visible) {\n return i;\n }\n }\n }\n return -1;\n }\n\n public findClosestLeftStaffEntry(fractionalIndex: number, searchOnlyVisibleEntries: boolean): GraphicalStaffEntry {\n let foundEntry: GraphicalStaffEntry = undefined;\n let leftIndex: number = Math.floor(fractionalIndex);\n leftIndex = Math.min(this.VerticalGraphicalStaffEntryContainers.length - 1, leftIndex);\n for (let i: number = leftIndex; i >= 0; i--) {\n foundEntry = this.getStaffEntry(i);\n if (foundEntry) {\n if (searchOnlyVisibleEntries) {\n if (foundEntry.sourceStaffEntry.ParentStaff.ParentInstrument.Visible) {\n return foundEntry;\n }\n } else {\n return foundEntry;\n }\n }\n }\n return undefined;\n }\n\n public findClosestRightStaffEntry(fractionalIndex: number, returnOnlyVisibleEntries: boolean): GraphicalStaffEntry {\n let foundEntry: GraphicalStaffEntry = undefined;\n const rightIndex: number = Math.max(0, Math.ceil(fractionalIndex));\n for (let i: number = rightIndex; i < this.VerticalGraphicalStaffEntryContainers.length; i++) {\n foundEntry = this.getStaffEntry(i);\n if (foundEntry) {\n if (returnOnlyVisibleEntries) {\n if (foundEntry.sourceStaffEntry.ParentStaff.ParentInstrument.Visible) {\n return foundEntry;\n }\n } else {\n return foundEntry;\n }\n }\n }\n return undefined;\n }\n\n public calculateCursorLineAtTimestamp(musicTimestamp: Fraction, styleEnum: OutlineAndFillStyleEnum): GraphicalLine {\n const result: [number, MusicSystem] = this.calculateXPositionFromTimestamp(musicTimestamp);\n const xPos: number = result[0];\n const correspondingMusicSystem: MusicSystem = result[1];\n if (!correspondingMusicSystem || correspondingMusicSystem.StaffLines.length === 0) {\n return undefined;\n }\n const yCoordinate: number = correspondingMusicSystem.PositionAndShape.AbsolutePosition.y;\n const height: number = CollectionUtil.last(correspondingMusicSystem.StaffLines).PositionAndShape.RelativePosition.y + 4;\n return new GraphicalLine(new PointF2D(xPos, yCoordinate), new PointF2D(xPos, yCoordinate + height), 3, styleEnum);\n }\n\n public calculateXPositionFromTimestamp(timeStamp: Fraction): [number, MusicSystem] {\n let currentMusicSystem: MusicSystem = undefined;\n const fractionalIndex: number = this.GetInterpolatedIndexInVerticalContainers(timeStamp);\n const previousStaffEntry: GraphicalStaffEntry = this.findClosestLeftStaffEntry(fractionalIndex, true);\n const nextStaffEntry: GraphicalStaffEntry = this.findClosestRightStaffEntry(fractionalIndex, true);\n const currentTimeStamp: number = timeStamp.RealValue;\n if (!previousStaffEntry && !nextStaffEntry) {\n return [0, undefined];\n }\n let previousStaffEntryMusicSystem: MusicSystem = undefined;\n if (previousStaffEntry) {\n // TODO sometimes one of these ParentStaffLine is undefined, either fix this or handle it here\n previousStaffEntryMusicSystem = previousStaffEntry.parentMeasure.ParentStaffLine?.ParentMusicSystem;\n } else {\n previousStaffEntryMusicSystem = nextStaffEntry.parentMeasure.ParentStaffLine?.ParentMusicSystem;\n }\n let nextStaffEntryMusicSystem: MusicSystem = undefined;\n if (nextStaffEntry) {\n nextStaffEntryMusicSystem = nextStaffEntry.parentMeasure.ParentStaffLine?.ParentMusicSystem;\n } else {\n nextStaffEntryMusicSystem = previousStaffEntry.parentMeasure.ParentStaffLine?.ParentMusicSystem;\n }\n if (previousStaffEntryMusicSystem === nextStaffEntryMusicSystem) {\n currentMusicSystem = previousStaffEntryMusicSystem;\n let fraction: number;\n let previousStaffEntryPositionX: number;\n let nextStaffEntryPositionX: number;\n if (!previousStaffEntry) {\n previousStaffEntryPositionX = nextStaffEntryPositionX = nextStaffEntry.PositionAndShape.AbsolutePosition.x;\n fraction = 0;\n } else if (!nextStaffEntry) {\n previousStaffEntryPositionX = previousStaffEntry.PositionAndShape.AbsolutePosition.x;\n nextStaffEntryPositionX = currentMusicSystem.GetRightBorderAbsoluteXPosition();\n const sm: SourceMeasure = previousStaffEntry.parentMeasure.parentSourceMeasure;\n fraction = (currentTimeStamp - previousStaffEntry.getAbsoluteTimestamp().RealValue) / (\n Fraction.plus(sm.AbsoluteTimestamp, sm.Duration).RealValue - previousStaffEntry.getAbsoluteTimestamp().RealValue);\n } else {\n previousStaffEntryPositionX = previousStaffEntry.PositionAndShape.AbsolutePosition.x;\n nextStaffEntryPositionX = nextStaffEntry.PositionAndShape.AbsolutePosition.x;\n if (previousStaffEntry === nextStaffEntry) {\n fraction = 0;\n } else {\n fraction = (currentTimeStamp - previousStaffEntry.getAbsoluteTimestamp().RealValue) /\n (nextStaffEntry.getAbsoluteTimestamp().RealValue - previousStaffEntry.getAbsoluteTimestamp().RealValue);\n }\n }\n fraction = Math.min(1, Math.max(0, fraction));\n const interpolatedXPosition: number = previousStaffEntryPositionX + fraction * (nextStaffEntryPositionX - previousStaffEntryPositionX);\n return [interpolatedXPosition, currentMusicSystem];\n } else {\n const nextSystemLeftBorderTimeStamp: number = nextStaffEntry.parentMeasure.parentSourceMeasure.AbsoluteTimestamp.RealValue;\n let fraction: number;\n let interpolatedXPosition: number;\n if (currentTimeStamp < nextSystemLeftBorderTimeStamp) {\n currentMusicSystem = previousStaffEntryMusicSystem;\n const previousStaffEntryPositionX: number = previousStaffEntry.PositionAndShape.AbsolutePosition.x;\n const previousSystemRightBorderX: number = currentMusicSystem.GetRightBorderAbsoluteXPosition();\n fraction = (currentTimeStamp - previousStaffEntry.getAbsoluteTimestamp().RealValue) /\n (nextSystemLeftBorderTimeStamp - previousStaffEntry.getAbsoluteTimestamp().RealValue);\n fraction = Math.min(1, Math.max(0, fraction));\n interpolatedXPosition = previousStaffEntryPositionX + fraction * (previousSystemRightBorderX - previousStaffEntryPositionX);\n } else {\n currentMusicSystem = nextStaffEntryMusicSystem;\n const nextStaffEntryPositionX: number = nextStaffEntry.PositionAndShape.AbsolutePosition.x;\n const nextSystemLeftBorderX: number = currentMusicSystem.GetLeftBorderAbsoluteXPosition();\n fraction = (currentTimeStamp - nextSystemLeftBorderTimeStamp) /\n (nextStaffEntry.getAbsoluteTimestamp().RealValue - nextSystemLeftBorderTimeStamp);\n fraction = Math.min(1, Math.max(0, fraction));\n interpolatedXPosition = nextSystemLeftBorderX + fraction * (nextStaffEntryPositionX - nextSystemLeftBorderX);\n }\n return [interpolatedXPosition, currentMusicSystem];\n }\n }\n\n public GetNumberOfVisibleInstruments(): number {\n let visibleInstrumentCount: number = 0;\n for (let idx: number = 0, len: number = this.musicSheet.Instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.musicSheet.Instruments[idx];\n if (instrument.Visible === true) {\n visibleInstrumentCount++;\n }\n }\n return visibleInstrumentCount;\n }\n\n public GetNumberOfFollowedInstruments(): number {\n let followedInstrumentCount: number = 0;\n for (let idx: number = 0, len: number = this.musicSheet.Instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.musicSheet.Instruments[idx];\n if (instrument.Following === true) {\n followedInstrumentCount++;\n }\n }\n return followedInstrumentCount;\n }\n\n /*public GetGraphicalFromSourceMeasure(sourceMeasure: SourceMeasure): GraphicalMeasure[] {\n return this.sourceToGraphicalMeasureLinks.getValue(sourceMeasure); // TODO gets wrong measure because sourceMeasure is not a valid key\n }*/\n\n public GetGraphicalFromSourceStaffEntry(sourceStaffEntry: SourceStaffEntry): GraphicalStaffEntry {\n const graphicalMeasure: GraphicalMeasure = sourceStaffEntry.VerticalContainerParent.ParentMeasure.VerticalMeasureList\n [sourceStaffEntry.ParentStaff.idInMusicSheet];\n return graphicalMeasure.findGraphicalStaffEntryFromTimestamp(sourceStaffEntry.Timestamp);\n }\n\n private CalculateDistance(pt1: PointF2D, pt2: PointF2D): number {\n const deltaX: number = pt1.x - pt2.x;\n const deltaY: number = pt1.y - pt2.y;\n return (deltaX * deltaX) + (deltaY * deltaY);\n }\n\n /**\n * Return the longest StaffEntry duration from a GraphicalVerticalContainer.\n * @param index the index of the vertical container\n * @returns {Fraction}\n */\n private getLongestStaffEntryDuration(index: number): Fraction {\n let maxLength: Fraction = new Fraction(0, 1);\n for (const graphicalStaffEntry of this.verticalGraphicalStaffEntryContainers[index].StaffEntries) {\n if (!graphicalStaffEntry) {\n continue;\n }\n const maxLengthInStaffEntry: Fraction = graphicalStaffEntry.findStaffEntryMaxNoteLength();\n if (maxLength.lt(maxLengthInStaffEntry)) {\n maxLength = maxLengthInStaffEntry;\n }\n }\n return maxLength;\n }\n}\n\nexport class SystemImageProperties {\n public positionInPixels: PointF2D;\n public systemImageId: number;\n public system: MusicSystem;\n}\n","\nimport { StaffLine } from \"./StaffLine\";\nimport { AbstractTempoExpression } from \"../VoiceData/Expressions/AbstractTempoExpression\";\nimport { GraphicalLabel } from \"./GraphicalLabel\";\nimport { AbstractGraphicalExpression } from \"./AbstractGraphicalExpression\";\n\nexport class GraphicalInstantaneousTempoExpression extends AbstractGraphicalExpression {\n\n constructor(tempoExpresssion: AbstractTempoExpression, label: GraphicalLabel) {\n super((label.PositionAndShape.Parent.DataObject as StaffLine), tempoExpresssion, tempoExpresssion.parentMeasure);\n this.label = label;\n }\n\n public get GraphicalLabel(): GraphicalLabel {\n return this.label;\n }\n\n public updateSkyBottomLine(): void {\n // Not implemented\n }\n}\n","import {AbstractTempoExpression} from \"./AbstractTempoExpression\";\nimport {PlacementEnum} from \"./AbstractExpression\";\nimport {ArgumentOutOfRangeException} from \"../../Exceptions\";\nimport {Fraction} from \"../../../Common/DataObjects/Fraction\";\nimport {MultiTempoExpression} from \"./MultiTempoExpression\";\n\nexport class InstantaneousTempoExpression extends AbstractTempoExpression {\n constructor(label: string, placement: PlacementEnum, staffNumber: number,\n soundTempo: number, parentMultiTempoExpression: MultiTempoExpression, isMetronomeMark: boolean = false) {\n /*if (isMetronomeMark) {\n label = \" = \" + soundTempo;\n }*/\n super(label, placement, staffNumber, parentMultiTempoExpression);\n this.setTempoAndTempoType(soundTempo);\n }\n\n public dotted: boolean;\n public beatUnit: string;\n private static listInstantaneousTempoLarghissimo: string[] = [\"Larghissimo\", \"Sehr breit\", \"very, very slow\"]; // }), TempoEnum.larghissimo);\n private static listInstantaneousTempoGrave: string[] = [\"Grave\", \"Schwer\", \"slow and solemn\"]; // }), TempoEnum.grave);\n private static listInstantaneousTempoLento: string[] = [\"Lento\", \"Lent\", \"Langsam\", \"slowly\"]; // }), TempoEnum.lento);\n private static listInstantaneousTempoLargo: string[] = [\"Largo\", \"Breit\", \"broadly\"]; // }), TempoEnum.largo);\n private static listInstantaneousTempoLarghetto: string[] = [\"Larghetto\", \"Etwas breit\", \"rather broadly\"]; // }), TempoEnum.larghetto);\n private static listInstantaneousTempoAdagio: string[] = [\"Adagio\", \"Langsam\", \"Ruhig\", \"slow and stately\"]; // }), TempoEnum.adagio);\n private static listInstantaneousTempoAdagietto: string[] = [\"Adagietto\", \"Ziemlich ruhig\", \"Ziemlich langsam\", \"rather slow\"]; // }), TempoEnum.adagietto);\n private static listInstantaneousTempoAndanteModerato: string[] = [\"Andante moderato\"]; // }), TempoEnum.andanteModerato);\n private static listInstantaneousTempoAndante: string[] = [\"Andante\", \"Gehend\", \"Schreitend\", \"at a walking pace\"]; // }), TempoEnum.andante);\n private static listInstantaneousTempoAndantino: string[] = [\"Andantino\"]; // }), TempoEnum.andantino);\n private static listInstantaneousTempoModerato: string[] = [\"Moderato\", \"Mäßig\", \"Mod�r�\", \"moderately\"]; // }), TempoEnum.moderato);\n private static listInstantaneousTempoAllegretto: string[] = [\"Allegretto\", \"fast\"]; // }), TempoEnum.allegretto);\n private static listInstantaneousTempoAllegroModerato: string[] = [\"Allegro moderato\"]; // }), TempoEnum.allegroModerato);\n private static listInstantaneousTempoAllegro: string[] = [\"Allegro\", \"Rapide\", \"Vite\", \"Rasch\", \"Schnell\", \"Fr�hlich\"]; // }), TempoEnum.allegro);\n private static listInstantaneousTempoVivace: string[] = [\"Vivace\", \"Lebhaft\", \"Lebendig\", \"lively and fast\"]; // }), TempoEnum.vivace);\n private static listInstantaneousTempoVivacissimo: string[] = [\"Vivacissimo\", \"Sehr lebhaft\", \"Sehr lebendig\"]; // }), TempoEnum.vivacissimo);\n private static listInstantaneousTempoAllegrissimo: string[] = [\"Allegrissimo\", \"very fast\"]; // }), TempoEnum.allegrissimo);\n private static listInstantaneousTempoPresto: string[] = [\"Presto\", \"Sehr schnell\", \"Geschwind\"]; // }), TempoEnum.presto);\n private static listInstantaneousTempoPrestissimo: string[] = [\"Prestissimo\", \"äußerst schnell\"]; // }), TempoEnum.prestissimo);\n private static listInstantaneousTempoChangesGeneral: string[] = [\n \"tempo primo\",\n \"a tempo\",\n \"tempo i\",\n \"rubato\",\n \"doppio movimento\",\n ];\n private static listInstantaneousTempoAddons: string[] = [\n \"assai\",\n \"amoroso\",\n \"cantabile\",\n \"con brio\",\n \"con dolore\",\n \"con espressione\",\n \"con fuoco\",\n \"con moto\",\n \"con spirito\",\n \"spiritoso\",\n \"espressivo\",\n \"giocoso\",\n \"giusto\",\n \"grazioso\",\n \"lesto\",\n \"lugubre\",\n \"maestoso\",\n \"ma non troppo\",\n \"marcato\",\n \"molto\",\n \"morendo\",\n \"mosso\",\n \"non tanto\",\n \"piu\",\n \"un poco\",\n \"poco\",\n \"quasi\",\n \"risoluto\",\n \"scherzando\",\n \"sostenuto\",\n \"teneramente\",\n \"tempo giusto\",\n \"tranquillo\",\n \"sehr\",\n \"lieblich\",\n \"liebevoll\",\n \"mit Leidenschaft\",\n \"mit Liebe\",\n \"amourös\",\n \"gesanglich\",\n \"mit Schwung\",\n \"mit Feuer\",\n \"mit Schmerz\",\n \"mit Ausdruck\",\n \"mit Bewegung\",\n \"geistvoll\",\n \"ausdrucksvoll\",\n \"freudig\",\n \"verspielt\",\n \"angemessen\",\n \"graziös\",\n \"mit Grazie\",\n \"flink\",\n \"behände\",\n \"traurig\",\n \"klagend\",\n \"majestätisch\",\n \"aber nicht zu sehr\",\n \"markant\",\n \"gemäßigt\",\n \"viel\",\n \"sehr\",\n \"ersterbend\",\n \"bewegt\",\n \"nicht zu sehr\",\n \"mehr\",\n \"ein wenig\",\n \"gleichsam\",\n \"entschlossen\",\n \"zupackend\",\n \"heiter\",\n \"nachdrücklich\",\n \"getragen\",\n \"gewichtig\",\n \"zart\",\n \"zärtlich\",\n \"im angemessenen Zeitmaß\",\n \"ruhig\",\n \"ein wenig\",\n \"alla marcia\",\n \"ad libitum\",\n \"alla breve\",\n ];\n\n private tempoEnum: TempoEnum;\n private tempoInBpm: number;\n\n // Must refactor: In c# use 'out' arguments\n //private findTempoEnum(inputString: string, pre: string, post: string): TempoEnum {\n // let result: TempoEnum = this.splitStringAfterInstructionWord(inputString,\n // InstantaneousTempoExpression.listInstantaneousTempoLarghissimo, TempoEnum.larghissimo, pre,\n // post);\n // if (result !== TempoEnum.none)\n // return result;\n // result = this.splitStringAfterInstructionWord(inputString, InstantaneousTempoExpression.listInstantaneousTempoGrave, TempoEnum.grave, pre,\n // post);\n // if (result !== TempoEnum.none)\n // return result;\n // return TempoEnum.none;\n //}\n //private splitStringAfterInstructionWord(inputString: string, instruction: string[], value: TempoEnum, pre: string, post: string): TempoEnum {\n // pre = undefined;\n // post = undefined;\n // for (let idx: number = 0, len: number = instruction.length; idx < len; ++idx) {\n // let instructionWord: string = instruction[idx];\n // let separators: string[] = [\" \" + instructionWord, instructionWord + \" \", \",\" + instructionWord, instructionWord + \",\"];\n // for (let j: number = 0; j < 4; j++) {\n // let splits:string[] = inputString.split(separators[j], 2);\n // if (splits.length > 1) {\n // pre = splits[0];\n // post = splits[1];\n // return value;\n // }\n // }\n // }\n // return TempoEnum.none;\n //}\n public static getDefaultValueForTempoType(tempoEnum: TempoEnum): number {\n switch (tempoEnum) {\n case TempoEnum.larghissimo:\n return 20;\n case TempoEnum.grave:\n return 30;\n case TempoEnum.lento:\n return 48;\n case TempoEnum.largo:\n return 52;\n case TempoEnum.larghetto:\n return 63;\n case TempoEnum.adagio:\n return 70;\n case TempoEnum.adagietto:\n return 75;\n case TempoEnum.andanteModerato:\n return 88;\n case TempoEnum.andante:\n return 92;\n case TempoEnum.andantino:\n return 96;\n case TempoEnum.moderato:\n return 106;\n case TempoEnum.allegretto:\n return 112;\n case TempoEnum.allegroModerato:\n return 118;\n case TempoEnum.allegro:\n return 130;\n case TempoEnum.vivace:\n return 140;\n case TempoEnum.vivacissimo:\n return 155;\n case TempoEnum.allegrissimo:\n return 170;\n case TempoEnum.presto:\n return 184;\n case TempoEnum.prestissimo:\n return 200;\n default:\n throw new ArgumentOutOfRangeException(\"tempoEnum\");\n }\n }\n public static isInputStringInstantaneousTempo(inputString: string): boolean {\n if (!inputString) { return false; }\n return (\n (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLarghissimo, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoGrave, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLento, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLargo, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLarghetto, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAdagio, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAdagietto, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAndanteModerato, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAndante, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAndantino, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoModerato, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegretto, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegroModerato, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegro, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoVivace, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoVivacissimo, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegrissimo, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoPresto, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoPrestissimo, inputString))\n || (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoChangesGeneral, inputString))\n );\n }\n\n public get Label(): string {\n return this.label;\n }\n public set Label(value: string) {\n this.label = value;\n }\n public get Placement(): PlacementEnum {\n return this.placement;\n }\n public set Placement(value: PlacementEnum) {\n this.placement = value;\n }\n public get StaffNumber(): number {\n return this.staffNumber;\n }\n public set StaffNumber(value: number) {\n this.staffNumber = value;\n }\n public get Enum(): TempoEnum {\n return this.tempoEnum;\n }\n public get TempoInBpm(): number {\n return this.tempoInBpm;\n }\n public set TempoInBpm(value: number) {\n this.tempoInBpm = value;\n }\n public get ParentMultiTempoExpression(): MultiTempoExpression {\n return this.parentMultiTempoExpression;\n }\n public getAbsoluteTimestamp(): Fraction {\n return Fraction.plus(this.ParentMultiTempoExpression.SourceMeasureParent.AbsoluteTimestamp, this.ParentMultiTempoExpression.Timestamp);\n }\n public getAbsoluteFloatTimestamp(): number {\n return Fraction.plus(this.ParentMultiTempoExpression.SourceMeasureParent.AbsoluteTimestamp, this.ParentMultiTempoExpression.Timestamp).RealValue;\n }\n private setTempoAndTempoType(soundTempo: number): void {\n if (!this.label) {\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.metronomeMark;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLarghissimo, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.larghissimo);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.larghissimo;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoGrave, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.grave);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.grave;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLento, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.lento);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.lento;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLargo, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.largo);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.largo;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoLarghetto, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.larghetto);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.larghetto;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAdagio, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.adagio);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.adagio;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAdagietto, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.adagietto);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.adagietto;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAndanteModerato, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.andanteModerato);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.andanteModerato;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAndante, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.andante);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.andante;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAndantino, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.andantino);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.andantino;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoModerato, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.moderato);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.moderato;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegretto, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.allegretto);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.allegretto;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegroModerato, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.allegroModerato);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.allegroModerato;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegro, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.allegro);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.allegro;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoVivace, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.vivace);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.vivace;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoVivacissimo, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.vivacissimo);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.vivacissimo;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAllegrissimo, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.allegrissimo);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.allegrissimo;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoPresto, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.presto);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.presto;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoPrestissimo, this.label)) {\n if (soundTempo === 0) {\n soundTempo = InstantaneousTempoExpression.getDefaultValueForTempoType(TempoEnum.prestissimo);\n }\n this.tempoInBpm = soundTempo;\n this.tempoEnum = TempoEnum.prestissimo;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoAddons, this.label)) {\n this.tempoInBpm = 0;\n this.tempoEnum = TempoEnum.addon;\n return;\n }\n if (InstantaneousTempoExpression.isStringInStringList(InstantaneousTempoExpression.listInstantaneousTempoChangesGeneral, this.label)) {\n this.tempoInBpm = 0;\n this.tempoEnum = TempoEnum.changes;\n return;\n }\n }\n}\n\nexport enum TempoEnum {\n none,\n larghissimo,\n grave,\n lento,\n largo,\n larghetto,\n adagio,\n adagietto,\n andanteModerato,\n andante,\n andantino,\n moderato,\n allegretto,\n allegroModerato,\n allegro,\n vivace,\n vivacissimo,\n allegrissimo,\n presto,\n prestissimo,\n lastRealTempo,\n addon,\n changes,\n metronomeMark\n}\n","import {Fraction} from \"../../../../Common/DataObjects/Fraction\";\nimport {PlacementEnum} from \"../AbstractExpression\";\nimport {MultiTempoExpression} from \"../MultiTempoExpression\";\nimport {AbstractTempoExpression} from \"../AbstractTempoExpression\";\n\nexport class ContinuousTempoExpression extends AbstractTempoExpression {\n constructor(label: string, placement: PlacementEnum, staffNumber: number, parentMultiTempoExpression: MultiTempoExpression) {\n super(label, placement, staffNumber, parentMultiTempoExpression);\n //super.label = label;\n //super.placement = placement;\n //super.staffNumber = staffNumber;\n //super.parentMultiTempoExpression = parentMultiTempoExpression;\n this.setTempoType();\n }\n\n private static listContinuousTempoFaster: string[] = [\"accelerando\", \"piu mosso\", \"poco piu\", \"stretto\"];\n private static listContinuousTempoSlower: string[] = [\n \"poco meno\", \"meno mosso\", \"piu lento\", \"calando\", \"allargando\", \"rallentando\", \"ritardando\",\n \"ritenuto\", \"ritard.\", \"ritard\", \"rit.\", \"rit\", \"riten.\", \"riten\",\n ];\n private absoluteEndTimestamp: Fraction;\n private tempoType: ContinuousTempoType;\n private startTempo: number;\n private endTempo: number;\n\n public static isInputStringContinuousTempo(inputString: string): boolean {\n if (!inputString) { return false; }\n return (\n ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoFaster, inputString)\n || ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoSlower, inputString)\n );\n }\n public static isIncreasingTempo(tempoType: ContinuousTempoType): boolean {\n return tempoType <= ContinuousTempoType.piuMosso;\n }\n public static isDecreasingTempo(tempoType: ContinuousTempoType): boolean {\n return (tempoType >= ContinuousTempoType.allargando) && (tempoType <= ContinuousTempoType.ritenuto);\n }\n\n public get TempoType(): ContinuousTempoType {\n return this.tempoType;\n }\n public set TempoType(value: ContinuousTempoType) {\n this.tempoType = value;\n }\n public get StartTempo(): number {\n return this.startTempo;\n }\n public set StartTempo(value: number) {\n this.startTempo = value;\n }\n public get EndTempo(): number {\n return this.endTempo;\n }\n public set EndTempo(value: number) {\n this.endTempo = value;\n }\n public get AbsoluteEndTimestamp(): Fraction {\n return this.absoluteEndTimestamp;\n }\n public set AbsoluteEndTimestamp(value: Fraction) {\n this.absoluteEndTimestamp = value;\n }\n public get AbsoluteTimestamp(): Fraction {\n return this.ParentMultiTempoExpression.AbsoluteTimestamp;\n }\n public getAbsoluteFloatTimestamp(): number {\n return this.ParentMultiTempoExpression.AbsoluteTimestamp.RealValue;\n }\n public getInterpolatedTempo(currentAbsoluteTimestamp: Fraction): number {\n const continuousAbsoluteStartTimestamp: Fraction = Fraction.plus(\n this.parentMultiTempoExpression.SourceMeasureParent.AbsoluteTimestamp, this.parentMultiTempoExpression.Timestamp\n );\n if (currentAbsoluteTimestamp.lt(continuousAbsoluteStartTimestamp)) { return -1; }\n if (this.absoluteEndTimestamp.lt(currentAbsoluteTimestamp)) { return -2; }\n const interpolationRatio: number =\n Fraction.minus(currentAbsoluteTimestamp, continuousAbsoluteStartTimestamp).RealValue\n / Fraction.minus(this.absoluteEndTimestamp, continuousAbsoluteStartTimestamp).RealValue;\n const interpolatedTempo: number = Math.max(0.0, Math.min(250.0, this.startTempo + (this.endTempo - this.startTempo) * interpolationRatio));\n return interpolatedTempo;\n }\n\n private setTempoType(): void {\n if (ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoFaster, this.label)) {\n this.tempoType = ContinuousTempoType.accelerando;\n } else if (ContinuousTempoExpression.isStringInStringList(ContinuousTempoExpression.listContinuousTempoSlower, this.label)) {\n this.tempoType = ContinuousTempoType.ritardando;\n }\n }\n}\n\nexport enum ContinuousTempoType {\n accelerando = 0,\n stretto = 1,\n stringendo = 2,\n mosso = 3,\n piuMosso = 4,\n allargando = 5,\n calando = 6,\n menoMosso = 7,\n rallentando = 8,\n ritardando = 9,\n ritard = 10,\n rit = 11,\n ritenuto = 12,\n rubato = 13,\n precipitando = 14\n}\n","/**\n * IXmlAttribute is just the standard Attr\n */\nexport type IXmlAttribute = Attr;\n\n/**\n * Just a wrapper for an XML Element object.\n * It facilitates handling of XML elements by OSMD\n */\nexport class IXmlElement {\n public name: string;\n public value: string;\n public hasAttributes: boolean = false;\n public firstAttribute: IXmlAttribute;\n public hasElements: boolean;\n\n private attrs: IXmlAttribute[];\n private elem: Element;\n\n /**\n * Wraps 'elem' Element in a IXmlElement\n * @param elem\n */\n constructor(elem: Element) {\n if (!elem) {\n throw new Error(\"IXmlElement: expected Element, got undefined\");\n }\n this.elem = elem;\n this.name = elem.nodeName.toLowerCase();\n\n if (elem.hasAttributes()) {\n this.hasAttributes = true;\n this.firstAttribute = elem.attributes[0];\n }\n this.hasElements = elem.hasChildNodes();\n // Look for a value\n if (elem.childNodes.length === 1 && elem.childNodes[0].nodeType === Node.TEXT_NODE) {\n this.value = elem.childNodes[0].nodeValue;\n } else {\n this.value = \"\";\n }\n }\n\n /**\n * Get the attribute with the given name\n * @param attributeName\n * @returns {Attr}\n */\n public attribute(attributeName: string): IXmlAttribute {\n return this.elem.attributes.getNamedItem(attributeName);\n }\n\n /**\n * Get all attributes\n * @returns {IXmlAttribute[]}\n */\n public attributes(): IXmlAttribute[] {\n if (!this.attrs) {\n const attributes: NamedNodeMap = this.elem.attributes;\n const attrs: IXmlAttribute[] = [];\n for (let i: number = 0; i < attributes.length; i += 1) {\n attrs.push(attributes[i]);\n }\n this.attrs = attrs;\n }\n return this.attrs;\n }\n\n /**\n * Get the first child element with the given node name\n * @param elementName\n * @returns {IXmlElement}\n */\n public element(elementName: string): IXmlElement {\n const nodes: NodeList = this.elem.childNodes;\n for (let i: number = 0, length: number = nodes.length; i < length; i += 1) {\n const node: Node = nodes[i];\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName.toLowerCase() === elementName) {\n return new IXmlElement(node as Element);\n }\n }\n }\n\n /**\n * Get the children with the given node name (if given, otherwise all child elements)\n * @param nodeName\n * @returns {IXmlElement[]}\n */\n public elements(nodeName?: string): IXmlElement[] {\n const nodes: NodeList = this.elem.childNodes;\n const ret: IXmlElement[] = [];\n const nameUnset: boolean = !nodeName;\n if (!nameUnset) {\n nodeName = nodeName.toLowerCase();\n }\n for (let i: number = 0; i < nodes.length; i += 1) {\n const node: Node = nodes[i];\n if (node.nodeType === Node.ELEMENT_NODE &&\n (nameUnset || node.nodeName.toLowerCase() === nodeName)\n ) {\n ret.push(new IXmlElement(node as Element));\n }\n }\n return ret;\n }\n}\n","import { InstrumentalGroup } from \"./InstrumentalGroup\";\nimport { Label } from \"./Label\";\nimport { MusicSheet } from \"./MusicSheet\";\nimport { Voice } from \"./VoiceData/Voice\";\nimport { Staff } from \"./VoiceData/Staff\";\nimport { SubInstrument } from \"./SubInstrument\";\nimport { MidiInstrument } from \"./VoiceData/Instructions/ClefInstruction\";\n\nexport class Instrument extends InstrumentalGroup {\n\n constructor(id: number, idString: string, musicSheet: MusicSheet, parent: InstrumentalGroup) {\n super(undefined, musicSheet, parent);\n this.id = id;\n this.idString = idString;\n this.nameLabel = new Label(idString);\n }\n\n public transpose: number = 0;\n public highlight: boolean;\n\n private voices: Voice[] = [];\n private staves: Staff[] = [];\n private nameLabel: Label;\n private idString: string;\n private id: number;\n private hasLyrics: boolean = false;\n private hasChordSymbols: boolean = false;\n private playbackTranspose: number;\n\n private lyricVersesNumbers: number[] = [];\n private subInstruments: SubInstrument[] = [];\n private partAbbreviation: string;\n\n public get Voices(): Voice[] {\n return this.voices;\n }\n public get Staves(): Staff[] {\n return this.staves;\n }\n public get NameLabel(): Label {\n return this.nameLabel;\n }\n public get HasLyrics(): boolean {\n return this.hasLyrics;\n }\n public set HasLyrics(value: boolean) {\n this.hasLyrics = value;\n }\n public get HasChordSymbols(): boolean {\n return this.hasChordSymbols;\n }\n public set HasChordSymbols(value: boolean) {\n this.hasChordSymbols = value;\n }\n public get LyricVersesNumbers(): number[] {\n return this.lyricVersesNumbers;\n }\n public set LyricVersesNumbers(value: number[]) {\n this.lyricVersesNumbers = value;\n }\n public get Name(): string {\n return this.nameLabel.text;\n }\n public set Name(value: string) {\n this.nameLabel.text = value;\n }\n public get IdString(): string {\n return this.idString;\n }\n public get Id(): number {\n return this.id;\n }\n public get MidiInstrumentId(): MidiInstrument {\n return this.subInstruments[0].midiInstrumentID;\n }\n public set MidiInstrumentId(value: MidiInstrument) {\n this.subInstruments[0].midiInstrumentID = value;\n }\n public get Volume(): number {\n return this.subInstruments[0].volume;\n }\n public set Volume(value: number) {\n for (let idx: number = 0, len: number = this.subInstruments.length; idx < len; ++idx) {\n const subInstrument: SubInstrument = this.subInstruments[idx];\n subInstrument.volume = value;\n }\n }\n public get PlaybackTranspose(): number {\n return this.playbackTranspose;\n }\n public set PlaybackTranspose(value: number) {\n this.playbackTranspose = value;\n }\n\n public get SubInstruments(): SubInstrument[] {\n return this.subInstruments;\n }\n public getSubInstrument(subInstrumentIdString: string): SubInstrument {\n for (let idx: number = 0, len: number = this.subInstruments.length; idx < len; ++idx) {\n const subInstrument: SubInstrument = this.subInstruments[idx];\n if (subInstrument.idString === subInstrumentIdString) {\n return subInstrument;\n }\n }\n return undefined;\n }\n public get PartAbbreviation(): string {\n return this.partAbbreviation;\n }\n public set PartAbbreviation(value: string) {\n this.partAbbreviation = value;\n }\n\n public get Visible(): boolean {\n if (this.voices.length > 0) {\n return this.Voices[0].Visible;\n } else {\n return false;\n }\n }\n public set Visible(value: boolean) {\n for (let idx: number = 0, len: number = this.Voices.length; idx < len; ++idx) {\n const v: Voice = this.Voices[idx];\n v.Visible = value;\n }\n }\n public get Audible(): boolean {\n let result: boolean = false;\n for (let idx: number = 0, len: number = this.Voices.length; idx < len; ++idx) {\n const v: Voice = this.Voices[idx];\n result = result || v.Audible;\n }\n return result;\n }\n public set Audible(value: boolean) {\n for (let idx: number = 0, len: number = this.Voices.length; idx < len; ++idx) {\n const v: Voice = this.Voices[idx];\n v.Audible = value;\n }\n for (let idx: number = 0, len: number = this.staves.length; idx < len; ++idx) {\n const staff: Staff = this.staves[idx];\n staff.audible = value;\n }\n }\n public get Following(): boolean {\n let result: boolean = false;\n for (let idx: number = 0, len: number = this.Voices.length; idx < len; ++idx) {\n const v: Voice = this.Voices[idx];\n result = result || v.Following;\n }\n return result;\n }\n public set Following(value: boolean) {\n for (let idx: number = 0, len: number = this.Voices.length; idx < len; ++idx) {\n const v: Voice = this.Voices[idx];\n v.Following = value;\n }\n for (let idx: number = 0, len: number = this.staves.length; idx < len; ++idx) {\n const staff: Staff = this.staves[idx];\n staff.following = value;\n }\n }\n public SetVoiceAudible(voiceId: number, audible: boolean): void {\n for (let idx: number = 0, len: number = this.Voices.length; idx < len; ++idx) {\n const v: Voice = this.Voices[idx];\n if (v.VoiceId === voiceId) {\n v.Audible = audible;\n break;\n }\n }\n }\n public SetVoiceFollowing(voiceId: number, following: boolean): void {\n for (let idx: number = 0, len: number = this.Voices.length; idx < len; ++idx) {\n const v: Voice = this.Voices[idx];\n if (v.VoiceId === voiceId) {\n v.Following = following;\n break;\n }\n }\n }\n public SetStaffAudible(staffId: number, audible: boolean): void {\n const staff: Staff = this.staves[staffId - 1];\n staff.audible = audible;\n // hack for now:\n // activate all voices needed so that the staff notes will be played\n if (audible) {\n for (let idx: number = 0, len: number = staff.Voices.length; idx < len; ++idx) {\n const v: Voice = staff.Voices[idx];\n v.Audible = true;\n }\n } else {\n for (let idx: number = 0, len: number = staff.Voices.length; idx < len; ++idx) {\n const voice: Voice = staff.Voices[idx];\n let isAudibleInOtherStaves: boolean = false;\n for (let idx2: number = 0, len2: number = this.Staves.length; idx2 < len2; ++idx2) {\n const st: Staff = this.Staves[idx2];\n if (st.Id === staffId || !st.audible) { continue; }\n for (let idx3: number = 0, len3: number = st.Voices.length; idx3 < len3; ++idx3) {\n const v: Voice = st.Voices[idx3];\n if (v === voice) {\n isAudibleInOtherStaves = true;\n }\n }\n }\n if (!isAudibleInOtherStaves) {\n voice.Audible = false;\n }\n }\n }\n }\n public SetStaffFollow(staffId: number, follow: boolean): void {\n const staff: Staff = this.staves[staffId - 1];\n staff.following = follow;\n if (follow) {\n for (let idx: number = 0, len: number = staff.Voices.length; idx < len; ++idx) {\n const v: Voice = staff.Voices[idx];\n v.Following = true;\n }\n } else {\n for (let idx: number = 0, len: number = staff.Voices.length; idx < len; ++idx) {\n const voice: Voice = staff.Voices[idx];\n let isFollowingInOtherStaves: boolean = false;\n for (let idx2: number = 0, len2: number = this.Staves.length; idx2 < len2; ++idx2) {\n const st: Staff = this.Staves[idx2];\n if (st.Id === staffId || !st.following) { continue; }\n for (let idx3: number = 0, len3: number = st.Voices.length; idx3 < len3; ++idx3) {\n const v: Voice = st.Voices[idx3];\n if (v === voice) {\n isFollowingInOtherStaves = true;\n }\n }\n }\n if (!isFollowingInOtherStaves) {\n voice.Following = false;\n }\n }\n }\n }\n public areAllVoiceVisible(): boolean {\n for (const voice of this.Voices) {\n if (!voice.Visible) {\n return false;\n }\n }\n return true;\n }\n public createStaves(numberOfStaves: number): void {\n for (let i: number = 0; i < numberOfStaves; i++) {\n this.staves.push(new Staff(this, i + 1));\n }\n }\n\n // necessary to be unique for MusicSystem.labels Dictionary\n public toString(): string {\n return `${this.Name} , id: ${this.id}, idstring: ${this.idString}`;\n }\n}\n","import { MusicSheet } from \"./MusicSheet\";\n\nexport class InstrumentalGroup {\n\n constructor(name: string, musicSheet: MusicSheet, parent: InstrumentalGroup) {\n this.name = name;\n this.musicSheet = musicSheet;\n this.parent = parent;\n }\n\n private name: string;\n private musicSheet: MusicSheet;\n private parent: InstrumentalGroup;\n private instrumentalGroups: InstrumentalGroup[] = [];\n\n public get InstrumentalGroups(): InstrumentalGroup[] {\n return this.instrumentalGroups;\n }\n public get Parent(): InstrumentalGroup {\n return this.parent;\n }\n public get Name(): string {\n return this.name;\n }\n public set Name(value: string) {\n this.name = value;\n }\n public get GetMusicSheet(): MusicSheet {\n return this.musicSheet;\n }\n\n}\n","import { Note } from \"./Note\";\nimport log from \"loglevel\";\n\n/**\n * A note head with shape and fill information belonging to a [[Note]].\n */\nexport class Notehead {\n /**\n * @param sourceNote\n * @param shapeTypeXml The shape type given from XML.\n * See https://usermanuals.musicxml.com/MusicXML/Content/ST-MusicXML-notehead-value.htm\n * @param filledXml The XML flag to fill the note shape. Can be undefined if not included in XML.\n * If undefined, the filled parameter will be calculated by note duration (d < half note => filled)\n */\n constructor(sourceNote: Note, shapeTypeXml: string, filledXml: boolean = undefined) {\n this.sourceNote = sourceNote;\n this.setShapeFromXml(shapeTypeXml, filledXml);\n }\n\n /** shape of the note head (normal, square, triangle, etc.) */\n private shape: NoteHeadShape;\n private filled: boolean;\n /** the [[Note]] this NoteHead belongs to. */\n private sourceNote: Note;\n // note that color is stored in the sourceNote, because note.Notehead is undefined for normal noteheads.\n\n /** Sets the note head's shape from XML parameters.\n * @param shapeTypeXml The XML shape.\n * @param filledXmlAttribute the filled parameter as given in XML.\n * Can be undefined if not given in XML or if it should be calculated from note duration.\n * If undefined, this.sourceNote should not be undefined.\n */\n public setShapeFromXml(shapeTypeXml: string, filledXmlAttribute: boolean = undefined): void {\n this.shape = Notehead.ShapeTypeXmlToShape(shapeTypeXml);\n\n let filled: boolean = filledXmlAttribute;\n if (filled === undefined) { // don't replace undefined check\n if (!this.sourceNote) {\n // this should not happen. Either filledXmlAttribute or sourceNote should be defined.\n log.warn(\"notehead: sourceNote and filledXmlAttribute undefined.\");\n filled = true;\n } else {\n filled = this.sourceNote.Length.Denominator > 2;\n }\n }\n this.filled = filled;\n }\n\n public get SourceNote(): Note {\n return this.sourceNote;\n }\n\n public get Shape(): NoteHeadShape {\n return this.shape;\n }\n public get Filled(): boolean {\n return this.filled;\n }\n\n /** Converts xml attribute to NoteHeadShape.\n * Necessary because \"circle-x\" is not a valid enum member name.\n */\n public static ShapeTypeXmlToShape(shapeTypeXml: string): NoteHeadShape {\n switch (shapeTypeXml.toLowerCase()) {\n case \"normal\":\n return NoteHeadShape.NORMAL;\n case \"x\":\n return NoteHeadShape.X;\n case \"slash\":\n return NoteHeadShape.SLASH;\n case \"diamond\":\n return NoteHeadShape.DIAMOND;\n case \"square\":\n return NoteHeadShape.SQUARE;\n case \"la\": // Musescore displays this as a square\n return NoteHeadShape.SQUARE;\n case \"do\":\n case \"triangle\":\n return NoteHeadShape.TRIANGLE;\n case \"rectangle\":\n return NoteHeadShape.RECTANGLE;\n case \"circle-x\":\n return NoteHeadShape.CIRCLEX;\n default:\n log.info(\"unsupported/unhandled xml notehead '\" + shapeTypeXml + \"'. Using normal notehead.\");\n return NoteHeadShape.NORMAL;\n }\n }\n}\n\n/** shape of a note head, needs to be supported by MusicXML and Vexflow. */\nexport enum NoteHeadShape {\n CIRCLEX,\n DIAMOND,\n NORMAL,\n RECTANGLE,\n SLASH,\n SQUARE,\n TRIANGLE,\n X,\n // TODO: Add the rest from https://usermanuals.musicxml.com/MusicXML/Content/ST-MusicXML-notehead-value.htm\n // currently all Vexflow supported shapes present\n}\n","export enum MusicSymbol {\n Unused_first_Symbol,\n BLACK_HEAD,\n UPWARDS_TAIL,\n DOWNWARDS_TAIL,\n UPWARDS_DOUBLE_TAIL,\n DOWNWARDS_DOUBLE_TAIL,\n UPWARDS_TRIPLE_TAIL,\n DOWNWARDS_TRIPLE_TAIL,\n UPWARDS_QUAD_TAIL,\n DOWNWARDS_QUAD_TAIL,\n ROUND_HEAD,\n WHITE_HEAD,\n G_CLEF,\n F_CLEF,\n C_CLEF,\n BREVE,\n BREVE_REST,\n COMMON_TIME,\n CUT_TIME,\n WHOLE_REST,\n HALF_REST,\n QUARTER_REST,\n EIGHTH_REST,\n SIXTEENTH_REST,\n THIRTYSECOND_REST,\n SIXTYFOURTH_REST,\n FLAT,\n SHARP,\n NATURAL,\n DOUBLE_FLAT,\n DOUBLE_SHARP,\n ZERO,\n ONE,\n TWO,\n THREE,\n FOUR,\n FIVE,\n SIX,\n SEVEN,\n EIGHT,\n NINE,\n DOT,\n FERMATA,\n INVERTED_FERMATA,\n SPICCATO,\n TENUTO,\n MARCATO,\n MARCATISSIMO,\n INVERTED_MARCATISSIMO,\n P,\n F,\n S,\n Z,\n M,\n R,\n SEGNO,\n CODA,\n DRUM_CLEF,\n G_CLEF_SUB8,\n G_CLEF_SUPER8,\n G_CLEF_SUB15,\n G_CLEF_SUPER15,\n F_CLEF_SUB8,\n F_CLEF_SUPER8,\n F_CLEF_SUB15,\n F_CLEF_SUPER15,\n DOWN_BOW,\n MORDENT,\n INVERTED_MORDENT,\n TURN,\n INVERTED_TURN,\n LEFTHAND_PIZZICATO,\n RELEASE_PED,\n ENGAGE_PED,\n VA8,\n VB8,\n TRILL,\n MA15,\n MB15,\n HIGH,\n PLAY,\n MIC,\n SNAP_PIZZICATO,\n NATURAL_HARMONIC,\n EditPen\n}\n","import {ITextMeasurer} from \"../../Interfaces/ITextMeasurer\";\nimport {Fonts} from \"../../../Common/Enums/Fonts\";\nimport {FontStyles} from \"../../../Common/Enums/FontStyles\";\nimport {VexFlowConverter} from \"./VexFlowConverter\";\nimport { EngravingRules } from \"../EngravingRules\";\n/**\n * Created by Matthias on 21.06.2016.\n */\n\nexport class VexFlowTextMeasurer implements ITextMeasurer {\n constructor(rules: EngravingRules) {\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\");\n this.context = canvas.getContext(\"2d\");\n this.rules = rules;\n }\n // The context of a canvas used internally to compute font sizes\n private context: CanvasRenderingContext2D;\n public fontSize: number = 20;\n public fontSizeStandard: number = this.fontSize;\n private rules: EngravingRules;\n\n /**\n *\n * @param text\n * @param font\n * @param style\n * @returns {number}\n */\n public computeTextWidthToHeightRatio(text: string, font: Fonts, style: FontStyles,\n fontFamily: string = undefined,\n fontSize: number = this.fontSize): number {\n this.context.font = VexFlowConverter.font(fontSize, style, font, this.rules, fontFamily);\n return this.context.measureText(text).width / fontSize;\n }\n\n public setFontSize(fontSize: number = this.fontSizeStandard): number {\n this.fontSize = fontSize;\n return fontSize;\n }\n}\n","import { StaffLine } from \"./StaffLine\";\nimport { InstantaneousDynamicExpression } from \"../VoiceData/Expressions/InstantaneousDynamicExpression\";\nimport { GraphicalMeasure } from \"./GraphicalMeasure\";\nimport { AbstractGraphicalExpression } from \"./AbstractGraphicalExpression\";\nimport { SkyBottomLineCalculator } from \"./SkyBottomLineCalculator\";\nimport { PlacementEnum } from \"../VoiceData/Expressions/AbstractExpression\";\nimport log from \"loglevel\";\n\nexport class GraphicalInstantaneousDynamicExpression extends AbstractGraphicalExpression {\n protected mInstantaneousDynamicExpression: InstantaneousDynamicExpression;\n protected mMeasure: GraphicalMeasure;\n\n constructor(instantaneousDynamic: InstantaneousDynamicExpression, staffLine: StaffLine, measure: GraphicalMeasure) {\n super(staffLine, instantaneousDynamic, measure.parentSourceMeasure);\n this.mInstantaneousDynamicExpression = instantaneousDynamic;\n this.mMeasure = measure;\n }\n\n public updateSkyBottomLine(): void {\n const skyBottomLineCalculator: SkyBottomLineCalculator = this.parentStaffLine.SkyBottomLineCalculator;\n const left: number = this.PositionAndShape.RelativePosition.x + this.PositionAndShape.BorderMarginLeft;\n const right: number = this.PositionAndShape.RelativePosition.x + this.PositionAndShape.BorderMarginRight;\n let yValue: number = 0;\n switch (this.Placement) {\n case PlacementEnum.Above:\n yValue = this.PositionAndShape.RelativePosition.y + this.PositionAndShape.BorderMarginTop;\n skyBottomLineCalculator.updateSkyLineInRange(left, right, yValue);\n break;\n case PlacementEnum.Below:\n yValue = this.PositionAndShape.RelativePosition.y + this.PositionAndShape.BorderMarginBottom;\n skyBottomLineCalculator.updateBottomLineInRange(left, right, yValue);\n break;\n default:\n log.error(\"Placement for GraphicalInstantaneousDynamicExpression is unknown\");\n }\n }\n}\n","import {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {VerticalSourceStaffEntryContainer} from \"./VerticalSourceStaffEntryContainer\";\nimport {SourceStaffEntry} from \"./SourceStaffEntry\";\nimport {RepetitionInstruction, RepetitionInstructionEnum, AlignmentType} from \"./Instructions/RepetitionInstruction\";\nimport {Staff} from \"./Staff\";\nimport {VoiceEntry} from \"./VoiceEntry\";\nimport {Voice} from \"./Voice\";\nimport {MusicSheet} from \"../MusicSheet\";\nimport {MultiExpression} from \"./Expressions/MultiExpression\";\nimport {MultiTempoExpression} from \"./Expressions/MultiTempoExpression\";\nimport {KeyInstruction} from \"./Instructions/KeyInstruction\";\nimport {AbstractNotationInstruction} from \"./Instructions/AbstractNotationInstruction\";\nimport {Repetition} from \"../MusicSource/Repetition\";\nimport {GraphicalMeasure, SystemLinesEnum, EngravingRules} from \"../Graphical\";\n//import {BaseIdClass} from \"../../Util/BaseIdClass\"; // SourceMeasure originally extended BaseIdClass, but ids weren't used.\n\n/**\n * The Source Measure represents the source data of a unique measure, including all instruments with their staves.\n * There exists one source measure per XML measure or per paper sheet measure (e.g. the source measures are not doubled in repetitions)\n */\nexport class SourceMeasure {\n /**\n * The data entries and data lists will be filled with null values according to the total number of staves,\n * so that existing objects can be referred to by staff index.\n * @param completeNumberOfStaves\n */\n constructor(completeNumberOfStaves: number, rules: EngravingRules) {\n this.completeNumberOfStaves = completeNumberOfStaves;\n this.implicitMeasure = false;\n this.hasEndLine = false;\n this.endingBarStyleXml = \"\";\n this.endingBarStyleEnum = SystemLinesEnum.SingleThin;\n this.firstInstructionsStaffEntries = new Array(completeNumberOfStaves);\n this.lastInstructionsStaffEntries = new Array(completeNumberOfStaves);\n this.rules = rules;\n this.TempoInBPM = 0;\n for (let i: number = 0; i < completeNumberOfStaves; i++) {\n this.graphicalMeasureErrors.push(false);\n this.staffLinkedExpressions.push([]);\n }\n }\n\n /**\n * The unique measure list index starting with 0.\n */\n public measureListIndex: number;\n /**\n * The style of the ending bar line.\n */\n public endingBarStyleXml: string;\n public endingBarStyleEnum: SystemLinesEnum;\n /** Whether the MusicXML says to print a new system (line break). See OSMDOptions.newSystemFromXML */\n public printNewSystemXml: boolean = false;\n /** Whether the MusicXML says to print a new page (page break). See OSMDOptions.newPageFromXML */\n public printNewPageXml: boolean = false;\n\n private measureNumber: number;\n private absoluteTimestamp: Fraction;\n private completeNumberOfStaves: number;\n private duration: Fraction;\n private activeTimeSignature: Fraction;\n private staffLinkedExpressions: MultiExpression[][] = [];\n private tempoExpressions: MultiTempoExpression[] = [];\n private verticalSourceStaffEntryContainers: VerticalSourceStaffEntryContainer[] = [];\n private implicitMeasure: boolean;\n private hasEndLine: boolean;\n private graphicalMeasureErrors: boolean[] = [];\n private firstInstructionsStaffEntries: SourceStaffEntry[];\n private lastInstructionsStaffEntries: SourceStaffEntry[];\n private firstRepetitionInstructions: RepetitionInstruction[] = [];\n private lastRepetitionInstructions: RepetitionInstruction[] = [];\n private rules: EngravingRules;\n private tempoInBPM: number;\n private verticalMeasureList: GraphicalMeasure[]; // useful, see GraphicalMusicSheet.GetGraphicalFromSourceStaffEntry\n\n public get MeasureNumber(): number {\n return this.measureNumber;\n }\n\n public set MeasureNumber(value: number) {\n this.measureNumber = value;\n }\n\n public get AbsoluteTimestamp(): Fraction {\n return this.absoluteTimestamp;\n }\n\n public set AbsoluteTimestamp(value: Fraction) {\n this.absoluteTimestamp = value;\n }\n\n public get CompleteNumberOfStaves(): number {\n return this.completeNumberOfStaves;\n }\n\n public get Duration(): Fraction {\n return this.duration; // can be 1/1 in a 4/4 measure\n }\n\n public set Duration(value: Fraction) {\n this.duration = value;\n }\n\n public get ActiveTimeSignature(): Fraction {\n return this.activeTimeSignature;\n }\n\n public set ActiveTimeSignature(value: Fraction) {\n this.activeTimeSignature = value;\n }\n\n public get ImplicitMeasure(): boolean {\n return this.implicitMeasure;\n }\n\n public set ImplicitMeasure(value: boolean) {\n this.implicitMeasure = value;\n }\n\n public get HasEndLine(): boolean {\n return this.hasEndLine;\n }\n\n public set HasEndLine(value: boolean) {\n this.hasEndLine = value;\n }\n\n public get StaffLinkedExpressions(): MultiExpression[][] {\n return this.staffLinkedExpressions;\n }\n\n public get TempoExpressions(): MultiTempoExpression[] {\n return this.tempoExpressions;\n }\n\n public get VerticalSourceStaffEntryContainers(): VerticalSourceStaffEntryContainer[] {\n return this.verticalSourceStaffEntryContainers;\n }\n\n public get FirstInstructionsStaffEntries(): SourceStaffEntry[] {\n return this.firstInstructionsStaffEntries;\n }\n\n public get LastInstructionsStaffEntries(): SourceStaffEntry[] {\n return this.lastInstructionsStaffEntries;\n }\n\n public get FirstRepetitionInstructions(): RepetitionInstruction[] {\n return this.firstRepetitionInstructions;\n }\n\n public get LastRepetitionInstructions(): RepetitionInstruction[] {\n return this.lastRepetitionInstructions;\n }\n\n public getErrorInMeasure(staffIndex: number): boolean {\n return this.graphicalMeasureErrors[staffIndex];\n }\n\n public setErrorInGraphicalMeasure(staffIndex: number, hasError: boolean): void {\n this.graphicalMeasureErrors[staffIndex] = hasError;\n }\n\n public getNextMeasure(measures: SourceMeasure[]): SourceMeasure {\n return measures[this.measureListIndex + 1];\n }\n\n public getPreviousMeasure(measures: SourceMeasure[]): SourceMeasure {\n if (this.measureListIndex > 1) {\n return measures[this.measureListIndex - 1];\n }\n return undefined;\n }\n\n public get Rules(): EngravingRules {\n return this.rules;\n }\n\n public get VerticalMeasureList(): GraphicalMeasure[] {\n return this.verticalMeasureList;\n }\n\n public set VerticalMeasureList(value: GraphicalMeasure[]) {\n this.verticalMeasureList = value;\n }\n\n public get TempoInBPM(): number {\n return this.tempoInBPM;\n }\n\n public set TempoInBPM(value: number) {\n this.tempoInBPM = value;\n }\n\n /**\n * Check at the given timestamp if a VerticalContainer exists, if not creates a new, timestamp-ordered one,\n * and at the given index, if a [[SourceStaffEntry]] exists, and if not, creates a new one.\n * @param inMeasureTimestamp\n * @param inSourceMeasureStaffIndex\n * @param staff\n * @returns {{createdNewContainer: boolean, staffEntry: SourceStaffEntry}}\n */\n public findOrCreateStaffEntry(inMeasureTimestamp: Fraction, inSourceMeasureStaffIndex: number,\n staff: Staff): {createdNewContainer: boolean, staffEntry: SourceStaffEntry} {\n let staffEntry: SourceStaffEntry = undefined;\n // Find:\n let existingVerticalSourceStaffEntryContainer: VerticalSourceStaffEntryContainer;\n for (const container of this.verticalSourceStaffEntryContainers) {\n if (container.Timestamp.Equals(inMeasureTimestamp)) {\n existingVerticalSourceStaffEntryContainer = container;\n break;\n }\n }\n if (existingVerticalSourceStaffEntryContainer) {\n if (existingVerticalSourceStaffEntryContainer.StaffEntries[inSourceMeasureStaffIndex]) {\n staffEntry = existingVerticalSourceStaffEntryContainer.StaffEntries[inSourceMeasureStaffIndex];\n } else {\n staffEntry = new SourceStaffEntry(existingVerticalSourceStaffEntryContainer, staff);\n existingVerticalSourceStaffEntryContainer.StaffEntries[inSourceMeasureStaffIndex] = staffEntry;\n }\n return {createdNewContainer: false, staffEntry: staffEntry};\n }\n const last: VerticalSourceStaffEntryContainer = this.verticalSourceStaffEntryContainers[this.verticalSourceStaffEntryContainers.length - 1];\n if (this.verticalSourceStaffEntryContainers.length === 0 || last.Timestamp.lt(inMeasureTimestamp)) {\n const container: VerticalSourceStaffEntryContainer = new VerticalSourceStaffEntryContainer(\n this, inMeasureTimestamp.clone(), this.completeNumberOfStaves\n );\n this.verticalSourceStaffEntryContainers.push(container);\n staffEntry = new SourceStaffEntry(container, staff);\n container.StaffEntries[inSourceMeasureStaffIndex] = staffEntry;\n } else {\n for (\n let i: number = this.verticalSourceStaffEntryContainers.length - 1;\n i >= 0; i--\n ) {\n if (this.verticalSourceStaffEntryContainers[i].Timestamp.lt(inMeasureTimestamp)) {\n const container: VerticalSourceStaffEntryContainer = new VerticalSourceStaffEntryContainer(\n this, inMeasureTimestamp.clone(), this.completeNumberOfStaves\n );\n this.verticalSourceStaffEntryContainers.splice(i + 1, 0, container);\n staffEntry = new SourceStaffEntry(container, staff);\n container.StaffEntries[inSourceMeasureStaffIndex] = staffEntry;\n break;\n }\n if (i === 0) {\n const container: VerticalSourceStaffEntryContainer = new VerticalSourceStaffEntryContainer(\n this, inMeasureTimestamp.clone(), this.completeNumberOfStaves\n );\n this.verticalSourceStaffEntryContainers.splice(i, 0, container);\n staffEntry = new SourceStaffEntry(container, staff);\n container.StaffEntries[inSourceMeasureStaffIndex] = staffEntry;\n break;\n }\n }\n }\n return {createdNewContainer: true, staffEntry: staffEntry};\n }\n\n /**\n * Check if a VerticalContainer, a staffEntry and a voiceEntry exist at the given timestamp.\n * If not, create the necessary entries.\n * @param sse\n * @param voice\n * @returns {{createdVoiceEntry: boolean, voiceEntry: VoiceEntry}}\n */\n public findOrCreateVoiceEntry(sse: SourceStaffEntry, voice: Voice): { createdVoiceEntry: boolean, voiceEntry: VoiceEntry } {\n let ve: VoiceEntry = undefined;\n let createdNewVoiceEntry: boolean = false;\n for (const voiceEntry of sse.VoiceEntries) {\n if (voiceEntry.ParentVoice === voice) {\n ve = voiceEntry;\n break;\n }\n }\n if (!ve) {\n ve = new VoiceEntry(sse.Timestamp, voice, sse);\n sse.VoiceEntries.push(ve);\n createdNewVoiceEntry = true;\n }\n return {createdVoiceEntry: createdNewVoiceEntry, voiceEntry: ve};\n }\n\n /**\n * Search for a non-null [[SourceStaffEntry]] at the given verticalIndex,\n * starting from the given horizontalIndex and moving backwards. If none is found, then return undefined.\n * @param verticalIndex\n * @param horizontalIndex\n * @returns {any}\n */\n public getPreviousSourceStaffEntryFromIndex(verticalIndex: number, horizontalIndex: number): SourceStaffEntry {\n for (let i: number = horizontalIndex - 1; i >= 0; i--) {\n if (this.verticalSourceStaffEntryContainers[i][verticalIndex]) {\n return this.verticalSourceStaffEntryContainers[i][verticalIndex];\n }\n }\n return undefined;\n }\n\n /**\n * Return the index of the existing VerticalContainer at the given timestamp.\n * @param musicTimestamp\n * @returns {number}\n */\n public getVerticalContainerIndexByTimestamp(musicTimestamp: Fraction): number {\n for (let idx: number = 0, len: number = this.VerticalSourceStaffEntryContainers.length; idx < len; ++idx) {\n if (this.VerticalSourceStaffEntryContainers[idx].Timestamp.Equals(musicTimestamp)) {\n return idx; // this.verticalSourceStaffEntryContainers.indexOf(verticalSourceStaffEntryContainer);\n }\n }\n return -1;\n }\n\n /**\n * Return the existing VerticalContainer at the given timestamp.\n * @param musicTimestamp\n * @returns {any}\n */\n public getVerticalContainerByTimestamp(musicTimestamp: Fraction): VerticalSourceStaffEntryContainer {\n for (let idx: number = 0, len: number = this.VerticalSourceStaffEntryContainers.length; idx < len; ++idx) {\n const verticalSourceStaffEntryContainer: VerticalSourceStaffEntryContainer = this.VerticalSourceStaffEntryContainers[idx];\n if (verticalSourceStaffEntryContainer.Timestamp.Equals(musicTimestamp)) {\n return verticalSourceStaffEntryContainer;\n }\n }\n return undefined;\n }\n\n /**\n * Check the [[SourceMeasure]] for a possible VerticalContainer with all of its [[StaffEntry]]s undefined,\n * and if found, remove the VerticalContainer from the [[SourceMeasure]].\n * @param index\n */\n public checkForEmptyVerticalContainer(index: number): void {\n let undefinedCounter: number = 0;\n for (let i: number = 0; i < this.completeNumberOfStaves; i++) {\n if (!this.verticalSourceStaffEntryContainers[index][i]) {\n undefinedCounter++;\n }\n }\n if (undefinedCounter === this.completeNumberOfStaves) {\n this.verticalSourceStaffEntryContainers.splice(index, 1);\n }\n }\n\n /**\n * This method is used for handling a measure with the following error (in the procedure of finding out the Instrument's Duration):\n * If the LastStaffEntry is missing (implied restNote or error), then go back the StaffEntries until you find a TiedNote (tie Start),\n * which gives the correct MeasureDuration.\n * @param musicSheet\n * @param maxInstDuration\n * @returns {Fraction}\n */\n public reverseCheck(musicSheet: MusicSheet, maxInstDuration: Fraction): Fraction {\n let maxDuration: Fraction = new Fraction(0, 1);\n const instrumentsDurations: Fraction[] = [];\n for (let i: number = 0; i < musicSheet.Instruments.length; i++) {\n let instrumentDuration: Fraction = new Fraction(0, 1);\n const inSourceMeasureInstrumentIndex: number = musicSheet.getGlobalStaffIndexOfFirstStaff(musicSheet.Instruments[i]);\n for (let j: number = 0; j < musicSheet.Instruments[i].Staves.length; j++) {\n const lastStaffEntry: SourceStaffEntry = this.getLastSourceStaffEntryForInstrument(inSourceMeasureInstrumentIndex + j);\n if (lastStaffEntry !== undefined && !lastStaffEntry.hasTie()) {\n const verticalContainerIndex: number = this.verticalSourceStaffEntryContainers.indexOf(lastStaffEntry.VerticalContainerParent);\n for (let m: number = verticalContainerIndex - 1; m >= 0; m--) {\n const previousStaffEntry: SourceStaffEntry = this.verticalSourceStaffEntryContainers[m][inSourceMeasureInstrumentIndex + j];\n if (previousStaffEntry !== undefined && previousStaffEntry.hasTie()) {\n if (instrumentDuration.lt(Fraction.plus(previousStaffEntry.Timestamp, previousStaffEntry.calculateMaxNoteLength()))) {\n instrumentDuration = Fraction.plus(previousStaffEntry.Timestamp, previousStaffEntry.calculateMaxNoteLength());\n break;\n }\n }\n }\n }\n }\n instrumentsDurations.push(instrumentDuration);\n }\n for (let idx: number = 0, len: number = instrumentsDurations.length; idx < len; ++idx) {\n const instrumentsDuration: Fraction = instrumentsDurations[idx];\n if (maxDuration.lt(instrumentsDuration)) {\n maxDuration = instrumentsDuration;\n }\n }\n\n return Fraction.max(maxDuration, maxInstDuration);\n }\n\n /**\n * Calculate all the [[Instrument]]'s NotesDurations for this Measures.\n * @param musicSheet\n * @param instrumentMaxTieNoteFractions\n * @returns {Fraction[]}\n */\n public calculateInstrumentsDuration(musicSheet: MusicSheet, instrumentMaxTieNoteFractions: Fraction[]): Fraction[] {\n const instrumentsDurations: Fraction[] = [];\n for (let i: number = 0; i < musicSheet.Instruments.length; i++) {\n let instrumentDuration: Fraction = new Fraction(0, 1);\n const inSourceMeasureInstrumentIndex: number = musicSheet.getGlobalStaffIndexOfFirstStaff(musicSheet.Instruments[i]);\n for (let j: number = 0; j < musicSheet.Instruments[i].Staves.length; j++) {\n const lastStaffEntry: SourceStaffEntry = this.getLastSourceStaffEntryForInstrument(inSourceMeasureInstrumentIndex + j);\n if (lastStaffEntry !== undefined && lastStaffEntry.Timestamp) {\n if (instrumentDuration.lt(Fraction.plus(lastStaffEntry.Timestamp, lastStaffEntry.calculateMaxNoteLength()))) {\n instrumentDuration = Fraction.plus(lastStaffEntry.Timestamp, lastStaffEntry.calculateMaxNoteLength());\n }\n }\n }\n if (instrumentDuration.lt(instrumentMaxTieNoteFractions[i])) {\n instrumentDuration = instrumentMaxTieNoteFractions[i];\n }\n instrumentsDurations.push(instrumentDuration);\n }\n return instrumentsDurations;\n }\n\n public getEntriesPerStaff(staffIndex: number): SourceStaffEntry[] {\n const sourceStaffEntries: SourceStaffEntry[] = [];\n for (const container of this.VerticalSourceStaffEntryContainers) {\n const sse: SourceStaffEntry = container.StaffEntries[staffIndex];\n if (sse) {\n sourceStaffEntries.push(sse);\n }\n }\n return sourceStaffEntries;\n }\n\n /**\n *\n * @returns {boolean} true iff some measure begin instructions have been found for at least one staff\n */\n public hasBeginInstructions(): boolean {\n for (let staffIndex: number = 0, len: number = this.FirstInstructionsStaffEntries.length; staffIndex < len; staffIndex++) {\n const beginInstructionsStaffEntry: SourceStaffEntry = this.FirstInstructionsStaffEntries[staffIndex];\n if (beginInstructionsStaffEntry !== undefined && beginInstructionsStaffEntry.Instructions.length > 0) {\n return true;\n }\n }\n return false;\n }\n\n public beginsWithLineRepetition(): boolean {\n for (let idx: number = 0, len: number = this.FirstRepetitionInstructions.length; idx < len; ++idx) {\n const instr: RepetitionInstruction = this.FirstRepetitionInstructions[idx];\n if (instr.type === RepetitionInstructionEnum.StartLine) {\n return true;\n }\n if (instr.parentRepetition !== undefined && instr === instr.parentRepetition.startMarker && !instr.parentRepetition.FromWords) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if this measure is a Repetition Ending.\n * @returns {boolean}\n */\n public endsWithLineRepetition(): boolean {\n for (let idx: number = 0, len: number = this.LastRepetitionInstructions.length; idx < len; ++idx) {\n const instruction: RepetitionInstruction = this.LastRepetitionInstructions[idx];\n if (instruction.type === RepetitionInstructionEnum.BackJumpLine) {\n return true;\n }\n\n const rep: Repetition = instruction.parentRepetition;\n if (!rep) {\n continue;\n }\n if (rep.FromWords) {\n continue;\n }\n for (let idx2: number = 0, len2: number = rep.BackwardJumpInstructions.length; idx2 < len2; ++idx2) {\n const backJumpInstruction: RepetitionInstruction = rep.BackwardJumpInstructions[idx2];\n if (instruction === backJumpInstruction) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Check if a Repetition starts at the next Measure.\n * @returns {boolean}\n */\n public beginsWithWordRepetition(): boolean {\n for (let idx: number = 0, len: number = this.FirstRepetitionInstructions.length; idx < len; ++idx) {\n const instruction: RepetitionInstruction = this.FirstRepetitionInstructions[idx];\n if (instruction.parentRepetition !== undefined &&\n instruction === instruction.parentRepetition.startMarker && instruction.parentRepetition.FromWords) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if this Measure ends a Repetition.\n * @returns {boolean}\n */\n public endsWithWordRepetition(): boolean {\n for (let idx: number = 0, len: number = this.LastRepetitionInstructions.length; idx < len; ++idx) {\n const instruction: RepetitionInstruction = this.LastRepetitionInstructions[idx];\n const rep: Repetition = instruction.parentRepetition;\n if (!rep) {\n continue;\n }\n if (!rep.FromWords) {\n continue;\n }\n for (let idx2: number = 0, len2: number = rep.BackwardJumpInstructions.length; idx2 < len2; ++idx2) {\n const backJumpInstruction: RepetitionInstruction = rep.BackwardJumpInstructions[idx2];\n if (instruction === backJumpInstruction) {\n return true;\n }\n }\n if (instruction === rep.forwardJumpInstruction) {\n return true;\n }\n }\n return false;\n }\n\n public beginsRepetitionEnding(): boolean {\n for (const instruction of this.FirstRepetitionInstructions) {\n if (instruction.type === RepetitionInstructionEnum.Ending &&\n instruction.alignment === AlignmentType.Begin) {\n return true;\n }\n }\n return false;\n }\n\n public endsRepetitionEnding(): boolean {\n for (const instruction of this.LastRepetitionInstructions) {\n if (instruction.type === RepetitionInstructionEnum.Ending &&\n instruction.alignment === AlignmentType.End) {\n return true;\n }\n }\n return false;\n }\n\n public getKeyInstruction(staffIndex: number): KeyInstruction {\n if (this.FirstInstructionsStaffEntries[staffIndex]) {\n const sourceStaffEntry: SourceStaffEntry = this.FirstInstructionsStaffEntries[staffIndex];\n for (let idx: number = 0, len: number = sourceStaffEntry.Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = sourceStaffEntry.Instructions[idx];\n if (abstractNotationInstruction instanceof KeyInstruction) {\n return abstractNotationInstruction;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Return the first non-null [[SourceStaffEntry]] at the given InstrumentIndex.\n * @param instrumentIndex\n * @returns {SourceStaffEntry}\n */\n private getLastSourceStaffEntryForInstrument(instrumentIndex: number): SourceStaffEntry {\n let entry: SourceStaffEntry;\n for (let i: number = this.verticalSourceStaffEntryContainers.length - 1; i >= 0; i--) {\n entry = this.verticalSourceStaffEntryContainers[i].StaffEntries[instrumentIndex];\n if (entry) {\n break;\n }\n }\n return entry;\n }\n}\n","import { GraphicalContinuousDynamicExpression } from \"../GraphicalContinuousDynamicExpression\";\nimport { ContinuousDynamicExpression } from \"../../VoiceData/Expressions/ContinuousExpressions/ContinuousDynamicExpression\";\nimport { StaffLine } from \"../StaffLine\";\nimport { GraphicalLabel } from \"../GraphicalLabel\";\nimport { Label } from \"../../Label\";\nimport { TextAlignmentEnum } from \"../../../Common/Enums/TextAlignment\";\nimport { FontStyles } from \"../../../Common/Enums/FontStyles\";\nimport { SourceMeasure } from \"../../VoiceData/SourceMeasure\";\n\n/**\n * This class extends the GraphicalContinuousDynamicExpression and creates all necessary methods for drawing\n */\nexport class VexFlowContinuousDynamicExpression extends GraphicalContinuousDynamicExpression {\n constructor(continuousDynamic: ContinuousDynamicExpression, staffLine: StaffLine,\n measure: SourceMeasure, textHeight?: number) {\n super(continuousDynamic, staffLine, measure);\n if (this.IsVerbal) {\n const sourceLabel: Label = new Label(continuousDynamic.Label);\n this.label = new GraphicalLabel(sourceLabel,\n textHeight ? textHeight : this.rules.ContinuousDynamicTextHeight,\n TextAlignmentEnum.LeftCenter,\n this.rules,\n this.PositionAndShape);\n\n this.label.Label.fontStyle = FontStyles.Italic;\n this.label.setLabelPositionAndShapeBorders();\n this.PositionAndShape.calculateBoundingBox();\n }\n }\n}\n","import Vex from \"vexflow\";\n\nimport {VexFlowBackend} from \"./VexFlowBackend\";\nimport {FontStyles} from \"../../../Common/Enums/FontStyles\";\nimport {Fonts} from \"../../../Common/Enums/Fonts\";\nimport {RectangleF2D} from \"../../../Common/DataObjects/RectangleF2D\";\nimport {PointF2D} from \"../../../Common/DataObjects/PointF2D\";\nimport {VexFlowConverter} from \"./VexFlowConverter\";\nimport {BackendType} from \"../../../OpenSheetMusicDisplay\";\nimport {EngravingRules} from \"../EngravingRules\";\nimport {GraphicalMusicPage} from \"../GraphicalMusicPage\";\n\nexport class CanvasVexFlowBackend extends VexFlowBackend {\n constructor(rules: EngravingRules) {\n super();\n this.rules = rules;\n }\n\n public getVexflowBackendType(): Vex.Flow.Renderer.Backends {\n return Vex.Flow.Renderer.Backends.CANVAS;\n }\n\n public getOSMDBackendType(): BackendType {\n return BackendType.Canvas;\n }\n\n public initialize(container: HTMLElement): void {\n this.canvas = document.createElement(\"canvas\");\n if (!this.graphicalMusicPage) {\n this.graphicalMusicPage = new GraphicalMusicPage(undefined);\n this.graphicalMusicPage.PageNumber = 1;\n }\n this.canvas.id = \"osmdCanvasVexFlowBackendCanvas\" + this.graphicalMusicPage.PageNumber; // needed to extract image buffer from js\n this.inner = document.createElement(\"div\");\n this.inner.style.position = \"relative\";\n this.canvas.style.zIndex = \"0\";\n this.inner.appendChild(this.canvas);\n container.appendChild(this.inner);\n this.renderer = new Vex.Flow.Renderer(this.canvas, this.getVexflowBackendType());\n this.ctx = this.renderer.getContext();\n }\n\n /**\n * Initialize a canvas without attaching it to a DOM node. Can be used to draw in background\n * @param width Width of the canvas\n * @param height Height of the canvas\n */\n public initializeHeadless(width: number = 300, height: number = 300): void {\n if (!this.graphicalMusicPage) {\n // not needed here yet, but just for future safety, make sure the page isn't undefined\n this.graphicalMusicPage = new GraphicalMusicPage(undefined);\n this.graphicalMusicPage.PageNumber = 1;\n }\n this.canvas = document.createElement(\"canvas\");\n (this.canvas as any).width = width;\n (this.canvas as any).height = height;\n this.renderer = new Vex.Flow.Renderer(this.canvas, this.getVexflowBackendType());\n this.ctx = this.renderer.getContext();\n }\n\n public getContext(): Vex.Flow.CanvasContext {\n return this.ctx;\n }\n\n public clear(): void {\n (this.ctx).clearRect(0, 0, (this.canvas).width, (this.canvas).height);\n\n // set background color if not transparent\n if (this.rules.PageBackgroundColor) {\n this.ctx.save();\n // note that this will hide the cursor\n this.ctx.setFillStyle(this.rules.PageBackgroundColor);\n this.ctx.fillRect(0, 0, (this.canvas as any).width, (this.canvas as any).height);\n this.ctx.restore();\n }\n }\n\n public scale(k: number): void {\n this.ctx.scale(k, k);\n }\n\n public translate(x: number, y: number): void {\n this.CanvasRenderingCtx.translate(x, y);\n }\n public renderText(fontHeight: number, fontStyle: FontStyles, font: Fonts, text: string,\n heightInPixel: number, screenPosition: PointF2D,\n color: string = undefined, fontFamily: string = undefined): void  {\n const old: string = this.CanvasRenderingCtx.font;\n this.CanvasRenderingCtx.save();\n this.CanvasRenderingCtx.font = VexFlowConverter.font(\n fontHeight,\n fontStyle,\n font,\n this.rules,\n fontFamily\n );\n this.CanvasRenderingCtx.fillStyle = color;\n this.CanvasRenderingCtx.strokeStyle = color;\n this.CanvasRenderingCtx.fillText(text, screenPosition.x, screenPosition.y + heightInPixel);\n this.CanvasRenderingCtx.restore();\n this.CanvasRenderingCtx.font = old;\n }\n public renderRectangle(rectangle: RectangleF2D, styleId: number, alpha: number = 1): void {\n const old: string | CanvasGradient | CanvasPattern = this.CanvasRenderingCtx.fillStyle;\n this.CanvasRenderingCtx.fillStyle = VexFlowConverter.style(styleId);\n this.CanvasRenderingCtx.globalAlpha = alpha;\n this.ctx.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);\n this.CanvasRenderingCtx.fillStyle = old;\n this.CanvasRenderingCtx.globalAlpha = 1;\n }\n\n public renderLine(start: PointF2D, stop: PointF2D, color: string = \"#FF0000FF\", lineWidth: number= 2): void {\n const oldStyle: string | CanvasGradient | CanvasPattern = this.CanvasRenderingCtx.strokeStyle;\n this.CanvasRenderingCtx.strokeStyle = color;\n this.CanvasRenderingCtx.beginPath();\n this.CanvasRenderingCtx.moveTo(start.x, start.y);\n this.CanvasRenderingCtx.lineTo(stop.x, stop.y);\n this.CanvasRenderingCtx.stroke();\n this.CanvasRenderingCtx.strokeStyle = oldStyle;\n }\n\n public renderCurve(points: PointF2D[]): void {\n this.ctx.beginPath();\n this.ctx.moveTo(points[0].x, points[0].y);\n this.ctx.bezierCurveTo(\n points[1].x,\n points[1].y,\n points[2].x,\n points[2].y,\n points[3].x,\n points[3].y\n );\n this.ctx.lineTo(points[7].x, points[7].y);\n this.ctx.bezierCurveTo(\n points[6].x,\n points[6].y,\n points[5].x,\n points[5].y,\n points[4].x,\n points[4].y\n );\n this.ctx.lineTo(points[0].x, points[0].y);\n //this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.fill();\n }\n\n private ctx: Vex.Flow.CanvasContext;\n\n public get CanvasRenderingCtx(): CanvasRenderingContext2D {\n // This clusterfuck is only there to counter act my favorite vexflow line:\n // ctx.vexFlowCanvasContext = ctx;\n // No idea why they are saving the context but we wrap the types here\n return (this.ctx as any).vexFlowCanvasContext;\n }\n}\n","import Vex from \"vexflow\";\nimport {FontStyles} from \"../../../Common/Enums/FontStyles\";\nimport {Fonts} from \"../../../Common/Enums/Fonts\";\nimport {RectangleF2D} from \"../../../Common/DataObjects/RectangleF2D\";\nimport {PointF2D} from \"../../../Common/DataObjects/PointF2D\";\nimport {GraphicalMusicPage, EngravingRules} from \"..\";\nimport {BackendType} from \"../../../OpenSheetMusicDisplay\";\n\nexport class VexFlowBackends {\n public static CANVAS: 0;\n public static RAPHAEL: 1; // this is currently unused in OSMD, and outdated in Vexflow.\n // maybe SVG should be 1? but this could be a breaking change if people use numbers (2) instead of names (.SVG).\n public static SVG: 2;\n public static VML: 3; // this is currently unused in OSMD, and outdated in Vexflow\n\n}\n\nexport abstract class VexFlowBackend {\n\n /** The GraphicalMusicPage the backend is drawing from. Each backend only renders one GraphicalMusicPage, to which the coordinates are relative. */\n public graphicalMusicPage: GraphicalMusicPage;\n protected rules: EngravingRules;\n\n public abstract initialize(container: HTMLElement): void;\n\n public getInnerElement(): HTMLElement {\n return this.inner;\n }\n\n public getCanvas(): HTMLElement {\n return this.canvas;\n }\n\n public getRenderElement(): HTMLElement {\n //console.log(\"backend type: \" + this.getVexflowBackendType());\n let renderingHtmlElement: HTMLElement = this.canvas; // for SVGBackend\n if (this.getVexflowBackendType() === Vex.Flow.Renderer.Backends.CANVAS) {\n renderingHtmlElement = this.inner;\n // usage in removeFromContainer:\n // for SVG, this.canvas === this.inner, but for Canvas, removing this.canvas causes an error because it's not a child of container,\n // so we have to remove this.inner instead.\n }\n return renderingHtmlElement;\n }\n\n public getRenderer(): Vex.Flow.Renderer {\n return this.renderer;\n }\n\n public removeAllChildrenFromContainer(container: HTMLElement): void {\n while (container.children.length !== 0) {\n container.removeChild(container.children.item(0));\n }\n }\n\n // note: removing single children to remove all is error-prone, because sometimes a random SVG-child remains.\n public removeFromContainer(container: HTMLElement): void {\n const htmlElementToRemove: HTMLElement = this.getRenderElement();\n\n // only remove child if the container has this child, otherwise it will throw an error.\n for (let i: number = 0; i < container.children.length; i++) {\n if (container.children.item(i) === htmlElementToRemove) {\n container.removeChild(htmlElementToRemove);\n break;\n }\n }\n // there is unfortunately no built-in container.hasChild(child) method.\n }\n\npublic abstract getContext(): Vex.IRenderContext;\n\n // public abstract setWidth(width: number): void;\n // public abstract setHeight(height: number): void;\n\n public abstract scale(k: number): void;\n\n public resize(x: number, y: number): void {\n this.renderer.resize(x, y);\n }\n\n public abstract clear(): void;\n\n public abstract translate(x: number, y: number): void;\n public abstract renderText(fontHeight: number, fontStyle: FontStyles, font: Fonts, text: string,\n heightInPixel: number, screenPosition: PointF2D,\n color?: string, fontFamily?: string): void;\n /**\n * Renders a rectangle with the given style to the screen.\n * It is given in screen coordinates.\n * @param rectangle the rect in screen coordinates\n * @param layer is the current rendering layer. There are many layers on top of each other to which can be rendered. Not needed for now.\n * @param styleId the style id\n * @param alpha alpha value between 0 and 1\n */\n public abstract renderRectangle(rectangle: RectangleF2D, styleId: number, alpha: number): void;\n\n public abstract renderLine(start: PointF2D, stop: PointF2D, color: string, lineWidth: number): void;\n\n public abstract renderCurve(points: PointF2D[]): void;\n\n public abstract getVexflowBackendType(): Vex.Flow.Renderer.Backends;\n\n /** The general type of backend: Canvas or SVG.\n * This is not used for now (only VexflowBackendType used), but it may be useful when we don't want to use a Vexflow class.\n */\n public abstract getOSMDBackendType(): BackendType;\n\n protected renderer: Vex.Flow.Renderer;\n protected inner: HTMLElement;\n protected canvas: HTMLElement;\n}\n","import Vex from \"vexflow\";\nimport {GraphicalNote} from \"../GraphicalNote\";\nimport {Note} from \"../../VoiceData/Note\";\nimport {ClefInstruction} from \"../../VoiceData/Instructions/ClefInstruction\";\nimport {VexFlowConverter} from \"./VexFlowConverter\";\nimport {Pitch} from \"../../../Common/DataObjects/Pitch\";\nimport {Fraction} from \"../../../Common/DataObjects/Fraction\";\nimport {OctaveEnum, OctaveShift} from \"../../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport { GraphicalVoiceEntry } from \"../GraphicalVoiceEntry\";\nimport { KeyInstruction } from \"../../VoiceData/Instructions/KeyInstruction\";\n\n/**\n * The VexFlow version of a [[GraphicalNote]].\n */\nexport class VexFlowGraphicalNote extends GraphicalNote {\n constructor(note: Note, parent: GraphicalVoiceEntry, activeClef: ClefInstruction,\n octaveShift: OctaveEnum = OctaveEnum.NONE, graphicalNoteLength: Fraction = undefined) {\n super(note, parent, graphicalNoteLength);\n this.clef = activeClef;\n this.octaveShift = octaveShift;\n if (note.Pitch) {\n // TODO: Maybe shift to Transpose function when available\n const drawPitch: Pitch = OctaveShift.getPitchFromOctaveShift(note.Pitch, octaveShift);\n this.vfpitch = VexFlowConverter.pitch(this, drawPitch);\n this.vfpitch[1] = undefined;\n }\n }\n\n public octaveShift: OctaveEnum;\n // The pitch of this note as given by VexFlowConverter.pitch\n public vfpitch: [string, string, ClefInstruction];\n // The corresponding VexFlow StaveNote (plus its index in the chord)\n public vfnote: [Vex.Flow.StaveNote, number];\n // The current clef\n private clef: ClefInstruction;\n\n /**\n * Update the pitch of this note. Necessary in order to display accidentals correctly.\n * This is called by VexFlowGraphicalSymbolFactory.addGraphicalAccidental.\n * @param pitch\n */\n public setAccidental(pitch: Pitch): void {\n // if (this.vfnote) {\n // let pitchAcc: AccidentalEnum = pitch.Accidental;\n // const acc: string = Pitch.accidentalVexflow(pitch.Accidental);\n // if (acc) {\n // alert(acc);\n // this.vfnote[0].addAccidental(this.vfnote[1], new Vex.Flow.Accidental(acc));\n // }\n // } else {\n // revert octave shift, as the placement of the note is independent of octave brackets\n const drawPitch: Pitch = OctaveShift.getPitchFromOctaveShift(pitch, this.octaveShift);\n // recalculate the pitch, and this time don't ignore the accidental:\n this.vfpitch = VexFlowConverter.pitch(this, drawPitch);\n //}\n }\n public Transpose(keyInstruction: KeyInstruction, activeClef: ClefInstruction, halfTones: number, octaveEnum: OctaveEnum): Pitch {\n const tranposedPitch: Pitch = super.Transpose(keyInstruction, activeClef, halfTones, octaveEnum);\n const drawPitch: Pitch = OctaveShift.getPitchFromOctaveShift(tranposedPitch, this.octaveShift);\n this.vfpitch = VexFlowConverter.pitch(this, drawPitch);\n this.vfpitch[1] = undefined;\n return drawPitch;\n }\n\n /**\n * Set the VexFlow StaveNote corresponding to this GraphicalNote, together with its index in the chord.\n * @param note\n * @param index\n */\n public setIndex(note: Vex.Flow.StaveNote, index: number): void {\n this.vfnote = [note, index];\n }\n\n /**\n * Gets the clef for this note\n */\n public Clef(): ClefInstruction {\n return this.clef;\n }\n\n /**\n * Gets the id of the SVGGElement containing this note, given the SVGRenderer is used.\n * This is for low-level rendering hacks and should be used with caution.\n */\n public getSVGId(): string {\n return this.vfnote[0].getAttribute(\"id\");\n }\n\n /**\n * Gets the SVGGElement containing this note, given the SVGRenderer is used.\n * This is for low-level rendering hacks and should be used with caution.\n */\n public getSVGGElement(): SVGGElement {\n return this.vfnote[0].getAttribute(\"el\");\n }\n}\n","import Vex from \"vexflow\";\nimport { GraphicalObject } from \"../GraphicalObject\";\nimport { VexFlowStaffLine } from \"./VexFlowStaffLine\";\nimport { BoundingBox } from \"../BoundingBox\";\nimport { VexFlowMeasure } from \"./VexFlowMeasure\";\nimport { unitInPixels } from \"./VexFlowMusicSheetDrawer\";\n\n/**\n * Class that defines a instrument bracket at the beginning of a line.\n */\nexport class VexFlowInstrumentBracket extends GraphicalObject {\n\n protected vexflowConnector: Vex.Flow.StaveConnector;\n\n constructor(firstVexFlowStaffLine: VexFlowStaffLine, lastVexFlowStaffLine: VexFlowStaffLine, depth: number = 0) {\n super();\n this.PositionAndShape = new BoundingBox(this, firstVexFlowStaffLine.ParentMusicSystem.PositionAndShape);\n const firstVexMeasure: VexFlowMeasure = firstVexFlowStaffLine.Measures[0] as VexFlowMeasure;\n const lastVexMeasure: VexFlowMeasure = lastVexFlowStaffLine.Measures[0] as VexFlowMeasure;\n this.addConnector(firstVexMeasure.getVFStave(), lastVexMeasure.getVFStave(), Vex.Flow.StaveConnector.type.BRACKET, depth);\n }\n\n /**\n * Render the bracket using the given backend\n * @param ctx Render Vexflow context\n */\n public draw(ctx: Vex.IRenderContext): void {\n // Draw vexflow brace. This sets the positions inside the connector.\n this.vexflowConnector.setContext(ctx).draw();\n // Set bounding box\n const con: Vex.Flow.StaveConnector = this.vexflowConnector;\n // First line in first stave\n const topY: number = con.top_stave.getYForLine(0);\n // Last line in last stave\n const botY: number = con.bottom_stave.getYForLine(con.bottom_stave.getNumLines() - 1) + con.thickness;\n // Set bounding box position and size in OSMD units\n this.PositionAndShape.AbsolutePosition.x = (con.top_stave.getX() - 2 + con.x_shift) / unitInPixels;\n this.PositionAndShape.AbsolutePosition.y = topY / unitInPixels;\n this.PositionAndShape.Size.height = (botY - topY) / unitInPixels;\n this.PositionAndShape.Size.width = 12 / unitInPixels; // width is always 12 -> vexflow implementation\n }\n /**\n * Adds a connector between two staves\n *\n * @param {Stave} stave1: First stave\n * @param {Stave} stave2: Second stave\n * @param {Flow.StaveConnector.type} type: Type of connector\n */\n private addConnector(stave1: Vex.Flow.Stave, stave2: Vex.Flow.Stave, type: any, depth: number): void {\n this.vexflowConnector = new Vex.Flow.StaveConnector(stave1, stave2)\n .setType(type)\n .setXShift(depth * -5);\n }\n}\n","import Vex from \"vexflow\";\nimport {GraphicalMeasure} from \"../GraphicalMeasure\";\nimport {SourceMeasure} from \"../../VoiceData/SourceMeasure\";\nimport {Staff} from \"../../VoiceData/Staff\";\nimport {StaffLine} from \"../StaffLine\";\nimport {SystemLinesEnum} from \"../SystemLinesEnum\";\nimport {ClefInstruction, ClefEnum} from \"../../VoiceData/Instructions/ClefInstruction\";\nimport {KeyInstruction} from \"../../VoiceData/Instructions/KeyInstruction\";\nimport {RhythmInstruction} from \"../../VoiceData/Instructions/RhythmInstruction\";\nimport {VexFlowConverter} from \"./VexFlowConverter\";\nimport {VexFlowStaffEntry} from \"./VexFlowStaffEntry\";\nimport {Beam} from \"../../VoiceData/Beam\";\nimport {GraphicalNote} from \"../GraphicalNote\";\nimport {GraphicalStaffEntry} from \"../GraphicalStaffEntry\";\nimport StaveConnector = Vex.Flow.StaveConnector;\nimport StaveNote = Vex.Flow.StaveNote;\nimport StemmableNote = Vex.Flow.StemmableNote;\nimport NoteSubGroup = Vex.Flow.NoteSubGroup;\nimport log from \"loglevel\";\nimport {unitInPixels} from \"./VexFlowMusicSheetDrawer\";\nimport {Tuplet} from \"../../VoiceData/Tuplet\";\nimport {RepetitionInstructionEnum, RepetitionInstruction, AlignmentType} from \"../../VoiceData/Instructions/RepetitionInstruction\";\nimport {SystemLinePosition} from \"../SystemLinePosition\";\nimport {StemDirectionType} from \"../../VoiceData/VoiceEntry\";\nimport {GraphicalVoiceEntry} from \"../GraphicalVoiceEntry\";\nimport {VexFlowVoiceEntry} from \"./VexFlowVoiceEntry\";\nimport {Fraction} from \"../../../Common/DataObjects/Fraction\";\nimport {Voice} from \"../../VoiceData/Voice\";\nimport {LinkedVoice} from \"../../VoiceData/LinkedVoice\";\nimport {EngravingRules} from \"../EngravingRules\";\nimport {OrnamentContainer} from \"../../VoiceData/OrnamentContainer\";\nimport {TechnicalInstruction, TechnicalInstructionType} from \"../../VoiceData/Instructions/TechnicalInstruction\";\nimport {PlacementEnum} from \"../../VoiceData/Expressions/AbstractExpression\";\nimport {VexFlowGraphicalNote} from \"./VexFlowGraphicalNote\";\nimport {AutoBeamOptions} from \"../../../OpenSheetMusicDisplay/OSMDOptions\";\nimport {NoteType, Arpeggio} from \"../../VoiceData\";\nimport {SkyBottomLineCalculator} from \"../SkyBottomLineCalculator\";\n\n// type StemmableNote = Vex.Flow.StemmableNote;\n\nexport class VexFlowMeasure extends GraphicalMeasure {\n constructor(staff: Staff, sourceMeasure: SourceMeasure = undefined, staffLine: StaffLine = undefined) {\n super(staff, sourceMeasure, staffLine);\n this.minimumStaffEntriesWidth = -1;\n\n /*\n * There is no case in which `staffLine === undefined && sourceMeasure === undefined` holds.\n * Hence, it is not necessary to specify an `else` case.\n * One can verify this through a usage search for this constructor.\n */\n if (staffLine) {\n this.rules = staffLine.ParentMusicSystem.rules;\n } else if (sourceMeasure) {\n this.rules = sourceMeasure.Rules;\n }\n\n this.resetLayout();\n }\n\n /** octaveOffset according to active clef */\n public octaveOffset: number = 3;\n /** The VexFlow Voices in the measure */\n public vfVoices: { [voiceID: number]: Vex.Flow.Voice; } = {};\n /** Call this function (if present) to x-format all the voices in the measure */\n public formatVoices: (width: number) => void;\n /** The VexFlow Ties in the measure */\n public vfTies: Vex.Flow.StaveTie[] = [];\n /** The repetition instructions given as words or symbols (coda, dal segno..) */\n public vfRepetitionWords: Vex.Flow.Repetition[] = [];\n /** The VexFlow Stave (= one measure in a staffline) */\n protected stave: Vex.Flow.Stave;\n /** VexFlow StaveConnectors (vertical lines) */\n protected connectors: Vex.Flow.StaveConnector[] = [];\n /** Intermediate object to construct beams */\n private beams: { [voiceID: number]: [Beam, VexFlowVoiceEntry[]][]; } = {};\n /** Beams created by (optional) autoBeam function. */\n private autoVfBeams: Vex.Flow.Beam[];\n /** Beams of tuplet notes created by (optional) autoBeam function. */\n private autoTupletVfBeams: Vex.Flow.Beam[];\n /** VexFlow Beams */\n private vfbeams: { [voiceID: number]: Vex.Flow.Beam[]; };\n /** Intermediate object to construct tuplets */\n protected tuplets: { [voiceID: number]: [Tuplet, VexFlowVoiceEntry[]][]; } = {};\n /** VexFlow Tuplets */\n private vftuplets: { [voiceID: number]: Vex.Flow.Tuplet[]; } = {};\n // The engraving rules of OSMD.\n public rules: EngravingRules;\n\n // Sets the absolute coordinates of the VFStave on the canvas\n public setAbsoluteCoordinates(x: number, y: number): void {\n this.stave.setX(x).setY(y);\n }\n\n /**\n * Reset all the geometric values and parameters of this measure and put it in an initialized state.\n * This is needed to evaluate a measure a second time by system builder.\n */\n public resetLayout(): void {\n // Take into account some space for the begin and end lines of the stave\n // Will be changed when repetitions will be implemented\n //this.beginInstructionsWidth = 20 / UnitInPixels;\n //this.endInstructionsWidth = 20 / UnitInPixels;\n\n // TODO save beginning and end bar type, set these again after new stave.\n\n this.stave = new Vex.Flow.Stave(0, 0, 0, {\n space_above_staff_ln: 0,\n space_below_staff_ln: 0,\n });\n\n if (this.ParentStaff) {\n this.setLineNumber(this.ParentStaff.StafflineCount);\n }\n // constructor sets beginning and end bar type to standard\n\n this.stave.setBegBarType(Vex.Flow.Barline.type.NONE); // technically not correct, but we'd need to set the next measure's beginning bar type\n if (this.parentSourceMeasure && this.parentSourceMeasure.endingBarStyleEnum === SystemLinesEnum.None) {\n // fix for vexflow ignoring ending barline style after new stave, apparently\n this.stave.setEndBarType(Vex.Flow.Barline.type.NONE);\n }\n // the correct bar types seem to be set later\n\n this.updateInstructionWidth();\n }\n\n public clean(): void {\n this.vfTies.length = 0;\n this.connectors = [];\n // Clean up instructions\n this.resetLayout();\n }\n\n /**\n * returns the x-width (in units) of a given measure line {SystemLinesEnum}.\n * @param line\n * @returns the x-width in osmd units\n */\n public getLineWidth(line: SystemLinesEnum): number {\n switch (line) {\n // return 0 for the normal lines, as the line width will be considered at the updateInstructionWidth() method using the stavemodifiers.\n // case SystemLinesEnum.SingleThin:\n // return 5.0 / unitInPixels;\n // case SystemLinesEnum.DoubleThin:\n // return 5.0 / unitInPixels;\n // case SystemLinesEnum.ThinBold:\n // return 5.0 / unitInPixels;\n // but just add a little extra space for repetitions (cosmetics):\n case SystemLinesEnum.BoldThinDots:\n case SystemLinesEnum.DotsThinBold:\n return 10.0 / unitInPixels;\n case SystemLinesEnum.DotsBoldBoldDots:\n return 10.0 / unitInPixels;\n default:\n return 0;\n }\n }\n\n /**\n * adds the given clef to the begin of the measure.\n * This has to update/increase BeginInstructionsWidth.\n * @param clef\n */\n public addClefAtBegin(clef: ClefInstruction): void {\n this.octaveOffset = clef.OctaveOffset;\n if (clef.ClefType === ClefEnum.TAB) {\n this.stave.addClef(\"tab\", undefined, undefined, undefined);\n } else {\n const vfclef: { type: string, size: string, annotation: string } = VexFlowConverter.Clef(clef, \"default\");\n this.stave.addClef(vfclef.type, vfclef.size, vfclef.annotation, Vex.Flow.StaveModifier.Position.BEGIN);\n }\n this.updateInstructionWidth();\n }\n\n /**\n * Sets the number of stafflines that are rendered, so that they are centered properly\n * @param lineNumber\n */\n public setLineNumber(lineNumber: number): void {\n if (lineNumber !== 5) {\n if (lineNumber === 0) {\n (this.stave as any).setNumLines(0);\n this.stave.getBottomLineY = function(): number {\n return this.getYForLine(this.options.num_lines);\n };\n } else if (lineNumber === 1) {\n // Vex.Flow.Stave.setNumLines hides all but the top line.\n // this is better\n (this.stave.options as any).line_config = [\n { visible: false },\n { visible: false },\n { visible: true }, // show middle\n { visible: false },\n { visible: false },\n ];\n //quick fix to see if this matters for calculation. Doesn't seem to\n this.stave.getBottomLineY = function(): number {\n return this.getYForLine(2);\n };\n //lines (which isn't this case here)\n //this.stave.options.num_lines = parseInt(lines, 10);\n } else if (lineNumber === 2) {\n (this.stave.options as any).line_config = [\n { visible: false },\n { visible: false },\n { visible: true }, // show middle\n { visible: true },\n { visible: false },\n ];\n this.stave.getBottomLineY = function(): number {\n return this.getYForLine(3);\n };\n } else if (lineNumber === 3) {\n (this.stave.options as any).line_config = [\n { visible: false },\n { visible: true },\n { visible: true }, // show middle\n { visible: true },\n { visible: false },\n ];\n this.stave.getBottomLineY = function(): number {\n return this.getYForLine(2);\n };\n } else {\n (this.stave as any).setNumLines(lineNumber);\n this.stave.getBottomLineY = function(): number {\n return this.getYForLine(this.options.num_lines);\n };\n }\n }\n }\n\n /**\n * adds the given key to the begin of the measure.\n * This has to update/increase BeginInstructionsWidth.\n * @param currentKey the new valid key.\n * @param previousKey the old cancelled key. Needed to show which accidentals are not valid any more.\n * @param currentClef the valid clef. Needed to put the accidentals on the right y-positions.\n */\n public addKeyAtBegin(currentKey: KeyInstruction, previousKey: KeyInstruction, currentClef: ClefInstruction): void {\n this.stave.setKeySignature(\n VexFlowConverter.keySignature(currentKey),\n VexFlowConverter.keySignature(previousKey),\n undefined\n );\n this.updateInstructionWidth();\n }\n\n /**\n * adds the given rhythm to the begin of the measure.\n * This has to update/increase BeginInstructionsWidth.\n * @param rhythm\n */\n public addRhythmAtBegin(rhythm: RhythmInstruction): void {\n const timeSig: Vex.Flow.TimeSignature = VexFlowConverter.TimeSignature(rhythm);\n this.stave.addModifier(\n timeSig,\n Vex.Flow.StaveModifier.Position.BEGIN\n );\n this.updateInstructionWidth();\n }\n\n /**\n * adds the given clef to the end of the measure.\n * This has to update/increase EndInstructionsWidth.\n * @param clef\n */\n public addClefAtEnd(clef: ClefInstruction): void {\n const vfclef: { type: string, size: string, annotation: string } = VexFlowConverter.Clef(clef, \"small\");\n this.stave.setEndClef(vfclef.type, vfclef.size, vfclef.annotation);\n this.updateInstructionWidth();\n }\n\n public addMeasureLine(lineType: SystemLinesEnum, linePosition: SystemLinePosition): void {\n switch (linePosition) {\n case SystemLinePosition.MeasureBegin:\n switch (lineType) {\n case SystemLinesEnum.BoldThinDots:\n this.stave.setBegBarType(Vex.Flow.Barline.type.REPEAT_BEGIN);\n break;\n default:\n //this.stave.setBegBarType(Vex.Flow.Barline.type.NONE); // not necessary, it seems\n break;\n }\n break;\n case SystemLinePosition.MeasureEnd:\n switch (lineType) {\n case SystemLinesEnum.DotsBoldBoldDots:\n this.stave.setEndBarType(Vex.Flow.Barline.type.REPEAT_BOTH);\n break;\n case SystemLinesEnum.DotsThinBold:\n this.stave.setEndBarType(Vex.Flow.Barline.type.REPEAT_END);\n break;\n case SystemLinesEnum.DoubleThin:\n this.stave.setEndBarType(Vex.Flow.Barline.type.DOUBLE);\n break;\n case SystemLinesEnum.ThinBold:\n this.stave.setEndBarType(Vex.Flow.Barline.type.END);\n break;\n case SystemLinesEnum.None:\n this.stave.setEndBarType(Vex.Flow.Barline.type.NONE);\n break;\n // TODO: Add support for additional Barline types when VexFlow supports them\n default:\n break;\n }\n break;\n default:\n break;\n }\n }\n\n /**\n * Adds a measure number to the top left corner of the measure\n * This method is not used currently in favor of the calculateMeasureNumberPlacement\n * method in the MusicSheetCalculator.ts\n */\n public addMeasureNumber(): void {\n const text: string = this.MeasureNumber.toString();\n const position: number = StavePositionEnum.ABOVE; //Vex.Flow.StaveModifier.Position.ABOVE;\n const options: any = {\n justification: 1,\n shift_x: 0,\n shift_y: 0,\n };\n\n this.stave.setText(text, position, options);\n }\n\n public addWordRepetition(repetitionInstruction: RepetitionInstruction): void {\n let instruction: Vex.Flow.Repetition.type = undefined;\n let position: any = Vex.Flow.StaveModifier.Position.END;\n switch (repetitionInstruction.type) {\n case RepetitionInstructionEnum.Segno:\n // create Segno Symbol:\n instruction = Vex.Flow.Repetition.type.SEGNO_LEFT;\n position = Vex.Flow.StaveModifier.Position.BEGIN;\n break;\n case RepetitionInstructionEnum.Coda:\n // create Coda Symbol:\n instruction = Vex.Flow.Repetition.type.CODA_LEFT;\n position = Vex.Flow.StaveModifier.Position.BEGIN;\n break;\n case RepetitionInstructionEnum.DaCapo:\n instruction = Vex.Flow.Repetition.type.DC;\n break;\n case RepetitionInstructionEnum.DalSegno:\n instruction = Vex.Flow.Repetition.type.DS;\n break;\n case RepetitionInstructionEnum.Fine:\n instruction = Vex.Flow.Repetition.type.FINE;\n break;\n case RepetitionInstructionEnum.ToCoda:\n //instruction = \"To Coda\";\n break;\n case RepetitionInstructionEnum.DaCapoAlFine:\n instruction = Vex.Flow.Repetition.type.DC_AL_FINE;\n break;\n case RepetitionInstructionEnum.DaCapoAlCoda:\n instruction = Vex.Flow.Repetition.type.DC_AL_CODA;\n break;\n case RepetitionInstructionEnum.DalSegnoAlFine:\n instruction = Vex.Flow.Repetition.type.DS_AL_FINE;\n break;\n case RepetitionInstructionEnum.DalSegnoAlCoda:\n instruction = Vex.Flow.Repetition.type.DS_AL_CODA;\n break;\n default:\n break;\n }\n if (instruction) {\n this.stave.addModifier(new Vex.Flow.Repetition(instruction, 0, 0), position);\n return;\n }\n\n this.addVolta(repetitionInstruction);\n }\n\n private addVolta(repetitionInstruction: RepetitionInstruction): void {\n let voltaType: number = Vex.Flow.Volta.type.BEGIN;\n if (repetitionInstruction.type === RepetitionInstructionEnum.Ending) {\n switch (repetitionInstruction.alignment) {\n case AlignmentType.Begin:\n if (this.parentSourceMeasure.endsRepetitionEnding()) {\n voltaType = Vex.Flow.Volta.type.BEGIN_END;\n } else {\n voltaType = Vex.Flow.Volta.type.BEGIN;\n }\n break;\n case AlignmentType.End:\n if (this.parentSourceMeasure.beginsRepetitionEnding()) {\n //voltaType = Vex.Flow.Volta.type.BEGIN_END;\n // don't add BEGIN_END volta a second time:\n return;\n } else {\n voltaType = Vex.Flow.Volta.type.END;\n }\n break;\n default:\n break;\n }\n\n const skyBottomLineCalculator: SkyBottomLineCalculator = this.ParentStaffLine.SkyBottomLineCalculator;\n //Because of loss of accuracy when sampling (see SkyBottomLineCalculator.updateInRange), measures tend to overlap\n //This causes getSkyLineMinInRange to return an incorrect min value (one from the previous measure, which has been modified)\n //We need to offset the end of what we are measuring by a bit to prevent this, otherwise volta pairs step up\n const start: number = this.PositionAndShape.AbsolutePosition.x + this.PositionAndShape.BorderMarginLeft + 0.4;\n const end: number = this.PositionAndShape.AbsolutePosition.x + this.PositionAndShape.BorderMarginRight;\n //2 unit gap, since volta is positioned from y center it seems.\n //This prevents cases where the volta is rendered over another element\n const skylineMinForMeasure: number = skyBottomLineCalculator.getSkyLineMinInRange( start, end ) - 2;\n //-6 OSMD units is the 0 value that the volta is placed on. .1 extra so the skyline goes above the volta\n //instead of on the line itself\n let newSkylineValueForMeasure: number = -6.1 + this.rules.VoltaOffset;\n let vexFlowVoltaHeight: number = this.rules.VoltaOffset;\n //EngravingRules default offset is 2.5, can be user set.\n //2.5 gives us a good default value to work with.\n\n //if we calculate that the minimum skyline allowed by elements is above the default volta position, need to adjust volta up further\n if (skylineMinForMeasure < newSkylineValueForMeasure) {\n const skylineDifference: number = skylineMinForMeasure - newSkylineValueForMeasure;\n vexFlowVoltaHeight += skylineDifference;\n newSkylineValueForMeasure = skylineMinForMeasure;\n }\n\n /*\n Code here that is commented out is for finding the previous measure volta height\n and matching it or resetting it to ours.\n Still needs work. When we get to higher measure numbers, prev measures don't seem to be available?\n\n //if we already have a volta in the prev measure, should match it's height, or if we are higher, it should match ours\n //find previous sibling measure that may have volta\n let measureIndex = this.parentSourceMeasure.measureListIndex;\n //this.parentSourceMeasure.getPreviousMeasure();\n if(measureIndex > 0){\n let prevMeasureIndex = measureIndex-1;\n let prevMeasure : VexFlowMeasure = undefined;\n // find first visible StaffLine\n //Need to find the uppermost, where the volta would go\n const measures: VexFlowMeasure[] = this.ParentMusicSystem.GraphicalMeasures[prevMeasureIndex];\n if(measures !== undefined && measures.length > 0){\n for (let idx: number = 0, len: number = measures.length; idx < len; ++idx) {\n const graphicalMeasure: VexFlowMeasure = measures[idx];\n if (graphicalMeasure.ParentStaffLine && graphicalMeasure.ParentStaff.ParentInstrument.Visible) {\n prevMeasure = graphicalMeasure;\n break;\n }\n }\n }\n\n if(prevMeasure){\n let prevStaveModifiers = prevMeasure.stave.getModifiers();\n for(let i = 0; i < prevStaveModifiers.length; i++){\n let nextStaveModifier = prevStaveModifiers[i];\n if(nextStaveModifier.hasOwnProperty(\"volta\")){\n const prevskyBottomLineCalculator: SkyBottomLineCalculator = prevMeasure.ParentStaffLine.SkyBottomLineCalculator;\n const prevStart: number = prevMeasure.PositionAndShape.AbsolutePosition.x + prevMeasure.PositionAndShape.BorderMarginLeft + 0.4;\n const prevEnd: number = prevMeasure.PositionAndShape.AbsolutePosition.x + prevMeasure.PositionAndShape.BorderMarginRight;\n let prevMeasureSkyline: number = prevskyBottomLineCalculator.getSkyLineMinInRange(prevStart, prevEnd);\n //if prev skyline is higher, use it\n if(prevMeasureSkyline <= newSkylineValueForMeasure){\n let skylineDifference = prevMeasureSkyline - newSkylineValueForMeasure;\n vexFlowVoltaHeight += skylineDifference;\n newSkylineValueForMeasure = prevMeasureSkyline;\n } else { //otherwise, we are higher. Need to adjust prev\n (nextStaveModifier as any).y_shift = vexFlowVoltaHeight*10;\n prevMeasure.ParentStaffLine.SkyBottomLineCalculator.updateSkyLineInRange(prevStart, prevEnd, newSkylineValueForMeasure);\n }\n }\n }\n }\n }*/\n\n //convert to VF units (pixels)\n vexFlowVoltaHeight *= 10;\n this.stave.setVoltaType(voltaType, repetitionInstruction.endingIndices[0], vexFlowVoltaHeight);\n skyBottomLineCalculator.updateSkyLineInRange(start, end, newSkylineValueForMeasure);\n //this.ParentStaffLine.SkyBottomLineCalculator.calculateLines();\n }\n }\n\n /**\n * Sets the overall x-width of the measure.\n * @param width\n */\n public setWidth(width: number): void {\n super.setWidth(width);\n // Set the width of the Vex.Flow.Stave\n this.stave.setWidth(width * unitInPixels);\n // Force the width of the Begin Instructions\n //this.stave.setNoteStartX(this.beginInstructionsWidth * UnitInPixels);\n }\n\n /**\n * This method is called after the StaffEntriesScaleFactor has been set.\n * Here the final x-positions of the staff entries have to be set.\n * (multiply the minimal positions with the scaling factor, considering the BeginInstructionsWidth)\n */\n public layoutSymbols(): void {\n // vexflow does the x-layout\n }\n\n /**\n * Draw this measure on a VexFlow CanvasContext\n * @param ctx\n */\n public draw(ctx: Vex.IRenderContext): void {\n\n // Draw stave lines\n this.stave.setContext(ctx).draw();\n // Draw all voices\n for (const voiceID in this.vfVoices) {\n if (this.vfVoices.hasOwnProperty(voiceID)) {\n ctx.save();\n this.vfVoices[voiceID].draw(ctx, this.stave);\n ctx.restore();\n // this.vfVoices[voiceID].tickables.forEach(t => t.getBoundingBox().draw(ctx));\n // this.vfVoices[voiceID].tickables.forEach(t => t.getBoundingBox().draw(ctx));\n }\n }\n // Draw beams\n for (const voiceID in this.vfbeams) {\n if (this.vfbeams.hasOwnProperty(voiceID)) {\n for (const beam of this.vfbeams[voiceID]) {\n beam.setContext(ctx).draw();\n }\n }\n }\n // Draw auto-generated beams from Beam.generateBeams()\n if (this.autoVfBeams) {\n for (const beam of this.autoVfBeams) {\n beam.setContext(ctx).draw();\n }\n }\n if (this.autoTupletVfBeams) {\n for (const beam of this.autoTupletVfBeams) {\n beam.setContext(ctx).draw();\n }\n }\n\n // Draw tuplets\n for (const voiceID in this.vftuplets) {\n if (this.vftuplets.hasOwnProperty(voiceID)) {\n for (const tuplet of this.vftuplets[voiceID]) {\n tuplet.setContext(ctx).draw();\n }\n }\n }\n\n // Draw ties\n for (const tie of this.vfTies) {\n tie.setContext(ctx).draw();\n }\n\n // Draw vertical lines\n for (const connector of this.connectors) {\n connector.setContext(ctx).draw();\n }\n }\n\n // this currently formats multiple measures, see VexFlowMusicSheetCalculator.formatMeasures()\n public format(): void {\n // If this is the first stave in the vertical measure, call the format\n // method to set the width of all the voices\n if (this.formatVoices) {\n // set the width of the voices to the current measure width:\n // (The width of the voices does not include the instructions (StaveModifiers))\n this.formatVoices((this.PositionAndShape.Size.width - this.beginInstructionsWidth - this.endInstructionsWidth) * unitInPixels);\n }\n }\n\n /**\n * Returns all the voices that are present in this measure\n */\n public getVoicesWithinMeasure(): Voice[] {\n const voices: Voice[] = [];\n for (const gse of this.staffEntries) {\n for (const gve of gse.graphicalVoiceEntries) {\n if (voices.indexOf(gve.parentVoiceEntry.ParentVoice) === -1) {\n voices.push(gve.parentVoiceEntry.ParentVoice);\n }\n }\n }\n return voices;\n }\n\n /**\n * Returns all the graphicalVoiceEntries of a given Voice.\n * @param voice the voice for which the graphicalVoiceEntries shall be returned.\n */\n public getGraphicalVoiceEntriesPerVoice(voice: Voice): GraphicalVoiceEntry[] {\n const voiceEntries: GraphicalVoiceEntry[] = [];\n for (const gse of this.staffEntries) {\n for (const gve of gse.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry.ParentVoice === voice) {\n voiceEntries.push(gve);\n }\n }\n }\n return voiceEntries;\n }\n\n /**\n * Finds the gaps between the existing notes within a measure.\n * Problem here is, that the graphicalVoiceEntry does not exist yet and\n * that Tied notes are not present in the normal voiceEntries.\n * To handle this, calculation with absolute timestamps is needed.\n * And the graphical notes have to be analysed directly (and not the voiceEntries, as it actually should be -> needs refactoring)\n * @param voice the voice for which the ghost notes shall be searched.\n */\n protected getRestFilledVexFlowStaveNotesPerVoice(voice: Voice): GraphicalVoiceEntry[] {\n let latestVoiceTimestamp: Fraction = undefined;\n const gvEntries: GraphicalVoiceEntry[] = this.getGraphicalVoiceEntriesPerVoice(voice);\n for (let idx: number = 0, len: number = gvEntries.length; idx < len; ++idx) {\n const gve: GraphicalVoiceEntry = gvEntries[idx];\n const gNotesStartTimestamp: Fraction = gve.notes[0].sourceNote.getAbsoluteTimestamp();\n // find the voiceEntry end timestamp:\n let gNotesEndTimestamp: Fraction = new Fraction();\n for (const graphicalNote of gve.notes) {\n const noteEnd: Fraction = Fraction.plus(graphicalNote.sourceNote.getAbsoluteTimestamp(), graphicalNote.sourceNote.Length);\n if (gNotesEndTimestamp.lt(noteEnd)) {\n gNotesEndTimestamp = noteEnd;\n }\n }\n\n // check if this voice has just been found the first time:\n if (!latestVoiceTimestamp) {\n // if this voice is new, check for a gap from measure start to the start of the current voice entry:\n const gapFromMeasureStart: Fraction = Fraction.minus(gNotesStartTimestamp, this.parentSourceMeasure.AbsoluteTimestamp);\n if (gapFromMeasureStart.RealValue > 0) {\n log.trace(`Ghost Found at start (measure ${this.MeasureNumber})`); // happens too often for valid measures to be logged to debug\n const vfghost: Vex.Flow.GhostNote = VexFlowConverter.GhostNote(gapFromMeasureStart);\n const ghostGve: VexFlowVoiceEntry = new VexFlowVoiceEntry(undefined, undefined);\n ghostGve.vfStaveNote = vfghost;\n gvEntries.splice(0, 0, ghostGve);\n idx++;\n }\n } else {\n // get the length of the empty space between notes:\n const inBetweenLength: Fraction = Fraction.minus(gNotesStartTimestamp, latestVoiceTimestamp);\n\n if (inBetweenLength.RealValue > 0) {\n log.trace(`Ghost Found in between (measure ${this.MeasureNumber})`); // happens too often for valid measures to be logged to debug\n const vfghost: Vex.Flow.GhostNote = VexFlowConverter.GhostNote(inBetweenLength);\n const ghostGve: VexFlowVoiceEntry = new VexFlowVoiceEntry(undefined, undefined);\n ghostGve.vfStaveNote = vfghost;\n // add element before current element:\n gvEntries.splice(idx, 0, ghostGve);\n // and increase index, as we added an element:\n idx++;\n }\n }\n\n // finally set the latest timestamp of this voice to the end timestamp of the longest note in the current voiceEntry:\n latestVoiceTimestamp = gNotesEndTimestamp;\n }\n\n const measureEndTimestamp: Fraction = Fraction.plus(this.parentSourceMeasure.AbsoluteTimestamp, this.parentSourceMeasure.Duration);\n const restLength: Fraction = Fraction.minus(measureEndTimestamp, latestVoiceTimestamp);\n if (restLength.RealValue > 0) {\n // fill the gap with a rest ghost note\n // starting from lastFraction\n // with length restLength:\n log.trace(`Ghost Found at end (measure ${this.MeasureNumber})`); // happens too often for valid measures to be logged to debug\n const vfghost: Vex.Flow.GhostNote = VexFlowConverter.GhostNote(restLength);\n const ghostGve: VexFlowVoiceEntry = new VexFlowVoiceEntry(undefined, undefined);\n ghostGve.vfStaveNote = vfghost;\n gvEntries.push(ghostGve);\n }\n return gvEntries;\n }\n\n /**\n * Add a note to a beam\n * @param graphicalNote\n * @param beam\n */\n public handleBeam(graphicalNote: GraphicalNote, beam: Beam): void {\n const voiceID: number = graphicalNote.sourceNote.ParentVoiceEntry.ParentVoice.VoiceId;\n let beams: [Beam, VexFlowVoiceEntry[]][] = this.beams[voiceID];\n if (!beams) {\n beams = this.beams[voiceID] = [];\n }\n let data: [Beam, VexFlowVoiceEntry[]];\n for (const mybeam of beams) {\n if (mybeam[0] === beam) {\n data = mybeam;\n }\n }\n if (!data) {\n data = [beam, []];\n beams.push(data);\n }\n const parent: VexFlowVoiceEntry = graphicalNote.parentVoiceEntry as VexFlowVoiceEntry;\n if (data[1].indexOf(parent) < 0) {\n data[1].push(parent);\n }\n }\n\n public handleTuplet(graphicalNote: GraphicalNote, tuplet: Tuplet): void {\n const voiceID: number = graphicalNote.sourceNote.ParentVoiceEntry.ParentVoice.VoiceId;\n tuplet = graphicalNote.sourceNote.NoteTuplet;\n let tuplets: [Tuplet, VexFlowVoiceEntry[]][] = this.tuplets[voiceID];\n if (!tuplets) {\n tuplets = this.tuplets[voiceID] = [];\n }\n let currentTupletBuilder: [Tuplet, VexFlowVoiceEntry[]];\n for (const t of tuplets) {\n if (t[0] === tuplet) {\n currentTupletBuilder = t;\n }\n }\n if (!currentTupletBuilder) {\n currentTupletBuilder = [tuplet, []];\n tuplets.push(currentTupletBuilder);\n }\n const parent: VexFlowVoiceEntry = graphicalNote.parentVoiceEntry as VexFlowVoiceEntry;\n if (currentTupletBuilder[1].indexOf(parent) < 0) {\n currentTupletBuilder[1].push(parent);\n }\n }\n\n /**\n * Complete the creation of VexFlow Beams in this measure\n */\n public finalizeBeams(): void {\n // The following line resets the created Vex.Flow Beams and\n // created them brand new. Is this needed? And more importantly,\n // should the old beams be removed manually by the notes?\n this.vfbeams = {};\n const beamedNotes: StaveNote[] = []; // already beamed notes, will be ignored by this.autoBeamNotes()\n for (const voiceID in this.beams) {\n if (this.beams.hasOwnProperty(voiceID)) {\n let vfbeams: Vex.Flow.Beam[] = this.vfbeams[voiceID];\n if (!vfbeams) {\n vfbeams = this.vfbeams[voiceID] = [];\n }\n for (const beam of this.beams[voiceID]) {\n let beamHasQuarterNoteOrLonger: boolean = false;\n for (const note of beam[0].Notes) {\n if (note.Length.RealValue >= new Fraction(1, 4).RealValue\n // check whether the note has a TypeLength that's also not suitable for a beam (bigger than an eigth)\n && (!note.TypeLength || note.TypeLength.RealValue > 0.125)) {\n beamHasQuarterNoteOrLonger = true;\n break;\n }\n }\n if (beamHasQuarterNoteOrLonger) {\n log.debug(\"Beam between note >= quarter, likely tremolo, currently unsupported. continuing.\");\n continue;\n }\n\n const notes: Vex.Flow.StaveNote[] = [];\n const psBeam: Beam = beam[0];\n const voiceEntries: VexFlowVoiceEntry[] = beam[1];\n\n let autoStemBeam: boolean = true;\n for (const gve of voiceEntries) {\n if (gve.parentVoiceEntry.ParentVoice === psBeam.Notes[0].ParentVoiceEntry.ParentVoice) {\n autoStemBeam = gve.parentVoiceEntry.WantedStemDirection === StemDirectionType.Undefined;\n }\n }\n\n let isGraceBeam: boolean = false;\n let beamColor: string;\n const stemColors: string[] = [];\n for (const entry of voiceEntries) {\n const note: Vex.Flow.StaveNote = ((entry).vfStaveNote as StaveNote);\n if (note) {\n notes.push(note);\n beamedNotes.push(note);\n }\n if (entry.parentVoiceEntry.IsGrace) {\n isGraceBeam = true;\n }\n if (entry.parentVoiceEntry.StemColor && this.rules.ColoringEnabled) {\n stemColors.push(entry.parentVoiceEntry.StemColor);\n }\n }\n if (notes.length > 1) {\n const vfBeam: Vex.Flow.Beam = new Vex.Flow.Beam(notes, autoStemBeam);\n if (isGraceBeam) {\n // smaller beam, as in Vexflow.GraceNoteGroup.beamNotes()\n (vfBeam).render_options.beam_width = 3;\n (vfBeam).render_options.partial_beam_length = 4;\n }\n if (stemColors.length >= 2 && this.rules.ColorBeams) {\n beamColor = stemColors[0];\n for (const stemColor of stemColors) {\n if (stemColor !== beamColor) {\n beamColor = undefined;\n break;\n }\n }\n vfBeam.setStyle({ fillStyle: beamColor, strokeStyle: beamColor });\n }\n vfbeams.push(vfBeam);\n } else {\n log.debug(\"Warning! Beam with no notes!\");\n }\n }\n }\n }\n if (this.rules.AutoBeamNotes) {\n this.autoBeamNotes(beamedNotes); // try to autobeam notes except those that are already beamed (beamedNotes).\n }\n }\n\n /** Automatically creates beams for notes except beamedNotes, using Vexflow's Beam.generateBeams().\n * Takes options from this.rules.AutoBeamOptions.\n * @param beamedNotes notes that will not be autobeamed (usually because they are already beamed)\n */\n private autoBeamNotes(beamedNotes: StemmableNote[]): void {\n let notesToAutoBeam: StemmableNote[] = [];\n let consecutiveBeamableNotes: StemmableNote[] = [];\n let currentTuplet: Tuplet;\n let tupletNotesToAutoBeam: StaveNote[] = [];\n this.autoTupletVfBeams = [];\n const separateAutoBeams: StemmableNote[][] = []; // a set of separate beams, each having a set of notes (StemmableNote[]).\n this.autoVfBeams = []; // final Vex.Flow.Beams will be pushed/collected into this\n let timeSignature: Fraction = this.parentSourceMeasure.ActiveTimeSignature;\n if (!timeSignature) { // this doesn't happen in OSMD, but maybe in a SourceGenerator\n timeSignature = this.parentSourceMeasure.Duration; // suboptimal, can be 1/1 in a 4/4 time signature\n }\n /*if (this.parentSourceMeasure.FirstInstructionsStaffEntries[0]) {\n for (const instruction of this.parentSourceMeasure.FirstInstructionsStaffEntries[0].Instructions) {\n if (instruction instanceof RhythmInstruction) { // there is not always a RhythmInstruction, but this could be useful some time.\n timeSignature = (instruction as RhythmInstruction).Rhythm;\n }\n }\n }*/\n\n for (const staffEntry of this.staffEntries) {\n for (const gve of staffEntry.graphicalVoiceEntries) {\n const vfStaveNote: StaveNote = (gve as VexFlowVoiceEntry).vfStaveNote;\n const gNote: GraphicalNote = gve.notes[0]; // TODO check for all notes within the graphical voice entry\n const isOnBeat: boolean = staffEntry.relInMeasureTimestamp.isOnBeat(timeSignature);\n const haveTwoOrMoreNotesToBeamAlready: boolean = consecutiveBeamableNotes.length >= 2;\n //const noteIsQuarterOrLonger: boolean = gNote.sourceNote.Length.CompareTo(new Fraction(1, 4)) >= 0; // trusting Fraction class, no float check\n const noteIsQuarterOrLonger: boolean = gNote.sourceNote.Length.RealValue - new Fraction(1, 4).RealValue > (-Fraction.FloatInaccuracyTolerance);\n const unbeamableNote: boolean =\n gve.parentVoiceEntry.IsGrace || // don't beam grace notes\n noteIsQuarterOrLonger || // don't beam quarter or longer notes\n beamedNotes.contains(vfStaveNote);\n if (unbeamableNote || isOnBeat) { // end beam\n if (haveTwoOrMoreNotesToBeamAlready) {\n // if we already have at least 2 notes to beam, beam them. don't beam notes surrounded by quarter notes etc.\n for (const note of consecutiveBeamableNotes) {\n notesToAutoBeam.push(note); // \"flush\" already beamed notes\n }\n separateAutoBeams.push(notesToAutoBeam.slice()); // copy array, otherwise this beam gets the next notes of next beam later\n notesToAutoBeam = []; // reset notesToAutoBeam, otherwise the next beam includes the previous beam's notes too\n }\n consecutiveBeamableNotes = []; // reset notes to beam\n\n if (unbeamableNote) {\n continue;\n }\n // else, note will be pushed to consecutiveBeamableNotes after tuplet check, also for note on new beat\n }\n\n // create beams for tuplets separately\n const noteTuplet: Tuplet = gve.notes[0].sourceNote.NoteTuplet;\n if (noteTuplet) {\n // check if there are quarter notes or longer in the tuplet, then don't beam.\n // (TODO: check for consecutiveBeamableNotes inside tuplets like for non-tuplet notes above\n // e.g quarter eigth eighth -> beam the two eigth notes)\n let tupletContainsUnbeamableNote: boolean = false;\n for (const notes of noteTuplet.Notes) {\n for (const note of notes) {\n //const stavenote: StemmableNote = (gve as VexFlowVoiceEntry).vfStaveNote;\n //console.log(\"note \" + note.ToString() + \", stavenote type: \" + stavenote.getNoteType());\n if (note.NoteTypeXml >= NoteType.QUARTER || // quarter note or longer: don't beam\n // TODO: don't take Note (head) type from XML, but from current model,\n // so that rendering can react dynamically to changes compared to the XML.\n // however, taking the note length as fraction is tricky because of tuplets.\n // a quarter in a triplet has length < quarter, but quarter note head, which Vexflow can't beam.\n note.ParentVoiceEntry.IsGrace ||\n note.isRest() && !this.rules.AutoBeamOptions.beam_rests) {\n tupletContainsUnbeamableNote = true;\n break;\n }\n }\n if (tupletContainsUnbeamableNote) {\n break;\n }\n }\n\n if (!currentTuplet) {\n currentTuplet = noteTuplet;\n } else {\n if (currentTuplet !== noteTuplet) { // new tuplet, finish old one\n if (tupletNotesToAutoBeam.length > 1) {\n this.autoTupletVfBeams.push(new Vex.Flow.Beam(tupletNotesToAutoBeam, true));\n }\n tupletNotesToAutoBeam = [];\n currentTuplet = noteTuplet;\n }\n }\n if (!tupletContainsUnbeamableNote) {\n tupletNotesToAutoBeam.push(vfStaveNote);\n }\n continue;\n } else {\n currentTuplet = undefined;\n }\n\n consecutiveBeamableNotes.push(vfStaveNote); // also happens on new beat\n }\n }\n if (tupletNotesToAutoBeam.length >= 2) {\n this.autoTupletVfBeams.push(new Vex.Flow.Beam(tupletNotesToAutoBeam, true));\n }\n if (consecutiveBeamableNotes.length >= 2) {\n for (const note of consecutiveBeamableNotes) {\n notesToAutoBeam.push(note);\n }\n separateAutoBeams.push(notesToAutoBeam);\n }\n\n // create options for generateBeams\n const autoBeamOptions: AutoBeamOptions = this.rules.AutoBeamOptions;\n const generateBeamOptions: any = {\n beam_middle_only: autoBeamOptions.beam_middle_rests_only,\n beam_rests: autoBeamOptions.beam_rests,\n maintain_stem_directions: autoBeamOptions.maintain_stem_directions,\n };\n if (autoBeamOptions.groups && autoBeamOptions.groups.length) {\n const groups: Vex.Flow.Fraction[] = [];\n for (const fraction of autoBeamOptions.groups) {\n groups.push(new Vex.Flow.Fraction(fraction[0], fraction[1]));\n }\n generateBeamOptions.groups = groups;\n }\n\n for (const notesForSeparateAutoBeam of separateAutoBeams) {\n const newBeams: Vex.Flow.Beam[] = Vex.Flow.Beam.generateBeams(notesForSeparateAutoBeam, generateBeamOptions);\n for (const beam of newBeams) {\n this.autoVfBeams.push(beam);\n }\n }\n }\n\n /**\n * Complete the creation of VexFlow Tuplets in this measure\n */\n public finalizeTuplets(): void {\n // The following line resets the created Vex.Flow Tuplets and\n // created them brand new. Is this needed? And more importantly,\n // should the old tuplets be removed manually from the notes?\n this.vftuplets = {};\n for (const voiceID in this.tuplets) {\n if (this.tuplets.hasOwnProperty(voiceID)) {\n let vftuplets: Vex.Flow.Tuplet[] = this.vftuplets[voiceID];\n if (!vftuplets) {\n vftuplets = this.vftuplets[voiceID] = [];\n }\n for (const tupletBuilder of this.tuplets[voiceID]) {\n const tupletStaveNotes: Vex.Flow.StaveNote[] = [];\n const tupletVoiceEntries: VexFlowVoiceEntry[] = tupletBuilder[1];\n for (const tupletVoiceEntry of tupletVoiceEntries) {\n tupletStaveNotes.push(((tupletVoiceEntry).vfStaveNote as StaveNote));\n }\n if (tupletStaveNotes.length > 1) {\n const tuplet: Tuplet = tupletBuilder[0];\n const notesOccupied: number = tuplet.Notes[0][0].NormalNotes;\n const bracketed: boolean = tuplet.Bracket ||\n (tuplet.TupletLabelNumber === 3 && this.rules.TripletsBracketed) ||\n (tuplet.TupletLabelNumber !== 3 && this.rules.TupletsBracketed);\n vftuplets.push(new Vex.Flow.Tuplet( tupletStaveNotes,\n {\n bracketed: bracketed,\n notes_occupied: notesOccupied,\n num_notes: tuplet.TupletLabelNumber, //, location: -1, ratioed: true\n ratioed: this.rules.TupletsRatioed,\n }));\n } else {\n log.debug(\"Warning! Tuplet with no notes! Trying to ignore, but this is a serious problem.\");\n }\n }\n }\n }\n }\n\n public layoutStaffEntry(graphicalStaffEntry: GraphicalStaffEntry): void {\n return;\n }\n\n public graphicalMeasureCreatedCalculations(): void {\n let graceSlur: boolean;\n let graceGVoiceEntriesBefore: GraphicalVoiceEntry[] = [];\n for (const graphicalStaffEntry of this.staffEntries as VexFlowStaffEntry[]) {\n graceSlur = false;\n graceGVoiceEntriesBefore = [];\n // create vex flow Stave Notes:\n for (const gve of graphicalStaffEntry.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry.IsGrace) {\n // save grace notes for the next non-grace note\n graceGVoiceEntriesBefore.push(gve);\n if (!graceSlur) {\n graceSlur = gve.parentVoiceEntry.GraceSlur;\n }\n continue;\n }\n if (gve.notes[0].sourceNote.PrintObject) {\n (gve as VexFlowVoiceEntry).vfStaveNote = VexFlowConverter.StaveNote(gve);\n } else {\n // note can now also be added as StaveNote instead of GhostNote, because we set it to transparent\n (gve as VexFlowVoiceEntry).vfStaveNote = VexFlowConverter.StaveNote(gve);\n\n // previous method: add as GhostNote instead of StaveNote. Can cause formatting issues if critical notes are missing in the measure\n // don't render note. add ghost note, otherwise Vexflow can have issues with layouting when voices not complete.\n //(gve as VexFlowVoiceEntry).vfStaveNote = VexFlowConverter.GhostNote(gve.notes[0].sourceNote.Length);\n //graceGVoiceEntriesBefore = []; // if note is not rendered, its grace notes shouldn't be rendered, might need to be removed\n //continue;\n }\n if (graceGVoiceEntriesBefore.length > 0) {\n // add grace notes that came before this main note to a GraceNoteGroup in Vexflow, attached to the main note\n const graceNotes: Vex.Flow.GraceNote[] = [];\n for (let i: number = 0; i < graceGVoiceEntriesBefore.length; i++) {\n const gveGrace: VexFlowVoiceEntry = graceGVoiceEntriesBefore[i];\n //if (gveGrace.notes[0].sourceNote.PrintObject) {\n // grace notes should generally be rendered independently of main note instead of skipped if main note is invisible\n // could be an option to make grace notes transparent if main note is transparent. set grace notes' PrintObject to false then.\n const vfStaveNote: StaveNote = VexFlowConverter.StaveNote(gveGrace);\n gveGrace.vfStaveNote = vfStaveNote;\n graceNotes.push(vfStaveNote);\n }\n const graceNoteGroup: Vex.Flow.GraceNoteGroup = new Vex.Flow.GraceNoteGroup(graceNotes, graceSlur);\n ((gve as VexFlowVoiceEntry).vfStaveNote as StaveNote).addModifier(0, graceNoteGroup);\n graceGVoiceEntriesBefore = [];\n }\n }\n }\n // remaining grace notes at end of measure, turned into stand-alone grace notes:\n if (graceGVoiceEntriesBefore.length > 0) {\n for (const graceGve of graceGVoiceEntriesBefore) {\n (graceGve as VexFlowVoiceEntry).vfStaveNote = VexFlowConverter.StaveNote(graceGve);\n graceGve.parentVoiceEntry.GraceAfterMainNote = true;\n }\n }\n\n // const t0: number = performance.now();\n this.finalizeBeams();\n // const t1: number = performance.now();\n // console.log(\"Call to finalizeBeams in VexFlowMeasure took \" + (t1 - t0) + \" milliseconds.\");\n\n this.finalizeTuplets();\n\n const voices: Voice[] = this.getVoicesWithinMeasure();\n\n for (const voice of voices) {\n if (!voice) {\n continue;\n }\n const isMainVoice: boolean = !(voice instanceof LinkedVoice);\n\n // add a vexFlow voice for this voice:\n this.vfVoices[voice.VoiceId] = new Vex.Flow.Voice({\n beat_value: this.parentSourceMeasure.Duration.Denominator,\n num_beats: this.parentSourceMeasure.Duration.Numerator,\n resolution: Vex.Flow.RESOLUTION,\n }).setMode(Vex.Flow.Voice.Mode.SOFT);\n\n const restFilledEntries: GraphicalVoiceEntry[] = this.getRestFilledVexFlowStaveNotesPerVoice(voice);\n // create vex flow voices and add tickables to it:\n for (const voiceEntry of restFilledEntries) {\n if (voiceEntry.parentVoiceEntry) {\n if (voiceEntry.parentVoiceEntry.IsGrace && !voiceEntry.parentVoiceEntry.GraceAfterMainNote) {\n continue;\n }\n }\n\n const vexFlowVoiceEntry: VexFlowVoiceEntry = voiceEntry as VexFlowVoiceEntry;\n if (voiceEntry.notes.length === 0 || !voiceEntry.notes[0] || !voiceEntry.notes[0].sourceNote.PrintObject) {\n // GhostNote, don't add modifiers like in-measure clefs\n this.vfVoices[voice.VoiceId].addTickable(vexFlowVoiceEntry.vfStaveNote);\n continue;\n }\n\n // check for in-measure clefs:\n // only add clefs in main voice (to not add them twice)\n if (isMainVoice) {\n const vfse: VexFlowStaffEntry = vexFlowVoiceEntry.parentStaffEntry as VexFlowStaffEntry;\n if (vfse && vfse.vfClefBefore) {\n // add clef as NoteSubGroup so that we get modifier layouting\n const clefModifier: NoteSubGroup = new NoteSubGroup( [vfse.vfClefBefore] );\n // The cast is necesary because...vexflow -> see types\n if (vexFlowVoiceEntry.vfStaveNote.getCategory && vexFlowVoiceEntry.vfStaveNote.getCategory() === \"stavenotes\") {\n // GhostNotes and other StemmableNotes don't have this function\n (vexFlowVoiceEntry.vfStaveNote as Vex.Flow.StaveNote).addModifier(0, clefModifier);\n }\n }\n }\n\n // add fingering\n if (voiceEntry.parentVoiceEntry && this.rules.RenderFingerings) {\n this.createFingerings(voiceEntry);\n }\n\n // add Arpeggio\n if (voiceEntry.parentVoiceEntry && voiceEntry.parentVoiceEntry.Arpeggio) {\n const arpeggio: Arpeggio = voiceEntry.parentVoiceEntry.Arpeggio;\n // TODO right now our arpeggio object has all arpeggio notes from arpeggios across all voices.\n // see VoiceGenerator. Doesn't matter for Vexflow for now though\n if (voiceEntry.notes && voiceEntry.notes.length > 1) {\n const type: Vex.Flow.Stroke.Type = VexFlowConverter.StrokeTypeFromArpeggioType(arpeggio.type);\n const stroke: Vex.Flow.Stroke = new Vex.Flow.Stroke(type, {\n all_voices: this.rules.ArpeggiosGoAcrossVoices\n // default: false. This causes arpeggios to always go across all voices, which is often unwanted.\n // also, this can cause infinite height of stroke, see #546\n });\n //if (arpeggio.notes.length === vexFlowVoiceEntry.notes.length) { // different workaround for endless y bug\n if (this.rules.RenderArpeggios) {\n vexFlowVoiceEntry.vfStaveNote.addStroke(0, stroke);\n }\n } else {\n log.debug(`[OSMD] arpeggio in measure ${this.MeasureNumber} could not be drawn.\n voice entry had less than two notes, arpeggio is likely between voice entries, not currently supported in Vexflow.`);\n // TODO: create new arpeggio with all the arpeggio's notes (arpeggio.notes), perhaps with GhostNotes in a new vfStaveNote. not easy.\n }\n }\n\n this.vfVoices[voice.VoiceId].addTickable(vexFlowVoiceEntry.vfStaveNote);\n }\n }\n this.createArticulations();\n this.createOrnaments();\n this.setStemDirectionFromVexFlow();\n }\n\n /**\n * Copy the stem directions chosen by VexFlow to the StemDirection variable of the graphical notes\n */\n private setStemDirectionFromVexFlow(): void {\n //if StemDirection was not set then read out what VexFlow has chosen\n for ( const vfStaffEntry of this.staffEntries ) {\n for ( const gVoiceEntry of vfStaffEntry.graphicalVoiceEntries) {\n for ( const gnote of gVoiceEntry.notes) {\n const vfnote: [StaveNote, number] = (gnote as VexFlowGraphicalNote).vfnote;\n if (!vfnote || !vfnote[0]) {\n continue;\n }\n\n const vfStemDir: number = vfnote[0].getStemDirection();\n switch (vfStemDir) {\n case (Vex.Flow.Stem.UP):\n gVoiceEntry.parentVoiceEntry.StemDirection = StemDirectionType.Up;\n break;\n case (Vex.Flow.Stem.DOWN):\n gVoiceEntry.parentVoiceEntry.StemDirection = StemDirectionType.Down;\n break;\n default:\n }\n }\n }\n }\n }\n\n /**\n * Create the articulations for all notes of the current staff entry\n */\n protected createArticulations(): void {\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: VexFlowStaffEntry = (this.staffEntries[idx] as VexFlowStaffEntry);\n\n // create vex flow articulation:\n const graphicalVoiceEntries: GraphicalVoiceEntry[] = graphicalStaffEntry.graphicalVoiceEntries;\n for (const gve of graphicalVoiceEntries) {\n const vfStaveNote: StemmableNote = (gve as VexFlowVoiceEntry).vfStaveNote;\n VexFlowConverter.generateArticulations(vfStaveNote, gve.notes[0].sourceNote.ParentVoiceEntry.Articulations);\n }\n }\n }\n\n /**\n * Create the ornaments for all notes of the current staff entry\n */\n protected createOrnaments(): void {\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: VexFlowStaffEntry = (this.staffEntries[idx] as VexFlowStaffEntry);\n const gvoices: { [voiceID: number]: GraphicalVoiceEntry; } = graphicalStaffEntry.graphicalVoiceEntries;\n\n for (const voiceID in gvoices) {\n if (gvoices.hasOwnProperty(voiceID)) {\n const vfStaveNote: StemmableNote = (gvoices[voiceID] as VexFlowVoiceEntry).vfStaveNote;\n const ornamentContainer: OrnamentContainer = gvoices[voiceID].notes[0].sourceNote.ParentVoiceEntry.OrnamentContainer;\n if (ornamentContainer) {\n VexFlowConverter.generateOrnaments(vfStaveNote, ornamentContainer);\n }\n }\n }\n }\n }\n\n protected createFingerings(voiceEntry: GraphicalVoiceEntry): void {\n const vexFlowVoiceEntry: VexFlowVoiceEntry = voiceEntry as VexFlowVoiceEntry;\n const technicalInstructions: TechnicalInstruction[] = voiceEntry.parentVoiceEntry.TechnicalInstructions;\n let fingeringsCount: number = 0;\n for (const instruction of technicalInstructions) {\n if (instruction.type === TechnicalInstructionType.Fingering) {\n fingeringsCount++;\n }\n }\n let fingeringIndex: number = -1;\n for (const fingeringInstruction of technicalInstructions) {\n if (fingeringInstruction.type !== TechnicalInstructionType.Fingering) {\n continue;\n }\n fingeringIndex++; // 0 for first fingering\n let fingeringPosition: PlacementEnum = this.rules.FingeringPosition;\n if (fingeringInstruction.placement !== PlacementEnum.NotYetDefined) {\n fingeringPosition = fingeringInstruction.placement;\n }\n let modifierPosition: any; // Vex.Flow.Stavemodifier.Position\n switch (fingeringPosition) {\n default:\n case PlacementEnum.Left:\n modifierPosition = Vex.Flow.StaveModifier.Position.LEFT;\n break;\n case PlacementEnum.Right:\n modifierPosition = Vex.Flow.StaveModifier.Position.RIGHT;\n break;\n case PlacementEnum.Above:\n modifierPosition = Vex.Flow.StaveModifier.Position.ABOVE;\n break;\n case PlacementEnum.Below:\n modifierPosition = Vex.Flow.StaveModifier.Position.BELOW;\n break;\n case PlacementEnum.NotYetDefined: // automatic fingering placement, could be more complex/customizable\n const sourceStaff: Staff = voiceEntry.parentStaffEntry.sourceStaffEntry.ParentStaff;\n if (voiceEntry.notes.length > 1 || voiceEntry.parentStaffEntry.graphicalVoiceEntries.length > 1) {\n modifierPosition = Vex.Flow.StaveModifier.Position.LEFT;\n } else if (sourceStaff.idInMusicSheet === 0) {\n modifierPosition = Vex.Flow.StaveModifier.Position.ABOVE;\n fingeringPosition = PlacementEnum.Above;\n } else {\n modifierPosition = Vex.Flow.StaveModifier.Position.BELOW;\n fingeringPosition = PlacementEnum.Below;\n }\n }\n\n const fretFinger: Vex.Flow.FretHandFinger = new Vex.Flow.FretHandFinger(fingeringInstruction.value);\n fretFinger.setPosition(modifierPosition);\n fretFinger.setOffsetX(this.rules.FingeringOffsetX);\n if (fingeringPosition === PlacementEnum.Above || fingeringPosition === PlacementEnum.Below) {\n const offsetYSign: number = fingeringPosition === PlacementEnum.Above ? -1 : 1; // minus y is up\n const ordering: number = fingeringPosition === PlacementEnum.Above ? fingeringIndex :\n fingeringsCount - 1 - fingeringIndex; // reverse order for fingerings below staff\n if (this.rules.FingeringInsideStafflines && fingeringsCount > 1) { // y-shift for single fingering is ok\n // experimental, bounding boxes wrong for fretFinger above/below, better would be creating Labels\n // set y-shift. vexflow fretfinger simply places directly above/below note\n const perFingeringShift: number = fretFinger.getWidth() / 2;\n const shiftCount: number = fingeringsCount * 2.5;\n fretFinger.setOffsetY(offsetYSign * (ordering + shiftCount) * perFingeringShift);\n } else if (!this.rules.FingeringInsideStafflines) { // use StringNumber for placement above/below stafflines\n const stringNumber: Vex.Flow.StringNumber = new Vex.Flow.StringNumber(fingeringInstruction.value);\n (stringNumber).radius = 0; // hack to remove the circle around the number\n stringNumber.setPosition(modifierPosition);\n stringNumber.setOffsetY(offsetYSign * ordering * stringNumber.getWidth() * 2 / 3);\n // Vexflow made a mess with the addModifier signature that changes through each class so we just cast to any :(\n vexFlowVoiceEntry.vfStaveNote.addModifier((fingeringIndex as any), (stringNumber as any));\n continue;\n }\n }\n if (vexFlowVoiceEntry.vfStaveNote.getCategory() === \"tabnotes\") {\n // TODO this doesn't work yet. don't add fingering for tabs for now.\n // vexFlowVoiceEntry.vfStaveNote.addModifier(fretFinger, fingeringIndex);\n } else {\n // Vexflow made a mess with the addModifier signature that changes through each class so we just cast to any :(\n vexFlowVoiceEntry.vfStaveNote.addModifier((fingeringIndex as any), (fretFinger as any));\n }\n }\n }\n\n /**\n * Creates a line from 'top' to this measure, of type 'lineType'\n * @param top\n * @param lineType\n */\n public lineTo(top: VexFlowMeasure, lineType: any): void {\n const connector: StaveConnector = new Vex.Flow.StaveConnector(top.getVFStave(), this.stave);\n connector.setType(lineType);\n this.connectors.push(connector);\n }\n\n /**\n * Return the VexFlow Stave corresponding to this graphicalMeasure\n * @returns {Vex.Flow.Stave}\n */\n public getVFStave(): Vex.Flow.Stave {\n return this.stave;\n }\n\n /**\n * After re-running the formatting on the VexFlow Stave, update the\n * space needed by Instructions (in VexFlow: StaveModifiers)\n */\n protected updateInstructionWidth(): void {\n let vfBeginInstructionsWidth: number = 0;\n let vfEndInstructionsWidth: number = 0;\n const modifiers: Vex.Flow.StaveModifier[] = this.stave.getModifiers();\n for (const mod of modifiers) {\n if (mod.getPosition() === StavePositionEnum.BEGIN) { //Vex.Flow.StaveModifier.Position.BEGIN) {\n vfBeginInstructionsWidth += mod.getWidth() + mod.getPadding(undefined);\n } else if (mod.getPosition() === StavePositionEnum.END) { //Vex.Flow.StaveModifier.Position.END) {\n vfEndInstructionsWidth += mod.getWidth() + mod.getPadding(undefined);\n }\n }\n\n this.beginInstructionsWidth = vfBeginInstructionsWidth / unitInPixels;\n this.endInstructionsWidth = vfEndInstructionsWidth / unitInPixels;\n }\n}\n\n// Gives the position of the Stave - replaces the function get Position() in the description of class StaveModifier in vexflow.d.ts\n// The latter gave an error because function cannot be defined in the class descriptions in vexflow.d.ts\nexport enum StavePositionEnum {\n LEFT = 1,\n RIGHT = 2,\n ABOVE = 3,\n BELOW = 4,\n BEGIN = 5,\n END = 6\n}\n","import Vex from \"vexflow\";\nimport { VoiceEntry } from \"../../VoiceData/VoiceEntry\";\nimport { GraphicalVoiceEntry } from \"../GraphicalVoiceEntry\";\nimport { GraphicalStaffEntry } from \"../GraphicalStaffEntry\";\nimport { unitInPixels } from \"./VexFlowMusicSheetDrawer\";\nimport { GraphicalNote } from \"..\";\nimport { NoteEnum } from \"../../../Common/DataObjects/Pitch\";\nimport { Note } from \"../../VoiceData/Note\";\nimport { ColoringModes } from \"./../DrawingParameters\";\n\nexport class VexFlowVoiceEntry extends GraphicalVoiceEntry {\n private mVexFlowStaveNote: Vex.Flow.StemmableNote;\n\n constructor(parentVoiceEntry: VoiceEntry, parentStaffEntry: GraphicalStaffEntry) {\n super(parentVoiceEntry, parentStaffEntry);\n }\n\n public applyBordersFromVexflow(): void {\n const staveNote: any = (this.vfStaveNote as any);\n if (!staveNote.getNoteHeadBeginX) {\n return;\n }\n const boundingBox: any = staveNote.getBoundingBox();\n const modifierWidth: number = staveNote.getNoteHeadBeginX() - boundingBox.x;\n\n this.PositionAndShape.RelativePosition.y = boundingBox.y / unitInPixels;\n this.PositionAndShape.BorderTop = 0;\n this.PositionAndShape.BorderBottom = boundingBox.h / unitInPixels;\n this.PositionAndShape.BorderLeft = -(modifierWidth + staveNote.width / 2) / unitInPixels; // Left of our X origin is the modifier\n this.PositionAndShape.BorderRight = (boundingBox.w - modifierWidth) / unitInPixels; // Right of x origin is the note\n }\n\n public set vfStaveNote(value: Vex.Flow.StemmableNote) {\n this.mVexFlowStaveNote = value;\n }\n\n public get vfStaveNote(): Vex.Flow.StemmableNote {\n return this.mVexFlowStaveNote;\n }\n\n /** (Re-)color notes and stems by setting their Vexflow styles.\n * Could be made redundant by a Vexflow PR, but Vexflow needs more solid and permanent color methods/variables for that\n * See VexFlowConverter.StaveNote()\n */\n public color(): void {\n const defaultColorNotehead: string = this.rules.DefaultColorNotehead;\n const defaultColorRest: string = this.rules.DefaultColorRest;\n const defaultColorStem: string = this.rules.DefaultColorStem;\n const transparentColor: string = \"#00000000\"; // transparent color in vexflow\n let noteheadColor: string; // if null: no noteheadcolor to set (stays black)\n let sourceNoteNoteheadColor: string;\n\n const vfStaveNote: any = ((this as any)).vfStaveNote;\n for (let i: number = 0; i < this.notes.length; i++) {\n const note: GraphicalNote = this.notes[i];\n\n sourceNoteNoteheadColor = note.sourceNote.NoteheadColor;\n noteheadColor = sourceNoteNoteheadColor;\n // Switch between XML colors and automatic coloring\n if (this.rules.ColoringMode === ColoringModes.AutoColoring ||\n this.rules.ColoringMode === ColoringModes.CustomColorSet) {\n if (note.sourceNote.isRest()) {\n noteheadColor = this.rules.ColoringSetCurrent.getValue(-1);\n } else {\n const fundamentalNote: NoteEnum = note.sourceNote.Pitch.FundamentalNote;\n noteheadColor = this.rules.ColoringSetCurrent.getValue(fundamentalNote);\n }\n }\n if (!note.sourceNote.PrintObject) {\n noteheadColor = transparentColor; // transparent\n } else if (!noteheadColor // revert transparency after PrintObject was set to false, then true again\n || noteheadColor === \"#000000\" // questionable, because you might want to set specific notes to black,\n // but unfortunately some programs export everything explicitly as black\n ) {\n noteheadColor = this.rules.DefaultColorNotehead;\n }\n\n // DEBUG runtime coloring test\n /*const testColor: string = \"#FF0000\";\n if (i === 2 && Math.random() < 0.1 && note.sourceNote.NoteheadColor !== testColor) {\n const measureNumber: number = note.parentVoiceEntry.parentStaffEntry.parentMeasure.MeasureNumber;\n noteheadColor = testColor;\n console.log(\"color changed to \" + noteheadColor + \" of this note:\\n\" + note.sourceNote.Pitch.ToString() +\n \", in measure #\" + measureNumber);\n }*/\n\n if (!sourceNoteNoteheadColor && this.rules.ColoringMode === ColoringModes.XML && note.sourceNote.PrintObject) {\n if (!note.sourceNote.isRest() && defaultColorNotehead) {\n noteheadColor = defaultColorNotehead;\n } else if (note.sourceNote.isRest() && defaultColorRest) {\n noteheadColor = defaultColorRest;\n }\n }\n if (noteheadColor && note.sourceNote.PrintObject) {\n note.sourceNote.NoteheadColorCurrentlyRendered = noteheadColor;\n } else if (!noteheadColor) {\n continue;\n }\n\n // color notebeam if all noteheads have same color and stem coloring enabled\n if (this.rules.ColoringEnabled && note.sourceNote.NoteBeam && this.rules.ColorBeams) {\n const beamNotes: Note[] = note.sourceNote.NoteBeam.Notes;\n let colorBeam: boolean = true;\n for (let j: number = 0; j < beamNotes.length; j++) {\n if (beamNotes[j].NoteheadColorCurrentlyRendered !== noteheadColor) {\n colorBeam = false;\n }\n }\n if (colorBeam) {\n if (vfStaveNote.beam !== null && vfStaveNote.beam.setStyle) {\n vfStaveNote.beam.setStyle({ fillStyle: noteheadColor, strokeStyle: noteheadColor});\n }\n }\n }\n\n if (vfStaveNote) {\n if (vfStaveNote.note_heads) { // see VexFlowConverter, needs Vexflow PR\n const notehead: any = vfStaveNote.note_heads[i];\n if (notehead) {\n notehead.setStyle({ fillStyle: noteheadColor, strokeStyle: noteheadColor });\n }\n }\n }\n }\n\n // color stems\n let stemColor: string = defaultColorStem; // reset to black/default when coloring was disabled. maybe needed elsewhere too\n if (this.rules.ColoringEnabled) {\n stemColor = this.parentVoiceEntry.StemColor; // TODO: once coloringSetCustom gets stem color, respect it\n if (!stemColor\n || stemColor === \"#000000\") { // see above, noteheadColor === \"#000000\"\n stemColor = defaultColorStem;\n }\n if (this.rules.ColorStemsLikeNoteheads && noteheadColor) {\n // condition could be even more fine-grained by only recoloring if there was no custom StemColor set. will be more complex though\n stemColor = noteheadColor;\n }\n }\n let stemTransparent: boolean = true;\n for (const note of this.parentVoiceEntry.Notes) {\n if (note.PrintObject) {\n stemTransparent = false;\n break;\n }\n }\n if (stemTransparent) {\n stemColor = transparentColor;\n }\n const stemStyle: Object = { fillStyle: stemColor, strokeStyle: stemColor };\n\n if (vfStaveNote && vfStaveNote.setStemStyle) {\n if (!stemTransparent) {\n this.parentVoiceEntry.StemColor = stemColor;\n }\n vfStaveNote.setStemStyle(stemStyle);\n if (vfStaveNote.flag && vfStaveNote.setFlagStyle && this.rules.ColorFlags) {\n vfStaveNote.setFlagStyle(stemStyle);\n }\n }\n }\n}\n","import { PlacementEnum } from \"../Expressions/AbstractExpression\";\n\nexport enum TechnicalInstructionType {\n Fingering\n}\nexport class TechnicalInstruction {\n public type: TechnicalInstructionType;\n public value: string;\n public placement: PlacementEnum;\n}\n","import {Note} from \"./Note\";\nimport { Fraction } from \"../../Common/DataObjects/Fraction\";\nimport { Pitch } from \"../../Common/DataObjects/Pitch\";\n\n/**\n * A [[Tie]] connects two notes of the same pitch and name, indicating that they have to be played as a single note.\n */\nexport class Tie {\n\n constructor(note: Note) {\n this.AddNote(note);\n }\n\n private notes: Note[] = [];\n\n public get Notes(): Note[] {\n return this.notes;\n }\n\n public get StartNote(): Note {\n return this.notes[0];\n }\n\n public get Duration(): Fraction {\n const duration: Fraction = new Fraction();\n for (const note of this.notes) {\n duration.Add(note.Length);\n }\n return duration;\n }\n\n public get Pitch(): Pitch {\n return this.StartNote.Pitch;\n }\n\n public AddNote(note: Note): void {\n this.notes.push(note);\n note.NoteTie = this;\n }\n}\n","import {MusicSheet} from \"../MusicSheet\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\n\nexport abstract class PartListEntry {\n constructor(musicSheet: MusicSheet) {\n this.musicSheet = musicSheet;\n }\n\n public absoluteTimestamp: Fraction;\n public startIndex: number;\n public endIndex: number;\n\n protected enrolledTimestamps: Fraction[] = [];\n protected visible: boolean = true;\n protected musicSheet: MusicSheet;\n\n public get Visible(): boolean {\n return this.visible;\n }\n public set Visible(value: boolean) {\n this.visible = value;\n }\n public getFirstSourceMeasure(): SourceMeasure {\n return this.musicSheet.SourceMeasures[this.startIndex];\n }\n public getLastSourceMeasure(): SourceMeasure {\n return this.musicSheet.SourceMeasures[this.endIndex];\n }\n}\n","export * from \"./OpenSheetMusicDisplay\";\nexport * from \"./MusicalScore\";\nexport * from \"./Util\";\nexport * from \"./Common\";\n","/**\n * Class with helper methods to handle asynchronous JavaScript requests\n */\nexport class AJAX {\n /**\n * Retrieve the content of the file at url\n * @param url\n * @returns {any}\n */\n public static ajax(url: string): Promise {\n let xhttp: XMLHttpRequest;\n const mimeType: string = url.indexOf(\".mxl\") > -1 ? \"text/plain; charset=x-user-defined\" : \"application/xml\";\n if (XMLHttpRequest) {\n xhttp = new XMLHttpRequest();\n } else if (ActiveXObject) {\n // for IE<7\n xhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n } else {\n return Promise.reject(new Error(\"XMLHttp not supported.\"));\n }\n return new Promise((resolve: (value: string) => void, reject: (error: any) => void) => {\n xhttp.onreadystatechange = () => {\n if (xhttp.readyState === XMLHttpRequest.DONE) {\n if (xhttp.status === 200) {\n resolve(xhttp.responseText);\n } else if (xhttp.status === 0 && xhttp.responseText) {\n resolve(xhttp.responseText);\n } else {\n //reject(new Error(\"AJAX error: '\" + xhttp.statusText + \"'\"));\n reject(new Error(\"Could not retrieve requested URL \" + xhttp.status));\n }\n }\n };\n xhttp.ontimeout = (e) => {\n // For IE and node\n reject(new Error(\"Server request Timeout\"));\n };\n xhttp.overrideMimeType(mimeType);\n xhttp.open(\"GET\", url, true);\n xhttp.send();\n });\n }\n}\n","import {MusicPartManagerIterator} from \"../MusicalScore/MusicParts/MusicPartManagerIterator\";\nimport {MusicPartManager} from \"../MusicalScore/MusicParts/MusicPartManager\";\nimport {VoiceEntry} from \"../MusicalScore/VoiceData/VoiceEntry\";\nimport {VexFlowStaffEntry} from \"../MusicalScore/Graphical/VexFlow/VexFlowStaffEntry\";\nimport {MusicSystem} from \"../MusicalScore/Graphical/MusicSystem\";\nimport {OpenSheetMusicDisplay} from \"./OpenSheetMusicDisplay\";\nimport {GraphicalMusicSheet} from \"../MusicalScore/Graphical/GraphicalMusicSheet\";\nimport {Instrument} from \"../MusicalScore/Instrument\";\nimport {Note} from \"../MusicalScore/VoiceData/Note\";\nimport {EngravingRules, Fraction} from \"..\";\nimport {SourceMeasure, StaffLine} from \"../MusicalScore\";\n\n/**\n * A cursor which can iterate through the music sheet.\n */\nexport class Cursor {\n constructor(container: HTMLElement, openSheetMusicDisplay: OpenSheetMusicDisplay) {\n this.container = container;\n this.openSheetMusicDisplay = openSheetMusicDisplay;\n this.rules = this.openSheetMusicDisplay.EngravingRules;\n\n // set cursor id\n // TODO add this for the OSMD object as well and refactor this into a util method?\n let id: number = 0;\n this.cursorElementId = \"cursorImg-0\";\n // find unique cursor id in document\n while (document.getElementById(this.cursorElementId)) {\n id++;\n this.cursorElementId = `cursorImg-${id}`;\n }\n\n const curs: HTMLElement = document.createElement(\"img\");\n curs.id = this.cursorElementId;\n curs.style.position = \"absolute\";\n curs.style.zIndex = \"-1\";\n this.cursorElement = curs;\n this.container.appendChild(curs);\n }\n\n private container: HTMLElement;\n public cursorElement: HTMLImageElement;\n /** a unique id of the cursor's HTMLElement in the document.\n * Should be constant between re-renders and backend changes,\n * but different between different OSMD objects on the same page.\n */\n public cursorElementId: string;\n private openSheetMusicDisplay: OpenSheetMusicDisplay;\n private rules: EngravingRules;\n private manager: MusicPartManager;\n public iterator: MusicPartManagerIterator;\n private graphic: GraphicalMusicSheet;\n public hidden: boolean = true;\n\n /** Initialize the cursor. Necessary before using functions like show() and next(). */\n public init(manager: MusicPartManager, graphic: GraphicalMusicSheet): void {\n this.manager = manager;\n this.graphic = graphic;\n this.reset();\n this.hidden = true;\n this.hide();\n }\n\n /**\n * Make the cursor visible\n */\n public show(): void {\n this.hidden = false;\n this.resetIterator(); // TODO maybe not here? though setting measure range to draw, rerendering, then handling cursor show is difficult\n this.update();\n }\n\n public resetIterator(): void {\n if (!this.openSheetMusicDisplay.Sheet || !this.openSheetMusicDisplay.Sheet.SourceMeasures) { // just a safety measure\n console.log(\"OSMD.Cursor.resetIterator(): sheet or measures were null/undefined.\");\n return;\n }\n\n // set selection start, so that when there's MinMeasureToDraw set, the cursor starts there right away instead of at measure 1\n const lastSheetMeasureIndex: number = this.openSheetMusicDisplay.Sheet.SourceMeasures.length - 1; // last measure in data model\n let startMeasureIndex: number = this.rules.MinMeasureToDrawIndex;\n startMeasureIndex = Math.min(startMeasureIndex, lastSheetMeasureIndex);\n let endMeasureIndex: number = this.rules.MaxMeasureToDrawIndex;\n endMeasureIndex = Math.min(endMeasureIndex, lastSheetMeasureIndex);\n\n if (this.openSheetMusicDisplay.Sheet && this.openSheetMusicDisplay.Sheet.SourceMeasures.length > startMeasureIndex) {\n this.openSheetMusicDisplay.Sheet.SelectionStart = this.openSheetMusicDisplay.Sheet.SourceMeasures[startMeasureIndex].AbsoluteTimestamp;\n }\n if (this.openSheetMusicDisplay.Sheet && this.openSheetMusicDisplay.Sheet.SourceMeasures.length > endMeasureIndex) {\n const lastMeasure: SourceMeasure = this.openSheetMusicDisplay.Sheet.SourceMeasures[endMeasureIndex];\n this.openSheetMusicDisplay.Sheet.SelectionEnd = Fraction.plus(lastMeasure.AbsoluteTimestamp, lastMeasure.Duration);\n }\n\n this.iterator = this.manager.getIterator();\n }\n\n private getStaffEntryFromVoiceEntry(voiceEntry: VoiceEntry): VexFlowStaffEntry {\n const measureIndex: number = voiceEntry.ParentSourceStaffEntry.VerticalContainerParent.ParentMeasure.measureListIndex;\n const staffIndex: number = voiceEntry.ParentSourceStaffEntry.ParentStaff.idInMusicSheet;\n return this.graphic.findGraphicalStaffEntryFromMeasureList(staffIndex, measureIndex, voiceEntry.ParentSourceStaffEntry);\n }\n\n public update(): void {\n // Warning! This should NEVER call this.openSheetMusicDisplay.render()\n if (this.hidden || this.hidden === undefined || this.hidden === null) {\n return;\n }\n // this.graphic?.Cursors?.length = 0;\n const iterator: MusicPartManagerIterator = this.iterator;\n // TODO when measure draw range (drawUpToMeasureNumber) was changed, next/update can fail to move cursor. but of course it can be reset before.\n\n const voiceEntries: VoiceEntry[] = iterator.CurrentVisibleVoiceEntries();\n if (iterator.EndReached || !iterator.CurrentVoiceEntries || voiceEntries.length === 0) {\n return;\n }\n let x: number = 0, y: number = 0, height: number = 0;\n\n // get all staff entries inside the current voice entry\n const gseArr: VexFlowStaffEntry[] = voiceEntries.map(ve => this.getStaffEntryFromVoiceEntry(ve));\n // sort them by x position and take the leftmost entry\n const gse: VexFlowStaffEntry =\n gseArr.sort((a, b) => a?.PositionAndShape?.AbsolutePosition?.x <= b?.PositionAndShape?.AbsolutePosition?.x ? -1 : 1 )[0];\n x = gse.PositionAndShape.AbsolutePosition.x;\n const musicSystem: MusicSystem = gse.parentMeasure.ParentMusicSystem;\n if (!musicSystem) {\n return;\n }\n y = musicSystem.PositionAndShape.AbsolutePosition.y + musicSystem.StaffLines[0].PositionAndShape.RelativePosition.y;\n const bottomStaffline: StaffLine = musicSystem.StaffLines[musicSystem.StaffLines.length - 1];\n const endY: number = musicSystem.PositionAndShape.AbsolutePosition.y +\n bottomStaffline.PositionAndShape.RelativePosition.y + bottomStaffline.StaffHeight;\n height = endY - y;\n\n // The following code is not necessary (for now, but it could come useful later):\n // it highlights the notes under the cursor.\n //let vfNotes: { [voiceID: number]: Vex.Flow.StaveNote; } = gse.vfNotes;\n //for (let voiceId in vfNotes) {\n // if (vfNotes.hasOwnProperty(voiceId)) {\n // vfNotes[voiceId].setStyle({\n // fillStyle: \"red\",\n // strokeStyle: \"red\",\n // });\n // }\n //}\n\n // Update the graphical cursor\n // The following is the legacy cursor rendered on the canvas:\n // // let cursor: GraphicalLine = new GraphicalLine(new PointF2D(x, y), new PointF2D(x, y + height), 3, OutlineAndFillStyleEnum.PlaybackCursor);\n\n // This the current HTML Cursor:\n const cursorElement: HTMLImageElement = this.cursorElement;\n cursorElement.style.top = (y * 10.0 * this.openSheetMusicDisplay.zoom) + \"px\";\n cursorElement.style.left = ((x - 1.5) * 10.0 * this.openSheetMusicDisplay.zoom) + \"px\";\n cursorElement.height = (height * 10.0 * this.openSheetMusicDisplay.zoom);\n const newWidth: number = 3 * 10.0 * this.openSheetMusicDisplay.zoom;\n if (newWidth !== cursorElement.width) {\n cursorElement.width = newWidth;\n this.updateStyle(newWidth);\n }\n if (this.openSheetMusicDisplay.FollowCursor) {\n const diff: number = this.cursorElement.getBoundingClientRect().top;\n this.cursorElement.scrollIntoView({behavior: diff < 1000 ? \"smooth\" : \"auto\", block: \"center\"});\n }\n // Show cursor\n // // Old cursor: this.graphic.Cursors.push(cursor);\n this.cursorElement.style.display = \"\";\n }\n\n /**\n * Hide the cursor\n */\n public hide(): void {\n // Hide the actual cursor element\n this.cursorElement.style.display = \"none\";\n //this.graphic.Cursors.length = 0;\n // Forcing the sheet to re-render is not necessary anymore\n //if (!this.hidden) {\n // this.openSheetMusicDisplay.render();\n //}\n this.hidden = true;\n }\n\n /**\n * Go to next entry\n */\n public next(): void {\n this.iterator.moveToNext();\n this.update();\n }\n\n /**\n * reset cursor to start\n */\n public reset(): void {\n this.resetIterator();\n //this.iterator.moveToNext();\n this.update();\n }\n\n private updateStyle(width: number, color: string = \"#33e02f\"): void {\n // Create a dummy canvas to generate the gradient for the cursor\n // FIXME This approach needs to be improved\n const c: HTMLCanvasElement = document.createElement(\"canvas\");\n c.width = this.cursorElement.width;\n c.height = 1;\n const ctx: CanvasRenderingContext2D = c.getContext(\"2d\");\n ctx.globalAlpha = 0.5;\n // Generate the gradient\n const gradient: CanvasGradient = ctx.createLinearGradient(0, 0, this.cursorElement.width, 0);\n gradient.addColorStop(0, \"white\"); // it was: \"transparent\"\n gradient.addColorStop(0.2, color);\n gradient.addColorStop(0.8, color);\n gradient.addColorStop(1, \"white\"); // it was: \"transparent\"\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, 1);\n // Set the actual image\n this.cursorElement.src = c.toDataURL(\"image/png\");\n }\n\n public get Iterator(): MusicPartManagerIterator {\n return this.iterator;\n }\n\n public get Hidden(): boolean {\n return this.hidden;\n }\n\n /** returns voices under the current Cursor position. Without instrument argument, all voices are returned. */\n public VoicesUnderCursor(instrument?: Instrument): VoiceEntry[] {\n return this.iterator.CurrentVisibleVoiceEntries(instrument);\n }\n\n public NotesUnderCursor(instrument?: Instrument): Note[] {\n const voiceEntries: VoiceEntry[] = this.VoicesUnderCursor(instrument);\n const notes: Note[] = [];\n voiceEntries.forEach(voiceEntry => {\n notes.push.apply(notes, voiceEntry.Notes);\n });\n return notes;\n }\n}\n","/**\n * Represent the size of a 2D object, with (width, height)\n */\nexport class SizeF2D {\n public width: number;\n public height: number;\n\n constructor(width: number = 0, height: number = 0) {\n this.width = width;\n this.height = height;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\nvar arrays = require(\"./arrays\");\nvar Dictionary_1 = require(\"./Dictionary\");\nvar Set = /** @class */ (function () {\n /**\n * Creates an empty set.\n * @class

A set is a data structure that contains no duplicate items.

\n *

If the inserted elements are custom objects a function\n * which converts elements to strings must be provided. Example:

\n *\n *
\n     * function petToString(pet) {\n     *  return pet.name;\n     * }\n     * 
\n *\n * @constructor\n * @param {function(Object):string=} toStringFunction optional function used\n * to convert elements to strings. If the elements aren't strings or if toString()\n * is not appropriate, a custom function which receives an object and returns a\n * unique string must be provided.\n */\n function Set(toStringFunction) {\n this.dictionary = new Dictionary_1.default(toStringFunction);\n }\n /**\n * Returns true if this set contains the specified element.\n * @param {Object} element element to search for.\n * @return {boolean} true if this set contains the specified element,\n * false otherwise.\n */\n Set.prototype.contains = function (element) {\n return this.dictionary.containsKey(element);\n };\n /**\n * Adds the specified element to this set if it is not already present.\n * @param {Object} element the element to insert.\n * @return {boolean} true if this set did not already contain the specified element.\n */\n Set.prototype.add = function (element) {\n if (this.contains(element) || util.isUndefined(element)) {\n return false;\n }\n else {\n this.dictionary.setValue(element, element);\n return true;\n }\n };\n /**\n * Performs an intersection between this and another set.\n * Removes all values that are not present this set and the given set.\n * @param {collections.Set} otherSet other set.\n */\n Set.prototype.intersection = function (otherSet) {\n var set = this;\n this.forEach(function (element) {\n if (!otherSet.contains(element)) {\n set.remove(element);\n }\n return true;\n });\n };\n /**\n * Performs a union between this and another set.\n * Adds all values from the given set to this set.\n * @param {collections.Set} otherSet other set.\n */\n Set.prototype.union = function (otherSet) {\n var set = this;\n otherSet.forEach(function (element) {\n set.add(element);\n return true;\n });\n };\n /**\n * Performs a difference between this and another set.\n * Removes from this set all the values that are present in the given set.\n * @param {collections.Set} otherSet other set.\n */\n Set.prototype.difference = function (otherSet) {\n var set = this;\n otherSet.forEach(function (element) {\n set.remove(element);\n return true;\n });\n };\n /**\n * Checks whether the given set contains all the elements in this set.\n * @param {collections.Set} otherSet other set.\n * @return {boolean} true if this set is a subset of the given set.\n */\n Set.prototype.isSubsetOf = function (otherSet) {\n if (this.size() > otherSet.size()) {\n return false;\n }\n var isSub = true;\n this.forEach(function (element) {\n if (!otherSet.contains(element)) {\n isSub = false;\n return false;\n }\n return true;\n });\n return isSub;\n };\n /**\n * Removes the specified element from this set if it is present.\n * @return {boolean} true if this set contained the specified element.\n */\n Set.prototype.remove = function (element) {\n if (!this.contains(element)) {\n return false;\n }\n else {\n this.dictionary.remove(element);\n return true;\n }\n };\n /**\n * Executes the provided function once for each element\n * present in this set.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one arguments: the element. To break the iteration you can\n * optionally return false.\n */\n Set.prototype.forEach = function (callback) {\n this.dictionary.forEach(function (k, v) {\n return callback(v);\n });\n };\n /**\n * Returns an array containing all of the elements in this set in arbitrary order.\n * @return {Array} an array containing all of the elements in this set.\n */\n Set.prototype.toArray = function () {\n return this.dictionary.values();\n };\n /**\n * Returns true if this set contains no elements.\n * @return {boolean} true if this set contains no elements.\n */\n Set.prototype.isEmpty = function () {\n return this.dictionary.isEmpty();\n };\n /**\n * Returns the number of elements in this set.\n * @return {number} the number of elements in this set.\n */\n Set.prototype.size = function () {\n return this.dictionary.size();\n };\n /**\n * Removes all of the elements from this set.\n */\n Set.prototype.clear = function () {\n this.dictionary.clear();\n };\n /*\n * Provides a string representation for display\n */\n Set.prototype.toString = function () {\n return arrays.toString(this.toArray());\n };\n return Set;\n}()); // end of Set\nexports.default = Set;\n//# sourceMappingURL=Set.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\nvar Queue_1 = require(\"./Queue\");\n/**\n * General binary search tree implementation.\n *\n * This interface allows one to search elements using a subset of their attributes (thus the\n * tree can be used as an index for complex objects).\n * The attributes required to define an ordering in the tree must be defined in the type K.\n * Any additional attribute must be defined in the type V.\n *\n * @see BSTree\n */\nvar BSTreeKV = /** @class */ (function () {\n /**\n * Creates an empty binary search tree.\n * @class

A binary search tree is a binary tree in which each\n * internal node stores an element such that the elements stored in the\n * left subtree are less than it and the elements\n * stored in the right subtree are greater.

\n *

Formally, a binary search tree is a node-based binary tree data structure which\n * has the following properties:

\n *
    \n *
  • The left subtree of a node contains only nodes with elements less\n * than the node's element
  • \n *
  • The right subtree of a node contains only nodes with elements greater\n * than the node's element
  • \n *
  • Both the left and right subtrees must also be binary search trees.
  • \n *
\n *

If the inserted elements are custom objects a compare function must\n * be provided at construction time, otherwise the <=, === and >= operators are\n * used to compare elements. Example:

\n *
\n     * function compare(a, b) {\n     *  if (a is less than b by some ordering criterion) {\n     *     return -1;\n     *  } if (a is greater than b by the ordering criterion) {\n     *     return 1;\n     *  }\n     *  // a must be equal to b\n     *  return 0;\n     * }\n     * 
\n * @constructor\n * @param {function(Object,Object):number=} compareFunction optional\n * function used to compare two elements. Must return a negative integer,\n * zero, or a positive integer as the first argument is less than, equal to,\n * or greater than the second.\n */\n function BSTreeKV(compareFunction) {\n this.root = null;\n this.compare = compareFunction || util.defaultCompare;\n this.nElements = 0;\n }\n /**\n * Adds the specified element to this tree if it is not already present.\n * @param {Object} element the element to insert.\n * @return {boolean} true if this tree did not already contain the specified element.\n */\n BSTreeKV.prototype.add = function (element) {\n if (util.isUndefined(element)) {\n return false;\n }\n if (this.insertNode(this.createNode(element)) !== null) {\n this.nElements++;\n return true;\n }\n return false;\n };\n /**\n * Removes all of the elements from this tree.\n */\n BSTreeKV.prototype.clear = function () {\n this.root = null;\n this.nElements = 0;\n };\n /**\n * Returns true if this tree contains no elements.\n * @return {boolean} true if this tree contains no elements.\n */\n BSTreeKV.prototype.isEmpty = function () {\n return this.nElements === 0;\n };\n /**\n * Returns the number of elements in this tree.\n * @return {number} the number of elements in this tree.\n */\n BSTreeKV.prototype.size = function () {\n return this.nElements;\n };\n /**\n * Returns true if this tree contains the specified element.\n * @param {Object} element element to search for.\n * @return {boolean} true if this tree contains the specified element,\n * false otherwise.\n */\n BSTreeKV.prototype.contains = function (element) {\n if (util.isUndefined(element)) {\n return false;\n }\n return this.searchNode(this.root, element) !== null;\n };\n /**\n * Looks for the value with the provided search key.\n * @param {Object} element The key to look for\n * @return {Object} The value found or undefined if it was not found.\n */\n BSTreeKV.prototype.search = function (element) {\n var ret = this.searchNode(this.root, element);\n if (ret === null) {\n return undefined;\n }\n return ret.element;\n };\n /**\n * Removes the specified element from this tree if it is present.\n * @return {boolean} true if this tree contained the specified element.\n */\n BSTreeKV.prototype.remove = function (element) {\n var node = this.searchNode(this.root, element);\n if (node === null) {\n return false;\n }\n this.removeNode(node);\n this.nElements--;\n return true;\n };\n /**\n * Executes the provided function once for each element present in this tree in\n * in-order.\n * @param {function(Object):*} callback function to execute, it is invoked with one\n * argument: the element value, to break the iteration you can optionally return false.\n */\n BSTreeKV.prototype.inorderTraversal = function (callback) {\n this.inorderTraversalAux(this.root, callback, {\n stop: false\n });\n };\n /**\n * Executes the provided function once for each element present in this tree in pre-order.\n * @param {function(Object):*} callback function to execute, it is invoked with one\n * argument: the element value, to break the iteration you can optionally return false.\n */\n BSTreeKV.prototype.preorderTraversal = function (callback) {\n this.preorderTraversalAux(this.root, callback, {\n stop: false\n });\n };\n /**\n * Executes the provided function once for each element present in this tree in post-order.\n * @param {function(Object):*} callback function to execute, it is invoked with one\n * argument: the element value, to break the iteration you can optionally return false.\n */\n BSTreeKV.prototype.postorderTraversal = function (callback) {\n this.postorderTraversalAux(this.root, callback, {\n stop: false\n });\n };\n /**\n * Executes the provided function once for each element present in this tree in\n * level-order.\n * @param {function(Object):*} callback function to execute, it is invoked with one\n * argument: the element value, to break the iteration you can optionally return false.\n */\n BSTreeKV.prototype.levelTraversal = function (callback) {\n this.levelTraversalAux(this.root, callback);\n };\n /**\n * Returns the minimum element of this tree.\n * @return {*} the minimum element of this tree or undefined if this tree is\n * is empty.\n */\n BSTreeKV.prototype.minimum = function () {\n if (this.isEmpty() || this.root === null) {\n return undefined;\n }\n return this.minimumAux(this.root).element;\n };\n /**\n * Returns the maximum element of this tree.\n * @return {*} the maximum element of this tree or undefined if this tree is\n * is empty.\n */\n BSTreeKV.prototype.maximum = function () {\n if (this.isEmpty() || this.root === null) {\n return undefined;\n }\n return this.maximumAux(this.root).element;\n };\n /**\n * Executes the provided function once for each element present in this tree in inorder.\n * Equivalent to inorderTraversal.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element value, to break the iteration you can\n * optionally return false.\n */\n BSTreeKV.prototype.forEach = function (callback) {\n this.inorderTraversal(callback);\n };\n /**\n * Returns an array containing all of the elements in this tree in in-order.\n * @return {Array} an array containing all of the elements in this tree in in-order.\n */\n BSTreeKV.prototype.toArray = function () {\n var array = [];\n this.inorderTraversal(function (element) {\n array.push(element);\n return true;\n });\n return array;\n };\n /**\n * Returns the height of this tree.\n * @return {number} the height of this tree or -1 if is empty.\n */\n BSTreeKV.prototype.height = function () {\n return this.heightAux(this.root);\n };\n /**\n * @private\n */\n BSTreeKV.prototype.searchNode = function (node, element) {\n var cmp = 1;\n while (node !== null && cmp !== 0) {\n cmp = this.compare(element, node.element);\n if (cmp < 0) {\n node = node.leftCh;\n }\n else if (cmp > 0) {\n node = node.rightCh;\n }\n }\n return node;\n };\n /**\n * @private\n */\n BSTreeKV.prototype.transplant = function (n1, n2) {\n if (n1.parent === null) {\n this.root = n2;\n }\n else if (n1 === n1.parent.leftCh) {\n n1.parent.leftCh = n2;\n }\n else {\n n1.parent.rightCh = n2;\n }\n if (n2 !== null) {\n n2.parent = n1.parent;\n }\n };\n /**\n * @private\n */\n BSTreeKV.prototype.removeNode = function (node) {\n if (node.leftCh === null) {\n this.transplant(node, node.rightCh);\n }\n else if (node.rightCh === null) {\n this.transplant(node, node.leftCh);\n }\n else {\n var y = this.minimumAux(node.rightCh);\n if (y.parent !== node) {\n this.transplant(y, y.rightCh);\n y.rightCh = node.rightCh;\n y.rightCh.parent = y;\n }\n this.transplant(node, y);\n y.leftCh = node.leftCh;\n y.leftCh.parent = y;\n }\n };\n /**\n * @private\n */\n BSTreeKV.prototype.inorderTraversalAux = function (node, callback, signal) {\n if (node === null || signal.stop) {\n return;\n }\n this.inorderTraversalAux(node.leftCh, callback, signal);\n if (signal.stop) {\n return;\n }\n signal.stop = callback(node.element) === false;\n if (signal.stop) {\n return;\n }\n this.inorderTraversalAux(node.rightCh, callback, signal);\n };\n /**\n * @private\n */\n BSTreeKV.prototype.levelTraversalAux = function (node, callback) {\n var queue = new Queue_1.default();\n if (node !== null) {\n queue.enqueue(node);\n }\n node = queue.dequeue() || null;\n while (node != null) {\n if (callback(node.element) === false) {\n return;\n }\n if (node.leftCh !== null) {\n queue.enqueue(node.leftCh);\n }\n if (node.rightCh !== null) {\n queue.enqueue(node.rightCh);\n }\n node = queue.dequeue() || null;\n }\n };\n /**\n * @private\n */\n BSTreeKV.prototype.preorderTraversalAux = function (node, callback, signal) {\n if (node === null || signal.stop) {\n return;\n }\n signal.stop = callback(node.element) === false;\n if (signal.stop) {\n return;\n }\n this.preorderTraversalAux(node.leftCh, callback, signal);\n if (signal.stop) {\n return;\n }\n this.preorderTraversalAux(node.rightCh, callback, signal);\n };\n /**\n * @private\n */\n BSTreeKV.prototype.postorderTraversalAux = function (node, callback, signal) {\n if (node === null || signal.stop) {\n return;\n }\n this.postorderTraversalAux(node.leftCh, callback, signal);\n if (signal.stop) {\n return;\n }\n this.postorderTraversalAux(node.rightCh, callback, signal);\n if (signal.stop) {\n return;\n }\n signal.stop = callback(node.element) === false;\n };\n BSTreeKV.prototype.minimumAux = function (node) {\n while (node != null && node.leftCh !== null) {\n node = node.leftCh;\n }\n return node;\n };\n BSTreeKV.prototype.maximumAux = function (node) {\n while (node != null && node.rightCh !== null) {\n node = node.rightCh;\n }\n return node;\n };\n /**\n * @private\n */\n BSTreeKV.prototype.heightAux = function (node) {\n if (node === null) {\n return -1;\n }\n return Math.max(this.heightAux(node.leftCh), this.heightAux(node.rightCh)) + 1;\n };\n /*\n * @private\n */\n BSTreeKV.prototype.insertNode = function (node) {\n var parent = null;\n var position = this.root;\n while (position !== null) {\n var cmp = this.compare(node.element, position.element);\n if (cmp === 0) {\n return null;\n }\n else if (cmp < 0) {\n parent = position;\n position = position.leftCh;\n }\n else {\n parent = position;\n position = position.rightCh;\n }\n }\n node.parent = parent;\n if (parent === null) {\n // tree is empty\n this.root = node;\n }\n else if (this.compare(node.element, parent.element) < 0) {\n parent.leftCh = node;\n }\n else {\n parent.rightCh = node;\n }\n return node;\n };\n /**\n * @private\n */\n BSTreeKV.prototype.createNode = function (element) {\n return {\n element: element,\n leftCh: null,\n rightCh: null,\n parent: null\n };\n };\n return BSTreeKV;\n}());\nexports.default = BSTreeKV;\n//# sourceMappingURL=BSTreeKV.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar LinkedList_1 = require(\"./LinkedList\");\nvar Queue = /** @class */ (function () {\n /**\n * Creates an empty queue.\n * @class A queue is a First-In-First-Out (FIFO) data structure, the first\n * element added to the queue will be the first one to be removed. This\n * implementation uses a linked list as a container.\n * @constructor\n */\n function Queue() {\n this.list = new LinkedList_1.default();\n }\n /**\n * Inserts the specified element into the end of this queue.\n * @param {Object} elem the element to insert.\n * @return {boolean} true if the element was inserted, or false if it is undefined.\n */\n Queue.prototype.enqueue = function (elem) {\n return this.list.add(elem);\n };\n /**\n * Inserts the specified element into the end of this queue.\n * @param {Object} elem the element to insert.\n * @return {boolean} true if the element was inserted, or false if it is undefined.\n */\n Queue.prototype.add = function (elem) {\n return this.list.add(elem);\n };\n /**\n * Retrieves and removes the head of this queue.\n * @return {*} the head of this queue, or undefined if this queue is empty.\n */\n Queue.prototype.dequeue = function () {\n if (this.list.size() !== 0) {\n var el = this.list.first();\n this.list.removeElementAtIndex(0);\n return el;\n }\n return undefined;\n };\n /**\n * Retrieves, but does not remove, the head of this queue.\n * @return {*} the head of this queue, or undefined if this queue is empty.\n */\n Queue.prototype.peek = function () {\n if (this.list.size() !== 0) {\n return this.list.first();\n }\n return undefined;\n };\n /**\n * Returns the number of elements in this queue.\n * @return {number} the number of elements in this queue.\n */\n Queue.prototype.size = function () {\n return this.list.size();\n };\n /**\n * Returns true if this queue contains the specified element.\n *

If the elements inside this stack are\n * not comparable with the === operator, a custom equals function should be\n * provided to perform searches, the function must receive two arguments and\n * return true if they are equal, false otherwise. Example:

\n *\n *
\n     * const petsAreEqualByName (pet1, pet2) {\n     *  return pet1.name === pet2.name;\n     * }\n     * 
\n * @param {Object} elem element to search for.\n * @param {function(Object,Object):boolean=} equalsFunction optional\n * function to check if two elements are equal.\n * @return {boolean} true if this queue contains the specified element,\n * false otherwise.\n */\n Queue.prototype.contains = function (elem, equalsFunction) {\n return this.list.contains(elem, equalsFunction);\n };\n /**\n * Checks if this queue is empty.\n * @return {boolean} true if and only if this queue contains no items; false\n * otherwise.\n */\n Queue.prototype.isEmpty = function () {\n return this.list.size() <= 0;\n };\n /**\n * Removes all of the elements from this queue.\n */\n Queue.prototype.clear = function () {\n this.list.clear();\n };\n /**\n * Executes the provided function once for each element present in this queue in\n * FIFO order.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element value, to break the iteration you can\n * optionally return false.\n */\n Queue.prototype.forEach = function (callback) {\n this.list.forEach(callback);\n };\n return Queue;\n}()); // End of queue\nexports.default = Queue;\n//# sourceMappingURL=Queue.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar collections = require(\"./util\");\nvar arrays = require(\"./arrays\");\nvar Heap = /** @class */ (function () {\n /**\n * Creates an empty Heap.\n * @class\n *

A heap is a binary tree, where the nodes maintain the heap property:\n * each node is smaller than each of its children and therefore a MinHeap\n * This implementation uses an array to store elements.

\n *

If the inserted elements are custom objects a compare function must be provided,\n * at construction time, otherwise the <=, === and >= operators are\n * used to compare elements. Example:

\n *\n *
\n     * function compare(a, b) {\n     *  if (a is less than b by some ordering criterion) {\n     *     return -1;\n     *  } if (a is greater than b by the ordering criterion) {\n     *     return 1;\n     *  }\n     *  // a must be equal to b\n     *  return 0;\n     * }\n     * 
\n *\n *

If a Max-Heap is wanted (greater elements on top) you can a provide a\n * reverse compare function to accomplish that behavior. Example:

\n *\n *
\n     * function reverseCompare(a, b) {\n     *  if (a is less than b by some ordering criterion) {\n     *     return 1;\n     *  } if (a is greater than b by the ordering criterion) {\n     *     return -1;\n     *  }\n     *  // a must be equal to b\n     *  return 0;\n     * }\n     * 
\n *\n * @constructor\n * @param {function(Object,Object):number=} compareFunction optional\n * function used to compare two elements. Must return a negative integer,\n * zero, or a positive integer as the first argument is less than, equal to,\n * or greater than the second.\n */\n function Heap(compareFunction) {\n /**\n * Array used to store the elements of the heap.\n * @type {Array.}\n * @private\n */\n this.data = [];\n this.compare = compareFunction || collections.defaultCompare;\n }\n /**\n * Returns the index of the left child of the node at the given index.\n * @param {number} nodeIndex The index of the node to get the left child\n * for.\n * @return {number} The index of the left child.\n * @private\n */\n Heap.prototype.leftChildIndex = function (nodeIndex) {\n return (2 * nodeIndex) + 1;\n };\n /**\n * Returns the index of the right child of the node at the given index.\n * @param {number} nodeIndex The index of the node to get the right child\n * for.\n * @return {number} The index of the right child.\n * @private\n */\n Heap.prototype.rightChildIndex = function (nodeIndex) {\n return (2 * nodeIndex) + 2;\n };\n /**\n * Returns the index of the parent of the node at the given index.\n * @param {number} nodeIndex The index of the node to get the parent for.\n * @return {number} The index of the parent.\n * @private\n */\n Heap.prototype.parentIndex = function (nodeIndex) {\n return Math.floor((nodeIndex - 1) / 2);\n };\n /**\n * Returns the index of the smaller child node (if it exists).\n * @param {number} leftChild left child index.\n * @param {number} rightChild right child index.\n * @return {number} the index with the minimum value or -1 if it doesn't\n * exists.\n * @private\n */\n Heap.prototype.minIndex = function (leftChild, rightChild) {\n if (rightChild >= this.data.length) {\n if (leftChild >= this.data.length) {\n return -1;\n }\n else {\n return leftChild;\n }\n }\n else {\n if (this.compare(this.data[leftChild], this.data[rightChild]) <= 0) {\n return leftChild;\n }\n else {\n return rightChild;\n }\n }\n };\n /**\n * Moves the node at the given index up to its proper place in the heap.\n * @param {number} index The index of the node to move up.\n * @private\n */\n Heap.prototype.siftUp = function (index) {\n var parent = this.parentIndex(index);\n while (index > 0 && this.compare(this.data[parent], this.data[index]) > 0) {\n arrays.swap(this.data, parent, index);\n index = parent;\n parent = this.parentIndex(index);\n }\n };\n /**\n * Moves the node at the given index down to its proper place in the heap.\n * @param {number} nodeIndex The index of the node to move down.\n * @private\n */\n Heap.prototype.siftDown = function (nodeIndex) {\n //smaller child index\n var min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex));\n while (min >= 0 && this.compare(this.data[nodeIndex], this.data[min]) > 0) {\n arrays.swap(this.data, min, nodeIndex);\n nodeIndex = min;\n min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex));\n }\n };\n /**\n * Retrieves but does not remove the root element of this heap.\n * @return {*} The value at the root of the heap. Returns undefined if the\n * heap is empty.\n */\n Heap.prototype.peek = function () {\n if (this.data.length > 0) {\n return this.data[0];\n }\n else {\n return undefined;\n }\n };\n /**\n * Adds the given element into the heap.\n * @param {*} element the element.\n * @return true if the element was added or fals if it is undefined.\n */\n Heap.prototype.add = function (element) {\n if (collections.isUndefined(element)) {\n return false;\n }\n this.data.push(element);\n this.siftUp(this.data.length - 1);\n return true;\n };\n /**\n * Retrieves and removes the root element of this heap.\n * @return {*} The value removed from the root of the heap. Returns\n * undefined if the heap is empty.\n */\n Heap.prototype.removeRoot = function () {\n if (this.data.length > 0) {\n var obj = this.data[0];\n this.data[0] = this.data[this.data.length - 1];\n this.data.splice(this.data.length - 1, 1);\n if (this.data.length > 0) {\n this.siftDown(0);\n }\n return obj;\n }\n return undefined;\n };\n /**\n * Returns true if this heap contains the specified element.\n * @param {Object} element element to search for.\n * @return {boolean} true if this Heap contains the specified element, false\n * otherwise.\n */\n Heap.prototype.contains = function (element) {\n var equF = collections.compareToEquals(this.compare);\n return arrays.contains(this.data, element, equF);\n };\n /**\n * Returns the number of elements in this heap.\n * @return {number} the number of elements in this heap.\n */\n Heap.prototype.size = function () {\n return this.data.length;\n };\n /**\n * Checks if this heap is empty.\n * @return {boolean} true if and only if this heap contains no items; false\n * otherwise.\n */\n Heap.prototype.isEmpty = function () {\n return this.data.length <= 0;\n };\n /**\n * Removes all of the elements from this heap.\n */\n Heap.prototype.clear = function () {\n this.data.length = 0;\n };\n /**\n * Executes the provided function once for each element present in this heap in\n * no particular order.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element value, to break the iteration you can\n * optionally return false.\n */\n Heap.prototype.forEach = function (callback) {\n arrays.forEach(this.data, callback);\n };\n return Heap;\n}());\nexports.default = Heap;\n//# sourceMappingURL=Heap.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dictionary_1 = require(\"./Dictionary\");\nvar util = require(\"./util\");\nvar FactoryDictionary = /** @class */ (function (_super) {\n __extends(FactoryDictionary, _super);\n /**\n * Creates an empty dictionary.\n * @class

Dictionaries map keys to values; each key can map to at most one value.\n * This implementation accepts any kind of objects as keys.

\n *\n *

The default factory function should return a new object of the provided\n * type. Example:

\n *
\n     * function petFactory() {\n     *  return new Pet();\n     * }\n     * 
\n *\n *

If the keys are custom objects a function which converts keys to unique\n * strings must be provided. Example:

\n *
\n     * function petToString(pet) {\n     *  return pet.name;\n     * }\n     * 
\n * @constructor\n * @param {function():V=} defaultFactoryFunction function used to create a\n * default object.\n * @param {function(Object):string=} toStrFunction optional function used\n * to convert keys to strings. If the keys aren't strings or if toString()\n * is not appropriate, a custom function which receives a key and returns a\n * unique string must be provided.\n */\n function FactoryDictionary(defaultFactoryFunction, toStrFunction) {\n var _this = _super.call(this, toStrFunction) || this;\n _this.defaultFactoryFunction = defaultFactoryFunction;\n return _this;\n }\n /**\n * Associates the specified default value with the specified key in this dictionary,\n * if it didn't contain the key yet. If the key existed, the existing value will be used.\n * @param {Object} key key with which the specified value is to be\n * associated.\n * @param {Object} defaultValue default value to be associated with the specified key.\n * @return {*} previous value associated with the specified key, or the default value,\n * if the key didn't exist yet.\n */\n FactoryDictionary.prototype.setDefault = function (key, defaultValue) {\n var currentValue = _super.prototype.getValue.call(this, key);\n if (util.isUndefined(currentValue)) {\n this.setValue(key, defaultValue);\n return defaultValue;\n }\n return currentValue;\n };\n /**\n * Returns the value to which this dictionary maps the specified key.\n * Returns a default value created by the factory passed in the constructor,\n * if this dictionary contains no mapping for this key. The missing key will\n * automatically be added to the dictionary.\n * @param {Object} key key whose associated value is to be returned.\n * @return {*} the value to which this dictionary maps the specified key or\n * a default value if the map contains no mapping for this key.\n */\n FactoryDictionary.prototype.getValue = function (key) {\n return this.setDefault(key, this.defaultFactoryFunction());\n };\n return FactoryDictionary;\n}(Dictionary_1.default));\nexports.default = FactoryDictionary;\n//# sourceMappingURL=FactoryDictionary.js.map","// created from 'create-ts-index'\n\nexport * from \"./FontStyles\";\nexport * from \"./Fonts\";\nexport * from \"./TextAlignment\";\n","/**\n * The fonts available for writing on the sheet music\n */\nexport enum Fonts {\n TimesNewRoman,\n Kokila\n}\n","import {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\n\nexport class VerticalGraphicalStaffEntryContainer {\n\n constructor(numberOfEntries: number, absoluteTimestamp: Fraction) {\n this.absoluteTimestamp = absoluteTimestamp;\n this.staffEntries = new Array(numberOfEntries);\n }\n\n //public relativeInMeasureTimestamp: Fraction;\n private index: number;\n private absoluteTimestamp: Fraction;\n private staffEntries: GraphicalStaffEntry[] = [];\n\n public get Index(): number {\n return this.index;\n }\n\n public set Index(value: number) {\n this.index = value;\n }\n\n public get AbsoluteTimestamp(): Fraction {\n return this.absoluteTimestamp;\n }\n\n //public set AbsoluteTimestamp(value: Fraction) {\n // this.absoluteTimestamp = value;\n //}\n\n public get StaffEntries(): GraphicalStaffEntry[] {\n return this.staffEntries;\n }\n\n public set StaffEntries(value: GraphicalStaffEntry[]) {\n this.staffEntries = value;\n }\n\n public static compareByTimestamp(x: VerticalGraphicalStaffEntryContainer, y: VerticalGraphicalStaffEntryContainer): number {\n const xValue: number = x.absoluteTimestamp.RealValue;\n const yValue: number = y.absoluteTimestamp.RealValue;\n\n if (xValue < yValue) {\n return -1;\n } else if (xValue > yValue) {\n return 1;\n } else {\n return 0;\n }\n }\n\n /**\n * Return the first non-null [[GraphicalStaffEntry]].\n * @returns {any}\n */\n public getFirstNonNullStaffEntry(): GraphicalStaffEntry {\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n if (graphicalStaffEntry) {\n return graphicalStaffEntry;\n }\n }\n return undefined;\n }\n}\n\n\n","import {GraphicalMeasure} from \"./GraphicalMeasure\";\nimport {GraphicalMusicPage} from \"./GraphicalMusicPage\";\nimport {EngravingRules} from \"./EngravingRules\";\nimport {RhythmInstruction} from \"../VoiceData/Instructions/RhythmInstruction\";\nimport {KeyInstruction} from \"../VoiceData/Instructions/KeyInstruction\";\nimport {ClefInstruction} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {Staff} from \"../VoiceData/Staff\";\nimport {Instrument} from \"../Instrument\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {StaffLine} from \"./StaffLine\";\nimport {GraphicalLine} from \"./GraphicalLine\";\nimport {SourceStaffEntry} from \"../VoiceData/SourceStaffEntry\";\nimport {AbstractNotationInstruction} from \"../VoiceData/Instructions/AbstractNotationInstruction\";\nimport {SystemLinesEnum} from \"./SystemLinesEnum\";\nimport {GraphicalMusicSheet} from \"./GraphicalMusicSheet\";\nimport {MusicSheetCalculator} from \"./MusicSheetCalculator\";\nimport {MidiInstrument} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {CollectionUtil} from \"../../Util/CollectionUtil\";\nimport {SystemLinePosition} from \"./SystemLinePosition\";\n\nexport class MusicSystemBuilder {\n protected measureList: GraphicalMeasure[][];\n protected graphicalMusicSheet: GraphicalMusicSheet;\n protected currentSystemParams: SystemBuildParameters;\n protected numberOfVisibleStaffLines: number;\n protected rules: EngravingRules;\n protected measureListIndex: number;\n protected musicSystems: MusicSystem[] = [];\n\n /**\n * Does the mapping from the currently visible staves to the global staff-list of the music sheet.\n */\n protected visibleStaffIndices: number[];\n protected activeRhythm: RhythmInstruction[];\n protected activeKeys: KeyInstruction[];\n protected activeClefs: ClefInstruction[];\n protected globalSystemIndex: number = 0;\n protected leadSheet: boolean = false;\n\n public initialize(\n graphicalMusicSheet: GraphicalMusicSheet, measureList: GraphicalMeasure[][], numberOfStaffLines: number): void {\n this.leadSheet = graphicalMusicSheet.LeadSheet;\n this.graphicalMusicSheet = graphicalMusicSheet;\n this.rules = this.graphicalMusicSheet.ParentMusicSheet.Rules;\n this.measureList = measureList;\n this.numberOfVisibleStaffLines = numberOfStaffLines;\n this.activeRhythm = new Array(this.numberOfVisibleStaffLines);\n this.activeKeys = new Array(this.numberOfVisibleStaffLines);\n this.activeClefs = new Array(this.numberOfVisibleStaffLines);\n this.initializeActiveInstructions(this.measureList[0]);\n }\n\n public buildMusicSystems(): MusicSystem[] {\n const systemMaxWidth: number = this.getFullPageSystemWidth();\n let prevMeasureEndsPart: boolean = false;\n this.measureListIndex = 0;\n this.currentSystemParams = new SystemBuildParameters();\n\n // the first System - create also its Labels\n this.currentSystemParams.currentSystem = this.initMusicSystem();\n\n let numberOfMeasures: number = 0;\n for (let idx: number = 0, len: number = this.measureList.length; idx < len; ++idx) {\n if (this.measureList[idx].length > 0) {\n numberOfMeasures++;\n }\n }\n\n // go through measures and add to system until system gets too long -> finish system and start next system [line break, new system].\n while (this.measureListIndex < numberOfMeasures) {\n const graphicalMeasures: GraphicalMeasure[] = this.measureList[this.measureListIndex];\n for (let idx: number = 0, len: number = graphicalMeasures.length; idx < len; ++idx) {\n graphicalMeasures[idx].resetLayout();\n }\n const sourceMeasure: SourceMeasure = graphicalMeasures[0].parentSourceMeasure;\n const sourceMeasureEndsPart: boolean = sourceMeasure.HasEndLine;\n const isSystemStartMeasure: boolean = this.currentSystemParams.IsSystemStartMeasure();\n const isFirstSourceMeasure: boolean = sourceMeasure === this.graphicalMusicSheet.ParentMusicSheet.getFirstSourceMeasure();\n let currentMeasureBeginInstructionsWidth: number = this.rules.MeasureLeftMargin;\n let currentMeasureEndInstructionsWidth: number = 0;\n\n // calculate the current Measure Width:\n // The width of a measure is build up from\n // 1. the begin instructions (clef, Key, Rhythm),\n // 2. the staff entries (= notes) and\n // 3. the end instructions (actually only clefs)\n const measureStartLine: SystemLinesEnum = this.getMeasureStartLine();\n currentMeasureBeginInstructionsWidth += this.getLineWidth(graphicalMeasures[0], measureStartLine, isSystemStartMeasure);\n if (!this.leadSheet) {\n let forceShowRhythm: boolean = false;\n if (prevMeasureEndsPart && this.rules.ShowRhythmAgainAfterPartEndOrFinalBarline) {\n forceShowRhythm = true;\n }\n currentMeasureBeginInstructionsWidth += this.addBeginInstructions( graphicalMeasures,\n isSystemStartMeasure,\n isFirstSourceMeasure || forceShowRhythm);\n // forceShowRhythm could be a fourth parameter instead in addBeginInstructions, but only affects RhythmInstruction for now.\n currentMeasureEndInstructionsWidth += this.addEndInstructions(graphicalMeasures);\n }\n let currentMeasureVarWidth: number = 0;\n for (let i: number = 0; i < this.numberOfVisibleStaffLines; i++) {\n currentMeasureVarWidth = Math.max(currentMeasureVarWidth, graphicalMeasures[i].minimumStaffEntriesWidth);\n }\n\n // take into account the LineWidth after each Measure\n const measureEndLine: SystemLinesEnum = this.getMeasureEndLine();\n currentMeasureEndInstructionsWidth += this.getLineWidth(graphicalMeasures[0], measureEndLine, isSystemStartMeasure);\n let nextMeasureBeginInstructionWidth: number = this.rules.MeasureLeftMargin;\n\n // Check if there are key or rhythm change instructions within the next measure:\n let nextSourceMeasure: SourceMeasure = undefined;\n if (this.measureListIndex + 1 < this.measureList.length) {\n const nextGraphicalMeasures: GraphicalMeasure[] = this.measureList[this.measureListIndex + 1];\n nextSourceMeasure = nextGraphicalMeasures[0].parentSourceMeasure;\n if (nextSourceMeasure.hasBeginInstructions()) {\n nextMeasureBeginInstructionWidth += this.addBeginInstructions(nextGraphicalMeasures, false, false);\n }\n }\n const totalMeasureWidth: number = currentMeasureBeginInstructionsWidth + currentMeasureEndInstructionsWidth + currentMeasureVarWidth;\n const measureFitsInSystem: boolean = this.currentSystemParams.currentWidth + totalMeasureWidth + nextMeasureBeginInstructionWidth < systemMaxWidth;\n const doXmlPageBreak: boolean = this.rules.NewPageAtXMLNewPageAttribute && sourceMeasure.printNewPageXml;\n const doXmlLineBreak: boolean = doXmlPageBreak || // also create new system if doing page break\n (this.rules.NewSystemAtXMLNewSystemAttribute && sourceMeasure.printNewSystemXml);\n if (isSystemStartMeasure || (measureFitsInSystem && !doXmlLineBreak)) {\n this.addMeasureToSystem(\n graphicalMeasures, measureStartLine, measureEndLine, totalMeasureWidth,\n currentMeasureBeginInstructionsWidth, currentMeasureVarWidth, currentMeasureEndInstructionsWidth\n );\n this.updateActiveClefs(sourceMeasure, graphicalMeasures);\n this.measureListIndex++;\n if (sourceMeasureEndsPart) {\n this.finalizeCurrentAndCreateNewSystem(graphicalMeasures, true, false);\n }\n prevMeasureEndsPart = sourceMeasureEndsPart;\n } else {\n // finalize current system and prepare a new one\n this.finalizeCurrentAndCreateNewSystem(graphicalMeasures, false, true, doXmlPageBreak);\n // don't increase measure index to check this measure now again\n // don't set prevMeasureEndsPart in this case! because we will loop with the same measure again.\n }\n }\n if (this.currentSystemParams.systemMeasures.length > 0) {\n this.finalizeCurrentAndCreateNewSystem(this.measureList[this.measureList.length - 1], true, false);\n }\n return this.musicSystems;\n }\n\n /**\n * calculates the y positions of the staff lines within a system and\n * furthermore the y positions of the systems themselves.\n */\n public calculateSystemYLayout(): void {\n for (const musicSystem of this.musicSystems) {\n this.optimizeDistanceBetweenStaffLines(musicSystem);\n }\n\n // set y positions of systems using the previous system and a fixed distance.\n this.calculateMusicSystemsRelativePositions();\n }\n\n /**\n * Set the Width of the staff-Measures of one source measure.\n * @param graphicalMeasures\n * @param width\n * @param beginInstrWidth\n * @param endInstrWidth\n */\n protected setMeasureWidth(graphicalMeasures: GraphicalMeasure[], width: number, beginInstrWidth: number, endInstrWidth: number): void {\n for (let idx: number = 0, len: number = graphicalMeasures.length; idx < len; ++idx) {\n const measure: GraphicalMeasure = graphicalMeasures[idx];\n measure.setWidth(width);\n if (beginInstrWidth > 0) {\n measure.beginInstructionsWidth = beginInstrWidth;\n }\n if (endInstrWidth > 0) {\n measure.endInstructionsWidth = endInstrWidth;\n }\n }\n }\n\n /**\n * When the actual source measure doesn't fit any more, this method finalizes the current system and\n * opens up a new empty system, where the actual measure will be added in the next iteration.\n * @param measures\n * @param isPartEndingSystem\n */\n protected finalizeCurrentAndCreateNewSystem(measures: GraphicalMeasure[],\n systemEndsPart: boolean = false,\n checkExtraInstructionMeasure: boolean = true,\n startNewPage: boolean = false): void {\n this.currentSystemParams.currentSystem.breaksPage = startNewPage;\n this.adaptRepetitionLineWithIfNeeded();\n if (measures !== undefined &&\n checkExtraInstructionMeasure) {\n this.checkAndCreateExtraInstructionMeasure(measures);\n }\n this.stretchMusicSystem(systemEndsPart);\n this.currentSystemParams = new SystemBuildParameters();\n if (measures !== undefined &&\n this.measureListIndex < this.measureList.length) {\n this.currentSystemParams.currentSystem = this.initMusicSystem();\n }\n }\n\n /**\n * If a line repetition is ending and a new line repetition is starting at the end of the system,\n * the double repetition line has to be split into two: one at the currently ending system and\n * one at the next system.\n * (this should be refactored at some point to not use a combined end/start line but always separated lines)\n */\n protected adaptRepetitionLineWithIfNeeded(): void {\n const systemMeasures: MeasureBuildParameters[] = this.currentSystemParams.systemMeasures;\n if (systemMeasures.length >= 1) {\n const measures: GraphicalMeasure[] =\n this.currentSystemParams.currentSystem.GraphicalMeasures[this.currentSystemParams.currentSystem.GraphicalMeasures.length - 1];\n const measureParams: MeasureBuildParameters = systemMeasures[systemMeasures.length - 1];\n let diff: number = 0.0;\n if (measureParams.endLine === SystemLinesEnum.DotsBoldBoldDots) {\n measureParams.endLine = SystemLinesEnum.DotsThinBold;\n diff = measures[0].getLineWidth(SystemLinesEnum.DotsBoldBoldDots) / 2 - measures[0].getLineWidth(SystemLinesEnum.DotsThinBold);\n }\n this.currentSystemParams.currentSystemFixWidth -= diff;\n for (let idx: number = 0, len: number = measures.length; idx < len; ++idx) {\n const measure: GraphicalMeasure = measures[idx];\n measure.endInstructionsWidth -= diff;\n }\n }\n }\n\n protected addMeasureToSystem(\n graphicalMeasures: GraphicalMeasure[], measureStartLine: SystemLinesEnum, measureEndLine: SystemLinesEnum,\n totalMeasureWidth: number, currentMeasureBeginInstructionsWidth: number, currentVarWidth: number, currentMeasureEndInstructionsWidth: number\n ): void {\n this.currentSystemParams.systemMeasures.push({beginLine: measureStartLine, endLine: measureEndLine});\n this.setMeasureWidth(\n graphicalMeasures, totalMeasureWidth, currentMeasureBeginInstructionsWidth, currentMeasureEndInstructionsWidth\n );\n this.addStaveMeasuresToSystem(graphicalMeasures);\n this.currentSystemParams.currentWidth += totalMeasureWidth;\n this.currentSystemParams.currentSystemFixWidth += currentMeasureBeginInstructionsWidth + currentMeasureEndInstructionsWidth;\n this.currentSystemParams.currentSystemVarWidth += currentVarWidth;\n this.currentSystemParams.systemMeasureIndex++;\n }\n\n /**\n * Initialize a new [[MusicSystem]].\n * @returns {MusicSystem}\n */\n protected initMusicSystem(): MusicSystem {\n const musicSystem: MusicSystem = MusicSheetCalculator.symbolFactory.createMusicSystem(this.globalSystemIndex++, this.rules);\n this.musicSystems.push(musicSystem);\n this.layoutSystemStaves(musicSystem);\n musicSystem.createMusicSystemLabel(\n this.rules.InstrumentLabelTextHeight,\n this.rules.SystemLabelsRightMargin,\n this.rules.LabelMarginBorderFactor,\n this.musicSystems.length === 1\n );\n return musicSystem;\n }\n\n /**\n * Get the width the system should have for a given page width.\n * @returns {number}\n */\n protected getFullPageSystemWidth(): number {\n return this.graphicalMusicSheet.ParentMusicSheet.pageWidth - this.rules.PageLeftMargin\n - this.rules.PageRightMargin - this.rules.SystemLeftMargin - this.rules.SystemRightMargin;\n }\n\n protected layoutSystemStaves(musicSystem: MusicSystem): void {\n const systemWidth: number = this.getFullPageSystemWidth();\n const boundingBox: BoundingBox = musicSystem.PositionAndShape;\n boundingBox.BorderLeft = 0.0;\n boundingBox.BorderRight = systemWidth;\n boundingBox.BorderTop = 0.0;\n const staffList: Staff[] = [];\n const instruments: Instrument[] = this.graphicalMusicSheet.ParentMusicSheet.Instruments;\n for (let idx: number = 0, len: number = instruments.length; idx < len; ++idx) {\n const instrument: Instrument = instruments[idx];\n if (instrument.Voices.length === 0 || !instrument.Visible) {\n continue;\n }\n for (let idx2: number = 0, len2: number = instrument.Staves.length; idx2 < len2; ++idx2) {\n const staff: Staff = instrument.Staves[idx2];\n staffList.push(staff);\n }\n }\n let multiLyrics: boolean = false;\n if (this.leadSheet) {\n for (let idx: number = 0, len: number = staffList.length; idx < len; ++idx) {\n const staff: Staff = staffList[idx];\n if (staff.ParentInstrument.LyricVersesNumbers.length > 1) {\n multiLyrics = true;\n break;\n }\n }\n }\n let yOffsetSum: number = 0;\n for (let i: number = 0; i < staffList.length; i++) {\n this.addStaffLineToMusicSystem(musicSystem, yOffsetSum, staffList[i]);\n yOffsetSum += this.rules.StaffHeight;\n if (i + 1 < staffList.length) {\n let yOffset: number = 0;\n if (this.leadSheet && !multiLyrics) {\n yOffset = 2.5;\n } else {\n if (staffList[i].ParentInstrument === staffList[i + 1].ParentInstrument) {\n yOffset = this.rules.BetweenStaffDistance;\n } else {\n yOffset = this.rules.StaffDistance;\n }\n }\n yOffsetSum += yOffset;\n }\n }\n boundingBox.BorderBottom = yOffsetSum;\n }\n\n /**\n * Calculate the [[StaffLine]](s) needed for a [[MusicSystem]].\n * @param musicSystem\n * @param relativeYPosition\n * @param staff\n */\n protected addStaffLineToMusicSystem(musicSystem: MusicSystem, relativeYPosition: number, staff: Staff): void {\n if (musicSystem) {\n const staffLine: StaffLine = MusicSheetCalculator.symbolFactory.createStaffLine(musicSystem, staff);\n musicSystem.StaffLines.push(staffLine);\n const boundingBox: BoundingBox = staffLine.PositionAndShape;\n const relativePosition: PointF2D = new PointF2D();\n if (musicSystem === this.musicSystems[0] &&\n !this.rules.CompactMode) {\n relativePosition.x = this.rules.FirstSystemMargin;\n boundingBox.BorderRight = musicSystem.PositionAndShape.Size.width - this.rules.FirstSystemMargin;\n } else {\n relativePosition.x = 0.0;\n boundingBox.BorderRight = musicSystem.PositionAndShape.Size.width;\n }\n relativePosition.y = relativeYPosition;\n boundingBox.RelativePosition = relativePosition;\n boundingBox.BorderLeft = 0.0;\n boundingBox.BorderTop = 0.0;\n boundingBox.BorderBottom = this.rules.StaffHeight;\n for (let i: number = 0; i < 5; i++) {\n const start: PointF2D = new PointF2D();\n start.x = 0.0;\n start.y = i * this.rules.StaffHeight / 4;\n const end: PointF2D = new PointF2D();\n end.x = staffLine.PositionAndShape.Size.width;\n end.y = i * this.rules.StaffHeight / 4;\n if (this.leadSheet) {\n start.y = end.y = 0;\n }\n staffLine.StaffLines[i] = new GraphicalLine(start, end, this.rules.StaffLineWidth);\n }\n }\n }\n\n /**\n * Initialize the active Instructions from the first [[SourceMeasure]] of first [[SourceMusicPart]].\n * @param measureList\n */\n protected initializeActiveInstructions(measureList: GraphicalMeasure[]): void {\n const firstSourceMeasure: SourceMeasure = this.graphicalMusicSheet.ParentMusicSheet.getFirstSourceMeasure();\n if (firstSourceMeasure) {\n this.visibleStaffIndices = this.graphicalMusicSheet.getVisibleStavesIndicesFromSourceMeasure(measureList);\n for (let i: number = 0, len: number = this.visibleStaffIndices.length; i < len; i++) {\n const staffIndex: number = this.visibleStaffIndices[i];\n const graphicalMeasure: GraphicalMeasure = this.graphicalMusicSheet\n .getGraphicalMeasureFromSourceMeasureAndIndex(firstSourceMeasure, staffIndex);\n this.activeClefs[i] = firstSourceMeasure.FirstInstructionsStaffEntries[staffIndex].Instructions[0];\n let keyInstruction: KeyInstruction = KeyInstruction.copy(\n firstSourceMeasure.FirstInstructionsStaffEntries[staffIndex].Instructions[1]);\n keyInstruction = this.transposeKeyInstruction(keyInstruction, graphicalMeasure);\n this.activeKeys[i] = keyInstruction;\n this.activeRhythm[i] = firstSourceMeasure.FirstInstructionsStaffEntries[staffIndex].Instructions[2];\n }\n }\n }\n\n protected transposeKeyInstruction(keyInstruction: KeyInstruction, graphicalMeasure: GraphicalMeasure): KeyInstruction {\n if (this.graphicalMusicSheet.ParentMusicSheet.Transpose !== 0\n && graphicalMeasure.ParentStaff.ParentInstrument.MidiInstrumentId !== MidiInstrument.Percussion\n && MusicSheetCalculator.transposeCalculator !== undefined\n ) {\n MusicSheetCalculator.transposeCalculator.transposeKey(\n keyInstruction,\n this.graphicalMusicSheet.ParentMusicSheet.Transpose\n );\n }\n return keyInstruction;\n }\n\n /**\n * Calculate the width needed for Instructions (Key, Clef, Rhythm, Repetition) for the measure.\n * @param measures\n * @param isSystemFirstMeasure\n * @param isFirstSourceMeasure\n * @returns {number}\n */\n protected addBeginInstructions(measures: GraphicalMeasure[], isSystemFirstMeasure: boolean, isFirstSourceMeasure: boolean): number {\n const measureCount: number = measures.length;\n if (measureCount === 0) {\n return 0;\n }\n let totalBeginInstructionLengthX: number = 0.0;\n const sourceMeasure: SourceMeasure = measures[0].parentSourceMeasure;\n for (let idx: number = 0; idx < measureCount; ++idx) {\n const measure: GraphicalMeasure = measures[idx];\n const staffIndex: number = this.visibleStaffIndices[idx];\n const beginInstructionsStaffEntry: SourceStaffEntry = sourceMeasure.FirstInstructionsStaffEntries[staffIndex];\n const beginInstructionLengthX: number = this.AddInstructionsAtMeasureBegin(\n beginInstructionsStaffEntry, measure,\n idx, isFirstSourceMeasure,\n isSystemFirstMeasure\n );\n totalBeginInstructionLengthX = Math.max(totalBeginInstructionLengthX, beginInstructionLengthX);\n }\n return totalBeginInstructionLengthX;\n }\n\n /**\n * Calculates the width needed for Instructions (Clef, Repetition) for the measure.\n * @param measures\n * @returns {number}\n */\n protected addEndInstructions(measures: GraphicalMeasure[]): number {\n const measureCount: number = measures.length;\n if (measureCount === 0) {\n return 0;\n }\n let totalEndInstructionLengthX: number = 0.5;\n const sourceMeasure: SourceMeasure = measures[0].parentSourceMeasure;\n for (let idx: number = 0; idx < measureCount; idx++) {\n const measure: GraphicalMeasure = measures[idx];\n const staffIndex: number = this.visibleStaffIndices[idx];\n const endInstructionsStaffEntry: SourceStaffEntry = sourceMeasure.LastInstructionsStaffEntries[staffIndex];\n const endInstructionLengthX: number = this.addInstructionsAtMeasureEnd(endInstructionsStaffEntry, measure);\n totalEndInstructionLengthX = Math.max(totalEndInstructionLengthX, endInstructionLengthX);\n }\n return totalEndInstructionLengthX;\n }\n\n protected AddInstructionsAtMeasureBegin(firstEntry: SourceStaffEntry, measure: GraphicalMeasure,\n visibleStaffIdx: number, isFirstSourceMeasure: boolean, isSystemStartMeasure: boolean): number {\n let instructionsLengthX: number = 0;\n let currentClef: ClefInstruction = undefined;\n let currentKey: KeyInstruction = undefined;\n let currentRhythm: RhythmInstruction = undefined;\n if (firstEntry) {\n for (let idx: number = 0, len: number = firstEntry.Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = firstEntry.Instructions[idx];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n currentClef = abstractNotationInstruction;\n } else if (abstractNotationInstruction instanceof KeyInstruction) {\n currentKey = abstractNotationInstruction;\n } else if (abstractNotationInstruction instanceof RhythmInstruction) {\n currentRhythm = abstractNotationInstruction;\n }\n }\n }\n if (isSystemStartMeasure) {\n if (!currentClef) {\n currentClef = this.activeClefs[visibleStaffIdx];\n }\n if (!currentKey) {\n currentKey = this.activeKeys[visibleStaffIdx];\n }\n if (isFirstSourceMeasure && !currentRhythm) {\n currentRhythm = this.activeRhythm[visibleStaffIdx];\n }\n }\n let clefAdded: boolean = false;\n let keyAdded: boolean = false;\n let rhythmAdded: boolean = false;\n if (currentClef) {\n measure.addClefAtBegin(currentClef);\n clefAdded = true;\n } else {\n currentClef = this.activeClefs[visibleStaffIdx];\n }\n if (currentKey) {\n currentKey = this.transposeKeyInstruction(currentKey, measure);\n const previousKey: KeyInstruction = isSystemStartMeasure ? undefined : this.activeKeys[visibleStaffIdx];\n measure.addKeyAtBegin(currentKey, previousKey, currentClef);\n keyAdded = true;\n }\n if (currentRhythm !== undefined && currentRhythm.PrintObject) {\n measure.addRhythmAtBegin(currentRhythm);\n rhythmAdded = true;\n }\n if (clefAdded || keyAdded || rhythmAdded) {\n instructionsLengthX += measure.beginInstructionsWidth;\n if (rhythmAdded) {\n instructionsLengthX += this.rules.RhythmRightMargin;\n }\n }\n return instructionsLengthX;\n }\n\n protected addInstructionsAtMeasureEnd(lastEntry: SourceStaffEntry, measure: GraphicalMeasure): number {\n if (!lastEntry || !lastEntry.Instructions || lastEntry.Instructions.length === 0) {\n return 0;\n }\n for (let idx: number = 0, len: number = lastEntry.Instructions.length; idx < len; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = lastEntry.Instructions[idx];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n const activeClef: ClefInstruction = abstractNotationInstruction;\n measure.addClefAtEnd(activeClef);\n }\n }\n return this.rules.MeasureRightMargin + measure.endInstructionsWidth;\n }\n\n /**\n * Track down and update the active ClefInstruction in Measure's StaffEntries.\n * This has to be done after the measure is added to a system\n * (otherwise already the check if the measure fits to the system would update the active clefs..)\n * @param measure\n * @param graphicalMeasures\n */\n protected updateActiveClefs(measure: SourceMeasure, graphicalMeasures: GraphicalMeasure[]): void {\n for (let visStaffIdx: number = 0, len: number = graphicalMeasures.length; visStaffIdx < len; visStaffIdx++) {\n const staffIndex: number = this.visibleStaffIndices[visStaffIdx];\n const firstEntry: SourceStaffEntry = measure.FirstInstructionsStaffEntries[staffIndex];\n if (firstEntry) {\n for (let idx: number = 0, len2: number = firstEntry.Instructions.length; idx < len2; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = firstEntry.Instructions[idx];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n this.activeClefs[visStaffIdx] = abstractNotationInstruction;\n } else if (abstractNotationInstruction instanceof KeyInstruction) {\n this.activeKeys[visStaffIdx] = abstractNotationInstruction;\n } else if (abstractNotationInstruction instanceof RhythmInstruction) {\n this.activeRhythm[visStaffIdx] = abstractNotationInstruction;\n }\n }\n }\n const entries: SourceStaffEntry[] = measure.getEntriesPerStaff(staffIndex);\n for (let idx: number = 0, len2: number = entries.length; idx < len2; ++idx) {\n const staffEntry: SourceStaffEntry = entries[idx];\n if (staffEntry.Instructions) {\n for (let idx2: number = 0, len3: number = staffEntry.Instructions.length; idx2 < len3; ++idx2) {\n const abstractNotationInstruction: AbstractNotationInstruction = staffEntry.Instructions[idx2];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n this.activeClefs[visStaffIdx] = abstractNotationInstruction;\n }\n }\n }\n }\n const lastEntry: SourceStaffEntry = measure.LastInstructionsStaffEntries[staffIndex];\n if (lastEntry) {\n const instructions: AbstractNotationInstruction[] = lastEntry.Instructions;\n for (let idx: number = 0, len3: number = instructions.length; idx < len3; ++idx) {\n const abstractNotationInstruction: AbstractNotationInstruction = instructions[idx];\n if (abstractNotationInstruction instanceof ClefInstruction) {\n this.activeClefs[visStaffIdx] = abstractNotationInstruction;\n }\n }\n }\n }\n }\n\n /**\n * Check if an extra Instruction [[Measure]] is needed.\n * @param measures\n */\n protected checkAndCreateExtraInstructionMeasure(measures: GraphicalMeasure[]): void {\n const firstStaffEntries: SourceStaffEntry[] = measures[0].parentSourceMeasure.FirstInstructionsStaffEntries;\n const visibleInstructionEntries: SourceStaffEntry[] = [];\n for (let idx: number = 0, len: number = measures.length; idx < len; ++idx) {\n const measure: GraphicalMeasure = measures[idx];\n visibleInstructionEntries.push(firstStaffEntries[measure.ParentStaff.idInMusicSheet]);\n }\n let maxMeasureWidth: number = 0;\n for (let visStaffIdx: number = 0, len: number = visibleInstructionEntries.length; visStaffIdx < len; ++visStaffIdx) {\n const sse: SourceStaffEntry = visibleInstructionEntries[visStaffIdx];\n if (!sse) {\n continue;\n }\n const instructions: AbstractNotationInstruction[] = sse.Instructions;\n let keyInstruction: KeyInstruction = undefined;\n let rhythmInstruction: RhythmInstruction = undefined;\n for (let idx2: number = 0, len2: number = instructions.length; idx2 < len2; ++idx2) {\n const instruction: AbstractNotationInstruction = instructions[idx2];\n if (instruction instanceof KeyInstruction && (instruction).Key !== this.activeKeys[visStaffIdx].Key) {\n keyInstruction = instruction;\n }\n if (instruction instanceof RhythmInstruction && (instruction) !== this.activeRhythm[visStaffIdx]) {\n rhythmInstruction = instruction;\n }\n }\n if (keyInstruction !== undefined || rhythmInstruction) {\n const measureWidth: number = this.addExtraInstructionMeasure(visStaffIdx, keyInstruction, rhythmInstruction);\n maxMeasureWidth = Math.max(maxMeasureWidth, measureWidth);\n }\n }\n if (maxMeasureWidth > 0) {\n this.currentSystemParams.systemMeasures.push({\n beginLine: SystemLinesEnum.None,\n endLine: SystemLinesEnum.None,\n });\n this.currentSystemParams.currentWidth += maxMeasureWidth;\n this.currentSystemParams.currentSystemFixWidth += maxMeasureWidth;\n }\n }\n\n protected addExtraInstructionMeasure(visStaffIdx: number, keyInstruction: KeyInstruction, rhythmInstruction: RhythmInstruction): number {\n const currentSystem: MusicSystem = this.currentSystemParams.currentSystem;\n const measures: GraphicalMeasure[] = [];\n const measure: GraphicalMeasure = MusicSheetCalculator.symbolFactory.createExtraGraphicalMeasure(currentSystem.StaffLines[visStaffIdx]);\n measures.push(measure);\n if (keyInstruction) {\n measure.addKeyAtBegin(keyInstruction, this.activeKeys[visStaffIdx], this.activeClefs[visStaffIdx]);\n }\n if (rhythmInstruction !== undefined && rhythmInstruction.PrintObject) {\n measure.addRhythmAtBegin(rhythmInstruction);\n }\n measure.PositionAndShape.BorderLeft = 0.0;\n measure.PositionAndShape.BorderTop = 0.0;\n measure.PositionAndShape.BorderBottom = this.rules.StaffHeight;\n const width: number = this.rules.MeasureLeftMargin + measure.beginInstructionsWidth + this.rules.MeasureRightMargin;\n measure.PositionAndShape.BorderRight = width;\n currentSystem.StaffLines[visStaffIdx].Measures.push(measure);\n return width;\n }\n\n /**\n * Add all current vertical Measures to currentSystem.\n * @param graphicalMeasures\n */\n protected addStaveMeasuresToSystem(graphicalMeasures: GraphicalMeasure[]): void {\n if (graphicalMeasures[0]) {\n const gmeasures: GraphicalMeasure[] = [];\n for (let i: number = 0; i < graphicalMeasures.length; i++) {\n gmeasures.push(graphicalMeasures[i]);\n }\n const currentSystem: MusicSystem = this.currentSystemParams.currentSystem;\n for (let visStaffIdx: number = 0; visStaffIdx < this.numberOfVisibleStaffLines; visStaffIdx++) {\n const measure: GraphicalMeasure = gmeasures[visStaffIdx];\n currentSystem.StaffLines[visStaffIdx].Measures.push(measure);\n measure.ParentStaffLine = currentSystem.StaffLines[visStaffIdx];\n }\n currentSystem.AddGraphicalMeasures(gmeasures);\n }\n }\n\n /**\n * Return the width of the corresponding [[SystemLine]] and set the corresponding [[SystemLineEnum]].\n * @returns {SystemLinesEnum}\n */\n protected getMeasureStartLine(): SystemLinesEnum {\n const thisMeasureBeginsLineRep: boolean = this.thisMeasureBeginsLineRepetition();\n if (thisMeasureBeginsLineRep) {\n const isSystemStartMeasure: boolean = this.currentSystemParams.IsSystemStartMeasure();\n const isGlobalFirstMeasure: boolean = this.measureListIndex === 0;\n if (this.previousMeasureEndsLineRepetition() && !isSystemStartMeasure) {\n return SystemLinesEnum.DotsBoldBoldDots;\n }\n if (!isGlobalFirstMeasure) {\n return SystemLinesEnum.BoldThinDots;\n }\n }\n return SystemLinesEnum.None;\n }\n\n protected getMeasureEndLine(): SystemLinesEnum {\n let sourceMeasure: SourceMeasure = undefined;\n try {\n sourceMeasure = this.measureList[this.measureListIndex][0].parentSourceMeasure;\n } finally {\n // do nothing\n }\n\n if (this.nextMeasureBeginsLineRepetition() && this.thisMeasureEndsLineRepetition()) {\n return SystemLinesEnum.DotsBoldBoldDots;\n }\n if (this.thisMeasureEndsLineRepetition()) {\n return SystemLinesEnum.DotsThinBold;\n }\n // always end piece with final barline: not a good idea. user should be able to override final barline.\n // also, selecting range of measures to draw would always end with final barline, even if extract is from the middle of the piece\n // this was probably done before we parsed the barline type from XML.\n /*if (this.measureListIndex === this.measureList.length - 1 || this.measureList[this.measureListIndex][0].parentSourceMeasure.endsPiece) {\n return SystemLinesEnum.ThinBold;\n }*/\n if (this.nextMeasureHasKeyInstructionChange() || this.thisMeasureEndsWordRepetition() || this.nextMeasureBeginsWordRepetition()) {\n return SystemLinesEnum.DoubleThin;\n }\n if (!sourceMeasure) {\n return SystemLinesEnum.SingleThin;\n }\n if (sourceMeasure.endingBarStyleEnum !== undefined) {\n return sourceMeasure.endingBarStyleEnum;\n }\n // TODO: print an error message if the default fallback is used.\n return SystemLinesEnum.SingleThin;\n }\n\n /**\n * Return the width of the corresponding [[SystemLine]] and sets the corresponding [[SystemLineEnum]].\n * @param measure\n * @param systemLineEnum\n * @param isSystemStartMeasure\n * @returns {number}\n */\n protected getLineWidth(measure: GraphicalMeasure, systemLineEnum: SystemLinesEnum, isSystemStartMeasure: boolean): number {\n let width: number = measure.getLineWidth(systemLineEnum);\n if (systemLineEnum === SystemLinesEnum.DotsBoldBoldDots) {\n width /= 2;\n }\n if (isSystemStartMeasure && systemLineEnum === SystemLinesEnum.BoldThinDots) {\n width += this.rules.DistanceBetweenLastInstructionAndRepetitionBarline;\n }\n return width;\n }\n\n protected previousMeasureEndsLineRepetition(): boolean {\n if (this.measureListIndex === 0) {\n return false;\n }\n for (let idx: number = 0, len: number = this.measureList[this.measureListIndex - 1].length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.measureList[this.measureListIndex - 1][idx];\n if (measure.endsWithLineRepetition()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if at this [[Measure]] starts a [[Repetition]].\n * @returns {boolean}\n */\n protected thisMeasureBeginsLineRepetition(): boolean {\n for (let idx: number = 0, len: number = this.measureList[this.measureListIndex].length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.measureList[this.measureListIndex][idx];\n if (measure.beginsWithLineRepetition()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if a [[Repetition]] starts at the next [[Measure]].\n * @returns {boolean}\n */\n protected nextMeasureBeginsLineRepetition(): boolean {\n const nextMeasureIndex: number = this.measureListIndex + 1;\n if (nextMeasureIndex >= this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length\n || !this.measureList[nextMeasureIndex]) {\n return false;\n }\n for (let idx: number = 0, len: number = this.measureList[nextMeasureIndex].length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.measureList[nextMeasureIndex][idx];\n if (measure.beginsWithLineRepetition()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if this [[Measure]] is a [[Repetition]] ending.\n * @returns {boolean}\n */\n protected thisMeasureEndsLineRepetition(): boolean {\n for (let idx: number = 0, len: number = this.measureList[this.measureListIndex].length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.measureList[this.measureListIndex][idx];\n if (measure.endsWithLineRepetition()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if a [[Repetition]] starts at the next [[Measure]].\n * @returns {boolean}\n */\n protected nextMeasureBeginsWordRepetition(): boolean {\n const nextMeasureIndex: number = this.measureListIndex + 1;\n if (nextMeasureIndex >= this.graphicalMusicSheet.ParentMusicSheet.SourceMeasures.length ||\n nextMeasureIndex > this.measureList.length - 1) {\n return false;\n }\n for (let idx: number = 0, len: number = this.measureList[nextMeasureIndex].length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.measureList[nextMeasureIndex][idx];\n if (measure.beginsWithWordRepetition()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if this [[Measure]] is a [[Repetition]] ending.\n * @returns {boolean}\n */\n protected thisMeasureEndsWordRepetition(): boolean {\n for (let idx: number = 0, len: number = this.measureList[this.measureListIndex].length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.measureList[this.measureListIndex][idx];\n if (measure.endsWithWordRepetition()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if the next [[Measure]] has a [[KeyInstruction]] change.\n * @returns {boolean}\n */\n protected nextMeasureHasKeyInstructionChange(): boolean {\n return this.getNextMeasureKeyInstruction() !== undefined;\n }\n\n protected getNextMeasureKeyInstruction(): KeyInstruction {\n if (this.measureListIndex < this.measureList.length - 1) {\n for (let visIndex: number = 0; visIndex < this.measureList[this.measureListIndex].length; visIndex++) {\n const sourceMeasure: SourceMeasure = this.measureList[this.measureListIndex + 1][visIndex].parentSourceMeasure;\n if (!sourceMeasure) {\n return undefined;\n }\n return sourceMeasure.getKeyInstruction(this.visibleStaffIndices[visIndex]);\n }\n }\n return undefined;\n }\n\n /**\n * Calculate the X ScalingFactor in order to strech the whole System.\n * @param systemFixWidth\n * @param systemVarWidth\n * @returns {number}\n */\n protected calculateXScalingFactor(systemFixWidth: number, systemVarWidth: number): number {\n if (Math.abs(systemVarWidth - 0) < 0.00001 || Math.abs(systemFixWidth - 0) < 0.00001) {\n return 1.0;\n }\n let systemEndX: number;\n const currentSystem: MusicSystem = this.currentSystemParams.currentSystem;\n systemEndX = currentSystem.StaffLines[0].PositionAndShape.Size.width;\n const scalingFactor: number = (systemEndX - systemFixWidth) / systemVarWidth;\n return scalingFactor;\n }\n\n /**\n * Stretch the whole System so that no white space is left at the end.\n * @param systemEndsPart\n */\n protected stretchMusicSystem(systemEndsPart: boolean): void {\n let scalingFactor: number = this.calculateXScalingFactor(\n this.currentSystemParams.currentSystemFixWidth, this.currentSystemParams.currentSystemVarWidth\n );\n if (systemEndsPart) {\n scalingFactor = Math.min(scalingFactor, this.rules.LastSystemMaxScalingFactor);\n }\n const currentSystem: MusicSystem = this.currentSystemParams.currentSystem;\n for (let visStaffIdx: number = 0, len: number = currentSystem.StaffLines.length; visStaffIdx < len; ++visStaffIdx) {\n const staffLine: StaffLine = currentSystem.StaffLines[visStaffIdx];\n let currentXPosition: number = 0.0;\n for (let measureIndex: number = 0; measureIndex < staffLine.Measures.length; measureIndex++) {\n const measure: GraphicalMeasure = staffLine.Measures[measureIndex];\n measure.setPositionInStaffline(currentXPosition);\n measure.setWidth(measure.beginInstructionsWidth + measure.minimumStaffEntriesWidth * scalingFactor + measure.endInstructionsWidth);\n if (measureIndex < this.currentSystemParams.systemMeasures.length) {\n const startLine: SystemLinesEnum = this.currentSystemParams.systemMeasures[measureIndex].beginLine;\n const lineWidth: number = measure.getLineWidth(SystemLinesEnum.BoldThinDots);\n switch (startLine) {\n case SystemLinesEnum.BoldThinDots:\n let xPosition: number = currentXPosition;\n if (measureIndex === 0) {\n xPosition = currentXPosition + measure.beginInstructionsWidth - lineWidth;\n }\n\n currentSystem.createVerticalLineForMeasure(xPosition, lineWidth, startLine, SystemLinePosition.MeasureBegin, measureIndex, measure);\n break;\n default:\n }\n }\n measure.staffEntriesScaleFactor = scalingFactor;\n measure.layoutSymbols();\n const nextMeasureHasRepStartLine: boolean = measureIndex + 1 < this.currentSystemParams.systemMeasures.length\n && this.currentSystemParams.systemMeasures[measureIndex + 1].beginLine === SystemLinesEnum.BoldThinDots;\n if (!nextMeasureHasRepStartLine) {\n let endLine: SystemLinesEnum = SystemLinesEnum.SingleThin;\n if (measureIndex < this.currentSystemParams.systemMeasures.length) {\n endLine = this.currentSystemParams.systemMeasures[measureIndex].endLine;\n }\n const lineWidth: number = measure.getLineWidth(endLine);\n let xPos: number = measure.PositionAndShape.RelativePosition.x + measure.PositionAndShape.BorderRight - lineWidth;\n if (endLine === SystemLinesEnum.DotsBoldBoldDots) {\n xPos -= lineWidth / 2;\n }\n currentSystem.createVerticalLineForMeasure(xPos, lineWidth, endLine, SystemLinePosition.MeasureEnd, measureIndex, measure);\n }\n currentXPosition = measure.PositionAndShape.RelativePosition.x + measure.PositionAndShape.BorderRight;\n }\n }\n if (systemEndsPart) {\n this.decreaseMusicSystemBorders();\n }\n }\n\n /**\n * If the last [[MusicSystem]] doesn't need stretching, then this method decreases the System's Width,\n * the [[StaffLine]]'s Width and the 5 [[StaffLine]]s length.\n */\n protected decreaseMusicSystemBorders(): void {\n const currentSystem: MusicSystem = this.currentSystemParams.currentSystem;\n const bb: BoundingBox = CollectionUtil.last(currentSystem.StaffLines[0].Measures).PositionAndShape;\n const width: number = bb.RelativePosition.x + bb.Size.width;\n for (let idx: number = 0, len: number = currentSystem.StaffLines.length; idx < len; ++idx) {\n const staffLine: StaffLine = currentSystem.StaffLines[idx];\n staffLine.PositionAndShape.BorderRight = width;\n for (let idx2: number = 0, len2: number = staffLine.StaffLines.length; idx2 < len2; ++idx2) {\n const graphicalLine: GraphicalLine = staffLine.StaffLines[idx2];\n graphicalLine.End = new PointF2D(width, graphicalLine.End.y);\n }\n }\n currentSystem.PositionAndShape.BorderRight = width + this.currentSystemParams.maxLabelLength + this.rules.SystemLabelsRightMargin;\n }\n\n /**\n * This method updates the System's StaffLine's RelativePosition (starting from the given index).\n * @param musicSystem\n * @param index\n * @param value\n */\n protected updateStaffLinesRelativePosition(musicSystem: MusicSystem, index: number, value: number): void {\n for (let i: number = index; i < musicSystem.StaffLines.length; i++) {\n musicSystem.StaffLines[i].PositionAndShape.RelativePosition.y = value;\n }\n\n musicSystem.PositionAndShape.BorderBottom += value;\n }\n\n /**\n * Create a new [[GraphicalMusicPage]]\n * (for now only one long page is used per music sheet, as we scroll down and have no page flips)\n * @returns {GraphicalMusicPage}\n */\n protected createMusicPage(): GraphicalMusicPage {\n const page: GraphicalMusicPage = new GraphicalMusicPage(this.graphicalMusicSheet);\n this.graphicalMusicSheet.MusicPages.push(page);\n page.PageNumber = this.graphicalMusicSheet.MusicPages.length; // caution: page number = page index + 1\n page.PositionAndShape.BorderLeft = 0.0;\n page.PositionAndShape.BorderRight = this.graphicalMusicSheet.ParentMusicSheet.pageWidth;\n page.PositionAndShape.BorderTop = 0.0;\n page.PositionAndShape.BorderBottom = this.rules.PageHeight;\n page.PositionAndShape.RelativePosition = new PointF2D(0.0, 0.0);\n return page;\n }\n\n protected addSystemToPage(page: GraphicalMusicPage, system: MusicSystem): void {\n page.MusicSystems.push(system);\n system.Parent = page;\n }\n\n /**\n * This method checks the distances between any two consecutive StaffLines of a System and if needed, shifts the lower one down.\n * @param musicSystem\n */\n protected optimizeDistanceBetweenStaffLines(musicSystem: MusicSystem): void {\n // don't perform any y-spacing in case of a StaffEntryLink (in both StaffLines)\n if (!musicSystem.checkStaffEntriesForStaffEntryLink()) {\n for (let i: number = 0; i < musicSystem.StaffLines.length - 1; i++) {\n const upperBottomLine: number[] = musicSystem.StaffLines[i].BottomLine;\n const lowerSkyLine: number[] = musicSystem.StaffLines[i + 1].SkyLine;\n // 1. Find maximum required space for sky bottom line touching each other\n let maxDistance: number = 0;\n for (let j: number = 0; j < upperBottomLine.length; j++) {\n const bottomLineValue: number = upperBottomLine[j];\n\n // look at a range of +/- 2 Units to also ensure that objects are also not too close in x-direction:\n const startIdx: number = Math.max(0, j - 6);\n const endIdx: number = Math.min(lowerSkyLine.length - 1, j + 6);\n let skylineValue: number = 0;\n for (let lowerIdx: number = startIdx; lowerIdx <= endIdx; lowerIdx++) {\n skylineValue = Math.min(skylineValue, lowerSkyLine[lowerIdx]);\n }\n\n const distance: number = bottomLineValue - skylineValue;\n maxDistance = Math.max(distance, maxDistance);\n }\n // 2. Add user defined distance between sky bottom line\n maxDistance += this.rules.MinSkyBottomDistBetweenStaves;\n // 3. Take the maximum between previous value and user defined value for staff line minimum distance\n maxDistance = Math.max(maxDistance, this.rules.StaffHeight + this.rules.MinimumStaffLineDistance);\n const lowerStafflineYPos: number = maxDistance + musicSystem.StaffLines[i].PositionAndShape.RelativePosition.y;\n this.updateStaffLinesRelativePosition(musicSystem, i + 1, lowerStafflineYPos);\n }\n }\n const firstStaffLine: StaffLine = musicSystem.StaffLines[0];\n musicSystem.PositionAndShape.BorderTop = firstStaffLine.PositionAndShape.RelativePosition.y + firstStaffLine.PositionAndShape.BorderTop;\n const lastStaffLine: StaffLine = musicSystem.StaffLines[musicSystem.StaffLines.length - 1];\n musicSystem.PositionAndShape.BorderBottom = lastStaffLine.PositionAndShape.RelativePosition.y + lastStaffLine.PositionAndShape.BorderBottom;\n }\n\n /** Calculates the relative Positions of all MusicSystems.\n *\n */\n protected calculateMusicSystemsRelativePositions(): void {\n let currentPage: GraphicalMusicPage = this.createMusicPage();\n let currentYPosition: number = 0;\n // xPosition is always fixed\n let currentSystem: MusicSystem = this.musicSystems[0];\n let timesPageCouldntFitSingleSystem: number = 0;\n\n for (let i: number = 0; i < this.musicSystems.length; i++) {\n currentSystem = this.musicSystems[i];\n if (currentPage.MusicSystems.length === 0) {\n // if this is the first system on the current page:\n // take top margins into account\n this.addSystemToPage(currentPage, currentSystem);\n if (this.rules.CompactMode) {\n currentYPosition = this.rules.PageTopMarginNarrow;\n } else {\n currentYPosition = this.rules.PageTopMargin;\n }\n\n // if it is the first System on the FIRST page: Add Title height and gap-distance\n if (this.graphicalMusicSheet.MusicPages.length === 1 &&\n this.rules.RenderTitle) {\n currentYPosition += this.rules.TitleTopDistance + this.rules.SheetTitleHeight +\n this.rules.TitleBottomDistance;\n }\n // now add the border-top: everything that stands out above the staffline:\n currentYPosition += -currentSystem.PositionAndShape.BorderTop;\n const relativePosition: PointF2D = new PointF2D(this.rules.PageLeftMargin + this.rules.SystemLeftMargin,\n currentYPosition);\n currentSystem.PositionAndShape.RelativePosition = relativePosition;\n // check if the first system doesn't even fit on the page -> would lead to truncation at bottom end:\n if (currentYPosition + currentSystem.PositionAndShape.BorderBottom > this.rules.PageHeight - this.rules.PageBottomMargin) {\n // can't fit single system on page, maybe PageFormat too small\n timesPageCouldntFitSingleSystem++;\n if (timesPageCouldntFitSingleSystem <= 4) { // only warn once with detailed info\n console.log(`warning: could not fit a single system on page ${currentPage.PageNumber}` +\n ` and measure number ${currentSystem.GraphicalMeasures[0][0].MeasureNumber}.\n The PageFormat may be too small for this sheet.\"\n Will not give further warnings for all pages, only total.`\n );\n }\n }\n } else {\n // if this is not the first system on the page:\n // find optimum distance between Systems\n const previousSystem: MusicSystem = this.musicSystems[i - 1];\n const prevSystemLastStaffline: StaffLine = previousSystem.StaffLines[previousSystem.StaffLines.length - 1];\n const prevSystemLastStaffLineBB: BoundingBox = prevSystemLastStaffline.PositionAndShape;\n let distance: number = this.findReqiredDistanceWithSkyBottomLine(previousSystem, currentSystem);\n\n // make sure the optical distance is the user-defined min distance:\n distance += this.rules.MinSkyBottomDistBetweenSystems;\n\n distance = Math.max(distance, this.rules.MinimumDistanceBetweenSystems + prevSystemLastStaffline.StaffHeight);\n const newYPosition: number = currentYPosition +\n prevSystemLastStaffLineBB.RelativePosition.y +\n distance;\n\n // calculate the needed height for placing the current system on the page,\n // to see if it still fits:\n const currSystemBottomYPos: number = newYPosition +\n currentSystem.PositionAndShape.BorderMarginBottom;\n const doXmlPageBreak: boolean = this.rules.NewPageAtXMLNewPageAttribute && previousSystem.breaksPage;\n if (!doXmlPageBreak &&\n (currSystemBottomYPos < this.rules.PageHeight - this.rules.PageBottomMargin)) {\n // enough space on this page:\n this.addSystemToPage(currentPage, currentSystem);\n currentYPosition = newYPosition;\n const relativePosition: PointF2D = new PointF2D(this.rules.PageLeftMargin + this.rules.SystemLeftMargin,\n currentYPosition);\n currentSystem.PositionAndShape.RelativePosition = relativePosition;\n } else {\n // new page needed:\n currentPage = this.createMusicPage();\n // re-check this system again:\n i -= 1;\n continue;\n }\n }\n }\n if (timesPageCouldntFitSingleSystem > 0) {\n console.log(`total amount of pages that couldn't fit a single music system: ${timesPageCouldntFitSingleSystem} of ${currentPage.PageNumber}`);\n }\n }\n\n /**\n * Finds the minimum required distance between two systems\n * with the help of the sky- and bottom lines\n * @param upperSystem\n * @param lowerSystem\n */\n private findReqiredDistanceWithSkyBottomLine(upperSystem: MusicSystem, lowerSystem: MusicSystem): number {\n const upperSystemLastStaffLine: StaffLine = upperSystem.StaffLines[upperSystem.StaffLines.length - 1];\n const lowerSystemFirstStaffLine: StaffLine = lowerSystem.StaffLines[0];\n const upperBottomLineArray: number[] = upperSystemLastStaffLine.BottomLine;\n const lowerSkyLineArray: number[] = lowerSystemFirstStaffLine.SkyLine;\n const upperStaffLineBB: BoundingBox = upperSystemLastStaffLine.PositionAndShape;\n const lowerStaffLineBB: BoundingBox = lowerSystemFirstStaffLine.PositionAndShape;\n const skylinePixelWidth: number = 1 / this.rules.SamplingUnit;\n // Find maximum required space for sky and bottom line touching each other\n let maxDistance: number = 0;\n for (let upperIdx: number = 0; upperIdx < upperBottomLineArray.length; upperIdx++) {\n const bottomLineValue: number = upperBottomLineArray[upperIdx];\n // find index of the same x-position in lower skyline:\n const lowerCenterIdx: number = upperIdx +\n Math.round((upperStaffLineBB.RelativePosition.x - lowerStaffLineBB.RelativePosition.x) * skylinePixelWidth);\n if (lowerCenterIdx < 0) {\n // should actually not happen..\n continue;\n }\n if (lowerCenterIdx >= lowerSkyLineArray.length) {\n // lower system ends earlier x-wise than upper system (e.g. at last system, if it is not stretched)\n break;\n }\n\n // look at a range of +/- 2 Units to also ensure that objects are also not too close in x-direction:\n const startIdx: number = Math.max(0, lowerCenterIdx - 6);\n const endIdx: number = Math.min(lowerSkyLineArray.length - 1, lowerCenterIdx + 6);\n let skylineValue: number = 0;\n for (let lowerIdx: number = startIdx; lowerIdx <= endIdx; lowerIdx++) {\n skylineValue = Math.min(skylineValue, lowerSkyLineArray[lowerIdx]);\n }\n\n const distance: number = bottomLineValue - skylineValue;\n maxDistance = Math.max(distance, maxDistance);\n }\n\n if (maxDistance === 0) {\n // can only happen when the bottom- and skyline have no x-overlap at all:\n // fall back to borders:\n maxDistance = upperStaffLineBB.BorderBottom - lowerStaffLineBB.BorderTop;\n }\n\n return maxDistance;\n }\n}\n\nexport class SystemBuildParameters {\n public currentSystem: MusicSystem;\n public systemMeasures: MeasureBuildParameters[] = [];\n public systemMeasureIndex: number = 0;\n public currentWidth: number = 0;\n public currentSystemFixWidth: number = 0;\n public currentSystemVarWidth: number = 0;\n public maxLabelLength: number = 0;\n\n public IsSystemStartMeasure(): boolean {\n return this.systemMeasureIndex === 0;\n }\n}\n\nexport class MeasureBuildParameters {\n public beginLine: SystemLinesEnum;\n public endLine: SystemLinesEnum;\n}\n","import {GraphicalObject} from \"./GraphicalObject\";\n\nexport class Clickable extends GraphicalObject {\n public dataObject: Object;\n}\n","import {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {OctaveShift} from \"../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\n\nexport class OctaveShiftParams {\n\n constructor(openOctaveShift: OctaveShift, absoluteStartTimestamp: Fraction, absoluteEndTimestamp: Fraction) {\n this.getOpenOctaveShift = openOctaveShift;\n this.getAbsoluteStartTimestamp = absoluteStartTimestamp;\n this.getAbsoluteEndTimestamp = absoluteEndTimestamp;\n }\n\n public getOpenOctaveShift: OctaveShift;\n public getAbsoluteStartTimestamp: Fraction;\n public getAbsoluteEndTimestamp: Fraction;\n\n}\n","import {AccidentalEnum} from \"../../Common/DataObjects/Pitch\";\nimport {KeyInstruction} from \"../VoiceData/Instructions/KeyInstruction\";\nimport {GraphicalNote} from \"./GraphicalNote\";\nimport {Pitch} from \"../../Common/DataObjects/Pitch\";\nimport {NoteEnum} from \"../../Common/DataObjects/Pitch\";\nimport Dictionary from \"typescript-collections/dist/lib/Dictionary\";\nimport { MusicSheetCalculator } from \"./MusicSheetCalculator\";\n\n/**\n * Compute the accidentals for notes according to the current key instruction\n */\nexport class AccidentalCalculator {\n private keySignatureNoteAlterationsDict: Dictionary = new Dictionary();\n private currentAlterationsComparedToKeyInstructionList: number[] = [];\n private currentInMeasureNoteAlterationsDict: Dictionary = new Dictionary();\n private activeKeyInstruction: KeyInstruction;\n\n public get ActiveKeyInstruction(): KeyInstruction {\n return this.activeKeyInstruction;\n }\n\n public set ActiveKeyInstruction(value: KeyInstruction) {\n this.activeKeyInstruction = value;\n this.reactOnKeyInstructionChange();\n }\n\n /**\n * This method is called after each Measure\n * It clears the in-measure alterations dict for the next measure\n * and pre-loads with the alterations of the key signature\n */\n public doCalculationsAtEndOfMeasure(): void {\n this.currentInMeasureNoteAlterationsDict.clear();\n for (const key of this.keySignatureNoteAlterationsDict.keys()) {\n this.currentInMeasureNoteAlterationsDict.setValue(key, this.keySignatureNoteAlterationsDict.getValue(key));\n }\n }\n\n public checkAccidental(graphicalNote: GraphicalNote, pitch: Pitch): void {\n if (!pitch) {\n return;\n }\n const pitchKey: number = pitch.FundamentalNote + pitch.Octave * 12;\n /*let pitchKeyGivenInMeasureDict: boolean = this.currentInMeasureNoteAlterationsDict.containsKey(pitchKey);\n if (\n (pitchKeyGivenInMeasureDict && this.currentInMeasureNoteAlterationsDict.getValue(pitchKey) !== pitch.Accidental)\n || (!pitchKeyGivenInMeasureDict && pitch.Accidental !== AccidentalEnum.NONE)\n ) {\n if (this.currentAlterationsComparedToKeyInstructionList.indexOf(pitchKey) === -1) {\n this.currentAlterationsComparedToKeyInstructionList.push(pitchKey);\n }\n this.currentInMeasureNoteAlterationsDict.setValue(pitchKey, pitch.Accidental);\n this.symbolFactory.addGraphicalAccidental(graphicalNote, pitch);\n } else if (\n this.currentAlterationsComparedToKeyInstructionList.indexOf(pitchKey) !== -1\n && ((pitchKeyGivenInMeasureDict && this.currentInMeasureNoteAlterationsDict.getValue(pitchKey) !== pitch.Accidental)\n || (!pitchKeyGivenInMeasureDict && pitch.Accidental === AccidentalEnum.NONE))\n ) {\n this.currentAlterationsComparedToKeyInstructionList.splice(this.currentAlterationsComparedToKeyInstructionList.indexOf(pitchKey), 1);\n this.currentInMeasureNoteAlterationsDict.setValue(pitchKey, pitch.Accidental);\n this.symbolFactory.addGraphicalAccidental(graphicalNote, pitch);\n }*/\n\n const isInCurrentAlterationsToKeyList: boolean = this.currentAlterationsComparedToKeyInstructionList.indexOf(pitchKey) >= 0;\n if (this.currentInMeasureNoteAlterationsDict.containsKey(pitchKey)) {\n if (isInCurrentAlterationsToKeyList) {\n this.currentAlterationsComparedToKeyInstructionList.splice(this.currentAlterationsComparedToKeyInstructionList.indexOf(pitchKey), 1);\n }\n if (this.currentInMeasureNoteAlterationsDict.getValue(pitchKey) !== pitch.AccidentalHalfTones) {\n if (this.keySignatureNoteAlterationsDict.containsKey(pitchKey) &&\n this.keySignatureNoteAlterationsDict.getValue(pitchKey) !== pitch.AccidentalHalfTones) {\n this.currentAlterationsComparedToKeyInstructionList.push(pitchKey);\n this.currentInMeasureNoteAlterationsDict.setValue(pitchKey, pitch.AccidentalHalfTones);\n } else {\n this.currentInMeasureNoteAlterationsDict.remove(pitchKey);\n }\n\n if (pitch.Accidental === AccidentalEnum.NONE) {\n // If an AccidentalEnum.NONE is given, it would not be rendered.\n // We need here to convert to a AccidentalEnum.NATURAL:\n pitch = new Pitch(pitch.FundamentalNote, pitch.Octave, AccidentalEnum.NATURAL);\n }\n MusicSheetCalculator.symbolFactory.addGraphicalAccidental(graphicalNote, pitch);\n }\n } else { // pitchkey not in measure dict:\n if (pitch.Accidental !== AccidentalEnum.NONE) {\n if (!isInCurrentAlterationsToKeyList) {\n this.currentAlterationsComparedToKeyInstructionList.push(pitchKey);\n }\n this.currentInMeasureNoteAlterationsDict.setValue(pitchKey, pitch.AccidentalHalfTones);\n MusicSheetCalculator.symbolFactory.addGraphicalAccidental(graphicalNote, pitch);\n } else {\n if (isInCurrentAlterationsToKeyList) {\n // we need here a AccidentalEnum.NATURAL now to get it rendered - AccidentalEnum.NONE would not be rendered\n pitch = new Pitch(pitch.FundamentalNote, pitch.Octave, AccidentalEnum.NATURAL);\n this.currentAlterationsComparedToKeyInstructionList.splice(this.currentAlterationsComparedToKeyInstructionList.indexOf(pitchKey), 1);\n MusicSheetCalculator.symbolFactory.addGraphicalAccidental(graphicalNote, pitch);\n }\n }\n }\n }\n\n private reactOnKeyInstructionChange(): void {\n const noteEnums: NoteEnum[] = this.activeKeyInstruction.AlteratedNotes;\n let keyAccidentalType: AccidentalEnum;\n if (this.activeKeyInstruction.Key > 0) {\n keyAccidentalType = AccidentalEnum.SHARP;\n } else {\n keyAccidentalType = AccidentalEnum.FLAT;\n }\n this.keySignatureNoteAlterationsDict.clear();\n this.currentAlterationsComparedToKeyInstructionList.length = 0;\n for (let octave: number = -9; octave < 9; octave++) {\n for (let i: number = 0; i < noteEnums.length; i++) {\n this.keySignatureNoteAlterationsDict.setValue(noteEnums[i] + octave * 12, Pitch.HalfTonesFromAccidental(keyAccidentalType));\n }\n }\n this.doCalculationsAtEndOfMeasure();\n }\n}\n","import {PlacementEnum, AbstractExpression} from \"./AbstractExpression\";\nimport {MultiTempoExpression} from \"./MultiTempoExpression\";\n\nexport abstract class AbstractTempoExpression extends AbstractExpression {\n\n constructor(label: string, placement: PlacementEnum, staffNumber: number, parentMultiTempoExpression: MultiTempoExpression) {\n super(placement);\n this.label = label;\n this.staffNumber = staffNumber;\n this.parentMultiTempoExpression = parentMultiTempoExpression;\n }\n\n protected label: string;\n protected staffNumber: number;\n protected parentMultiTempoExpression: MultiTempoExpression;\n\n public get Label(): string {\n return this.label;\n }\n public set Label(value: string) {\n this.label = value;\n }\n public get Placement(): PlacementEnum {\n return this.placement;\n }\n public set Placement(value: PlacementEnum) {\n this.placement = value;\n }\n public get StaffNumber(): number {\n return this.staffNumber;\n }\n public set StaffNumber(value: number) {\n this.staffNumber = value;\n }\n public get ParentMultiTempoExpression(): MultiTempoExpression {\n return this.parentMultiTempoExpression;\n }\n\n protected static isStringInStringList(wordsToFind: string[], inputString: string): boolean {\n for (const wordToFind of wordsToFind) {\n if (AbstractTempoExpression.stringContainsSeparatedWord(inputString.toLowerCase().trim(), wordToFind.toLowerCase().trim())) {\n return true;\n }\n }\n return false;\n }\n private static stringContainsSeparatedWord(str: string, word: string): boolean {\n return (str === word || str.indexOf(\" \" + word) !== -1 || str.indexOf(word + \" \") !== -1);\n }\n\n}\n","\nimport { StaffLine } from \"./StaffLine\";\nimport { GraphicalLabel } from \"./GraphicalLabel\";\nimport { AbstractGraphicalExpression } from \"./AbstractGraphicalExpression\";\nimport { PlacementEnum, AbstractExpression } from \"../VoiceData/Expressions/AbstractExpression\";\nimport { MultiExpression } from \"../VoiceData/Expressions/MultiExpression\";\nimport { SkyBottomLineCalculator } from \"./SkyBottomLineCalculator\";\nimport log from \"loglevel\";\nimport { SourceMeasure } from \"../VoiceData/SourceMeasure\";\n\nexport class GraphicalUnknownExpression extends AbstractGraphicalExpression {\n public sourceMultiExpression: MultiExpression;\n\n constructor(staffLine: StaffLine, label: GraphicalLabel, placement: PlacementEnum, measure: SourceMeasure,\n sourceMultiExpression: MultiExpression = undefined) {\n super(staffLine, new AbstractExpression(placement), measure);\n this.label = label;\n this.sourceMultiExpression = sourceMultiExpression;\n }\n\n public updateSkyBottomLine(): void {\n // update Sky-BottomLine\n const skyBottomLineCalculator: SkyBottomLineCalculator = this.parentStaffLine.SkyBottomLineCalculator;\n const left: number = this.label.PositionAndShape.RelativePosition.x + this.label.PositionAndShape.BorderMarginLeft;\n const right: number = this.label.PositionAndShape.RelativePosition.x + this.label.PositionAndShape.BorderMarginRight;\n switch (this.Placement) {\n case PlacementEnum.Above:\n const yValueAbove: number = this.label.PositionAndShape.BorderMarginTop + this.label.PositionAndShape.RelativePosition.y;\n skyBottomLineCalculator.updateSkyLineInRange(left, right, yValueAbove);\n break;\n case PlacementEnum.Below:\n const yValueBelow: number = this.label.PositionAndShape.BorderMarginBottom + this.label.PositionAndShape.RelativePosition.y;\n skyBottomLineCalculator.updateBottomLineInRange(left, right, yValueBelow);\n break;\n default:\n log.error(\"Placement for GraphicalUnknownExpression is unknown\");\n }\n }\n}\n","import { MusicSheetCalculator } from \"../MusicSheetCalculator\";\nimport { VexFlowGraphicalSymbolFactory } from \"./VexFlowGraphicalSymbolFactory\";\nimport { GraphicalMeasure } from \"../GraphicalMeasure\";\nimport { StaffLine } from \"../StaffLine\";\nimport { VoiceEntry } from \"../../VoiceData/VoiceEntry\";\nimport { GraphicalNote } from \"../GraphicalNote\";\nimport { GraphicalStaffEntry } from \"../GraphicalStaffEntry\";\nimport { GraphicalTie } from \"../GraphicalTie\";\nimport { Tie } from \"../../VoiceData/Tie\";\nimport { SourceMeasure } from \"../../VoiceData/SourceMeasure\";\nimport { MultiExpression } from \"../../VoiceData/Expressions/MultiExpression\";\nimport { RepetitionInstruction } from \"../../VoiceData/Instructions/RepetitionInstruction\";\nimport { Beam } from \"../../VoiceData/Beam\";\nimport { ClefInstruction } from \"../../VoiceData/Instructions/ClefInstruction\";\nimport { OctaveEnum, OctaveShift } from \"../../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport { Fraction } from \"../../../Common/DataObjects/Fraction\";\nimport { LyricWord } from \"../../VoiceData/Lyrics/LyricsWord\";\nimport { OrnamentContainer } from \"../../VoiceData/OrnamentContainer\";\nimport { ArticulationEnum } from \"../../VoiceData/VoiceEntry\";\nimport { Tuplet } from \"../../VoiceData/Tuplet\";\nimport { VexFlowMeasure } from \"./VexFlowMeasure\";\nimport { VexFlowTextMeasurer } from \"./VexFlowTextMeasurer\";\nimport Vex from \"vexflow\";\nimport log from \"loglevel\";\nimport { unitInPixels } from \"./VexFlowMusicSheetDrawer\";\nimport { VexFlowGraphicalNote } from \"./VexFlowGraphicalNote\";\nimport { TechnicalInstruction } from \"../../VoiceData/Instructions/TechnicalInstruction\";\nimport { GraphicalLyricEntry } from \"../GraphicalLyricEntry\";\nimport { GraphicalLabel } from \"../GraphicalLabel\";\nimport { LyricsEntry } from \"../../VoiceData/Lyrics/LyricsEntry\";\nimport { GraphicalLyricWord } from \"../GraphicalLyricWord\";\nimport { VexFlowStaffEntry } from \"./VexFlowStaffEntry\";\nimport { VexFlowOctaveShift } from \"./VexFlowOctaveShift\";\nimport { VexFlowInstantaneousDynamicExpression } from \"./VexFlowInstantaneousDynamicExpression\";\nimport { Slur } from \"../../VoiceData/Expressions/ContinuousExpressions/Slur\";\n/* VexFlow Version - for later use\n// import { VexFlowSlur } from \"./VexFlowSlur\";\n// import { VexFlowStaffLine } from \"./VexFlowStaffLine\";\n// import { VexFlowVoiceEntry } from \"./VexFlowVoiceEntry\";\n*/\nimport { PointF2D } from \"../../../Common/DataObjects/PointF2D\";\nimport { TextAlignmentEnum, TextAlignment } from \"../../../Common/Enums/TextAlignment\";\nimport { GraphicalSlur } from \"../GraphicalSlur\";\nimport { BoundingBox } from \"../BoundingBox\";\nimport { ContinuousDynamicExpression } from \"../../VoiceData/Expressions/ContinuousExpressions/ContinuousDynamicExpression\";\nimport { VexFlowContinuousDynamicExpression } from \"./VexFlowContinuousDynamicExpression\";\nimport { InstantaneousTempoExpression } from \"../../VoiceData/Expressions\";\nimport { AlignRestOption } from \"../../../OpenSheetMusicDisplay\";\nimport { VexFlowStaffLine } from \"./VexFlowStaffLine\";\nimport { EngravingRules } from \"../EngravingRules\";\nimport { VexflowStafflineNoteCalculator } from \"./VexflowStafflineNoteCalculator\";\n\nexport class VexFlowMusicSheetCalculator extends MusicSheetCalculator {\n /** space needed for a dash for lyrics spacing, calculated once */\n private dashSpace: number;\n public beamsNeedUpdate: boolean = false;\n\n constructor(rules: EngravingRules) {\n super();\n this.rules = rules;\n MusicSheetCalculator.symbolFactory = new VexFlowGraphicalSymbolFactory();\n MusicSheetCalculator.TextMeasurer = new VexFlowTextMeasurer(this.rules);\n MusicSheetCalculator.stafflineNoteCalculator = new VexflowStafflineNoteCalculator(this.rules);\n }\n\n protected clearRecreatedObjects(): void {\n super.clearRecreatedObjects();\n MusicSheetCalculator.stafflineNoteCalculator = new VexflowStafflineNoteCalculator(this.rules);\n for (const graphicalMeasures of this.graphicalMusicSheet.MeasureList) {\n for (const graphicalMeasure of graphicalMeasures) {\n (graphicalMeasure).clean();\n }\n }\n }\n\n protected formatMeasures(): void {\n // let totalFinalizeBeamsTime: number = 0;\n for (const verticalMeasureList of this.graphicalMusicSheet.MeasureList) {\n const firstMeasure: VexFlowMeasure = verticalMeasureList[0] as VexFlowMeasure;\n // first measure has formatting method as lambda function object, but formats all measures. TODO this could be refactored\n firstMeasure.format();\n for (const measure of verticalMeasureList) {\n for (const staffEntry of measure.staffEntries) {\n (staffEntry).calculateXPosition();\n }\n // const t0: number = performance.now();\n if (this.beamsNeedUpdate) { // finalizeBeams takes a few milliseconds, so we can save some performance here\n (measure as VexFlowMeasure).finalizeBeams(); // without this, when zooming a lot (e.g. 250%), beams keep their old, now wrong slope.\n // totalFinalizeBeamsTime += performance.now() - t0;\n // console.log(\"Total calls to finalizeBeams in VexFlowMusicSheetCalculator took \" + totalFinalizeBeamsTime + \" milliseconds.\");\n }\n }\n }\n this.beamsNeedUpdate = false;\n }\n\n //protected clearSystemsAndMeasures(): void {\n // for (let measure of measures) {\n //\n // }\n //}\n\n /**\n * Calculates the x layout of the staff entries within the staff measures belonging to one source measure.\n * All staff entries are x-aligned throughout all vertically aligned staff measures.\n * This method is called within calculateXLayout.\n * The staff entries are aligned with minimum needed x distances.\n * The MinimumStaffEntriesWidth of every measure will be set - needed for system building.\n * Prepares the VexFlow formatter for later formatting\n * Does not calculate measure width from lyrics (which is called from MusicSheetCalculator)\n * @param measures\n * @returns the minimum required x width of the source measure (=list of staff measures)\n */\n protected calculateMeasureXLayout(measures: GraphicalMeasure[]): number {\n const visibleMeasures: GraphicalMeasure[] = [];\n for (const measure of measures) {\n visibleMeasures.push(measure);\n }\n measures = visibleMeasures;\n\n // Format the voices\n const allVoices: Vex.Flow.Voice[] = [];\n const formatter: Vex.Flow.Formatter = new Vex.Flow.Formatter();\n\n for (const measure of measures) {\n const mvoices: { [voiceID: number]: Vex.Flow.Voice; } = (measure as VexFlowMeasure).vfVoices;\n const voices: Vex.Flow.Voice[] = [];\n for (const voiceID in mvoices) {\n if (mvoices.hasOwnProperty(voiceID)) {\n voices.push(mvoices[voiceID]);\n allVoices.push(mvoices[voiceID]);\n }\n }\n\n if (voices.length === 0) {\n log.debug(\"Found a measure with no voices. Continuing anyway.\", mvoices);\n // no need to log this, measures with no voices/notes are fine. see OSMDOptions.fillEmptyMeasuresWithWholeRest\n continue;\n }\n // all voices that belong to one stave are collectively added to create a common context in VexFlow.\n formatter.joinVoices(voices);\n }\n\n let minStaffEntriesWidth: number = 12; // a typical measure has roughly a length of 3*StaffHeight (3*4 = 12)\n if (allVoices.length > 0) {\n // FIXME: The following ``+ 5.0'' is temporary: it was added as a workaround for\n // FIXME: a more relaxed formatting of voices\n minStaffEntriesWidth = formatter.preCalculateMinTotalWidth(allVoices) / unitInPixels + 5.0;\n // firstMeasure.formatVoices = (w: number) => {\n // formatter.format(allVoices, w);\n // };\n MusicSheetCalculator.setMeasuresMinStaffEntriesWidth(measures, minStaffEntriesWidth);\n\n const formatVoicesDefault: (w: number) => void = (w) => {\n formatter.format(allVoices, w);\n };\n const formatVoicesAlignRests: (w: number) => void = (w) => {\n formatter.format(allVoices, w, {\n align_rests: true,\n context: undefined\n });\n };\n\n for (const measure of measures) {\n // determine whether to align rests\n if (this.rules.AlignRests === AlignRestOption.Never) {\n (measure as VexFlowMeasure).formatVoices = formatVoicesDefault;\n } else if (this.rules.AlignRests === AlignRestOption.Always) {\n (measure as VexFlowMeasure).formatVoices = formatVoicesAlignRests;\n } else if (this.rules.AlignRests === AlignRestOption.Auto) {\n let alignRests: boolean = false;\n for (const staffEntry of measure.staffEntries) {\n let collidableVoiceEntries: number = 0;\n let numberOfRests: number = 0;\n for (const voiceEntry of staffEntry.graphicalVoiceEntries) {\n if (!voiceEntry.parentVoiceEntry.IsGrace) {\n if (voiceEntry && voiceEntry.notes && voiceEntry.notes[0] && voiceEntry.notes[0].sourceNote) {// TODO null chaining, TS 3.7\n if (voiceEntry.notes[0].sourceNote.PrintObject) { // only respect collision when not invisible\n collidableVoiceEntries++;\n }\n }\n }\n if (voiceEntry && voiceEntry.notes && voiceEntry.notes[0] && voiceEntry.notes[0].sourceNote) {// TODO null chaining, TS 3.7\n if (voiceEntry.notes[0].sourceNote.isRest() && voiceEntry.notes[0].sourceNote.PrintObject) {\n numberOfRests++; // only align rests if there is actually a rest (which could collide)\n }\n }\n if (collidableVoiceEntries > 1 && numberOfRests >= 1) {\n // TODO could add further checks like if any of the already checked voice entries actually collide\n alignRests = true;\n break;\n }\n }\n if (alignRests) {\n break;\n }\n }\n\n // set measure's format function\n if (alignRests) {\n (measure as VexFlowMeasure).formatVoices = formatVoicesAlignRests;\n } else {\n (measure as VexFlowMeasure).formatVoices = formatVoicesDefault;\n }\n }\n\n // format first measure with minimum width\n if (measure === measures[0]) {\n const vexflowMeasure: VexFlowMeasure = (measure as VexFlowMeasure);\n // prepare format function for voices, will be called later for formatting measure again\n //vexflowMeasure.formatVoices = formatVoicesDefault;\n\n // format now for minimum width, calculateMeasureWidthFromLyrics later\n vexflowMeasure.formatVoices(minStaffEntriesWidth * unitInPixels);\n } else {\n //(measure as VexFlowMeasure).formatVoices = undefined;\n // TODO why was the formatVoices function disabled for other measures? would now disable the new align rests option.\n }\n }\n }\n\n for (const graphicalMeasure of measures) {\n for (const staffEntry of graphicalMeasure.staffEntries) {\n // here the measure modifiers are not yet set, therefore the begin instruction width will be empty\n (staffEntry).calculateXPosition();\n }\n }\n // calculateMeasureWidthFromLyrics() will be called from MusicSheetCalculator after this\n return minStaffEntriesWidth;\n }\n\n public calculateMeasureWidthFromLyrics(measuresVertical: GraphicalMeasure[], oldMinimumStaffEntriesWidth: number): number {\n let elongationFactorForMeasureWidth: number = 1;\n\n // information we need for the previous lyricsEntries to space the current one\n interface LyricEntryInfo {\n extend: boolean;\n labelWidth: number;\n lyricsXPosition: number;\n sourceNoteDuration: Fraction;\n text: string;\n measureNumber: number;\n }\n // holds lyrics entries for verses i\n interface LyricEntryDict {\n [i: number]: LyricEntryInfo;\n }\n\n for (const measure of measuresVertical) {\n const lastLyricEntryDict: LyricEntryDict = {}; // holds info about last lyrics entries for all verses j\n\n // for all staffEntries i, each containing the lyric entry for all verses at that timestamp in the measure\n for (let i: number = 0; i < measure.staffEntries.length; i++) {\n const staffEntry: GraphicalStaffEntry = measure.staffEntries[i];\n if (staffEntry.LyricsEntries.length === 0) {\n continue;\n }\n // for all verses j\n for (let j: number = 0; j < staffEntry.LyricsEntries.length; j++) {\n const lyricsEntry: GraphicalLyricEntry = staffEntry.LyricsEntries[j];\n // const lyricsEntryText = lyricsEntry.LyricsEntry.Text; // for easier debugging\n const lyricAlignment: TextAlignmentEnum = lyricsEntry.GraphicalLabel.Label.textAlignment;\n let minLyricsSpacing: number = this.rules.HorizontalBetweenLyricsDistance;\n // for quarter note in Vexflow, where spacing is halfed for each smaller note duration.\n\n let lyricOverlapAllowedIntoNextMeasure: number =\n this.rules.LyricOverlapAllowedIntoNextMeasure;\n // TODO allow more overlap if there are no lyrics in next measure\n\n // spacing for multi-syllable words\n if (lyricsEntry.ParentLyricWord) {\n if (lyricsEntry.LyricsEntry.SyllableIndex > 0) { // syllables after first\n // give a little more spacing for dash between syllables\n minLyricsSpacing = this.rules.BetweenSyllableMinimumDistance;\n if (TextAlignment.IsCenterAligned(lyricsEntry.GraphicalLabel.Label.textAlignment)) {\n minLyricsSpacing += 1.0; // TODO check for previous lyric alignment too. though center is not standard\n // without this, there's not enough space for dashes between long syllables on eigth notes\n }\n }\n const syllables: LyricsEntry[] = lyricsEntry.ParentLyricWord.GetLyricWord.Syllables;\n if (syllables.length > 1) {\n if (lyricsEntry.LyricsEntry.SyllableIndex < syllables.length - 1) {\n // if a middle syllable of a word, give less measure overlap into next measure, to give room for dash\n if (this.dashSpace === undefined) { // don't replace undefined check\n this.dashSpace = 1.5;\n // better method, doesn't work:\n // this.dashLength = new GraphicalLabel(new Label(\"-\"), this.rules.LyricsHeight, TextAlignmentEnum.CenterBottom)\n // .PositionAndShape.Size.width; // always returns 0\n }\n lyricOverlapAllowedIntoNextMeasure -= this.dashSpace;\n }\n }\n }\n\n const lyricsBbox: BoundingBox = lyricsEntry.GraphicalLabel.PositionAndShape;\n const lyricsLabelWidth: number = lyricsBbox.Size.width;\n const staffEntryXPosition: number = (staffEntry as VexFlowStaffEntry).PositionAndShape.RelativePosition.x;\n const lyricsXPosition: number = staffEntryXPosition + lyricsBbox.BorderMarginLeft;\n\n if (lastLyricEntryDict[j]) {\n if (lastLyricEntryDict[j].extend) {\n // TODO handle extend of last entry (extend is stored in lyrics entry of preceding syllable)\n // only necessary for center alignment\n }\n }\n\n let spacingNeededToLastLyric: number;\n let currentSpacingToLastLyric: number; // undefined for first lyric in measure\n if (lastLyricEntryDict[j]) {\n currentSpacingToLastLyric = lyricsXPosition - lastLyricEntryDict[j].lyricsXPosition;\n }\n\n let currentSpacingToMeasureEnd: number;\n let spacingNeededToMeasureEnd: number;\n const maxXInMeasure: number = oldMinimumStaffEntriesWidth * elongationFactorForMeasureWidth;\n\n // when the lyrics are centered, we need to consider spacing differently than when they are left-aligned:\n if (TextAlignment.IsCenterAligned(lyricAlignment)) {\n lyricOverlapAllowedIntoNextMeasure /= 4; // reserve space for overlap from next measure. its first note can't be spaced.\n currentSpacingToMeasureEnd = maxXInMeasure - lyricsXPosition;\n spacingNeededToMeasureEnd = (lyricsLabelWidth / 2) - lyricOverlapAllowedIntoNextMeasure;\n // spacing to last lyric only done if not first lyric in measure:\n if (lastLyricEntryDict[j]) {\n spacingNeededToLastLyric =\n lastLyricEntryDict[j].labelWidth / 2 + lyricsLabelWidth / 2 + minLyricsSpacing;\n }\n } else if (TextAlignment.IsLeft(lyricAlignment)) {\n currentSpacingToMeasureEnd = maxXInMeasure - lyricsXPosition;\n spacingNeededToMeasureEnd = lyricsLabelWidth - lyricOverlapAllowedIntoNextMeasure;\n if (lastLyricEntryDict[j]) {\n spacingNeededToLastLyric = lastLyricEntryDict[j].labelWidth + minLyricsSpacing;\n }\n }\n\n // get factor of how much we need to stretch the measure to space the current lyric\n let elongationFactorForMeasureWidthForCurrentLyric: number = 1;\n const elongationFactorNeededForMeasureEnd: number =\n spacingNeededToMeasureEnd / currentSpacingToMeasureEnd;\n let elongationFactorNeededForLastLyric: number = 1;\n if (lastLyricEntryDict[j]) { // if previous lyric needs more spacing than measure end, take that spacing\n const lastNoteDuration: Fraction = lastLyricEntryDict[j].sourceNoteDuration;\n elongationFactorNeededForLastLyric = spacingNeededToLastLyric / currentSpacingToLastLyric;\n if (lastNoteDuration.Denominator > 4) {\n elongationFactorNeededForLastLyric *= 1.1; // from 1.2 upwards, this unnecessarily bloats shorter measures\n // spacing in Vexflow depends on note duration, our minSpacing is calibrated for quarter notes\n // if we double the measure length, the distance between eigth notes only gets half of the added length\n // compared to a quarter note.\n }\n }\n elongationFactorForMeasureWidthForCurrentLyric = Math.max(\n elongationFactorNeededForMeasureEnd,\n elongationFactorNeededForLastLyric\n );\n\n elongationFactorForMeasureWidth = Math.max(\n elongationFactorForMeasureWidth,\n elongationFactorForMeasureWidthForCurrentLyric\n );\n\n // set up information about this lyric entry of verse j for next lyric entry of verse j\n lastLyricEntryDict[j] = {\n extend: lyricsEntry.LyricsEntry.extend,\n labelWidth: lyricsLabelWidth,\n lyricsXPosition: lyricsXPosition,\n measureNumber: measure.MeasureNumber,\n sourceNoteDuration: lyricsEntry.LyricsEntry.Parent.Notes[0].Length,\n text: lyricsEntry.LyricsEntry.Text,\n };\n }\n }\n }\n return oldMinimumStaffEntriesWidth * elongationFactorForMeasureWidth;\n }\n\n protected createGraphicalTie(tie: Tie, startGse: GraphicalStaffEntry, endGse: GraphicalStaffEntry,\n startNote: GraphicalNote, endNote: GraphicalNote): GraphicalTie {\n return new GraphicalTie(tie, startNote, endNote);\n }\n\n\n protected updateStaffLineBorders(staffLine: StaffLine): void {\n staffLine.SkyBottomLineCalculator.updateStaffLineBorders();\n }\n\n protected graphicalMeasureCreatedCalculations(measure: GraphicalMeasure): void {\n (measure as VexFlowMeasure).rules = this.rules;\n (measure as VexFlowMeasure).graphicalMeasureCreatedCalculations();\n }\n\n /**\n * Can be used to calculate articulations, stem directions, helper(ledger) lines, and overlapping note x-displacement.\n * Is Excecuted per voice entry of a staff entry.\n * After that layoutStaffEntry is called.\n * @param voiceEntry\n * @param graphicalNotes\n * @param graphicalStaffEntry\n * @param hasPitchedNote\n */\n protected layoutVoiceEntry(voiceEntry: VoiceEntry, graphicalNotes: GraphicalNote[], graphicalStaffEntry: GraphicalStaffEntry,\n hasPitchedNote: boolean): void {\n return;\n }\n\n /**\n * Do all layout calculations that have to be done per staff entry, like dots, ornaments, arpeggios....\n * This method is called after the voice entries are handled by layoutVoiceEntry().\n * @param graphicalStaffEntry\n */\n protected layoutStaffEntry(graphicalStaffEntry: GraphicalStaffEntry): void {\n (graphicalStaffEntry.parentMeasure as VexFlowMeasure).layoutStaffEntry(graphicalStaffEntry);\n }\n\n /**\n * Is called at the begin of the method for creating the vertically aligned staff measures belonging to one source measure.\n */\n protected initGraphicalMeasuresCreation(): void {\n return;\n }\n\n /**\n * add here all given articulations to the VexFlowGraphicalStaffEntry and prepare them for rendering.\n * @param articulations\n * @param voiceEntry\n * @param graphicalStaffEntry\n */\n protected layoutArticulationMarks(articulations: ArticulationEnum[], voiceEntry: VoiceEntry, graphicalStaffEntry: GraphicalStaffEntry): void {\n // uncomment this when implementing:\n // let vfse: VexFlowStaffEntry = (graphicalStaffEntry as VexFlowStaffEntry);\n\n return;\n }\n\n /**\n * Calculate the shape (Bezier curve) for this tie.\n * @param tie\n * @param tieIsAtSystemBreak\n */\n protected layoutGraphicalTie(tie: GraphicalTie, tieIsAtSystemBreak: boolean): void {\n const startNote: VexFlowGraphicalNote = (tie.StartNote as VexFlowGraphicalNote);\n const endNote: VexFlowGraphicalNote = (tie.EndNote as VexFlowGraphicalNote);\n\n let vfStartNote: Vex.Flow.StaveNote = undefined;\n let startNoteIndexInTie: number = 0;\n if (startNote && startNote.vfnote && startNote.vfnote.length >= 2) {\n vfStartNote = startNote.vfnote[0];\n startNoteIndexInTie = startNote.vfnote[1];\n }\n\n let vfEndNote: Vex.Flow.StaveNote = undefined;\n let endNoteIndexInTie: number = 0;\n if (endNote && endNote.vfnote && endNote.vfnote.length >= 2) {\n vfEndNote = endNote.vfnote[0];\n endNoteIndexInTie = endNote.vfnote[1];\n }\n\n if (tieIsAtSystemBreak) {\n // split tie into two ties:\n if (vfStartNote) { // first_note or last_note must be not null in Vexflow\n const vfTie1: Vex.Flow.StaveTie = new Vex.Flow.StaveTie({\n first_indices: [startNoteIndexInTie],\n first_note: vfStartNote\n });\n const measure1: VexFlowMeasure = (startNote.parentVoiceEntry.parentStaffEntry.parentMeasure as VexFlowMeasure);\n measure1.vfTies.push(vfTie1);\n }\n\n if (vfEndNote) {\n const vfTie2: Vex.Flow.StaveTie = new Vex.Flow.StaveTie({\n last_indices: [endNoteIndexInTie],\n last_note: vfEndNote\n });\n const measure2: VexFlowMeasure = (endNote.parentVoiceEntry.parentStaffEntry.parentMeasure as VexFlowMeasure);\n measure2.vfTies.push(vfTie2);\n }\n } else {\n // normal case\n if (vfStartNote || vfEndNote) { // one of these must be not null in Vexflow\n const vfTie: Vex.Flow.StaveTie = new Vex.Flow.StaveTie({\n first_indices: [startNoteIndexInTie],\n first_note: vfStartNote,\n last_indices: [endNoteIndexInTie],\n last_note: vfEndNote\n });\n const measure: VexFlowMeasure = (endNote.parentVoiceEntry.parentStaffEntry.parentMeasure as VexFlowMeasure);\n measure.vfTies.push(vfTie);\n }\n }\n }\n\n protected calculateDynamicExpressionsForMultiExpression(multiExpression: MultiExpression, measureIndex: number, staffIndex: number): void {\n if (measureIndex < this.rules.MinMeasureToDrawIndex || measureIndex > this.rules.MaxMeasureToDrawIndex) {\n return;\n // we do already use the min/max in MusicSheetCalculator.calculateDynamicsExpressions,\n // but this may be necessary for StaffLinkedExpressions, not tested.\n }\n\n // calculate absolute Timestamp\n const absoluteTimestamp: Fraction = multiExpression.AbsoluteTimestamp;\n const measures: GraphicalMeasure[] = this.graphicalMusicSheet.MeasureList[measureIndex];\n const staffLine: StaffLine = measures[staffIndex].ParentStaffLine;\n const startMeasure: GraphicalMeasure = measures[staffIndex];\n\n const startPosInStaffline: PointF2D = this.getRelativePositionInStaffLineFromTimestamp(\n absoluteTimestamp,\n staffIndex,\n staffLine,\n staffLine?.isPartOfMultiStaffInstrument());\n\n const dynamicStartPosition: PointF2D = startPosInStaffline;\n if (startPosInStaffline.x <= 0) {\n dynamicStartPosition.x = startMeasure.beginInstructionsWidth + this.rules.RhythmRightMargin;\n }\n\n if (multiExpression.InstantaneousDynamic) {\n const graphicalInstantaneousDynamic: VexFlowInstantaneousDynamicExpression = new VexFlowInstantaneousDynamicExpression(\n multiExpression.InstantaneousDynamic,\n staffLine,\n startMeasure);\n this.calculateGraphicalInstantaneousDynamicExpression(graphicalInstantaneousDynamic, dynamicStartPosition);\n }\n if (multiExpression.StartingContinuousDynamic) {\n const continuousDynamic: ContinuousDynamicExpression = multiExpression.StartingContinuousDynamic;\n const graphicalContinuousDynamic: VexFlowContinuousDynamicExpression = new VexFlowContinuousDynamicExpression(\n multiExpression.StartingContinuousDynamic,\n staffLine,\n startMeasure.parentSourceMeasure);\n graphicalContinuousDynamic.StartMeasure = startMeasure;\n\n if (!graphicalContinuousDynamic.IsVerbal && continuousDynamic.EndMultiExpression) {\n try {\n this.calculateGraphicalContinuousDynamic(graphicalContinuousDynamic, dynamicStartPosition);\n } catch (e) {\n // TODO this sometimes fails when the measure range to draw doesn't include all the dynamic's measures, method needs to be adjusted\n // see calculateGraphicalContinuousDynamic(), also in MusicSheetCalculator.\n\n }\n } else if (graphicalContinuousDynamic.IsVerbal) {\n this.calculateGraphicalVerbalContinuousDynamic(graphicalContinuousDynamic, dynamicStartPosition);\n } else {\n log.warn(\"This continuous dynamic is not covered\");\n }\n }\n }\n\n protected createMetronomeMark(metronomeExpression: InstantaneousTempoExpression): void {\n const vfStave: Vex.Flow.Stave = (this.graphicalMusicSheet.MeasureList[0][0] as VexFlowMeasure).getVFStave();\n //vfStave.addModifier(new Vex.Flow.StaveTempo( // needs Vexflow PR\n vfStave.setTempo(\n {\n bpm: metronomeExpression.TempoInBpm,\n dots: metronomeExpression.dotted,\n //duration: metronomeExpression.beatUnit\n duration: \"q\"\n },\n this.rules.MetronomeMarkYShift * unitInPixels);\n // -50, -30), 0); //needs Vexflow PR\n //.setShiftX(-50);\n\n (vfStave.getModifiers()[vfStave.getModifiers().length - 1]).setShiftX(\n this.rules.MetronomeMarkXShift * unitInPixels\n );\n // TODO calculate bounding box of metronome mark instead of hacking skyline to fix lyricist collision\n const skyline: number[] = this.graphicalMusicSheet.MeasureList[0][0].ParentStaffLine.SkyLine;\n skyline[0] = Math.min(skyline[0], -4.5 + this.rules.MetronomeMarkYShift);\n // somehow this is called repeatedly in Clementi, so skyline[0] = Math.min instead of -=\n }\n\n /**\n * Calculate a single OctaveShift for a [[MultiExpression]].\n * @param sourceMeasure\n * @param multiExpression\n * @param measureIndex\n * @param staffIndex\n */\n protected calculateSingleOctaveShift(sourceMeasure: SourceMeasure, multiExpression: MultiExpression, measureIndex: number, staffIndex: number): void {\n // calculate absolute Timestamp and startStaffLine (and EndStaffLine if needed)\n const octaveShift: OctaveShift = multiExpression.OctaveShiftStart;\n\n const startTimeStamp: Fraction = octaveShift.ParentStartMultiExpression.Timestamp;\n const endTimeStamp: Fraction = octaveShift.ParentEndMultiExpression?.Timestamp;\n\n const minMeasureToDrawIndex: number = this.rules.MinMeasureToDrawIndex;\n const maxMeasureToDrawIndex: number = this.rules.MaxMeasureToDrawIndex;\n\n let startStaffLine: StaffLine = this.graphicalMusicSheet.MeasureList[measureIndex][staffIndex].ParentStaffLine;\n if (!startStaffLine) { // fix for rendering range set. all of these can probably done cleaner.\n startStaffLine = this.graphicalMusicSheet.MeasureList[minMeasureToDrawIndex][staffIndex].ParentStaffLine;\n }\n\n let endMeasure: GraphicalMeasure = undefined;\n if (octaveShift.ParentEndMultiExpression) {\n endMeasure = this.graphicalMusicSheet.getGraphicalMeasureFromSourceMeasureAndIndex(octaveShift.ParentEndMultiExpression.SourceMeasureParent,\n staffIndex);\n } else {\n endMeasure = this.graphicalMusicSheet.getLastGraphicalMeasureFromIndex(staffIndex, true); // get last rendered measure\n }\n if (endMeasure.MeasureNumber > maxMeasureToDrawIndex + 1) { // octaveshift ends in measure not rendered\n endMeasure = this.graphicalMusicSheet.getLastGraphicalMeasureFromIndex(staffIndex, true);\n }\n let startMeasure: GraphicalMeasure = undefined;\n if (octaveShift.ParentEndMultiExpression) {\n startMeasure = this.graphicalMusicSheet.getGraphicalMeasureFromSourceMeasureAndIndex(octaveShift.ParentStartMultiExpression.SourceMeasureParent,\n staffIndex);\n } else {\n startMeasure = this.graphicalMusicSheet.MeasureList[minMeasureToDrawIndex][staffIndex]; // first rendered measure\n }\n if (startMeasure.MeasureNumber < minMeasureToDrawIndex + 1) { // octaveshift starts before range of measures selected to render\n startMeasure = this.graphicalMusicSheet.MeasureList[minMeasureToDrawIndex][staffIndex]; // first rendered measure\n }\n\n if (startMeasure.MeasureNumber < minMeasureToDrawIndex + 1 ||\n startMeasure.MeasureNumber > maxMeasureToDrawIndex + 1 ||\n endMeasure.MeasureNumber < minMeasureToDrawIndex + 1 ||\n endMeasure.MeasureNumber > maxMeasureToDrawIndex + 1) {\n // octave shift completely out of drawing range, don't draw anything\n return;\n }\n\n let endStaffLine: StaffLine = endMeasure.ParentStaffLine;\n if (!endStaffLine) {\n endStaffLine = startStaffLine;\n }\n\n if (endMeasure && startStaffLine && endStaffLine) {\n // calculate GraphicalOctaveShift and RelativePositions\n const graphicalOctaveShift: VexFlowOctaveShift = new VexFlowOctaveShift(octaveShift, startStaffLine.PositionAndShape);\n if (!graphicalOctaveShift.getStartNote()) { // fix for rendering range set\n graphicalOctaveShift.setStartNote(startMeasure.staffEntries[0]);\n }\n if (!graphicalOctaveShift.getStartNote()) { // fix for rendering range set\n graphicalOctaveShift.setEndNote(endMeasure.staffEntries.last());\n }\n startStaffLine.OctaveShifts.push(graphicalOctaveShift);\n\n // calculate RelativePosition and Dashes\n let startStaffEntry: GraphicalStaffEntry = startMeasure.findGraphicalStaffEntryFromTimestamp(startTimeStamp);\n if (!startStaffEntry) { // fix for rendering range set\n startStaffEntry = startMeasure.staffEntries[0];\n }\n let endStaffEntry: GraphicalStaffEntry = endMeasure.findGraphicalStaffEntryFromTimestamp(endTimeStamp);\n if (!endStaffEntry) { // fix for rendering range set\n endStaffEntry = endMeasure.staffEntries[endMeasure.staffEntries.length - 1];\n }\n\n graphicalOctaveShift.setStartNote(startStaffEntry);\n\n if (endStaffLine !== startStaffLine) {\n graphicalOctaveShift.endsOnDifferentStaffLine = true;\n let lastMeasure: GraphicalMeasure = startStaffLine.Measures[startStaffLine.Measures.length - 1];\n if (!lastMeasure) { // TODO handle this case correctly (when drawUpToMeasureNumber etc set)\n lastMeasure = endMeasure;\n }\n const lastNote: GraphicalStaffEntry = lastMeasure.staffEntries[lastMeasure.staffEntries.length - 1];\n graphicalOctaveShift.setEndNote(lastNote);\n\n // Now finish the shift on the next line\n const remainingOctaveShift: VexFlowOctaveShift = new VexFlowOctaveShift(octaveShift, endMeasure.PositionAndShape);\n endStaffLine.OctaveShifts.push(remainingOctaveShift);\n let firstMeasure: GraphicalMeasure = endStaffLine.Measures[0];\n if (!firstMeasure) { // TODO handle this case correctly (when drawUpToMeasureNumber etc set)\n firstMeasure = startMeasure;\n }\n const firstNote: GraphicalStaffEntry = firstMeasure.staffEntries[0];\n remainingOctaveShift.setStartNote(firstNote);\n remainingOctaveShift.setEndNote(endStaffEntry);\n this.calculateOctaveShiftSkyBottomLine(startStaffEntry, lastNote, graphicalOctaveShift, startStaffLine);\n this.calculateOctaveShiftSkyBottomLine(firstNote, endStaffEntry, remainingOctaveShift, endStaffLine);\n } else {\n graphicalOctaveShift.setEndNote(endStaffEntry);\n this.calculateOctaveShiftSkyBottomLine(startStaffEntry, endStaffEntry, graphicalOctaveShift, startStaffLine);\n }\n } else {\n log.warn(\"End measure or staffLines for octave shift are undefined! This should not happen!\");\n }\n }\n\n private calculateOctaveShiftSkyBottomLine(startStaffEntry: GraphicalStaffEntry, endStaffEntry: GraphicalStaffEntry,\n vfOctaveShift: VexFlowOctaveShift, parentStaffline: StaffLine): void {\n\n const startX: number = startStaffEntry.PositionAndShape.AbsolutePosition.x - startStaffEntry.PositionAndShape.Size.width / 2;\n const stopX: number = endStaffEntry.PositionAndShape.AbsolutePosition.x + endStaffEntry.PositionAndShape.Size.width / 2;\n vfOctaveShift.PositionAndShape.Size.width = startX - stopX;\n const textBracket: Vex.Flow.TextBracket = vfOctaveShift.getTextBracket();\n const fontSize: number = (textBracket as any).font.size / 10;\n\n if ((textBracket).position === Vex.Flow.TextBracket.Positions.TOP) {\n const headroom: number = Math.ceil(parentStaffline.SkyBottomLineCalculator.getSkyLineMinInRange(startX, stopX));\n if (headroom === Infinity) { // will cause Vexflow error\n return;\n }\n (textBracket.start.getStave().options as any).top_text_position = Math.abs(headroom);\n parentStaffline.SkyBottomLineCalculator.updateSkyLineInRange(startX, stopX, headroom - fontSize * 2);\n } else {\n const footroom: number = parentStaffline.SkyBottomLineCalculator.getBottomLineMaxInRange(startX, stopX);\n if (footroom === Infinity) { // will cause Vexflow error\n return;\n }\n (textBracket.start.getStave().options as any).bottom_text_position = footroom;\n //Vexflow positions top vs. bottom text in a slightly inconsistent way it seems\n parentStaffline.SkyBottomLineCalculator.updateBottomLineInRange(startX, stopX, footroom + fontSize * 1.5);\n }\n }\n\n /**\n * Calculate all the textual and symbolic [[RepetitionInstruction]]s (e.g. dal segno) for a single [[SourceMeasure]].\n * @param repetitionInstruction\n * @param measureIndex\n */\n protected calculateWordRepetitionInstruction(repetitionInstruction: RepetitionInstruction, measureIndex: number): void {\n // find first visible StaffLine\n let uppermostMeasure: VexFlowMeasure = undefined;\n const measures: VexFlowMeasure[] = this.graphicalMusicSheet.MeasureList[measureIndex];\n for (let idx: number = 0, len: number = measures.length; idx < len; ++idx) {\n const graphicalMeasure: VexFlowMeasure = measures[idx];\n if (graphicalMeasure.ParentStaffLine && graphicalMeasure.ParentStaff.ParentInstrument.Visible) {\n uppermostMeasure = graphicalMeasure;\n break;\n }\n }\n // ToDo: feature/Repetitions\n // now create corresponding graphical symbol or Text in VexFlow:\n // use top measure and staffline for positioning.\n if (uppermostMeasure) {\n uppermostMeasure.addWordRepetition(repetitionInstruction);\n }\n }\n\n /**\n * Re-adjust the x positioning of expressions. Update the skyline afterwards\n */\n protected calculateExpressionAlignements(): void {\n for (const musicSystem of this.musicSystems) {\n for (const staffLine of musicSystem.StaffLines) {\n try {\n (staffLine).AlignmentManager.alignDynamicExpressions();\n staffLine.AbstractExpressions.forEach(ae => {\n ae.updateSkyBottomLine();\n });\n } catch (e) {\n // TODO still necessary when calculation of expression fails, see calculateDynamicExpressionsForMultiExpression()\n // see calculateGraphicalContinuousDynamic(), also in MusicSheetCalculator.\n }\n }\n }\n }\n\n\n /**\n * Check if the tied graphical note belongs to any beams or tuplets and react accordingly.\n * @param tiedGraphicalNote\n * @param beams\n * @param activeClef\n * @param octaveShiftValue\n * @param graphicalStaffEntry\n * @param duration\n * @param openTie\n * @param isLastTieNote\n */\n protected handleTiedGraphicalNote(tiedGraphicalNote: GraphicalNote, beams: Beam[], activeClef: ClefInstruction,\n octaveShiftValue: OctaveEnum, graphicalStaffEntry: GraphicalStaffEntry, duration: Fraction,\n openTie: Tie, isLastTieNote: boolean): void {\n return;\n }\n\n /**\n * Is called if a note is part of a beam.\n * @param graphicalNote\n * @param beam\n * @param openBeams a list of all currently open beams\n */\n protected handleBeam(graphicalNote: GraphicalNote, beam: Beam, openBeams: Beam[]): void {\n (graphicalNote.parentVoiceEntry.parentStaffEntry.parentMeasure as VexFlowMeasure).handleBeam(graphicalNote, beam);\n }\n\n protected handleVoiceEntryLyrics(voiceEntry: VoiceEntry, graphicalStaffEntry: GraphicalStaffEntry, lyricWords: LyricWord[]): void {\n voiceEntry.LyricsEntries.forEach((key: number, lyricsEntry: LyricsEntry) => {\n const graphicalLyricEntry: GraphicalLyricEntry = new GraphicalLyricEntry(lyricsEntry,\n graphicalStaffEntry,\n this.rules.LyricsHeight,\n this.rules.StaffHeight);\n\n graphicalStaffEntry.LyricsEntries.push(graphicalLyricEntry);\n\n // create corresponding GraphicalLabel\n const graphicalLabel: GraphicalLabel = graphicalLyricEntry.GraphicalLabel;\n graphicalLabel.setLabelPositionAndShapeBorders();\n\n if (lyricsEntry.Word) {\n const lyricsEntryIndex: number = lyricsEntry.Word.Syllables.indexOf(lyricsEntry);\n let index: number = lyricWords.indexOf(lyricsEntry.Word);\n if (index === -1) {\n lyricWords.push(lyricsEntry.Word);\n index = lyricWords.indexOf(lyricsEntry.Word);\n }\n\n if (this.graphicalLyricWords.length === 0 || index > this.graphicalLyricWords.length - 1) {\n const graphicalLyricWord: GraphicalLyricWord = new GraphicalLyricWord(lyricsEntry.Word);\n\n graphicalLyricEntry.ParentLyricWord = graphicalLyricWord;\n graphicalLyricWord.GraphicalLyricsEntries[lyricsEntryIndex] = graphicalLyricEntry;\n this.graphicalLyricWords.push(graphicalLyricWord);\n } else {\n const graphicalLyricWord: GraphicalLyricWord = this.graphicalLyricWords[index];\n\n graphicalLyricEntry.ParentLyricWord = graphicalLyricWord;\n graphicalLyricWord.GraphicalLyricsEntries[lyricsEntryIndex] = graphicalLyricEntry;\n\n if (graphicalLyricWord.isFilled()) {\n lyricWords.splice(index, 1);\n this.graphicalLyricWords.splice(this.graphicalLyricWords.indexOf(graphicalLyricWord), 1);\n }\n }\n }\n });\n }\n\n protected handleVoiceEntryOrnaments(ornamentContainer: OrnamentContainer, voiceEntry: VoiceEntry, graphicalStaffEntry: GraphicalStaffEntry): void {\n return;\n }\n\n /**\n * Add articulations to the given vexflow staff entry.\n * @param articulations\n * @param voiceEntry\n * @param graphicalStaffEntry\n */\n protected handleVoiceEntryArticulations(articulations: ArticulationEnum[],\n voiceEntry: VoiceEntry, staffEntry: GraphicalStaffEntry): void {\n // uncomment this when implementing:\n // let vfse: VexFlowStaffEntry = (graphicalStaffEntry as VexFlowStaffEntry);\n\n return;\n }\n\n /**\n * Add technical instructions to the given vexflow staff entry.\n * @param technicalInstructions\n * @param voiceEntry\n * @param staffEntry\n */\n protected handleVoiceEntryTechnicalInstructions(technicalInstructions: TechnicalInstruction[],\n voiceEntry: VoiceEntry, staffEntry: GraphicalStaffEntry): void {\n // uncomment this when implementing:\n // let vfse: VexFlowStaffEntry = (graphicalStaffEntry as VexFlowStaffEntry);\n return;\n }\n\n /**\n * Is called if a note is part of a tuplet.\n * @param graphicalNote\n * @param tuplet\n * @param openTuplets a list of all currently open tuplets\n */\n protected handleTuplet(graphicalNote: GraphicalNote, tuplet: Tuplet, openTuplets: Tuplet[]): void {\n (graphicalNote.parentVoiceEntry.parentStaffEntry.parentMeasure as VexFlowMeasure).handleTuplet(graphicalNote, tuplet);\n }\n\n /**\n * Find the Index of the item of the array of all VexFlow Slurs that holds a specified slur\n * @param gSlurs\n * @param slur\n */\n public findIndexGraphicalSlurFromSlur(gSlurs: GraphicalSlur[], slur: Slur): number {\n for (let slurIndex: number = 0; slurIndex < gSlurs.length; slurIndex++) {\n if (gSlurs[slurIndex].slur === slur) {\n return slurIndex;\n }\n }\n return -1;\n }\n /* VexFlow Version - for later use\n public findIndexVFSlurFromSlur(vfSlurs: VexFlowSlur[], slur: Slur): number {\n for (let slurIndex: number = 0; slurIndex < vfSlurs.length; slurIndex++) {\n if (vfSlurs[slurIndex].vfSlur === slur) {\n return slurIndex;\n }\n }\n }\n */\n\n // Generate all Graphical Slurs and attach them to the staffline\n protected calculateSlurs(): void {\n const openSlursDict: { [staffId: number]: GraphicalSlur[]; } = {};\n for (const graphicalMeasure of this.graphicalMusicSheet.MeasureList[0]) { //let i: number = 0; i < this.graphicalMusicSheet.MeasureList[0].length; i++) {\n openSlursDict[graphicalMeasure.ParentStaff.idInMusicSheet] = [];\n }\n\n /* VexFlow Version - for later use\n // Generate an empty dictonary to index an array of VexFlowSlur classes\n const vfOpenSlursDict: { [staffId: number]: VexFlowSlur[]; } = {}; //VexFlowSlur[]; } = {};\n // use first SourceMeasure to get all graphical measures to know how many staves are currently visible in this musicsheet\n // foreach stave: create an empty array. It can later hold open slurs.\n // Measure how many staves are visible and reserve space for them.\n for (const graphicalMeasure of this.graphicalMusicSheet.MeasureList[0]) { //let i: number = 0; i < this.graphicalMusicSheet.MeasureList[0].length; i++) {\n vfOpenSlursDict[graphicalMeasure.ParentStaff.idInMusicSheet] = [];\n }\n */\n\n for (const musicSystem of this.musicSystems) {\n for (const staffLine of musicSystem.StaffLines) {\n // if a graphical slur reaches out of the last musicsystem, we have to create another graphical slur reaching into this musicsystem\n // (one slur needs 2 graphical slurs)\n const openGraphicalSlurs: GraphicalSlur[] = openSlursDict[staffLine.ParentStaff.idInMusicSheet];\n for (let slurIndex: number = 0; slurIndex < openGraphicalSlurs.length; slurIndex++) {\n const oldGSlur: GraphicalSlur = openGraphicalSlurs[slurIndex];\n const newGSlur: GraphicalSlur = new GraphicalSlur(oldGSlur.slur); //Graphicalslur.createFromSlur(oldSlur);\n staffLine.addSlurToStaffline(newGSlur); // every VFSlur is added to the array in the VFStaffline!\n openGraphicalSlurs[slurIndex] = newGSlur;\n }\n\n /* VexFlow Version - for later use\n const vfOpenSlurs: VexFlowSlur[] = vfOpenSlursDict[staffLine.ParentStaff.idInMusicSheet];\n const vfStaffLine: VexFlowStaffLine = staffLine;\n for (let slurIndex: number = 0; slurIndex < vfOpenSlurs.length; slurIndex++) {\n const oldVFSlur: VexFlowSlur = vfOpenSlurs[slurIndex];\n const newVFSlur: VexFlowSlur = VexFlowSlur.createFromVexflowSlur(oldVFSlur);\n newVFSlur.vfStartNote = undefined;\n vfStaffLine.addVFSlurToVFStaffline(newVFSlur); // every VFSlur is added to the array in the VFStaffline!\n vfOpenSlurs[slurIndex] = newVFSlur;\n }\n */\n\n // add reference of slur array to the VexFlowStaffline class\n for (const graphicalMeasure of staffLine.Measures) {\n for (const graphicalStaffEntry of graphicalMeasure.staffEntries) {\n // loop over \"normal\" notes (= no gracenotes)\n for (const graphicalVoiceEntry of graphicalStaffEntry.graphicalVoiceEntries) {\n for (const graphicalNote of graphicalVoiceEntry.notes) {\n for (const slur of graphicalNote.sourceNote.NoteSlurs) {\n // extra check for some MusicSheets that have openSlurs (because only the first Page is available -> Recordare files)\n if (!slur.EndNote || !slur.StartNote) {\n continue;\n }\n // add new VexFlowSlur to List\n if (slur.StartNote === graphicalNote.sourceNote) {\n if (graphicalNote.sourceNote.NoteTie) {\n if (graphicalNote.parentVoiceEntry.parentStaffEntry.getAbsoluteTimestamp() !==\n graphicalNote.sourceNote.NoteTie.StartNote.getAbsoluteTimestamp()) {\n break;\n }\n }\n\n // Add a Graphical Slur to the staffline, if the recent note is the Startnote of a slur\n const gSlur: GraphicalSlur = new GraphicalSlur(slur);\n openGraphicalSlurs.push(gSlur);\n staffLine.addSlurToStaffline(gSlur);\n\n /* VexFlow Version - for later use\n const vfSlur: VexFlowSlur = new VexFlowSlur(slur);\n vfOpenSlurs.push(vfSlur); //add open... adding / removing is JUST DONE in the open... array\n vfSlur.vfStartNote = (graphicalVoiceEntry as VexFlowVoiceEntry).vfStaveNote;\n vfStaffLine.addVFSlurToVFStaffline(vfSlur); // every VFSlur is added to the array in the VFStaffline!\n */\n }\n if (slur.EndNote === graphicalNote.sourceNote) {\n // Remove the Graphical Slur from the staffline if the note is the Endnote of a slur\n const index: number = this.findIndexGraphicalSlurFromSlur(openGraphicalSlurs, slur);\n if (index >= 0) {\n // save Voice Entry in VFSlur and then remove it from array of open VFSlurs\n const gSlur: GraphicalSlur = openGraphicalSlurs[index];\n if (gSlur.staffEntries.indexOf(graphicalStaffEntry) === -1) {\n gSlur.staffEntries.push(graphicalStaffEntry);\n }\n\n openGraphicalSlurs.splice(index, 1);\n }\n\n /* VexFlow Version - for later use\n const vfIndex: number = this.findIndexVFSlurFromSlur(vfOpenSlurs, slur);\n if (vfIndex !== undefined) {\n // save Voice Entry in VFSlur and then remove it from array of open VFSlurs\n const vfSlur: VexFlowSlur = vfOpenSlurs[vfIndex];\n vfSlur.vfEndNote = (graphicalVoiceEntry as VexFlowVoiceEntry).vfStaveNote;\n vfSlur.createVexFlowCurve();\n vfOpenSlurs.splice(vfIndex, 1);\n }\n */\n }\n }\n }\n }\n\n //add the present Staffentry to all open slurs that don't contain this Staffentry already\n for (const gSlur of openGraphicalSlurs) {\n if (gSlur.staffEntries.indexOf(graphicalStaffEntry) === -1) {\n gSlur.staffEntries.push(graphicalStaffEntry);\n }\n }\n } // loop over StaffEntries\n } // loop over Measures\n } // loop over StaffLines\n\n // Attach vfSlur array to the vfStaffline to be drawn\n //vfStaffLine.SlursInVFStaffLine = vfSlurs;\n } // loop over MusicSystems\n\n // order slurs that were saved to the Staffline\n for (const musicSystem of this.musicSystems) {\n for (const staffLine of musicSystem.StaffLines) {\n // Sort all gSlurs in the staffline using the Compare function in class GraphicalSlurSorter\n const sortedGSlurs: GraphicalSlur[] = staffLine.GraphicalSlurs.sort(GraphicalSlur.Compare);\n for (const gSlur of sortedGSlurs) {\n // crossed slurs will be handled later:\n if (gSlur.slur.isCrossed()) {\n continue;\n }\n gSlur.calculateCurve(this.rules);\n }\n }\n }\n }\n }\n","import Vex from \"vexflow\";\nimport {IGraphicalSymbolFactory} from \"../../Interfaces/IGraphicalSymbolFactory\";\nimport {MusicSystem} from \"../MusicSystem\";\nimport {VexFlowMusicSystem} from \"./VexFlowMusicSystem\";\nimport {Staff} from \"../../VoiceData/Staff\";\nimport {StaffLine} from \"../StaffLine\";\nimport {SourceMeasure} from \"../../VoiceData/SourceMeasure\";\nimport {GraphicalMeasure} from \"../GraphicalMeasure\";\nimport {VexFlowMeasure} from \"./VexFlowMeasure\";\nimport {SourceStaffEntry} from \"../../VoiceData/SourceStaffEntry\";\nimport {GraphicalStaffEntry} from \"../GraphicalStaffEntry\";\nimport {VexFlowStaffEntry} from \"./VexFlowStaffEntry\";\nimport {Note} from \"../../VoiceData/Note\";\nimport {ClefInstruction} from \"../../VoiceData/Instructions/ClefInstruction\";\nimport {OctaveEnum} from \"../../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport {GraphicalNote} from \"../GraphicalNote\";\nimport {Pitch} from \"../../../Common/DataObjects/Pitch\";\nimport {VexFlowGraphicalNote} from \"./VexFlowGraphicalNote\";\nimport {Fraction} from \"../../../Common/DataObjects/Fraction\";\nimport {GraphicalChordSymbolContainer} from \"../GraphicalChordSymbolContainer\";\nimport {GraphicalLabel} from \"../GraphicalLabel\";\nimport {EngravingRules} from \"../EngravingRules\";\nimport { TechnicalInstruction } from \"../../VoiceData/Instructions/TechnicalInstruction\";\nimport { GraphicalVoiceEntry } from \"../GraphicalVoiceEntry\";\nimport { VoiceEntry } from \"../../VoiceData/VoiceEntry\";\nimport { VexFlowVoiceEntry } from \"./VexFlowVoiceEntry\";\nimport { VexFlowConverter } from \"./VexFlowConverter\";\nimport { VexFlowTabMeasure } from \"./VexFlowTabMeasure\";\nimport { VexFlowStaffLine } from \"./VexFlowStaffLine\";\nimport { KeyInstruction } from \"../../VoiceData/Instructions/KeyInstruction\";\n\nexport class VexFlowGraphicalSymbolFactory implements IGraphicalSymbolFactory {\n /**\n * Create a new music system for the given page.\n * Currently only one vertically endless page exists where all systems are put to.\n * @param page\n * @param systemIndex\n * @returns {VexFlowMusicSystem}\n */\n public createMusicSystem(systemIndex: number, rules: EngravingRules): MusicSystem {\n return new VexFlowMusicSystem(systemIndex, rules);\n }\n\n /**\n * Create a staffline object containing all staff measures belonging to a given system and staff.\n * @param parentSystem\n * @param parentStaff\n * @returns {VexFlowStaffLine}\n */\n public createStaffLine(parentSystem: MusicSystem, parentStaff: Staff): StaffLine {\n return new VexFlowStaffLine(parentSystem, parentStaff);\n }\n\n /**\n * Construct an empty graphicalMeasure from the given source measure and staff.\n * @param sourceMeasure\n * @param staff\n * @returns {VexFlowMeasure}\n */\n public createGraphicalMeasure(sourceMeasure: SourceMeasure, staff: Staff, isTabMeasure: boolean = false): GraphicalMeasure {\n return new VexFlowMeasure(staff, sourceMeasure, undefined);\n }\n\n /**\n * Construct an empty Tab staffMeasure from the given source measure and staff.\n * @param sourceMeasure\n * @param staff\n * @returns {VexFlowTabMeasure}\n */\n public createTabStaffMeasure(sourceMeasure: SourceMeasure, staff: Staff): GraphicalMeasure {\n return new VexFlowTabMeasure(staff, sourceMeasure);\n }\n\n /**\n * Create empty measure, which will be used to show key, rhythm changes at the end of the system.\n * @param staffLine\n * @returns {VexFlowMeasure}\n */\n public createExtraGraphicalMeasure(staffLine: StaffLine): GraphicalMeasure {\n return new VexFlowMeasure(staffLine.ParentStaff, undefined, staffLine);\n }\n\n /**\n * Create a staffEntry in the given measure for a given sourceStaffEntry.\n * @param sourceStaffEntry\n * @param measure\n * @returns {VexFlowStaffEntry}\n */\n public createStaffEntry(sourceStaffEntry: SourceStaffEntry, measure: GraphicalMeasure): GraphicalStaffEntry {\n return new VexFlowStaffEntry(measure, sourceStaffEntry, undefined);\n }\n\n public createVoiceEntry(parentVoiceEntry: VoiceEntry, parentStaffEntry: GraphicalStaffEntry): GraphicalVoiceEntry {\n return new VexFlowVoiceEntry(parentVoiceEntry, parentStaffEntry);\n }\n\n /**\n * Create a Graphical Note for given note and clef and as part of graphicalStaffEntry.\n * @param note\n * @param numberOfDots The number of dots the note has to increase its musical duration.\n * @param graphicalStaffEntry\n * @param activeClef The currently active clef, needed for positioning the note vertically\n * @param octaveShift The currently active octave transposition enum, needed for positioning the note vertically\n * @returns {GraphicalNote}\n */\n public createNote(note: Note, graphicalVoiceEntry: GraphicalVoiceEntry,\n activeClef: ClefInstruction, octaveShift: OctaveEnum = OctaveEnum.NONE, graphicalNoteLength: Fraction = undefined): GraphicalNote {\n // Creates and returns the note:\n return new VexFlowGraphicalNote(note, graphicalVoiceEntry, activeClef, octaveShift, graphicalNoteLength);\n }\n\n /**\n * Create a Graphical Grace Note (smaller head, stem...) for given note and clef and as part of graphicalStaffEntry.\n * @param note\n * @param numberOfDots\n * @param graphicalVoiceEntry\n * @param activeClef\n * @param octaveShift\n * @returns {GraphicalNote}\n */\n public createGraceNote(note: Note, graphicalVoiceEntry: GraphicalVoiceEntry,\n activeClef: ClefInstruction, octaveShift: OctaveEnum = OctaveEnum.NONE): GraphicalNote {\n return new VexFlowGraphicalNote(note, graphicalVoiceEntry, activeClef, octaveShift);\n }\n\n /**\n * Sets a pitch which will be used for rendering the given graphical note (not changing the original pitch of the note!!!).\n * Will be only called if the displayed accidental is different from the original (e.g. a C# with C# as key instruction)\n * @param graphicalNote\n * @param pitch The pitch which will be rendered.\n */\n public addGraphicalAccidental(graphicalNote: GraphicalNote, pitch: Pitch): void {\n const note: VexFlowGraphicalNote = (graphicalNote as VexFlowGraphicalNote);\n // accidental is added in setPitch\n note.setAccidental(pitch);\n }\n\n /**\n * Adds a Fermata symbol at the last note of the given tied Note.\n * The last graphical note of this tied note is located at the given graphicalStaffEntry.\n * A Fermata has to be located at the last tied note.\n * @param tiedNote\n * @param graphicalStaffEntry\n */\n public addFermataAtTiedEndNote(tiedNote: Note, graphicalStaffEntry: GraphicalStaffEntry): void {\n return;\n }\n\n\n\n /**\n * Adds a clef change within a measure before the given staff entry.\n * @param graphicalStaffEntry\n * @param clefInstruction\n */\n public createInStaffClef(graphicalStaffEntry: GraphicalStaffEntry, clefInstruction: ClefInstruction): void {\n const se: VexFlowStaffEntry = graphicalStaffEntry as VexFlowStaffEntry;\n const vfClefParams: { type: string, size: string, annotation: string } = VexFlowConverter.Clef(clefInstruction, \"small\");\n se.vfClefBefore = new Vex.Flow.ClefNote(vfClefParams.type, vfClefParams.size, vfClefParams.annotation);\n return;\n }\n\n /**\n * Adds a chord symbol at the given staff entry\n * @param sourceStaffEntry\n * @param graphicalStaffEntry\n * @param transposeHalftones\n */\n public createChordSymbols( sourceStaffEntry: SourceStaffEntry,\n graphicalStaffEntry: GraphicalStaffEntry,\n keyInstruction: KeyInstruction,\n transposeHalftones: number): void {\n const rules: EngravingRules = graphicalStaffEntry.parentMeasure.parentSourceMeasure.Rules;\n let xShift: number = 0;\n const chordSymbolSpacing: number = rules.ChordSymbolXSpacing;\n for (const chordSymbolContainer of sourceStaffEntry.ChordContainers) {\n const graphicalChordSymbolContainer: GraphicalChordSymbolContainer =\n new GraphicalChordSymbolContainer(chordSymbolContainer,\n graphicalStaffEntry.PositionAndShape,\n rules.ChordSymbolTextHeight,\n keyInstruction,\n transposeHalftones,\n graphicalStaffEntry.parentMeasure.parentSourceMeasure.Rules // TODO undefined sometimes\n );\n const graphicalLabel: GraphicalLabel = graphicalChordSymbolContainer.GetGraphicalLabel;\n graphicalLabel.PositionAndShape.RelativePosition.y -= rules.ChordSymbolYOffset;\n graphicalLabel.PositionAndShape.RelativePosition.x += xShift;\n // TODO check for available space until next staffEntry or chord symbol (x direction)\n graphicalLabel.setLabelPositionAndShapeBorders();\n graphicalChordSymbolContainer.PositionAndShape.calculateBoundingBox();\n graphicalStaffEntry.graphicalChordContainers.push(graphicalChordSymbolContainer);\n\n xShift += graphicalLabel.PositionAndShape.Size.width + chordSymbolSpacing;\n }\n }\n\n /**\n * Adds a technical instruction at the given staff entry.\n * @param technicalInstruction\n * @param graphicalStaffEntry\n */\n public createGraphicalTechnicalInstruction(technicalInstruction: TechnicalInstruction, graphicalStaffEntry: GraphicalStaffEntry): void {\n return;\n }\n\n}\n","import {MusicSystem} from \"../MusicSystem\";\nimport {SystemLinesEnum} from \"../SystemLinesEnum\";\nimport {SystemLinePosition} from \"../SystemLinePosition\";\nimport {GraphicalMeasure} from \"../GraphicalMeasure\";\nimport {SystemLine} from \"../SystemLine\";\nimport {VexFlowStaffLine} from \"./VexFlowStaffLine\";\nimport {VexFlowMeasure} from \"./VexFlowMeasure\";\nimport {VexFlowConverter} from \"./VexFlowConverter\";\nimport {StaffLine} from \"../StaffLine\";\nimport {EngravingRules} from \"../EngravingRules\";\nimport { VexFlowInstrumentBracket } from \"./VexFlowInstrumentBracket\";\nimport { VexFlowInstrumentBrace } from \"./VexFlowInstrumentBrace\";\nimport { SkyBottomLineCalculator } from \"../SkyBottomLineCalculator\";\n\nexport class VexFlowMusicSystem extends MusicSystem {\n constructor(id: number, rules: EngravingRules) {\n super(id);\n this.rules = rules;\n }\n\n public calculateBorders(rules: EngravingRules): void {\n if (this.staffLines.length === 0) {\n return;\n }\n const width: number = this.calcBracketsWidth();\n this.boundingBox.BorderLeft = -width;\n this.boundingBox.BorderMarginLeft = -width;\n this.boundingBox.XBordersHaveBeenSet = true;\n\n const topSkyBottomLineCalculator: SkyBottomLineCalculator = this.staffLines[0].SkyBottomLineCalculator;\n const top: number = topSkyBottomLineCalculator.getSkyLineMin();\n this.boundingBox.BorderTop = top;\n this.boundingBox.BorderMarginTop = top;\n\n const lastStaffLine: StaffLine = this.staffLines[this.staffLines.length - 1];\n const bottomSkyBottomLineCalculator: SkyBottomLineCalculator = lastStaffLine.SkyBottomLineCalculator;\n const bottom: number = bottomSkyBottomLineCalculator.getBottomLineMax()\n + lastStaffLine.PositionAndShape.RelativePosition.y;\n this.boundingBox.BorderBottom = bottom;\n this.boundingBox.BorderMarginBottom = bottom;\n\n this.boundingBox.XBordersHaveBeenSet = true;\n this.boundingBox.YBordersHaveBeenSet = true;\n }\n\n /**\n * This method creates all the graphical lines and dots needed to render a system line (e.g. bold-thin-dots..).\n * @param xPosition\n * @param lineWidth\n * @param lineType\n * @param linePosition indicates if the line belongs to start or end of measure\n * @param musicSystem\n * @param topMeasure\n * @param bottomMeasure\n */\n protected createSystemLine(xPosition: number, lineWidth: number, lineType: SystemLinesEnum, linePosition: SystemLinePosition,\n musicSystem: MusicSystem, topMeasure: GraphicalMeasure, bottomMeasure: GraphicalMeasure = undefined): SystemLine {\n const vfMeasure: VexFlowMeasure = topMeasure as VexFlowMeasure;\n vfMeasure.addMeasureLine(lineType, linePosition);\n if (bottomMeasure) {\n // ToDo: feature/Repetitions\n // create here the correct lines according to the given lineType.\n (bottomMeasure as VexFlowMeasure).lineTo(topMeasure as VexFlowMeasure, VexFlowConverter.line(lineType, linePosition));\n (bottomMeasure as VexFlowMeasure).addMeasureLine(lineType, linePosition);\n }\n return new SystemLine(lineType, linePosition, this, topMeasure, bottomMeasure);\n }\n\n /**\n * creates an instrument brace for the given dimension.\n * The height and positioning can be inferred from the given staff lines.\n * @param firstStaffLine the upper StaffLine (use a cast to get the VexFlowStaffLine) of the brace to create\n * @param lastStaffLine the lower StaffLine (use a cast to get the VexFlowStaffLine) of the brace to create\n */\n protected createInstrumentBracket(firstStaffLine: StaffLine, lastStaffLine: StaffLine): void {\n // You could write this in one line but the linter doesn't let me.\n const firstVexStaff: VexFlowStaffLine = (firstStaffLine as VexFlowStaffLine);\n const lastVexStaff: VexFlowStaffLine = (lastStaffLine as VexFlowStaffLine);\n const vexFlowBracket: VexFlowInstrumentBrace = new VexFlowInstrumentBrace(firstVexStaff, lastVexStaff);\n this.InstrumentBrackets.push(vexFlowBracket);\n return;\n }\n\n /**\n * creates an instrument group bracket for the given dimension.\n * There can be cascaded bracket (e.g. a group of 2 in a group of 4) -\n * The recursion depth informs about the current depth level (needed for positioning)\n * @param firstStaffLine the upper staff line of the bracket to create\n * @param lastStaffLine the lower staff line of the bracket to create\n * @param recursionDepth\n */\n protected createGroupBracket(firstStaffLine: StaffLine, lastStaffLine: StaffLine, recursionDepth: number): void {\n const firstVexStaff: VexFlowStaffLine = (firstStaffLine as VexFlowStaffLine);\n const lastVexStaff: VexFlowStaffLine = (lastStaffLine as VexFlowStaffLine);\n if (recursionDepth === 0) {\n const vexFlowBracket: VexFlowInstrumentBracket = new VexFlowInstrumentBracket(firstVexStaff, lastVexStaff, recursionDepth);\n this.GroupBrackets.push(vexFlowBracket);\n } else {\n const vexFlowBrace: VexFlowInstrumentBrace = new VexFlowInstrumentBrace(firstVexStaff, lastVexStaff, recursionDepth);\n this.GroupBrackets.push(vexFlowBrace);\n }\n return;\n }\n}\n","import {StaffLine} from \"./StaffLine\";\nimport {Instrument} from \"../Instrument\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\nimport {InstrumentalGroup} from \"../InstrumentalGroup\";\nimport {TextAlignmentEnum} from \"../../Common/Enums/TextAlignment\";\nimport {GraphicalMusicPage} from \"./GraphicalMusicPage\";\nimport {GraphicalLabel} from \"./GraphicalLabel\";\nimport {GraphicalMeasure} from \"./GraphicalMeasure\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {EngravingRules} from \"./EngravingRules\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\nimport {SystemLinesEnum} from \"./SystemLinesEnum\";\nimport Dictionary from \"typescript-collections/dist/lib/Dictionary\";\nimport {GraphicalComment} from \"./GraphicalComment\";\nimport {GraphicalMarkedArea} from \"./GraphicalMarkedArea\";\nimport {SystemLine} from \"./SystemLine\";\nimport {SystemLinePosition} from \"./SystemLinePosition\";\nimport {Staff} from \"../VoiceData/Staff\";\nimport { Label } from \"../Label\";\n\n/**\n * A MusicSystem contains the [[StaffLine]]s for all instruments, until a line break\n */\nexport abstract class MusicSystem extends GraphicalObject {\n public needsToBeRedrawn: boolean = true;\n public rules: EngravingRules;\n protected parent: GraphicalMusicPage;\n protected id: number;\n protected staffLines: StaffLine[] = [];\n protected graphicalMeasures: GraphicalMeasure[][] = [];\n /** Dictionary of (Instruments and) labels.\n * note that the key needs to be unique, GraphicalLabel is not unique yet.\n * That is why the labels are labels.values() and not labels.keys().\n */\n protected labels: Dictionary = new Dictionary();\n protected measureNumberLabels: GraphicalLabel[] = [];\n protected maxLabelLength: number;\n protected objectsToRedraw: [Object[], Object][] = [];\n protected instrumentBrackets: GraphicalObject[] = [];\n protected groupBrackets: GraphicalObject[] = [];\n protected graphicalMarkedAreas: GraphicalMarkedArea[] = [];\n protected graphicalComments: GraphicalComment[] = [];\n protected systemLines: SystemLine[] = [];\n public breaksPage: boolean = false;\n\n constructor(id: number) {\n super();\n this.id = id;\n this.boundingBox = new BoundingBox(this);\n this.maxLabelLength = 0.0;\n }\n\n public get Parent(): GraphicalMusicPage {\n return this.parent;\n }\n\n public set Parent(value: GraphicalMusicPage) {\n // remove from old page\n if (this.parent) {\n const index: number = this.parent.MusicSystems.indexOf(this, 0);\n if (index > -1) {\n this.parent.MusicSystems.splice(index, 1);\n }\n }\n\n this.parent = value;\n this.boundingBox.Parent = value.PositionAndShape;\n }\n\n public get NextSystem(): MusicSystem {\n const idxInParent: number = this.Parent.MusicSystems.indexOf(this);\n return idxInParent !== this.Parent.MusicSystems.length ? this.Parent.MusicSystems[idxInParent + 1] : undefined;\n }\n\n public get StaffLines(): StaffLine[] {\n return this.staffLines;\n }\n\n public get GraphicalMeasures(): GraphicalMeasure[][] {\n return this.graphicalMeasures;\n }\n\n public get MeasureNumberLabels(): GraphicalLabel[] {\n return this.measureNumberLabels;\n }\n\n public get Labels(): GraphicalLabel[] {\n return this.labels.values();\n }\n\n public get ObjectsToRedraw(): [Object[], Object][] {\n return this.objectsToRedraw;\n }\n\n public get InstrumentBrackets(): GraphicalObject[] {\n return this.instrumentBrackets;\n }\n\n public get GroupBrackets(): GraphicalObject[] {\n return this.groupBrackets;\n }\n\n public get GraphicalMarkedAreas(): GraphicalMarkedArea[] {\n return this.graphicalMarkedAreas;\n }\n\n public get GraphicalComments(): GraphicalComment[] {\n return this.graphicalComments;\n }\n\n public get SystemLines(): SystemLine[] {\n return this.systemLines;\n }\n\n public get Id(): number {\n return this.id;\n }\n\n /**\n * Create the left vertical Line connecting all staves of the [[MusicSystem]].\n * @param lineWidth\n * @param systemLabelsRightMargin\n */\n public createSystemLeftLine(lineWidth: number, systemLabelsRightMargin: number, isFirstSystem: boolean): void {\n let xPosition: number = -lineWidth / 2;\n if (isFirstSystem) {\n xPosition = this.maxLabelLength + systemLabelsRightMargin - lineWidth / 2;\n }\n const top: GraphicalMeasure = this.staffLines[0].Measures[0];\n let bottom: GraphicalMeasure = undefined;\n if (this.staffLines.length > 1) {\n bottom = this.staffLines[this.staffLines.length - 1].Measures[0];\n }\n const leftSystemLine: SystemLine = this.createSystemLine(xPosition, lineWidth, SystemLinesEnum.SingleThin,\n SystemLinePosition.MeasureBegin, this, top, bottom);\n this.SystemLines.push(leftSystemLine);\n leftSystemLine.PositionAndShape.RelativePosition = new PointF2D(xPosition, 0);\n leftSystemLine.PositionAndShape.BorderLeft = 0;\n leftSystemLine.PositionAndShape.BorderRight = lineWidth;\n leftSystemLine.PositionAndShape.BorderTop = 0;\n leftSystemLine.PositionAndShape.BorderBottom = this.boundingBox.Size.height;\n this.createLinesForSystemLine(leftSystemLine);\n }\n\n /**\n * Create the vertical Lines after the End of all [[StaffLine]]'s Measures\n * @param xPosition\n * @param lineWidth\n * @param lineType\n * @param linePosition indicates if the line belongs to start or end of measure\n * @param measureIndex the measure index within the staffline\n * @param measure\n */\n public createVerticalLineForMeasure(xPosition: number, lineWidth: number, lineType: SystemLinesEnum, linePosition: SystemLinePosition,\n measureIndex: number, measure: GraphicalMeasure): void {\n //return; // TODO check why there's a bold line here for the double barline sample\n const staffLine: StaffLine = measure.ParentStaffLine;\n const staffLineRelative: PointF2D = new PointF2D(staffLine.PositionAndShape.RelativePosition.x,\n staffLine.PositionAndShape.RelativePosition.y);\n const staves: Staff[] = staffLine.ParentStaff.ParentInstrument.Staves;\n if (staffLine.ParentStaff === staves[0]) {\n let bottomMeasure: GraphicalMeasure = undefined;\n if (staves.length > 1) {\n bottomMeasure = this.getBottomStaffLine(staffLine).Measures[measureIndex];\n }\n const singleVerticalLineAfterMeasure: SystemLine = this.createSystemLine(xPosition, lineWidth, lineType,\n linePosition, this, measure, bottomMeasure);\n const systemXPosition: number = staffLineRelative.x + xPosition;\n singleVerticalLineAfterMeasure.PositionAndShape.RelativePosition = new PointF2D(systemXPosition, 0);\n singleVerticalLineAfterMeasure.PositionAndShape.BorderLeft = 0;\n singleVerticalLineAfterMeasure.PositionAndShape.BorderRight = lineWidth;\n this.SystemLines.push(singleVerticalLineAfterMeasure);\n }\n }\n\n /**\n * Set the y-Positions of all the system lines in the system and creates the graphical Lines and dots within.\n * @param rules\n */\n public setYPositionsToVerticalLineObjectsAndCreateLines(rules: EngravingRules): void {\n // empty\n }\n\n public calculateBorders(rules: EngravingRules): void {\n // empty\n }\n\n public alignBeginInstructions(): void {\n // empty\n }\n\n public GetLeftBorderAbsoluteXPosition(): number {\n return this.StaffLines[0].PositionAndShape.AbsolutePosition.x + this.StaffLines[0].Measures[0].beginInstructionsWidth;\n }\n\n public GetRightBorderAbsoluteXPosition(): number {\n return this.StaffLines[0].PositionAndShape.AbsolutePosition.x + this.StaffLines[0].StaffLines[0].End.x;\n }\n\n public AddGraphicalMeasures(graphicalMeasures: GraphicalMeasure[]): void {\n for (let idx: number = 0, len: number = graphicalMeasures.length; idx < len; ++idx) {\n const graphicalMeasure: GraphicalMeasure = graphicalMeasures[idx];\n graphicalMeasure.ParentMusicSystem = this;\n }\n this.graphicalMeasures.push(graphicalMeasures);\n }\n\n public GetSystemsFirstTimeStamp(): Fraction {\n return this.graphicalMeasures[0][0].parentSourceMeasure.AbsoluteTimestamp;\n }\n\n public GetSystemsLastTimeStamp(): Fraction {\n const m: SourceMeasure = this.graphicalMeasures[this.graphicalMeasures.length - 1][0].parentSourceMeasure;\n return Fraction.plus(m.AbsoluteTimestamp, m.Duration);\n }\n\n /**\n * Create an InstrumentBracket for each multiStave Instrument.\n * @param instruments\n * @param staffHeight\n */\n public createInstrumentBrackets(instruments: Instrument[], staffHeight: number): void {\n for (let idx: number = 0, len: number = instruments.length; idx < len; ++idx) {\n const instrument: Instrument = instruments[idx];\n if (instrument.Staves.length > 1) {\n let firstStaffLine: StaffLine = undefined, lastStaffLine: StaffLine = undefined;\n for (let idx2: number = 0, len2: number = this.staffLines.length; idx2 < len2; ++idx2) {\n const staffLine: StaffLine = this.staffLines[idx2];\n if (staffLine.ParentStaff === instrument.Staves[0]) {\n firstStaffLine = staffLine;\n }\n if (staffLine.ParentStaff === instrument.Staves[instrument.Staves.length - 1]) {\n lastStaffLine = staffLine;\n }\n }\n if (firstStaffLine && lastStaffLine) {\n this.createInstrumentBracket(firstStaffLine, lastStaffLine);\n }\n }\n }\n }\n\n /**\n * Create a GroupBracket for an [[InstrumentalGroup]].\n * @param instrumentGroups\n * @param staffHeight\n * @param recursionDepth\n */\n public createGroupBrackets(instrumentGroups: InstrumentalGroup[], staffHeight: number, recursionDepth: number): void {\n for (let idx: number = 0, len: number = instrumentGroups.length; idx < len; ++idx) {\n const instrumentGroup: InstrumentalGroup = instrumentGroups[idx];\n if (instrumentGroup.InstrumentalGroups.length < 1) {\n continue;\n }\n const instrument1: Instrument = this.findFirstVisibleInstrumentInInstrumentalGroup(instrumentGroup);\n const instrument2: Instrument = this.findLastVisibleInstrumentInInstrumentalGroup(instrumentGroup);\n if (!instrument1 || !instrument2) {\n continue;\n }\n let firstStaffLine: StaffLine = undefined;\n let lastStaffLine: StaffLine = undefined;\n for (let idx2: number = 0, len2: number = this.staffLines.length; idx2 < len2; ++idx2) {\n const staffLine: StaffLine = this.staffLines[idx2];\n if (staffLine.ParentStaff === instrument1.Staves[0]) {\n firstStaffLine = staffLine;\n }\n if (staffLine.ParentStaff === instrument2.Staves[0]) {\n lastStaffLine = staffLine;\n }\n }\n if (firstStaffLine && lastStaffLine) {\n this.createGroupBracket(firstStaffLine, lastStaffLine, recursionDepth);\n }\n if (instrumentGroup.InstrumentalGroups.length < 1) {\n continue;\n }\n this.createGroupBrackets(instrumentGroup.InstrumentalGroups, staffHeight, recursionDepth + 1);\n }\n }\n\n /**\n * Create the Instrument's Labels (only for the first [[MusicSystem]] of the first MusicPage).\n * @param instrumentLabelTextHeight\n * @param systemLabelsRightMargin\n * @param labelMarginBorderFactor\n */\n public createMusicSystemLabel( instrumentLabelTextHeight: number, systemLabelsRightMargin: number,\n labelMarginBorderFactor: number, isFirstSystem: boolean = false): void {\n for (let idx: number = 0, len: number = this.staffLines.length; idx < len; ++idx) {\n const instrument: Instrument = this.staffLines[idx].ParentStaff.ParentInstrument;\n let instrNameLabel: Label;\n if (isFirstSystem) {\n instrNameLabel = instrument.NameLabel;\n if (!this.rules.RenderPartNames) {\n instrNameLabel = new Label(\"\", instrument.NameLabel.textAlignment, instrument.NameLabel.font);\n systemLabelsRightMargin = 0; // might affect lyricist/tempo placement. but without this there's still some extra x-spacing.\n }\n } else {\n if (!this.rules.RenderPartAbbreviations\n // don't render part abbreviations if there's only one instrument/part (could be an option in the future)\n || this.staffLines.length === 1\n || !instrument.PartAbbreviation\n || instrument.PartAbbreviation === \"\") {\n return;\n }\n const labelText: string = instrument.PartAbbreviation;\n // const labelText: string = instrument.NameLabel.text[0] + \".\";\n instrNameLabel = new Label(labelText, instrument.NameLabel.textAlignment, instrument.NameLabel.font);\n }\n const graphicalLabel: GraphicalLabel = new GraphicalLabel(\n instrNameLabel, instrumentLabelTextHeight, TextAlignmentEnum.LeftCenter, this.rules, this.boundingBox\n );\n graphicalLabel.setLabelPositionAndShapeBorders();\n this.labels.setValue(instrument, graphicalLabel);\n // X-Position will be 0 (Label starts at the same PointF_2D with MusicSystem)\n // Y-Position will be calculated after the y-Spacing\n // graphicalLabel.PositionAndShape.RelativePosition = new PointF2D(0.0, 0.0);\n }\n\n // calculate maxLabelLength (needed for X-Spacing)\n this.maxLabelLength = 0.0;\n const labels: GraphicalLabel[] = this.labels.values();\n for (let idx: number = 0, len: number = labels.length; idx < len; ++idx) {\n const label: GraphicalLabel = labels[idx];\n if (label.PositionAndShape.Size.width > this.maxLabelLength) {\n this.maxLabelLength = label.PositionAndShape.Size.width;\n }\n }\n this.updateMusicSystemStaffLineXPosition(systemLabelsRightMargin);\n }\n\n /**\n * Set the Y-Positions for the MusicSystem's Labels.\n */\n public setMusicSystemLabelsYPosition(): void {\n this.labels.forEach((key: Instrument, value: GraphicalLabel): void => {\n let ypositionSum: number = 0;\n let staffCounter: number = 0;\n for (let i: number = 0; i < this.staffLines.length; i++) {\n if (this.staffLines[i].ParentStaff.ParentInstrument === key) {\n for (let j: number = i; j < this.staffLines.length; j++) {\n const staffLine: StaffLine = this.staffLines[j];\n if (staffLine.ParentStaff.ParentInstrument !== key) {\n break;\n }\n ypositionSum += staffLine.PositionAndShape.RelativePosition.y;\n staffCounter++;\n }\n break;\n }\n }\n if (staffCounter > 0) {\n value.PositionAndShape.RelativePosition = new PointF2D(0.0, ypositionSum / staffCounter + 2.0);\n }\n });\n }\n\n /**\n * Check if two \"adjacent\" StaffLines have BOTH a StaffEntry with a StaffEntryLink.\n * This is needed for the y-spacing algorithm.\n * @returns {boolean}\n */\n public checkStaffEntriesForStaffEntryLink(): boolean {\n let first: boolean = false;\n let second: boolean = false;\n for (let i: number = 0; i < this.staffLines.length - 1; i++) {\n for (let idx: number = 0, len: number = this.staffLines[i].Measures.length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.staffLines[i].Measures[idx];\n for (let idx2: number = 0, len2: number = measure.staffEntries.length; idx2 < len2; ++idx2) {\n const staffEntry: GraphicalStaffEntry = measure.staffEntries[idx2];\n if (staffEntry.sourceStaffEntry.Link) {\n first = true;\n }\n }\n }\n for (let idx: number = 0, len: number = this.staffLines[i + 1].Measures.length; idx < len; ++idx) {\n const measure: GraphicalMeasure = this.staffLines[i + 1].Measures[idx];\n for (let idx2: number = 0, len2: number = measure.staffEntries.length; idx2 < len2; ++idx2) {\n const staffEntry: GraphicalStaffEntry = measure.staffEntries[idx2];\n if (staffEntry.sourceStaffEntry.Link) {\n second = true;\n }\n }\n }\n }\n if (first && second) {\n return true;\n }\n return false;\n }\n\n public getBottomStaffLine(topStaffLine: StaffLine): StaffLine {\n const staves: Staff[] = topStaffLine.ParentStaff.ParentInstrument.Staves;\n const last: Staff = staves[staves.length - 1];\n for (const line of topStaffLine.ParentMusicSystem.staffLines) {\n if (line.ParentStaff === last) {\n return line;\n }\n }\n return undefined;\n }\n\n /**\n * Here the system line is generated, which acts as the container of graphical lines and dots that will be finally rendered.\n * It holds al the logical parameters of the system line.\n * @param xPosition The x position within the system\n * @param lineWidth The total x width\n * @param lineType The line type enum\n * @param linePosition indicates if the line belongs to start or end of measure\n * @param musicSystem\n * @param topMeasure\n * @param bottomMeasure\n */\n protected createSystemLine(xPosition: number, lineWidth: number, lineType: SystemLinesEnum, linePosition: SystemLinePosition,\n musicSystem: MusicSystem, topMeasure: GraphicalMeasure, bottomMeasure: GraphicalMeasure = undefined): SystemLine {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Create all the graphical lines and dots needed to render a system line (e.g. bold-thin-dots..).\n * @param systemLine\n */\n protected createLinesForSystemLine(systemLine: SystemLine): void {\n //Empty\n }\n\n /**\n * Calculates the summed x-width of a possibly given Instrument Brace and/or Group Bracket(s).\n * @returns {number} the x-width\n */\n protected calcBracketsWidth(): number {\n let width: number = 0;\n for (let idx: number = 0, len: number = this.GroupBrackets.length; idx < len; ++idx) {\n const groupBracket: GraphicalObject = this.GroupBrackets[idx];\n width = Math.max(width, groupBracket.PositionAndShape.Size.width);\n }\n for (let idx2: number = 0, len2: number = this.InstrumentBrackets.length; idx2 < len2; ++idx2) {\n const instrumentBracket: GraphicalObject = this.InstrumentBrackets[idx2];\n width = Math.max(width, instrumentBracket.PositionAndShape.Size.width);\n }\n return width;\n }\n\n protected createInstrumentBracket(firstStaffLine: StaffLine, lastStaffLine: StaffLine): void {\n // no impl here\n }\n\n protected createGroupBracket(firstStaffLine: StaffLine, lastStaffLine: StaffLine, recursionDepth: number): void {\n // no impl here\n }\n\n private findFirstVisibleInstrumentInInstrumentalGroup(instrumentalGroup: InstrumentalGroup): Instrument {\n for (let idx: number = 0, len: number = instrumentalGroup.InstrumentalGroups.length; idx < len; ++idx) {\n const groupOrInstrument: InstrumentalGroup = instrumentalGroup.InstrumentalGroups[idx];\n if (groupOrInstrument instanceof Instrument) {\n if ((groupOrInstrument).Visible === true) {\n return groupOrInstrument;\n }\n continue;\n }\n return this.findFirstVisibleInstrumentInInstrumentalGroup(groupOrInstrument);\n }\n return undefined;\n }\n\n private findLastVisibleInstrumentInInstrumentalGroup(instrumentalGroup: InstrumentalGroup): Instrument {\n let groupOrInstrument: InstrumentalGroup;\n for (let i: number = instrumentalGroup.InstrumentalGroups.length - 1; i >= 0; i--) {\n groupOrInstrument = instrumentalGroup.InstrumentalGroups[i];\n if (groupOrInstrument instanceof Instrument) {\n if ((groupOrInstrument).Visible === true) {\n return groupOrInstrument;\n }\n continue;\n }\n return this.findLastVisibleInstrumentInInstrumentalGroup(groupOrInstrument);\n }\n return undefined;\n }\n\n /**\n * Update the xPosition of the [[MusicSystem]]'s [[StaffLine]]'s due to [[Label]] positioning.\n * @param systemLabelsRightMargin\n */\n private updateMusicSystemStaffLineXPosition(systemLabelsRightMargin: number): void {\n for (let idx: number = 0, len: number = this.StaffLines.length; idx < len; ++idx) {\n const staffLine: StaffLine = this.StaffLines[idx];\n const relative: PointF2D = staffLine.PositionAndShape.RelativePosition;\n relative.x = this.maxLabelLength + systemLabelsRightMargin;\n staffLine.PositionAndShape.RelativePosition = relative;\n staffLine.PositionAndShape.BorderRight = this.boundingBox.Size.width - this.maxLabelLength - systemLabelsRightMargin;\n for (let i: number = 0; i < staffLine.StaffLines.length; i++) {\n const lineEnd: PointF2D = new PointF2D(staffLine.PositionAndShape.Size.width, staffLine.StaffLines[i].End.y);\n staffLine.StaffLines[i].End = lineEnd;\n }\n }\n }\n}\n","import {Voice} from \"./Voice\";\nimport {Instrument} from \"../Instrument\";\n\nexport class Staff {\n\n constructor(parentInstrument: Instrument, instrumentStaffId: number) {\n this.parentInstrument = parentInstrument;\n this.id = instrumentStaffId;\n this.audible = true;\n this.following = true;\n }\n\n public idInMusicSheet: number;\n public audible: boolean;\n public following: boolean;\n public isTab: boolean = false;\n\n private parentInstrument: Instrument;\n private voices: Voice[] = [];\n private volume: number = 1;\n private id: number;\n private stafflineCount: number = 5;\n\n public get ParentInstrument(): Instrument {\n return this.parentInstrument;\n }\n public set ParentInstrument(value: Instrument) {\n this.parentInstrument = value;\n }\n public get Voices(): Voice[] {\n return this.voices;\n }\n public get Id(): number {\n return this.id;\n }\n public get Volume(): number {\n return this.volume;\n }\n public set Volume(value: number) {\n this.volume = value;\n }\n public get StafflineCount(): number {\n return this.stafflineCount;\n }\n public set StafflineCount(value: number) {\n this.stafflineCount = value;\n }\n}\n","import {GraphicalMeasure} from \"./GraphicalMeasure\";\nimport {StaffLine} from \"./StaffLine\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {SystemLinePosition} from \"./SystemLinePosition\";\nimport {SystemLinesEnum} from \"./SystemLinesEnum\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {EngravingRules} from \"./EngravingRules\";\n\nexport class SystemLine extends GraphicalObject {\n\n constructor(lineType: SystemLinesEnum, linePosition: SystemLinePosition, musicSystem: MusicSystem,\n topMeasure: GraphicalMeasure, bottomMeasure: GraphicalMeasure = undefined) {\n super();\n this.lineType = lineType;\n this.linePosition = linePosition;\n this.parentMusicSystem = musicSystem;\n this.topMeasure = topMeasure;\n this.bottomMeasure = bottomMeasure;\n this.parentTopStaffLine = topMeasure.ParentStaffLine;\n this.boundingBox = new BoundingBox(this, musicSystem.PositionAndShape);\n }\n\n public lineType: SystemLinesEnum;\n public linePosition: SystemLinePosition;\n public parentMusicSystem: MusicSystem;\n public parentTopStaffLine: StaffLine;\n public topMeasure: GraphicalMeasure;\n public bottomMeasure: GraphicalMeasure;\n\n /**\n * Return the width of the SystemLinesContainer for the given SystemLineType.\n * @param rules\n * @param systemLineType\n * @returns {number}\n */\n public static getObjectWidthForLineType(rules: EngravingRules, systemLineType: SystemLinesEnum): number {\n switch (systemLineType) {\n case SystemLinesEnum.SingleThin:\n return rules.SystemThinLineWidth;\n case SystemLinesEnum.DoubleThin:\n return rules.SystemThinLineWidth * 2 + rules.DistanceBetweenVerticalSystemLines;\n case SystemLinesEnum.ThinBold:\n return rules.SystemThinLineWidth + rules.SystemBoldLineWidth + rules.DistanceBetweenVerticalSystemLines;\n case SystemLinesEnum.BoldThinDots:\n return rules.SystemThinLineWidth + rules.SystemBoldLineWidth + rules.DistanceBetweenVerticalSystemLines + rules.SystemDotWidth +\n rules.DistanceBetweenDotAndLine;\n case SystemLinesEnum.DotsThinBold:\n return rules.SystemThinLineWidth + rules.SystemBoldLineWidth + rules.DistanceBetweenVerticalSystemLines + rules.SystemDotWidth +\n rules.DistanceBetweenDotAndLine;\n case SystemLinesEnum.DotsBoldBoldDots:\n return 2 * rules.SystemBoldLineWidth + 2 * rules.SystemDotWidth + 2 * rules.DistanceBetweenDotAndLine +\n rules.DistanceBetweenVerticalSystemLines;\n default:\n return 0;\n }\n }\n\n}\n","import {EngravingRules} from \"./EngravingRules\";\nimport {ITextMeasurer} from \"../Interfaces/ITextMeasurer\";\nimport {GraphicalMusicSheet} from \"./GraphicalMusicSheet\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {GraphicalLayers, OutlineAndFillStyleEnum} from \"./DrawingEnums\";\nimport {DrawingParameters} from \"./DrawingParameters\";\nimport {GraphicalLine} from \"./GraphicalLine\";\nimport {RectangleF2D} from \"../../Common/DataObjects/RectangleF2D\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {GraphicalRectangle} from \"./GraphicalRectangle\";\nimport {GraphicalLabel} from \"./GraphicalLabel\";\nimport {Label} from \"../Label\";\nimport {TextAlignmentEnum} from \"../../Common/Enums/TextAlignment\";\nimport {ArgumentOutOfRangeException} from \"../Exceptions\";\nimport {SelectionStartSymbol} from \"./SelectionStartSymbol\";\nimport {SelectionEndSymbol} from \"./SelectionEndSymbol\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {GraphicalMeasure} from \"./GraphicalMeasure\";\nimport {StaffLine} from \"./StaffLine\";\nimport {SystemLine} from \"./SystemLine\";\nimport {MusicSymbol} from \"./MusicSymbol\";\nimport {GraphicalMusicPage} from \"./GraphicalMusicPage\";\nimport {Instrument} from \"../Instrument\";\nimport {MusicSymbolDrawingStyle, PhonicScoreModes} from \"./DrawingMode\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport { GraphicalInstantaneousDynamicExpression } from \"./GraphicalInstantaneousDynamicExpression\";\nimport { GraphicalContinuousDynamicExpression } from \"./GraphicalContinuousDynamicExpression\";\n// import { FontStyles } from \"../../Common/Enums/FontStyles\";\n\n/**\n * Draw a [[GraphicalMusicSheet]] (through the .drawSheet method)\n *\n * The drawing is implemented with a top-down approach, starting from a music sheet, going through pages, systems, staffs...\n * ... and ending in notes, beams, accidentals and other symbols.\n * It's worth to say, that this class just draws the symbols and graphical elements, using the positions that have been computed before.\n * But in any case, some of these previous positioning algorithms need the sizes of the concrete symbols (NoteHeads, sharps, flats, keys...).\n * Therefore, there are some static functions on the 'Bounding Boxes' section used to compute these symbol boxes at the\n * beginning for the later use in positioning algorithms.\n *\n * This class also includes the resizing and positioning of the symbols due to user interaction like zooming or panning.\n */\nexport abstract class MusicSheetDrawer {\n public drawingParameters: DrawingParameters;\n public splitScreenLineColor: number;\n public midiPlaybackAvailable: boolean;\n public drawableBoundingBoxElement: string = process.env.DRAW_BOUNDING_BOX_ELEMENT;\n\n public skyLineVisible: boolean = false;\n public bottomLineVisible: boolean = false;\n\n protected rules: EngravingRules;\n protected graphicalMusicSheet: GraphicalMusicSheet;\n protected textMeasurer: ITextMeasurer;\n private phonicScoreMode: PhonicScoreModes = PhonicScoreModes.Manual;\n\n constructor(textMeasurer: ITextMeasurer,\n drawingParameters: DrawingParameters) {\n this.textMeasurer = textMeasurer;\n this.splitScreenLineColor = -1;\n this.drawingParameters = drawingParameters;\n }\n\n public set Mode(value: PhonicScoreModes) {\n this.phonicScoreMode = value;\n }\n\n public drawSheet(graphicalMusicSheet: GraphicalMusicSheet): void {\n this.graphicalMusicSheet = graphicalMusicSheet;\n this.rules = graphicalMusicSheet.ParentMusicSheet.Rules;\n this.drawSplitScreenLine();\n if (this.drawingParameters.drawCursors) {\n for (const line of graphicalMusicSheet.Cursors) {\n if (!line) {\n // TODO GraphicalMusicSheet.calculateCursorLineAtTimestamp() can return undefined.\n // why does this happen in the VexFlowMusicSheetDrawer_Test? (it(\"draws cursor...\"))\n continue;\n }\n const psi: BoundingBox = new BoundingBox(line);\n psi.AbsolutePosition = line.Start;\n psi.BorderBottom = line.End.y - line.Start.y;\n psi.BorderRight = line.Width / 2.0;\n psi.BorderLeft = -line.Width / 2.0;\n if (this.isVisible(psi)) {\n this.drawLineAsVerticalRectangle(line, GraphicalLayers.Cursor);\n }\n }\n }\n // Draw the vertical ScrollIndicator\n if (this.drawingParameters.drawScrollIndicator) {\n this.drawScrollIndicator();\n }\n // Draw all the pages\n for (const page of this.graphicalMusicSheet.MusicPages) {\n this.drawPage(page);\n }\n }\n\n public drawLineAsHorizontalRectangle(line: GraphicalLine, layer: number): void {\n let rectangle: RectangleF2D = new RectangleF2D(line.Start.x, line.End.y - line.Width / 2, line.End.x - line.Start.x, line.Width);\n rectangle = this.applyScreenTransformationForRect(rectangle);\n this.renderRectangle(rectangle, layer, line.styleId);\n }\n\n public drawLineAsVerticalRectangle(line: GraphicalLine, layer: number): void {\n const lineStart: PointF2D = line.Start;\n const lineWidth: number = line.Width;\n let rectangle: RectangleF2D = new RectangleF2D(lineStart.x - lineWidth / 2, lineStart.y, lineWidth, line.End.y - lineStart.y);\n rectangle = this.applyScreenTransformationForRect(rectangle);\n this.renderRectangle(rectangle, layer, line.styleId);\n }\n\n public drawLineAsHorizontalRectangleWithOffset(line: GraphicalLine, offset: PointF2D, layer: number): void {\n const start: PointF2D = new PointF2D(line.Start.x + offset.x, line.Start.y + offset.y);\n const end: PointF2D = new PointF2D(line.End.x + offset.x, line.End.y + offset.y);\n const width: number = line.Width;\n let rectangle: RectangleF2D = new RectangleF2D(start.x, end.y - width / 2, end.x - start.x, width);\n rectangle = this.applyScreenTransformationForRect(rectangle);\n this.renderRectangle(rectangle, layer, line.styleId);\n }\n\n public drawLineAsVerticalRectangleWithOffset(line: GraphicalLine, offset: PointF2D, layer: number): void {\n const start: PointF2D = new PointF2D(line.Start.x + offset.x, line.Start.y + offset.y);\n const end: PointF2D = new PointF2D(line.End.x + offset.x, line.End.y + offset.y);\n const width: number = line.Width;\n let rectangle: RectangleF2D = new RectangleF2D(start.x, start.y, width, end.y - start.y);\n rectangle = this.applyScreenTransformationForRect(rectangle);\n this.renderRectangle(rectangle, layer, line.styleId);\n }\n\n public drawRectangle(rect: GraphicalRectangle, layer: number): void {\n const psi: BoundingBox = rect.PositionAndShape;\n let rectangle: RectangleF2D = new RectangleF2D(psi.AbsolutePosition.x, psi.AbsolutePosition.y, psi.BorderRight, psi.BorderBottom);\n rectangle = this.applyScreenTransformationForRect(rectangle);\n this.renderRectangle(rectangle, layer, rect.style);\n }\n\n public calculatePixelDistance(unitDistance: number): number {\n throw new Error(\"not implemented\");\n }\n\n public drawLabel(graphicalLabel: GraphicalLabel, layer: number): void {\n if (!this.isVisible(graphicalLabel.PositionAndShape)) {\n return;\n }\n const label: Label = graphicalLabel.Label;\n if (label.text.trim() === \"\") {\n return;\n }\n const screenPosition: PointF2D = this.applyScreenTransformation(graphicalLabel.PositionAndShape.AbsolutePosition);\n const heightInPixel: number = this.calculatePixelDistance(label.fontHeight);\n const widthInPixel: number = heightInPixel * this.textMeasurer.computeTextWidthToHeightRatio(label.text, label.font, label.fontStyle);\n const bitmapWidth: number = Math.ceil(widthInPixel);\n const bitmapHeight: number = Math.ceil(heightInPixel * 1.2);\n switch (label.textAlignment) {\n // Adjust the OSMD-calculated positions to rendering coordinates\n // These have to match the Border settings in GraphicalLabel.setLabelPositionAndShapeBorders()\n // TODO isn't this a Vexflow-specific transformation that should be in VexflowMusicSheetDrawer?\n case TextAlignmentEnum.LeftTop:\n break;\n case TextAlignmentEnum.LeftCenter:\n screenPosition.y -= bitmapHeight / 2;\n break;\n case TextAlignmentEnum.LeftBottom:\n screenPosition.y -= bitmapHeight;\n break;\n case TextAlignmentEnum.CenterTop:\n screenPosition.x -= bitmapWidth / 2;\n break;\n case TextAlignmentEnum.CenterCenter:\n screenPosition.x -= bitmapWidth / 2;\n screenPosition.y -= bitmapHeight / 2;\n break;\n case TextAlignmentEnum.CenterBottom:\n screenPosition.x -= bitmapWidth / 2;\n screenPosition.y -= bitmapHeight;\n break;\n case TextAlignmentEnum.RightTop:\n screenPosition.x -= bitmapWidth;\n break;\n case TextAlignmentEnum.RightCenter:\n screenPosition.x -= bitmapWidth;\n screenPosition.y -= bitmapHeight / 2;\n break;\n case TextAlignmentEnum.RightBottom:\n screenPosition.x -= bitmapWidth;\n screenPosition.y -= bitmapHeight;\n break;\n default:\n throw new ArgumentOutOfRangeException(\"\");\n }\n this.renderLabel(graphicalLabel, layer, bitmapWidth, bitmapHeight, heightInPixel, screenPosition);\n }\n\n protected applyScreenTransformation(point: PointF2D): PointF2D {\n throw new Error(\"not implemented\");\n }\n\n protected applyScreenTransformations(points: PointF2D[]): PointF2D[] {\n const transformedPoints: PointF2D[] = [];\n for (const point of points) {\n transformedPoints.push(this.applyScreenTransformation(point));\n }\n return transformedPoints;\n }\n\n protected applyScreenTransformationForRect(rectangle: RectangleF2D): RectangleF2D {\n throw new Error(\"not implemented\");\n }\n\n protected drawSplitScreenLine(): void {\n // empty\n }\n\n protected renderRectangle(rectangle: RectangleF2D, layer: number, styleId: number, alpha: number = 1): void {\n throw new Error(\"not implemented\");\n }\n\n protected drawScrollIndicator(): void {\n // empty\n }\n\n protected drawSelectionStartSymbol(symbol: SelectionStartSymbol): void {\n // empty\n }\n\n protected drawSelectionEndSymbol(symbol: SelectionEndSymbol): void {\n // empty\n }\n\n protected renderLabel(graphicalLabel: GraphicalLabel, layer: number, bitmapWidth: number,\n bitmapHeight: number, heightInPixel: number, screenPosition: PointF2D): void {\n throw new Error(\"not implemented\");\n }\n\n protected renderSystemToScreen(system: MusicSystem, systemBoundingBoxInPixels: RectangleF2D,\n absBoundingRectWithMargin: RectangleF2D): void {\n // empty\n }\n\n protected drawMeasure(measure: GraphicalMeasure): void {\n throw new Error(\"not implemented\");\n }\n\n protected drawSkyLine(staffLine: StaffLine): void {\n // empty\n }\n\n protected drawBottomLine(staffLine: StaffLine): void {\n // empty\n }\n\n protected drawInstrumentBrace(brace: GraphicalObject, system: MusicSystem): void {\n // empty\n }\n\n protected drawGroupBracket(bracket: GraphicalObject, system: MusicSystem): void {\n // empty\n }\n\n protected isVisible(psi: BoundingBox): boolean {\n return true;\n }\n\n protected drawMusicSystem(system: MusicSystem): void {\n const absBoundingRectWithMargin: RectangleF2D = this.getSystemAbsBoundingRect(system);\n const systemBoundingBoxInPixels: RectangleF2D = this.getSytemBoundingBoxInPixels(absBoundingRectWithMargin);\n this.drawMusicSystemComponents(system, systemBoundingBoxInPixels, absBoundingRectWithMargin);\n }\n\n protected getSytemBoundingBoxInPixels(absBoundingRectWithMargin: RectangleF2D): RectangleF2D {\n const systemBoundingBoxInPixels: RectangleF2D = this.applyScreenTransformationForRect(absBoundingRectWithMargin);\n systemBoundingBoxInPixels.x = Math.round(systemBoundingBoxInPixels.x);\n systemBoundingBoxInPixels.y = Math.round(systemBoundingBoxInPixels.y);\n return systemBoundingBoxInPixels;\n }\n\n protected getSystemAbsBoundingRect(system: MusicSystem): RectangleF2D {\n const relBoundingRect: RectangleF2D = system.PositionAndShape.BoundingRectangle;\n const absBoundingRectWithMargin: RectangleF2D = new RectangleF2D(\n system.PositionAndShape.AbsolutePosition.x + system.PositionAndShape.BorderLeft - 1,\n system.PositionAndShape.AbsolutePosition.y + system.PositionAndShape.BorderTop - 1,\n (relBoundingRect.width + 6), (relBoundingRect.height + 2)\n );\n return absBoundingRectWithMargin;\n }\n\n protected drawMusicSystemComponents(musicSystem: MusicSystem, systemBoundingBoxInPixels: RectangleF2D,\n absBoundingRectWithMargin: RectangleF2D): void {\n const selectStartSymb: SelectionStartSymbol = this.graphicalMusicSheet.SelectionStartSymbol;\n const selectEndSymb: SelectionEndSymbol = this.graphicalMusicSheet.SelectionEndSymbol;\n if (this.drawingParameters.drawSelectionStartSymbol) {\n if (selectStartSymb !== undefined && this.isVisible(selectStartSymb.PositionAndShape)) {\n this.drawSelectionStartSymbol(selectStartSymb);\n }\n }\n if (this.drawingParameters.drawSelectionEndSymbol) {\n if (selectEndSymb !== undefined && this.isVisible(selectEndSymb.PositionAndShape)) {\n this.drawSelectionEndSymbol(selectEndSymb);\n }\n }\n for (const staffLine of musicSystem.StaffLines) {\n this.drawStaffLine(staffLine);\n\n if (this.rules.RenderLyrics) {\n // draw lyric dashes\n if (staffLine.LyricsDashes.length > 0) {\n this.drawDashes(staffLine.LyricsDashes);\n }\n\n // draw lyric lines (e.g. LyricExtends: \"dich,___\")\n if (staffLine.LyricLines.length > 0) {\n this.drawLyricLines(staffLine.LyricLines, staffLine);\n }\n }\n }\n for (const systemLine of musicSystem.SystemLines) {\n this.drawSystemLineObject(systemLine);\n }\n if (musicSystem.Parent === musicSystem.Parent.Parent.MusicPages[0]) {\n for (const label of musicSystem.Labels) {\n this.drawLabel(label, GraphicalLayers.Notes);\n }\n }\n for (const bracket of musicSystem.InstrumentBrackets) {\n this.drawInstrumentBrace(bracket, musicSystem);\n }\n for (const bracket of musicSystem.GroupBrackets) {\n this.drawGroupBracket(bracket, musicSystem);\n }\n if (!this.leadSheet) {\n for (const measureNumberLabel of musicSystem.MeasureNumberLabels) {\n this.drawLabel(measureNumberLabel, GraphicalLayers.Notes);\n }\n }\n for (const staffLine of musicSystem.StaffLines) {\n this.drawStaffLineSymbols(staffLine);\n }\n if (this.drawingParameters.drawMarkedAreas) {\n this.drawMarkedAreas(musicSystem);\n }\n if (this.drawingParameters.drawComments) {\n this.drawComment(musicSystem);\n }\n }\n\n protected activateSystemRendering(systemId: number, absBoundingRect: RectangleF2D,\n systemBoundingBoxInPixels: RectangleF2D, createNewImage: boolean): boolean {\n return true;\n }\n\n protected drawSystemLineObject(systemLine: SystemLine): void {\n // empty\n }\n\n protected drawStaffLine(staffLine: StaffLine): void {\n for (const measure of staffLine.Measures) {\n this.drawMeasure(measure);\n }\n\n if (this.rules.RenderLyrics) {\n if (staffLine.LyricsDashes.length > 0) {\n this.drawDashes(staffLine.LyricsDashes);\n }\n }\n this.drawOctaveShifts(staffLine);\n\n this.drawExpressions(staffLine);\n\n if (this.skyLineVisible) {\n this.drawSkyLine(staffLine);\n }\n\n if (this.bottomLineVisible) {\n this.drawBottomLine(staffLine);\n }\n }\n\n protected drawLyricLines(lyricLines: GraphicalLine[], staffLine: StaffLine): void {\n staffLine.LyricLines.forEach(lyricLine => {\n // TODO maybe we should put this in the calculation (MusicSheetCalculator.calculateLyricExtend)\n // then we can also remove staffLine argument\n // but same addition doesn't work in calculateLyricExtend, because y-spacing happens after lyrics positioning\n lyricLine.Start.y += staffLine.PositionAndShape.AbsolutePosition.y;\n lyricLine.End.y += staffLine.PositionAndShape.AbsolutePosition.y;\n lyricLine.Start.x += staffLine.PositionAndShape.AbsolutePosition.x;\n lyricLine.End.x += staffLine.PositionAndShape.AbsolutePosition.x;\n this.drawGraphicalLine(lyricLine, this.rules.LyricUnderscoreLineWidth);\n });\n }\n\n protected drawExpressions(staffline: StaffLine): void {\n // implemented by subclass (VexFlowMusicSheetDrawer)\n }\n\n protected drawGraphicalLine(graphicalLine: GraphicalLine, lineWidth: number, colorOrStyle: string = \"black\"): void {\n /* TODO similar checks as in drawLabel\n if (!this.isVisible(new BoundingBox(graphicalLine.Start,)) {\n return;\n }\n */\n this.drawLine(graphicalLine.Start, graphicalLine.End, colorOrStyle, lineWidth);\n }\n\n protected drawLine(start: PointF2D, stop: PointF2D, color: string = \"#FF0000FF\", lineWidth: number): void {\n // implemented by subclass (VexFlowMusicSheetDrawer)\n }\n\n /**\n * Draw all dashes to the canvas\n * @param lyricsDashes Array of lyric dashes to be drawn\n * @param layer Number of the layer that the lyrics should be drawn in\n */\n protected drawDashes(lyricsDashes: GraphicalLabel[]): void {\n lyricsDashes.forEach(dash => this.drawLabel(dash, GraphicalLayers.Notes));\n }\n\n // protected drawSlur(slur: GraphicalSlur, abs: PointF2D): void {\n //\n // }\n\n protected drawOctaveShifts(staffLine: StaffLine): void {\n return;\n }\n\n protected drawStaffLines(staffLine: StaffLine): void {\n if (staffLine.StaffLines) {\n const position: PointF2D = staffLine.PositionAndShape.AbsolutePosition;\n for (let i: number = 0; i < 5; i++) {\n this.drawLineAsHorizontalRectangleWithOffset(staffLine.StaffLines[i], position, GraphicalLayers.Notes);\n }\n }\n }\n\n // protected drawEnding(ending: GraphicalRepetitionEnding, absolutePosition: PointF2D): void {\n // if (undefined !== ending.Left)\n // drawLineAsVerticalRectangle(ending.Left, absolutePosition, GraphicalLayers.Notes);\n // this.drawLineAsHorizontalRectangle(ending.Top, absolutePosition, GraphicalLayers.Notes);\n // if (undefined !== ending.Right)\n // drawLineAsVerticalRectangle(ending.Right, absolutePosition, GraphicalLayers.Notes);\n // this.drawLabel(ending.Label, GraphicalLayers.Notes);\n // }\n\n /**\n * Draws an instantaneous dynamic expression (p, pp, f, ff, ...) to the canvas\n * @param instantaneousDynamic GraphicalInstantaneousDynamicExpression to be drawn\n */\n protected drawInstantaneousDynamic(instantaneousDynamic: GraphicalInstantaneousDynamicExpression): void {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Draws a continuous dynamic expression (wedges) to the canvas\n * @param expression GraphicalContinuousDynamicExpression to be drawn\n */\n protected drawContinuousDynamic(expression: GraphicalContinuousDynamicExpression): void {\n throw new Error(\"not implemented\");\n }\n\n protected drawSymbol(symbol: MusicSymbol, symbolStyle: MusicSymbolDrawingStyle, position: PointF2D,\n scalingFactor: number = 1, layer: number = GraphicalLayers.Notes): void {\n //empty\n }\n\n protected get leadSheet(): boolean {\n return this.graphicalMusicSheet.LeadSheet;\n }\n\n protected set leadSheet(value: boolean) {\n this.graphicalMusicSheet.LeadSheet = value;\n }\n\n protected drawPage(page: GraphicalMusicPage): void {\n if (!this.isVisible(page.PositionAndShape)) {\n return;\n }\n\n for (const system of page.MusicSystems) {\n if (this.isVisible(system.PositionAndShape)) {\n this.drawMusicSystem(system);\n }\n }\n if (page === page.Parent.MusicPages[0]) {\n for (const label of page.Labels) {\n this.drawLabel(label, GraphicalLayers.Notes);\n }\n }\n // Draw bounding boxes for debug purposes. This has to be at the end because only\n // then all the calculations and recalculations are done\n if (this.drawableBoundingBoxElement) {\n this.drawBoundingBoxes(page.PositionAndShape, 0, this.drawableBoundingBoxElement);\n }\n }\n\n /**\n * Draw bounding boxes aroung GraphicalObjects\n * @param startBox Bounding Box that is used as a staring point to recursively go through all child elements\n * @param layer Layer to draw to\n * @param type Type of element to show bounding boxes for as string.\n */\n private drawBoundingBoxes(startBox: BoundingBox, layer: number = 0, type: string = \"all\"): void {\n const dataObjectString: string = (startBox.DataObject.constructor as any).name;\n if (dataObjectString === type || type === \"all\") {\n let tmpRect: RectangleF2D = new RectangleF2D(startBox.AbsolutePosition.x + startBox.BorderMarginLeft,\n startBox.AbsolutePosition.y + startBox.BorderMarginTop,\n startBox.BorderMarginRight - startBox.BorderMarginLeft,\n startBox.BorderMarginBottom - startBox.BorderMarginTop);\n this.drawLineAsHorizontalRectangle(new GraphicalLine(\n new PointF2D(startBox.AbsolutePosition.x - 1, startBox.AbsolutePosition.y),\n new PointF2D(startBox.AbsolutePosition.x + 1, startBox.AbsolutePosition.y),\n 0.1,\n OutlineAndFillStyleEnum.BaseWritingColor),\n layer - 1);\n\n this.drawLineAsVerticalRectangle(new GraphicalLine(\n new PointF2D(startBox.AbsolutePosition.x, startBox.AbsolutePosition.y - 1),\n new PointF2D(startBox.AbsolutePosition.x, startBox.AbsolutePosition.y + 1),\n 0.1,\n OutlineAndFillStyleEnum.BaseWritingColor),\n layer - 1);\n\n tmpRect = this.applyScreenTransformationForRect(tmpRect);\n this.renderRectangle(tmpRect, GraphicalLayers.Background, layer, 0.5);\n const label: Label = new Label(dataObjectString);\n this.renderLabel(new GraphicalLabel(label, 0.8, TextAlignmentEnum.CenterCenter, this.rules),\n layer, tmpRect.width, tmpRect.height, tmpRect.height, new PointF2D(tmpRect.x, tmpRect.y + 12));\n }\n layer++;\n startBox.ChildElements.forEach(bb => this.drawBoundingBoxes(bb, layer, type));\n }\n\n private drawMarkedAreas(system: MusicSystem): void {\n for (const markedArea of system.GraphicalMarkedAreas) {\n if (markedArea) {\n if (markedArea.systemRectangle) {\n this.drawRectangle(markedArea.systemRectangle, GraphicalLayers.Background);\n }\n if (markedArea.settings) {\n this.drawLabel(markedArea.settings, GraphicalLayers.Comment);\n }\n if (markedArea.labelRectangle) {\n this.drawRectangle(markedArea.labelRectangle, GraphicalLayers.Background);\n }\n if (markedArea.label) {\n this.drawLabel(markedArea.label, GraphicalLayers.Comment);\n }\n }\n }\n }\n\n private drawComment(system: MusicSystem): void {\n for (const comment of system.GraphicalComments) {\n if (comment) {\n if (comment.settings) {\n this.drawLabel(comment.settings, GraphicalLayers.Comment);\n }\n if (comment.label) {\n this.drawLabel(comment.label, GraphicalLayers.Comment);\n }\n }\n }\n }\n\n private drawStaffLineSymbols(staffLine: StaffLine): void {\n const parentInst: Instrument = staffLine.ParentStaff.ParentInstrument;\n const absX: number = staffLine.PositionAndShape.AbsolutePosition.x;\n const absY: number = staffLine.PositionAndShape.AbsolutePosition.y + 2;\n const borderRight: number = staffLine.PositionAndShape.BorderRight;\n if (parentInst.highlight && this.drawingParameters.drawHighlights) {\n this.drawLineAsHorizontalRectangle(\n new GraphicalLine(\n new PointF2D(absX, absY),\n new PointF2D(absX + borderRight, absY),\n 4,\n OutlineAndFillStyleEnum.Highlighted\n ),\n GraphicalLayers.Highlight\n );\n }\n let style: MusicSymbolDrawingStyle = MusicSymbolDrawingStyle.Disabled;\n let symbol: MusicSymbol = MusicSymbol.PLAY;\n let drawSymbols: boolean = this.drawingParameters.drawActivitySymbols;\n switch (this.phonicScoreMode) {\n case PhonicScoreModes.Midi:\n symbol = MusicSymbol.PLAY;\n if (this.midiPlaybackAvailable && staffLine.ParentStaff.audible) {\n style = MusicSymbolDrawingStyle.PlaybackSymbols;\n }\n break;\n case PhonicScoreModes.Following:\n symbol = MusicSymbol.MIC;\n if (staffLine.ParentStaff.following) {\n style = MusicSymbolDrawingStyle.FollowSymbols;\n }\n break;\n default:\n drawSymbols = false;\n break;\n }\n if (drawSymbols) {\n const p: PointF2D = new PointF2D(absX + borderRight + 2, absY);\n this.drawSymbol(symbol, style, p);\n }\n if (this.drawingParameters.drawErrors) {\n for (const measure of staffLine.Measures) {\n const measurePSI: BoundingBox = measure.PositionAndShape;\n const absXPSI: number = measurePSI.AbsolutePosition.x;\n const absYPSI: number = measurePSI.AbsolutePosition.y + 2;\n if (measure.hasError && this.graphicalMusicSheet.ParentMusicSheet.DrawErroneousMeasures) {\n this.drawLineAsHorizontalRectangle(\n new GraphicalLine(\n new PointF2D(absXPSI, absYPSI),\n new PointF2D(absXPSI + measurePSI.BorderRight, absYPSI),\n 4,\n OutlineAndFillStyleEnum.ErrorUnderlay\n ),\n GraphicalLayers.MeasureError\n );\n }\n }\n }\n }\n}\n","export enum DrawingMode {\n All,\n NoOverlays,\n Leadsheet\n}\n\nexport enum MusicSymbolDrawingStyle {\n Normal,\n Disabled,\n Selected,\n Clickable,\n PlaybackSymbols,\n FollowSymbols,\n QFeedbackNotFound,\n QFeedbackOk,\n QFeedbackPerfect,\n Debug1,\n Debug2,\n Debug3\n}\n\nexport enum PhonicScoreModes {\n Following,\n Midi,\n Manual\n}\n","import { VoiceEntry } from \"./VoiceEntry\";\nimport { Note } from \"./Note\";\n\nexport class Arpeggio {\n constructor(parentVoiceEntry: VoiceEntry, type: ArpeggioType = ArpeggioType.ARPEGGIO_DIRECTIONLESS) {\n this.parentVoiceEntry = parentVoiceEntry;\n this.type = type;\n this.notes = [];\n }\n\n public parentVoiceEntry: VoiceEntry;\n public notes: Note[];\n public type: ArpeggioType;\n\n public addNote(note: Note): void {\n this.notes.push(note);\n note.Arpeggio = this;\n }\n}\n\n/** Corresponds to Vex.Flow.Stroke.Type for now. But we don't want VexFlow as a dependency here. */\nexport enum ArpeggioType {\n BRUSH_DOWN = 1,\n BRUSH_UP,\n ROLL_DOWN,\n ROLL_UP,\n RASQUEDO_DOWN,\n RASQUEDO_UP,\n ARPEGGIO_DIRECTIONLESS\n}\n","import {Note} from \"./Note\";\n\n/**\n * A [[Beam]] - the bar grouping multiple consecutive [[Note]]s.\n */\nexport class Beam {\n\n private notes: Note[] = [];\n private extendedNoteList: Note[] = [];\n\n public get Notes(): Note[] {\n return this.notes;\n }\n public set Notes(value: Note[]) {\n this.notes = value;\n }\n public get ExtendedNoteList(): Note[] {\n return this.extendedNoteList;\n }\n public set ExtendedNoteList(value: Note[]) {\n this.extendedNoteList = value;\n }\n\n /**\n * Perform all the appropriate actions for adding a singleNote to the Beam.\n * @param note\n */\n public addNoteToBeam(note: Note): void {\n if (note) {\n note.NoteBeam = this;\n this.notes.push(note);\n this.extendedNoteList.push(note);\n }\n }\n\n}\n\nexport enum BeamEnum {\n BeamNone = -1,\n BeamBegin = 0,\n BeamContinue = 1,\n BeamEnd = 2,\n BeamForward = 3,\n BeamBackward = 4,\n}\n","export enum NoteType {\n // xml note types, e.g. given as quarter, see:\n //https://usermanuals.musicxml.com/MusicXML/Content/ST-MusicXML-note-type-value.htm\n\n UNDEFINED, // e.g. not given in XML\n _1024th, // enum member cannot start with a number\n _512th,\n _256th,\n _128th,\n _64th,\n _32nd,\n _16th,\n EIGTH,\n QUARTER,\n HALF,\n WHOLE,\n BREVE,\n LONG,\n MAXIMA\n}\n\nexport class NoteTypeHandler {\n // tslint:disable-next-line: variable-name\n public static NoteTypeXmlValues: string[] = [\"\", \"1024th\", \"512th\", \"256th\", \"128th\", \"64th\", \"32nd\", \"16th\",\n \"eigth\", \"quarter\", \"half\", \"whole\", \"breve\", \"long\", \"maxima\"];\n // alternative to array: use switch/case\n\n\n public static NoteTypeToString(noteType: NoteType): string {\n return this.NoteTypeXmlValues[noteType];\n // assumes that the enum values are ordered from 0 to x, like NoteTypeXmlValues array members\n // see NoteType_Test.ts\n }\n\n public static StringToNoteType(noteType: string): NoteType {\n const indexInArray: number = this.NoteTypeXmlValues.indexOf(noteType);\n return indexInArray !== -1 ? indexInArray : NoteType.UNDEFINED;\n }\n}\n","import { StaffLine } from \"../StaffLine\";\nimport { BoundingBox } from \"../BoundingBox\";\nimport { VexFlowContinuousDynamicExpression } from \"./VexFlowContinuousDynamicExpression\";\nimport { AbstractGraphicalExpression } from \"../AbstractGraphicalExpression\";\nimport { PointF2D } from \"../../../Common/DataObjects/PointF2D\";\nimport { EngravingRules } from \"../EngravingRules\";\nimport { PlacementEnum } from \"../../VoiceData/Expressions\";\n\nexport class AlignmentManager {\n private parentStaffline: StaffLine;\n private rules: EngravingRules;\n\n constructor(staffline: StaffLine) {\n this.parentStaffline = staffline;\n this.rules = this.parentStaffline.ParentMusicSystem.rules;\n }\n\n public alignDynamicExpressions(): void {\n // Find close expressions along the staffline. Group them into tuples\n const groups: AbstractGraphicalExpression[][] = [];\n let tmpList: AbstractGraphicalExpression[] = new Array();\n for (let aeIdx: number = 0; aeIdx < this.parentStaffline.AbstractExpressions.length - 1; aeIdx++) {\n const currentExpression: AbstractGraphicalExpression = this.parentStaffline.AbstractExpressions[aeIdx];\n const nextExpression: AbstractGraphicalExpression = this.parentStaffline.AbstractExpressions[aeIdx + 1];\n\n const currentExpressionPlacement: PlacementEnum = currentExpression?.SourceExpression?.Placement;\n const nextExpressionPlacement: PlacementEnum = nextExpression?.SourceExpression?.Placement;\n\n // TODO this shifts dynamics in An die Ferne Geliebte, showing that there's something wrong with the RelativePositions etc with wedges\n // if (currentExpression instanceof GraphicalContinuousDynamicExpression) {\n // currentExpression.calcPsi();\n // }\n // if (nextExpression instanceof GraphicalContinuousDynamicExpression) {\n // nextExpression.calcPsi();\n // }\n\n if (currentExpressionPlacement === nextExpressionPlacement) {\n // if ((currentExpression as any).label?.label?.text?.startsWith(\"dim\") ||\n // (nextExpression as any).label?.label?.text?.startsWith(\"dim\")) {\n // console.log(\"here\");\n // }\n const dist: PointF2D = this.getDistance(currentExpression.PositionAndShape, nextExpression.PositionAndShape);\n if (Math.abs(dist.x) < this.rules.DynamicExpressionMaxDistance) {\n // Prevent last found expression to be added twice. e.g. p();\n }\n }\n }\n // If expressions are colliding at end, we need to add them too\n groups.push(tmpList);\n\n for (const aes of groups) {\n if (aes.length > 0) {\n // Get the median y position and shift all group members to that position\n const centerYs: number[] = aes.map(expr => expr.PositionAndShape.Center.y);\n // TODO this may not give the right position for wedges (GraphicalContinuousDynamic, !isVerbal())\n const yIdeal: number = Math.max(...centerYs);\n // for (const ae of aes) { // debug\n // if (ae.PositionAndShape.Center.y > 6) {\n // // dynamic positioned at edge of skybottomline\n // console.log(`max expression in measure ${ae.SourceExpression.parentMeasure.MeasureNumber}: `);\n // console.dir(aes);\n // }\n // }\n\n for (let exprIdx: number = 0; exprIdx < aes.length; exprIdx++) {\n const expr: AbstractGraphicalExpression = aes[exprIdx];\n const centerOffset: number = centerYs[exprIdx] - yIdeal;\n // TODO centerOffset is way too big sometimes, like 7.0 in An die Ferne Geliebte (measure 10, dim.)\n // FIXME: Expressions should not behave differently.\n if (expr instanceof VexFlowContinuousDynamicExpression) {\n (expr as VexFlowContinuousDynamicExpression).shiftYPosition(-centerOffset);\n (expr as VexFlowContinuousDynamicExpression).calcPsi();\n } else {\n // TODO: The 0.8 are because the letters are a bit too far done\n expr.PositionAndShape.RelativePosition.y -= centerOffset * 0.8;\n // note: verbal GraphicalContinuousDynamicExpressions have a label, nonverbal ones don't.\n // take care to update and take the right bounding box for skyline.\n expr.PositionAndShape.calculateBoundingBox();\n }\n // Squeeze wedges\n if ((expr as VexFlowContinuousDynamicExpression).squeeze) {\n const nextExpression: AbstractGraphicalExpression = exprIdx < aes.length - 1 ? aes[exprIdx + 1] : undefined;\n const prevExpression: AbstractGraphicalExpression = exprIdx > 0 ? aes[exprIdx - 1] : undefined;\n if (nextExpression) {\n const overlapRight: PointF2D = this.getOverlap(expr.PositionAndShape, nextExpression.PositionAndShape);\n (expr as VexFlowContinuousDynamicExpression).squeeze(-(overlapRight.x + this.rules.DynamicExpressionSpacer));\n }\n if (prevExpression) {\n const overlapLeft: PointF2D = this.getOverlap(prevExpression.PositionAndShape, expr.PositionAndShape);\n (expr as VexFlowContinuousDynamicExpression).squeeze(overlapLeft.x + this.rules.DynamicExpressionSpacer);\n }\n }\n }\n }\n }\n }\n\n /**\n * Get distance between two bounding boxes\n * @param a First bounding box\n * @param b Second bounding box\n */\n private getDistance(a: BoundingBox, b: BoundingBox): PointF2D {\n const rightBorderA: number = a.RelativePosition.x + a.BorderMarginRight;\n const leftBorderB: number = b.RelativePosition.x + b.BorderMarginLeft;\n const bottomBorderA: number = a.RelativePosition.y + a.BorderMarginBottom;\n const topBorderB: number = b.RelativePosition.y + b.BorderMarginTop;\n return new PointF2D(leftBorderB - rightBorderA,\n topBorderB - bottomBorderA);\n // note: this is a distance vector, not absolute distance, otherwise we need Math.abs\n }\n\n /**\n * Get overlap of two bounding boxes\n * @param a First bounding box\n * @param b Second bounding box\n */\n private getOverlap(a: BoundingBox, b: BoundingBox): PointF2D {\n return new PointF2D((a.RelativePosition.x + a.BorderMarginRight) - (b.RelativePosition.x + b.BorderMarginLeft),\n (a.RelativePosition.y + a.BorderMarginBottom) - (b.RelativePosition.y + b.BorderMarginTop));\n }\n}\n","import {TextAlignmentEnum} from \"../../Common/Enums/TextAlignment\";\nimport {Label} from \"../Label\";\nimport {GraphicalLabel} from \"./GraphicalLabel\";\nimport {ChordSymbolContainer} from \"../VoiceData/ChordSymbolContainer\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {EngravingRules} from \"./EngravingRules\";\nimport { KeyInstruction } from \"../VoiceData/Instructions/KeyInstruction\";\n\nexport class GraphicalChordSymbolContainer extends GraphicalObject {\n private chordSymbolContainer: ChordSymbolContainer;\n private graphicalLabel: GraphicalLabel;\n private rules: EngravingRules;\n\n constructor(chordSymbolContainer: ChordSymbolContainer, parent: BoundingBox, textHeight: number,\n keyInstruction: KeyInstruction, transposeHalftones: number, rules: EngravingRules) {\n super();\n this.chordSymbolContainer = chordSymbolContainer;\n this.boundingBox = new BoundingBox(this, parent);\n this.calculateLabel(textHeight, transposeHalftones, keyInstruction);\n this.rules = rules;\n }\n public get GetChordSymbolContainer(): ChordSymbolContainer {\n return this.chordSymbolContainer;\n }\n public get GetGraphicalLabel(): GraphicalLabel {\n return this.graphicalLabel;\n }\n private calculateLabel(textHeight: number, transposeHalftones: number, keyInstruction: KeyInstruction): void {\n const text: string = ChordSymbolContainer.calculateChordText(this.chordSymbolContainer, transposeHalftones, keyInstruction);\n this.graphicalLabel = new GraphicalLabel(new Label(text), textHeight, TextAlignmentEnum.CenterBottom, this.rules, this.boundingBox);\n this.graphicalLabel.PositionAndShape.RelativePosition = new PointF2D(0.0, 0.0);\n }\n}\n","import { PointF2D } from \"../../Common/DataObjects/PointF2D\";\n\nexport class GraphicalCurve {\n private static bezierCurveStepSize: number = 1000;\n private static tPow3: number[];\n private static oneMinusTPow3: number[];\n private static bezierFactorOne: number[];\n private static bezierFactorTwo: number[];\n\n // Pre-calculate Curve-independend factors, to be used later in the Slur- and TieCurvePoints calculation.\n constructor() {\n GraphicalCurve.tPow3 = new Array(GraphicalCurve.bezierCurveStepSize);\n GraphicalCurve.oneMinusTPow3 = new Array(GraphicalCurve.bezierCurveStepSize);\n GraphicalCurve.bezierFactorOne = new Array(GraphicalCurve.bezierCurveStepSize);\n GraphicalCurve.bezierFactorTwo = new Array(GraphicalCurve.bezierCurveStepSize);\n for (let i: number = 0; i < GraphicalCurve.bezierCurveStepSize; i++) {\n const t: number = i / GraphicalCurve.bezierCurveStepSize;\n\n GraphicalCurve.tPow3[i] = Math.pow(t, 3);\n GraphicalCurve.oneMinusTPow3[i] = Math.pow((1 - t), 3);\n GraphicalCurve.bezierFactorOne[i] = 3 * Math.pow((1 - t), 2) * t;\n GraphicalCurve.bezierFactorTwo[i] = 3 * (1 - t) * Math.pow(t, 2);\n }\n }\n\n public bezierStartPt: PointF2D;\n public bezierStartControlPt: PointF2D;\n public bezierEndControlPt: PointF2D;\n public bezierEndPt: PointF2D;\n\n /**\n *\n * @param relativePosition\n */\n public calculateCurvePointAtIndex(relativePosition: number): PointF2D {\n const index: number = Math.round(relativePosition * GraphicalCurve.bezierCurveStepSize);\n if (index < 0 || index >= GraphicalCurve.bezierCurveStepSize) {\n return new PointF2D();\n }\n\n return new PointF2D( (GraphicalCurve.oneMinusTPow3[index] * this.bezierStartPt.x\n + GraphicalCurve.bezierFactorOne[index] * this.bezierStartControlPt.x\n + GraphicalCurve.bezierFactorTwo[index] * this.bezierEndControlPt.x\n + GraphicalCurve.tPow3[index] * this.bezierEndPt.x)\n , (GraphicalCurve.oneMinusTPow3[index] * this.bezierStartPt.y\n + GraphicalCurve.bezierFactorOne[index] * this.bezierStartControlPt.y\n + GraphicalCurve.bezierFactorTwo[index] * this.bezierEndControlPt.y + GraphicalCurve.tPow3[index] * this.bezierEndPt.y));\n }\n}\n","import {LyricsEntry} from \"../VoiceData/Lyrics/LyricsEntry\";\nimport {GraphicalLyricWord} from \"./GraphicalLyricWord\";\nimport {GraphicalLabel} from \"./GraphicalLabel\";\nimport {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\nimport {Label} from \"../Label\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {TextAlignmentEnum} from \"../../Common/Enums/TextAlignment\";\n\n/**\n * The graphical counterpart of a [[LyricsEntry]]\n */\nexport class GraphicalLyricEntry {\n private lyricsEntry: LyricsEntry;\n private graphicalLyricWord: GraphicalLyricWord;\n private graphicalLabel: GraphicalLabel;\n private graphicalStaffEntry: GraphicalStaffEntry;\n\n constructor(lyricsEntry: LyricsEntry, graphicalStaffEntry: GraphicalStaffEntry, lyricsHeight: number, staffHeight: number) {\n this.lyricsEntry = lyricsEntry;\n this.graphicalStaffEntry = graphicalStaffEntry;\n const lyricsTextAlignment: TextAlignmentEnum = graphicalStaffEntry.parentMeasure.parentSourceMeasure.Rules.LyricsAlignmentStandard;\n // for small notes with long text, use center alignment\n // TODO use this, fix center+left alignment combination spacing\n if (lyricsEntry.Text.length >= 4\n && lyricsEntry.Parent.Notes[0].Length.Denominator > 4\n && lyricsTextAlignment === TextAlignmentEnum.LeftBottom) {\n // lyricsTextAlignment = TextAlignmentAndPlacement.CenterBottom;\n }\n const label: Label = new Label(lyricsEntry.Text);\n this.graphicalLabel = new GraphicalLabel(\n label,\n lyricsHeight,\n lyricsTextAlignment,\n this.graphicalStaffEntry.parentMeasure.parentSourceMeasure.Rules,\n graphicalStaffEntry.PositionAndShape,\n );\n this.graphicalLabel.PositionAndShape.RelativePosition = new PointF2D(0, staffHeight);\n if (lyricsTextAlignment === TextAlignmentEnum.LeftBottom) {\n this.graphicalLabel.PositionAndShape.RelativePosition.x -= 1; // make lyrics optically left-aligned\n }\n }\n\n public get LyricsEntry(): LyricsEntry {\n return this.lyricsEntry;\n }\n public get ParentLyricWord(): GraphicalLyricWord {\n return this.graphicalLyricWord;\n }\n public set ParentLyricWord(value: GraphicalLyricWord) {\n this.graphicalLyricWord = value;\n }\n public get GraphicalLabel(): GraphicalLabel {\n return this.graphicalLabel;\n }\n public set GraphicalLabel(value: GraphicalLabel) {\n this.graphicalLabel = value;\n }\n public get StaffEntryParent(): GraphicalStaffEntry {\n return this.graphicalStaffEntry;\n }\n public set StaffEntryParent(value: GraphicalStaffEntry) {\n this.graphicalStaffEntry = value;\n }\n}\n","import {LyricWord} from \"../VoiceData/Lyrics/LyricsWord\";\nimport {GraphicalLyricEntry} from \"./GraphicalLyricEntry\";\n\n/**\n * The graphical counterpart of a [[LyricWord]]\n */\nexport class GraphicalLyricWord {\n private lyricWord: LyricWord;\n private graphicalLyricsEntries: GraphicalLyricEntry[] = [];\n\n constructor(lyricWord: LyricWord) {\n this.lyricWord = lyricWord;\n this.initialize();\n }\n\n public get GetLyricWord(): LyricWord {\n return this.lyricWord;\n }\n\n public get GraphicalLyricsEntries(): GraphicalLyricEntry[] {\n return this.graphicalLyricsEntries;\n }\n\n public set GraphicalLyricsEntries(value: GraphicalLyricEntry[]) {\n this.graphicalLyricsEntries = value;\n }\n\n public isFilled(): boolean {\n for (let i: number = 0; i < this.graphicalLyricsEntries.length; i++) {\n if (!this.graphicalLyricsEntries[i]) {\n return false;\n }\n }\n return true;\n }\n\n private initialize(): void {\n // FIXME: This is actually not needed in Javascript as we have dynamic memory allication?\n for (let i: number = 0; i < this.lyricWord.Syllables.length; i++) {\n this.graphicalLyricsEntries.push(undefined);\n }\n }\n}\n","import {MusicSystem} from \"./MusicSystem\";\nimport {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\nimport {StaffLine} from \"./StaffLine\";\nimport {Staff} from \"../VoiceData/Staff\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {ClefInstruction} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {KeyInstruction} from \"../VoiceData/Instructions/KeyInstruction\";\nimport {RhythmInstruction} from \"../VoiceData/Instructions/RhythmInstruction\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {Voice} from \"../VoiceData/Voice\";\nimport {VoiceEntry} from \"../VoiceData/VoiceEntry\";\nimport {SystemLinesEnum} from \"./SystemLinesEnum\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\n\n/**\n * Represents a measure in the music sheet (one measure in one staff line)\n */\nexport abstract class GraphicalMeasure extends GraphicalObject {\n protected firstInstructionStaffEntry: GraphicalStaffEntry;\n protected lastInstructionStaffEntry: GraphicalStaffEntry;\n\n constructor(staff: Staff = undefined, parentSourceMeasure: SourceMeasure = undefined, staffLine: StaffLine = undefined) {\n super();\n this.parentStaff = staff;\n this.parentSourceMeasure = parentSourceMeasure;\n this.parentStaffLine = staffLine;\n if (staffLine) {\n this.parentStaff = staffLine.ParentStaff;\n this.PositionAndShape = new BoundingBox(this, staffLine.PositionAndShape);\n } else {\n this.PositionAndShape = new BoundingBox(this);\n }\n this.PositionAndShape.BorderBottom = 4;\n if (this.parentSourceMeasure) {\n this.measureNumber = this.parentSourceMeasure.MeasureNumber;\n }\n\n this.staffEntries = [];\n }\n\n public parentSourceMeasure: SourceMeasure;\n public staffEntries: GraphicalStaffEntry[];\n /**\n * The x-width of possibly existing: repetition start line, clef, key, rhythm.\n */\n public beginInstructionsWidth: number;\n /**\n * The minimum possible x-width of all staff entries without overlapping.\n */\n public minimumStaffEntriesWidth: number;\n /**\n * Will be set by music system builder while building systems.\n */\n public staffEntriesScaleFactor: number;\n /**\n * The x-width of possibly existing: repetition end line, clef.\n */\n public endInstructionsWidth: number;\n public hasError: boolean;\n\n private parentStaff: Staff;\n private parentMusicSystem: MusicSystem;\n private measureNumber: number = -1;\n private parentStaffLine: StaffLine;\n\n public get ParentStaff(): Staff {\n return this.parentStaff;\n }\n\n public get ParentMusicSystem(): MusicSystem {\n return this.parentMusicSystem;\n }\n\n public set ParentMusicSystem(value: MusicSystem) {\n this.parentMusicSystem = value;\n }\n\n public get MeasureNumber(): number {\n return this.measureNumber;\n }\n\n public get FirstInstructionStaffEntry(): GraphicalStaffEntry {\n return this.firstInstructionStaffEntry;\n }\n\n public set FirstInstructionStaffEntry(value: GraphicalStaffEntry) {\n this.firstInstructionStaffEntry = value;\n }\n\n public get LastInstructionStaffEntry(): GraphicalStaffEntry {\n return this.lastInstructionStaffEntry;\n }\n\n public set LastInstructionStaffEntry(value: GraphicalStaffEntry) {\n this.lastInstructionStaffEntry = value;\n }\n\n public get ParentStaffLine(): StaffLine {\n return this.parentStaffLine;\n }\n\n public set ParentStaffLine(value: StaffLine) {\n this.parentStaffLine = value;\n if (this.parentStaffLine) {\n this.PositionAndShape.Parent = this.parentStaffLine.PositionAndShape;\n }\n }\n\n /**\n * Reset all the geometric values and parameters of this measure and put it in an initialized state.\n * This is needed to evaluate a measure a second time by system builder.\n */\n public resetLayout(): void {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Return the x-width of a given measure line.\n * @param line\n */\n public getLineWidth(line: SystemLinesEnum): number {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Add the given clef to the begin of the measure.\n * This has to update/increase BeginInstructionsWidth.\n * @param clef\n */\n public addClefAtBegin(clef: ClefInstruction): void {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Add the given key to the begin of the measure.\n * This has to update/increase BeginInstructionsWidth.\n * @param currentKey - The new valid key.\n * @param previousKey - The old cancelled key. Needed to show which accidentals are not valid any more.\n * @param currentClef - The valid clef. Needed to put the accidentals on the right y-positions.\n */\n public addKeyAtBegin(currentKey: KeyInstruction, previousKey: KeyInstruction, currentClef: ClefInstruction): void {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Add the given rhythm to the begin of the measure.\n * This has to update/increase BeginInstructionsWidth.\n * @param rhythm\n */\n public addRhythmAtBegin(rhythm: RhythmInstruction): void {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Add the given clef to the end of the measure.\n * This has to update/increase EndInstructionsWidth.\n * @param clef\n */\n public addClefAtEnd(clef: ClefInstruction): void {\n throw new Error(\"not implemented\");\n }\n\n /**\n * Set the x-position relative to the staffline (y-Position is always 0 relative to the staffline).\n * @param xPos\n */\n public setPositionInStaffline(xPos: number): void {\n this.PositionAndShape.RelativePosition = new PointF2D(xPos, 0);\n }\n\n /**\n * Set the overall x-width of the measure.\n * @param width\n */\n public setWidth(width: number): void {\n this.PositionAndShape.BorderRight = width;\n }\n\n /**\n * This method is called after the StaffEntriesScaleFactor has been set.\n * Here the final x-positions of the staff entries have to be set.\n * (multiply the minimal positions with the scaling factor, considering the BeginInstructionsWidth).\n */\n public layoutSymbols(): void {\n throw new Error(\"not implemented\");\n }\n\n public findGraphicalStaffEntryFromTimestamp(relativeTimestamp: Fraction): GraphicalStaffEntry {\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n if (graphicalStaffEntry.relInMeasureTimestamp?.Equals(relativeTimestamp)) {\n return graphicalStaffEntry;\n }\n }\n return undefined;\n }\n\n /**\n * Iterate from start to end and find the [[GraphicalStaffEntry]] with the same absolute timestamp.\n * @param absoluteTimestamp\n * @returns {any}\n */\n public findGraphicalStaffEntryFromVerticalContainerTimestamp(absoluteTimestamp: Fraction): GraphicalStaffEntry {\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n if (graphicalStaffEntry.sourceStaffEntry.VerticalContainerParent.getAbsoluteTimestamp().Equals(absoluteTimestamp)) {\n return graphicalStaffEntry;\n }\n }\n return undefined;\n }\n\n /**\n * Check if the all the [[GraphicalMeasure]]'s [[StaffEntry]]s (their minimum Length) have the same duration with the [[SourceMeasure]].\n * @returns {boolean}\n */\n public hasSameDurationWithSourceMeasureParent(): boolean {\n const duration: Fraction = new Fraction(0, 1);\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n duration.Add(graphicalStaffEntry.findStaffEntryMinNoteLength());\n }\n return duration.Equals(this.parentSourceMeasure.Duration);\n }\n\n /**\n * Check a whole [[Measure]] for the presence of multiple Voices (used for Stem direction).\n * @returns {boolean}\n */\n public hasMultipleVoices(): boolean {\n if (this.staffEntries.length === 0) {\n return false;\n }\n const voices: Voice[] = [];\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const staffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n for (let idx2: number = 0, len2: number = staffEntry.sourceStaffEntry.VoiceEntries.length; idx2 < len2; ++idx2) {\n const voiceEntry: VoiceEntry = staffEntry.sourceStaffEntry.VoiceEntries[idx2];\n if (voices.indexOf(voiceEntry.ParentVoice) < 0) {\n voices.push(voiceEntry.ParentVoice);\n }\n }\n }\n if (voices.length > 1) {\n return true;\n }\n return false;\n }\n\n public isVisible(): boolean {\n return this.ParentStaff.ParentInstrument.Visible;\n }\n\n public getGraphicalMeasureDurationFromStaffEntries(): Fraction {\n let duration: Fraction = new Fraction(0, 1);\n const voices: Voice[] = [];\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n for (let idx2: number = 0, len2: number = graphicalStaffEntry.sourceStaffEntry.VoiceEntries.length; idx2 < len2; ++idx2) {\n const voiceEntry: VoiceEntry = graphicalStaffEntry.sourceStaffEntry.VoiceEntries[idx2];\n if (voices.indexOf(voiceEntry.ParentVoice) < 0) {\n voices.push(voiceEntry.ParentVoice);\n }\n }\n }\n for (let idx: number = 0, len: number = voices.length; idx < len; ++idx) {\n const voice: Voice = voices[idx];\n const voiceDuration: Fraction = new Fraction(0, 1);\n for (const graphicalStaffEntry of this.staffEntries) {\n for (const gve of graphicalStaffEntry.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry.ParentVoice === voice && gve.notes.length > 0) {\n voiceDuration.Add(gve.notes[0].graphicalNoteLength);\n }\n }\n }\n if (duration.lt(voiceDuration)) {\n duration = Fraction.createFromFraction(voiceDuration);\n }\n }\n return duration;\n }\n\n public addGraphicalStaffEntry(graphicalStaffEntry: GraphicalStaffEntry): void {\n this.staffEntries.push(graphicalStaffEntry);\n }\n\n /**\n * Add a [[StaffEntry]] (along with its [[BoundingBox]]) to the current Measure.\n * @param staffEntry\n */\n public addGraphicalStaffEntryAtTimestamp(staffEntry: GraphicalStaffEntry): void {\n if (staffEntry) {\n if (this.staffEntries.length === 0 || this.staffEntries[this.staffEntries.length - 1].relInMeasureTimestamp.lt(staffEntry.relInMeasureTimestamp)) {\n this.staffEntries.push(staffEntry);\n } else {\n for (let i: number = this.staffEntries.length - 1; i >= 0; i--) {\n if (this.staffEntries[i].relInMeasureTimestamp.lt(staffEntry.relInMeasureTimestamp)) {\n this.staffEntries.splice(i + 1, 0, staffEntry);\n break;\n }\n if (i === 0) {\n this.staffEntries.splice(i, 0, staffEntry);\n }\n }\n }\n }\n }\n\n public beginsWithLineRepetition(): boolean {\n const sourceMeasure: SourceMeasure = this.parentSourceMeasure;\n if (!sourceMeasure) {\n return false;\n }\n return sourceMeasure.beginsWithLineRepetition();\n }\n\n /**\n * Check if this Measure is a Repetition Ending.\n * @returns {boolean}\n */\n public endsWithLineRepetition(): boolean {\n const sourceMeasure: SourceMeasure = this.parentSourceMeasure;\n if (!sourceMeasure) {\n return false;\n }\n return sourceMeasure.endsWithLineRepetition();\n }\n\n /**\n * Check if a Repetition starts at the next Measure.\n * @returns {boolean}\n */\n public beginsWithWordRepetition(): boolean {\n const sourceMeasure: SourceMeasure = this.parentSourceMeasure;\n if (!sourceMeasure) {\n return false;\n }\n return sourceMeasure.beginsWithWordRepetition();\n }\n\n /**\n * Check if this Measure is a Repetition Ending.\n */\n public endsWithWordRepetition(): boolean {\n const sourceMeasure: SourceMeasure = this.parentSourceMeasure;\n if (!sourceMeasure) {\n return false;\n }\n return sourceMeasure.endsWithWordRepetition();\n }\n}\n\n","import {Note} from \"../VoiceData/Note\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {KeyInstruction} from \"../VoiceData/Instructions/KeyInstruction\";\nimport {ClefInstruction} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {OctaveEnum} from \"../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport {Pitch} from \"../../Common/DataObjects/Pitch\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {MusicSheetCalculator} from \"./MusicSheetCalculator\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {GraphicalVoiceEntry} from \"./GraphicalVoiceEntry\";\nimport {GraphicalMusicPage} from \"./GraphicalMusicPage\";\n\n/**\n * The graphical counterpart of a [[Note]]\n */\nexport class GraphicalNote extends GraphicalObject {\n constructor(note: Note, parent: GraphicalVoiceEntry, graphicalNoteLength: Fraction = undefined) {\n super();\n this.sourceNote = note;\n this.parentVoiceEntry = parent;\n this.PositionAndShape = new BoundingBox(this, parent.PositionAndShape);\n if (graphicalNoteLength) {\n this.graphicalNoteLength = graphicalNoteLength;\n } else {\n this.graphicalNoteLength = note.Length;\n }\n\n this.numberOfDots = this.calculateNumberOfNeededDots(this.graphicalNoteLength);\n }\n\n public sourceNote: Note;\n public graphicalNoteLength: Fraction;\n public parentVoiceEntry: GraphicalVoiceEntry;\n public numberOfDots: number;\n\n public Transpose(keyInstruction: KeyInstruction, activeClef: ClefInstruction, halfTones: number, octaveEnum: OctaveEnum): Pitch {\n let transposedPitch: Pitch = this.sourceNote.Pitch;\n if (MusicSheetCalculator.transposeCalculator) {\n transposedPitch = MusicSheetCalculator.transposeCalculator.transposePitch(this.sourceNote.Pitch, keyInstruction, halfTones);\n }\n return transposedPitch;\n }\n\n /**\n * Return the number of dots needed to represent the given fraction.\n * @param fraction\n * @returns {number}\n */\n private calculateNumberOfNeededDots(fraction: Fraction): number {\n let num: number = 1;\n let product: number = 2;\n const expandedNumerator: number = fraction.GetExpandedNumerator();\n if (!this.sourceNote || !this.sourceNote.NoteTuplet) {\n while (product < expandedNumerator) {\n num++;\n product = Math.pow(2, num);\n }\n }\n return Math.min(3, num - 1);\n }\n\n public get ParentMusicPage(): GraphicalMusicPage {\n return this.parentVoiceEntry.parentStaffEntry.parentMeasure.ParentMusicSystem.Parent;\n }\n}\n","import {GraphicalObject} from \"./GraphicalObject\";\nimport {OctaveShift, OctaveEnum} from \"../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {MusicSymbol} from \"./MusicSymbol\";\nimport {ArgumentOutOfRangeException} from \"../Exceptions\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\n\n/**\n * The graphical counterpart of an [[OctaveShift]]\n */\nexport class GraphicalOctaveShift extends GraphicalObject {\n\n constructor(octaveShift: OctaveShift, parent: BoundingBox) {\n super();\n this.getOctaveShift = octaveShift;\n this.setSymbol();\n // ToDo: set the size again due to the given symbol...\n //this.PositionAndShape = new BoundingBox(parent, this.octaveSymbol, this);\n this.PositionAndShape = new BoundingBox(this, parent);\n }\n\n public getOctaveShift: OctaveShift;\n public octaveSymbol: MusicSymbol;\n public dashesStart: PointF2D;\n public dashesEnd: PointF2D;\n public endsOnDifferentStaffLine: boolean;\n public isFirstPart: boolean;\n public isSecondPart: boolean;\n\n private setSymbol(): void {\n switch (this.getOctaveShift.Type) {\n case OctaveEnum.VA8:\n this.octaveSymbol = MusicSymbol.VA8;\n break;\n case OctaveEnum.VB8:\n this.octaveSymbol = MusicSymbol.VB8;\n break;\n case OctaveEnum.MA15:\n this.octaveSymbol = MusicSymbol.MA15;\n break;\n case OctaveEnum.MB15:\n this.octaveSymbol = MusicSymbol.MB15;\n break;\n default:\n throw new ArgumentOutOfRangeException(\"\");\n }\n }\n\n}\n","\nimport { PointF2D } from \"../../Common/DataObjects/PointF2D\";\nimport { GraphicalNote } from \"./GraphicalNote\";\nimport { GraphicalCurve } from \"./GraphicalCurve\";\nimport { Slur } from \"../VoiceData/Expressions/ContinuousExpressions/Slur\";\nimport { PlacementEnum } from \"../VoiceData/Expressions/AbstractExpression\";\nimport { EngravingRules } from \"./EngravingRules\";\nimport { StaffLine } from \"./StaffLine\";\nimport { SkyBottomLineCalculator } from \"./SkyBottomLineCalculator\";\nimport { Matrix2D } from \"../../Common/DataObjects/Matrix2D\";\nimport { LinkedVoice } from \"../VoiceData/LinkedVoice\";\nimport { GraphicalVoiceEntry } from \"./GraphicalVoiceEntry\";\nimport { GraphicalStaffEntry } from \"./GraphicalStaffEntry\";\nimport { Fraction } from \"../../Common/DataObjects/Fraction\";\nimport { StemDirectionType } from \"../VoiceData/VoiceEntry\";\n\nexport class GraphicalSlur extends GraphicalCurve {\n // private intersection: PointF2D;\n\n constructor(slur: Slur) {\n super();\n this.slur = slur;\n }\n\n public slur: Slur;\n public staffEntries: GraphicalStaffEntry[] = [];\n public placement: PlacementEnum;\n public graceStart: boolean;\n public graceEnd: boolean;\n\n /**\n * Compares the timespan of two Graphical Slurs\n * @param x\n * @param y\n */\n public static Compare (x: GraphicalSlur, y: GraphicalSlur ): number {\n if (x.staffEntries.length < 1) { // x.staffEntries[i] can return undefined in Beethoven Moonlight Sonata sample\n return -1;\n } else if (y.staffEntries.length < 1) {\n return 1;\n }\n const xTimestampSpan: Fraction = Fraction.minus(x.staffEntries[x.staffEntries.length - 1].getAbsoluteTimestamp(),\n x.staffEntries[0].getAbsoluteTimestamp());\n const yTimestampSpan: Fraction = Fraction.minus(y.staffEntries[y.staffEntries.length - 1].getAbsoluteTimestamp(),\n y.staffEntries[0].getAbsoluteTimestamp());\n\n if (xTimestampSpan.RealValue > yTimestampSpan.RealValue) {\n return 1;\n }\n\n if (yTimestampSpan.RealValue > xTimestampSpan.RealValue) {\n return -1;\n }\n\n return 0;\n }\n\n /**\n *\n * @param rules\n */\n public calculateCurve(rules: EngravingRules): void {\n\n // single GraphicalSlur means a single Curve, eg each GraphicalSlurObject is meant to be on the same StaffLine\n // a Slur can span more than one GraphicalSlurObjects\n const startStaffEntry: GraphicalStaffEntry = this.staffEntries[0];\n const endStaffEntry: GraphicalStaffEntry = this.staffEntries[this.staffEntries.length - 1];\n\n // where the Slur (not the graphicalObject) starts and ends (could belong to another StaffLine)\n let slurStartNote: GraphicalNote = startStaffEntry.findGraphicalNoteFromNote(this.slur.StartNote);\n if (!slurStartNote && this.graceStart) {\n slurStartNote = startStaffEntry.findGraphicalNoteFromGraceNote(this.slur.StartNote);\n }\n if (!slurStartNote) {\n slurStartNote = startStaffEntry.findEndTieGraphicalNoteFromNoteWithStartingSlur(this.slur.StartNote, this.slur);\n }\n let slurEndNote: GraphicalNote = endStaffEntry.findGraphicalNoteFromNote(this.slur.EndNote);\n if (!slurEndNote && this.graceEnd) {\n slurEndNote = endStaffEntry.findGraphicalNoteFromGraceNote(this.slur.EndNote);\n }\n\n const staffLine: StaffLine = startStaffEntry.parentMeasure.ParentStaffLine;\n const skyBottomLineCalculator: SkyBottomLineCalculator = staffLine.SkyBottomLineCalculator;\n\n this.calculatePlacement(skyBottomLineCalculator, staffLine);\n\n // the Start- and End Reference Points for the Sky-BottomLine\n const startEndPoints: {startX: number, startY: number, endX: number, endY: number} =\n this.calculateStartAndEnd(slurStartNote, slurEndNote, staffLine, rules, skyBottomLineCalculator);\n\n const startX: number = startEndPoints.startX;\n const endX: number = startEndPoints.endX;\n let startY: number = startEndPoints.startY;\n let endY: number = startEndPoints.endY;\n const minAngle: number = rules.SlurTangentMinAngle;\n const maxAngle: number = rules.SlurTangentMaxAngle;\n let start: PointF2D, end: PointF2D;\n let points: PointF2D[];\n\n if (this.placement === PlacementEnum.Above) {\n startY -= rules.SlurNoteHeadYOffset;\n endY -= rules.SlurNoteHeadYOffset;\n start = new PointF2D(startX, startY);\n end = new PointF2D(endX, endY);\n const startUpperRight: PointF2D = new PointF2D(this.staffEntries[0].parentMeasure.PositionAndShape.RelativePosition.x\n + this.staffEntries[0].PositionAndShape.RelativePosition.x,\n startY);\n if (slurStartNote) {\n startUpperRight.x += this.staffEntries[0].PositionAndShape.BorderRight;\n } else {\n // continuing Slur from previous StaffLine - must start after last Instruction of first Measure\n startUpperRight.x = this.staffEntries[0].parentMeasure.beginInstructionsWidth;\n }\n\n // must also add the GraceStaffEntry's ParentStaffEntry Position\n if (this.graceStart) {\n startUpperRight.x += endStaffEntry.PositionAndShape.RelativePosition.x;\n }\n\n const endUpperLeft: PointF2D = new PointF2D(this.staffEntries[this.staffEntries.length - 1].parentMeasure.PositionAndShape.RelativePosition.x\n + this.staffEntries[this.staffEntries.length - 1].PositionAndShape.RelativePosition.x,\n endY);\n if (slurEndNote) {\n endUpperLeft.x += this.staffEntries[this.staffEntries.length - 1].PositionAndShape.BorderLeft;\n } else {\n // Slur continues to next StaffLine - must reach the end of current StaffLine\n endUpperLeft.x = this.staffEntries[this.staffEntries.length - 1].parentMeasure.PositionAndShape.RelativePosition.x\n + this.staffEntries[this.staffEntries.length - 1].parentMeasure.PositionAndShape.Size.width;\n }\n\n // must also add the GraceStaffEntry's ParentStaffEntry Position\n if (this.graceEnd) {\n endUpperLeft.x += endStaffEntry.staffEntryParent.PositionAndShape.RelativePosition.x;\n }\n\n // SkyLinePointsList between firstStaffEntry startUpperRightPoint and lastStaffentry endUpperLeftPoint\n points = this.calculateTopPoints(startUpperRight, endUpperLeft, staffLine, skyBottomLineCalculator);\n\n if (points.length === 0) {\n const pointF: PointF2D = new PointF2D((endUpperLeft.x - startUpperRight.x) / 2 + startUpperRight.x,\n (endUpperLeft.y - startUpperRight.y) / 2 + startUpperRight.y);\n points.push(pointF);\n }\n\n // Angle between original x-Axis and Line from Start-Point to End-Point\n const startEndLineAngleRadians: number = (Math.atan((endY - startY) / (endX - startX)));\n\n // translate origin at Start (positiveY from Bottom to Top => change sign for Y)\n const start2: PointF2D = new PointF2D(0, 0);\n let end2: PointF2D = new PointF2D(endX - startX, -(endY - startY));\n\n // and Rotate at new Origin startEndLineAngle degrees\n // clockwise/counterclockwise Rotation\n // after Rotation end2.Y must be 0\n // Inverse of RotationMatrix = TransposeMatrix of RotationMatrix\n let rotationMatrix: Matrix2D, transposeMatrix: Matrix2D;\n rotationMatrix = Matrix2D.getRotationMatrix(startEndLineAngleRadians);\n transposeMatrix = rotationMatrix.getTransposeMatrix();\n end2 = rotationMatrix.vectorMultiplication(end2);\n const transformedPoints: PointF2D[] = this.calculateTranslatedAndRotatedPointListAbove(points, startX, startY, rotationMatrix);\n\n // calculate tangent Lines maximum Slopes between StartPoint and EndPoint to all Points in SkyLine\n // and tangent Lines characteristica\n const leftLineSlope: number = this.calculateMaxLeftSlope(transformedPoints, start2, end2);\n const rightLineSlope: number = this.calculateMaxRightSlope(transformedPoints, start2, end2);\n const leftLineD: number = start2.y - start2.x * leftLineSlope;\n const rightLineD: number = end2.y - end2.x * rightLineSlope;\n\n // calculate IntersectionPoint of the 2 Lines\n // if same Slope, then Point.X between Start and End and Point.Y fixed\n const intersectionPoint: PointF2D = new PointF2D();\n let sameSlope: boolean = false;\n if (Math.abs(Math.abs(leftLineSlope) - Math.abs(rightLineSlope)) < 0.0001) {\n intersectionPoint.x = end2.x / 2;\n intersectionPoint.y = 0;\n sameSlope = true;\n } else {\n intersectionPoint.x = (rightLineD - leftLineD) / (leftLineSlope - rightLineSlope);\n intersectionPoint.y = leftLineSlope * intersectionPoint.x + leftLineD;\n }\n\n // calculate tangent Lines Angles\n // (using the calculated Slopes and the Ratio from the IntersectionPoint's distance to the MaxPoint in the SkyLine)\n const leftAngle: number = minAngle;\n const rightAngle: number = -minAngle;\n // if the calculated Slopes (left and right) are equal, then Angles have fixed values\n if (!sameSlope) {\n this.calculateAngles(leftAngle, rightAngle, leftLineSlope, rightLineSlope, maxAngle);\n }\n\n // calculate Curve's Control Points\n const controlPoints: {leftControlPoint: PointF2D, rightControlPoint: PointF2D} =\n this.calculateControlPoints(end2.x, leftAngle, rightAngle, transformedPoints);\n\n let leftControlPoint: PointF2D = controlPoints.leftControlPoint;\n let rightControlPoint: PointF2D = controlPoints.rightControlPoint;\n\n // transform ControlPoints to original Coordinate System\n // (rotate back and translate back)\n leftControlPoint = transposeMatrix.vectorMultiplication(leftControlPoint);\n leftControlPoint.x += startX;\n leftControlPoint.y = -leftControlPoint.y + startY;\n rightControlPoint = transposeMatrix.vectorMultiplication(rightControlPoint);\n rightControlPoint.x += startX;\n rightControlPoint.y = -rightControlPoint.y + startY;\n\n /* for DEBUG only */\n // this.intersection = transposeMatrix.vectorMultiplication(intersectionPoint);\n // this.intersection.x += startX;\n // this.intersection.y = -this.intersection.y + startY;\n /* for DEBUG only */\n\n // set private members\n this.bezierStartPt = start;\n this.bezierStartControlPt = leftControlPoint;\n this.bezierEndControlPt = rightControlPoint;\n this.bezierEndPt = end;\n\n // calculate CurvePoints\n const length: number = staffLine.SkyLine.length;\n const startIndex: number = skyBottomLineCalculator.getLeftIndexForPointX(this.bezierStartPt.x, length);\n const endIndex: number = skyBottomLineCalculator.getLeftIndexForPointX(this.bezierEndPt.x, length);\n const distance: number = this.bezierEndPt.x - this.bezierStartPt.x;\n const samplingUnit: number = skyBottomLineCalculator.SamplingUnit;\n for (let i: number = startIndex; i < endIndex; i++) {\n // get the right distance ratio and index on the curve\n const diff: number = i / samplingUnit - this.bezierStartPt.x;\n const curvePoint: PointF2D = this.calculateCurvePointAtIndex(Math.abs(diff) / distance);\n\n // update left- and rightIndex for better accuracy\n let index: number = skyBottomLineCalculator.getLeftIndexForPointX(curvePoint.x, length);\n // update SkyLine with final slur curve:\n if (index >= startIndex) {\n staffLine.SkyLine[index] = Math.min(staffLine.SkyLine[index], curvePoint.y);\n }\n index++;\n if (index < length) {\n staffLine.SkyLine[index] = Math.min(staffLine.SkyLine[index], curvePoint.y);\n }\n }\n } else {\n startY += rules.SlurNoteHeadYOffset;\n endY += rules.SlurNoteHeadYOffset;\n start = new PointF2D(startX, startY);\n end = new PointF2D(endX, endY);\n\n // firstStaffEntry startLowerRightPoint and lastStaffentry endLowerLeftPoint\n const startLowerRight: PointF2D = new PointF2D(this.staffEntries[0].parentMeasure.PositionAndShape.RelativePosition.x\n + this.staffEntries[0].PositionAndShape.RelativePosition.x,\n startY);\n if (slurStartNote) {\n startLowerRight.x += this.staffEntries[0].PositionAndShape.BorderRight;\n } else {\n // continuing Slur from previous StaffLine - must start after last Instruction of first Measure\n startLowerRight.x = this.staffEntries[0].parentMeasure.beginInstructionsWidth;\n }\n\n // must also add the GraceStaffEntry's ParentStaffEntry Position\n if (this.graceStart) {\n startLowerRight.x += endStaffEntry.PositionAndShape.RelativePosition.x;\n }\n const endLowerLeft: PointF2D = new PointF2D(this.staffEntries[this.staffEntries.length - 1].parentMeasure.PositionAndShape.RelativePosition.x\n + this.staffEntries[this.staffEntries.length - 1].PositionAndShape.RelativePosition.x,\n endY);\n if (slurEndNote) {\n endLowerLeft.x += this.staffEntries[this.staffEntries.length - 1].PositionAndShape.BorderLeft;\n } else {\n // Slur continues to next StaffLine - must reach the end of current StaffLine\n endLowerLeft.x = this.staffEntries[this.staffEntries.length - 1].parentMeasure.PositionAndShape.RelativePosition.x\n + this.staffEntries[this.staffEntries.length - 1].parentMeasure.PositionAndShape.Size.width;\n }\n\n // must also add the GraceStaffEntry's ParentStaffEntry Position\n if (this.graceEnd) {\n endLowerLeft.x += endStaffEntry.staffEntryParent.PositionAndShape.RelativePosition.x;\n }\n\n // BottomLinePointsList between firstStaffEntry startLowerRightPoint and lastStaffentry endLowerLeftPoint\n points = this.calculateBottomPoints(startLowerRight, endLowerLeft, staffLine, skyBottomLineCalculator);\n\n if (points.length === 0) {\n const pointF: PointF2D = new PointF2D((endLowerLeft.x - startLowerRight.x) / 2 + startLowerRight.x,\n (endLowerLeft.y - startLowerRight.y) / 2 + startLowerRight.y);\n points.push(pointF);\n }\n\n // Angle between original x-Axis and Line from Start-Point to End-Point\n const startEndLineAngleRadians: number = Math.atan((endY - startY) / (endX - startX));\n // translate origin at Start\n const start2: PointF2D = new PointF2D(0, 0);\n let end2: PointF2D = new PointF2D(endX - startX, endY - startY);\n\n // and Rotate at new Origin startEndLineAngle degrees\n // clockwise/counterclockwise Rotation\n // after Rotation end2.Y must be 0\n // Inverse of RotationMatrix = TransposeMatrix of RotationMatrix\n let rotationMatrix: Matrix2D, transposeMatrix: Matrix2D;\n rotationMatrix = Matrix2D.getRotationMatrix(-startEndLineAngleRadians);\n transposeMatrix = rotationMatrix.getTransposeMatrix();\n end2 = rotationMatrix.vectorMultiplication(end2);\n const transformedPoints: PointF2D[] = this.calculateTranslatedAndRotatedPointListBelow(points, startX, startY, rotationMatrix);\n\n // calculate tangent Lines maximum Slopes between StartPoint and EndPoint to all Points in BottomLine\n // and tangent Lines characteristica\n const leftLineSlope: number = this.calculateMaxLeftSlope(transformedPoints, start2, end2);\n const rightLineSlope: number = this.calculateMaxRightSlope(transformedPoints, start2, end2);\n const leftLineD: number = start2.y - start2.x * leftLineSlope;\n const rightLineD: number = end2.y - end2.x * rightLineSlope;\n\n // calculate IntersectionPoint of the 2 Lines\n // if same Slope, then Point.X between Start and End and Point.Y fixed\n const intersectionPoint: PointF2D = new PointF2D();\n let sameSlope: boolean = false;\n if (Math.abs(Math.abs(leftLineSlope) - Math.abs(rightLineSlope)) < 0.0001) {\n intersectionPoint.x = end2.x / 2;\n intersectionPoint.y = 0;\n sameSlope = true;\n } else {\n intersectionPoint.x = (rightLineD - leftLineD) / (leftLineSlope - rightLineSlope);\n intersectionPoint.y = leftLineSlope * intersectionPoint.x + leftLineD;\n }\n\n // calculate tangent Lines Angles\n // (using the calculated Slopes and the Ratio from the IntersectionPoint's distance to the MaxPoint in the SkyLine)\n const leftAngle: number = minAngle;\n const rightAngle: number = -minAngle;\n // if the calculated Slopes (left and right) are equal, then Angles have fixed values\n if (!sameSlope) {\n this.calculateAngles(leftAngle, rightAngle, leftLineSlope, rightLineSlope, maxAngle);\n }\n\n // calculate Curve's Control Points\n const controlPoints: {leftControlPoint: PointF2D, rightControlPoint: PointF2D} =\n this.calculateControlPoints(end2.x, leftAngle, rightAngle, transformedPoints);\n let leftControlPoint: PointF2D = controlPoints.leftControlPoint;\n let rightControlPoint: PointF2D = controlPoints.rightControlPoint;\n\n // transform ControlPoints to original Coordinate System\n // (rotate back and translate back)\n leftControlPoint = transposeMatrix.vectorMultiplication(leftControlPoint);\n leftControlPoint.x += startX;\n leftControlPoint.y += startY;\n rightControlPoint = transposeMatrix.vectorMultiplication(rightControlPoint);\n rightControlPoint.x += startX;\n rightControlPoint.y += startY;\n\n // set private members\n this.bezierStartPt = start;\n this.bezierStartControlPt = leftControlPoint;\n this.bezierEndControlPt = rightControlPoint;\n this.bezierEndPt = end;\n\n /* for DEBUG only */\n // this.intersection = transposeMatrix.vectorMultiplication(intersectionPoint);\n // this.intersection.x += startX;\n // this.intersection.y += startY;\n /* for DEBUG only */\n\n // calculate CurvePoints\n const length: number = staffLine.BottomLine.length;\n const startIndex: number = skyBottomLineCalculator.getLeftIndexForPointX(this.bezierStartPt.x, length);\n const endIndex: number = skyBottomLineCalculator.getLeftIndexForPointX(this.bezierEndPt.x, length);\n const distance: number = this.bezierEndPt.x - this.bezierStartPt.x;\n const samplingUnit: number = skyBottomLineCalculator.SamplingUnit;\n for (let i: number = startIndex; i < endIndex; i++) {\n // get the right distance ratio and index on the curve\n const diff: number = i / samplingUnit - this.bezierStartPt.x;\n const curvePoint: PointF2D = this.calculateCurvePointAtIndex(Math.abs(diff) / distance);\n\n // update left- and rightIndex for better accuracy\n let index: number = skyBottomLineCalculator.getLeftIndexForPointX(curvePoint.x, length);\n // update BottomLine with final slur curve:\n if (index >= startIndex) {\n staffLine.BottomLine[index] = Math.max(staffLine.BottomLine[index], curvePoint.y);\n }\n index++;\n if (index < length) {\n staffLine.BottomLine[index] = Math.max(staffLine.BottomLine[index], curvePoint.y);\n }\n }\n }\n }\n\n\n /**\n * This method calculates the Start and End Positions of the Slur Curve.\n * @param slurStartNote\n * @param slurEndNote\n * @param staffLine\n * @param startX\n * @param startY\n * @param endX\n * @param endY\n * @param rules\n * @param skyBottomLineCalculator\n */\n private calculateStartAndEnd( slurStartNote: GraphicalNote,\n slurEndNote: GraphicalNote,\n staffLine: StaffLine,\n rules: EngravingRules,\n skyBottomLineCalculator: SkyBottomLineCalculator): {startX: number, startY: number, endX: number, endY: number} {\n let startX: number = 0;\n let startY: number = 0;\n let endX: number = 0;\n let endY: number = 0;\n\n if (slurStartNote) {\n // must be relative to StaffLine\n startX = slurStartNote.PositionAndShape.RelativePosition.x + slurStartNote.parentVoiceEntry.parentStaffEntry.PositionAndShape.RelativePosition.x\n + slurStartNote.parentVoiceEntry.parentStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x;\n\n // If Slur starts on a Gracenote\n if (this.graceStart) {\n startX += slurStartNote.parentVoiceEntry.parentStaffEntry.staffEntryParent.PositionAndShape.RelativePosition.x;\n }\n\n //const first: GraphicalNote = slurStartNote.parentVoiceEntry.notes[0];\n\n // Determine Start/End Point coordinates with the VoiceEntry of the Start/EndNote of the slur\n const slurStartVE: GraphicalVoiceEntry = slurStartNote.parentVoiceEntry;\n\n if (this.placement === PlacementEnum.Above) {\n startY = slurStartVE.PositionAndShape.RelativePosition.y + slurStartVE.PositionAndShape.BorderTop;\n } else {\n startY = slurStartVE.PositionAndShape.RelativePosition.y + slurStartVE.PositionAndShape.BorderBottom;\n }\n\n // If the stem points towards the starting point of the slur, shift the slur by a small amount to start (approximately) at the x-position\n // of the notehead. Note: an exact calculation using the position of the note is too complicate for the payoff\n if ( slurStartVE.parentVoiceEntry.StemDirection === StemDirectionType.Down && this.placement === PlacementEnum.Below ) {\n startX -= 0.5;\n }\n if (slurStartVE.parentVoiceEntry.StemDirection === StemDirectionType.Up && this.placement === PlacementEnum.Above) {\n startX += 0.5;\n }\n // if (first.NoteStem && first.NoteStem.Direction === StemEnum.StemUp && this.placement === PlacementEnum.Above) {\n // startX += first.NoteStem.PositionAndShape.RelativePosition.x;\n // startY = skyBottomLineCalculator.getSkyLineMinAtPoint(staffLine, startX);\n // } else {\n // const last: GraphicalNote = slurStartNote[slurEndNote.parentVoiceEntry.notes.length - 1];\n // if (last.NoteStem && last.NoteStem.Direction === StemEnum.StemDown && this.placement === PlacementEnum.Below) {\n // startX += last.NoteStem.PositionAndShape.RelativePosition.x;\n // startY = skyBottomLineCalculator.getBottomLineMaxAtPoint(staffLine, startX);\n // } else {\n // }\n // }\n } else {\n startX = staffLine.Measures[0].beginInstructionsWidth;\n }\n\n if (slurEndNote) {\n endX = slurEndNote.PositionAndShape.RelativePosition.x + slurEndNote.parentVoiceEntry.parentStaffEntry.PositionAndShape.RelativePosition.x\n + slurEndNote.parentVoiceEntry.parentStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x;\n\n // If Slur ends in a Gracenote\n if (this.graceEnd) {\n endX += slurEndNote.parentVoiceEntry.parentStaffEntry.staffEntryParent.PositionAndShape.RelativePosition.x;\n }\n\n const slurEndVE: GraphicalVoiceEntry = slurEndNote.parentVoiceEntry;\n if (this.placement === PlacementEnum.Above) {\n endY = slurEndVE.PositionAndShape.RelativePosition.y + slurEndVE.PositionAndShape.BorderTop;\n } else {\n endY = slurEndVE.PositionAndShape.RelativePosition.y + slurEndVE.PositionAndShape.BorderBottom;\n }\n\n // If the stem points towards the endpoint of the slur, shift the slur by a small amount to start (approximately) at the x-position\n // of the notehead. Note: an exact calculation using the position of the note is too complicate for the payoff\n if ( slurEndVE.parentVoiceEntry.StemDirection === StemDirectionType.Down && this.placement === PlacementEnum.Below ) {\n endX -= 0.5;\n }\n if (slurEndVE.parentVoiceEntry.StemDirection === StemDirectionType.Up && this.placement === PlacementEnum.Above) {\n endX += 0.5;\n }\n // const first: GraphicalNote = slurEndNote.parentVoiceEntry.notes[0];\n // if (first.NoteStem && first.NoteStem.Direction === StemEnum.StemUp && this.placement === PlacementEnum.Above) {\n // endX += first.NoteStem.PositionAndShape.RelativePosition.x;\n // endY = skyBottomLineCalculator.getSkyLineMinAtPoint(staffLine, endX);\n // } else {\n // const last: GraphicalNote = slurEndNote.parentVoiceEntry.notes[slurEndNote.parentVoiceEntry.notes.length - 1];\n // if (last.NoteStem && last.NoteStem.Direction === StemEnum.StemDown && this.placement === PlacementEnum.Below) {\n // endX += last.NoteStem.PositionAndShape.RelativePosition.x;\n // endY = skyBottomLineCalculator.getBottomLineMaxAtPoint(staffLine, endX);\n // } else {\n // if (this.placement === PlacementEnum.Above) {\n // const highestNote: GraphicalNote = last;\n // endY = highestNote.PositionAndShape.RelativePosition.y;\n // if (highestNote.NoteHead) {\n // endY += highestNote.NoteHead.PositionAndShape.BorderMarginTop;\n // } else { endY += highestNote.PositionAndShape.BorderTop; }\n // } else {\n // const lowestNote: GraphicalNote = first;\n // endY = lowestNote.parentVoiceEntry\n // lowestNote.PositionAndShape.RelativePosition.y;\n // if (lowestNote.NoteHead) {\n // endY += lowestNote.NoteHead.PositionAndShape.BorderMarginBottom;\n // } else { endY += lowestNote.PositionAndShape.BorderBottom; }\n // }\n // }\n // }\n } else {\n endX = staffLine.PositionAndShape.Size.width;\n }\n\n // if GraphicalSlur breaks over System, then the end/start of the curve is at the corresponding height with the known start/end\n if (!slurStartNote && !slurEndNote) {\n startY = 0;\n endY = 0;\n }\n if (!slurStartNote) {\n startY = endY;\n }\n if (!slurEndNote) {\n endY = startY;\n }\n\n // if two slurs start/end at the same GraphicalNote, then the second gets an offset\n if (this.slur.startNoteHasMoreStartingSlurs() && this.slur.isSlurLonger()) {\n if (this.placement === PlacementEnum.Above) {\n startY -= rules.SlursStartingAtSameStaffEntryYOffset;\n } else { startY += rules.SlursStartingAtSameStaffEntryYOffset; }\n }\n if (this.slur.endNoteHasMoreEndingSlurs() && this.slur.isSlurLonger()) {\n if (this.placement === PlacementEnum.Above) {\n endY -= rules.SlursStartingAtSameStaffEntryYOffset;\n } else { endY += rules.SlursStartingAtSameStaffEntryYOffset; }\n }\n\n return {startX, startY, endX, endY};\n }\n\n /**\n * This method calculates the placement of the Curve.\n * @param skyBottomLineCalculator\n * @param staffLine\n */\n private calculatePlacement(skyBottomLineCalculator: SkyBottomLineCalculator, staffLine: StaffLine): void {\n // old version: when lyrics are given place above:\n // if ( !this.slur.StartNote.ParentVoiceEntry.LyricsEntries.isEmpty || (this.slur.EndNote\n // && !this.slur.EndNote.ParentVoiceEntry.LyricsEntries.isEmpty) ) {\n // this.placement = PlacementEnum.Above;\n // return;\n // }\n\n // if any StaffEntry belongs to a Measure with multiple Voices, than\n // if Slur's Start- or End-Note belongs to a LinkedVoice Below else Above\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n if (graphicalStaffEntry.parentMeasure.hasMultipleVoices()) {\n if (this.slur.StartNote.ParentVoiceEntry.ParentVoice instanceof LinkedVoice ||\n this.slur.EndNote.ParentVoiceEntry.ParentVoice instanceof LinkedVoice) {\n this.placement = PlacementEnum.Below;\n } else { this.placement = PlacementEnum.Above; }\n return;\n }\n }\n\n // when lyrics are given place above:\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: GraphicalStaffEntry = this.staffEntries[idx];\n if (graphicalStaffEntry.LyricsEntries.length > 0) {\n this.placement = PlacementEnum.Above;\n return;\n }\n }\n const startStaffEntry: GraphicalStaffEntry = this.staffEntries[0];\n const endStaffEntry: GraphicalStaffEntry = this.staffEntries[this.staffEntries.length - 1];\n\n // single Voice, opposite to StemDirection\n // here should only be one voiceEntry, so we can take graphicalVoiceEntries[0]:\n const startStemDirection: StemDirectionType = startStaffEntry.graphicalVoiceEntries[0].parentVoiceEntry.StemDirection;\n const endStemDirection: StemDirectionType = endStaffEntry.graphicalVoiceEntries[0].parentVoiceEntry.StemDirection;\n if (startStemDirection ===\n endStemDirection) {\n this.placement = (startStemDirection === StemDirectionType.Up) ? PlacementEnum.Below : PlacementEnum.Above;\n } else {\n // Placement at the side with the minimum border\n let sX: number = startStaffEntry.PositionAndShape.BorderLeft + startStaffEntry.PositionAndShape.RelativePosition.x\n + startStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x;\n let eX: number = endStaffEntry.PositionAndShape.BorderRight + endStaffEntry.PositionAndShape.RelativePosition.x\n + endStaffEntry.parentMeasure.PositionAndShape.RelativePosition.x;\n\n if (this.graceStart) {\n sX += endStaffEntry.PositionAndShape.RelativePosition.x;\n }\n if (this.graceEnd) {\n eX += endStaffEntry.staffEntryParent.PositionAndShape.RelativePosition.x;\n }\n\n // get SkyBottomLine borders\n const minAbove: number = skyBottomLineCalculator.getSkyLineMinInRange(sX, eX) * -1;\n const maxBelow: number = skyBottomLineCalculator.getBottomLineMaxInRange(sX, eX) - staffLine.StaffHeight;\n\n if (maxBelow > minAbove) {\n this.placement = PlacementEnum.Above;\n } else { this.placement = PlacementEnum.Below; }\n }\n }\n\n /**\n * This method calculates the Points between Start- and EndPoint (case above).\n * @param start\n * @param end\n * @param staffLine\n * @param skyBottomLineCalculator\n */\n private calculateTopPoints(start: PointF2D, end: PointF2D, staffLine: StaffLine, skyBottomLineCalculator: SkyBottomLineCalculator): PointF2D[] {\n const points: PointF2D[] = [];\n let startIndex: number = skyBottomLineCalculator.getRightIndexForPointX(start.x, staffLine.SkyLine.length);\n let endIndex: number = skyBottomLineCalculator.getLeftIndexForPointX(end.x, staffLine.SkyLine.length);\n\n if (startIndex < 0) {\n startIndex = 0;\n }\n if (endIndex >= staffLine.SkyLine.length) {\n endIndex = staffLine.SkyLine.length - 1;\n }\n\n for (let i: number = startIndex; i < endIndex; i++) {\n const point: PointF2D = new PointF2D((0.5 + i) / skyBottomLineCalculator.SamplingUnit, staffLine.SkyLine[i]);\n points.push(point);\n }\n\n return points;\n }\n\n /**\n * This method calculates the Points between Start- and EndPoint (case below).\n * @param start\n * @param end\n * @param staffLine\n * @param skyBottomLineCalculator\n */\n private calculateBottomPoints(start: PointF2D, end: PointF2D, staffLine: StaffLine, skyBottomLineCalculator: SkyBottomLineCalculator): PointF2D[] {\n const points: PointF2D[] = [];\n\n // get BottomLine indices\n let startIndex: number = skyBottomLineCalculator.getRightIndexForPointX(start.x, staffLine.BottomLine.length);\n let endIndex: number = skyBottomLineCalculator.getLeftIndexForPointX(end.x, staffLine.BottomLine.length);\n if (startIndex < 0) {\n startIndex = 0;\n }\n if (endIndex >= staffLine.BottomLine.length) {\n endIndex = staffLine.BottomLine.length - 1;\n }\n\n for (let i: number = startIndex; i < endIndex; i++) {\n const point: PointF2D = new PointF2D((0.5 + i) / skyBottomLineCalculator.SamplingUnit, staffLine.BottomLine[i]);\n points.push(point);\n }\n\n return points;\n }\n\n /**\n * This method calculates the maximum slope between StartPoint and BetweenPoints.\n * @param points\n * @param start\n * @param end\n */\n private calculateMaxLeftSlope(points: PointF2D[], start: PointF2D, end: PointF2D): number {\n let slope: number = -Number.MAX_VALUE;\n const x: number = start.x;\n const y: number = start.y;\n\n for (let i: number = 0; i < points.length; i++) {\n if (Math.abs(points[i].y - Number.MAX_VALUE) < 0.0001 || Math.abs(points[i].y - (-Number.MAX_VALUE)) < 0.0001) {\n continue;\n }\n slope = Math.max(slope, (points[i].y - y) / (points[i].x - x));\n }\n\n // in case all Points don't have a meaningful value or the slope between Start- and EndPoint is just bigger\n slope = Math.max(slope, Math.abs(end.y - y) / (end.x - x));\n\n return slope;\n }\n\n /**\n * This method calculates the maximum slope between EndPoint and BetweenPoints.\n * @param points\n * @param start\n * @param end\n */\n private calculateMaxRightSlope(points: PointF2D[], start: PointF2D, end: PointF2D): number {\n let slope: number = Number.MAX_VALUE;\n const x: number = end.x;\n const y: number = end.y;\n\n for (let i: number = 0; i < points.length; i++) {\n if (Math.abs(points[i].y - Number.MAX_VALUE) < 0.0001 || Math.abs(points[i].y - (-Number.MAX_VALUE)) < 0.0001) {\n continue;\n }\n slope = Math.min(slope, (y - points[i].y) / (x - points[i].x));\n }\n\n // in case no Point has a meaningful value or the slope between Start- and EndPoint is just smaller\n slope = Math.min(slope, (y - start.y) / (x - start.x));\n\n return slope;\n }\n\n /**\n * This method returns the maximum (meaningful) points.Y.\n * @param points\n */\n private getPointListMaxY(points: PointF2D[]): number {\n let max: number = -Number.MAX_VALUE;\n\n for (let idx: number = 0, len: number = points.length; idx < len; ++idx) {\n const point: PointF2D = points[idx];\n if (Math.abs(point.y - (-Number.MAX_VALUE)) < 0.0001 || Math.abs(point.y - Number.MAX_VALUE) < 0.0001) {\n continue;\n }\n max = Math.max(max, point.y);\n }\n\n return max;\n }\n\n /**\n * This method calculates the translated and rotated PointsList (case above).\n * @param points\n * @param startX\n * @param startY\n * @param rotationMatrix\n */\n private calculateTranslatedAndRotatedPointListAbove(points: PointF2D[], startX: number, startY: number, rotationMatrix: Matrix2D): PointF2D[] {\n const transformedPoints: PointF2D[] = [];\n for (let i: number = 0; i < points.length; i++) {\n if (Math.abs(points[i].y - Number.MAX_VALUE) < 0.0001 || Math.abs(points[i].y - (-Number.MAX_VALUE)) < 0.0001) {\n continue;\n }\n\n let point: PointF2D = new PointF2D(points[i].x - startX, -(points[i].y - startY));\n point = rotationMatrix.vectorMultiplication(point);\n transformedPoints.push(point);\n }\n\n return transformedPoints;\n }\n\n /**\n * This method calculates the translated and rotated PointsList (case below).\n * @param points\n * @param startX\n * @param startY\n * @param rotationMatrix\n */\n private calculateTranslatedAndRotatedPointListBelow(points: PointF2D[], startX: number, startY: number, rotationMatrix: Matrix2D): PointF2D[] {\n const transformedPoints: PointF2D[] = [];\n for (let i: number = 0; i < points.length; i++) {\n if (Math.abs(points[i].y - Number.MAX_VALUE) < 0.0001 || Math.abs(points[i].y - (-Number.MAX_VALUE)) < 0.0001) {\n continue;\n }\n let point: PointF2D = new PointF2D(points[i].x - startX, points[i].y - startY);\n point = rotationMatrix.vectorMultiplication(point);\n transformedPoints.push(point);\n }\n\n return transformedPoints;\n }\n\n /**\n * This method calculates the HeightWidthRatio between the MaxYpoint (from the points between StartPoint and EndPoint)\n * and the X-distance from StartPoint to EndPoint.\n * @param endX\n * @param points\n */\n private calculateHeightWidthRatio(endX: number, points: PointF2D[]): number {\n if (points.length === 0) {\n return 0;\n }\n\n // in case of negative points\n const max: number = Math.max(0, this.getPointListMaxY(points));\n\n return max / endX;\n }\n\n /**\n * This method calculates the 2 ControlPoints of the SlurCurve.\n * @param endX\n * @param leftAngle\n * @param rightAngle\n * @param points\n */\n private calculateControlPoints(endX: number,\n leftAngle: number, rightAngle: number, points: PointF2D[]): { leftControlPoint: PointF2D, rightControlPoint: PointF2D } {\n // calculate HeightWidthRatio between the MaxYpoint (from the points between StartPoint and EndPoint)\n // and the X-distance from StartPoint to EndPoint\n // use this HeightWidthRatio to get a \"normalized\" Factor (based on tested parameters)\n // this Factor denotes the Length of the TangentLine of the Curve (a proportion of the X-distance from StartPoint to EndPoint)\n // finally from this Length and the calculated Angles we get the coordinates of the Control Points\n const heightWidthRatio: number = this.calculateHeightWidthRatio(endX, points);\n const factor: number = GraphicalSlur.k * heightWidthRatio + GraphicalSlur.d;\n\n const relativeLength: number = endX * factor;\n const leftControlPoint: PointF2D = new PointF2D();\n leftControlPoint.x = relativeLength * Math.cos(leftAngle * GraphicalSlur.degreesToRadiansFactor);\n leftControlPoint.y = relativeLength * Math.sin(leftAngle * GraphicalSlur.degreesToRadiansFactor);\n\n const rightControlPoint: PointF2D = new PointF2D();\n rightControlPoint.x = endX - (relativeLength * Math.cos(rightAngle * GraphicalSlur.degreesToRadiansFactor));\n rightControlPoint.y = -(relativeLength * Math.sin(rightAngle * GraphicalSlur.degreesToRadiansFactor));\n return {leftControlPoint, rightControlPoint};\n }\n\n /**\n * This method calculates the angles for the Curve's Tangent Lines.\n * @param leftAngle\n * @param rightAngle\n * @param leftLineSlope\n * @param rightLineSlope\n * @param maxAngle\n */\n private calculateAngles(leftAngle: number, rightAngle: number, leftLineSlope: number, rightLineSlope: number, maxAngle: number): void {\n // calculate Angles from the calculated Slopes, adding also a given angle\n const angle: number = 20;\n\n let calculatedLeftAngle: number = Math.atan(leftLineSlope) / GraphicalSlur.degreesToRadiansFactor;\n if (leftLineSlope > 0) {\n calculatedLeftAngle += angle;\n } else {\n calculatedLeftAngle -= angle;\n }\n\n let calculatedRightAngle: number = Math.atan(rightLineSlope) / GraphicalSlur.degreesToRadiansFactor;\n if (rightLineSlope < 0) {\n calculatedRightAngle -= angle;\n } else {\n calculatedRightAngle += angle;\n }\n\n // +/- 80 is the max/min allowed Angle\n leftAngle = Math.min(Math.max(leftAngle, calculatedLeftAngle), maxAngle);\n rightAngle = Math.max(Math.min(rightAngle, calculatedRightAngle), -maxAngle);\n }\n\n private static degreesToRadiansFactor: number = Math.PI / 180;\n private static k: number = 0.9;\n private static d: number = 0.2;\n}\n","import {SourceStaffEntry} from \"../VoiceData/SourceStaffEntry\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {VerticalGraphicalStaffEntryContainer} from \"./VerticalGraphicalStaffEntryContainer\";\nimport {Note} from \"../VoiceData/Note\";\nimport {Slur} from \"../VoiceData/Expressions/ContinuousExpressions/Slur\";\nimport {Voice} from \"../VoiceData/Voice\";\nimport {VoiceEntry} from \"../VoiceData/VoiceEntry\";\nimport {GraphicalTie} from \"./GraphicalTie\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {GraphicalMeasure} from \"./GraphicalMeasure\";\nimport {GraphicalNote} from \"./GraphicalNote\";\nimport {GraphicalChordSymbolContainer} from \"./GraphicalChordSymbolContainer\";\nimport {GraphicalLyricEntry} from \"./GraphicalLyricEntry\";\nimport {AbstractGraphicalInstruction} from \"./AbstractGraphicalInstruction\";\nimport {GraphicalStaffEntryLink} from \"./GraphicalStaffEntryLink\";\nimport {CollectionUtil} from \"../../Util/CollectionUtil\";\nimport { GraphicalVoiceEntry } from \"./GraphicalVoiceEntry\";\nimport { MusicSheetCalculator } from \"./MusicSheetCalculator\";\n\n/**\n * The graphical counterpart of a [[SourceStaffEntry]].\n */\nexport abstract class GraphicalStaffEntry extends GraphicalObject {\n constructor(parentMeasure: GraphicalMeasure, sourceStaffEntry: SourceStaffEntry = undefined, staffEntryParent: GraphicalStaffEntry = undefined) {\n super();\n this.parentMeasure = parentMeasure;\n this.graphicalVoiceEntries = [];\n this.sourceStaffEntry = sourceStaffEntry;\n if (staffEntryParent) {\n this.staffEntryParent = staffEntryParent;\n this.parentVerticalContainer = staffEntryParent.parentVerticalContainer;\n this.PositionAndShape = new BoundingBox(this, staffEntryParent.PositionAndShape);\n } else {\n this.PositionAndShape = new BoundingBox(this, parentMeasure.PositionAndShape);\n }\n if (sourceStaffEntry) {\n this.relInMeasureTimestamp = sourceStaffEntry.Timestamp;\n }\n }\n\n public graphicalChordContainers: GraphicalChordSymbolContainer[] = [];\n public graphicalLink: GraphicalStaffEntryLink;\n\n // Extra member needed, as tie notes have no direct source entry with the right time stamp.\n public relInMeasureTimestamp: Fraction;\n public sourceStaffEntry: SourceStaffEntry;\n public parentMeasure: GraphicalMeasure;\n public graphicalVoiceEntries: GraphicalVoiceEntry[];\n public staffEntryParent: GraphicalStaffEntry;\n public parentVerticalContainer: VerticalGraphicalStaffEntryContainer;\n public tabStaffEntry: GraphicalStaffEntry = undefined;\n\n private graphicalInstructions: AbstractGraphicalInstruction[] = [];\n private graphicalTies: GraphicalTie[] = [];\n private lyricsEntries: GraphicalLyricEntry[] = [];\n\n public get GraphicalInstructions(): AbstractGraphicalInstruction[] {\n return this.graphicalInstructions;\n }\n\n public get GraphicalTies(): GraphicalTie[] {\n return this.graphicalTies;\n }\n\n public get LyricsEntries(): GraphicalLyricEntry[] {\n return this.lyricsEntries;\n }\n\n public set LyricsEntries(value: GraphicalLyricEntry[]) {\n this.lyricsEntries = value;\n }\n\n /**\n * Calculate the absolute Timestamp.\n * @returns {Fraction}\n */\n public getAbsoluteTimestamp(): Fraction {\n const result: Fraction = this.parentMeasure.parentSourceMeasure.AbsoluteTimestamp.clone();\n if (this.relInMeasureTimestamp) {\n result.Add(this.relInMeasureTimestamp);\n }\n return result;\n }\n\n /**\n * Search through all the GraphicalNotes to find the suitable one for a TieEndNote.\n * @param tieNote\n * @returns {any}\n */\n public findEndTieGraphicalNoteFromNote(tieNote: Note): GraphicalNote {\n for (const gve of this.graphicalVoiceEntries) {\n for (const graphicalNote of gve.notes) {\n const note: Note = graphicalNote.sourceNote;\n if (!note.isRest()\n && note.Pitch.FundamentalNote === tieNote.Pitch.FundamentalNote\n && note.Pitch.Octave === tieNote.Pitch.Octave\n && note.getAbsoluteTimestamp().Equals(tieNote.getAbsoluteTimestamp())) {\n return graphicalNote;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Search through all [[GraphicalNote]]s to find the suitable one for an StartSlurNote (that 's also an EndTieNote).\n * @param tieNote\n * @param slur\n * @returns {any}\n */\n public findEndTieGraphicalNoteFromNoteWithStartingSlur(tieNote: Note, slur: Slur): GraphicalNote {\n if (!tieNote) {\n return undefined;\n }\n for (const gve of this.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry !== tieNote.ParentVoiceEntry) {\n continue;\n }\n for (const graphicalNote of gve.notes) {\n const note: Note = graphicalNote.sourceNote;\n if (note.NoteTie && note.NoteSlurs.indexOf(slur) !== -1) {\n return graphicalNote;\n }\n }\n }\n return undefined;\n }\n\n public findGraphicalNoteFromGraceNote(graceNote: Note): GraphicalNote {\n if (!graceNote) {\n return undefined;\n }\n for (const gve of this.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry !== graceNote.ParentVoiceEntry) {\n continue;\n }\n for (const graphicalNote of gve.notes) {\n if (graphicalNote.sourceNote === graceNote) {\n return graphicalNote;\n }\n }\n }\n return undefined;\n }\n\n public findGraphicalNoteFromNote(note: Note): GraphicalNote {\n if (!note) {\n return undefined;\n }\n for (const gve of this.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry !== note.ParentVoiceEntry) {\n continue;\n }\n for (const graphicalNote of gve.notes) {\n if (graphicalNote.sourceNote === note && this.getAbsoluteTimestamp().Equals(note.getAbsoluteTimestamp())) {\n return graphicalNote;\n }\n }\n }\n return undefined;\n }\n\n public getGraphicalNoteDurationFromVoice(voice: Voice): Fraction {\n for (const gve of this.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry.ParentVoice !== voice) {\n continue;\n }\n return gve.notes[0].graphicalNoteLength;\n }\n return new Fraction(0, 1);\n }\n\n /**\n * Find the [[StaffEntry]]'s [[GraphicalNote]]s that correspond to the given [[VoiceEntry]]'s [[Note]]s.\n * @param voiceEntry\n * @returns {any}\n */\n public findVoiceEntryGraphicalNotes(voiceEntry: VoiceEntry): GraphicalNote[] {\n for (const gve of this.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry === voiceEntry) {\n return gve.notes;\n }\n }\n return undefined;\n }\n\n /**\n * Check if the given [[VoiceEntry]] is part of the [[StaffEntry]]'s Linked [[VoiceEntry]].\n * @param voiceEntry\n * @returns {boolean}\n */\n public isVoiceEntryPartOfLinkedVoiceEntry(voiceEntry: VoiceEntry): boolean {\n if (this.sourceStaffEntry.Link) {\n for (let idx: number = 0, len: number = this.sourceStaffEntry.Link.LinkStaffEntries.length; idx < len; ++idx) {\n const sEntry: SourceStaffEntry = this.sourceStaffEntry.Link.LinkStaffEntries[idx];\n if (sEntry.VoiceEntries.indexOf(voiceEntry) !== -1 && sEntry !== this.sourceStaffEntry) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Return the [[StaffEntry]]'s Minimum NoteLength.\n * @returns {Fraction}\n */\n public findStaffEntryMinNoteLength(): Fraction {\n let minLength: Fraction = new Fraction(Number.MAX_VALUE, 1);\n for (const gve of this.graphicalVoiceEntries) {\n for (const graphicalNote of gve.notes) {\n const calNoteLen: Fraction = graphicalNote.graphicalNoteLength;\n if (calNoteLen.lt(minLength) && calNoteLen.GetExpandedNumerator() > 0) {\n minLength = calNoteLen;\n }\n }\n }\n return minLength;\n }\n\n public findStaffEntryMaxNoteLength(): Fraction {\n let maxLength: Fraction = new Fraction(0, 1);\n for (const gve of this.graphicalVoiceEntries) {\n for (const graphicalNote of gve.notes) {\n const calNoteLen: Fraction = graphicalNote.graphicalNoteLength;\n if (maxLength.lt(calNoteLen) && calNoteLen.GetExpandedNumerator() > 0) {\n maxLength = calNoteLen;\n }\n }\n }\n return maxLength;\n }\n\n /**\n * Find or creates the list of [[GraphicalNote]]s in case of a [[VoiceEntry]] (not from TiedNote).\n * @param voiceEntry\n * @returns {GraphicalNote[]}\n */\n public findOrCreateGraphicalVoiceEntry(voiceEntry: VoiceEntry): GraphicalVoiceEntry {\n for (const gve of this.graphicalVoiceEntries) {\n if (gve.parentVoiceEntry === voiceEntry) {\n return gve;\n }\n }\n // if not found in list, create new one and add to list:\n const graphicalVoiceEntry: GraphicalVoiceEntry = MusicSheetCalculator.symbolFactory.createVoiceEntry(voiceEntry, this);\n this.graphicalVoiceEntries.push(graphicalVoiceEntry);\n\n return graphicalVoiceEntry;\n }\n\n /**\n * Find or creates the list of [[GraphicalNote]]s in case of a TiedNote.\n * @param graphicalNote\n * @returns {GraphicalNote[]}\n */\n public findOrCreateGraphicalVoiceEntryFromGraphicalNote(graphicalNote: GraphicalNote): GraphicalVoiceEntry {\n for (const gve of this.graphicalVoiceEntries) {\n if (gve === graphicalNote.parentVoiceEntry) {\n return gve;\n }\n }\n // if not found in list, create new one and add to list:\n const graphicalVoiceEntry: GraphicalVoiceEntry = MusicSheetCalculator.symbolFactory.createVoiceEntry(graphicalNote.sourceNote.ParentVoiceEntry, this);\n this.graphicalVoiceEntries.push(graphicalVoiceEntry);\n\n return graphicalVoiceEntry;\n }\n\n /**\n * Insert the [[GraphicalNote]] to the correct index of the [[GraphicalNote]]s list,\n * so that the order of the [[GraphicalNote]]'s in the list corresponds to the [[VoiceEntry]]'s [[Note]]s order.\n * (needed when adding Tie-EndNotes).\n * @param graphicalNotes\n * @param graphicalNote\n */\n public addGraphicalNoteToListAtCorrectYPosition(gve: GraphicalVoiceEntry, graphicalNote: GraphicalNote): void {\n const graphicalNotes: GraphicalNote[] = gve.notes;\n if (graphicalNotes.length === 0 ||\n graphicalNote.PositionAndShape.RelativePosition.y < CollectionUtil.last(graphicalNotes).PositionAndShape.RelativePosition.y) {\n graphicalNotes.push(graphicalNote);\n } else {\n for (let i: number = graphicalNotes.length - 1; i >= 0; i--) {\n if (graphicalNotes[i].PositionAndShape.RelativePosition.y > graphicalNote.PositionAndShape.RelativePosition.y) {\n graphicalNotes.splice(i + 1, 0, graphicalNote);\n break;\n }\n if (i === 0) {\n graphicalNotes.splice(0, 0, graphicalNote);\n break;\n }\n }\n }\n }\n\n /**\n * Returns true if this staff entry has only rests\n */\n public hasOnlyRests(): boolean {\n const hasOnlyRests: boolean = true;\n for (const gve of this.graphicalVoiceEntries) {\n for (const graphicalNote of gve.notes) {\n const note: Note = graphicalNote.sourceNote;\n if (!note.isRest()) {\n return false;\n }\n }\n }\n return hasOnlyRests;\n }\n}\n","import {Tie} from \"../VoiceData/Tie\";\nimport {GraphicalNote} from \"./GraphicalNote\";\n\n/**\n * The graphical counterpart of a [[Tie]].\n */\nexport class GraphicalTie {\n private tie: Tie;\n private startNote: GraphicalNote;\n private endNote: GraphicalNote;\n\n constructor(tie: Tie, start: GraphicalNote = undefined, end: GraphicalNote = undefined) {\n this.tie = tie;\n this.startNote = start;\n this.endNote = end;\n }\n\n public get GetTie(): Tie {\n return this.tie;\n }\n public get StartNote(): GraphicalNote {\n return this.startNote;\n }\n public set StartNote(value: GraphicalNote) {\n this.startNote = value;\n }\n public get EndNote(): GraphicalNote {\n return this.endNote;\n }\n public set EndNote(value: GraphicalNote) {\n this.endNote = value;\n }\n\n}\n","import { GraphicalObject } from \"./GraphicalObject\";\nimport { VoiceEntry } from \"../VoiceData/VoiceEntry\";\nimport { BoundingBox } from \"./BoundingBox\";\nimport { GraphicalNote } from \"./GraphicalNote\";\nimport { GraphicalStaffEntry } from \"./GraphicalStaffEntry\";\nimport { OctaveEnum } from \"../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport { EngravingRules } from \"./EngravingRules\";\n\n/**\n * The graphical counterpart of a [[VoiceEntry]].\n */\nexport class GraphicalVoiceEntry extends GraphicalObject {\n constructor(parentVoiceEntry: VoiceEntry, parentStaffEntry: GraphicalStaffEntry) {\n super();\n this.parentVoiceEntry = parentVoiceEntry;\n this.parentStaffEntry = parentStaffEntry;\n this.PositionAndShape = new BoundingBox(this, parentStaffEntry ? parentStaffEntry.PositionAndShape : undefined, true);\n this.notes = [];\n this.rules = parentStaffEntry ?\n parentStaffEntry.parentMeasure.parentSourceMeasure.Rules : new EngravingRules();\n }\n\n public parentVoiceEntry: VoiceEntry;\n public parentStaffEntry: GraphicalStaffEntry;\n public notes: GraphicalNote[];\n /** Contains octave shifts affecting this voice entry, caused by octave brackets. */\n public octaveShiftValue: OctaveEnum;\n protected rules: EngravingRules;\n\n /** Sort this entry's notes by pitch.\n * Notes need to be sorted for Vexflow StaveNote creation.\n * Note that Vexflow needs the reverse order, see VexFlowConverter.StaveNote().\n */\n public sort(): void {\n this.notes.sort((a, b) => {\n return b.sourceNote.Pitch.getHalfTone() - a.sourceNote.Pitch.getHalfTone();\n });\n }\n\n /** (Re-)color notes and stems\n */\n public color(): void {\n // override\n }\n}\n","/* tslint:disable no-unused-variable */\n//FIXME: Enble tslint again when all functions are implemented and in use!\n\nimport { EngravingRules } from \"./EngravingRules\";\nimport { StaffLine } from \"./StaffLine\";\nimport { PointF2D } from \"../../Common/DataObjects/PointF2D\";\nimport { CanvasVexFlowBackend } from \"./VexFlow/CanvasVexFlowBackend\";\nimport { VexFlowMeasure } from \"./VexFlow/VexFlowMeasure\";\nimport { unitInPixels } from \"./VexFlow/VexFlowMusicSheetDrawer\";\nimport log from \"loglevel\";\nimport { BoundingBox } from \"./BoundingBox\";\n/**\n * This class calculates and holds the skyline and bottom line information.\n * It also has functions to update areas of the two lines if new elements are\n * added to the staffline (e.g. measure number, annotations, ...)\n */\nexport class SkyBottomLineCalculator {\n /** Parent Staffline where the skyline and bottom line is attached */\n private mStaffLineParent: StaffLine;\n /** Internal array for the skyline */\n private mSkyLine: number[];\n /** Internal array for the bottomline */\n private mBottomLine: number[];\n /** Engraving rules for formatting */\n private mRules: EngravingRules;\n\n /**\n * Create a new object of the calculator\n * @param staffLineParent staffline where the calculator should be attached\n */\n constructor(staffLineParent: StaffLine) {\n this.mStaffLineParent = staffLineParent;\n this.mRules = staffLineParent.ParentMusicSystem.rules;\n }\n\n /**\n * This method calculates the Sky- and BottomLines for a StaffLine.\n */\n public calculateLines(): void {\n // calculate arrayLength\n const arrayLength: number = Math.max(Math.ceil(this.StaffLineParent.PositionAndShape.Size.width * this.SamplingUnit), 1);\n this.mSkyLine = [];\n this.mBottomLine = [];\n\n // Create a temporary canvas outside the DOM to draw the measure in.\n const tmpCanvas: any = new CanvasVexFlowBackend(this.StaffLineParent.ParentMusicSystem.rules);\n // search through all Measures\n for (const measure of this.StaffLineParent.Measures as VexFlowMeasure[]) {\n // must calculate first AbsolutePositions\n measure.PositionAndShape.calculateAbsolutePositionsRecursive(0, 0);\n\n // Pre initialize and get stuff for more performance\n const vsStaff: any = measure.getVFStave();\n // Headless because we are outside the DOM\n tmpCanvas.initializeHeadless(vsStaff.getWidth());\n const ctx: any = tmpCanvas.getContext();\n const canvas: any = tmpCanvas.getCanvas();\n const width: number = canvas.width;\n const height: number = canvas.height;\n\n // This magic number is an offset from the top image border so that\n // elements above the staffline can be drawn correctly.\n vsStaff.setY(vsStaff.y + 100);\n const oldMeasureWidth: number = vsStaff.getWidth();\n // We need to tell the VexFlow stave about the canvas width. This looks\n // redundant because it should know the canvas but somehow it doesn't.\n // Maybe I am overlooking something but for no this does the trick\n vsStaff.setWidth(width);\n measure.format();\n vsStaff.setWidth(oldMeasureWidth);\n try {\n measure.draw(ctx);\n // Vexflow errors can happen here, then our complete rendering loop would halt without catching errors.\n } catch (ex) {\n log.warn(\"SkyBottomLineCalculator.calculateLines.draw\", ex);\n }\n\n // imageData.data is a Uint8ClampedArray representing a one-dimensional array containing the data in the RGBA order\n // RGBA is 32 bit word with 8 bits red, 8 bits green, 8 bits blue and 8 bit alpha. Alpha should be 0 for all background colors.\n // Since we are only interested in black or white we can take 32bit words at once\n const imageData: any = ctx.getImageData(0, 0, width, height);\n const rgbaLength: number = 4;\n const measureArrayLength: number = Math.max(Math.ceil(measure.PositionAndShape.Size.width * this.mRules.SamplingUnit), 1);\n const tmpSkyLine: number[] = new Array(measureArrayLength);\n const tmpBottomLine: number[] = new Array(measureArrayLength);\n for (let x: number = 0; x < width; x++) {\n // SkyLine\n for (let y: number = 0; y < height; y++) {\n const yOffset: number = y * width * rgbaLength;\n const bufIndex: number = yOffset + x * rgbaLength;\n const alpha: number = imageData.data[bufIndex + 3];\n if (alpha > 0) {\n tmpSkyLine[x] = y;\n break;\n }\n }\n // BottomLine\n for (let y: number = height; y > 0; y--) {\n const yOffset: number = y * width * rgbaLength;\n const bufIndex: number = yOffset + x * rgbaLength;\n const alpha: number = imageData.data[bufIndex + 3];\n if (alpha > 0) {\n tmpBottomLine[x] = y;\n break;\n }\n }\n }\n this.mSkyLine.push(...tmpSkyLine);\n this.mBottomLine.push(...tmpBottomLine);\n\n // Set to true to only show the \"mini canvases\" and the corresponding skylines\n const debugTmpCanvas: boolean = false;\n if (debugTmpCanvas) {\n tmpSkyLine.forEach((y, x) => this.drawPixel(new PointF2D(x, y), tmpCanvas));\n tmpBottomLine.forEach((y, x) => this.drawPixel(new PointF2D(x, y), tmpCanvas, \"blue\"));\n const img: any = canvas.toDataURL(\"image/png\");\n document.write('');\n }\n tmpCanvas.clear();\n }\n // Subsampling:\n // The pixel width is bigger than the measure size in units. So we split the array into\n // chunks with the size of MeasurePixelWidth/measureUnitWidth and reduce the value to its\n // average\n const arrayChunkSize: number = this.mSkyLine.length / arrayLength;\n\n const subSampledSkyLine: number[] = [];\n const subSampledBottomLine: number[] = [];\n for (let chunkIndex: number = 0; chunkIndex < this.mSkyLine.length; chunkIndex += arrayChunkSize) {\n if (subSampledSkyLine.length === arrayLength) {\n break; // TODO find out why skyline.length becomes arrayLength + 1. see log.debug below\n }\n\n const endIndex: number = Math.min(this.mSkyLine.length, chunkIndex + arrayChunkSize);\n let chunk: number[] = this.mSkyLine.slice(chunkIndex, endIndex + 1); // slice does not include end index\n // TODO chunkIndex + arrayChunkSize is sometimes bigger than this.mSkyLine.length -> out of bounds\n // TODO chunkIndex + arrayChunkSize is often a non-rounded float as well. is that ok to use with slice?\n /*const diff: number = this.mSkyLine.length - (chunkIndex + arrayChunkSize);\n if (diff < 0) { // out of bounds\n console.log(\"length - slice end index: \" + diff);\n }*/\n\n subSampledSkyLine.push(Math.min(...chunk));\n chunk = this.mBottomLine.slice(chunkIndex, endIndex + 1); // slice does not include end index\n subSampledBottomLine.push(Math.max(...chunk));\n }\n\n this.mSkyLine = subSampledSkyLine;\n this.mBottomLine = subSampledBottomLine;\n if (this.mSkyLine.length !== arrayLength) { // bottomline will always be same length as well\n log.debug(`SkyLine calculation was not correct (${this.mSkyLine.length} instead of ${arrayLength})`);\n }\n // Remap the values from 0 to +/- height in units\n this.mSkyLine = this.mSkyLine.map(v => (v - Math.max(...this.mSkyLine)) / unitInPixels + this.StaffLineParent.TopLineOffset);\n this.mBottomLine = this.mBottomLine.map(v => (v - Math.min(...this.mBottomLine)) / unitInPixels + this.StaffLineParent.BottomLineOffset);\n }\n\n /**\n * Debugging drawing function that can draw single pixels\n * @param coord Point to draw to\n * @param backend the backend to be used\n * @param color the color to be used, default is red\n */\n private drawPixel(coord: PointF2D, backend: CanvasVexFlowBackend, color: string = \"#FF0000FF\"): void {\n const ctx: any = backend.getContext();\n const oldStyle: string = ctx.fillStyle;\n ctx.fillStyle = color;\n ctx.fillRect(coord.x, coord.y, 2, 2);\n ctx.fillStyle = oldStyle;\n }\n\n /**\n * This method updates the SkyLine for a given Wedge.\n * @param start Start point of the wedge (the point where both lines meet)\n * @param end End point of the wedge (the end of the most extreme line: upper line for skyline, lower line for bottomline)\n */\n public updateSkyLineWithWedge(start: PointF2D, end: PointF2D): void {\n // FIXME: Refactor if wedges will be added. Current status is that vexflow will be used for this\n let startIndex: number = Math.floor(start.x * this.SamplingUnit);\n let endIndex: number = Math.ceil(end.x * this.SamplingUnit);\n\n let slope: number = (end.y - start.y) / (end.x - start.x);\n\n if (endIndex - startIndex <= 1) {\n endIndex++;\n slope = 0;\n }\n\n if (startIndex < 0) {\n startIndex = 0;\n }\n if (startIndex >= this.BottomLine.length) {\n startIndex = this.BottomLine.length - 1;\n }\n if (endIndex < 0) {\n endIndex = 0;\n }\n if (endIndex >= this.BottomLine.length) {\n endIndex = this.BottomLine.length;\n }\n\n this.SkyLine[startIndex] = start.y;\n for (let i: number = startIndex + 1; i < Math.min(endIndex, this.SkyLine.length); i++) {\n this.SkyLine[i] = this.SkyLine[i - 1] + slope / this.SamplingUnit;\n }\n }\n\n /**\n * This method updates the BottomLine for a given Wedge.\n * @param start Start point of the wedge\n * @param end End point of the wedge\n */\n public updateBottomLineWithWedge(start: PointF2D, end: PointF2D): void {\n // FIXME: Refactor if wedges will be added. Current status is that vexflow will be used for this\n let startIndex: number = Math.floor(start.x * this.SamplingUnit);\n let endIndex: number = Math.ceil(end.x * this.SamplingUnit);\n\n let slope: number = (end.y - start.y) / (end.x - start.x);\n if (endIndex - startIndex <= 1) {\n endIndex++;\n slope = 0;\n }\n\n if (startIndex < 0) {\n startIndex = 0;\n }\n if (startIndex >= this.BottomLine.length) {\n startIndex = this.BottomLine.length - 1;\n }\n if (endIndex < 0) {\n endIndex = 0;\n }\n if (endIndex >= this.BottomLine.length) {\n endIndex = this.BottomLine.length;\n }\n\n this.BottomLine[startIndex] = start.y;\n for (let i: number = startIndex + 1; i < endIndex; i++) {\n this.BottomLine[i] = this.BottomLine[i - 1] + slope / this.SamplingUnit;\n }\n }\n\n /**\n * This method updates the SkyLine for a given range with a given value\n * //param to update the SkyLine for\n * @param start Start index of the range\n * @param end End index of the range\n * @param value ??\n */\n public updateSkyLineInRange(startIndex: number, endIndex: number, value: number): void {\n this.updateInRange(this.mSkyLine, startIndex, endIndex, value);\n }\n\n /**\n * This method updates the BottomLine for a given range with a given value\n * @param to update the BottomLine for\n * @param start Start index of the range\n * @param end End index of the range (excluding)\n * @param value ??\n */\n public updateBottomLineInRange(startIndex: number, endIndex: number, value: number): void {\n this.updateInRange(this.BottomLine, startIndex, endIndex, value);\n }\n\n /**\n * Resets a SkyLine in a range to its original value\n * @param to reset the SkyLine in\n * @param startIndex Start index of the range\n * @param endIndex End index of the range (excluding)\n */\n public resetSkyLineInRange(startIndex: number, endIndex: number): void {\n this.updateInRange(this.SkyLine, startIndex, endIndex);\n }\n\n /**\n * Resets a bottom line in a range to its original value\n * @param to reset the bottomline in\n * @param startIndex Start index of the range\n * @param endIndex End index of the range\n */\n public resetBottomLineInRange(startIndex: number, endIndex: number): void {\n this.setInRange(this.BottomLine, startIndex, endIndex);\n }\n\n /**\n * Update the whole skyline with a certain value\n * @param value value to be set\n */\n public setSkyLineWithValue(value: number): void {\n this.SkyLine.forEach(sl => sl = value);\n }\n\n /**\n * Update the whole bottomline with a certain value\n * @param value value to be set\n */\n public setBottomLineWithValue(value: number): void {\n this.BottomLine.forEach(bl => bl = value);\n }\n\n public getLeftIndexForPointX(x: number, length: number): number {\n const index: number = Math.floor(x * this.SamplingUnit);\n\n if (index < 0) {\n return 0;\n }\n\n if (index >= length) {\n return length - 1;\n }\n\n return index;\n }\n\n public getRightIndexForPointX(x: number, length: number): number {\n const index: number = Math.ceil(x * this.SamplingUnit);\n\n if (index < 0) {\n return 0;\n }\n\n if (index >= length) {\n return length - 1;\n }\n\n return index;\n }\n\n /**\n * This method updates the StaffLine Borders with the Sky- and BottomLines Min- and MaxValues.\n */\n public updateStaffLineBorders(): void {\n this.mStaffLineParent.PositionAndShape.BorderTop = this.getSkyLineMin();\n this.mStaffLineParent.PositionAndShape.BorderMarginTop = this.getSkyLineMin();\n this.mStaffLineParent.PositionAndShape.BorderBottom = this.getBottomLineMax();\n this.mStaffLineParent.PositionAndShape.BorderMarginBottom = this.getBottomLineMax();\n }\n\n /**\n * This method finds the minimum value of the SkyLine.\n * @param staffLine StaffLine to apply to\n */\n public getSkyLineMin(): number {\n return Math.min(...this.SkyLine.filter(s => !isNaN(s)));\n }\n\n public getSkyLineMinAtPoint(point: number): number {\n const index: number = Math.round(point * this.SamplingUnit);\n return this.mSkyLine[index];\n }\n\n /**\n * This method finds the SkyLine's minimum value within a given range.\n * @param staffLine Staffline to apply to\n * @param startIndex Starting index\n * @param endIndex End index (including)\n */\n public getSkyLineMinInRange(startIndex: number, endIndex: number): number {\n return this.getMinInRange(this.SkyLine, startIndex, endIndex);\n }\n\n /**\n * This method finds the maximum value of the BottomLine.\n * @param staffLine Staffline to apply to\n */\n public getBottomLineMax(): number {\n return Math.max(...this.BottomLine.filter(s => !isNaN(s)));\n }\n\n public getBottomLineMaxAtPoint(point: number): number {\n const index: number = Math.round(point * this.SamplingUnit);\n return this.mBottomLine[index];\n }\n\n /**\n * This method finds the BottomLine's maximum value within a given range.\n * @param staffLine Staffline to find the max value in\n * @param startIndex Start index of the range\n * @param endIndex End index of the range (excluding)\n */\n public getBottomLineMaxInRange(startIndex: number, endIndex: number): number {\n return this.getMaxInRange(this.BottomLine, startIndex, endIndex);\n }\n\n /**\n * This method returns the maximum value of the bottom line around a specific\n * bounding box. Will return undefined if the bounding box is not valid or inside staffline\n * @param boundingBox Bounding box where the maximum should be retrieved from\n * @returns Maximum value inside bounding box boundaries or undefined if not possible\n */\n public getBottomLineMaxInBoundingBox(boundingBox: BoundingBox): number {\n //TODO: Actually it should be the margin. But that one is not implemented\n const startPoint: number = Math.floor(boundingBox.AbsolutePosition.x + boundingBox.BorderLeft);\n const endPoint: number = Math.ceil(boundingBox.AbsolutePosition.x + boundingBox.BorderRight);\n return this.getMaxInRange(this.mBottomLine, startPoint, endPoint);\n }\n\n //#region Private methods\n\n /**\n * Updates sky- and bottom line with a boundingBox and it's children\n * @param boundingBox Bounding box to be added\n * @param topBorder top\n */\n public updateWithBoundingBoxRecursivly(boundingBox: BoundingBox): void {\n if (boundingBox.ChildElements && boundingBox.ChildElements.length > 0) {\n this.updateWithBoundingBoxRecursivly(boundingBox);\n } else {\n const currentTopBorder: number = boundingBox.BorderTop + boundingBox.AbsolutePosition.y;\n const currentBottomBorder: number = boundingBox.BorderBottom + boundingBox.AbsolutePosition.y;\n\n if (currentTopBorder < 0) {\n const startPoint: number = Math.floor(boundingBox.AbsolutePosition.x + boundingBox.BorderLeft);\n const endPoint: number = Math.ceil(boundingBox.AbsolutePosition.x + boundingBox.BorderRight) ;\n\n this.updateInRange(this.mSkyLine, startPoint, endPoint, currentTopBorder);\n } else if (currentBottomBorder > this.StaffLineParent.StaffHeight) {\n const startPoint: number = Math.floor(boundingBox.AbsolutePosition.x + boundingBox.BorderLeft);\n const endPoint: number = Math.ceil(boundingBox.AbsolutePosition.x + boundingBox.BorderRight);\n\n this.updateInRange(this.mBottomLine, startPoint, endPoint, currentBottomBorder);\n }\n }\n }\n\n /**\n * Update an array with the value given inside a range. NOTE: will only be updated if value > oldValue\n * @param array Array to fill in the new value\n * @param startIndex start index to begin with (default: 0)\n * @param endIndex end index of array (excluding, default: array length)\n * @param value value to fill in (default: 0)\n */\n private updateInRange(array: number[], startIndex: number = 0, endIndex: number = array.length, value: number = 0): void {\n startIndex = Math.floor(startIndex * this.SamplingUnit);\n endIndex = Math.ceil(endIndex * this.SamplingUnit);\n\n if (endIndex < startIndex) {\n throw new Error(\"start index of line is greater then the end index\");\n }\n\n if (startIndex < 0) {\n startIndex = 0;\n }\n\n if (endIndex > array.length) {\n endIndex = array.length;\n }\n\n for (let i: number = startIndex; i < endIndex; i++) {\n array[i] = Math.abs(value) > Math.abs(array[i]) ? value : array[i];\n }\n }\n\n /**\n * Sets the value given to the range inside the array. NOTE: will always update the value\n * @param array Array to fill in the new value\n * @param startIndex start index to begin with (default: 0)\n * @param endIndex end index of array (excluding, default: array length)\n * @param value value to fill in (default: 0)\n */\n private setInRange(array: number[], startIndex: number = 0, endIndex: number = array.length, value: number = 0): void {\n startIndex = Math.floor(startIndex * this.SamplingUnit);\n endIndex = Math.ceil(endIndex * this.SamplingUnit);\n\n if (endIndex < startIndex) {\n throw new Error(\"start index of line is greater then the end index\");\n }\n\n if (startIndex < 0) {\n startIndex = 0;\n }\n\n if (endIndex > array.length) {\n endIndex = array.length;\n }\n\n for (let i: number = startIndex; i < endIndex; i++) {\n array[i] = value;\n }\n }\n /**\n * Get all values of the selected line inside the given range\n * @param skyBottomArray Skyline or bottom line\n * @param startIndex start index\n * @param endIndex end index (including)\n */\n private getMinInRange(skyBottomArray: number[], startIndex: number, endIndex: number): number {\n startIndex = Math.floor(startIndex * this.SamplingUnit);\n endIndex = Math.ceil(endIndex * this.SamplingUnit);\n\n if (!skyBottomArray) {\n // Highly questionable\n return Number.MAX_VALUE;\n }\n\n if (startIndex < 0) {\n startIndex = 0;\n }\n if (startIndex >= skyBottomArray.length) {\n startIndex = skyBottomArray.length - 1;\n }\n if (endIndex < 0) {\n endIndex = 0;\n }\n if (endIndex >= skyBottomArray.length) {\n endIndex = skyBottomArray.length;\n }\n\n if (startIndex >= 0 && endIndex <= skyBottomArray.length) {\n return Math.min(...skyBottomArray.slice(startIndex, endIndex + 1)); // slice does not include end (index)\n }\n }\n\n /**\n * Get the maximum value inside the given indices\n * @param skyBottomArray Skyline or bottom line\n * @param startIndex start index\n * @param endIndex end index (including)\n */\n private getMaxInRange(skyBottomArray: number[], startIndex: number, endIndex: number): number {\n startIndex = Math.floor(startIndex * this.SamplingUnit);\n endIndex = Math.ceil(endIndex * this.SamplingUnit);\n\n if (!skyBottomArray) {\n // Highly questionable\n return Number.MIN_VALUE;\n }\n\n if (startIndex < 0) {\n startIndex = 0;\n }\n if (startIndex >= skyBottomArray.length) {\n startIndex = skyBottomArray.length - 1;\n }\n if (endIndex < 0) {\n endIndex = 0;\n }\n if (endIndex >= skyBottomArray.length) {\n endIndex = skyBottomArray.length;\n }\n\n if (startIndex >= 0 && endIndex <= skyBottomArray.length) {\n return Math.max(...skyBottomArray.slice(startIndex, endIndex + 1)); // slice does not include end (index)\n }\n }\n // FIXME: What does this do here?\n // private isStaffLineUpper(): boolean {\n // const instrument: Instrument = this.StaffLineParent.ParentStaff.ParentInstrument;\n\n // if (this.StaffLineParent.ParentStaff === instrument.Staves[0]) {\n // return true;\n // } else {\n // return false;\n // }\n // }\n // #endregion\n\n //#region Getter Setter\n /** Sampling units that are used to quantize the sky and bottom line */\n get SamplingUnit(): number {\n return this.mRules.SamplingUnit;\n }\n\n /** Parent staffline where the skybottomline calculator is attached to */\n get StaffLineParent(): StaffLine {\n return this.mStaffLineParent;\n }\n\n /** Get the plain skyline array */\n get SkyLine(): number[] {\n return this.mSkyLine;\n }\n\n /** Get the plain bottomline array */\n get BottomLine(): number[] {\n return this.mBottomLine;\n }\n //#endregion\n}\n","import {Staff} from \"../VoiceData/Staff\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {Instrument} from \"../Instrument\";\nimport {GraphicalLine} from \"./GraphicalLine\";\nimport {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {GraphicalMeasure} from \"./GraphicalMeasure\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {StaffLineActivitySymbol} from \"./StaffLineActivitySymbol\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {GraphicalLabel} from \"./GraphicalLabel\";\nimport { SkyBottomLineCalculator } from \"./SkyBottomLineCalculator\";\nimport { GraphicalOctaveShift } from \"./GraphicalOctaveShift\";\nimport { GraphicalSlur } from \"./GraphicalSlur\";\nimport { AbstractGraphicalExpression } from \"./AbstractGraphicalExpression\";\n\n/**\n * A StaffLine contains the [[Measure]]s in one line of the music sheet\n * (one instrument, one line, until a line break)\n */\nexport abstract class StaffLine extends GraphicalObject {\n protected measures: GraphicalMeasure[] = [];\n protected staffLines: GraphicalLine[] = new Array(5);\n protected parentMusicSystem: MusicSystem;\n protected parentStaff: Staff;\n protected octaveShifts: GraphicalOctaveShift[] = [];\n protected skyBottomLine: SkyBottomLineCalculator;\n protected lyricLines: GraphicalLine[] = [];\n protected lyricsDashes: GraphicalLabel[] = [];\n protected abstractExpressions: AbstractGraphicalExpression[] = [];\n /** The staff height in units */\n private staffHeight: number;\n private topLineOffset: number;\n private bottomLineOffset: number;\n\n // For displaying Slurs\n protected graphicalSlurs: GraphicalSlur[] = [];\n\n constructor(parentSystem: MusicSystem, parentStaff: Staff) {\n super();\n this.parentMusicSystem = parentSystem;\n this.parentStaff = parentStaff;\n this.boundingBox = new BoundingBox(this, parentSystem.PositionAndShape);\n this.skyBottomLine = new SkyBottomLineCalculator(this);\n this.staffHeight = this.parentMusicSystem.rules.StaffHeight;\n this.topLineOffset = 0;\n this.bottomLineOffset = 4;\n\n this.calculateStaffLineOffsets();\n }\n\n /**\n * If the musicXML sets different numbers of stafflines, we need to have different offsets\n * to accomodate this - primarily for the sky and bottom lines and cursor.\n */\n private calculateStaffLineOffsets(): void {\n if (this.ParentStaff.isTab) {\n switch (this.ParentStaff.StafflineCount) {\n case 5:\n this.staffHeight = this.bottomLineOffset =\n this.ParentStaff.ParentInstrument.GetMusicSheet.Rules.TabStaffInterlineHeight * 6;\n break;\n default:\n this.staffHeight = this.bottomLineOffset =\n this.ParentStaff.ParentInstrument.GetMusicSheet.Rules.TabStaffInterlineHeight * this.ParentStaff.StafflineCount;\n break;\n }\n } else {\n switch (this.ParentStaff.StafflineCount) {\n case 4:\n this.bottomLineOffset = 1;\n break;\n case 3:\n this.topLineOffset = 1;\n this.bottomLineOffset = 1;\n break;\n case 2:\n this.topLineOffset = 2;\n this.bottomLineOffset = 1;\n break;\n case 1:\n this.topLineOffset = 2;\n this.bottomLineOffset = 2;\n break;\n default:\n break;\n }\n }\n }\n\n public get Measures(): GraphicalMeasure[] {\n return this.measures;\n }\n\n public set Measures(value: GraphicalMeasure[]) {\n this.measures = value;\n }\n\n public get StaffLines(): GraphicalLine[] {\n return this.staffLines;\n }\n\n public set StaffLines(value: GraphicalLine[]) {\n this.staffLines = value;\n }\n\n public get NextStaffLine(): StaffLine {\n const idxInParent: number = this.parentMusicSystem.StaffLines.indexOf(this);\n return idxInParent !== this.parentMusicSystem.StaffLines.length ? this.parentMusicSystem.StaffLines[idxInParent + 1] : undefined;\n }\n\n public get LyricLines(): GraphicalLine[] {\n return this.lyricLines;\n }\n\n public get AbstractExpressions(): AbstractGraphicalExpression[] {\n return this.abstractExpressions;\n }\n\n public set AbstractExpressions(value: AbstractGraphicalExpression[]) {\n this.abstractExpressions = value;\n }\n\n public set LyricLines(value: GraphicalLine[]) {\n this.lyricLines = value;\n }\n\n public get LyricsDashes(): GraphicalLabel[] {\n return this.lyricsDashes;\n }\n\n public set LyricsDashes(value: GraphicalLabel[]) {\n this.lyricsDashes = value;\n }\n\n public get ParentMusicSystem(): MusicSystem {\n return this.parentMusicSystem;\n }\n\n public set ParentMusicSystem(value: MusicSystem) {\n this.parentMusicSystem = value;\n }\n\n public get ParentStaff(): Staff {\n return this.parentStaff;\n }\n\n public set ParentStaff(value: Staff) {\n this.parentStaff = value;\n }\n\n public get SkyBottomLineCalculator(): SkyBottomLineCalculator {\n return this.skyBottomLine;\n }\n\n public get SkyLine(): number[] {\n return this.skyBottomLine.SkyLine;\n }\n\n public get BottomLine(): number[] {\n return this.skyBottomLine.BottomLine;\n }\n\n public get OctaveShifts(): GraphicalOctaveShift[] {\n return this.octaveShifts;\n }\n\n public set OctaveShifts(value: GraphicalOctaveShift[]) {\n this.octaveShifts = value;\n }\n\n public get StaffHeight(): number {\n return this.staffHeight;\n }\n\n public get TopLineOffset(): number {\n return this.topLineOffset;\n }\n public get BottomLineOffset(): number {\n return this.bottomLineOffset;\n }\n\n // get all Graphical Slurs of a staffline\n public get GraphicalSlurs(): GraphicalSlur[] {\n return this.graphicalSlurs;\n }\n\n /**\n * Add a given Graphical Slur to the staffline\n * @param gSlur\n */\n public addSlurToStaffline(gSlur: GraphicalSlur): void {\n this.graphicalSlurs.push(gSlur);\n }\n\n public addActivitySymbolClickArea(): void {\n const activitySymbol: StaffLineActivitySymbol = new StaffLineActivitySymbol(this);\n const staffLinePsi: BoundingBox = this.PositionAndShape;\n activitySymbol.PositionAndShape.RelativePosition =\n new PointF2D(staffLinePsi.RelativePosition.x + staffLinePsi.BorderRight + 0.5, staffLinePsi.RelativePosition.y + 0.5);\n activitySymbol.PositionAndShape.Parent = this.parentMusicSystem.PositionAndShape;\n }\n\n /**\n * True iff [[StaffLine]] belongs to an [[Instrument]] with more than one [[Staff]].\n * @returns {boolean}\n */\n public isPartOfMultiStaffInstrument(): boolean {\n const instrument: Instrument = this.parentStaff.ParentInstrument;\n if (instrument.Staves.length > 1) {\n return true;\n }\n return false;\n }\n\n /**\n * Find the [[GraphicalStaffEntry]] closest to the given xPosition.\n * @param xPosition\n * @returns {GraphicalStaffEntry}\n */\n public findClosestStaffEntry(xPosition: number): GraphicalStaffEntry {\n let closestStaffentry: GraphicalStaffEntry = undefined;\n for (let idx: number = 0, len: number = this.Measures.length; idx < len; ++idx) {\n const graphicalMeasure: GraphicalMeasure = this.Measures[idx];\n for (let idx2: number = 0, len2: number = graphicalMeasure.staffEntries.length; idx2 < len2; ++idx2) {\n const graphicalStaffEntry: GraphicalStaffEntry = graphicalMeasure.staffEntries[idx2];\n if (\n Math.abs(graphicalStaffEntry.PositionAndShape.RelativePosition.x - xPosition + graphicalMeasure.PositionAndShape.RelativePosition.x) < 5.0\n ) {\n closestStaffentry = graphicalStaffEntry;\n }\n }\n }\n return closestStaffentry;\n }\n}\n","import Vex from \"vexflow\";\n\nimport {VexFlowBackend} from \"./VexFlowBackend\";\nimport {VexFlowConverter} from \"./VexFlowConverter\";\nimport {FontStyles} from \"../../../Common/Enums/FontStyles\";\nimport {Fonts} from \"../../../Common/Enums/Fonts\";\nimport {RectangleF2D} from \"../../../Common/DataObjects/RectangleF2D\";\nimport {PointF2D} from \"../../../Common/DataObjects/PointF2D\";\nimport {EngravingRules} from \"..\";\nimport {BackendType} from \"../../../OpenSheetMusicDisplay\";\n\nexport class SvgVexFlowBackend extends VexFlowBackend {\n\n private ctx: Vex.Flow.SVGContext;\n\n constructor(rules: EngravingRules) {\n super();\n this.rules = rules;\n }\n\n public getVexflowBackendType(): Vex.Flow.Renderer.Backends {\n return Vex.Flow.Renderer.Backends.SVG;\n }\n\n public getOSMDBackendType(): BackendType {\n return BackendType.SVG;\n }\n\n public initialize(container: HTMLElement): void {\n this.canvas = document.createElement(\"div\");\n // this.canvas.id = uniqueID // TODO create unique tagName like with cursor now?\n this.inner = this.canvas;\n this.inner.style.position = \"relative\";\n this.canvas.style.zIndex = \"0\";\n container.appendChild(this.inner);\n this.renderer = new Vex.Flow.Renderer(this.canvas, this.getVexflowBackendType());\n this.ctx = this.renderer.getContext();\n }\n\n public getContext(): Vex.Flow.SVGContext {\n return this.ctx;\n }\n\n public getSvgElement(): SVGElement {\n return this.ctx.svg;\n }\n\n public clear(): void {\n if (!this.ctx) {\n return;\n }\n //const { svg } = this.ctx; // seems to make svg static between osmd instances.\n const svg: SVGElement = this.ctx.svg;\n // removes all children from the SVG element,\n // effectively clearing the SVG viewport\n while (svg.lastChild) {\n svg.removeChild(svg.lastChild);\n }\n\n // set background color if not transparent\n if (this.rules.PageBackgroundColor) {\n this.ctx.save();\n // note that this will hide the cursor\n this.ctx.setFillStyle(this.rules.PageBackgroundColor);\n\n this.ctx.fillRect(0, 0, this.canvas.offsetWidth, this.canvas.offsetHeight);\n this.ctx.restore();\n }\n }\n\n public scale(k: number): void {\n this.ctx.scale(k, k);\n }\n\n public translate(x: number, y: number): void {\n // TODO: implement this\n }\n public renderText(fontHeight: number, fontStyle: FontStyles, font: Fonts, text: string,\n heightInPixel: number, screenPosition: PointF2D,\n color: string = undefined, fontFamily: string = undefined): void {\n this.ctx.save();\n\n if (color) {\n this.ctx.attributes.fill = color;\n this.ctx.attributes.stroke = color;\n }\n let fontFamilyVexFlow: string = fontFamily;\n if (!fontFamily || fontFamily === \"default\") {\n fontFamilyVexFlow = this.rules.DefaultFontFamily;\n }\n this.ctx.setFont(fontFamilyVexFlow, fontHeight, VexFlowConverter.fontStyle(fontStyle));\n // font size is set by VexFlow in `pt`. This overwrites the font so it's set to px instead\n this.ctx.attributes[\"font-size\"] = `${fontHeight}px`;\n this.ctx.state[\"font-size\"] = `${fontHeight}px`;\n let fontWeightVexflow: string = \"normal\";\n let fontStyleVexflow: string = \"normal\";\n switch (fontStyle) {\n case FontStyles.Bold:\n fontWeightVexflow = \"bold\";\n break;\n case FontStyles.Italic:\n fontStyleVexflow = \"italic\";\n break;\n case FontStyles.BoldItalic:\n fontWeightVexflow = \"bold\";\n fontStyleVexflow = \"italic\";\n break;\n default:\n fontWeightVexflow = \"normal\";\n }\n this.ctx.attributes[\"font-weight\"] = fontWeightVexflow;\n this.ctx.state[\"font-weight\"] = fontWeightVexflow;\n this.ctx.attributes[\"font-style\"] = fontStyleVexflow;\n this.ctx.state[\"font-style\"] = fontStyleVexflow;\n this.ctx.fillText(text, screenPosition.x, screenPosition.y + heightInPixel);\n this.ctx.restore();\n }\n public renderRectangle(rectangle: RectangleF2D, styleId: number, alpha: number = 1): void {\n this.ctx.save();\n this.ctx.attributes.fill = VexFlowConverter.style(styleId);\n this.ctx.attributes[\"fill-opacity\"] = alpha;\n this.ctx.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);\n this.ctx.restore();\n this.ctx.attributes[\"fill-opacity\"] = 1;\n }\n\n public renderLine(start: PointF2D, stop: PointF2D, color: string = \"#FF0000FF\", lineWidth: number = 2): void {\n this.ctx.save();\n this.ctx.beginPath();\n this.ctx.moveTo(start.x, start.y);\n this.ctx.lineTo(stop.x, stop.y);\n\n this.ctx.attributes.stroke = color;\n //this.ctx.attributes.strokeStyle = color;\n //this.ctx.attributes[\"font-weight\"] = \"bold\";\n //this.ctx.attributes[\"stroke-linecap\"] = \"round\";\n\n this.ctx.lineWidth = lineWidth;\n\n this.ctx.stroke();\n this.ctx.restore();\n }\n\n public renderCurve(points: PointF2D[]): void {\n this.ctx.beginPath();\n this.ctx.moveTo(points[0].x, points[0].y);\n this.ctx.bezierCurveTo(\n points[1].x,\n points[1].y,\n points[2].x,\n points[2].y,\n points[3].x,\n points[3].y\n );\n this.ctx.lineTo(points[7].x, points[7].y);\n this.ctx.bezierCurveTo(\n points[6].x,\n points[6].y,\n points[5].x,\n points[5].y,\n points[4].x,\n points[4].y\n );\n this.ctx.lineTo(points[0].x, points[0].y);\n //this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.fill();\n }\n}\n","import { GraphicalInstantaneousDynamicExpression } from \"../GraphicalInstantaneousDynamicExpression\";\nimport { InstantaneousDynamicExpression, DynamicEnum } from \"../../VoiceData/Expressions/InstantaneousDynamicExpression\";\nimport { GraphicalLabel } from \"../GraphicalLabel\";\nimport { Label } from \"../../Label\";\nimport { TextAlignmentEnum } from \"../../../Common/Enums/TextAlignment\";\nimport { FontStyles } from \"../../../Common/Enums/FontStyles\";\nimport { StaffLine } from \"../StaffLine\";\nimport { GraphicalMeasure } from \"../GraphicalMeasure\";\n\nexport class VexFlowInstantaneousDynamicExpression extends GraphicalInstantaneousDynamicExpression {\n constructor(instantaneousDynamicExpression: InstantaneousDynamicExpression, staffLine: StaffLine, measure: GraphicalMeasure) {\n super(instantaneousDynamicExpression, staffLine, measure);\n\n const sourceLabel: Label = new Label(this.Expression);\n this.label = new GraphicalLabel(sourceLabel,\n this.rules.ContinuousDynamicTextHeight,\n TextAlignmentEnum.CenterCenter,\n this.rules,\n this.PositionAndShape);\n\n this.label.Label.fontStyle = FontStyles.BoldItalic;\n this.label.setLabelPositionAndShapeBorders();\n this.PositionAndShape.calculateBoundingBox();\n }\n\n get InstantaneousDynamic(): InstantaneousDynamicExpression {\n return this.mInstantaneousDynamicExpression;\n }\n\n get Expression(): string {\n return DynamicEnum[this.mInstantaneousDynamicExpression.DynEnum];\n }\n}\n","import Vex from \"vexflow\";\nimport { VexFlowInstrumentBracket } from \"./VexFlowInstrumentBracket\";\nimport { VexFlowStaffLine } from \"./VexFlowStaffLine\";\n\n/**\n * Class that defines a instrument bracket at the beginning of a line.\n */\nexport class VexFlowInstrumentBrace extends VexFlowInstrumentBracket {\n\n constructor(firstVexFlowStaffLine: VexFlowStaffLine, lastVexFlowStaffLine: VexFlowStaffLine, depth: number = 0) {\n super(firstVexFlowStaffLine, lastVexFlowStaffLine, depth);\n this.vexflowConnector.setType(Vex.Flow.StaveConnector.type.BRACE);\n }\n}\n","import Vex from \"vexflow\";\nimport { GraphicalOctaveShift } from \"../GraphicalOctaveShift\";\nimport { OctaveShift, OctaveEnum } from \"../../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport { BoundingBox } from \"../BoundingBox\";\nimport { GraphicalStaffEntry } from \"../GraphicalStaffEntry\";\nimport { VexFlowVoiceEntry } from \"./VexFlowVoiceEntry\";\nimport log from \"loglevel\";\n\n/**\n * The vexflow adaptation of a graphical shift.\n */\nexport class VexFlowOctaveShift extends GraphicalOctaveShift {\n\n /** Defines the note where the octave shift starts */\n private startNote: Vex.Flow.StemmableNote;\n /** Defines the note where the octave shift ends */\n private endNote: Vex.Flow.StemmableNote;\n /** Top or bottom of the staffline */\n private position: Vex.Flow.TextBracket.Positions;\n /** Supscript is a smaller text after the regular text (e.g. va after 8) */\n private supscript: string;\n /** Main text element */\n private text: string;\n\n /**\n * Create a new vexflow ocatve shift\n * @param octaveShift the object read by the ExpressionReader\n * @param parent the bounding box of the parent\n */\n constructor(octaveShift: OctaveShift, parent: BoundingBox) {\n super(octaveShift, parent);\n switch (octaveShift.Type) {\n case OctaveEnum.VA8:\n this.position = Vex.Flow.TextBracket.Positions.TOP;\n this.supscript = \"va\";\n this.text = \"8\";\n break;\n case OctaveEnum.MA15:\n this.position = Vex.Flow.TextBracket.Positions.TOP;\n this.supscript = \"ma\";\n this.text = \"15\";\n break;\n case OctaveEnum.VB8:\n this.position = Vex.Flow.TextBracket.Positions.BOTTOM;\n this.supscript = \"vb\";\n this.text = \"8\";\n break;\n case OctaveEnum.MB15:\n this.position = Vex.Flow.TextBracket.Positions.BOTTOM;\n this.supscript = \"mb\";\n this.text = \"15\";\n break;\n default:\n log.error(\"Unknown or NONE octaveshift. This should not be called!\");\n break;\n }\n }\n\n /**\n * Set a start note using a staff entry\n * @param graphicalStaffEntry the staff entry that holds the start note\n */\n public setStartNote(graphicalStaffEntry: GraphicalStaffEntry): void {\n this.startNote = (graphicalStaffEntry.graphicalVoiceEntries[0] as VexFlowVoiceEntry).vfStaveNote;\n }\n\n /**\n * Set an end note using a staff entry\n * @param graphicalStaffEntry the staff entry that holds the end note\n */\n public setEndNote(graphicalStaffEntry: GraphicalStaffEntry): void {\n this.endNote = (graphicalStaffEntry.graphicalVoiceEntries[0] as VexFlowVoiceEntry).vfStaveNote;\n }\n\n public getStartNote(): Vex.Flow.StemmableNote {\n return this.startNote;\n }\n\n public getEndNote(): Vex.Flow.StemmableNote {\n return this.endNote;\n }\n\n /**\n * Get the actual vexflow text bracket used for drawing\n */\n public getTextBracket(): Vex.Flow.TextBracket {\n return new Vex.Flow.TextBracket({\n position: this.position,\n start: this.startNote,\n stop: this.endNote,\n superscript: this.supscript,\n text: this.text,\n });\n }\n\n}\n","import Vex from \"vexflow\";\nimport { GraphicalStaffEntry } from \"../GraphicalStaffEntry\";\nimport { VexFlowMeasure } from \"./VexFlowMeasure\";\nimport { SourceStaffEntry } from \"../../VoiceData/SourceStaffEntry\";\nimport { unitInPixels } from \"./VexFlowMusicSheetDrawer\";\nimport { VexFlowVoiceEntry } from \"./VexFlowVoiceEntry\";\nimport { Note } from \"../../VoiceData/Note\";\n\nexport class VexFlowStaffEntry extends GraphicalStaffEntry {\n constructor(measure: VexFlowMeasure, sourceStaffEntry: SourceStaffEntry, staffEntryParent: VexFlowStaffEntry) {\n super(measure, sourceStaffEntry, staffEntryParent);\n }\n\n // if there is a in-measure clef given before this staffEntry,\n // it will be converted to a Vex.Flow.ClefNote and assigned to this variable:\n public vfClefBefore: Vex.Flow.ClefNote;\n\n /**\n * Calculates the staff entry positions from the VexFlow stave information and the tickabels inside the staff.\n * This is needed in order to set the OSMD staff entries (which are almost the same as tickables) to the correct positionts.\n * It is also needed to be done after formatting!\n */\n public calculateXPosition(): void {\n const stave: Vex.Flow.Stave = (this.parentMeasure as VexFlowMeasure).getVFStave();\n\n // sets the vexflow x positions back into the bounding boxes of the staff entries in the osmd object model.\n // The positions are needed for cursor placement and mouse/tap interactions\n let lastBorderLeft: number = 0;\n for (const gve of this.graphicalVoiceEntries as VexFlowVoiceEntry[]) {\n if (gve.vfStaveNote) {\n gve.vfStaveNote.setStave(stave);\n if (!gve.vfStaveNote.preFormatted) {\n continue;\n }\n gve.applyBordersFromVexflow();\n if (this.parentMeasure.ParentStaff.isTab) {\n // the x-position could be finetuned for the cursor.\n // somehow, gve.vfStaveNote.getBoundingBox() is null for a TabNote (which is a StemmableNote).\n this.PositionAndShape.RelativePosition.x = (gve.vfStaveNote.getAbsoluteX() + (gve.vfStaveNote).glyph.getWidth()) / unitInPixels;\n } else {\n this.PositionAndShape.RelativePosition.x = gve.vfStaveNote.getBoundingBox().getX() / unitInPixels;\n }\n const sourceNote: Note = gve.notes[0].sourceNote;\n if (sourceNote.isRest() && sourceNote.Length.RealValue === this.parentMeasure.parentSourceMeasure.ActiveTimeSignature.RealValue) {\n // whole rest: length = measure length. (4/4 in a 4/4 time signature, 3/4 in a 3/4 time signature, 1/4 in a 1/4 time signature, etc.)\n // see Note.isWholeRest(), which is currently not safe\n this.PositionAndShape.RelativePosition.x +=\n this.parentMeasure.parentSourceMeasure.Rules.WholeRestXShiftVexflow - 0.1; // xShift from VexFlowConverter\n gve.PositionAndShape.BorderLeft = -0.7;\n gve.PositionAndShape.BorderRight = 0.7;\n }\n if (gve.PositionAndShape.BorderLeft < lastBorderLeft) {\n lastBorderLeft = gve.PositionAndShape.BorderLeft;\n }\n }\n }\n this.PositionAndShape.RelativePosition.x -= lastBorderLeft;\n this.PositionAndShape.calculateBoundingBox();\n }\n}\n","import {StaffLine} from \"../StaffLine\";\nimport {MusicSystem} from \"../MusicSystem\";\nimport {Staff} from \"../../VoiceData/Staff\";\nimport { VexFlowSlur } from \"./VexFlowSlur\";\nimport { AlignmentManager } from \"./AlignmentManager\";\n\nexport class VexFlowStaffLine extends StaffLine {\n constructor(parentSystem: MusicSystem, parentStaff: Staff) {\n super(parentSystem, parentStaff);\n this.alignmentManager = new AlignmentManager(this);\n }\n\n protected slursInVFStaffLine: VexFlowSlur[] = [];\n protected alignmentManager: AlignmentManager;\n\n public get SlursInVFStaffLine(): VexFlowSlur[] {\n return this.slursInVFStaffLine;\n }\n public addVFSlurToVFStaffline(vfSlur: VexFlowSlur): void {\n this.slursInVFStaffLine.push(vfSlur);\n }\n\n public get AlignmentManager(): AlignmentManager {\n return this.alignmentManager;\n }\n}\n","import {VoiceEntry} from \"./VoiceEntry\";\nimport {SourceStaffEntry} from \"./SourceStaffEntry\";\n\n/**\n * Used for linked voices.\n */\nexport class StaffEntryLink {\n constructor(voiceEntry: VoiceEntry) {\n this.voiceEntry = voiceEntry;\n }\n\n private voiceEntry: VoiceEntry;\n private linkStaffEntries: SourceStaffEntry[] = [];\n\n public get GetVoiceEntry(): VoiceEntry {\n return this.voiceEntry;\n }\n public get LinkStaffEntries(): SourceStaffEntry[] {\n return this.linkStaffEntries;\n }\n public set LinkStaffEntries(value: SourceStaffEntry[]) {\n this.linkStaffEntries = value;\n }\n\n}\n","import {Note} from \"./Note\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\n\n/**\n * Tuplets create irregular rhythms; e.g. triplets, quadruplets, quintuplets, etc.\n */\nexport class Tuplet {\n\n constructor(tupletLabelNumber: number, bracket: boolean = false) {\n this.tupletLabelNumber = tupletLabelNumber;\n this.bracket = bracket;\n }\n\n private tupletLabelNumber: number;\n /** Notes contained in the tuplet, per VoiceEntry (list of VoiceEntries, which has a list of notes). */\n private notes: Note[][] = []; // TODO should probably be VoiceEntry[], not Note[][].\n private fractions: Fraction[] = [];\n /** Whether this tuplet has a bracket. (e.g. showing |--3--| or just 3 for a triplet) */\n private bracket: boolean;\n\n public get TupletLabelNumber(): number {\n return this.tupletLabelNumber;\n }\n\n public set TupletLabelNumber(value: number) {\n this.tupletLabelNumber = value;\n }\n\n public get Notes(): Note[][] {\n return this.notes;\n }\n\n public set Notes(value: Note[][]) {\n this.notes = value;\n }\n\n public get Fractions(): Fraction[] {\n return this.fractions;\n }\n\n public set Fractions(value: Fraction[]) {\n this.fractions = value;\n }\n\n public get Bracket(): boolean {\n return this.bracket;\n }\n\n public set Bracket(value: boolean) {\n this.bracket = value;\n }\n\n /**\n * Returns the index of the given Note in the Tuplet List (notes[0], notes[1],...).\n * @param note\n * @returns {number}\n */\n public getNoteIndex(note: Note): number {\n for (let i: number = this.notes.length - 1; i >= 0; i--) {\n for (let j: number = 0; j < this.notes[i].length; j++) {\n if (note === this.notes[i][j]) {\n return i;\n }\n }\n }\n return 0;\n }\n\n}\n","export * from \"./DataObjects/Fraction\";\nexport * from \"./DataObjects/Pitch\";\nexport * from \"./Enums\";\nexport * from \"./FileIO\";\n","import { IXmlElement } from \"./Xml\";\nimport JSZip from \"jszip\";\n\n/**\n * Some helper methods to handle MXL files.\n */\nexport class MXLHelper {\n /**\n *\n * @param data\n * @returns {Promise}\n * @constructor\n */\n public static MXLtoIXmlElement(data: string): Promise {\n // starting with jszip 3.4.0, JSZip.JSZip is not found,\n // probably because of new possibly conflicting TypeScript definitions\n const zip: JSZip = new JSZip();\n // asynchronously load zip file and process it - with Promises\n const zipLoadedAsync: Promise = zip.loadAsync(data);\n const text: Promise = zipLoadedAsync.then(\n (_: JSZip) => {\n return zip.file(\"META-INF/container.xml\").async(\"text\");\n },\n (err: any) => {\n throw err;\n }\n );\n return text.then(\n (content: string) => {\n const parser: DOMParser = new DOMParser();\n const doc: Document = parser.parseFromString(content, \"text/xml\");\n const rootFile: string = doc.getElementsByTagName(\"rootfile\")[0].getAttribute(\"full-path\");\n return zip.file(rootFile).async(\"text\");\n },\n (err: any) => {\n throw err;\n }\n ).then(\n (content: string) => {\n const parser: DOMParser = new DOMParser();\n const xml: Document = parser.parseFromString(content, \"text/xml\");\n const doc: IXmlElement = new IXmlElement(xml.documentElement);\n return Promise.resolve(doc);\n },\n (err: any) => {\n throw err;\n }\n ).then(\n (content: IXmlElement) => {\n return content;\n },\n (err: any) => {\n throw new Error(\"extractSheetFromMxl: \" + err.message);\n }\n );\n }\n\n public static MXLtoXMLstring(data: string): Promise {\n const zip: JSZip = new JSZip();\n // asynchronously load zip file and process it - with Promises\n return zip.loadAsync(data).then(\n (_: any) => {\n return zip.file(\"META-INF/container.xml\").async(\"text\");\n },\n (err: any) => {\n throw err;\n }\n ).then(\n (content: string) => {\n const parser: DOMParser = new DOMParser();\n const doc: Document = parser.parseFromString(content, \"text/xml\");\n const rootFile: string = doc.getElementsByTagName(\"rootfile\")[0].getAttribute(\"full-path\");\n return zip.file(rootFile).async(\"text\");\n },\n (err: any) => {\n throw err;\n }\n );\n }\n}\n","import {MusicSheet} from \"../MusicSheet\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {InstrumentReader} from \"./InstrumentReader\";\nimport {IXmlElement} from \"../../Common/FileIO/Xml\";\nimport {Instrument} from \"../Instrument\";\nimport {ITextTranslation} from \"../Interfaces/ITextTranslation\";\nimport {MusicSheetReadingException} from \"../Exceptions\";\nimport log from \"loglevel\";\nimport {IXmlAttribute} from \"../../Common/FileIO/Xml\";\nimport {RhythmInstruction} from \"../VoiceData/Instructions/RhythmInstruction\";\nimport {RhythmSymbolEnum} from \"../VoiceData/Instructions/RhythmInstruction\";\nimport {SourceStaffEntry} from \"../VoiceData/SourceStaffEntry\";\nimport {VoiceEntry} from \"../VoiceData/VoiceEntry\";\nimport {InstrumentalGroup} from \"../InstrumentalGroup\";\nimport {SubInstrument} from \"../SubInstrument\";\nimport {MidiInstrument} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {AbstractNotationInstruction} from \"../VoiceData/Instructions/AbstractNotationInstruction\";\nimport {Label} from \"../Label\";\nimport {MusicSymbolModuleFactory} from \"./MusicSymbolModuleFactory\";\nimport {IAfterSheetReadingModule} from \"../Interfaces/IAfterSheetReadingModule\";\nimport {RepetitionInstructionReader} from \"./MusicSymbolModules/RepetitionInstructionReader\";\nimport {RepetitionCalculator} from \"./MusicSymbolModules/RepetitionCalculator\";\nimport {EngravingRules} from \"../Graphical\";\n\nexport class MusicSheetReader /*implements IMusicSheetReader*/ {\n\n constructor(afterSheetReadingModules: IAfterSheetReadingModule[] = undefined, rules: EngravingRules = new EngravingRules()) {\n if (!afterSheetReadingModules) {\n this.afterSheetReadingModules = [];\n } else {\n this.afterSheetReadingModules = afterSheetReadingModules;\n }\n this.repetitionInstructionReader = MusicSymbolModuleFactory.createRepetitionInstructionReader();\n this.repetitionCalculator = MusicSymbolModuleFactory.createRepetitionCalculator();\n this.rules = rules;\n }\n\n private repetitionInstructionReader: RepetitionInstructionReader;\n private repetitionCalculator: RepetitionCalculator;\n private afterSheetReadingModules: IAfterSheetReadingModule[];\n private musicSheet: MusicSheet;\n private completeNumberOfStaves: number = 0;\n private currentMeasure: SourceMeasure;\n private previousMeasure: SourceMeasure;\n private currentFraction: Fraction;\n public rules: EngravingRules;\n\n public get CompleteNumberOfStaves(): number {\n return this.completeNumberOfStaves;\n }\n\n private static doCalculationsAfterDurationHasBeenSet(instrumentReaders: InstrumentReader[]): void {\n for (const instrumentReader of instrumentReaders) {\n instrumentReader.doCalculationsAfterDurationHasBeenSet();\n }\n }\n\n /**\n * Read a music XML file and saves the values in the MusicSheet class.\n * @param root\n * @param path\n * @returns {MusicSheet}\n */\n public createMusicSheet(root: IXmlElement, path: string): MusicSheet {\n try {\n return this._createMusicSheet(root, path);\n } catch (e) {\n log.error(\"MusicSheetReader.CreateMusicSheet\", e);\n return undefined;\n }\n }\n\n private _removeFromArray(list: any[], elem: any): void {\n const i: number = list.indexOf(elem);\n if (i !== -1) {\n list.splice(i, 1);\n }\n }\n\n // Trim from a string also newlines\n private trimString(str: string): string {\n return str.replace(/^\\s+|\\s+$/g, \"\");\n }\n\n private _lastElement(list: T[]): T {\n return list[list.length - 1];\n }\n\n //public SetPhonicScoreInterface(phonicScoreInterface: IPhonicScoreInterface): void {\n // this.phonicScoreInterface = phonicScoreInterface;\n //}\n //public ReadMusicSheetParameters(sheetObject: MusicSheetParameterObject, root: IXmlElement, path: string): MusicSheetParameterObject {\n // this.musicSheet = new MusicSheet();\n // if (root) {\n // this.pushSheetLabels(root, path);\n // if (this.musicSheet.Title) {\n // sheetObject.Title = this.musicSheet.Title.text;\n // }\n // if (this.musicSheet.Composer) {\n // sheetObject.Composer = this.musicSheet.Composer.text;\n // }\n // if (this.musicSheet.Lyricist) {\n // sheetObject.Lyricist = this.musicSheet.Lyricist.text;\n // }\n // let partlistNode: IXmlElement = root.element(\"part-list\");\n // let partList: IXmlElement[] = partlistNode.elements();\n // this.createInstrumentGroups(partList);\n // for (let idx: number = 0, len: number = this.musicSheet.Instruments.length; idx < len; ++idx) {\n // let instr: Instrument = this.musicSheet.Instruments[idx];\n // sheetObject.InstrumentList.push(__init(new MusicSheetParameterObject.LibrarySheetInstrument(), { name: instr.name }));\n // }\n // }\n // return sheetObject;\n //}\n\n private _createMusicSheet(root: IXmlElement, path: string): MusicSheet {\n const instrumentReaders: InstrumentReader[] = [];\n let sourceMeasureCounter: number = 0;\n this.musicSheet = new MusicSheet();\n this.musicSheet.Path = path;\n this.musicSheet.Rules = this.rules;\n if (!root) {\n throw new MusicSheetReadingException(\"Undefined root element\");\n }\n this.pushSheetLabels(root, path);\n const partlistNode: IXmlElement = root.element(\"part-list\");\n if (!partlistNode) {\n throw new MusicSheetReadingException(\"Undefined partListNode\");\n }\n\n const partInst: IXmlElement[] = root.elements(\"part\");\n const partList: IXmlElement[] = partlistNode.elements();\n this.initializeReading(partList, partInst, instrumentReaders);\n let couldReadMeasure: boolean = true;\n this.currentFraction = new Fraction(0, 1);\n let guitarPro: boolean = false;\n let encoding: IXmlElement = root.element(\"identification\");\n if (encoding) {\n encoding = encoding.element(\"encoding\");\n }\n if (encoding) {\n encoding = encoding.element(\"software\");\n }\n if (encoding !== undefined && encoding.value === \"Guitar Pro 5\") {\n guitarPro = true;\n }\n\n while (couldReadMeasure) {\n if (this.currentMeasure !== undefined && this.currentMeasure.HasEndLine) {\n sourceMeasureCounter = 0;\n }\n this.currentMeasure = new SourceMeasure(this.completeNumberOfStaves, this.musicSheet.Rules);\n for (const instrumentReader of instrumentReaders) {\n try {\n couldReadMeasure = couldReadMeasure && instrumentReader.readNextXmlMeasure(this.currentMeasure, this.currentFraction, guitarPro);\n } catch (e) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/InstrumentError\", \"Error while reading instruments.\");\n throw new MusicSheetReadingException(errorMsg, e);\n }\n\n }\n if (couldReadMeasure) {\n this.musicSheet.addMeasure(this.currentMeasure);\n this.checkIfRhythmInstructionsAreSetAndEqual(instrumentReaders);\n this.checkSourceMeasureForNullEntries();\n sourceMeasureCounter = this.setSourceMeasureDuration(instrumentReaders, sourceMeasureCounter);\n MusicSheetReader.doCalculationsAfterDurationHasBeenSet(instrumentReaders);\n this.currentMeasure.AbsoluteTimestamp = this.currentFraction.clone();\n this.musicSheet.SheetErrors.finalizeMeasure(this.currentMeasure.MeasureNumber);\n this.currentFraction.Add(this.currentMeasure.Duration);\n this.previousMeasure = this.currentMeasure;\n }\n }\n\n if (this.repetitionInstructionReader) {\n this.repetitionInstructionReader.removeRedundantInstructions();\n if (this.repetitionCalculator) {\n this.repetitionCalculator.calculateRepetitions(this.musicSheet, this.repetitionInstructionReader.repetitionInstructions);\n }\n }\n this.musicSheet.checkForInstrumentWithNoVoice();\n this.musicSheet.fillStaffList();\n //this.musicSheet.DefaultStartTempoInBpm = this.musicSheet.SheetPlaybackSetting.BeatsPerMinute;\n for (let idx: number = 0, len: number = this.afterSheetReadingModules.length; idx < len; ++idx) {\n const afterSheetReadingModule: IAfterSheetReadingModule = this.afterSheetReadingModules[idx];\n afterSheetReadingModule.calculate(this.musicSheet);\n }\n\n this.musicSheet.DefaultStartTempoInBpm = this.musicSheet.SourceMeasures[0].TempoInBPM;\n this.musicSheet.userStartTempoInBPM = this.musicSheet.userStartTempoInBPM || this.musicSheet.DefaultStartTempoInBpm;\n\n return this.musicSheet;\n }\n\n private initializeReading(partList: IXmlElement[], partInst: IXmlElement[], instrumentReaders: InstrumentReader[]): void {\n const instrumentDict: { [_: string]: Instrument; } = this.createInstrumentGroups(partList);\n this.completeNumberOfStaves = this.getCompleteNumberOfStavesFromXml(partInst);\n if (partInst.length !== 0) {\n this.repetitionInstructionReader.MusicSheet = this.musicSheet;\n this.currentFraction = new Fraction(0, 1);\n this.currentMeasure = undefined;\n this.previousMeasure = undefined;\n }\n let counter: number = 0;\n for (const node of partInst) {\n const idNode: IXmlAttribute = node.attribute(\"id\");\n if (idNode) {\n const currentInstrument: Instrument = instrumentDict[idNode.value];\n const xmlMeasureList: IXmlElement[] = node.elements(\"measure\");\n let instrumentNumberOfStaves: number = 1;\n try {\n instrumentNumberOfStaves = this.getInstrumentNumberOfStavesFromXml(node);\n } catch (err) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/InstrumentStavesNumberError\",\n \"Invalid number of staves at instrument: \"\n );\n this.musicSheet.SheetErrors.push(errorMsg + currentInstrument.Name);\n continue;\n }\n\n currentInstrument.createStaves(instrumentNumberOfStaves);\n instrumentReaders.push(new InstrumentReader(this.repetitionInstructionReader, xmlMeasureList, currentInstrument));\n if (this.repetitionInstructionReader) {\n this.repetitionInstructionReader.xmlMeasureList[counter] = xmlMeasureList;\n }\n counter++;\n }\n }\n }\n\n /**\n * Check if all (should there be any apart from the first Measure) [[RhythmInstruction]]s in the [[SourceMeasure]] are the same.\n *\n * If not, then the max [[RhythmInstruction]] (Fraction) is set to all staves.\n * Also, if it happens to have the same [[RhythmInstruction]]s in RealValue but given in Symbol AND Fraction, then the Fraction prevails.\n * @param instrumentReaders\n */\n private checkIfRhythmInstructionsAreSetAndEqual(instrumentReaders: InstrumentReader[]): void {\n const rhythmInstructions: RhythmInstruction[] = [];\n for (let i: number = 0; i < this.completeNumberOfStaves; i++) {\n if (this.currentMeasure.FirstInstructionsStaffEntries[i]) {\n const last: AbstractNotationInstruction = this.currentMeasure.FirstInstructionsStaffEntries[i].Instructions[\n this.currentMeasure.FirstInstructionsStaffEntries[i].Instructions.length - 1\n ];\n if (last instanceof RhythmInstruction) {\n rhythmInstructions.push(last);\n }\n }\n }\n let maxRhythmValue: number = 0.0;\n let index: number = -1;\n for (let idx: number = 0, len: number = rhythmInstructions.length; idx < len; ++idx) {\n const rhythmInstruction: RhythmInstruction = rhythmInstructions[idx];\n if (rhythmInstruction.Rhythm.RealValue > maxRhythmValue) {\n if (this.areRhythmInstructionsMixed(rhythmInstructions) && rhythmInstruction.SymbolEnum !== RhythmSymbolEnum.NONE) {\n continue;\n }\n maxRhythmValue = rhythmInstruction.Rhythm.RealValue;\n index = rhythmInstructions.indexOf(rhythmInstruction);\n }\n }\n if (rhythmInstructions.length > 0 && rhythmInstructions.length < this.completeNumberOfStaves) {\n const rhythmInstruction: RhythmInstruction = rhythmInstructions[index].clone();\n for (let i: number = 0; i < this.completeNumberOfStaves; i++) {\n if (\n this.currentMeasure.FirstInstructionsStaffEntries[i] !== undefined &&\n !(this._lastElement(this.currentMeasure.FirstInstructionsStaffEntries[i].Instructions) instanceof RhythmInstruction)\n ) {\n this.currentMeasure.FirstInstructionsStaffEntries[i].removeAllInstructionsOfTypeRhythmInstruction();\n this.currentMeasure.FirstInstructionsStaffEntries[i].Instructions.push(rhythmInstruction.clone());\n }\n if (!this.currentMeasure.FirstInstructionsStaffEntries[i]) {\n this.currentMeasure.FirstInstructionsStaffEntries[i] = new SourceStaffEntry(undefined, undefined);\n this.currentMeasure.FirstInstructionsStaffEntries[i].Instructions.push(rhythmInstruction.clone());\n }\n }\n for (let idx: number = 0, len: number = instrumentReaders.length; idx < len; ++idx) {\n const instrumentReader: InstrumentReader = instrumentReaders[idx];\n instrumentReader.ActiveRhythm = rhythmInstruction;\n }\n }\n if (rhythmInstructions.length === 0 && this.currentMeasure === this.musicSheet.SourceMeasures[0]) {\n const rhythmInstruction: RhythmInstruction = new RhythmInstruction(new Fraction(4, 4, 0, false), RhythmSymbolEnum.NONE);\n for (let i: number = 0; i < this.completeNumberOfStaves; i++) {\n if (!this.currentMeasure.FirstInstructionsStaffEntries[i]) {\n this.currentMeasure.FirstInstructionsStaffEntries[i] = new SourceStaffEntry(undefined, undefined);\n } else {\n this.currentMeasure.FirstInstructionsStaffEntries[i].removeAllInstructionsOfTypeRhythmInstruction();\n }\n this.currentMeasure.FirstInstructionsStaffEntries[i].Instructions.push(rhythmInstruction);\n }\n for (let idx: number = 0, len: number = instrumentReaders.length; idx < len; ++idx) {\n const instrumentReader: InstrumentReader = instrumentReaders[idx];\n instrumentReader.ActiveRhythm = rhythmInstruction;\n }\n }\n for (let idx: number = 0, len: number = rhythmInstructions.length; idx < len; ++idx) {\n const rhythmInstruction: RhythmInstruction = rhythmInstructions[idx];\n if (rhythmInstruction.Rhythm.RealValue < maxRhythmValue) {\n if (this._lastElement(\n this.currentMeasure.FirstInstructionsStaffEntries[rhythmInstructions.indexOf(rhythmInstruction)].Instructions\n ) instanceof RhythmInstruction) {\n // TODO Test correctness\n const instrs: AbstractNotationInstruction[] =\n this.currentMeasure.FirstInstructionsStaffEntries[rhythmInstructions.indexOf(rhythmInstruction)].Instructions;\n instrs[instrs.length - 1] = rhythmInstructions[index].clone();\n }\n }\n if (\n Math.abs(rhythmInstruction.Rhythm.RealValue - maxRhythmValue) < 0.000001 &&\n rhythmInstruction.SymbolEnum !== RhythmSymbolEnum.NONE &&\n this.areRhythmInstructionsMixed(rhythmInstructions)\n ) {\n rhythmInstruction.SymbolEnum = RhythmSymbolEnum.NONE;\n }\n }\n }\n\n /**\n * True in case of 4/4 and COMMON TIME (or 2/2 and CUT TIME)\n * @param rhythmInstructions\n * @returns {boolean}\n */\n private areRhythmInstructionsMixed(rhythmInstructions: RhythmInstruction[]): boolean {\n for (let i: number = 1; i < rhythmInstructions.length; i++) {\n if (\n Math.abs(rhythmInstructions[i].Rhythm.RealValue - rhythmInstructions[0].Rhythm.RealValue) < 0.000001 &&\n rhythmInstructions[i].SymbolEnum !== rhythmInstructions[0].SymbolEnum\n ) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Set the [[Measure]]'s duration taking into account the longest [[Instrument]] duration and the active Rhythm read from XML.\n * @param instrumentReaders\n * @param sourceMeasureCounter\n * @returns {number}\n */\n private setSourceMeasureDuration(instrumentReaders: InstrumentReader[], sourceMeasureCounter: number): number {\n let activeRhythm: Fraction = new Fraction(0, 1);\n const instrumentsMaxTieNoteFractions: Fraction[] = [];\n for (const instrumentReader of instrumentReaders) {\n instrumentsMaxTieNoteFractions.push(instrumentReader.MaxTieNoteFraction);\n const activeRythmMeasure: Fraction = instrumentReader.ActiveRhythm.Rhythm;\n if (activeRhythm.lt(activeRythmMeasure)) {\n activeRhythm = new Fraction(activeRythmMeasure.Numerator, activeRythmMeasure.Denominator, 0, false);\n }\n }\n const instrumentsDurations: Fraction[] = this.currentMeasure.calculateInstrumentsDuration(this.musicSheet, instrumentsMaxTieNoteFractions);\n let maxInstrumentDuration: Fraction = new Fraction(0, 1);\n for (const instrumentsDuration of instrumentsDurations) {\n if (maxInstrumentDuration.lt(instrumentsDuration)) {\n maxInstrumentDuration = instrumentsDuration;\n }\n }\n if (Fraction.Equal(maxInstrumentDuration, activeRhythm)) {\n this.checkFractionsForEquivalence(maxInstrumentDuration, activeRhythm);\n } else {\n if (maxInstrumentDuration.lt(activeRhythm)) {\n maxInstrumentDuration = this.currentMeasure.reverseCheck(this.musicSheet, maxInstrumentDuration);\n this.checkFractionsForEquivalence(maxInstrumentDuration, activeRhythm);\n }\n }\n this.currentMeasure.ImplicitMeasure = this.checkIfMeasureIsImplicit(maxInstrumentDuration, activeRhythm);\n if (!this.currentMeasure.ImplicitMeasure) {\n sourceMeasureCounter++;\n }\n this.currentMeasure.Duration = maxInstrumentDuration; // can be 1/1 in a 4/4 time signature\n this.currentMeasure.ActiveTimeSignature = activeRhythm;\n this.currentMeasure.MeasureNumber = sourceMeasureCounter;\n for (let i: number = 0; i < instrumentsDurations.length; i++) {\n const instrumentsDuration: Fraction = instrumentsDurations[i];\n if (\n (this.currentMeasure.ImplicitMeasure && instrumentsDuration !== maxInstrumentDuration) ||\n !Fraction.Equal(instrumentsDuration, activeRhythm) &&\n !this.allInstrumentsHaveSameDuration(instrumentsDurations, maxInstrumentDuration)\n ) {\n const firstStaffIndexOfInstrument: number = this.musicSheet.getGlobalStaffIndexOfFirstStaff(this.musicSheet.Instruments[i]);\n for (let staffIndex: number = 0; staffIndex < this.musicSheet.Instruments[i].Staves.length; staffIndex++) {\n if (!this.graphicalMeasureIsEmpty(firstStaffIndexOfInstrument + staffIndex)) {\n this.currentMeasure.setErrorInGraphicalMeasure(firstStaffIndexOfInstrument + staffIndex, true);\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/MissingNotesError\",\n \"Given Notes don't correspond to measure duration.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n }\n }\n }\n }\n return sourceMeasureCounter;\n }\n\n /**\n * Check the Fractions for Equivalence and if so, sets maxInstrumentDuration's members accordingly.\n * *\n * Example: if maxInstrumentDuration = 1/1 and sourceMeasureDuration = 4/4, maxInstrumentDuration becomes 4/4.\n * @param maxInstrumentDuration\n * @param activeRhythm\n */\n private checkFractionsForEquivalence(maxInstrumentDuration: Fraction, activeRhythm: Fraction): void {\n if (activeRhythm.Denominator > maxInstrumentDuration.Denominator) {\n const factor: number = activeRhythm.Denominator / maxInstrumentDuration.Denominator;\n maxInstrumentDuration.expand(factor);\n }\n }\n\n /**\n * Handle the case of an implicit [[SourceMeasure]].\n * @param maxInstrumentDuration\n * @param activeRhythm\n * @returns {boolean}\n */\n private checkIfMeasureIsImplicit(maxInstrumentDuration: Fraction, activeRhythm: Fraction): boolean {\n if (!this.previousMeasure && maxInstrumentDuration.lt(activeRhythm)) {\n return true;\n }\n if (this.previousMeasure) {\n return Fraction.plus(this.previousMeasure.Duration, maxInstrumentDuration).Equals(activeRhythm);\n }\n return false;\n }\n\n /**\n * Check the Duration of all the given Instruments.\n * @param instrumentsDurations\n * @param maxInstrumentDuration\n * @returns {boolean}\n */\n private allInstrumentsHaveSameDuration(instrumentsDurations: Fraction[], maxInstrumentDuration: Fraction): boolean {\n let counter: number = 0;\n for (let idx: number = 0, len: number = instrumentsDurations.length; idx < len; ++idx) {\n const instrumentsDuration: Fraction = instrumentsDurations[idx];\n if (instrumentsDuration.Equals(maxInstrumentDuration)) {\n counter++;\n }\n }\n return (counter === instrumentsDurations.length && maxInstrumentDuration !== new Fraction(0, 1));\n }\n\n private graphicalMeasureIsEmpty(index: number): boolean {\n let counter: number = 0;\n for (let i: number = 0; i < this.currentMeasure.VerticalSourceStaffEntryContainers.length; i++) {\n if (!this.currentMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries[index]) {\n counter++;\n }\n }\n return (counter === this.currentMeasure.VerticalSourceStaffEntryContainers.length);\n }\n\n /**\n * Check a [[SourceMeasure]] for possible empty / undefined entries ([[VoiceEntry]], [[SourceStaffEntry]], VerticalContainer)\n * (caused from TieAlgorithm removing EndTieNote) and removes them if completely empty / null\n */\n private checkSourceMeasureForNullEntries(): void {\n for (let i: number = this.currentMeasure.VerticalSourceStaffEntryContainers.length - 1; i >= 0; i--) {\n for (let j: number = this.currentMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries.length - 1; j >= 0; j--) {\n const sourceStaffEntry: SourceStaffEntry = this.currentMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries[j];\n if (sourceStaffEntry) {\n for (let k: number = sourceStaffEntry.VoiceEntries.length - 1; k >= 0; k--) {\n const voiceEntry: VoiceEntry = sourceStaffEntry.VoiceEntries[k];\n if (voiceEntry.Notes.length === 0) {\n this._removeFromArray(voiceEntry.ParentVoice.VoiceEntries, voiceEntry);\n this._removeFromArray(sourceStaffEntry.VoiceEntries, voiceEntry);\n }\n }\n }\n if (sourceStaffEntry !== undefined && sourceStaffEntry.VoiceEntries.length === 0) {\n this.currentMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries[j] = undefined;\n }\n }\n }\n for (let i: number = this.currentMeasure.VerticalSourceStaffEntryContainers.length - 1; i >= 0; i--) {\n let counter: number = 0;\n for (let idx: number = 0, len: number = this.currentMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries.length; idx < len; ++idx) {\n const sourceStaffEntry: SourceStaffEntry = this.currentMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries[idx];\n if (!sourceStaffEntry) {\n counter++;\n }\n }\n if (counter === this.currentMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries.length) {\n this._removeFromArray(this.currentMeasure.VerticalSourceStaffEntryContainers, this.currentMeasure.VerticalSourceStaffEntryContainers[i]);\n }\n }\n }\n\n /**\n * Read the XML file and creates the main sheet Labels.\n * @param root\n * @param filePath\n */\n private pushSheetLabels(root: IXmlElement, filePath: string): void {\n this.readComposer(root);\n this.readTitle(root);\n try {\n if (!this.musicSheet.Title || !this.musicSheet.Composer) {\n this.readTitleAndComposerFromCredits(root); // this can also throw an error\n }\n } catch (ex) {\n log.info(\"MusicSheetReader.pushSheetLabels\", \"readTitleAndComposerFromCredits\", ex);\n }\n try {\n if (!this.musicSheet.Title) {\n const barI: number = Math.max(\n 0, filePath.lastIndexOf(\"/\"), filePath.lastIndexOf(\"\\\\\")\n );\n const filename: string = filePath.substr(barI);\n const filenameSplits: string[] = filename.split(\".\", 1);\n this.musicSheet.Title = new Label(filenameSplits[0]);\n }\n } catch (ex) {\n log.info(\"MusicSheetReader.pushSheetLabels\", \"read title from file name\", ex);\n }\n }\n\n // Checks whether _elem_ has an attribute with value _val_.\n private presentAttrsWithValue(elem: IXmlElement, val: string): boolean {\n for (const attr of elem.attributes()) {\n if (attr.value === val) {\n return true;\n }\n }\n return false;\n }\n\n private readComposer(root: IXmlElement): void {\n const identificationNode: IXmlElement = root.element(\"identification\");\n if (identificationNode) {\n const creators: IXmlElement[] = identificationNode.elements(\"creator\");\n for (let idx: number = 0, len: number = creators.length; idx < len; ++idx) {\n const creator: IXmlElement = creators[idx];\n if (creator.hasAttributes) {\n if (this.presentAttrsWithValue(creator, \"composer\")) {\n this.musicSheet.Composer = new Label(this.trimString(creator.value));\n continue;\n }\n if (this.presentAttrsWithValue(creator, \"lyricist\") || this.presentAttrsWithValue(creator, \"poet\")) {\n this.musicSheet.Lyricist = new Label(this.trimString(creator.value));\n }\n }\n }\n }\n }\n\n private readTitleAndComposerFromCredits(root: IXmlElement): void {\n const systemYCoordinates: number = this.computeSystemYCoordinates(root);\n if (systemYCoordinates === 0) {\n return;\n }\n let largestTitleCreditSize: number = 1;\n let finalTitle: string = undefined;\n let largestCreditYInfo: number = 0;\n let finalSubtitle: string = undefined;\n let possibleTitle: string = undefined;\n const creditElements: IXmlElement[] = root.elements(\"credit\");\n for (let idx: number = 0, len: number = creditElements.length; idx < len; ++idx) {\n const credit: IXmlElement = creditElements[idx];\n if (!credit.attribute(\"page\")) {\n return;\n }\n if (credit.attribute(\"page\").value === \"1\") {\n let creditChild: IXmlElement = undefined;\n if (credit) {\n creditChild = credit.element(\"credit-words\");\n if (!creditChild.attribute(\"justify\")) {\n break;\n }\n const creditJustify: string = creditChild.attribute(\"justify\").value;\n const creditY: string = creditChild.attribute(\"default-y\").value;\n const creditYInfo: number = parseFloat(creditY);\n if (creditYInfo > systemYCoordinates) {\n if (!this.musicSheet.Title) {\n const creditSize: string = creditChild.attribute(\"font-size\").value;\n const titleCreditSizeInt: number = parseFloat(creditSize);\n if (largestTitleCreditSize < titleCreditSizeInt) {\n largestTitleCreditSize = titleCreditSizeInt;\n finalTitle = creditChild.value;\n }\n }\n if (!this.musicSheet.Subtitle) {\n if (creditJustify !== \"right\" && creditJustify !== \"left\") {\n if (largestCreditYInfo < creditYInfo) {\n largestCreditYInfo = creditYInfo;\n if (possibleTitle) {\n finalSubtitle = possibleTitle;\n possibleTitle = creditChild.value;\n } else {\n possibleTitle = creditChild.value;\n }\n }\n }\n }\n if (!(this.musicSheet.Composer !== undefined && this.musicSheet.Lyricist)) {\n switch (creditJustify) {\n case \"right\":\n this.musicSheet.Composer = new Label(this.trimString(creditChild.value));\n break;\n case \"left\":\n this.musicSheet.Lyricist = new Label(this.trimString(creditChild.value));\n break;\n default:\n break;\n }\n }\n }\n }\n }\n }\n if (!this.musicSheet.Title && finalTitle) {\n this.musicSheet.Title = new Label(this.trimString(finalTitle));\n }\n if (!this.musicSheet.Subtitle && finalSubtitle) {\n this.musicSheet.Subtitle = new Label(this.trimString(finalSubtitle));\n }\n }\n\n private computeSystemYCoordinates(root: IXmlElement): number {\n if (!root.element(\"defaults\")) {\n return 0;\n }\n let paperHeight: number = 0;\n let topSystemDistance: number = 0;\n try {\n const defi: string = root.element(\"defaults\").element(\"page-layout\").element(\"page-height\").value;\n paperHeight = parseFloat(defi);\n } catch (e) {\n log.info(\"MusicSheetReader.computeSystemYCoordinates(): couldn't find page height, not reading title/composer.\");\n return 0;\n }\n let found: boolean = false;\n const parts: IXmlElement[] = root.elements(\"part\");\n for (let idx: number = 0, len: number = parts.length; idx < len; ++idx) {\n const measures: IXmlElement[] = parts[idx].elements(\"measure\");\n for (let idx2: number = 0, len2: number = measures.length; idx2 < len2; ++idx2) {\n const measure: IXmlElement = measures[idx2];\n if (measure.element(\"print\")) {\n const systemLayouts: IXmlElement[] = measure.element(\"print\").elements(\"system-layout\");\n for (let idx3: number = 0, len3: number = systemLayouts.length; idx3 < len3; ++idx3) {\n const syslab: IXmlElement = systemLayouts[idx3];\n if (syslab.element(\"top-system-distance\")) {\n const topSystemDistanceString: string = syslab.element(\"top-system-distance\").value;\n topSystemDistance = parseFloat(topSystemDistanceString);\n found = true;\n break;\n }\n }\n break;\n }\n }\n if (found) {\n break;\n }\n }\n if (root.element(\"defaults\").element(\"system-layout\")) {\n const syslay: IXmlElement = root.element(\"defaults\").element(\"system-layout\");\n if (syslay.element(\"top-system-distance\")) {\n const topSystemDistanceString: string = root.element(\"defaults\").element(\"system-layout\").element(\"top-system-distance\").value;\n topSystemDistance = parseFloat(topSystemDistanceString);\n }\n }\n if (topSystemDistance === 0) {\n return 0;\n }\n return paperHeight - topSystemDistance;\n }\n\n private readTitle(root: IXmlElement): void {\n const titleNode: IXmlElement = root.element(\"work\");\n let titleNodeChild: IXmlElement = undefined;\n if (titleNode) {\n titleNodeChild = titleNode.element(\"work-title\");\n if (titleNodeChild && titleNodeChild.value) {\n this.musicSheet.Title = new Label(this.trimString(titleNodeChild.value));\n }\n }\n const movementNode: IXmlElement = root.element(\"movement-title\");\n let finalSubTitle: string = \"\";\n if (movementNode) {\n if (!this.musicSheet.Title) {\n this.musicSheet.Title = new Label(this.trimString(movementNode.value));\n } else {\n finalSubTitle = this.trimString(movementNode.value);\n }\n }\n if (titleNode) {\n const subtitleNodeChild: IXmlElement = titleNode.element(\"work-number\");\n if (subtitleNodeChild) {\n const workNumber: string = subtitleNodeChild.value;\n if (workNumber) {\n if (finalSubTitle === \"\") {\n finalSubTitle = workNumber;\n } else {\n finalSubTitle = finalSubTitle + \", \" + workNumber;\n }\n }\n }\n }\n if (finalSubTitle\n ) {\n this.musicSheet.Subtitle = new Label(finalSubTitle);\n }\n }\n\n /**\n * Build the [[InstrumentalGroup]]s and [[Instrument]]s.\n * @param entryList\n * @returns {{}}\n */\n private createInstrumentGroups(entryList: IXmlElement[]): { [_: string]: Instrument; } {\n let instrumentId: number = 0;\n const instrumentDict: { [_: string]: Instrument; } = {};\n let currentGroup: InstrumentalGroup;\n try {\n const entryArray: IXmlElement[] = entryList;\n for (let idx: number = 0, len: number = entryArray.length; idx < len; ++idx) {\n const node: IXmlElement = entryArray[idx];\n if (node.name === \"score-part\") {\n const instrIdString: string = node.attribute(\"id\").value;\n const instrument: Instrument = new Instrument(instrumentId, instrIdString, this.musicSheet, currentGroup);\n instrumentId++;\n const partElements: IXmlElement[] = node.elements();\n for (let idx2: number = 0, len2: number = partElements.length; idx2 < len2; ++idx2) {\n const partElement: IXmlElement = partElements[idx2];\n try {\n if (partElement.name === \"part-name\") {\n instrument.Name = partElement.value;\n } else if (partElement.name === \"part-abbreviation\") {\n instrument.PartAbbreviation = partElement.value;\n } else if (partElement.name === \"score-instrument\") {\n const subInstrument: SubInstrument = new SubInstrument(instrument);\n subInstrument.idString = partElement.firstAttribute.value;\n instrument.SubInstruments.push(subInstrument);\n const subElement: IXmlElement = partElement.element(\"instrument-name\");\n if (subElement) {\n subInstrument.name = subElement.value;\n subInstrument.setMidiInstrument(subElement.value);\n }\n } else if (partElement.name === \"midi-instrument\") {\n let subInstrument: SubInstrument = instrument.getSubInstrument(partElement.firstAttribute.value);\n for (let idx3: number = 0, len3: number = instrument.SubInstruments.length; idx3 < len3; ++idx3) {\n const subInstr: SubInstrument = instrument.SubInstruments[idx3];\n if (subInstr.idString === partElement.value) {\n subInstrument = subInstr;\n break;\n }\n }\n const instrumentElements: IXmlElement[] = partElement.elements();\n for (let idx3: number = 0, len3: number = instrumentElements.length; idx3 < len3; ++idx3) {\n const instrumentElement: IXmlElement = instrumentElements[idx3];\n try {\n if (instrumentElement.name === \"midi-channel\") {\n if (parseInt(instrumentElement.value, 10) === 10) {\n instrument.MidiInstrumentId = MidiInstrument.Percussion;\n }\n } else if (instrumentElement.name === \"midi-program\") {\n if (instrument.SubInstruments.length > 0 && instrument.MidiInstrumentId !== MidiInstrument.Percussion) {\n subInstrument.midiInstrumentID = Math.max(0, parseInt(instrumentElement.value, 10) - 1);\n }\n } else if (instrumentElement.name === \"midi-unpitched\") {\n subInstrument.fixedKey = Math.max(0, parseInt(instrumentElement.value, 10));\n } else if (instrumentElement.name === \"volume\") {\n try {\n const result: number = parseFloat(instrumentElement.value);\n subInstrument.volume = result / 127.0;\n } catch (ex) {\n log.debug(\"ExpressionReader.readExpressionParameters\", \"read volume\", ex);\n }\n\n } else if (instrumentElement.name === \"pan\") {\n try {\n const result: number = parseFloat(instrumentElement.value);\n subInstrument.pan = result / 64.0;\n } catch (ex) {\n log.debug(\"ExpressionReader.readExpressionParameters\", \"read pan\", ex);\n }\n\n }\n } catch (ex) {\n log.info(\"MusicSheetReader.createInstrumentGroups midi settings: \", ex);\n }\n\n }\n }\n } catch (ex) {\n log.info(\"MusicSheetReader.createInstrumentGroups: \", ex);\n }\n\n }\n if (instrument.SubInstruments.length === 0) {\n const subInstrument: SubInstrument = new SubInstrument(instrument);\n instrument.SubInstruments.push(subInstrument);\n }\n instrumentDict[instrIdString] = instrument;\n if (currentGroup) {\n currentGroup.InstrumentalGroups.push(instrument);\n this.musicSheet.Instruments.push(instrument);\n } else {\n this.musicSheet.InstrumentalGroups.push(instrument);\n this.musicSheet.Instruments.push(instrument);\n }\n } else {\n if ((node.name === \"part-group\") && (node.attribute(\"type\").value === \"start\")) {\n const iG: InstrumentalGroup = new InstrumentalGroup(\"group\", this.musicSheet, currentGroup);\n if (currentGroup) {\n currentGroup.InstrumentalGroups.push(iG);\n } else {\n this.musicSheet.InstrumentalGroups.push(iG);\n }\n currentGroup = iG;\n } else {\n if ((node.name === \"part-group\") && (node.attribute(\"type\").value === \"stop\")) {\n if (currentGroup) {\n if (currentGroup.InstrumentalGroups.length === 1) {\n const instr: InstrumentalGroup = currentGroup.InstrumentalGroups[0];\n if (currentGroup.Parent) {\n currentGroup.Parent.InstrumentalGroups.push(instr);\n this._removeFromArray(currentGroup.Parent.InstrumentalGroups, currentGroup);\n } else {\n this.musicSheet.InstrumentalGroups.push(instr);\n this._removeFromArray(this.musicSheet.InstrumentalGroups, currentGroup);\n }\n }\n currentGroup = currentGroup.Parent;\n }\n }\n }\n }\n }\n } catch (e) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/InstrumentError\", \"Error while reading Instruments\"\n );\n throw new MusicSheetReadingException(errorMsg, e);\n }\n\n for (let idx: number = 0, len: number = this.musicSheet.Instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.musicSheet.Instruments[idx];\n if (!instrument.Name) {\n instrument.Name = \"Instr. \" + instrument.IdString;\n }\n }\n return instrumentDict;\n }\n\n /**\n * Read from each xmlInstrumentPart the first xmlMeasure in order to find out the [[Instrument]]'s number of Staves\n * @param partInst\n * @returns {number} - Complete number of Staves for all Instruments.\n */\n private getCompleteNumberOfStavesFromXml(partInst: IXmlElement[]): number {\n let num: number = 0;\n for (const partNode of partInst) {\n const xmlMeasureList: IXmlElement[] = partNode.elements(\"measure\");\n if (xmlMeasureList.length > 0) {\n const xmlMeasure: IXmlElement = xmlMeasureList[0];\n if (xmlMeasure) {\n let stavesNode: IXmlElement = xmlMeasure.element(\"attributes\");\n if (stavesNode) {\n stavesNode = stavesNode.element(\"staves\");\n }\n if (!stavesNode) {\n num++;\n } else {\n num += parseInt(stavesNode.value, 10);\n }\n }\n }\n }\n if (isNaN(num) || num <= 0) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/StaffError\", \"Invalid number of staves.\"\n );\n throw new MusicSheetReadingException(errorMsg);\n }\n return num;\n }\n\n /**\n * Read from XML for a single [[Instrument]] the first xmlMeasure in order to find out the Instrument's number of Staves.\n * @param partNode\n * @returns {number}\n */\n private getInstrumentNumberOfStavesFromXml(partNode: IXmlElement): number {\n let num: number = 0;\n const xmlMeasure: IXmlElement = partNode.element(\"measure\");\n if (xmlMeasure) {\n const attributes: IXmlElement = xmlMeasure.element(\"attributes\");\n let staves: IXmlElement = undefined;\n if (attributes) {\n staves = attributes.element(\"staves\");\n }\n if (!attributes || !staves) {\n num = 1;\n } else {\n num = parseInt(staves.value, 10);\n }\n }\n if (isNaN(num) || num <= 0) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/StaffError\", \"Invalid number of Staves.\"\n );\n throw new MusicSheetReadingException(errorMsg);\n }\n return num;\n }\n\n}\n","import {Fraction} from \"../Common/DataObjects/Fraction\";\nimport {MusicPartManager} from \"./MusicParts/MusicPartManager\";\nimport {SourceMeasure} from \"./VoiceData/SourceMeasure\";\nimport {Repetition} from \"./MusicSource/Repetition\";\nimport {DynamicsContainer} from \"./VoiceData/HelperObjects/DynamicsContainer\";\nimport {InstrumentalGroup} from \"./InstrumentalGroup\";\nimport {Instrument} from \"./Instrument\";\nimport {Label} from \"./Label\";\nimport {Staff} from \"./VoiceData/Staff\";\nimport {MusicPartManagerIterator} from \"./MusicParts/MusicPartManagerIterator\";\nimport {VerticalSourceStaffEntryContainer} from \"./VoiceData/VerticalSourceStaffEntryContainer\";\nimport {Voice} from \"./VoiceData/Voice\";\nimport {MusicSheetErrors} from \"../Common/DataObjects/MusicSheetErrors\";\nimport {MultiTempoExpression} from \"./VoiceData/Expressions/MultiTempoExpression\";\nimport {EngravingRules} from \"./Graphical/EngravingRules\";\nimport {NoteState} from \"./Graphical/DrawingEnums\";\nimport {Note} from \"./VoiceData/Note\";\nimport {VoiceEntry} from \"./VoiceData/VoiceEntry\";\nimport log from \"loglevel\";\n\n// FIXME Andrea: Commented out some unnecessary/not-ported-yet code, have a look at (*)\n\nexport class PlaybackSettings {\n public rhythm: Fraction;\n}\n\n/**\n * This is the representation of a complete piece of sheet music.\n * It includes the contents of a MusicXML file after the reading.\n * Notes: the musicsheet might not need the Rules, e.g. in the testframework. The EngravingRules Constructor\n * fails when no FontInfo exists, which needs a TextMeasurer\n */\nexport class MusicSheet /*implements ISettableMusicSheet, IComparable*/ {\n constructor() {\n this.playbackSettings = new PlaybackSettings();\n // FIXME?\n // initialize SheetPlaybackSetting with default values\n this.playbackSettings.rhythm = new Fraction(4, 4, 0, false);\n this.userStartTempoInBPM = 100;\n this.pageWidth = 120;\n // create MusicPartManager\n this.MusicPartManager = new MusicPartManager(this);\n this.hasBPMInfo = false;\n }\n public static defaultTitle: string = \"[no title given]\";\n\n public userStartTempoInBPM: number;\n public pageWidth: number;\n\n private idString: string = \"random idString, not initialized\";\n private sourceMeasures: SourceMeasure[] = [];\n private repetitions: Repetition[] = [];\n private dynListStaves: DynamicsContainer[][] = [];\n private timestampSortedDynamicExpressionsList: DynamicsContainer[] = [];\n private timestampSortedTempoExpressionsList: MultiTempoExpression[] = [];\n private instrumentalGroups: InstrumentalGroup[] = [];\n /** The parts in the sheet, e.g. piano left hand, or piano right hand, or violin. */\n private instruments: Instrument[] = []; // Should be renamed from instruments to parts and part, though this will be a big refactor\n private playbackSettings: PlaybackSettings;\n private path: string;\n private title: Label;\n private subtitle: Label;\n private composer: Label;\n private lyricist: Label;\n // private languages: Language[] = [];\n // private activeLanguage: Language;\n private musicPartManager: MusicPartManager = undefined;\n private musicSheetErrors: MusicSheetErrors = new MusicSheetErrors();\n private staves: Staff[] = [];\n private selectionStart: Fraction;\n private selectionEnd: Fraction;\n private transpose: number = 0;\n private defaultStartTempoInBpm: number = 0;\n private drawErroneousMeasures: boolean = false;\n private hasBeenOpenedForTheFirstTime: boolean = false;\n private currentEnrolledPosition: Fraction = new Fraction(0, 1);\n // (*) private musicSheetParameterObject: MusicSheetParameterObject = undefined;\n private rules: EngravingRules;\n // (*) private musicSheetParameterChangedDelegate: MusicSheetParameterChangedDelegate;\n /* Whether BPM info is present in the sheet. If it is set to false, each measure's BPM was set to a default of 120. */\n private hasBPMInfo: boolean;\n\n /**\n * Get the global index within the music sheet for this staff.\n * @param staff\n * @returns {number}\n */\n public static getIndexFromStaff(staff: Staff): number {\n return staff.idInMusicSheet;\n }\n public get SourceMeasures(): SourceMeasure[] {\n return this.sourceMeasures;\n }\n public set SourceMeasures(value: SourceMeasure[]) {\n this.sourceMeasures = value;\n }\n public get Repetitions(): Repetition[] {\n return this.repetitions;\n }\n public set Repetitions(value: Repetition[]) {\n this.repetitions = value;\n }\n public get DynListStaves(): DynamicsContainer[][] {\n return this.dynListStaves;\n }\n public get TimestampSortedTempoExpressionsList(): MultiTempoExpression[] {\n return this.timestampSortedTempoExpressionsList;\n }\n public get TimestampSortedDynamicExpressionsList(): DynamicsContainer[] {\n return this.timestampSortedDynamicExpressionsList;\n }\n public get InstrumentalGroups(): InstrumentalGroup[] {\n return this.instrumentalGroups;\n }\n public get Parts(): Instrument[] { // Instrument should be renamed to Part\n return this.instruments;\n }\n public get Instruments(): Instrument[] { // deprecated\n // this method name should remain for a while to maintain compatibility even when Instrument is renamed to Part\n return this.instruments;\n }\n public get SheetPlaybackSetting(): PlaybackSettings {\n return this.playbackSettings;\n }\n public set SheetPlaybackSetting(value: PlaybackSettings) {\n this.playbackSettings = value;\n }\n public get DrawErroneousMeasures(): boolean {\n return this.drawErroneousMeasures;\n }\n public set DrawErroneousMeasures(value: boolean) {\n this.drawErroneousMeasures = value;\n }\n public get HasBeenOpenedForTheFirstTime(): boolean {\n return this.hasBeenOpenedForTheFirstTime;\n }\n public set HasBeenOpenedForTheFirstTime(value: boolean) {\n this.hasBeenOpenedForTheFirstTime = value;\n }\n public InitializeStartTempoInBPM(startTempo: number): void {\n // (*) this.playbackSettings.BeatsPerMinute = startTempo;\n this.userStartTempoInBPM = startTempo;\n }\n public get DefaultStartTempoInBpm(): number {\n return this.defaultStartTempoInBpm;\n }\n public set DefaultStartTempoInBpm(value: number) {\n this.defaultStartTempoInBpm = value;\n this.InitializeStartTempoInBPM(value);\n }\n public get Path(): string {\n return this.path;\n }\n public set Path(value: string) {\n this.path = value;\n }\n public get Staves(): Staff[] {\n return this.staves;\n }\n public get TitleString(): string {\n if (this.title) {\n return this.title.text;\n } else {\n return \"\";\n }\n }\n public get SubtitleString(): string {\n if (this.subtitle) {\n return this.subtitle.text;\n } else {\n return \"\";\n }\n }\n public get ComposerString(): string {\n if (this.composer) {\n return this.composer.text;\n } else {\n return \"\";\n }\n }\n public get LyricistString(): string {\n if (this.lyricist) {\n return this.lyricist.text;\n } else {\n return \"\";\n }\n }\n public get Title(): Label {\n return this.title;\n }\n public set Title(value: Label) {\n this.title = value;\n }\n public get Subtitle(): Label {\n return this.subtitle;\n }\n public set Subtitle(value: Label) {\n this.subtitle = value;\n }\n public get Composer(): Label {\n return this.composer;\n }\n public set Composer(value: Label) {\n this.composer = value;\n }\n public get Lyricist(): Label {\n return this.lyricist;\n }\n public set Lyricist(value: Label) {\n this.lyricist = value;\n }\n public get Rules(): EngravingRules {\n if (!this.rules) {\n log.debug(\"warning: sheet.Rules was undefined. Creating new EngravingRules.\");\n this.rules = new EngravingRules();\n }\n return this.rules;\n }\n public set Rules(value: EngravingRules) {\n this.rules = value;\n }\n public get SheetErrors(): MusicSheetErrors {\n return this.musicSheetErrors;\n }\n public get SelectionStart(): Fraction {\n return this.selectionStart;\n }\n public set SelectionStart(value: Fraction) {\n this.selectionStart = value.clone();\n this.currentEnrolledPosition = value.clone();\n }\n public get SelectionEnd(): Fraction {\n return this.selectionEnd;\n }\n public set SelectionEnd(value: Fraction) {\n this.selectionEnd = value;\n }\n\n public set HasBPMInfo(value: boolean) {\n this.hasBPMInfo = value;\n }\n\n public get HasBPMInfo(): boolean {\n return this.hasBPMInfo;\n }\n\n // (*) public get MusicSheetParameterObject(): MusicSheetParameterObject {\n // return this.musicSheetParameterObject;\n //}\n // (*) public set MusicSheetParameterObject(value: MusicSheetParameterObject) {\n // this.musicSheetParameterObject = value;\n // this.Title = new Label(this.musicSheetParameterObject.Title);\n // this.Composer = new Label(this.musicSheetParameterObject.Composer);\n //}\n public addMeasure(measure: SourceMeasure): void {\n this.sourceMeasures.push(measure);\n measure.measureListIndex = this.sourceMeasures.length - 1;\n }\n public checkForInstrumentWithNoVoice(): void {\n for (let idx: number = 0, len: number = this.instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.instruments[idx];\n if (instrument.Voices.length === 0) {\n const voice: Voice = new Voice(instrument, 1);\n instrument.Voices.push(voice);\n }\n }\n }\n\n /**\n *\n * @param staffIndexInMusicSheet - The global staff index, iterating through all staves of all instruments.\n * @returns {Staff}\n */\n public getStaffFromIndex(staffIndexInMusicSheet: number): Staff {\n return this.staves[staffIndexInMusicSheet];\n }\n public fillStaffList(): void {\n let i: number = 0;\n for (let idx: number = 0, len: number = this.instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.instruments[idx];\n for (let idx2: number = 0, len2: number = instrument.Staves.length; idx2 < len2; ++idx2) {\n const staff: Staff = instrument.Staves[idx2];\n staff.idInMusicSheet = i;\n this.staves.push(staff);\n i++;\n }\n }\n }\n public get MusicPartManager(): MusicPartManager {\n return this.musicPartManager;\n }\n public set MusicPartManager(value: MusicPartManager) {\n this.musicPartManager = value;\n }\n public getCompleteNumberOfStaves(): number {\n let num: number = 0;\n for (let idx: number = 0, len: number = this.instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.instruments[idx];\n num += instrument.Staves.length;\n }\n return num;\n }\n\n /**\n * Return a sourceMeasureList, where the given indices correspond to the whole SourceMeasureList of the MusicSheet.\n * @param start\n * @param end\n * @returns {SourceMeasure[]}\n */\n public getListOfMeasuresFromIndeces(start: number, end: number): SourceMeasure[] {\n const measures: SourceMeasure[] = [];\n for (let i: number = start; i <= end; i++) {\n measures.push(this.sourceMeasures[i]);\n }\n return measures;\n }\n /**\n * Returns the next SourceMeasure from a given SourceMeasure.\n * @param measure\n */\n public getNextSourceMeasure(measure: SourceMeasure): SourceMeasure {\n const index: number = this.sourceMeasures.indexOf(measure);\n if (index === this.sourceMeasures.length - 1) {\n return measure;\n }\n return this.sourceMeasures[index + 1];\n }\n /**\n * Returns the first SourceMeasure of MusicSheet.\n */\n public getFirstSourceMeasure(): SourceMeasure {\n return this.sourceMeasures[0];\n }\n /**\n * Returns the last SourceMeasure of MusicSheet.\n */\n public getLastSourceMeasure(): SourceMeasure {\n return this.sourceMeasures[this.sourceMeasures.length - 1];\n }\n public resetAllNoteStates(): void {\n const iterator: MusicPartManagerIterator = this.MusicPartManager.getIterator();\n while (!iterator.EndReached && iterator.CurrentVoiceEntries) {\n for (let idx: number = 0, len: number = iterator.CurrentVoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = iterator.CurrentVoiceEntries[idx];\n for (let idx2: number = 0, len2: number = voiceEntry.Notes.length; idx2 < len2; ++idx2) {\n const note: Note = voiceEntry.Notes[idx2];\n note.state = NoteState.Normal;\n }\n }\n iterator.moveToNext();\n }\n }\n public getMusicSheetInstrumentIndex(instrument: Instrument): number {\n return this.Instruments.indexOf(instrument);\n }\n public getGlobalStaffIndexOfFirstStaff(instrument: Instrument): number {\n const instrumentIndex: number = this.getMusicSheetInstrumentIndex(instrument);\n let staffLineIndex: number = 0;\n for (let i: number = 0; i < instrumentIndex; i++) {\n staffLineIndex += this.Instruments[i].Staves.length;\n }\n return staffLineIndex;\n }\n\n /**\n * Set to the index-given Repetition a new (set from user) value.\n * @param index\n * @param value\n */\n public setRepetitionNewUserNumberOfRepetitions(index: number, value: number): void {\n let repIndex: number = 0;\n for (let i: number = 0; i < this.repetitions.length; i++) {\n if (this.repetitions[i] instanceof Repetition) { // FIXME\n if (index === repIndex) {\n this.repetitions[i].UserNumberOfRepetitions = value;\n break;\n } else {\n repIndex++;\n }\n }\n }\n }\n\n /**\n * Return the [[Repetition]] from the given index.\n * @param index\n * @returns {any}\n */\n public getRepetitionByIndex(index: number): Repetition {\n let repIndex: number = 0;\n for (let i: number = 0; i < this.repetitions.length; i++) {\n if (this.repetitions[i] instanceof Repetition) {\n if (index === repIndex) {\n return this.repetitions[i];\n }\n repIndex++;\n }\n }\n return undefined;\n }\n public CompareTo(other: MusicSheet): number {\n return this.Title.text.localeCompare(other.Title.text);\n }\n // (*)\n //public get IInstruments(): IInstrument[] {\n // return this.instruments.slice()\n //}\n //public get IInitializableInstruments(): ISettableInstrument[] {\n // return this.instruments.slice();\n //}\n //public get IRepetitions(): IRepetition[] {\n // try {\n // let repetitions: IRepetition[] = [];\n // for (let idx: number = 0, len: number = this.repetitions.length; idx < len; ++idx) {\n // let partListEntry: PartListEntry = this.repetitions[idx];\n // if (partListEntry instanceof Repetition) {\n // repetitions.push(partListEntry);\n // }\n // }\n // return repetitions;\n // } catch (ex) {\n // log.info(\"MusicSheet.IRepetitions get: \", ex);\n // return undefined;\n // }\n //\n //}\n //public GetExpressionsStartTempoInBPM(): number {\n // if (this.TimestampSortedTempoExpressionsList.length > 0) {\n // let me: MultiTempoExpression = this.TimestampSortedTempoExpressionsList[0];\n // if (me.InstantaneousTempo) {\n // return me.InstantaneousTempo.TempoInBpm;\n // } else if (me.ContinuousTempo) {\n // return me.ContinuousTempo.StartTempo;\n // }\n // }\n // return this.UserStartTempoInBPM;\n //}\n public get Errors(): { [n: number]: string[]; } {\n return this.musicSheetErrors.measureErrors;\n }\n public get FirstMeasureNumber(): number {\n try {\n return this.getFirstSourceMeasure().MeasureNumber;\n } catch (ex) {\n log.info(\"MusicSheet.FirstMeasureNumber: \", ex);\n return 0;\n }\n\n }\n public get LastMeasureNumber(): number {\n try {\n return this.getLastSourceMeasure().MeasureNumber;\n } catch (ex) {\n log.info(\"MusicSheet.LastMeasureNumber: \", ex);\n return 0;\n }\n\n }\n public get CurrentEnrolledPosition(): Fraction {\n return this.currentEnrolledPosition.clone();\n }\n public set CurrentEnrolledPosition(value: Fraction) {\n this.currentEnrolledPosition = value.clone();\n }\n public get Transpose(): number {\n return this.transpose;\n }\n public set Transpose(value: number) {\n this.transpose = value;\n }\n // (*)\n //public SetMusicSheetParameter(parameter: MusicSheetParameters, value: Object): void {\n // if (this.PhonicScoreInterface) {\n // this.PhonicScoreInterface.RequestMusicSheetParameter(parameter, value);\n // } else {\n // let oldValue: Object = 0;\n // if (!parameter) { // FIXME MusicSheetParameters.MusicSheetTranspose) {\n // oldValue = this.Transpose;\n // this.Transpose = value;\n // }\n // if (!parameter) { // FIXME MusicSheetParameters.StartTempoInBPM) {\n // oldValue = this.UserStartTempoInBPM;\n // this.UserStartTempoInBPM = value;\n // }\n // if (!parameter) { // FIXME MusicSheetParameters.HighlightErrors) {\n // oldValue = value;\n // }\n // if (this.MusicSheetParameterChanged) {\n // this.musicSheetParameterChangedDelegate(undefined, parameter, value, oldValue);\n // }\n // }\n //}\n //public get MusicSheetParameterChanged(): MusicSheetParameterChangedDelegate {\n // return this.musicSheetParameterChangedDelegate;\n //}\n //public set MusicSheetParameterChanged(value: MusicSheetParameterChangedDelegate) {\n // this.musicSheetParameterChangedDelegate = value;\n //}\n public get FullNameString(): string {\n return this.ComposerString + \" \" + this.TitleString;\n }\n public get IdString(): string {\n return this.idString;\n }\n public set IdString(value: string) {\n this.idString = value;\n }\n // (*)\n // public Dispose(): void {\n // this.MusicSheetParameterChanged = undefined;\n // for (let idx: number = 0, len: number = this.instruments.length; idx < len; ++idx) {\n // let instrument: Instrument = this.instruments[idx];\n // instrument.dispose();\n // }\n // }\n public getEnrolledSelectionStartTimeStampWorkaround(): Fraction {\n const iter: MusicPartManagerIterator = this.MusicPartManager.getIterator(this.SelectionStart);\n return Fraction.createFromFraction(iter.CurrentEnrolledTimestamp);\n }\n public get SheetEndTimestamp(): Fraction {\n const lastMeasure: SourceMeasure = this.getLastSourceMeasure();\n return Fraction.plus(lastMeasure.AbsoluteTimestamp, lastMeasure.Duration);\n }\n\n /**\n * Works only if the [[SourceMeasure]]s are already filled with VerticalStaffEntryContainers!\n * @param timeStamp\n * @returns {SourceMeasure}\n */\n public getSourceMeasureFromTimeStamp(timeStamp: Fraction): SourceMeasure {\n for (let idx: number = 0, len: number = this.sourceMeasures.length; idx < len; ++idx) {\n const sm: SourceMeasure = this.sourceMeasures[idx];\n for (let idx2: number = 0, len2: number = sm.VerticalSourceStaffEntryContainers.length; idx2 < len2; ++idx2) {\n const vssec: VerticalSourceStaffEntryContainer = sm.VerticalSourceStaffEntryContainers[idx2];\n if (timeStamp.Equals(vssec.getAbsoluteTimestamp())) {\n return sm;\n }\n }\n }\n return this.findSourceMeasureFromTimeStamp(timeStamp);\n }\n public findSourceMeasureFromTimeStamp(timestamp: Fraction): SourceMeasure {\n for (const sm of this.sourceMeasures) {\n if (sm.AbsoluteTimestamp.lte(timestamp) && timestamp.lt(Fraction.plus(sm.AbsoluteTimestamp, sm.Duration))) {\n return sm;\n }\n }\n }\n\n public getVisibleInstruments(): Instrument[] {\n const visInstruments: Instrument[] = [];\n for (let idx: number = 0, len: number = this.Instruments.length; idx < len; ++idx) {\n const instrument: Instrument = this.Instruments[idx];\n if (instrument.Voices.length > 0 && instrument.Voices[0].Visible) {\n visInstruments.push(instrument);\n }\n }\n return visInstruments;\n }\n}\n","import {SourceMusicPart} from \"./SourceMusicPart\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {MusicSheet} from \"../MusicSheet\";\nimport {RepetitionInstruction} from \"../VoiceData/Instructions/RepetitionInstruction\";\nimport {PartListEntry} from \"./PartListEntry\";\nimport log from \"loglevel\";\n\nexport class Repetition extends PartListEntry /*implements IRepetition*/ {\n constructor(musicSheet: MusicSheet, virtualOverallRepetition: boolean) {\n super(musicSheet);\n this.musicSheet2 = musicSheet;\n this.virtualOverallRepetition = virtualOverallRepetition;\n }\n\n public startMarker: RepetitionInstruction;\n public endMarker: RepetitionInstruction;\n public forwardJumpInstruction: RepetitionInstruction;\n\n private backwardJumpInstructions: RepetitionInstruction[] = [];\n private endingParts: RepetitionEndingPart[] = [];\n private endingIndexDict: { [_: number]: RepetitionEndingPart; } = {};\n private userNumberOfRepetitions: number = 0;\n private visibles: boolean[] = [];\n private fromWords: boolean = false;\n private musicSheet2: MusicSheet;\n private repetitonIterationOrder: number[] = [];\n private numberOfEndings: number = 1;\n private virtualOverallRepetition: boolean;\n\n public get BackwardJumpInstructions(): RepetitionInstruction[] {\n return this.backwardJumpInstructions;\n }\n public get EndingIndexDict(): { [_: number]: RepetitionEndingPart; } {\n return this.endingIndexDict;\n }\n public get EndingParts(): RepetitionEndingPart[] {\n return this.endingParts;\n }\n public get Visibles(): boolean[] {\n return this.visibles;\n }\n public set Visibles(value: boolean[]) {\n this.visibles = value;\n }\n public get DefaultNumberOfRepetitions(): number {\n let defaultNumber: number = 2;\n if (this.virtualOverallRepetition) { defaultNumber = 1; }\n return Math.max(defaultNumber, Object.keys(this.endingIndexDict).length, this.checkRepetitionForMultipleLyricVerses());\n }\n public get UserNumberOfRepetitions(): number {\n return this.userNumberOfRepetitions;\n }\n public set UserNumberOfRepetitions(value: number) {\n this.userNumberOfRepetitions = value;\n this.repetitonIterationOrder = [];\n const endingsDiff: number = this.userNumberOfRepetitions - this.NumberOfEndings;\n for (let i: number = 1; i <= this.userNumberOfRepetitions; i++) {\n if (i <= endingsDiff) {\n this.repetitonIterationOrder.push(1);\n } else {\n this.repetitonIterationOrder.push(i - endingsDiff);\n }\n }\n }\n public getForwardJumpTargetForIteration(iteration: number): number {\n const endingIndex: number = this.repetitonIterationOrder[iteration - 1];\n if (this.endingIndexDict[endingIndex]) {\n return this.endingIndexDict[endingIndex].part.StartIndex;\n }\n return -1;\n }\n public getBackwardJumpTarget(): number {\n return this.startMarker.measureIndex;\n }\n public SetEndingStartIndex(endingNumbers: number[], startIndex: number): void {\n const part: RepetitionEndingPart = new RepetitionEndingPart(new SourceMusicPart(this.musicSheet2, startIndex, startIndex));\n this.endingParts.push(part);\n for (const endingNumber of endingNumbers) {\n try {\n this.endingIndexDict[endingNumber] = part;\n part.endingIndices.push(endingNumber);\n if (this.numberOfEndings < endingNumber) {\n this.numberOfEndings = endingNumber;\n }\n } catch (err) {\n log.error(\"Repetition: Exception.\", err);\n }\n\n }\n }\n //public SetEndingStartIndex(endingNumber: number, startIndex: number): void {\n // let part: RepetitionEndingPart = new RepetitionEndingPart(new SourceMusicPart(this.musicSheet2, startIndex, startIndex));\n // this.endingParts.push(part);\n // this.endingIndexDict[endingNumber] = part;\n // part.endingIndices.push(endingNumber);\n // if (this.numberOfEndings < endingNumber) {\n // this.numberOfEndings = endingNumber;\n // }\n //}\n public setEndingEndIndex(endingNumber: number, endIndex: number): void {\n if (this.endingIndexDict[endingNumber]) {\n this.endingIndexDict[endingNumber].part.setEndIndex(endIndex);\n }\n }\n public get NumberOfEndings(): number {\n return this.numberOfEndings;\n }\n public get FromWords(): boolean {\n return this.fromWords;\n }\n public set FromWords(value: boolean) {\n this.fromWords = value;\n }\n public get AbsoluteTimestamp(): Fraction {\n return Fraction.createFromFraction(this.musicSheet2.SourceMeasures[this.startMarker.measureIndex].AbsoluteTimestamp);\n }\n public get StartIndex(): number {\n return this.startMarker.measureIndex;\n }\n public get EndIndex(): number {\n if (this.BackwardJumpInstructions.length === 0) {\n return this.StartIndex;\n }\n let result: number = this.backwardJumpInstructions[this.backwardJumpInstructions.length - 1].measureIndex;\n if (this.endingIndexDict[this.NumberOfEndings]) {\n result = Math.max(this.endingIndexDict[this.NumberOfEndings].part.EndIndex, result);\n }\n return result;\n }\n private checkRepetitionForMultipleLyricVerses(): number {\n let lyricVerses: number = 0;\n const start: number = this.StartIndex;\n const end: number = this.EndIndex;\n for (let measureIndex: number = start; measureIndex <= end; measureIndex++) {\n const sourceMeasure: SourceMeasure = this.musicSheet2.SourceMeasures[measureIndex];\n for (let i: number = 0; i < sourceMeasure.CompleteNumberOfStaves; i++) {\n for (const sourceStaffEntry of sourceMeasure.VerticalSourceStaffEntryContainers[i].StaffEntries) {\n if (sourceStaffEntry) {\n let verses: number = 0;\n for (const voiceEntry of sourceStaffEntry.VoiceEntries) {\n verses += Object.keys(voiceEntry.LyricsEntries).length;\n }\n lyricVerses = Math.max(lyricVerses, verses);\n }\n }\n }\n }\n return lyricVerses;\n }\n public get FirstSourceMeasureNumber(): number {\n return this.getFirstSourceMeasure().MeasureNumber;\n }\n public get LastSourceMeasureNumber(): number {\n return this.getLastSourceMeasure().MeasureNumber;\n }\n\n}\n\nexport class RepetitionEndingPart {\n constructor(endingPart: SourceMusicPart) {\n this.part = endingPart;\n }\n public part: SourceMusicPart;\n public endingIndices: number[] = [];\n public ToString(): string {\n return this.endingIndices.join(\", \");\n }\n}\n","import {PartListEntry} from \"./PartListEntry\";\nimport {Repetition} from \"./Repetition\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {MusicSheet} from \"../MusicSheet\";\n\nexport class SourceMusicPart extends PartListEntry {\n constructor(musicSheet: MusicSheet, startIndex?: number, endIndex?: number) {\n super(musicSheet);\n this.musicSheet = musicSheet;\n this.startIndex = startIndex;\n this.endIndex = endIndex;\n }\n\n //protected musicSheet: MusicSheet;\n protected parentRepetition: Repetition;\n //private startIndex: number;\n //private endIndex: number;\n\n public get MeasuresCount(): number {\n return this.endIndex - this.startIndex + 1;\n }\n public get StartIndex(): number {\n return this.startIndex;\n }\n public get EndIndex(): number {\n return this.endIndex;\n }\n public get ParentRepetition(): Repetition {\n return this.parentRepetition;\n }\n public set ParentRepetition(value: Repetition) {\n this.parentRepetition = value;\n }\n public get AbsoluteTimestamp(): Fraction {\n return Fraction.createFromFraction(this.musicSheet.SourceMeasures[this.startIndex].AbsoluteTimestamp);\n }\n public setStartIndex(startIndex: number): void {\n this.startIndex = startIndex;\n }\n public setEndIndex(index: number): void {\n this.endIndex = index;\n }\n}\n","import {Instrument} from \"../Instrument\";\nimport {MusicSheet} from \"../MusicSheet\";\nimport {VoiceGenerator} from \"./VoiceGenerator\";\nimport {Staff} from \"../VoiceData/Staff\";\nimport {SourceMeasure} from \"../VoiceData/SourceMeasure\";\nimport {SourceStaffEntry} from \"../VoiceData/SourceStaffEntry\";\nimport {ClefInstruction} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {KeyInstruction} from \"../VoiceData/Instructions/KeyInstruction\";\nimport {RhythmInstruction} from \"../VoiceData/Instructions/RhythmInstruction\";\nimport {AbstractNotationInstruction} from \"../VoiceData/Instructions/AbstractNotationInstruction\";\nimport {Fraction} from \"../../Common/DataObjects/Fraction\";\nimport {IXmlElement} from \"../../Common/FileIO/Xml\";\nimport {ITextTranslation} from \"../Interfaces/ITextTranslation\";\nimport {MusicSheetReadingException} from \"../Exceptions\";\nimport {ClefEnum} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {RhythmSymbolEnum} from \"../VoiceData/Instructions/RhythmInstruction\";\nimport {KeyEnum} from \"../VoiceData/Instructions/KeyInstruction\";\nimport {IXmlAttribute} from \"../../Common/FileIO/Xml\";\nimport {ChordSymbolContainer} from \"../VoiceData/ChordSymbolContainer\";\nimport log from \"loglevel\";\nimport {MidiInstrument} from \"../VoiceData/Instructions/ClefInstruction\";\nimport {ChordSymbolReader} from \"./MusicSymbolModules/ChordSymbolReader\";\nimport {ExpressionReader} from \"./MusicSymbolModules/ExpressionReader\";\nimport {RepetitionInstructionReader} from \"./MusicSymbolModules/RepetitionInstructionReader\";\nimport {SlurReader} from \"./MusicSymbolModules/SlurReader\";\nimport {StemDirectionType} from \"../VoiceData/VoiceEntry\";\nimport {NoteType, NoteTypeHandler} from \"../VoiceData\";\nimport {SystemLinesEnumHelper} from \"../Graphical\";\n//import Dictionary from \"typescript-collections/dist/lib/Dictionary\";\n\n// FIXME: The following classes are missing\n//type ChordSymbolContainer = any;\n//type SlurReader = any;\n//type RepetitionInstructionReader = any;\n//declare class MusicSymbolModuleFactory {\n// public static createSlurReader(x: any): any;\n//}\n//\n//class MetronomeReader {\n// public static addMetronomeSettings(xmlNode: IXmlElement, musicSheet: MusicSheet): void { }\n// public static readMetronomeInstructions(xmlNode: IXmlElement, musicSheet: MusicSheet, currentXmlMeasureIndex: number): void { }\n// public static readTempoInstruction(soundNode: IXmlElement, musicSheet: MusicSheet, currentXmlMeasureIndex: number): void { }\n//}\n//\n//class ChordSymbolReader {\n// public static readChordSymbol(xmlNode:IXmlElement, musicSheet:MusicSheet, activeKey:any): void {\n// }\n//}\n\n\n/**\n * An InstrumentReader is used during the reading phase to keep parsing new measures from the MusicXML file\n * with the readNextXmlMeasure method.\n */\nexport class InstrumentReader {\n\n constructor(repetitionInstructionReader: RepetitionInstructionReader, xmlMeasureList: IXmlElement[], instrument: Instrument) {\n this.repetitionInstructionReader = repetitionInstructionReader;\n this.xmlMeasureList = xmlMeasureList;\n this.musicSheet = instrument.GetMusicSheet;\n this.instrument = instrument;\n this.activeClefs = new Array(instrument.Staves.length);\n this.activeClefsHaveBeenInitialized = new Array(instrument.Staves.length);\n for (let i: number = 0; i < instrument.Staves.length; i++) {\n this.activeClefsHaveBeenInitialized[i] = false;\n }\n this.createExpressionGenerators(instrument.Staves.length);\n this.slurReader = new SlurReader(this.musicSheet);\n }\n\n private repetitionInstructionReader: RepetitionInstructionReader;\n private xmlMeasureList: IXmlElement[];\n private musicSheet: MusicSheet;\n private slurReader: SlurReader;\n private instrument: Instrument;\n private voiceGeneratorsDict: { [n: number]: VoiceGenerator; } = {};\n private staffMainVoiceGeneratorDict: { [staffId: number]: VoiceGenerator } = {};\n private inSourceMeasureInstrumentIndex: number;\n private divisions: number = 0;\n private currentMeasure: SourceMeasure;\n private previousMeasure: SourceMeasure;\n private currentClefNumber: number = 1;\n private currentXmlMeasureIndex: number = 0;\n private currentStaff: Staff;\n private currentStaffEntry: SourceStaffEntry;\n private activeClefs: ClefInstruction[];\n private activeKey: KeyInstruction;\n private activeRhythm: RhythmInstruction;\n private activeClefsHaveBeenInitialized: boolean[];\n private activeKeyHasBeenInitialized: boolean = false;\n private abstractInstructions: [number, AbstractNotationInstruction][] = [];\n private openChordSymbolContainers: ChordSymbolContainer[] = [];\n private expressionReaders: ExpressionReader[];\n private currentVoiceGenerator: VoiceGenerator;\n //private openSlurDict: { [n: number]: Slur; } = {};\n private maxTieNoteFraction: Fraction;\n\n public get ActiveKey(): KeyInstruction {\n return this.activeKey;\n }\n\n public get MaxTieNoteFraction(): Fraction {\n return this.maxTieNoteFraction;\n }\n\n public get ActiveRhythm(): RhythmInstruction {\n return this.activeRhythm;\n }\n\n public set ActiveRhythm(value: RhythmInstruction) {\n this.activeRhythm = value;\n }\n\n /**\n * Main CreateSheet: read the next XML Measure and save all data to the given [[SourceMeasure]].\n * @param currentMeasure\n * @param measureStartAbsoluteTimestamp - Using this instead of currentMeasure.AbsoluteTimestamp as it isn't set yet\n * @param guitarPro\n * @returns {boolean}\n */\n public readNextXmlMeasure(currentMeasure: SourceMeasure, measureStartAbsoluteTimestamp: Fraction, guitarPro: boolean): boolean {\n if (this.currentXmlMeasureIndex >= this.xmlMeasureList.length) {\n return false;\n }\n this.currentMeasure = currentMeasure;\n this.inSourceMeasureInstrumentIndex = this.musicSheet.getGlobalStaffIndexOfFirstStaff(this.instrument);\n if (this.repetitionInstructionReader) {\n this.repetitionInstructionReader.prepareReadingMeasure(currentMeasure, this.currentXmlMeasureIndex);\n }\n let currentFraction: Fraction = new Fraction(0, 1);\n let previousFraction: Fraction = new Fraction(0, 1);\n let divisionsException: boolean = false;\n this.maxTieNoteFraction = new Fraction(0, 1);\n let lastNoteWasGrace: boolean = false;\n try {\n const xmlMeasureListArr: IXmlElement[] = this.xmlMeasureList[this.currentXmlMeasureIndex].elements();\n for (const xmlNode of xmlMeasureListArr) {\n if (xmlNode.name === \"print\") {\n const newSystemAttr: IXmlAttribute = xmlNode.attribute(\"new-system\");\n if (newSystemAttr?.value === \"yes\") {\n currentMeasure.printNewSystemXml = true;\n }\n const newPageAttr: IXmlAttribute = xmlNode.attribute(\"new-page\");\n if (newPageAttr?.value === \"yes\") {\n currentMeasure.printNewPageXml = true;\n }\n } else if (xmlNode.name === \"note\") {\n let printObject: boolean = true;\n if (xmlNode.hasAttributes && xmlNode.attribute(\"print-object\") &&\n xmlNode.attribute(\"print-object\").value === \"no\") {\n printObject = false; // note will not be rendered, but still parsed for Playback etc.\n // if (xmlNode.attribute(\"print-spacing\")) {\n // if (xmlNode.attribute(\"print-spacing\").value === \"yes\" {\n // // TODO give spacing for invisible notes even when not displayed. might be hard with Vexflow formatting\n }\n let noteStaff: number = 1;\n if (this.instrument.Staves.length > 1) {\n if (xmlNode.element(\"staff\")) {\n noteStaff = parseInt(xmlNode.element(\"staff\").value, 10);\n if (isNaN(noteStaff)) {\n log.debug(\"InstrumentReader.readNextXmlMeasure.get staff number\");\n noteStaff = 1;\n }\n }\n }\n\n this.currentStaff = this.instrument.Staves[noteStaff - 1];\n const isChord: boolean = xmlNode.element(\"chord\") !== undefined;\n if (xmlNode.element(\"voice\")) {\n const noteVoice: number = parseInt(xmlNode.element(\"voice\").value, 10);\n this.currentVoiceGenerator = this.getOrCreateVoiceGenerator(noteVoice, noteStaff - 1);\n } else {\n if (!isChord || !this.currentVoiceGenerator) {\n this.currentVoiceGenerator = this.getOrCreateVoiceGenerator(1, noteStaff - 1);\n }\n }\n let noteDivisions: number = 0;\n let noteDuration: Fraction = new Fraction(0, 1);\n let normalNotes: number = 2;\n let typeDuration: Fraction = undefined;\n let isTuplet: boolean = false;\n if (xmlNode.element(\"duration\")) {\n noteDivisions = parseInt(xmlNode.element(\"duration\").value, 10);\n if (!isNaN(noteDivisions)) {\n noteDuration = new Fraction(noteDivisions, 4 * this.divisions);\n if (noteDivisions === 0) {\n noteDuration = this.getNoteDurationFromTypeNode(xmlNode);\n } else {\n typeDuration = this.getNoteDurationFromTypeNode(xmlNode);\n }\n if (xmlNode.element(\"time-modification\")) {\n noteDuration = this.getNoteDurationForTuplet(xmlNode);\n const time: IXmlElement = xmlNode.element(\"time-modification\");\n if (time) {\n if (time.element(\"normal-notes\")) {\n normalNotes = parseInt(time.element(\"normal-notes\").value, 10);\n }\n }\n isTuplet = true;\n }\n } else {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/NoteDurationError\", \"Invalid Note Duration.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readNextXmlMeasure\", errorMsg);\n continue;\n }\n }\n\n const restNote: boolean = xmlNode.element(\"rest\") !== undefined;\n //log.info(\"New note found!\", noteDivisions, noteDuration.toString(), restNote);\n\n const notationsNode: IXmlElement = xmlNode.element(\"notations\"); // used for multiple checks further on\n\n const isGraceNote: boolean = xmlNode.element(\"grace\") !== undefined || noteDivisions === 0 || isChord && lastNoteWasGrace;\n let graceNoteSlash: boolean = false;\n let graceSlur: boolean = false;\n if (isGraceNote) {\n const graceNode: IXmlElement = xmlNode.element(\"grace\");\n if (graceNode && graceNode.attributes()) {\n if (graceNode.attribute(\"slash\")) {\n const slash: string = graceNode.attribute(\"slash\").value;\n if (slash === \"yes\") {\n graceNoteSlash = true;\n }\n }\n }\n\n noteDuration = this.getNoteDurationFromTypeNode(xmlNode);\n\n const notationNode: IXmlElement = xmlNode.element(\"notations\");\n if (notationNode) {\n if (notationNode.element(\"slur\")) {\n graceSlur = true;\n // grace slurs could be non-binary, but VexFlow.GraceNoteGroup modifier system is currently only boolean for slurs.\n }\n }\n }\n\n // check for cue note\n let isCueNote: boolean = false;\n const cueNode: IXmlElement = xmlNode.element(\"cue\");\n if (cueNode) {\n isCueNote = true;\n }\n // alternative: check for \n const typeNode: IXmlElement = xmlNode.element(\"type\");\n let noteTypeXml: NoteType = NoteType.UNDEFINED;\n if (typeNode) {\n const sizeAttr: Attr = typeNode.attribute(\"size\");\n if (sizeAttr !== undefined && sizeAttr !== null) {\n if (sizeAttr.value === \"cue\") {\n isCueNote = true;\n }\n }\n noteTypeXml = NoteTypeHandler.StringToNoteType(typeNode.value);\n }\n\n // check stem element\n let stemDirectionXml: StemDirectionType = StemDirectionType.Undefined;\n let stemColorXml: string;\n const stemNode: IXmlElement = xmlNode.element(\"stem\");\n if (stemNode) {\n switch (stemNode.value) {\n case \"down\":\n stemDirectionXml = StemDirectionType.Down;\n break;\n case \"up\":\n stemDirectionXml = StemDirectionType.Up;\n break;\n case \"double\":\n stemDirectionXml = StemDirectionType.Double;\n break;\n case \"none\":\n stemDirectionXml = StemDirectionType.None;\n break;\n default:\n stemDirectionXml = StemDirectionType.Undefined;\n }\n\n const stemColorAttr: Attr = stemNode.attribute(\"color\");\n if (stemColorAttr) { // can be null, maybe also undefined\n stemColorXml = this.parseXmlColor(stemColorAttr.value);\n }\n }\n\n // check Tremolo\n let tremoloStrokes: number = 0;\n if (notationsNode) {\n const ornamentsNode: IXmlElement = notationsNode.element(\"ornaments\");\n if (ornamentsNode) {\n const tremoloNode: IXmlElement = ornamentsNode.element(\"tremolo\");\n if (tremoloNode) {\n const tremoloType: Attr = tremoloNode.attribute(\"type\");\n if (tremoloType && tremoloType.value === \"single\") {\n const tremoloStrokesGiven: number = parseInt(tremoloNode.value, 10);\n if (tremoloStrokesGiven > 0) {\n tremoloStrokes = tremoloStrokesGiven;\n }\n }\n // TODO implement type \"start\". Vexflow doesn't have tremolo beams yet though (shorter than normal beams)\n }\n }\n }\n\n // check notehead/color\n let noteheadColorXml: string;\n const noteheadNode: IXmlElement = xmlNode.element(\"notehead\");\n if (noteheadNode) {\n const colorAttr: Attr = noteheadNode.attribute(\"color\");\n if (colorAttr) {\n noteheadColorXml = this.parseXmlColor(colorAttr.value);\n }\n }\n\n let noteColorXml: string;\n const noteColorAttr: Attr = xmlNode.attribute(\"color\");\n if (noteColorAttr) { // can be undefined\n noteColorXml = this.parseXmlColor(noteColorAttr.value);\n if (!noteheadColorXml) {\n noteheadColorXml = noteColorXml;\n }\n if (!stemColorXml) {\n stemColorXml = noteColorXml;\n }\n }\n\n let musicTimestamp: Fraction = currentFraction.clone();\n if (isChord) {\n musicTimestamp = previousFraction.clone();\n }\n this.currentStaffEntry = this.currentMeasure.findOrCreateStaffEntry(\n musicTimestamp,\n this.inSourceMeasureInstrumentIndex + noteStaff - 1,\n this.currentStaff\n ).staffEntry;\n //log.info(\"currentStaffEntry\", this.currentStaffEntry, this.currentMeasure.VerticalSourceStaffEntryContainers.length);\n\n if (!this.currentVoiceGenerator.hasVoiceEntry()\n || (!isChord && !isGraceNote && !lastNoteWasGrace)\n || (isGraceNote && !lastNoteWasGrace)\n || (isGraceNote && !isChord)\n || (!isGraceNote && lastNoteWasGrace)\n ) {\n this.currentVoiceGenerator.createVoiceEntry(musicTimestamp, this.currentStaffEntry, !restNote && !isGraceNote,\n isGraceNote, graceNoteSlash, graceSlur);\n }\n if (!isGraceNote && !isChord) {\n previousFraction = currentFraction.clone();\n currentFraction.Add(noteDuration);\n }\n if (\n isChord &&\n this.currentStaffEntry !== undefined &&\n this.currentStaffEntry.ParentStaff !== this.currentStaff\n ) {\n this.currentStaffEntry = this.currentVoiceGenerator.checkForStaffEntryLink(\n this.inSourceMeasureInstrumentIndex + noteStaff - 1, this.currentStaff, this.currentStaffEntry, this.currentMeasure\n );\n }\n const beginOfMeasure: boolean = (\n this.currentStaffEntry !== undefined &&\n this.currentStaffEntry.Timestamp !== undefined &&\n this.currentStaffEntry.Timestamp.Equals(new Fraction(0, 1)) && !this.currentStaffEntry.hasNotes()\n );\n this.saveAbstractInstructionList(this.instrument.Staves.length, beginOfMeasure);\n if (this.openChordSymbolContainers.length !== 0) {\n this.currentStaffEntry.ChordContainers = this.openChordSymbolContainers;\n // TODO handle multiple chords on one note/staffentry\n this.openChordSymbolContainers = [];\n }\n if (this.activeRhythm) {\n // (*) this.musicSheet.SheetPlaybackSetting.Rhythm = this.activeRhythm.Rhythm;\n }\n if (!isTuplet && !isGraceNote) {\n noteDuration = new Fraction(noteDivisions, 4 * this.divisions);\n }\n this.currentVoiceGenerator.read(\n xmlNode, noteDuration, typeDuration, noteTypeXml, normalNotes, restNote,\n this.currentStaffEntry, this.currentMeasure,\n measureStartAbsoluteTimestamp,\n this.maxTieNoteFraction, isChord, guitarPro,\n printObject, isCueNote, stemDirectionXml, tremoloStrokes, stemColorXml, noteheadColorXml\n );\n\n // notationsNode created further up for multiple checks\n if (notationsNode !== undefined && notationsNode.element(\"dynamics\")) {\n const expressionReader: ExpressionReader = this.expressionReaders[this.readExpressionStaffNumber(xmlNode) - 1];\n if (expressionReader) {\n expressionReader.readExpressionParameters(\n xmlNode, this.instrument, this.divisions, currentFraction, previousFraction, this.currentMeasure.MeasureNumber, false\n );\n expressionReader.read(\n xmlNode, this.currentMeasure, previousFraction\n );\n }\n }\n lastNoteWasGrace = isGraceNote;\n } else if (xmlNode.name === \"attributes\") {\n const divisionsNode: IXmlElement = xmlNode.element(\"divisions\");\n if (divisionsNode) {\n this.divisions = parseInt(divisionsNode.value, 10);\n if (isNaN(this.divisions)) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/DivisionError\",\n \"Invalid divisions value at Instrument: \");\n log.debug(\"InstrumentReader.readNextXmlMeasure\", errorMsg);\n this.divisions = this.readDivisionsFromNotes();\n if (this.divisions > 0) {\n this.musicSheet.SheetErrors.push(errorMsg + this.instrument.Name);\n } else {\n divisionsException = true;\n throw new MusicSheetReadingException(errorMsg + this.instrument.Name);\n }\n }\n\n }\n if (\n !xmlNode.element(\"divisions\") &&\n this.divisions === 0 &&\n this.currentXmlMeasureIndex === 0\n ) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/DivisionError\", \"Invalid divisions value at Instrument: \");\n this.divisions = this.readDivisionsFromNotes();\n if (this.divisions > 0) {\n this.musicSheet.SheetErrors.push(errorMsg + this.instrument.Name);\n } else {\n divisionsException = true;\n throw new MusicSheetReadingException(errorMsg + this.instrument.Name);\n }\n }\n this.addAbstractInstruction(xmlNode, guitarPro);\n if (currentFraction.Equals(new Fraction(0, 1)) &&\n this.isAttributesNodeAtBeginOfMeasure(this.xmlMeasureList[this.currentXmlMeasureIndex], xmlNode)) {\n this.saveAbstractInstructionList(this.instrument.Staves.length, true);\n }\n if (this.isAttributesNodeAtEndOfMeasure(this.xmlMeasureList[this.currentXmlMeasureIndex], xmlNode)) {\n this.saveClefInstructionAtEndOfMeasure();\n }\n const staffDetailsNode: IXmlElement = xmlNode.element(\"staff-details\");\n if (staffDetailsNode) {\n const staffLinesNode: IXmlElement = staffDetailsNode.element(\"staff-lines\");\n if (staffLinesNode) {\n let staffNumber: number = 1;\n const staffNumberAttr: Attr = staffDetailsNode.attribute(\"number\");\n if (staffNumberAttr) {\n staffNumber = parseInt(staffNumberAttr.value, 10);\n }\n this.instrument.Staves[staffNumber - 1].StafflineCount = parseInt(staffLinesNode.value, 10);\n }\n }\n } else if (xmlNode.name === \"forward\") {\n const forFraction: number = parseInt(xmlNode.element(\"duration\").value, 10);\n currentFraction.Add(new Fraction(forFraction, 4 * this.divisions));\n } else if (xmlNode.name === \"backup\") {\n const backFraction: number = parseInt(xmlNode.element(\"duration\").value, 10);\n currentFraction.Sub(new Fraction(backFraction, 4 * this.divisions));\n if (currentFraction.IsNegative()) {\n currentFraction = new Fraction(0, 1);\n }\n previousFraction.Sub(new Fraction(backFraction, 4 * this.divisions));\n if (previousFraction.IsNegative()) {\n previousFraction = new Fraction(0, 1);\n }\n } else if (xmlNode.name === \"direction\") {\n const directionTypeNode: IXmlElement = xmlNode.element(\"direction-type\");\n // (*) MetronomeReader.readMetronomeInstructions(xmlNode, this.musicSheet, this.currentXmlMeasureIndex);\n let relativePositionInMeasure: number = Math.min(1, currentFraction.RealValue);\n if (this.activeRhythm !== undefined && this.activeRhythm.Rhythm) {\n relativePositionInMeasure /= this.activeRhythm.Rhythm.RealValue;\n }\n let handeled: boolean = false;\n if (this.repetitionInstructionReader) {\n handeled = this.repetitionInstructionReader.handleRepetitionInstructionsFromWordsOrSymbols( directionTypeNode,\n relativePositionInMeasure);\n }\n if (!handeled) {\n let expressionReader: ExpressionReader = this.expressionReaders[0];\n const staffIndex: number = this.readExpressionStaffNumber(xmlNode) - 1;\n if (staffIndex < this.expressionReaders.length) {\n expressionReader = this.expressionReaders[staffIndex];\n }\n if (expressionReader) {\n if (directionTypeNode.element(\"octave-shift\")) {\n expressionReader.readExpressionParameters(\n xmlNode, this.instrument, this.divisions, currentFraction, previousFraction, this.currentMeasure.MeasureNumber, true\n );\n expressionReader.addOctaveShift(xmlNode, this.currentMeasure, previousFraction.clone());\n }\n expressionReader.readExpressionParameters(\n xmlNode, this.instrument, this.divisions, currentFraction, previousFraction, this.currentMeasure.MeasureNumber, false\n );\n expressionReader.read(xmlNode, this.currentMeasure, currentFraction);\n }\n }\n } else if (xmlNode.name === \"barline\") {\n if (this.repetitionInstructionReader) {\n const measureEndsSystem: boolean = this.repetitionInstructionReader.handleLineRepetitionInstructions(xmlNode);\n if (measureEndsSystem) {\n this.currentMeasure.HasEndLine = true;\n }\n }\n const location: IXmlAttribute = xmlNode.attribute(\"location\");\n if (location && location.value === \"right\") {\n const stringValue: string = xmlNode.element(\"bar-style\")?.value;\n // TODO apparently we didn't anticipate bar-style not existing (the ? above was missing). how to handle?\n if (stringValue) {\n this.currentMeasure.endingBarStyleXml = stringValue;\n this.currentMeasure.endingBarStyleEnum = SystemLinesEnumHelper.xmlBarlineStyleToSystemLinesEnum(stringValue);\n }\n }\n // TODO do we need to process bars with left location too?\n } else if (xmlNode.name === \"sound\") {\n // (*) MetronomeReader.readTempoInstruction(xmlNode, this.musicSheet, this.currentXmlMeasureIndex);\n } else if (xmlNode.name === \"harmony\") {\n // new chord, could be second chord on same staffentry/note\n this.openChordSymbolContainers.push(ChordSymbolReader.readChordSymbol(xmlNode, this.musicSheet, this.activeKey));\n }\n }\n for (const j in this.voiceGeneratorsDict) {\n if (this.voiceGeneratorsDict.hasOwnProperty(j)) {\n const voiceGenerator: VoiceGenerator = this.voiceGeneratorsDict[j];\n voiceGenerator.checkForOpenBeam();\n }\n }\n if (this.currentXmlMeasureIndex === this.xmlMeasureList.length - 1) {\n for (let i: number = 0; i < this.instrument.Staves.length; i++) {\n if (!this.activeClefsHaveBeenInitialized[i]) {\n this.createDefaultClefInstruction(this.musicSheet.getGlobalStaffIndexOfFirstStaff(this.instrument) + i);\n }\n }\n if (!this.activeKeyHasBeenInitialized) {\n this.createDefaultKeyInstruction();\n }\n\n for (let i: number = 0; i < this.expressionReaders.length; i++) {\n const reader: ExpressionReader = this.expressionReaders[i];\n if (reader) {\n reader.checkForOpenExpressions(this.currentMeasure, currentFraction);\n }\n }\n }\n\n // if this is the first measure and no BPM info found, we set it to 120\n // next measures will automatically inherit that value\n if (!this.musicSheet.HasBPMInfo) {\n this.currentMeasure.TempoInBPM = 120;\n } else if (currentMeasure.TempoInBPM === 0) {\n this.currentMeasure.TempoInBPM = this.previousMeasure.TempoInBPM;\n }\n } catch (e) {\n if (divisionsException) {\n throw new MusicSheetReadingException(e.Message);\n }\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/MeasureError\", \"Error while reading Measure.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readNextXmlMeasure\", errorMsg, e);\n }\n\n this.previousMeasure = this.currentMeasure;\n this.currentXmlMeasureIndex += 1;\n return true;\n }\n\n /** Parse a color in XML format. Can be #ARGB or #RGB format, colors as byte hex values.\n * @return color in Vexflow format #[A]RGB or undefined for invalid xmlColorString\n */\n public parseXmlColor(xmlColorString: string): string {\n if (!xmlColorString) {\n return undefined;\n }\n\n if (xmlColorString.length === 7) { // #RGB\n return xmlColorString;\n } else if (xmlColorString.length === 9) { // #ARGB\n return \"#\" + xmlColorString.substr(3); // cut away alpha channel\n } else {\n return undefined; // invalid xml color\n }\n }\n\n public doCalculationsAfterDurationHasBeenSet(): void {\n for (const j in this.voiceGeneratorsDict) {\n if (this.voiceGeneratorsDict.hasOwnProperty(j)) {\n this.voiceGeneratorsDict[j].checkOpenTies();\n }\n }\n }\n\n /**\n * Get or create the passing [[VoiceGenerator]].\n * @param voiceId\n * @param staffId\n * @returns {VoiceGenerator}\n */\n private getOrCreateVoiceGenerator(voiceId: number, staffId: number): VoiceGenerator {\n const staff: Staff = this.instrument.Staves[staffId];\n let voiceGenerator: VoiceGenerator = this.voiceGeneratorsDict[voiceId];\n if (voiceGenerator) {\n if (staff.Voices.indexOf(voiceGenerator.GetVoice) === -1) {\n staff.Voices.push(voiceGenerator.GetVoice);\n }\n } else {\n const mainVoiceGenerator: VoiceGenerator = this.staffMainVoiceGeneratorDict[staffId];\n if (mainVoiceGenerator) {\n voiceGenerator = new VoiceGenerator(this.instrument, voiceId, this.slurReader, mainVoiceGenerator.GetVoice);\n staff.Voices.push(voiceGenerator.GetVoice);\n this.voiceGeneratorsDict[voiceId] = voiceGenerator;\n } else {\n voiceGenerator = new VoiceGenerator(this.instrument, voiceId, this.slurReader);\n staff.Voices.push(voiceGenerator.GetVoice);\n this.voiceGeneratorsDict[voiceId] = voiceGenerator;\n this.staffMainVoiceGeneratorDict[staffId] = voiceGenerator;\n }\n }\n return voiceGenerator;\n }\n\n\n private createExpressionGenerators(numberOfStaves: number): void {\n this.expressionReaders = new Array(numberOfStaves);\n for (let i: number = 0; i < numberOfStaves; i++) {\n this.expressionReaders[i] = new ExpressionReader(this.musicSheet, this.instrument, i + 1);\n }\n }\n\n /**\n * Create the default [[ClefInstruction]] for the given staff index.\n * @param staffIndex\n */\n private createDefaultClefInstruction(staffIndex: number): void {\n let first: SourceMeasure;\n if (this.musicSheet.SourceMeasures.length > 0) {\n first = this.musicSheet.SourceMeasures[0];\n } else {\n first = this.currentMeasure;\n }\n const clefInstruction: ClefInstruction = new ClefInstruction(ClefEnum.G, 0, 2);\n let firstStaffEntry: SourceStaffEntry;\n if (!first.FirstInstructionsStaffEntries[staffIndex]) {\n firstStaffEntry = new SourceStaffEntry(undefined, undefined);\n first.FirstInstructionsStaffEntries[staffIndex] = firstStaffEntry;\n } else {\n firstStaffEntry = first.FirstInstructionsStaffEntries[staffIndex];\n firstStaffEntry.removeFirstInstructionOfTypeClefInstruction();\n }\n clefInstruction.Parent = firstStaffEntry;\n firstStaffEntry.Instructions.splice(0, 0, clefInstruction);\n }\n\n /**\n * Create the default [[KeyInstruction]] in case no [[KeyInstruction]] is given in the whole [[Instrument]].\n */\n private createDefaultKeyInstruction(): void {\n let first: SourceMeasure;\n if (this.musicSheet.SourceMeasures.length > 0) {\n first = this.musicSheet.SourceMeasures[0];\n } else {\n first = this.currentMeasure;\n }\n const keyInstruction: KeyInstruction = new KeyInstruction(undefined, 0, KeyEnum.major);\n for (let j: number = this.inSourceMeasureInstrumentIndex; j < this.inSourceMeasureInstrumentIndex + this.instrument.Staves.length; j++) {\n if (!first.FirstInstructionsStaffEntries[j]) {\n const firstStaffEntry: SourceStaffEntry = new SourceStaffEntry(undefined, undefined);\n first.FirstInstructionsStaffEntries[j] = firstStaffEntry;\n keyInstruction.Parent = firstStaffEntry;\n firstStaffEntry.Instructions.push(keyInstruction);\n } else {\n const firstStaffEntry: SourceStaffEntry = first.FirstInstructionsStaffEntries[j];\n keyInstruction.Parent = firstStaffEntry;\n firstStaffEntry.removeFirstInstructionOfTypeKeyInstruction();\n if (firstStaffEntry.Instructions[0] instanceof ClefInstruction) {\n firstStaffEntry.Instructions.splice(1, 0, keyInstruction);\n } else {\n firstStaffEntry.Instructions.splice(0, 0, keyInstruction);\n }\n }\n }\n }\n\n /**\n * Check if the given attributesNode is at the begin of a XmlMeasure.\n * @param parentNode\n * @param attributesNode\n * @returns {boolean}\n */\n private isAttributesNodeAtBeginOfMeasure(parentNode: IXmlElement, attributesNode: IXmlElement): boolean {\n const children: IXmlElement[] = parentNode.elements();\n const attributesNodeIndex: number = children.indexOf(attributesNode); // FIXME | 0\n if (attributesNodeIndex > 0 && children[attributesNodeIndex - 1].name === \"backup\") {\n return true;\n }\n let firstNoteNodeIndex: number = -1;\n for (let i: number = 0; i < children.length; i++) {\n if (children[i].name === \"note\") {\n firstNoteNodeIndex = i;\n break;\n }\n }\n return (attributesNodeIndex < firstNoteNodeIndex && firstNoteNodeIndex > 0) || (firstNoteNodeIndex < 0);\n }\n\n /**\n * Check if the given attributesNode is at the end of a XmlMeasure.\n * @param parentNode\n * @param attributesNode\n * @returns {boolean}\n */\n private isAttributesNodeAtEndOfMeasure(parentNode: IXmlElement, attributesNode: IXmlElement): boolean {\n const childs: IXmlElement[] = parentNode.elements().slice(); // slice=arrayCopy\n let attributesNodeIndex: number = 0;\n for (let i: number = 0; i < childs.length; i++) {\n if (childs[i] === attributesNode) {\n attributesNodeIndex = i;\n break;\n }\n }\n let nextNoteNodeIndex: number = 0;\n for (let i: number = attributesNodeIndex; i < childs.length; i++) {\n if (childs[i].name === \"note\") {\n nextNoteNodeIndex = i;\n break;\n }\n }\n return attributesNodeIndex > nextNoteNodeIndex;\n }\n\n /**\n * Called only when no noteDuration is given in XML.\n * @param xmlNode\n * @returns {Fraction}\n */\n private getNoteDurationFromTypeNode(xmlNode: IXmlElement): Fraction {\n const typeNode: IXmlElement = xmlNode.element(\"type\");\n if (typeNode) {\n const type: string = typeNode.value;\n return this.currentVoiceGenerator.getNoteDurationFromType(type);\n }\n return new Fraction(0, 4 * this.divisions);\n }\n\n /**\n * Add (the three basic) Notation Instructions to a list\n * @param node\n * @param guitarPro\n */\n private addAbstractInstruction(node: IXmlElement, guitarPro: boolean): void {\n if (node.element(\"divisions\")) {\n if (node.elements().length === 1) {\n return;\n }\n }\n const transposeNode: IXmlElement = node.element(\"transpose\");\n if (transposeNode) {\n const chromaticNode: IXmlElement = transposeNode.element(\"chromatic\");\n if (chromaticNode) {\n this.instrument.PlaybackTranspose = parseInt(chromaticNode.value, 10);\n }\n }\n const clefList: IXmlElement[] = node.elements(\"clef\");\n let errorMsg: string;\n if (clefList.length > 0) {\n for (let idx: number = 0, len: number = clefList.length; idx < len; ++idx) {\n const nodeList: IXmlElement = clefList[idx];\n let clefEnum: ClefEnum = ClefEnum.G;\n let line: number = 2;\n let staffNumber: number = 1;\n let clefOctaveOffset: number = 0;\n const lineNode: IXmlElement = nodeList.element(\"line\");\n if (lineNode) {\n try {\n line = parseInt(lineNode.value, 10);\n } catch (ex) {\n errorMsg = ITextTranslation.translateText(\n \"ReaderErrorMessages/ClefLineError\",\n \"Invalid clef line given -> using default clef line.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n line = 2;\n log.debug(\"InstrumentReader.addAbstractInstruction\", errorMsg, ex);\n }\n\n }\n const signNode: IXmlElement = nodeList.element(\"sign\");\n if (signNode) {\n try {\n clefEnum = ClefEnum[signNode.value];\n if (!ClefInstruction.isSupportedClef(clefEnum)) {\n errorMsg = ITextTranslation.translateText(\n \"ReaderErrorMessages/ClefError\",\n \"Unsupported clef found -> using default clef.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n clefEnum = ClefEnum.G;\n line = 2;\n }\n if (clefEnum === ClefEnum.TAB) {\n clefOctaveOffset = -1;\n }\n } catch (e) {\n errorMsg = ITextTranslation.translateText(\n \"ReaderErrorMessages/ClefError\",\n \"Invalid clef found -> using default clef.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n clefEnum = ClefEnum.G;\n line = 2;\n log.debug(\"InstrumentReader.addAbstractInstruction\", errorMsg, e);\n }\n\n }\n const clefOctaveNode: IXmlElement = nodeList.element(\"clef-octave-change\");\n if (clefOctaveNode) {\n try {\n clefOctaveOffset = parseInt(clefOctaveNode.value, 10);\n } catch (e) {\n errorMsg = ITextTranslation.translateText(\n \"ReaderErrorMessages/ClefOctaveError\",\n \"Invalid clef octave found -> using default clef octave.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n clefOctaveOffset = 0;\n }\n\n }\n if (nodeList.hasAttributes && nodeList.attributes()[0].name === \"number\") {\n try {\n staffNumber = parseInt(nodeList.attributes()[0].value, 10);\n if (staffNumber > this.currentClefNumber) {\n staffNumber = this.currentClefNumber;\n }\n this.currentClefNumber = staffNumber + 1;\n } catch (err) {\n errorMsg = ITextTranslation.translateText(\n \"ReaderErrorMessages/ClefError\",\n \"Invalid clef found -> using default clef.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n staffNumber = 1;\n this.currentClefNumber = staffNumber + 1;\n }\n }\n\n const clefInstruction: ClefInstruction = new ClefInstruction(clefEnum, clefOctaveOffset, line);\n this.abstractInstructions.push([staffNumber, clefInstruction]);\n }\n }\n if (node.element(\"key\") !== undefined && this.instrument.MidiInstrumentId !== MidiInstrument.Percussion) {\n let key: number = 0;\n const keyNode: IXmlElement = node.element(\"key\").element(\"fifths\");\n if (keyNode) {\n try {\n key = parseInt(keyNode.value, 10);\n } catch (ex) {\n errorMsg = ITextTranslation.translateText(\n \"ReaderErrorMessages/KeyError\",\n \"Invalid key found -> set to default.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n key = 0;\n log.debug(\"InstrumentReader.addAbstractInstruction\", errorMsg, ex);\n }\n\n }\n let keyEnum: KeyEnum = KeyEnum.none;\n let modeNode: IXmlElement = node.element(\"key\");\n if (modeNode) {\n modeNode = modeNode.element(\"mode\");\n }\n if (modeNode) {\n try {\n keyEnum = KeyEnum[modeNode.value];\n } catch (ex) {\n errorMsg = ITextTranslation.translateText(\n \"ReaderErrorMessages/KeyError\",\n \"Invalid key found -> set to default.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n keyEnum = KeyEnum.major;\n log.debug(\"InstrumentReader.addAbstractInstruction\", errorMsg, ex);\n }\n }\n const keyInstruction: KeyInstruction = new KeyInstruction(undefined, key, keyEnum);\n this.abstractInstructions.push([1, keyInstruction]);\n }\n if (node.element(\"time\")) {\n const timeNode: IXmlElement = node.element(\"time\");\n let symbolEnum: RhythmSymbolEnum = RhythmSymbolEnum.NONE;\n let timePrintObject: boolean = true;\n if (timeNode !== undefined && timeNode.hasAttributes) {\n const symbolAttribute: IXmlAttribute = timeNode.attribute(\"symbol\");\n if (symbolAttribute) {\n if (symbolAttribute.value === \"common\") {\n symbolEnum = RhythmSymbolEnum.COMMON;\n } else if (symbolAttribute.value === \"cut\") {\n symbolEnum = RhythmSymbolEnum.CUT;\n }\n }\n\n const printObjectAttribute: IXmlAttribute = timeNode.attribute(\"print-object\");\n if (printObjectAttribute) {\n if (printObjectAttribute.value === \"no\") {\n timePrintObject = false;\n }\n }\n }\n\n let num: number = 0;\n let denom: number = 0;\n const senzaMisura: boolean = (timeNode && timeNode.element(\"senza-misura\") !== undefined);\n const timeList: IXmlElement[] = node.elements(\"time\");\n const beatsList: IXmlElement[] = [];\n const typeList: IXmlElement[] = [];\n for (let idx: number = 0, len: number = timeList.length; idx < len; ++idx) {\n const xmlNode: IXmlElement = timeList[idx];\n beatsList.push.apply(beatsList, xmlNode.elements(\"beats\"));\n typeList.push.apply(typeList, xmlNode.elements(\"beat-type\"));\n }\n if (!senzaMisura) {\n try {\n if (beatsList !== undefined && beatsList.length > 0 && typeList !== undefined && beatsList.length === typeList.length) {\n const length: number = beatsList.length;\n const fractions: Fraction[] = new Array(length);\n let maxDenom: number = 0;\n for (let i: number = 0; i < length; i++) {\n const s: string = beatsList[i].value;\n let n: number = 0;\n let d: number = 0;\n if (s.indexOf(\"+\") !== -1) {\n const numbers: string[] = s.split(\"+\");\n for (let idx: number = 0, len: number = numbers.length; idx < len; ++idx) {\n n += parseInt(numbers[idx], 10);\n }\n } else {\n n = parseInt(s, 10);\n }\n d = parseInt(typeList[i].value, 10);\n maxDenom = Math.max(maxDenom, d);\n fractions[i] = new Fraction(n, d, 0, false);\n }\n for (let i: number = 0; i < length; i++) {\n if (fractions[i].Denominator === maxDenom) {\n num += fractions[i].Numerator;\n } else {\n num += (maxDenom / fractions[i].Denominator) * fractions[i].Numerator;\n }\n }\n denom = maxDenom;\n } else {\n num = parseInt(node.element(\"time\").element(\"beats\").value, 10);\n denom = parseInt(node.element(\"time\").element(\"beat-type\").value, 10);\n }\n } catch (ex) {\n errorMsg = ITextTranslation.translateText(\"ReaderErrorMessages/RhythmError\", \"Invalid rhythm found -> set to default.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n num = 4;\n denom = 4;\n log.debug(\"InstrumentReader.addAbstractInstruction\", errorMsg, ex);\n }\n\n const newRhythmInstruction: RhythmInstruction = new RhythmInstruction(\n new Fraction(num, denom, 0, false), symbolEnum\n );\n newRhythmInstruction.PrintObject = timePrintObject;\n this.abstractInstructions.push([1, newRhythmInstruction]);\n } else {\n this.abstractInstructions.push([1, new RhythmInstruction(new Fraction(4, 4, 0, false), RhythmSymbolEnum.NONE)]);\n }\n }\n }\n\n /**\n * Save the current AbstractInstructions to the corresponding [[StaffEntry]]s.\n * @param numberOfStaves\n * @param beginOfMeasure\n */\n private saveAbstractInstructionList(numberOfStaves: number, beginOfMeasure: boolean): void {\n for (let i: number = this.abstractInstructions.length - 1; i >= 0; i--) {\n const pair: [number, AbstractNotationInstruction] = this.abstractInstructions[i];\n const key: number = pair[0];\n const value: AbstractNotationInstruction = pair[1];\n if (value instanceof ClefInstruction) {\n const clefInstruction: ClefInstruction = value;\n if (this.currentXmlMeasureIndex === 0 || (key <= this.activeClefs.length && clefInstruction !== this.activeClefs[key - 1])) {\n if (!beginOfMeasure && this.currentStaffEntry !== undefined && !this.currentStaffEntry.hasNotes() && key - 1\n === this.instrument.Staves.indexOf(this.currentStaffEntry.ParentStaff)) {\n const newClefInstruction: ClefInstruction = clefInstruction;\n newClefInstruction.Parent = this.currentStaffEntry;\n this.currentStaffEntry.removeFirstInstructionOfTypeClefInstruction();\n this.currentStaffEntry.Instructions.push(newClefInstruction);\n this.activeClefs[key - 1] = clefInstruction;\n this.abstractInstructions.splice(i, 1);\n } else if (beginOfMeasure) {\n let firstStaffEntry: SourceStaffEntry;\n if (this.currentMeasure) {\n const newClefInstruction: ClefInstruction = clefInstruction;\n const sseIndex: number = this.inSourceMeasureInstrumentIndex + key - 1;\n const firstSse: SourceStaffEntry = this.currentMeasure.FirstInstructionsStaffEntries[sseIndex];\n if (this.currentXmlMeasureIndex === 0) {\n if (!firstSse) {\n firstStaffEntry = new SourceStaffEntry(undefined, undefined);\n this.currentMeasure.FirstInstructionsStaffEntries[sseIndex] = firstStaffEntry;\n newClefInstruction.Parent = firstStaffEntry;\n firstStaffEntry.Instructions.push(newClefInstruction);\n this.activeClefsHaveBeenInitialized[key - 1] = true;\n } else if (this.currentMeasure.FirstInstructionsStaffEntries[sseIndex]\n !==\n undefined && !(firstSse.Instructions[0] instanceof ClefInstruction)) {\n firstStaffEntry = firstSse;\n newClefInstruction.Parent = firstStaffEntry;\n firstStaffEntry.removeFirstInstructionOfTypeClefInstruction();\n firstStaffEntry.Instructions.splice(0, 0, newClefInstruction);\n this.activeClefsHaveBeenInitialized[key - 1] = true;\n } else {\n const lastStaffEntry: SourceStaffEntry = new SourceStaffEntry(undefined, undefined);\n this.currentMeasure.LastInstructionsStaffEntries[sseIndex] = lastStaffEntry;\n newClefInstruction.Parent = lastStaffEntry;\n lastStaffEntry.Instructions.push(newClefInstruction);\n }\n } else if (!this.activeClefsHaveBeenInitialized[key - 1]) {\n const first: SourceMeasure = this.musicSheet.SourceMeasures[0];\n if (!first.FirstInstructionsStaffEntries[sseIndex]) {\n firstStaffEntry = new SourceStaffEntry(undefined, undefined);\n } else {\n firstStaffEntry = first.FirstInstructionsStaffEntries[sseIndex];\n firstStaffEntry.removeFirstInstructionOfTypeClefInstruction();\n }\n newClefInstruction.Parent = firstStaffEntry;\n firstStaffEntry.Instructions.splice(0, 0, newClefInstruction);\n this.activeClefsHaveBeenInitialized[key - 1] = true;\n } else {\n const lastStaffEntry: SourceStaffEntry = new SourceStaffEntry(undefined, undefined);\n this.previousMeasure.LastInstructionsStaffEntries[sseIndex] = lastStaffEntry;\n newClefInstruction.Parent = lastStaffEntry;\n lastStaffEntry.Instructions.push(newClefInstruction);\n }\n this.activeClefs[key - 1] = clefInstruction;\n this.abstractInstructions.splice(i, 1);\n }\n }\n } else if (key <= this.activeClefs.length && clefInstruction === this.activeClefs[key - 1]) {\n this.abstractInstructions.splice(i, 1);\n }\n }\n if (value instanceof KeyInstruction) {\n const keyInstruction: KeyInstruction = value;\n if (!this.activeKey || this.activeKey.Key !== keyInstruction.Key) {\n this.activeKey = keyInstruction;\n this.abstractInstructions.splice(i, 1);\n let sourceMeasure: SourceMeasure;\n if (!this.activeKeyHasBeenInitialized) {\n this.activeKeyHasBeenInitialized = true;\n if (this.currentXmlMeasureIndex > 0) {\n sourceMeasure = this.musicSheet.SourceMeasures[0];\n } else {\n sourceMeasure = this.currentMeasure;\n }\n } else {\n sourceMeasure = this.currentMeasure;\n }\n if (sourceMeasure) {\n for (let j: number = this.inSourceMeasureInstrumentIndex; j < this.inSourceMeasureInstrumentIndex + numberOfStaves; j++) {\n const newKeyInstruction: KeyInstruction = keyInstruction;\n if (!sourceMeasure.FirstInstructionsStaffEntries[j]) {\n const firstStaffEntry: SourceStaffEntry = new SourceStaffEntry(undefined, undefined);\n sourceMeasure.FirstInstructionsStaffEntries[j] = firstStaffEntry;\n newKeyInstruction.Parent = firstStaffEntry;\n firstStaffEntry.Instructions.push(newKeyInstruction);\n } else {\n const firstStaffEntry: SourceStaffEntry = sourceMeasure.FirstInstructionsStaffEntries[j];\n newKeyInstruction.Parent = firstStaffEntry;\n firstStaffEntry.removeFirstInstructionOfTypeKeyInstruction();\n if (firstStaffEntry.Instructions.length === 0) {\n firstStaffEntry.Instructions.push(newKeyInstruction);\n } else {\n if (firstStaffEntry.Instructions[0] instanceof ClefInstruction) {\n firstStaffEntry.Instructions.splice(1, 0, newKeyInstruction);\n } else {\n firstStaffEntry.Instructions.splice(0, 0, newKeyInstruction);\n }\n }\n }\n }\n }\n } else {\n this.abstractInstructions.splice(i, 1);\n }\n }\n if (value instanceof RhythmInstruction) {\n const rhythmInstruction: RhythmInstruction = value;\n if (!this.activeRhythm || this.activeRhythm !== rhythmInstruction) {\n this.activeRhythm = rhythmInstruction;\n this.abstractInstructions.splice(i, 1);\n if (this.currentMeasure) {\n for (let j: number = this.inSourceMeasureInstrumentIndex; j < this.inSourceMeasureInstrumentIndex + numberOfStaves; j++) {\n const newRhythmInstruction: RhythmInstruction = rhythmInstruction;\n let firstStaffEntry: SourceStaffEntry;\n if (!this.currentMeasure.FirstInstructionsStaffEntries[j]) {\n firstStaffEntry = new SourceStaffEntry(undefined, undefined);\n this.currentMeasure.FirstInstructionsStaffEntries[j] = firstStaffEntry;\n } else {\n firstStaffEntry = this.currentMeasure.FirstInstructionsStaffEntries[j];\n firstStaffEntry.removeFirstInstructionOfTypeRhythmInstruction();\n }\n newRhythmInstruction.Parent = firstStaffEntry;\n firstStaffEntry.Instructions.push(newRhythmInstruction);\n }\n }\n } else {\n this.abstractInstructions.splice(i, 1);\n }\n }\n }\n }\n\n /**\n * Save any ClefInstruction given - exceptionally - at the end of the currentMeasure.\n */\n private saveClefInstructionAtEndOfMeasure(): void {\n for (let i: number = this.abstractInstructions.length - 1; i >= 0; i--) {\n const key: number = this.abstractInstructions[i][0];\n const value: AbstractNotationInstruction = this.abstractInstructions[i][1];\n if (value instanceof ClefInstruction) {\n const clefInstruction: ClefInstruction = value;\n if (\n (!this.activeClefs[key - 1]) ||\n (clefInstruction.ClefType !== this.activeClefs[key - 1].ClefType || (\n clefInstruction.ClefType === this.activeClefs[key - 1].ClefType &&\n clefInstruction.Line !== this.activeClefs[key - 1].Line\n ))) {\n const lastStaffEntry: SourceStaffEntry = new SourceStaffEntry(undefined, undefined);\n this.currentMeasure.LastInstructionsStaffEntries[this.inSourceMeasureInstrumentIndex + key - 1] = lastStaffEntry;\n const newClefInstruction: ClefInstruction = clefInstruction;\n newClefInstruction.Parent = lastStaffEntry;\n lastStaffEntry.Instructions.push(newClefInstruction);\n this.activeClefs[key - 1] = clefInstruction;\n this.abstractInstructions.splice(i, 1);\n }\n }\n }\n }\n\n /**\n * In case of a [[Tuplet]], read NoteDuration from type.\n * @param xmlNode\n * @returns {Fraction}\n */\n private getNoteDurationForTuplet(xmlNode: IXmlElement): Fraction {\n let duration: Fraction = new Fraction(0, 1);\n const typeDuration: Fraction = this.getNoteDurationFromTypeNode(xmlNode);\n if (xmlNode.element(\"time-modification\")) {\n const time: IXmlElement = xmlNode.element(\"time-modification\");\n if (time) {\n if (time.element(\"actual-notes\") !== undefined && time.element(\"normal-notes\")) {\n const actualNotes: IXmlElement = time.element(\"actual-notes\");\n const normalNotes: IXmlElement = time.element(\"normal-notes\");\n if (actualNotes !== undefined && normalNotes) {\n const actual: number = parseInt(actualNotes.value, 10);\n const normal: number = parseInt(normalNotes.value, 10);\n duration = new Fraction(normal * typeDuration.Numerator, actual * typeDuration.Denominator);\n }\n }\n }\n }\n return duration;\n }\n\n private readExpressionStaffNumber(xmlNode: IXmlElement): number {\n let directionStaffNumber: number = 1;\n if (xmlNode.element(\"staff\")) {\n const staffNode: IXmlElement = xmlNode.element(\"staff\");\n if (staffNode) {\n try {\n directionStaffNumber = parseInt(staffNode.value, 10);\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/ExpressionStaffError\", \"Invalid Expression staff number -> set to default.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n directionStaffNumber = 1;\n log.debug(\"InstrumentReader.readExpressionStaffNumber\", errorMsg, ex);\n }\n\n }\n }\n return directionStaffNumber;\n }\n\n /**\n * Calculate the divisions value from the type and duration of the first MeasureNote that makes sense\n * (meaning itself hasn't any errors and it doesn't belong to a [[Tuplet]]).\n *\n * If all the MeasureNotes belong to a [[Tuplet]], then we read the next XmlMeasure (and so on...).\n * If we have reached the end of the [[Instrument]] and still the divisions aren't set, we throw an exception\n * @returns {number}\n */\n private readDivisionsFromNotes(): number {\n let divisionsFromNote: number = 0;\n let xmlMeasureIndex: number = this.currentXmlMeasureIndex;\n let read: boolean = false;\n while (!read) {\n const xmlMeasureListArr: IXmlElement[] = this.xmlMeasureList[xmlMeasureIndex].elements();\n for (let idx: number = 0, len: number = xmlMeasureListArr.length; idx < len; ++idx) {\n const xmlNode: IXmlElement = xmlMeasureListArr[idx];\n if (xmlNode.name === \"note\" && !xmlNode.element(\"time-modification\")) {\n const durationNode: IXmlElement = xmlNode.element(\"duration\");\n const typeNode: IXmlElement = xmlNode.element(\"type\");\n if (durationNode !== undefined && typeNode) {\n const type: string = typeNode.value;\n let noteDuration: number = 0;\n try {\n noteDuration = parseInt(durationNode.value, 10);\n } catch (ex) {\n log.debug(\"InstrumentReader.readDivisionsFromNotes\", ex);\n continue;\n }\n\n switch (type) {\n case \"1024th\":\n divisionsFromNote = (noteDuration / 4) * 1024;\n break;\n case \"512th\":\n divisionsFromNote = (noteDuration / 4) * 512;\n break;\n case \"256th\":\n divisionsFromNote = (noteDuration / 4) * 256;\n break;\n case \"128th\":\n divisionsFromNote = (noteDuration / 4) * 128;\n break;\n case \"64th\":\n divisionsFromNote = (noteDuration / 4) * 64;\n break;\n case \"32nd\":\n divisionsFromNote = (noteDuration / 4) * 32;\n break;\n case \"16th\":\n divisionsFromNote = (noteDuration / 4) * 16;\n break;\n case \"eighth\":\n divisionsFromNote = (noteDuration / 4) * 8;\n break;\n case \"quarter\":\n divisionsFromNote = (noteDuration / 4) * 4;\n break;\n case \"half\":\n divisionsFromNote = (noteDuration / 4) * 2;\n break;\n case \"whole\":\n divisionsFromNote = (noteDuration / 4);\n break;\n case \"breve\":\n divisionsFromNote = (noteDuration / 4) / 2;\n break;\n case \"long\":\n divisionsFromNote = (noteDuration / 4) / 4;\n break;\n case \"maxima\":\n divisionsFromNote = (noteDuration / 4) / 8;\n break;\n default:\n break;\n }\n }\n }\n if (divisionsFromNote > 0) {\n read = true;\n break;\n }\n }\n if (divisionsFromNote === 0) {\n xmlMeasureIndex++;\n if (xmlMeasureIndex === this.xmlMeasureList.length) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMEssages/DivisionsError\", \"Invalid divisions value at Instrument: \");\n throw new MusicSheetReadingException(errorMsg + this.instrument.Name);\n }\n }\n }\n return divisionsFromNote;\n }\n}\n","import { Instrument } from \"../Instrument\";\nimport { LinkedVoice } from \"../VoiceData/LinkedVoice\";\nimport { Voice } from \"../VoiceData/Voice\";\nimport { MusicSheet } from \"../MusicSheet\";\nimport { VoiceEntry, StemDirectionType } from \"../VoiceData/VoiceEntry\";\nimport { Note } from \"../VoiceData/Note\";\nimport { SourceMeasure } from \"../VoiceData/SourceMeasure\";\nimport { SourceStaffEntry } from \"../VoiceData/SourceStaffEntry\";\nimport { Beam } from \"../VoiceData/Beam\";\nimport { Tie } from \"../VoiceData/Tie\";\nimport { Tuplet } from \"../VoiceData/Tuplet\";\nimport { Fraction } from \"../../Common/DataObjects/Fraction\";\nimport { IXmlElement } from \"../../Common/FileIO/Xml\";\nimport { ITextTranslation } from \"../Interfaces/ITextTranslation\";\nimport { LyricsReader } from \"../ScoreIO/MusicSymbolModules/LyricsReader\";\nimport { MusicSheetReadingException } from \"../Exceptions\";\nimport { AccidentalEnum } from \"../../Common/DataObjects/Pitch\";\nimport { NoteEnum } from \"../../Common/DataObjects/Pitch\";\nimport { Staff } from \"../VoiceData/Staff\";\nimport { StaffEntryLink } from \"../VoiceData/StaffEntryLink\";\nimport { VerticalSourceStaffEntryContainer } from \"../VoiceData/VerticalSourceStaffEntryContainer\";\nimport log from \"loglevel\";\nimport { Pitch } from \"../../Common/DataObjects/Pitch\";\nimport { IXmlAttribute } from \"../../Common/FileIO/Xml\";\nimport { CollectionUtil } from \"../../Util/CollectionUtil\";\nimport { ArticulationReader } from \"./MusicSymbolModules/ArticulationReader\";\nimport { SlurReader } from \"./MusicSymbolModules/SlurReader\";\nimport { Notehead } from \"../VoiceData/Notehead\";\nimport { Arpeggio, ArpeggioType } from \"../VoiceData/Arpeggio\";\nimport { NoteType } from \"../VoiceData/NoteType\";\nimport { TabNote } from \"../VoiceData/TabNote\";\n\nexport class VoiceGenerator {\n constructor(instrument: Instrument, voiceId: number, slurReader: SlurReader, mainVoice: Voice = undefined) {\n this.musicSheet = instrument.GetMusicSheet;\n this.slurReader = slurReader;\n if (mainVoice) {\n this.voice = new LinkedVoice(instrument, voiceId, mainVoice);\n } else {\n this.voice = new Voice(instrument, voiceId);\n }\n instrument.Voices.push(this.voice);\n this.lyricsReader = new LyricsReader(this.musicSheet);\n this.articulationReader = new ArticulationReader();\n }\n\n private slurReader: SlurReader;\n private lyricsReader: LyricsReader;\n private articulationReader: ArticulationReader;\n private musicSheet: MusicSheet;\n private voice: Voice;\n private currentVoiceEntry: VoiceEntry;\n private currentNote: Note;\n private currentMeasure: SourceMeasure;\n private currentStaffEntry: SourceStaffEntry;\n private lastBeamTag: string = \"\";\n private openBeam: Beam;\n private openTieDict: { [_: number]: Tie; } = {};\n private currentOctaveShift: number = 0;\n private tupletDict: { [_: number]: Tuplet; } = {};\n private openTupletNumber: number = 0;\n\n public get GetVoice(): Voice {\n return this.voice;\n }\n\n public get OctaveShift(): number {\n return this.currentOctaveShift;\n }\n\n public set OctaveShift(value: number) {\n this.currentOctaveShift = value;\n }\n\n /**\n * Create new [[VoiceEntry]], add it to given [[SourceStaffEntry]] and if given so, to [[Voice]].\n * @param musicTimestamp\n * @param parentStaffEntry\n * @param addToVoice\n * @param isGrace States whether the new VoiceEntry (only) has grace notes\n */\n public createVoiceEntry(musicTimestamp: Fraction, parentStaffEntry: SourceStaffEntry, addToVoice: boolean,\n isGrace: boolean = false, graceNoteSlash: boolean = false, graceSlur: boolean = false): void {\n this.currentVoiceEntry = new VoiceEntry(musicTimestamp.clone(), this.voice, parentStaffEntry, isGrace, graceNoteSlash, graceSlur);\n if (addToVoice) {\n this.voice.VoiceEntries.push(this.currentVoiceEntry);\n }\n if (parentStaffEntry.VoiceEntries.indexOf(this.currentVoiceEntry) === -1) {\n parentStaffEntry.VoiceEntries.push(this.currentVoiceEntry);\n }\n }\n\n /**\n * Create [[Note]]s and handle Lyrics, Articulations, Beams, Ties, Slurs, Tuplets.\n * @param noteNode\n * @param noteDuration\n * @param divisions\n * @param restNote\n * @param parentStaffEntry\n * @param parentMeasure\n * @param measureStartAbsoluteTimestamp\n * @param maxTieNoteFraction\n * @param chord\n * @param guitarPro\n * @param printObject whether the note should be rendered (true) or invisible (false)\n * @returns {Note}\n */\n public read(noteNode: IXmlElement, noteDuration: Fraction, typeDuration: Fraction, noteTypeXml: NoteType, normalNotes: number, restNote: boolean,\n parentStaffEntry: SourceStaffEntry, parentMeasure: SourceMeasure,\n measureStartAbsoluteTimestamp: Fraction, maxTieNoteFraction: Fraction, chord: boolean, guitarPro: boolean,\n printObject: boolean, isCueNote: boolean, stemDirectionXml: StemDirectionType, tremoloStrokes: number,\n stemColorXml: string, noteheadColorXml: string): Note {\n this.currentStaffEntry = parentStaffEntry;\n this.currentMeasure = parentMeasure;\n //log.debug(\"read called:\", restNote);\n try {\n this.currentNote = restNote\n ? this.addRestNote(noteDuration, noteTypeXml, printObject, isCueNote, noteheadColorXml)\n : this.addSingleNote(noteNode, noteDuration, noteTypeXml, typeDuration, normalNotes, chord, guitarPro,\n printObject, isCueNote, stemDirectionXml, tremoloStrokes, stemColorXml, noteheadColorXml);\n // read lyrics\n const lyricElements: IXmlElement[] = noteNode.elements(\"lyric\");\n if (this.lyricsReader !== undefined && lyricElements) {\n this.lyricsReader.addLyricEntry(lyricElements, this.currentVoiceEntry);\n this.voice.Parent.HasLyrics = true;\n }\n let hasTupletCommand: boolean = false;\n const notationNode: IXmlElement = noteNode.element(\"notations\");\n if (notationNode) {\n // read articulations\n if (this.articulationReader) {\n this.readArticulations(notationNode, this.currentVoiceEntry);\n }\n // read slurs\n const slurElements: IXmlElement[] = notationNode.elements(\"slur\");\n if (this.slurReader !== undefined &&\n slurElements.length > 0 &&\n !this.currentNote.ParentVoiceEntry.IsGrace) {\n this.slurReader.addSlur(slurElements, this.currentNote);\n }\n // read Tuplets\n const tupletElements: IXmlElement[] = notationNode.elements(\"tuplet\");\n if (tupletElements.length > 0) {\n this.openTupletNumber = this.addTuplet(noteNode, tupletElements);\n hasTupletCommand = true;\n }\n // check for Arpeggios\n const arpeggioNode: IXmlElement = notationNode.element(\"arpeggiate\");\n if (arpeggioNode !== undefined && !this.currentVoiceEntry.IsGrace) {\n let currentArpeggio: Arpeggio;\n if (this.currentVoiceEntry.Arpeggio) { // add note to existing Arpeggio\n currentArpeggio = this.currentVoiceEntry.Arpeggio;\n } else { // create new Arpeggio\n let arpeggioAlreadyExists: boolean = false;\n for (const voiceEntry of this.currentStaffEntry.VoiceEntries) {\n if (voiceEntry.Arpeggio) {\n arpeggioAlreadyExists = true;\n currentArpeggio = voiceEntry.Arpeggio;\n // TODO handle multiple arpeggios across multiple voices at same timestamp\n\n // this.currentVoiceEntry.Arpeggio = currentArpeggio; // register the arpeggio in the current voice entry as well?\n // but then we duplicate information, and may have to take care not to render it multiple times\n\n // we already have an arpeggio in another voice, at the current timestamp. add the notes there.\n break;\n }\n }\n if (!arpeggioAlreadyExists) {\n let arpeggioType: ArpeggioType = ArpeggioType.ARPEGGIO_DIRECTIONLESS;\n const directionAttr: Attr = arpeggioNode.attribute(\"direction\");\n if (directionAttr !== null) {\n switch (directionAttr.value) {\n case \"up\":\n arpeggioType = ArpeggioType.ROLL_UP;\n break;\n case \"down\":\n arpeggioType = ArpeggioType.ROLL_DOWN;\n break;\n default:\n arpeggioType = ArpeggioType.ARPEGGIO_DIRECTIONLESS;\n }\n }\n\n currentArpeggio = new Arpeggio(this.currentVoiceEntry, arpeggioType);\n this.currentVoiceEntry.Arpeggio = currentArpeggio;\n }\n }\n currentArpeggio.addNote(this.currentNote);\n }\n // check for Ties - must be the last check\n const tiedNodeList: IXmlElement[] = notationNode.elements(\"tied\");\n if (tiedNodeList.length > 0) {\n this.addTie(tiedNodeList, measureStartAbsoluteTimestamp, maxTieNoteFraction);\n }\n\n // remove open ties, if there is already a gap between the last tie note and now.\n const openTieDict: { [_: number]: Tie; } = this.openTieDict;\n for (const key in openTieDict) {\n if (openTieDict.hasOwnProperty(key)) {\n const tie: Tie = openTieDict[key];\n if (Fraction.plus(tie.StartNote.ParentStaffEntry.Timestamp, tie.Duration).lt(this.currentStaffEntry.Timestamp)) {\n delete openTieDict[key];\n }\n }\n }\n }\n // time-modification yields tuplet in currentNote\n // mustn't execute method, if this is the Note where the Tuplet has been created\n if (noteNode.element(\"time-modification\") !== undefined && !hasTupletCommand) {\n this.handleTimeModificationNode(noteNode);\n }\n } catch (err) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/NoteError\", \"Ignored erroneous Note.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n }\n\n return this.currentNote;\n }\n\n /**\n * Create a new [[StaffEntryLink]] and sets the currenstStaffEntry accordingly.\n * @param index\n * @param currentStaff\n * @param currentStaffEntry\n * @param currentMeasure\n * @returns {SourceStaffEntry}\n */\n public checkForStaffEntryLink(index: number, currentStaff: Staff, currentStaffEntry: SourceStaffEntry, currentMeasure: SourceMeasure): SourceStaffEntry {\n const staffEntryLink: StaffEntryLink = new StaffEntryLink(this.currentVoiceEntry);\n staffEntryLink.LinkStaffEntries.push(currentStaffEntry);\n currentStaffEntry.Link = staffEntryLink;\n const linkMusicTimestamp: Fraction = this.currentVoiceEntry.Timestamp.clone();\n const verticalSourceStaffEntryContainer: VerticalSourceStaffEntryContainer = currentMeasure.getVerticalContainerByTimestamp(linkMusicTimestamp);\n currentStaffEntry = verticalSourceStaffEntryContainer.StaffEntries[index];\n if (!currentStaffEntry) {\n currentStaffEntry = new SourceStaffEntry(verticalSourceStaffEntryContainer, currentStaff);\n verticalSourceStaffEntryContainer.StaffEntries[index] = currentStaffEntry;\n }\n currentStaffEntry.VoiceEntries.push(this.currentVoiceEntry);\n staffEntryLink.LinkStaffEntries.push(currentStaffEntry);\n currentStaffEntry.Link = staffEntryLink;\n return currentStaffEntry;\n }\n\n public checkForOpenBeam(): void {\n if (this.openBeam !== undefined && this.currentNote) {\n this.handleOpenBeam();\n }\n }\n\n public checkOpenTies(): void {\n const openTieDict: { [key: number]: Tie } = this.openTieDict;\n for (const key in openTieDict) {\n if (openTieDict.hasOwnProperty(key)) {\n const tie: Tie = openTieDict[key];\n if (Fraction.plus(tie.StartNote.ParentStaffEntry.Timestamp, tie.Duration)\n .lt(tie.StartNote.ParentStaffEntry.VerticalContainerParent.ParentMeasure.Duration)) {\n delete openTieDict[key];\n }\n }\n }\n }\n\n public hasVoiceEntry(): boolean {\n return this.currentVoiceEntry !== undefined;\n }\n\n /**\n *\n * @param type\n * @returns {Fraction} - a Note's Duration from a given type (type must be valid).\n */\n public getNoteDurationFromType(type: string): Fraction {\n switch (type) {\n case \"1024th\":\n return new Fraction(1, 1024);\n case \"512th\":\n return new Fraction(1, 512);\n case \"256th\":\n return new Fraction(1, 256);\n case \"128th\":\n return new Fraction(1, 128);\n case \"64th\":\n return new Fraction(1, 64);\n case \"32th\":\n case \"32nd\":\n return new Fraction(1, 32);\n case \"16th\":\n return new Fraction(1, 16);\n case \"eighth\":\n return new Fraction(1, 8);\n case \"quarter\":\n return new Fraction(1, 4);\n case \"half\":\n return new Fraction(1, 2);\n case \"whole\":\n return new Fraction(1, 1);\n case \"breve\":\n return new Fraction(2, 1);\n case \"long\":\n return new Fraction(4, 1);\n case \"maxima\":\n return new Fraction(8, 1);\n default: {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/NoteDurationError\", \"Invalid note duration.\"\n );\n throw new MusicSheetReadingException(errorMsg);\n }\n }\n }\n\n private readArticulations(notationNode: IXmlElement, currentVoiceEntry: VoiceEntry): void {\n const articNode: IXmlElement = notationNode.element(\"articulations\");\n if (articNode) {\n this.articulationReader.addArticulationExpression(articNode, currentVoiceEntry);\n }\n const fermaNode: IXmlElement = notationNode.element(\"fermata\");\n if (fermaNode) {\n this.articulationReader.addFermata(fermaNode, currentVoiceEntry);\n }\n const tecNode: IXmlElement = notationNode.element(\"technical\");\n if (tecNode) {\n this.articulationReader.addTechnicalArticulations(tecNode, currentVoiceEntry);\n }\n const ornaNode: IXmlElement = notationNode.element(\"ornaments\");\n if (ornaNode) {\n this.articulationReader.addOrnament(ornaNode, currentVoiceEntry);\n // const tremoloNode: IXmlElement = ornaNode.element(\"tremolo\");\n // tremolo should be and is added per note, not per VoiceEntry. see addSingleNote()\n }\n\n }\n\n /**\n * Create a new [[Note]] and adds it to the currentVoiceEntry\n * @param node\n * @param noteDuration\n * @param divisions\n * @param chord\n * @param guitarPro\n * @returns {Note}\n */\n private addSingleNote(node: IXmlElement, noteDuration: Fraction, noteTypeXml: NoteType, typeDuration: Fraction,\n normalNotes: number, chord: boolean, guitarPro: boolean,\n printObject: boolean, isCueNote: boolean, stemDirectionXml: StemDirectionType, tremoloStrokes: number,\n stemColorXml: string, noteheadColorXml: string): Note {\n //log.debug(\"addSingleNote called\");\n let noteAlter: number = 0;\n let noteAccidental: AccidentalEnum = AccidentalEnum.NONE;\n let noteStep: NoteEnum = NoteEnum.C;\n let noteOctave: number = 0;\n let playbackInstrumentId: string = undefined;\n let noteheadShapeXml: string = undefined;\n let noteheadFilledXml: boolean = undefined; // if undefined, the final filled parameter will be calculated from duration\n\n const xmlnodeElementsArr: IXmlElement[] = node.elements();\n for (let idx: number = 0, len: number = xmlnodeElementsArr.length; idx < len; ++idx) {\n const noteElement: IXmlElement = xmlnodeElementsArr[idx];\n try {\n if (noteElement.name === \"pitch\") {\n const noteElementsArr: IXmlElement[] = noteElement.elements();\n for (let idx2: number = 0, len2: number = noteElementsArr.length; idx2 < len2; ++idx2) {\n const pitchElement: IXmlElement = noteElementsArr[idx2];\n noteheadShapeXml = undefined; // reinitialize for each pitch\n noteheadFilledXml = undefined;\n try {\n if (pitchElement.name === \"step\") {\n noteStep = NoteEnum[pitchElement.value];\n if (noteStep === undefined) { // don't replace undefined check\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/NotePitchError\",\n \"Invalid pitch while reading note.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw new MusicSheetReadingException(errorMsg, undefined);\n }\n } else if (pitchElement.name === \"alter\") {\n noteAlter = parseFloat(pitchElement.value);\n if (isNaN(noteAlter)) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/NoteAlterationError\", \"Invalid alteration while reading note.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw new MusicSheetReadingException(errorMsg, undefined);\n }\n noteAccidental = Pitch.AccidentalFromHalfTones(noteAlter); // potentially overwritten by \"accidental\" noteElement\n } else if (pitchElement.name === \"octave\") {\n noteOctave = parseInt(pitchElement.value, 10);\n if (isNaN(noteOctave)) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/NoteOctaveError\", \"Invalid octave value while reading note.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw new MusicSheetReadingException(errorMsg, undefined);\n }\n }\n } catch (ex) {\n log.info(\"VoiceGenerator.addSingleNote read Step: \", ex.message);\n }\n\n }\n } else if (noteElement.name === \"accidental\") {\n const accidentalValue: string = noteElement.value;\n if (accidentalValue === \"natural\") {\n noteAccidental = AccidentalEnum.NATURAL;\n }\n } else if (noteElement.name === \"unpitched\") {\n const displayStep: IXmlElement = noteElement.element(\"display-step\");\n if (displayStep) {\n noteStep = NoteEnum[displayStep.value.toUpperCase()];\n }\n const octave: IXmlElement = noteElement.element(\"display-octave\");\n if (octave) {\n noteOctave = parseInt(octave.value, 10);\n if (guitarPro) {\n noteOctave += 1;\n }\n }\n } else if (noteElement.name === \"instrument\") {\n if (noteElement.firstAttribute) {\n playbackInstrumentId = noteElement.firstAttribute.value;\n }\n } else if (noteElement.name === \"notehead\") {\n noteheadShapeXml = noteElement.value;\n if (noteElement.attribute(\"filled\") !== null) {\n noteheadFilledXml = noteElement.attribute(\"filled\").value === \"yes\";\n }\n }\n } catch (ex) {\n log.info(\"VoiceGenerator.addSingleNote: \", ex);\n }\n }\n\n noteOctave -= Pitch.OctaveXmlDifference;\n const pitch: Pitch = new Pitch(noteStep, noteOctave, noteAccidental);\n const noteLength: Fraction = Fraction.createFromFraction(noteDuration);\n let note: Note = undefined;\n let stringNumber: number = -1;\n let fretNumber: number = -1;\n // check for guitar tabs:\n const notationNode: IXmlElement = node.element(\"notations\");\n if (notationNode) {\n const technicalNode: IXmlElement = notationNode.element(\"technical\");\n if (technicalNode) {\n const stringNode: IXmlElement = technicalNode.element(\"string\");\n if (stringNode) {\n stringNumber = parseInt(stringNode.value, 10);\n }\n const fretNode: IXmlElement = technicalNode.element(\"fret\");\n if (fretNode) {\n fretNumber = parseInt(fretNode.value, 10);\n }\n }\n }\n\n if (stringNumber < 0 || fretNumber < 0) {\n // create normal Note\n note = new Note(this.currentVoiceEntry, this.currentStaffEntry, noteLength, pitch);\n } else {\n // create TabNote\n note = new TabNote(this.currentVoiceEntry, this.currentStaffEntry, noteLength, pitch, stringNumber, fretNumber);\n }\n\n note.TypeLength = typeDuration;\n note.NoteTypeXml = noteTypeXml;\n note.NormalNotes = normalNotes;\n note.PrintObject = printObject;\n note.IsCueNote = isCueNote;\n note.StemDirectionXml = stemDirectionXml; // maybe unnecessary, also in VoiceEntry\n note.TremoloStrokes = tremoloStrokes; // could be a Tremolo object in future if we have more data to manage like two-note tremolo\n if ((noteheadShapeXml !== undefined && noteheadShapeXml !== \"normal\") || noteheadFilledXml !== undefined) {\n note.Notehead = new Notehead(note, noteheadShapeXml, noteheadFilledXml);\n } // if normal, leave note head undefined to save processing/runtime\n note.NoteheadColorXml = noteheadColorXml; // color set in Xml, shouldn't be changed.\n note.NoteheadColor = noteheadColorXml; // color currently used\n note.PlaybackInstrumentId = playbackInstrumentId;\n this.currentVoiceEntry.Notes.push(note);\n this.currentVoiceEntry.StemDirectionXml = stemDirectionXml;\n if (stemColorXml) {\n this.currentVoiceEntry.StemColorXml = stemColorXml;\n this.currentVoiceEntry.StemColor = stemColorXml;\n note.StemColorXml = stemColorXml;\n }\n if (node.elements(\"beam\") && !chord) {\n this.createBeam(node, note);\n }\n return note;\n }\n\n /**\n * Create a new rest note and add it to the currentVoiceEntry.\n * @param noteDuration\n * @param divisions\n * @returns {Note}\n */\n private addRestNote(noteDuration: Fraction, noteTypeXml: NoteType, printObject: boolean, isCueNote: boolean, noteheadColorXml: string): Note {\n const restFraction: Fraction = Fraction.createFromFraction(noteDuration);\n const restNote: Note = new Note(this.currentVoiceEntry, this.currentStaffEntry, restFraction, undefined);\n restNote.NoteTypeXml = noteTypeXml;\n restNote.PrintObject = printObject;\n restNote.IsCueNote = isCueNote;\n restNote.NoteheadColorXml = noteheadColorXml;\n restNote.NoteheadColor = noteheadColorXml;\n this.currentVoiceEntry.Notes.push(restNote);\n if (this.openBeam) {\n this.openBeam.ExtendedNoteList.push(restNote);\n }\n return restNote;\n }\n\n /**\n * Handle the currentVoiceBeam.\n * @param node\n * @param note\n */\n private createBeam(node: IXmlElement, note: Note): void {\n try {\n const beamNode: IXmlElement = node.element(\"beam\");\n let beamAttr: IXmlAttribute = undefined;\n if (beamNode !== undefined && beamNode.hasAttributes) {\n beamAttr = beamNode.attribute(\"number\");\n }\n if (beamAttr) {\n const beamNumber: number = parseInt(beamAttr.value, 10);\n const mainBeamNode: IXmlElement[] = node.elements(\"beam\");\n const currentBeamTag: string = mainBeamNode[0].value;\n if (beamNumber === 1 && mainBeamNode) {\n if (currentBeamTag === \"begin\" && this.lastBeamTag !== currentBeamTag) {\n if (this.openBeam) {\n this.handleOpenBeam();\n }\n this.openBeam = new Beam();\n }\n this.lastBeamTag = currentBeamTag;\n }\n let sameVoiceEntry: boolean = false;\n if (!this.openBeam) {\n return;\n }\n for (let idx: number = 0, len: number = this.openBeam.Notes.length; idx < len; ++idx) {\n const beamNote: Note = this.openBeam.Notes[idx];\n if (this.currentVoiceEntry === beamNote.ParentVoiceEntry) {\n sameVoiceEntry = true;\n }\n }\n if (!sameVoiceEntry) {\n this.openBeam.addNoteToBeam(note);\n if (currentBeamTag === \"end\" && beamNumber === 1) {\n this.openBeam = undefined;\n }\n }\n }\n } catch (e) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/BeamError\", \"Error while reading beam.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw new MusicSheetReadingException(\"\", e);\n }\n\n }\n\n /**\n * Check for open [[Beam]]s at end of [[SourceMeasure]] and closes them explicity.\n */\n private handleOpenBeam(): void {\n if (this.openBeam.Notes.length === 1) {\n const beamNote: Note = this.openBeam.Notes[0];\n beamNote.NoteBeam = undefined;\n this.openBeam = undefined;\n return;\n }\n if (this.currentNote === CollectionUtil.last(this.openBeam.Notes)) {\n this.openBeam = undefined;\n } else {\n const beamLastNote: Note = CollectionUtil.last(this.openBeam.Notes);\n const beamLastNoteStaffEntry: SourceStaffEntry = beamLastNote.ParentStaffEntry;\n const horizontalIndex: number = this.currentMeasure.getVerticalContainerIndexByTimestamp(beamLastNoteStaffEntry.Timestamp);\n const verticalIndex: number = beamLastNoteStaffEntry.VerticalContainerParent.StaffEntries.indexOf(beamLastNoteStaffEntry);\n if (horizontalIndex < this.currentMeasure.VerticalSourceStaffEntryContainers.length - 1) {\n const nextStaffEntry: SourceStaffEntry = this.currentMeasure\n .VerticalSourceStaffEntryContainers[horizontalIndex + 1]\n .StaffEntries[verticalIndex];\n if (nextStaffEntry) {\n for (let idx: number = 0, len: number = nextStaffEntry.VoiceEntries.length; idx < len; ++idx) {\n const voiceEntry: VoiceEntry = nextStaffEntry.VoiceEntries[idx];\n if (voiceEntry.ParentVoice === this.voice) {\n const candidateNote: Note = voiceEntry.Notes[0];\n if (candidateNote.Length.lte(new Fraction(1, 8))) {\n this.openBeam.addNoteToBeam(candidateNote);\n this.openBeam = undefined;\n } else {\n this.openBeam = undefined;\n }\n }\n }\n }\n } else {\n this.openBeam = undefined;\n }\n }\n }\n\n /**\n * Create a [[Tuplet]].\n * @param node\n * @param tupletNodeList\n * @returns {number}\n */\n private addTuplet(node: IXmlElement, tupletNodeList: IXmlElement[]): number {\n let bracketed: boolean = false; // xml bracket attribute value\n if (tupletNodeList !== undefined && tupletNodeList.length > 1) {\n let timeModNode: IXmlElement = node.element(\"time-modification\");\n if (timeModNode) {\n timeModNode = timeModNode.element(\"actual-notes\");\n }\n const tupletNodeListArr: IXmlElement[] = tupletNodeList;\n for (let idx: number = 0, len: number = tupletNodeListArr.length; idx < len; ++idx) {\n const tupletNode: IXmlElement = tupletNodeListArr[idx];\n if (tupletNode !== undefined && tupletNode.attributes()) {\n const bracketAttr: Attr = tupletNode.attribute(\"bracket\");\n if (bracketAttr && bracketAttr.value === \"yes\") {\n bracketed = true;\n }\n const type: Attr = tupletNode.attribute(\"type\");\n if (type && type.value === \"start\") {\n let tupletNumber: number = 1;\n if (tupletNode.attribute(\"number\")) {\n tupletNumber = parseInt(tupletNode.attribute(\"number\").value, 10);\n }\n let tupletLabelNumber: number = 0;\n if (timeModNode) {\n tupletLabelNumber = parseInt(timeModNode.value, 10);\n if (isNaN(tupletLabelNumber)) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/TupletNoteDurationError\", \"Invalid tuplet note duration.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw new MusicSheetReadingException(errorMsg, undefined);\n }\n\n }\n const tuplet: Tuplet = new Tuplet(tupletLabelNumber, bracketed);\n if (this.tupletDict[tupletNumber]) {\n delete this.tupletDict[tupletNumber];\n if (Object.keys(this.tupletDict).length === 0) {\n this.openTupletNumber = 0;\n } else if (Object.keys(this.tupletDict).length > 1) {\n this.openTupletNumber--;\n }\n }\n this.tupletDict[tupletNumber] = tuplet;\n const subnotelist: Note[] = [];\n subnotelist.push(this.currentNote);\n tuplet.Notes.push(subnotelist);\n tuplet.Fractions.push(this.getTupletNoteDurationFromType(node));\n this.currentNote.NoteTuplet = tuplet;\n this.openTupletNumber = tupletNumber;\n } else if (type.value === \"stop\") {\n let tupletNumber: number = 1;\n if (tupletNode.attribute(\"number\")) {\n tupletNumber = parseInt(tupletNode.attribute(\"number\").value, 10);\n }\n const tuplet: Tuplet = this.tupletDict[tupletNumber];\n if (tuplet) {\n const subnotelist: Note[] = [];\n subnotelist.push(this.currentNote);\n tuplet.Notes.push(subnotelist);\n tuplet.Fractions.push(this.getTupletNoteDurationFromType(node));\n this.currentNote.NoteTuplet = tuplet;\n delete this.tupletDict[tupletNumber];\n if (Object.keys(this.tupletDict).length === 0) {\n this.openTupletNumber = 0;\n } else if (Object.keys(this.tupletDict).length > 1) {\n this.openTupletNumber--;\n }\n }\n }\n }\n }\n } else if (tupletNodeList[0]) {\n const n: IXmlElement = tupletNodeList[0];\n if (n.hasAttributes) {\n const type: string = n.attribute(\"type\").value;\n let tupletnumber: number = 1;\n if (n.attribute(\"number\")) {\n tupletnumber = parseInt(n.attribute(\"number\").value, 10);\n }\n const noTupletNumbering: boolean = isNaN(tupletnumber);\n\n const bracketAttr: Attr = n.attribute(\"bracket\");\n if (bracketAttr && bracketAttr.value === \"yes\") {\n bracketed = true;\n }\n\n if (type === \"start\") {\n let tupletLabelNumber: number = 0;\n let timeModNode: IXmlElement = node.element(\"time-modification\");\n if (timeModNode) {\n timeModNode = timeModNode.element(\"actual-notes\");\n }\n if (timeModNode) {\n tupletLabelNumber = parseInt(timeModNode.value, 10);\n if (isNaN(tupletLabelNumber)) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/TupletNoteDurationError\", \"Invalid tuplet note duration.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw new MusicSheetReadingException(errorMsg);\n }\n\n }\n if (noTupletNumbering) {\n this.openTupletNumber++;\n tupletnumber = this.openTupletNumber;\n }\n let tuplet: Tuplet = this.tupletDict[tupletnumber];\n if (!tuplet) {\n tuplet = this.tupletDict[tupletnumber] = new Tuplet(tupletLabelNumber, bracketed);\n }\n const subnotelist: Note[] = [];\n subnotelist.push(this.currentNote);\n tuplet.Notes.push(subnotelist);\n tuplet.Fractions.push(this.getTupletNoteDurationFromType(node));\n this.currentNote.NoteTuplet = tuplet;\n this.openTupletNumber = tupletnumber;\n } else if (type === \"stop\") {\n if (noTupletNumbering) {\n tupletnumber = this.openTupletNumber;\n }\n const tuplet: Tuplet = this.tupletDict[this.openTupletNumber];\n if (tuplet) {\n const subnotelist: Note[] = [];\n subnotelist.push(this.currentNote);\n tuplet.Notes.push(subnotelist);\n tuplet.Fractions.push(this.getTupletNoteDurationFromType(node));\n this.currentNote.NoteTuplet = tuplet;\n if (Object.keys(this.tupletDict).length === 0) {\n this.openTupletNumber = 0;\n } else if (Object.keys(this.tupletDict).length > 1) {\n this.openTupletNumber--;\n }\n delete this.tupletDict[tupletnumber];\n }\n }\n }\n }\n return this.openTupletNumber;\n }\n\n /**\n * This method handles the time-modification IXmlElement for the Tuplet case (tupletNotes not at begin/end of Tuplet).\n * @param noteNode\n */\n private handleTimeModificationNode(noteNode: IXmlElement): void {\n if (this.tupletDict[this.openTupletNumber]) {\n try {\n // Tuplet should already be created\n const tuplet: Tuplet = this.tupletDict[this.openTupletNumber];\n const notes: Note[] = CollectionUtil.last(tuplet.Notes);\n const lastTupletVoiceEntry: VoiceEntry = notes[0].ParentVoiceEntry;\n let noteList: Note[];\n if (lastTupletVoiceEntry.Timestamp.Equals(this.currentVoiceEntry.Timestamp)) {\n noteList = notes;\n } else {\n noteList = [];\n tuplet.Notes.push(noteList);\n tuplet.Fractions.push(this.getTupletNoteDurationFromType(noteNode));\n }\n noteList.push(this.currentNote);\n this.currentNote.NoteTuplet = tuplet;\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\n \"ReaderErrorMessages/TupletNumberError\", \"Invalid tuplet number.\"\n );\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw ex;\n }\n\n } else if (this.currentVoiceEntry.Notes.length > 0) {\n const firstNote: Note = this.currentVoiceEntry.Notes[0];\n if (firstNote.NoteTuplet) {\n const tuplet: Tuplet = firstNote.NoteTuplet;\n const notes: Note[] = CollectionUtil.last(tuplet.Notes);\n notes.push(this.currentNote);\n this.currentNote.NoteTuplet = tuplet;\n }\n }\n }\n\n private addTie(tieNodeList: IXmlElement[], measureStartAbsoluteTimestamp: Fraction, maxTieNoteFraction: Fraction): void {\n if (tieNodeList) {\n if (tieNodeList.length === 1) {\n const tieNode: IXmlElement = tieNodeList[0];\n if (tieNode !== undefined && tieNode.attributes()) {\n const type: string = tieNode.attribute(\"type\").value;\n try {\n if (type === \"start\") {\n const num: number = this.findCurrentNoteInTieDict(this.currentNote);\n if (num < 0) {\n delete this.openTieDict[num];\n }\n const newTieNumber: number = this.getNextAvailableNumberForTie();\n const tie: Tie = new Tie(this.currentNote);\n this.openTieDict[newTieNumber] = tie;\n } else if (type === \"stop\") {\n const tieNumber: number = this.findCurrentNoteInTieDict(this.currentNote);\n const tie: Tie = this.openTieDict[tieNumber];\n if (tie) {\n tie.AddNote(this.currentNote);\n if (maxTieNoteFraction.lt(Fraction.plus(this.currentStaffEntry.Timestamp, this.currentNote.Length))) {\n maxTieNoteFraction = Fraction.plus(this.currentStaffEntry.Timestamp, this.currentNote.Length);\n }\n delete this.openTieDict[tieNumber];\n }\n }\n } catch (err) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/TieError\", \"Error while reading tie.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n }\n\n }\n } else if (tieNodeList.length === 2) {\n const tieNumber: number = this.findCurrentNoteInTieDict(this.currentNote);\n if (tieNumber >= 0) {\n const tie: Tie = this.openTieDict[tieNumber];\n tie.AddNote(this.currentNote);\n if (maxTieNoteFraction.lt(Fraction.plus(this.currentStaffEntry.Timestamp, this.currentNote.Length))) {\n maxTieNoteFraction = Fraction.plus(this.currentStaffEntry.Timestamp, this.currentNote.Length);\n }\n }\n }\n }\n }\n\n /**\n * Find the next free int (starting from 0) to use as key in TieDict.\n * @returns {number}\n */\n private getNextAvailableNumberForTie(): number {\n const keys: string[] = Object.keys(this.openTieDict);\n if (keys.length === 0) {\n return 1;\n }\n keys.sort((a, b) => (+a - +b)); // FIXME Andrea: test\n for (let i: number = 0; i < keys.length; i++) {\n if (\"\" + (i + 1) !== keys[i]) {\n return i + 1;\n }\n }\n return +(keys[keys.length - 1]) + 1;\n }\n\n /**\n * Search the tieDictionary for the corresponding candidateNote to the currentNote (same FundamentalNote && Octave).\n * @param candidateNote\n * @returns {number}\n */\n private findCurrentNoteInTieDict(candidateNote: Note): number {\n const openTieDict: { [_: number]: Tie; } = this.openTieDict;\n for (const key in openTieDict) {\n if (openTieDict.hasOwnProperty(key)) {\n const tie: Tie = openTieDict[key];\n if (tie.Pitch.FundamentalNote === candidateNote.Pitch.FundamentalNote && tie.Pitch.Octave === candidateNote.Pitch.Octave) {\n return +key;\n }\n }\n }\n return -1;\n }\n\n /**\n * Calculate the normal duration of a [[Tuplet]] note.\n * @param xmlNode\n * @returns {any}\n */\n private getTupletNoteDurationFromType(xmlNode: IXmlElement): Fraction {\n if (xmlNode.element(\"type\")) {\n const typeNode: IXmlElement = xmlNode.element(\"type\");\n if (typeNode) {\n const type: string = typeNode.value;\n try {\n return this.getNoteDurationFromType(type);\n } catch (e) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/NoteDurationError\", \"Invalid note duration.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n throw new MusicSheetReadingException(\"\", e);\n }\n\n }\n }\n return undefined;\n }\n}\n","import {LyricWord} from \"../../VoiceData/Lyrics/LyricsWord\";\nimport {VoiceEntry} from \"../../VoiceData/VoiceEntry\";\nimport {IXmlElement} from \"../../../Common/FileIO/Xml\";\nimport {LyricsEntry} from \"../../VoiceData/Lyrics/LyricsEntry\";\nimport {ITextTranslation} from \"../../Interfaces/ITextTranslation\";\nimport {MusicSheet} from \"../../MusicSheet\";\n\nexport class LyricsReader {\n private openLyricWords: { [_: number]: LyricWord; } = {};\n private currentLyricWord: LyricWord;\n private musicSheet: MusicSheet;\n\n constructor(musicSheet: MusicSheet) {\n this.musicSheet = musicSheet;\n }\n /**\n * This method adds a single LyricEntry to a VoiceEntry\n * @param {IXmlElement[]} lyricNodeList\n * @param {VoiceEntry} currentVoiceEntry\n */\n public addLyricEntry(lyricNodeList: IXmlElement[], currentVoiceEntry: VoiceEntry): void {\n if (lyricNodeList) {\n const lyricNodeListArr: IXmlElement[] = lyricNodeList;\n for (let idx: number = 0, len: number = lyricNodeListArr.length; idx < len; ++idx) {\n const lyricNode: IXmlElement = lyricNodeListArr[idx];\n try {\n let syllabic: string = \"single\"; // Single as default\n if (lyricNode.element(\"text\")) {\n let textNode: IXmlElement = lyricNode.element(\"text\");\n if (lyricNode.element(\"syllabic\")) {\n syllabic = lyricNode.element(\"syllabic\").value;\n }\n if (textNode) {\n const text: string = textNode.value;\n // separates Multiple syllabels on a single LyricNote\n // \"-\" text indicating separated syllabel should be ignored\n // we calculate the Dash element much later\n if (lyricNode.element(\"elision\") !== undefined && text === \"-\") {\n const lyricNodeChildren: IXmlElement[] = lyricNode.elements();\n let elisionIndex: number = 0;\n for (let i: number = 0; i < lyricNodeChildren.length; i++) {\n const child: IXmlElement = lyricNodeChildren[i];\n if (child.name === \"elision\") {\n elisionIndex = i;\n break;\n }\n }\n let nextText: IXmlElement = undefined;\n let nextSyllabic: IXmlElement = undefined;\n // read the next nodes\n if (elisionIndex > 0) {\n for (let i: number = elisionIndex; i < lyricNodeChildren.length; i++) {\n const child: IXmlElement = lyricNodeChildren[i];\n if (child.name === \"text\") {\n nextText = child;\n }\n if (child.name === \"syllabic\") {\n nextSyllabic = child;\n }\n }\n }\n if (nextText !== undefined && nextSyllabic) {\n textNode = nextText;\n syllabic = \"middle\";\n }\n }\n let currentLyricVerseNumber: number = 1;\n let errorNumberParse1: boolean = false;\n if (lyricNode.attributes() !== undefined && lyricNode.attribute(\"number\")) {\n try {\n currentLyricVerseNumber = parseInt(lyricNode.attribute(\"number\").value, 10); // usually doesn't throw error, but returns NaN\n } catch (err) {\n errorNumberParse1 = true;\n }\n errorNumberParse1 = errorNumberParse1 || isNaN(currentLyricVerseNumber);\n if (errorNumberParse1) {\n try { // Sibelius format: \"part1verse1\"\n const result: string[] = lyricNode.attribute(\"number\").value.toLowerCase().split(\"verse\");\n if (result.length > 1) {\n currentLyricVerseNumber = parseInt(result[1], 10);\n }\n } catch (err) {\n const errorMsg: string =\n ITextTranslation.translateText(\"ReaderErrorMessages/LyricVerseNumberError\", \"Invalid lyric verse number\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n continue;\n }\n }\n }\n let lyricsEntry: LyricsEntry = undefined;\n if (syllabic === \"single\" || syllabic === \"end\") {\n if (this.openLyricWords[currentLyricVerseNumber]) { // word end given or some word still open\n this.currentLyricWord = this.openLyricWords[currentLyricVerseNumber];\n const syllableNumber: number = this.currentLyricWord.Syllables.length;\n lyricsEntry = new LyricsEntry(text, currentLyricVerseNumber, this.currentLyricWord, currentVoiceEntry, syllableNumber);\n this.currentLyricWord.Syllables.push(lyricsEntry);\n delete this.openLyricWords[currentLyricVerseNumber];\n this.currentLyricWord = undefined;\n } else { // single syllable given or end given while no word has been started\n lyricsEntry = new LyricsEntry(text, currentLyricVerseNumber, undefined, currentVoiceEntry);\n }\n lyricsEntry.extend = lyricNode.element(\"extend\") !== undefined;\n } else if (syllabic === \"begin\") { // first finishing, if a word already is open (can only happen, when wrongly given)\n if (this.openLyricWords[currentLyricVerseNumber]) {\n delete this.openLyricWords[currentLyricVerseNumber];\n this.currentLyricWord = undefined;\n }\n this.currentLyricWord = new LyricWord();\n this.openLyricWords[currentLyricVerseNumber] = this.currentLyricWord;\n lyricsEntry = new LyricsEntry(text, currentLyricVerseNumber, this.currentLyricWord, currentVoiceEntry, 0);\n this.currentLyricWord.Syllables.push(lyricsEntry);\n } else if (syllabic === \"middle\") {\n if (this.openLyricWords[currentLyricVerseNumber]) {\n this.currentLyricWord = this.openLyricWords[currentLyricVerseNumber];\n const syllableNumber: number = this.currentLyricWord.Syllables.length;\n lyricsEntry = new LyricsEntry(text, currentLyricVerseNumber, this.currentLyricWord, currentVoiceEntry, syllableNumber);\n this.currentLyricWord.Syllables.push(lyricsEntry);\n } else {\n // in case the wrong syllabel information is given, create a single Entry and add it to currentVoiceEntry\n lyricsEntry = new LyricsEntry(text, currentLyricVerseNumber, undefined, currentVoiceEntry);\n }\n }\n // add each LyricEntry to currentVoiceEntry\n if (lyricsEntry) {\n // only add the lyric entry if not another entry has already been given:\n if (!currentVoiceEntry.LyricsEntries[currentLyricVerseNumber]) {\n currentVoiceEntry.LyricsEntries.setValue(currentLyricVerseNumber, lyricsEntry);\n }\n // save in currentInstrument the verseNumber (only once)\n if (!currentVoiceEntry.ParentVoice.Parent.LyricVersesNumbers[currentLyricVerseNumber]) {\n currentVoiceEntry.ParentVoice.Parent.LyricVersesNumbers.push(currentLyricVerseNumber);\n }\n }\n }\n }\n } catch (err) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/LyricError\", \"Error while reading lyric entry.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n continue;\n }\n }\n // Squash to unique numbers\n currentVoiceEntry.ParentVoice.Parent.LyricVersesNumbers =\n currentVoiceEntry.ParentVoice.Parent.LyricVersesNumbers.filter((lvn, index, self) => self.indexOf(lvn) === index);\n }\n }\n}\n","import {ArticulationEnum, VoiceEntry} from \"../../VoiceData/VoiceEntry\";\nimport {IXmlAttribute, IXmlElement} from \"../../../Common/FileIO/Xml\";\nimport log from \"loglevel\";\nimport {TechnicalInstruction, TechnicalInstructionType} from \"../../VoiceData/Instructions/TechnicalInstruction\";\nimport {OrnamentContainer, OrnamentEnum} from \"../../VoiceData/OrnamentContainer\";\nimport {PlacementEnum} from \"../../VoiceData/Expressions/AbstractExpression\";\nimport {AccidentalEnum} from \"../../../Common/DataObjects/Pitch\";\nexport class ArticulationReader {\n\n private getAccEnumFromString(input: string): AccidentalEnum {\n switch (input) {\n case \"sharp\":\n return AccidentalEnum.SHARP;\n case \"flat\":\n return AccidentalEnum.FLAT;\n case \"natural\":\n return AccidentalEnum.NATURAL;\n case \"double-sharp\":\n case \"sharp-sharp\":\n return AccidentalEnum.DOUBLESHARP;\n case \"double-flat\":\n case \"flat-flat\":\n return AccidentalEnum.DOUBLEFLAT;\n case \"quarter-sharp\":\n return AccidentalEnum.QUARTERTONESHARP;\n case \"quarter-flat\":\n return AccidentalEnum.QUARTERTONEFLAT;\n case \"triple-sharp\":\n return AccidentalEnum.TRIPLESHARP;\n case \"triple-flat\":\n return AccidentalEnum.TRIPLEFLAT;\n default:\n return AccidentalEnum.NONE;\n }\n }\n\n /**\n * This method adds an Articulation Expression to the currentVoiceEntry.\n * @param node\n * @param currentVoiceEntry\n */\n public addArticulationExpression(node: IXmlElement, currentVoiceEntry: VoiceEntry): void {\n if (node !== undefined && node.elements().length > 0) {\n const childNotes: IXmlElement[] = node.elements();\n for (let idx: number = 0, len: number = childNotes.length; idx < len; ++idx) {\n const childNote: IXmlElement = childNotes[idx];\n const name: string = childNote.name;\n try {\n // some Articulations appear in Xml separated with a \"-\" (eg strong-accent), we remove it for enum parsing\n name.replace(\"-\", \"\");\n const articulationEnum: ArticulationEnum = ArticulationEnum[name];\n if (VoiceEntry.isSupportedArticulation(articulationEnum)) {\n // staccato should be first\n if (name === \"staccato\") {\n if (currentVoiceEntry.Articulations.length > 0 &&\n currentVoiceEntry.Articulations[0] !== ArticulationEnum.staccato) {\n currentVoiceEntry.Articulations.splice(0, 0, articulationEnum);\n }\n }\n\n // don't add the same articulation twice\n if (currentVoiceEntry.Articulations.indexOf(articulationEnum) === -1) {\n currentVoiceEntry.Articulations.push(articulationEnum);\n }\n }\n } catch (ex) {\n const errorMsg: string = \"Invalid note articulation.\";\n log.debug(\"addArticulationExpression\", errorMsg, ex);\n return;\n }\n }\n }\n }\n\n /**\n * This method add a Fermata to the currentVoiceEntry.\n * @param xmlNode\n * @param currentVoiceEntry\n */\n public addFermata(xmlNode: IXmlElement, currentVoiceEntry: VoiceEntry): void {\n // fermata appears as separate tag in XML\n let articulationEnum: ArticulationEnum = ArticulationEnum.fermata;\n if (xmlNode.attributes().length > 0 && xmlNode.attribute(\"type\")) {\n if (xmlNode.attribute(\"type\").value === \"inverted\") {\n articulationEnum = ArticulationEnum.invertedfermata;\n }\n }\n // add to VoiceEntry\n currentVoiceEntry.Articulations.push(articulationEnum);\n }\n\n /**\n * This method add a technical Articulation to the currentVoiceEntry.\n * @param xmlNode\n * @param currentVoiceEntry\n */\n public addTechnicalArticulations(xmlNode: IXmlElement, currentVoiceEntry: VoiceEntry): void {\n interface XMLElementToArticulationEnum {\n [xmlElement: string]: ArticulationEnum;\n }\n const xmlElementToArticulationEnum: XMLElementToArticulationEnum = {\n \"down-bow\": ArticulationEnum.downbow,\n \"open-string\": ArticulationEnum.naturalharmonic,\n \"snap-pizzicato\": ArticulationEnum.snappizzicato,\n \"stopped\": ArticulationEnum.lefthandpizzicato,\n \"up-bow\": ArticulationEnum.upbow,\n // fingering is special case\n };\n\n for (const xmlArticulation in xmlElementToArticulationEnum) {\n if (!xmlElementToArticulationEnum.hasOwnProperty(xmlArticulation)) {\n continue;\n }\n const articulationEnum: ArticulationEnum = xmlElementToArticulationEnum[xmlArticulation];\n const node: IXmlElement = xmlNode.element(xmlArticulation);\n if (node) {\n if (currentVoiceEntry.Articulations.indexOf(articulationEnum) === -1) {\n currentVoiceEntry.Articulations.push(articulationEnum);\n }\n }\n }\n\n const nodeFingering: IXmlElement = xmlNode.element(\"fingering\");\n if (nodeFingering) {\n const currentTechnicalInstruction: TechnicalInstruction = new TechnicalInstruction();\n currentTechnicalInstruction.type = TechnicalInstructionType.Fingering;\n currentTechnicalInstruction.value = nodeFingering.value;\n currentTechnicalInstruction.placement = PlacementEnum.NotYetDefined;\n const placement: Attr = nodeFingering.attribute(\"placement\");\n if (placement !== undefined && placement !== null) {\n switch (placement.value) {\n case \"above\":\n currentTechnicalInstruction.placement = PlacementEnum.Above;\n break;\n case \"below\":\n currentTechnicalInstruction.placement = PlacementEnum.Below;\n break;\n case \"left\": // not valid in MusicXML 3.1\n currentTechnicalInstruction.placement = PlacementEnum.Left;\n break;\n case \"right\": // not valid in MusicXML 3.1\n currentTechnicalInstruction.placement = PlacementEnum.Right;\n break;\n default:\n currentTechnicalInstruction.placement = PlacementEnum.NotYetDefined;\n }\n }\n currentVoiceEntry.TechnicalInstructions.push(currentTechnicalInstruction);\n }\n }\n\n /**\n * This method adds an Ornament to the currentVoiceEntry.\n * @param ornamentsNode\n * @param currentVoiceEntry\n */\n public addOrnament(ornamentsNode: IXmlElement, currentVoiceEntry: VoiceEntry): void {\n if (ornamentsNode) {\n let ornament: OrnamentContainer = undefined;\n\n interface XMLElementToOrnamentEnum {\n [xmlElement: string]: OrnamentEnum;\n }\n const elementToOrnamentEnum: XMLElementToOrnamentEnum = {\n \"delayed-inverted-turn\": OrnamentEnum.DelayedInvertedTurn,\n \"delayed-turn\": OrnamentEnum.DelayedTurn,\n \"inverted-mordent\": OrnamentEnum.InvertedMordent,\n \"inverted-turn\": OrnamentEnum.InvertedTurn,\n \"mordent\": OrnamentEnum.Mordent,\n \"trill-mark\": OrnamentEnum.Trill,\n \"turn\": OrnamentEnum.Turn,\n // further ornaments are not yet supported by MusicXML (3.1).\n };\n\n for (const ornamentElement in elementToOrnamentEnum) {\n if (!elementToOrnamentEnum.hasOwnProperty(ornamentElement)) {\n continue;\n }\n const node: IXmlElement = ornamentsNode.element(ornamentElement);\n if (node) {\n ornament = new OrnamentContainer(elementToOrnamentEnum[ornamentElement]);\n }\n }\n if (ornament) {\n const accidentalsList: IXmlElement[] = ornamentsNode.elements(\"accidental-mark\");\n if (accidentalsList) {\n let placement: PlacementEnum = PlacementEnum.Below;\n let accidental: AccidentalEnum = AccidentalEnum.NONE;\n const accidentalsListArr: IXmlElement[] = accidentalsList;\n for (let idx: number = 0, len: number = accidentalsListArr.length; idx < len; ++idx) {\n const accidentalNode: IXmlElement = accidentalsListArr[idx];\n let text: string = accidentalNode.value;\n accidental = this.getAccEnumFromString(text);\n const placementAttr: IXmlAttribute = accidentalNode.attribute(\"placement\");\n if (accidentalNode.hasAttributes && placementAttr) {\n text = placementAttr.value;\n if (text === \"above\") {\n placement = PlacementEnum.Above;\n } else if (text === \"below\") {\n placement = PlacementEnum.Below;\n }\n }\n if (placement === PlacementEnum.Above) {\n ornament.AccidentalAbove = accidental;\n } else if (placement === PlacementEnum.Below) {\n ornament.AccidentalBelow = accidental;\n }\n }\n }\n // add this to currentVoiceEntry\n currentVoiceEntry.OrnamentContainer = ornament;\n }\n }\n } // /addOrnament\n\n}\n","import {IXmlElement, IXmlAttribute} from \"../../../Common/FileIO/Xml\";\nimport {MusicSheet} from \"../../MusicSheet\";\nimport {ChordDegreeText, ChordSymbolContainer, ChordSymbolEnum, Degree} from \"../../VoiceData/ChordSymbolContainer\";\nimport {AccidentalEnum, NoteEnum, Pitch} from \"../../../Common/DataObjects/Pitch\";\nimport {KeyInstruction} from \"../../VoiceData/Instructions/KeyInstruction\";\nimport {ITextTranslation} from \"../../Interfaces/ITextTranslation\";\nimport log from \"loglevel\";\n\nexport class ChordSymbolReader {\n public static readChordSymbol(xmlNode: IXmlElement, musicSheet: MusicSheet, activeKey: KeyInstruction): ChordSymbolContainer {\n const root: IXmlElement = xmlNode.element(\"root\");\n const kind: IXmlElement = xmlNode.element(\"kind\");\n const kindText: IXmlAttribute = kind.attribute(\"text\");\n\n // must be always present\n if (!root || !kind) {\n return undefined;\n }\n\n const rootStep: IXmlElement = root.element(\"root-step\");\n const rootAlter: IXmlElement = root.element(\"root-alter\");\n\n // a valid NoteEnum value should be present\n if (!rootStep) {\n return undefined;\n }\n let rootNote: NoteEnum;\n try {\n rootNote = NoteEnum[rootStep.value.trim()];\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n return undefined;\n }\n\n // an alteration value isn't necessary\n let rootAlteration: AccidentalEnum = AccidentalEnum.NONE;\n if (rootAlter) {\n try {\n rootAlteration = Pitch.AccidentalFromHalfTones(parseInt(rootAlter.value, undefined));\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n }\n\n }\n // using default octave value, to be changed later\n const rootPitch: Pitch = new Pitch(rootNote, 1, rootAlteration);\n let kindValue: string = kind.value.trim().replace(\"-\", \"\");\n if (kindText) {\n switch (kindText.value) {\n case \"aug\":\n kindValue = \"augmented\";\n break;\n case \"dim\":\n kindValue = \"diminished\";\n break;\n default:\n }\n }\n let chordKind: ChordSymbolEnum;\n try {\n chordKind = ChordSymbolEnum[kindValue];\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n return undefined;\n }\n\n // bass is optional\n let bassPitch: Pitch = undefined;\n const bass: IXmlElement = xmlNode.element(\"bass\");\n if (bass) {\n const bassStep: IXmlElement = bass.element(\"bass-step\");\n const bassAlter: IXmlElement = bass.element(\"bass-alter\");\n let bassNote: NoteEnum = NoteEnum.C;\n if (bassStep) {\n try {\n bassNote = NoteEnum[bassStep.value.trim()];\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n return undefined;\n }\n }\n let bassAlteration: AccidentalEnum = AccidentalEnum.NONE;\n if (bassAlter) {\n try {\n bassAlteration = Pitch.AccidentalFromHalfTones(parseInt(bassAlter.value, undefined));\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n }\n }\n bassPitch = new Pitch(bassNote, 1, bassAlteration);\n }\n\n // degree is optional\n let degree: Degree = undefined;\n const degreeNode: IXmlElement = xmlNode.element(\"degree\");\n if (degreeNode) {\n const degreeValue: IXmlElement = degreeNode.element(\"degree-value\");\n const degreeAlter: IXmlElement = degreeNode.element(\"degree-alter\");\n const degreeType: IXmlElement = degreeNode.element(\"degree-type\");\n if (!degreeValue || !degreeAlter || !degreeType) {\n return undefined;\n }\n\n let value: number;\n try {\n value = parseInt(degreeValue.value.trim(), undefined);\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n return undefined;\n }\n\n let alter: AccidentalEnum;\n try {\n alter = Pitch.AccidentalFromHalfTones(parseInt(degreeAlter.value, undefined));\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n return undefined;\n }\n\n let text: ChordDegreeText;\n try {\n text = ChordDegreeText[degreeType.value.trim().toLowerCase()];\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/ChordSymbolError\",\n \"Invalid chord symbol\");\n musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"InstrumentReader.readChordSymbol\", errorMsg, ex);\n return undefined;\n }\n\n degree = new Degree(value, alter, text);\n }\n return new ChordSymbolContainer(rootPitch, chordKind, bassPitch, degree, musicSheet.Rules);\n }\n}\n","import {MusicSheet} from \"../../MusicSheet\";\nimport {Fraction} from \"../../../Common/DataObjects/Fraction\";\nimport {MultiTempoExpression} from \"../../VoiceData/Expressions/MultiTempoExpression\";\nimport {ContDynamicEnum, ContinuousDynamicExpression} from \"../../VoiceData/Expressions/ContinuousExpressions/ContinuousDynamicExpression\";\nimport {ContinuousTempoExpression} from \"../../VoiceData/Expressions/ContinuousExpressions/ContinuousTempoExpression\";\nimport {InstantaneousDynamicExpression} from \"../../VoiceData/Expressions/InstantaneousDynamicExpression\";\nimport {OctaveShift} from \"../../VoiceData/Expressions/ContinuousExpressions/OctaveShift\";\nimport {Instrument} from \"../../Instrument\";\nimport {MultiExpression} from \"../../VoiceData/Expressions/MultiExpression\";\nimport {IXmlAttribute, IXmlElement} from \"../../../Common/FileIO/Xml\";\nimport {SourceMeasure} from \"../../VoiceData/SourceMeasure\";\nimport {InstantaneousTempoExpression} from \"../../VoiceData/Expressions/InstantaneousTempoExpression\";\nimport {MoodExpression} from \"../../VoiceData/Expressions/MoodExpression\";\nimport {UnknownExpression} from \"../../VoiceData/Expressions/UnknownExpression\";\nimport {PlacementEnum} from \"../../VoiceData/Expressions/AbstractExpression\";\nimport {TextAlignmentEnum} from \"../../../Common/Enums/TextAlignment\";\nimport {ITextTranslation} from \"../../Interfaces/ITextTranslation\";\nimport log from \"loglevel\";\n\nexport class ExpressionReader {\n private musicSheet: MusicSheet;\n private placement: PlacementEnum;\n private soundTempo: number;\n private soundDynamic: number;\n private offsetDivisions: number;\n private staffNumber: number;\n private globalStaffIndex: number;\n private directionTimestamp: Fraction;\n private currentMultiTempoExpression: MultiTempoExpression;\n private openContinuousDynamicExpression: ContinuousDynamicExpression;\n private openContinuousTempoExpression: ContinuousTempoExpression;\n private activeInstantaneousDynamic: InstantaneousDynamicExpression;\n private openOctaveShift: OctaveShift;\n constructor(musicSheet: MusicSheet, instrument: Instrument, staffNumber: number) {\n this.musicSheet = musicSheet;\n this.staffNumber = staffNumber;\n this.globalStaffIndex = musicSheet.getGlobalStaffIndexOfFirstStaff(instrument) + (staffNumber - 1);\n this.initialize();\n }\n public getMultiExpression: MultiExpression;\n public readExpressionParameters(xmlNode: IXmlElement, currentInstrument: Instrument, divisions: number,\n inSourceMeasureCurrentFraction: Fraction,\n inSourceMeasureFormerFraction: Fraction,\n currentMeasureIndex: number,\n ignoreDivisionsOffset: boolean): void {\n this.initialize();\n const offsetNode: IXmlElement = xmlNode.element(\"offset\");\n if (offsetNode !== undefined && !ignoreDivisionsOffset) {\n try {\n this.offsetDivisions = parseInt(offsetNode.value, 10);\n } catch (ex) {\n const errorMsg: string = \"ReaderErrorMessages/ExpressionOffsetError\" + \", Invalid expression offset -> set to default.\";\n log.debug(\"ExpressionReader.readExpressionParameters\", errorMsg, ex);\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n this.offsetDivisions = 0;\n }\n }\n this.directionTimestamp = Fraction.createFromFraction(inSourceMeasureCurrentFraction);\n let offsetFraction: Fraction = new Fraction(Math.abs(this.offsetDivisions), divisions * 4);\n\n if (this.offsetDivisions > 0) {\n if (inSourceMeasureCurrentFraction.RealValue > 0) {\n offsetFraction = Fraction.multiply(Fraction.minus(inSourceMeasureCurrentFraction, inSourceMeasureFormerFraction), offsetFraction);\n this.directionTimestamp = Fraction.plus(offsetFraction, inSourceMeasureCurrentFraction);\n } else { this.directionTimestamp = Fraction.createFromFraction(offsetFraction); }\n } else if (this.offsetDivisions < 0) {\n if (inSourceMeasureCurrentFraction.RealValue > 0) {\n offsetFraction = Fraction.multiply(Fraction.minus(inSourceMeasureCurrentFraction, inSourceMeasureFormerFraction), offsetFraction);\n this.directionTimestamp = Fraction.minus(inSourceMeasureCurrentFraction, offsetFraction);\n } else { this.directionTimestamp = Fraction.createFromFraction(offsetFraction); }\n }\n\n const placeAttr: IXmlAttribute = xmlNode.attribute(\"placement\");\n if (placeAttr !== undefined && placeAttr !== null) {\n try {\n const placementString: string = placeAttr.value;\n if (placementString === \"below\") {\n this.placement = PlacementEnum.Below;\n } else if (placementString === \"above\") {\n this.placement = PlacementEnum.Above;\n }\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText( \"ReaderErrorMessages/ExpressionPlacementError\",\n \"Invalid expression placement -> set to default.\");\n log.debug(\"ExpressionReader.readExpressionParameters\", errorMsg, ex);\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n this.placement = PlacementEnum.Below;\n }\n\n }\n if (this.placement === PlacementEnum.NotYetDefined) {\n try {\n const directionTypeNode: IXmlElement = xmlNode.element(\"direction-type\");\n if (directionTypeNode) {\n const dynamicsNode: IXmlElement = directionTypeNode.element(\"dynamics\");\n if (dynamicsNode) {\n const defAttr: IXmlAttribute = dynamicsNode.attribute(\"default-y\");\n if (defAttr !== undefined && defAttr !== null) {\n this.readExpressionPlacement(defAttr, \"read dynamics y pos\");\n }\n }\n const wedgeNode: IXmlElement = directionTypeNode.element(\"wedge\");\n if (wedgeNode) {\n const defAttr: IXmlAttribute = wedgeNode.attribute(\"default-y\");\n if (defAttr !== undefined && defAttr !== null) {\n this.readExpressionPlacement(defAttr, \"read wedge y pos\");\n }\n }\n const wordsNode: IXmlElement = directionTypeNode.element(\"words\");\n if (wordsNode) {\n const defAttr: IXmlAttribute = wordsNode.attribute(\"default-y\");\n if (defAttr !== undefined && defAttr !== null) {\n this.readExpressionPlacement(defAttr, \"read words y pos\");\n }\n }\n }\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText( \"ReaderErrorMessages/ExpressionPlacementError\",\n \"Invalid expression placement -> set to default.\");\n log.debug(\"ExpressionReader.readExpressionParameters\", errorMsg, ex);\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n this.placement = PlacementEnum.Below;\n }\n\n }\n if (this.placement === PlacementEnum.NotYetDefined) {\n if (currentInstrument.Staves.length > 1) {\n this.placement = PlacementEnum.Below;\n } else if (currentInstrument.HasLyrics) {\n this.placement = PlacementEnum.Above;\n } else { this.placement = PlacementEnum.Below; }\n }\n }\n public read(directionNode: IXmlElement, currentMeasure: SourceMeasure, inSourceMeasureCurrentFraction: Fraction): void {\n let isTempoInstruction: boolean = false;\n let isDynamicInstruction: boolean = false;\n const n: IXmlElement = directionNode.element(\"sound\");\n if (n) {\n const tempoAttr: IXmlAttribute = n.attribute(\"tempo\");\n const dynAttr: IXmlAttribute = n.attribute(\"dynamics\");\n if (tempoAttr) {\n const match: string[] = tempoAttr.value.match(/\\d+/);\n this.soundTempo = match !== undefined ? parseInt(match[0], 10) : 100;\n currentMeasure.TempoInBPM = this.soundTempo;\n this.musicSheet.HasBPMInfo = true;\n isTempoInstruction = true;\n }\n if (dynAttr) {\n const match: string[] = dynAttr.value.match(/\\d+/);\n this.soundDynamic = match !== undefined ? parseInt(match[0], 10) : 100;\n isDynamicInstruction = true;\n }\n }\n const dirNode: IXmlElement = directionNode.element(\"direction-type\");\n if (!dirNode) {\n return;\n }\n let dirContentNode: IXmlElement = dirNode.element(\"metronome\");\n if (dirContentNode) {\n const beatUnit: IXmlElement = dirContentNode.element(\"beat-unit\");\n const dotted: boolean = dirContentNode.element(\"beat-unit-dot\") !== undefined;\n const bpm: IXmlElement = dirContentNode.element(\"per-minute\");\n // TODO check print-object = false -> don't render invisible metronome mark\n if (beatUnit !== undefined && bpm) {\n const useCurrentFractionForPositioning: boolean = (dirContentNode.hasAttributes && dirContentNode.attribute(\"default-x\") !== undefined);\n if (useCurrentFractionForPositioning) {\n this.directionTimestamp = Fraction.createFromFraction(inSourceMeasureCurrentFraction);\n }\n const bpmNumber: number = parseInt(bpm.value, 10);\n this.createNewTempoExpressionIfNeeded(currentMeasure);\n const instantaneousTempoExpression: InstantaneousTempoExpression =\n new InstantaneousTempoExpression(undefined,\n this.placement,\n this.staffNumber,\n bpmNumber,\n this.currentMultiTempoExpression,\n true);\n this.soundTempo = bpmNumber;\n currentMeasure.TempoInBPM = this.soundTempo;\n this.musicSheet.HasBPMInfo = true;\n instantaneousTempoExpression.dotted = dotted;\n instantaneousTempoExpression.beatUnit = beatUnit.value;\n this.currentMultiTempoExpression.addExpression(instantaneousTempoExpression, \"\");\n this.currentMultiTempoExpression.CombinedExpressionsText = \"test\";\n }\n return;\n }\n\n dirContentNode = dirNode.element(\"dynamics\");\n if (dirContentNode) {\n const fromNotation: boolean = directionNode.element(\"notations\") !== undefined;\n this.interpretInstantaneousDynamics(dirContentNode, currentMeasure, inSourceMeasureCurrentFraction, fromNotation);\n return;\n }\n\n dirContentNode = dirNode.element(\"words\");\n if (dirContentNode) {\n if (isTempoInstruction) {\n this.createNewTempoExpressionIfNeeded(currentMeasure);\n this.currentMultiTempoExpression.CombinedExpressionsText = dirContentNode.value;\n const instantaneousTempoExpression: InstantaneousTempoExpression =\n new InstantaneousTempoExpression(dirContentNode.value, this.placement, this.staffNumber, this.soundTempo, this.currentMultiTempoExpression);\n this.currentMultiTempoExpression.addExpression(instantaneousTempoExpression, \"\");\n } else if (!isDynamicInstruction) {\n this.interpretWords(dirContentNode, currentMeasure, inSourceMeasureCurrentFraction);\n }\n return;\n }\n\n dirContentNode = dirNode.element(\"wedge\");\n if (dirContentNode) {\n this.interpretWedge(dirContentNode, currentMeasure, inSourceMeasureCurrentFraction, currentMeasure.MeasureNumber);\n return;\n }\n }\n public checkForOpenExpressions(sourceMeasure: SourceMeasure, timestamp: Fraction): void {\n if (this.openContinuousDynamicExpression) {\n this.createNewMultiExpressionIfNeeded(sourceMeasure, timestamp);\n this.closeOpenContinuousDynamic();\n }\n if (this.openContinuousTempoExpression) {\n this.closeOpenContinuousTempo(Fraction.plus(sourceMeasure.AbsoluteTimestamp, timestamp));\n }\n }\n public addOctaveShift(directionNode: IXmlElement, currentMeasure: SourceMeasure, endTimestamp: Fraction): void {\n let octaveStaffNumber: number = 1;\n const staffNode: IXmlElement = directionNode.element(\"staff\");\n if (staffNode) {\n try {\n octaveStaffNumber = parseInt(staffNode.value, 10);\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText( \"ReaderErrorMessages/OctaveShiftStaffError\",\n \"Invalid octave shift staff number -> set to default\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n octaveStaffNumber = 1;\n log.debug(\"ExpressionReader.addOctaveShift\", errorMsg, ex);\n }\n }\n const directionTypeNode: IXmlElement = directionNode.element(\"direction-type\");\n if (directionTypeNode) {\n const octaveShiftNode: IXmlElement = directionTypeNode.element(\"octave-shift\");\n if (octaveShiftNode !== undefined && octaveShiftNode.hasAttributes) {\n try {\n if (octaveShiftNode.attribute(\"size\")) {\n const size: number = parseInt(octaveShiftNode.attribute(\"size\").value, 10);\n let octave: number = 0;\n if (size === 8) {\n octave = 1;\n } else if (size === 15) {\n octave = 2;\n }\n if (octaveShiftNode.attribute(\"type\")) {\n const type: string = octaveShiftNode.attribute(\"type\").value;\n if (type === \"up\" || type === \"down\") {\n const octaveShift: OctaveShift = new OctaveShift(type, octave);\n octaveShift.StaffNumber = octaveStaffNumber;\n this.createNewMultiExpressionIfNeeded(currentMeasure);\n this.getMultiExpression.OctaveShiftStart = octaveShift;\n octaveShift.ParentStartMultiExpression = this.getMultiExpression;\n this.openOctaveShift = octaveShift;\n } else if (type === \"stop\") {\n if (this.openOctaveShift) {\n this.createNewMultiExpressionIfNeeded(currentMeasure, endTimestamp);\n this.getMultiExpression.OctaveShiftEnd = this.openOctaveShift;\n this.openOctaveShift.ParentEndMultiExpression = this.getMultiExpression;\n this.openOctaveShift = undefined;\n }\n }\n }\n }\n } catch (ex) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/OctaveShiftError\", \"Error while reading octave shift.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"ExpressionReader.addOctaveShift\", errorMsg, ex);\n }\n }\n }\n }\n private initialize(): void {\n this.placement = PlacementEnum.NotYetDefined;\n this.soundTempo = 0;\n this.soundDynamic = 0;\n this.offsetDivisions = 0;\n }\n private readExpressionPlacement(defAttr: IXmlAttribute, catchLogMessage: string): void {\n try {\n const y: number = parseInt(defAttr.value, 10);\n if (y < 0) {\n this.placement = PlacementEnum.Below;\n } else if (y > 0) {\n this.placement = PlacementEnum.Above;\n }\n } catch (ex) {\n log.debug(\"ExpressionReader.readExpressionParameters\", catchLogMessage, ex);\n }\n\n }\n private interpretInstantaneousDynamics(dynamicsNode: IXmlElement,\n currentMeasure: SourceMeasure,\n inSourceMeasureCurrentFraction: Fraction,\n fromNotation: boolean): void {\n if (dynamicsNode.hasElements) {\n if (dynamicsNode.hasAttributes && dynamicsNode.attribute(\"default-x\")) {\n this.directionTimestamp = Fraction.createFromFraction(inSourceMeasureCurrentFraction);\n }\n let expressionText: string = dynamicsNode.elements()[0].name;\n if (expressionText === \"other-dynamics\") {\n expressionText = dynamicsNode.elements()[0].value;\n }\n if (expressionText) {\n // // ToDo: add doublettes recognition again as a afterReadingModule, as we can't check here if there is a repetition:\n // // Make here a comparison with the active dynamic expression and only add it, if there is a change in dynamic\n // // Exception is when there starts a repetition, where this might be different when repeating.\n // // see PR #767 where this was removed\n // let dynamicEnum: DynamicEnum;\n // try {\n // dynamicEnum = DynamicEnum[expressionText];\n // } catch (err) {\n // const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/DynamicError\", \"Error while reading dynamic.\");\n // this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n // return;\n // }\n // if (!this.activeInstantaneousDynamic ||\n // (this.activeInstantaneousDynamic && this.activeInstantaneousDynamic.DynEnum !== dynamicEnum)) {\n if (!fromNotation) {\n this.createNewMultiExpressionIfNeeded(currentMeasure);\n } else { this.createNewMultiExpressionIfNeeded(currentMeasure, Fraction.createFromFraction(inSourceMeasureCurrentFraction)); }\n if (this.openContinuousDynamicExpression !== undefined &&\n this.openContinuousDynamicExpression.StartMultiExpression !== this.getMultiExpression) {\n this.closeOpenContinuousDynamic();\n }\n const instantaneousDynamicExpression: InstantaneousDynamicExpression =\n new InstantaneousDynamicExpression(\n expressionText,\n this.soundDynamic,\n this.placement,\n this.staffNumber,\n currentMeasure);\n this.getMultiExpression.addExpression(instantaneousDynamicExpression, \"\");\n this.initialize();\n if (this.activeInstantaneousDynamic) {\n this.activeInstantaneousDynamic.DynEnum = instantaneousDynamicExpression.DynEnum;\n } else {\n this.activeInstantaneousDynamic = new InstantaneousDynamicExpression(expressionText, 0, PlacementEnum.NotYetDefined, 1, currentMeasure);\n }\n //}\n }\n }\n }\n private interpretWords(wordsNode: IXmlElement, currentMeasure: SourceMeasure, inSourceMeasureCurrentFraction: Fraction): void {\n const text: string = wordsNode.value;\n if (text.length > 0) {\n if (wordsNode.hasAttributes && wordsNode.attribute(\"default-x\")) {\n this.directionTimestamp = Fraction.createFromFraction(inSourceMeasureCurrentFraction);\n }\n if (this.checkIfWordsNodeIsRepetitionInstruction(text)) {\n return;\n }\n this.fillMultiOrTempoExpression(text, currentMeasure);\n this.initialize();\n }\n }\n private interpretWedge(wedgeNode: IXmlElement, currentMeasure: SourceMeasure, inSourceMeasureCurrentFraction: Fraction, currentMeasureIndex: number): void {\n if (wedgeNode !== undefined && wedgeNode.hasAttributes && wedgeNode.attribute(\"default-x\")) {\n this.directionTimestamp = Fraction.createFromFraction(inSourceMeasureCurrentFraction);\n }\n this.createNewMultiExpressionIfNeeded(currentMeasure);\n this.addWedge(wedgeNode, currentMeasure);\n this.initialize();\n }\n private createNewMultiExpressionIfNeeded(currentMeasure: SourceMeasure, timestamp: Fraction = undefined): void {\n if (!timestamp) {\n timestamp = this.directionTimestamp;\n }\n if (!this.getMultiExpression ||\n this.getMultiExpression &&\n (this.getMultiExpression.SourceMeasureParent !== currentMeasure ||\n (this.getMultiExpression.SourceMeasureParent === currentMeasure && this.getMultiExpression.Timestamp !== timestamp))) {\n this.getMultiExpression = new MultiExpression(currentMeasure, Fraction.createFromFraction(timestamp));\n currentMeasure.StaffLinkedExpressions[this.globalStaffIndex].push(this.getMultiExpression);\n }\n }\n\n private createNewTempoExpressionIfNeeded(currentMeasure: SourceMeasure): void {\n if (!this.currentMultiTempoExpression ||\n this.currentMultiTempoExpression.SourceMeasureParent !== currentMeasure ||\n this.currentMultiTempoExpression.Timestamp !== this.directionTimestamp) {\n this.currentMultiTempoExpression = new MultiTempoExpression(currentMeasure, Fraction.createFromFraction(this.directionTimestamp));\n currentMeasure.TempoExpressions.push(this.currentMultiTempoExpression);\n }\n }\n private addWedge(wedgeNode: IXmlElement, currentMeasure: SourceMeasure): void {\n if (wedgeNode !== undefined && wedgeNode.hasAttributes) {\n const type: string = wedgeNode.attribute(\"type\").value.toLowerCase();\n try {\n if (type === \"crescendo\" || type === \"diminuendo\") {\n const continuousDynamicExpression: ContinuousDynamicExpression =\n new ContinuousDynamicExpression(\n ContDynamicEnum[type],\n this.placement,\n this.staffNumber,\n currentMeasure);\n if (this.openContinuousDynamicExpression) {\n this.closeOpenContinuousDynamic();\n }\n this.openContinuousDynamicExpression = continuousDynamicExpression;\n this.getMultiExpression.StartingContinuousDynamic = continuousDynamicExpression;\n continuousDynamicExpression.StartMultiExpression = this.getMultiExpression;\n if (this.activeInstantaneousDynamic !== undefined &&\n this.activeInstantaneousDynamic.StaffNumber === continuousDynamicExpression.StaffNumber) {\n this.activeInstantaneousDynamic = undefined;\n }\n } else if (type === \"stop\") {\n if (this.openContinuousDynamicExpression) {\n this.closeOpenContinuousDynamic();\n }\n }\n } catch (ex) {\n const errorMsg: string = \"ReaderErrorMessages/WedgeError\" + \", Error while reading Crescendo / Diminuendo.\";\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n log.debug(\"ExpressionReader.addWedge\", errorMsg, ex);\n }\n }\n }\n private fillMultiOrTempoExpression(inputString: string, currentMeasure: SourceMeasure): void {\n if (!inputString) {\n return;\n }\n const tmpInputString: string = inputString.trim();\n // split string at enumerating words or signs\n //const splitStrings: string[] = tmpInputString.split(/([\\s,\\r\\n]and[\\s,\\r\\n]|[\\s,\\r\\n]und[\\s,\\r\\n]|[\\s,\\r\\n]e[\\s,\\r\\n]|[\\s,\\r\\n])+/g);\n\n //for (const splitStr of splitStrings) {\n this.createExpressionFromString(\"\", tmpInputString, currentMeasure, inputString);\n //}\n }\n /*\n private splitStringRecursive(input: [string, string], stringSeparators: string[]): [string, string][] {\n let text: string = input[1];\n let lastSeparator: string = input[0];\n let resultList: [string, string][] = [];\n for (let idx: number = 0, len: number = stringSeparators.length; idx < len; ++idx) {\n let stringSeparator: string = stringSeparators[idx];\n if (text.indexOf(stringSeparator) < 0) {\n continue;\n }\n let splitStrings: string[] = text.split(stringSeparator, StringSplitOptions.RemoveEmptyEntries);\n\n if (splitStrings.length !== 0) {\n resultList.push(...this.splitStringRecursive([lastSeparator, splitStrings[0]], stringSeparators));\n for (let index: number = 1; index < splitStrings.length; index++) {\n resultList.push(...this.splitStringRecursive([stringSeparator, splitStrings[index]], stringSeparators));\n }\n } else {\n resultList.push([\"\", stringSeparator]);\n }\n break;\n }\n if (resultList.length === 0) {\n resultList.push(input);\n }\n return resultList;\n }\n */\n private createExpressionFromString(prefix: string, stringTrimmed: string,\n currentMeasure: SourceMeasure, inputString: string): boolean {\n if (InstantaneousTempoExpression.isInputStringInstantaneousTempo(stringTrimmed) ||\n ContinuousTempoExpression.isInputStringContinuousTempo(stringTrimmed)) {\n // first check if there is already a tempo expression with the same function\n if (currentMeasure.TempoExpressions.length > 0) {\n for (let idx: number = 0, len: number = currentMeasure.TempoExpressions.length; idx < len; ++idx) {\n const multiTempoExpression: MultiTempoExpression = currentMeasure.TempoExpressions[idx];\n if (multiTempoExpression.Timestamp === this.directionTimestamp &&\n multiTempoExpression.InstantaneousTempo !== undefined &&\n multiTempoExpression.InstantaneousTempo.Label.indexOf(stringTrimmed) !== -1) {\n return false;\n }\n }\n }\n this.createNewTempoExpressionIfNeeded(currentMeasure);\n this.currentMultiTempoExpression.CombinedExpressionsText = inputString;\n if (InstantaneousTempoExpression.isInputStringInstantaneousTempo(stringTrimmed)) {\n const instantaneousTempoExpression: InstantaneousTempoExpression = new InstantaneousTempoExpression( stringTrimmed,\n this.placement,\n this.staffNumber,\n this.soundTempo,\n this.currentMultiTempoExpression);\n this.currentMultiTempoExpression.addExpression(instantaneousTempoExpression, prefix);\n return true;\n }\n if (ContinuousTempoExpression.isInputStringContinuousTempo(stringTrimmed)) {\n const continuousTempoExpression: ContinuousTempoExpression = new ContinuousTempoExpression( stringTrimmed,\n this.placement,\n this.staffNumber,\n this.currentMultiTempoExpression);\n this.currentMultiTempoExpression.addExpression(continuousTempoExpression, prefix);\n return true;\n }\n }\n if (InstantaneousDynamicExpression.isInputStringInstantaneousDynamic(stringTrimmed) ||\n ContinuousDynamicExpression.isInputStringContinuousDynamic(stringTrimmed)) {\n this.createNewMultiExpressionIfNeeded(currentMeasure);\n if (InstantaneousDynamicExpression.isInputStringInstantaneousDynamic(stringTrimmed)) {\n if (this.openContinuousDynamicExpression !== undefined && !this.openContinuousDynamicExpression.EndMultiExpression) {\n this.closeOpenContinuousDynamic();\n }\n const instantaneousDynamicExpression: InstantaneousDynamicExpression =\n new InstantaneousDynamicExpression(\n stringTrimmed,\n this.soundDynamic,\n this.placement,\n this.staffNumber,\n currentMeasure);\n this.getMultiExpression.addExpression(instantaneousDynamicExpression, prefix);\n return true;\n }\n if (ContinuousDynamicExpression.isInputStringContinuousDynamic(stringTrimmed)) {\n const continuousDynamicExpression: ContinuousDynamicExpression =\n new ContinuousDynamicExpression(\n undefined,\n this.placement,\n this.staffNumber,\n currentMeasure,\n stringTrimmed);\n if (this.openContinuousDynamicExpression !== undefined && !this.openContinuousDynamicExpression.EndMultiExpression) {\n this.closeOpenContinuousDynamic();\n }\n if (this.activeInstantaneousDynamic !== undefined && this.activeInstantaneousDynamic.StaffNumber === continuousDynamicExpression.StaffNumber) {\n this.activeInstantaneousDynamic = undefined;\n }\n this.openContinuousDynamicExpression = continuousDynamicExpression;\n continuousDynamicExpression.StartMultiExpression = this.getMultiExpression;\n this.getMultiExpression.addExpression(continuousDynamicExpression, prefix);\n return true;\n }\n }\n if (MoodExpression.isInputStringMood(stringTrimmed)) {\n this.createNewMultiExpressionIfNeeded(currentMeasure);\n const moodExpression: MoodExpression = new MoodExpression(stringTrimmed, this.placement, this.staffNumber);\n this.getMultiExpression.addExpression(moodExpression, prefix);\n return true;\n }\n\n // create unknown:\n this.createNewMultiExpressionIfNeeded(currentMeasure);\n // check here first if there might be a tempo expression doublette:\n if (currentMeasure.TempoExpressions.length > 0) {\n for (let idx: number = 0, len: number = currentMeasure.TempoExpressions.length; idx < len; ++idx) {\n const multiTempoExpression: MultiTempoExpression = currentMeasure.TempoExpressions[idx];\n if (multiTempoExpression.Timestamp === this.directionTimestamp &&\n multiTempoExpression.InstantaneousTempo !== undefined &&\n multiTempoExpression.EntriesList.length > 0 &&\n !this.hasDigit(stringTrimmed)) {\n // if at other parts of the score\n if (this.globalStaffIndex > 0) {\n // don't add duplicate TempoExpression\n if (multiTempoExpression.EntriesList[0].label.indexOf(stringTrimmed) >= 0) {\n return false;\n } else {\n break;\n }\n }\n }\n }\n }\n let textAlignment: TextAlignmentEnum = TextAlignmentEnum.CenterBottom;\n if (this.musicSheet.Rules.CompactMode) {\n textAlignment = TextAlignmentEnum.LeftBottom;\n }\n const unknownExpression: UnknownExpression = new UnknownExpression(\n stringTrimmed, this.placement, textAlignment, this.staffNumber);\n this.getMultiExpression.addExpression(unknownExpression, prefix);\n\n return false;\n }\n private closeOpenContinuousDynamic(): void {\n this.openContinuousDynamicExpression.EndMultiExpression = this.getMultiExpression;\n this.getMultiExpression.EndingContinuousDynamic = this.openContinuousDynamicExpression;\n this.openContinuousDynamicExpression = undefined;\n }\n private closeOpenContinuousTempo(endTimestamp: Fraction): void {\n this.openContinuousTempoExpression.AbsoluteEndTimestamp = endTimestamp;\n this.openContinuousTempoExpression = undefined;\n }\n private checkIfWordsNodeIsRepetitionInstruction(inputString: string): boolean {\n inputString = inputString.trim().toLowerCase();\n if (inputString === \"coda\" ||\n inputString === \"tocoda\" ||\n inputString === \"to coda\" ||\n inputString === \"fine\" ||\n inputString === \"d.c.\" ||\n inputString === \"dacapo\" ||\n inputString === \"da capo\" ||\n inputString === \"d.s.\" ||\n inputString === \"dalsegno\" ||\n inputString === \"dal segno\" ||\n inputString === \"d.c. al fine\" ||\n inputString === \"d.s. al fine\" ||\n inputString === \"d.c. al coda\" ||\n inputString === \"d.s. al coda\") {\n return true;\n }\n return false;\n }\n private hasDigit(input: string): boolean {\n return /\\d/.test(input);\n }\n}\n","import {PlacementEnum, AbstractExpression} from \"./AbstractExpression\";\n\nexport class MoodExpression extends AbstractExpression {\n constructor(label: string, placement: PlacementEnum, staffNumber: number) {\n super(placement);\n this.label = label;\n this.staffNumber = staffNumber;\n this.setMoodType();\n }\n\n private static listMoodAffettuoso: string[] = [\"affettuoso\"];\n private static listMoodAgitato: string[] = [\"agitato\"];\n private static listMoodAppassionato: string[] = [\"appassionato\"];\n private static listMoodAnimato: string[] = [\"animato\", \"lively\"];\n private static listMoodBrillante: string[] = [\"brillante\"];\n private static listMoodCantabile: string[] = [\"cantabile\"];\n private static listMoodDolce: string[] = [\"dolce\"];\n private static listMoodEnergico: string[] = [\"energico\"];\n private static listMoodEroico: string[] = [\"eroico\"];\n private static listMoodEspressivo: string[] = [\"espressivo\"];\n private static listMoodFurioso: string[] = [\"furioso\"];\n private static listMoodGiocoso: string[] = [\"giocoso\"];\n private static listMoodGioioso: string[] = [\"gioioso\"];\n private static listMoodLacrimoso: string[] = [\"lacrimoso\"];\n private static listMoodGrandioso: string[] = [\"grandioso\"];\n private static listMoodGrazioso: string[] = [\"grazioso\"];\n private static listMoodLeggiero: string[] = [\"leggiero\"];\n private static listMoodMaestoso: string[] = [\"maestoso\"];\n private static listMoodMalinconico: string[] = [\"malinconico\"];\n private static listMoodMarcato: string[] = [\"marcato\"];\n private static listMoodMarziale: string[] = [\"marziale\"];\n private static listMoodMesto: string[] = [\"mesto\"];\n private static listMoodMorendo: string[] = [\"morendo\"];\n private static listMoodNobilmente: string[] = [\"nobilmente\"];\n private static listMoodPatetico: string[] = [\"patetico\"];\n private static listMoodPesante: string[] = [\"pesante\"];\n private static listMoodSautille: string[] = [\"sautille\"];\n private static listMoodSaltando: string[] = [\"saltando\"];\n private static listMoodScherzando: string[] = [\"scherzando\"];\n private static listMoodSostenuto: string[] = [\"sostenuto\"];\n private static listMoodSpiccato: string[] = [\"spiccato\"];\n private static listMoodTenerezza: string[] = [\"tenerezza\"];\n private static listMoodTranquillamente: string[] = [\"tranquillamente\"];\n private static listMoodTrionfante: string[] = [\"trionfante\"];\n\n private moodType: MoodEnum;\n private label: string;\n private staffNumber: number;\n\n public static isInputStringMood(inputString: string): boolean {\n if (!inputString) {\n return false;\n }\n return (\n MoodExpression.isStringInStringList(MoodExpression.listMoodAffettuoso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodAgitato, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodAnimato, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodAppassionato, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodBrillante, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodCantabile, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodDolce, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodEnergico, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodEroico, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodEspressivo, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodFurioso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodGiocoso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodGioioso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodGrandioso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodGrazioso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodLacrimoso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodLeggiero, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodMaestoso, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodMalinconico, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodMarcato, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodMarziale, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodMesto, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodMorendo, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodNobilmente, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodPatetico, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodPesante, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodSaltando, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodSautille, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodScherzando, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodSostenuto, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodSpiccato, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodTenerezza, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodTranquillamente, inputString)\n || MoodExpression.isStringInStringList(MoodExpression.listMoodTrionfante, inputString)\n );\n }\n\n public get Label(): string {\n return this.label;\n }\n public set Label(value: string) {\n this.label = value;\n }\n public get Mood(): MoodEnum {\n return this.moodType;\n }\n public set Mood(value: MoodEnum) {\n this.moodType = value;\n }\n public get StaffNumber(): number {\n return this.staffNumber;\n }\n public set StaffNumber(value: number) {\n this.staffNumber = value;\n }\n public get Placement(): PlacementEnum {\n return this.placement;\n }\n public set Placement(value: PlacementEnum) {\n this.placement = value;\n }\n\n private setMoodType(): void {\n if (MoodExpression.isStringInStringList(MoodExpression.listMoodAffettuoso, this.label)) {\n this.moodType = MoodEnum.Affettuoso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodAgitato, this.label)) {\n this.moodType = MoodEnum.Agitato;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodAnimato, this.label)) {\n this.moodType = MoodEnum.Animato;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodAppassionato, this.label)) {\n this.moodType = MoodEnum.Appassionato;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodBrillante, this.label)) {\n this.moodType = MoodEnum.Brillante;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodCantabile, this.label)) {\n this.moodType = MoodEnum.Cantabile;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodDolce, this.label)) {\n this.moodType = MoodEnum.Dolce;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodEnergico, this.label)) {\n this.moodType = MoodEnum.Energico;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodEroico, this.label)) {\n this.moodType = MoodEnum.Eroico;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodEspressivo, this.label)) {\n this.moodType = MoodEnum.Espressivo;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodFurioso, this.label)) {\n this.moodType = MoodEnum.Furioso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodGiocoso, this.label)) {\n this.moodType = MoodEnum.Giocoso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodGioioso, this.label)) {\n this.moodType = MoodEnum.Gioioso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodGrandioso, this.label)) {\n this.moodType = MoodEnum.Grandioso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodGrazioso, this.label)) {\n this.moodType = MoodEnum.Grazioso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodLacrimoso, this.label)) {\n this.moodType = MoodEnum.Lacrimoso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodLeggiero, this.label)) {\n this.moodType = MoodEnum.Leggiero;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodMaestoso, this.label)) {\n this.moodType = MoodEnum.Maestoso;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodMalinconico, this.label)) {\n this.moodType = MoodEnum.Malinconico;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodMarcato, this.label)) {\n this.moodType = MoodEnum.Marcato;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodMarziale, this.label)) {\n this.moodType = MoodEnum.Marziale;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodMesto, this.label)) {\n this.moodType = MoodEnum.Mesto;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodMorendo, this.label)) {\n this.moodType = MoodEnum.Morendo;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodNobilmente, this.label)) {\n this.moodType = MoodEnum.Nobilmente;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodPatetico, this.label)) {\n this.moodType = MoodEnum.Patetico;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodPesante, this.label)) {\n this.moodType = MoodEnum.Pesante;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodSaltando, this.label)) {\n this.moodType = MoodEnum.Saltando;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodSautille, this.label)) {\n this.moodType = MoodEnum.Sautille;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodScherzando, this.label)) {\n this.moodType = MoodEnum.Scherzando;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodSostenuto, this.label)) {\n this.moodType = MoodEnum.Sostenuto;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodSpiccato, this.label)) {\n this.moodType = MoodEnum.Spiccato;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodTenerezza, this.label)) {\n this.moodType = MoodEnum.Tenerezza;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodTranquillamente, this.label)) {\n this.moodType = MoodEnum.Tranquillamente;\n } else if (MoodExpression.isStringInStringList(MoodExpression.listMoodTrionfante, this.label)) {\n this.moodType = MoodEnum.Trionfante;\n }\n }\n}\n\nexport enum MoodEnum {\n Affettuoso = 0,\n Agitato = 1,\n Appassionato = 2,\n Animato = 3,\n Brillante = 4,\n Cantabile = 5,\n Dolce = 6,\n Energico = 7,\n Eroico = 8,\n Espressivo = 9,\n Furioso = 10,\n Giocoso = 11,\n Gioioso = 12,\n Lacrimoso = 13,\n Grandioso = 14,\n Grazioso = 15,\n Leggiero = 16,\n Maestoso = 17,\n Malinconico = 18,\n Marcato = 19,\n Marziale = 20,\n Mesto = 21,\n Morendo = 22,\n Nobilmente = 23,\n Patetico = 24,\n Pesante = 25,\n Sautille = 26,\n Saltando = 27,\n Scherzando = 28,\n Sostenuto = 29,\n Spiccato = 30,\n Tenerezza = 31,\n Tranquillamente = 32,\n Trionfante = 33,\n Vivace = 34\n}\n","import {PlacementEnum, AbstractExpression} from \"./AbstractExpression\";\nimport {TextAlignmentEnum} from \"../../../Common/Enums/TextAlignment\";\n\nexport class UnknownExpression extends AbstractExpression {\n constructor(label: string, placement: PlacementEnum, textAlignment: TextAlignmentEnum, staffNumber: number) {\n super(placement);\n this.label = label;\n this.staffNumber = staffNumber;\n if (textAlignment === undefined) { // don't replace undefined check\n textAlignment = TextAlignmentEnum.LeftBottom;\n }\n this.textAlignment = textAlignment;\n }\n private label: string;\n private textAlignment: TextAlignmentEnum;\n private staffNumber: number;\n\n public get Label(): string {\n return this.label;\n }\n public get Placement(): PlacementEnum {\n return this.placement;\n }\n public set Placement(value: PlacementEnum) {\n this.placement = value;\n }\n public get StaffNumber(): number {\n return this.staffNumber;\n }\n public set StaffNumber(value: number) {\n this.staffNumber = value;\n }\n public get TextAlignment(): TextAlignmentEnum {\n return this.textAlignment;\n }\n}\n","import { MusicSheet } from \"../../MusicSheet\";\nimport { IXmlElement, IXmlAttribute } from \"../../../Common/FileIO/Xml\";\nimport { Slur } from \"../../VoiceData/Expressions/ContinuousExpressions/Slur\";\nimport { Note } from \"../../VoiceData/Note\";\nimport log from \"loglevel\";\nimport { ITextTranslation } from \"../../Interfaces/ITextTranslation\";\n\nexport class SlurReader {\n private musicSheet: MusicSheet;\n private openSlurDict: { [_: number]: Slur; } = {};\n constructor(musicSheet: MusicSheet) {\n this.musicSheet = musicSheet;\n }\n public addSlur(slurNodes: IXmlElement[], currentNote: Note): void {\n try {\n if (slurNodes) {\n for (const slurNode of slurNodes) {\n if (slurNode.attributes().length > 0) {\n const type: string = slurNode.attribute(\"type\").value;\n let slurNumber: number = 1;\n try {\n const slurNumberAttribute: IXmlAttribute = slurNode.attribute(\"number\");\n if (slurNumberAttribute) {\n slurNumber = parseInt(slurNode.attribute(\"number\").value, 10);\n }\n } catch (ex) {\n log.debug(\"VoiceGenerator.addSlur number: \", ex);\n }\n\n if (type === \"start\") {\n let slur: Slur = this.openSlurDict[slurNumber];\n if (!slur) {\n slur = new Slur();\n this.openSlurDict[slurNumber] = slur;\n }\n slur.StartNote = currentNote;\n } else if (type === \"stop\") {\n const slur: Slur = this.openSlurDict[slurNumber];\n if (slur) {\n slur.EndNote = currentNote;\n // check if not already a slur with same notes has been given:\n if (!currentNote.checkForDoubleSlur(slur)) {\n // if not, link slur to notes:\n currentNote.NoteSlurs.push(slur);\n const slurStartNote: Note = slur.StartNote;\n slurStartNote.NoteSlurs.push(slur);\n }\n delete this.openSlurDict[slurNumber];\n }\n }\n }\n }\n }\n } catch (err) {\n const errorMsg: string = ITextTranslation.translateText(\"ReaderErrorMessages/SlurError\", \"Error while reading slur.\");\n this.musicSheet.SheetErrors.pushMeasureError(errorMsg);\n }\n }\n}\n","import {Instrument} from \"./Instrument\";\nimport {MidiInstrument} from \"./VoiceData/Instructions/ClefInstruction\";\nimport log from \"loglevel\";\n\nexport class SubInstrument {\n\n constructor(parentInstrument: Instrument) {\n this.parentInstrument = parentInstrument;\n this.fixedKey = -1;\n this.name = this.parseMidiInstrument(this.parentInstrument.Name);\n this.midiInstrumentID = SubInstrument.midiInstrument[this.name];\n this.volume = 1.0;\n }\n\n private static midiInstrument: { [key: string]: MidiInstrument; } = {\n \"alt\": MidiInstrument.Synth_Voice,\n \"alto\": MidiInstrument.Synth_Voice,\n \"banjo\": MidiInstrument.Banjo,\n \"bariton\": MidiInstrument.Synth_Voice,\n \"baritone\": MidiInstrument.Synth_Voice,\n \"bass\": MidiInstrument.Synth_Voice,\n \"blockflöte\": MidiInstrument.Recorder,\n \"brass\": MidiInstrument.Trombone,\n \"bratsche\": MidiInstrument.Viola,\n \"cello\": MidiInstrument.Cello,\n \"clarinet\": MidiInstrument.Clarinet,\n \"contrabass\": MidiInstrument.Contrabass,\n \"drums\": MidiInstrument.Percussion,\n \"flute\": MidiInstrument.Flute,\n \"flöte\": MidiInstrument.Flute,\n \"frenchhorn\": MidiInstrument.French_Horn,\n \"gitarre\": MidiInstrument.Acoustic_Guitar_nylon,\n \"guitar\": MidiInstrument.Acoustic_Guitar_nylon,\n \"harfe\": MidiInstrument.Orchestral_Harp,\n \"harp\": MidiInstrument.Orchestral_Harp,\n \"klarinette\": MidiInstrument.Clarinet,\n \"klavier\": MidiInstrument.Acoustic_Grand_Piano,\n \"kontrabass\": MidiInstrument.Contrabass,\n \"oboe\": MidiInstrument.Oboe,\n \"organ\": MidiInstrument.Church_Organ,\n \"orgel\": MidiInstrument.Church_Organ,\n \"orgue\": MidiInstrument.Church_Organ,\n \"percussion\": MidiInstrument.Percussion,\n \"piano\": MidiInstrument.Acoustic_Grand_Piano,\n \"piccolo\": MidiInstrument.Piccolo,\n \"posaune\": MidiInstrument.Trombone,\n \"recorder\": MidiInstrument.Recorder,\n \"sax\": MidiInstrument.Tenor_Sax,\n \"schlagwerk\": MidiInstrument.Percussion,\n \"schlagzeug\": MidiInstrument.Percussion,\n \"sopran\": MidiInstrument.Synth_Voice,\n \"steeldrum\": MidiInstrument.Steel_Drums,\n \"streicher\": MidiInstrument.String_Ensemble_1,\n \"strings\": MidiInstrument.String_Ensemble_1,\n \"tenor\": MidiInstrument.Synth_Voice,\n \"tpt\": MidiInstrument.Trumpet,\n \"trombone\": MidiInstrument.Trombone,\n \"trompete\": MidiInstrument.Trumpet,\n \"trumpet\": MidiInstrument.Trumpet,\n \"tuba\": MidiInstrument.Tuba,\n \"unnamed\": MidiInstrument.Acoustic_Grand_Piano,\n \"viola\": MidiInstrument.Viola,\n \"violin\": MidiInstrument.Violin,\n \"violon-c\": MidiInstrument.Cello,\n \"violon.\": MidiInstrument.Violin,\n \"voice\": MidiInstrument.Synth_Voice,\n \"woodblock\": MidiInstrument.Woodblock\n };\n\n public idString: string;\n public midiInstrumentID: MidiInstrument;\n public volume: number;\n public pan: number;\n public fixedKey: number;\n public name: string;\n\n private parentInstrument: Instrument;\n\n public get ParentInstrument(): Instrument {\n return this.parentInstrument;\n }\n public static isPianoInstrument(instrument: MidiInstrument): boolean {\n return (instrument === MidiInstrument.Acoustic_Grand_Piano\n || instrument === MidiInstrument.Bright_Acoustic_Piano\n || instrument === MidiInstrument.Electric_Grand_Piano\n || instrument === MidiInstrument.Electric_Piano_1\n || instrument === MidiInstrument.Electric_Piano_2);\n }\n public setMidiInstrument(instrumentType: string): void {\n this.midiInstrumentID = SubInstrument.midiInstrument[this.parseMidiInstrument(instrumentType)];\n }\n\n private parseMidiInstrument(instrumentType: string): string {\n // FIXME: test this function\n try {\n // find the best match for the given instrumentType:\n if (instrumentType) {\n const tmpName: string = instrumentType.toLowerCase().trim();\n for (const key in SubInstrument.midiInstrument) {\n if (tmpName.indexOf(key) !== -1) {\n return key;\n }\n }\n }\n // if the instrumentType didn't work, use the name:\n if (this.parentInstrument.Name) {\n const tmpName: string = this.parentInstrument.Name.toLowerCase().trim();\n for (const key in SubInstrument.midiInstrument) {\n if (tmpName.indexOf(key) !== -1) {\n return key;\n }\n }\n }\n } catch (e) {\n log.error(\"Error parsing MIDI Instrument. Default to Grand Piano.\");\n }\n return \"unnamed\";\n }\n\n}\n","import {RepetitionInstructionReader} from \"./MusicSymbolModules/RepetitionInstructionReader\";\nimport {RepetitionCalculator} from \"./MusicSymbolModules/RepetitionCalculator\";\n\nexport class MusicSymbolModuleFactory {\n public static createRepetitionInstructionReader(): RepetitionInstructionReader {\n return new RepetitionInstructionReader();\n }\n\n public static createRepetitionCalculator(): RepetitionCalculator {\n return new RepetitionCalculator();\n }\n\n /*\n public static createExpressionGenerator(musicSheet: MusicSheet,\n instrument: Instrument, staffNumber: number): ExpressionReader {\n return new ExpressionReader(musicSheet, instrument, staffNumber);\n }\n\n public static createSlurReader(musicSheet: MusicSheet): SlurReader {\n return new SlurReader(musicSheet);\n }\n\n public static createLyricsReader(musicSheet: MusicSheet): LyricsReader {\n return new LyricsReader(musicSheet);\n }\n\n public static createArticulationReader(): ArticulationReader {\n return new ArticulationReader();\n }\n */\n}\n","import {MusicSheet} from \"../../MusicSheet\";\nimport {IXmlElement} from \"../../../Common/FileIO/Xml\";\nimport {SourceMeasure} from \"../../VoiceData/SourceMeasure\";\nimport {RepetitionInstruction, RepetitionInstructionEnum, AlignmentType} from \"../../VoiceData/Instructions/RepetitionInstruction\";\nimport {RepetitionInstructionComparer} from \"../../VoiceData/Instructions/RepetitionInstruction\";\nimport {StringUtil} from \"../../../Common/Strings/StringUtil\";\nexport class RepetitionInstructionReader {\n /**\n * A global list of all repetition instructions in the musicsheet.\n */\n public repetitionInstructions: RepetitionInstruction[];\n public xmlMeasureList: IXmlElement[][];\n private musicSheet: MusicSheet;\n private currentMeasureIndex: number;\n\n public set MusicSheet(value: MusicSheet) {\n this.musicSheet = value;\n this.xmlMeasureList = new Array(this.musicSheet.Instruments.length);\n this.repetitionInstructions = [];\n }\n\n /**\n * is called when starting reading an xml measure\n * @param measure\n * @param currentMeasureIndex\n */\n public prepareReadingMeasure(measure: SourceMeasure, currentMeasureIndex: number): void {\n this.currentMeasureIndex = currentMeasureIndex;\n }\n\n public handleLineRepetitionInstructions(barlineNode: IXmlElement): boolean {\n let pieceEndingDetected: boolean = false;\n if (barlineNode.elements().length > 0) {\n let location: string = \"\";\n let hasRepeat: boolean = false;\n let direction: string = \"\";\n let type: string = \"\";\n let style: string = \"\";\n const endingIndices: number[] = [];\n\n // read barline style\n const styleNode: IXmlElement = barlineNode.element(\"bar-style\");\n\n // if location is ommited in Xml, right is implied (from documentation)\n if (styleNode) {\n style = styleNode.value;\n }\n if (barlineNode.attributes().length > 0 && barlineNode.attribute(\"location\")) {\n location = barlineNode.attribute(\"location\").value;\n } else {\n location = \"right\";\n }\n const barlineNodeElements: IXmlElement[] = barlineNode.elements();\n\n // read repeat- or ending line information\n for (let idx: number = 0, len: number = barlineNodeElements.length; idx < len; ++idx) {\n const childNode: IXmlElement = barlineNodeElements[idx];\n if (\"repeat\" === childNode.name && childNode.hasAttributes) {\n hasRepeat = true;\n direction = childNode.attribute(\"direction\").value;\n } else if ( \"ending\" === childNode.name && childNode.hasAttributes &&\n childNode.attribute(\"type\") !== undefined && childNode.attribute(\"number\")) {\n type = childNode.attribute(\"type\").value;\n const num: string = childNode.attribute(\"number\").value;\n\n // Parse the given ending indices:\n // handle cases like: \"1, 2\" or \"1 + 2\" or even \"1 - 3, 6\"\n const separatedEndingIndices: string[] = num.split(\"[,+]\");\n for (let idx2: number = 0, len2: number = separatedEndingIndices.length; idx2 < len2; ++idx2) {\n const separatedEndingIndex: string = separatedEndingIndices[idx2];\n const indices: string[] = separatedEndingIndex.match(\"[0-9]\");\n\n // check if possibly something like \"1-3\" is given..\n if (separatedEndingIndex.search(\"-\") !== -1 && indices.length === 2) {\n const startIndex: number = parseInt(indices[0], 10);\n const endIndex: number = parseInt(indices[1], 10);\n for (let index: number = startIndex; index <= endIndex; index++) {\n endingIndices.push(index);\n }\n } else {\n for (let idx3: number = 0, len3: number = indices.length; idx3 < len3; ++idx3) {\n const index: string = indices[idx3];\n endingIndices.push(parseInt(index, 10));\n }\n }\n }\n }\n }\n\n // reset measure counter if not lastMeasure\n if (style === \"light-heavy\" && endingIndices.length === 0 && !hasRepeat) {\n pieceEndingDetected = true;\n }\n if (hasRepeat || endingIndices.length > 0) {\n if (location === \"left\") {\n if (type === \"start\") {\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(this.currentMeasureIndex, RepetitionInstructionEnum.Ending,\n AlignmentType.Begin, undefined, endingIndices);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n }\n if (direction === \"forward\") {\n // start new Repetition\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(this.currentMeasureIndex, RepetitionInstructionEnum.StartLine);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n }\n } else { // location right\n if (type === \"stop\") {\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(this.currentMeasureIndex, RepetitionInstructionEnum.Ending,\n AlignmentType.End, undefined, endingIndices);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n }\n if (direction === \"backward\") {\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(this.currentMeasureIndex, RepetitionInstructionEnum.BackJumpLine);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n }\n }\n }\n }\n return pieceEndingDetected;\n }\n\n public handleRepetitionInstructionsFromWordsOrSymbols(directionTypeNode: IXmlElement, relativeMeasurePosition: number): boolean {\n const wordsNode: IXmlElement = directionTypeNode.element(\"words\");\n if (wordsNode) {\n const dsRegEx: string = \"d\\\\s?\\\\.s\\\\.\"; // Input for new RegExp(). TS eliminates the first \\\n // must Trim string and ToLower before compare\n const innerText: string = wordsNode.value.trim().toLowerCase();\n if (StringUtil.StringContainsSeparatedWord(innerText, dsRegEx + \" al fine\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5 && this.currentMeasureIndex < this.xmlMeasureList[0].length - 1) { // not in last measure\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.DalSegnoAlFine);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n const dcRegEx: string = \"d\\\\.\\\\s?c\\\\.\";\n if (StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + \" al coda\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5) {\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.DalSegnoAlCoda);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + \" al fine\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5 && this.currentMeasureIndex < this.xmlMeasureList[0].length - 1) { // not in last measure\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.DaCapoAlFine);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, dcRegEx + \" al coda\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5) {\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.DaCapoAlCoda);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, dcRegEx) ||\n StringUtil.StringContainsSeparatedWord(innerText, \"da\\\\s?capo\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5 && this.currentMeasureIndex < this.xmlMeasureList[0].length - 1) { // not in last measure\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.DaCapo);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, dsRegEx) ||\n StringUtil.StringContainsSeparatedWord(innerText, \"dal\\\\s?segno\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5 && this.currentMeasureIndex < this.xmlMeasureList[0].length - 1) { // not in last measure\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.DalSegno);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, \"to\\\\s?coda\") ||\n StringUtil.StringContainsSeparatedWord(innerText, \"a (la )?coda\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5) {\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.ToCoda);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, \"fine\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition < 0.5) {\n measureIndex--;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.Fine);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, \"coda\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition > 0.5) {\n measureIndex++;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.Coda);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n if (StringUtil.StringContainsSeparatedWord(innerText, \"segno\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition > 0.5) {\n measureIndex++;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.Segno);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n } else if (directionTypeNode.element(\"segno\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition > 0.5) {\n measureIndex++;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.Segno);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n } else if (directionTypeNode.element(\"coda\")) {\n let measureIndex: number = this.currentMeasureIndex;\n if (relativeMeasurePosition > 0.5) {\n measureIndex++;\n }\n const newInstruction: RepetitionInstruction = new RepetitionInstruction(measureIndex, RepetitionInstructionEnum.Coda);\n this.addInstruction(this.repetitionInstructions, newInstruction);\n return true;\n }\n return false;\n }\n\n public removeRedundantInstructions(): void {\n let segnoCount: number = 0;\n let codaCount: number = 0;\n //const fineCount: number = 0;\n let toCodaCount: number = 0;\n let dalSegnaCount: number = 0;\n for (let index: number = 0; index < this.repetitionInstructions.length; index++) {\n const instruction: RepetitionInstruction = this.repetitionInstructions[index];\n switch (instruction.type) {\n case RepetitionInstructionEnum.Coda:\n if (toCodaCount > 0) {\n if (this.findInstructionInPreviousMeasure(index, instruction.measureIndex, RepetitionInstructionEnum.ToCoda)) {\n instruction.type = RepetitionInstructionEnum.None;\n }\n }\n if (codaCount === 0 && toCodaCount === 0) {\n instruction.type = RepetitionInstructionEnum.ToCoda;\n instruction.alignment = AlignmentType.End;\n instruction.measureIndex--;\n }\n break;\n case RepetitionInstructionEnum.Segno:\n if (segnoCount - dalSegnaCount > 0) { // two segnos in a row\n let foundInstruction: boolean = false;\n for (let idx: number = 0, len: number = this.repetitionInstructions.length; idx < len; ++idx) {\n const instr: RepetitionInstruction = this.repetitionInstructions[idx];\n if (instruction.measureIndex - instr.measureIndex === 1) {\n switch (instr.type) {\n case RepetitionInstructionEnum.BackJumpLine:\n if (toCodaCount - codaCount > 0) { // open toCoda existing\n instr.type = RepetitionInstructionEnum.DalSegnoAlCoda;\n } else {\n instr.type = RepetitionInstructionEnum.DalSegno;\n }\n instruction.type = RepetitionInstructionEnum.None;\n foundInstruction = true;\n break;\n case RepetitionInstructionEnum.DalSegno:\n case RepetitionInstructionEnum.DalSegnoAlFine:\n case RepetitionInstructionEnum.DalSegnoAlCoda:\n instruction.type = RepetitionInstructionEnum.None;\n foundInstruction = true;\n break;\n default:\n break;\n }\n }\n if (foundInstruction) {\n break;\n }\n }\n if (foundInstruction) {\n break;\n }\n // convert to dal segno instruction:\n if (toCodaCount - codaCount > 0) { // open toCoda existing\n instruction.type = RepetitionInstructionEnum.DalSegnoAlCoda;\n } else {\n instruction.type = RepetitionInstructionEnum.DalSegno;\n }\n instruction.alignment = AlignmentType.End;\n instruction.measureIndex--;\n }\n break;\n default:\n break;\n }\n\n // check if this instruction already exists or is otherwise redundant:\n if (this.backwardSearchForPreviousIdenticalInstruction(index, instruction) || instruction.type === RepetitionInstructionEnum.None) {\n this.repetitionInstructions.splice(index, 1);\n index--;\n } else {\n switch (instruction.type) {\n case RepetitionInstructionEnum.Fine:\n //fineCount++;\n break;\n case RepetitionInstructionEnum.ToCoda:\n toCodaCount++;\n break;\n case RepetitionInstructionEnum.Coda:\n codaCount++;\n break;\n case RepetitionInstructionEnum.Segno:\n segnoCount++;\n break;\n case RepetitionInstructionEnum.DalSegnoAlFine:\n case RepetitionInstructionEnum.DalSegnoAlCoda:\n dalSegnaCount++;\n break;\n default:\n break;\n }\n }\n }\n this.repetitionInstructions.sort(RepetitionInstructionComparer.Compare);\n }\n\n private findInstructionInPreviousMeasure(currentInstructionIndex: number, currentMeasureIndex: number, searchedType: RepetitionInstructionEnum): boolean {\n for (let index: number = currentInstructionIndex - 1; index >= 0; index--) {\n const instruction: RepetitionInstruction = this.repetitionInstructions[index];\n if (currentMeasureIndex - instruction.measureIndex === 1 && instruction.type === searchedType) {\n return true;\n }\n }\n return false;\n }\n\n private backwardSearchForPreviousIdenticalInstruction(currentInstructionIndex: number, currentInstruction: RepetitionInstruction): boolean {\n for (let index: number = currentInstructionIndex - 1; index >= 0; index--) {\n const instruction: RepetitionInstruction = this.repetitionInstructions[index];\n if (instruction.equals(currentInstruction)) {\n return true;\n }\n }\n return false;\n }\n\n private addInstruction(currentRepetitionInstructions: RepetitionInstruction[], newInstruction: RepetitionInstruction): void {\n let addInstruction: boolean = true;\n for (let idx: number = 0, len: number = currentRepetitionInstructions.length; idx < len; ++idx) {\n const repetitionInstruction: RepetitionInstruction = currentRepetitionInstructions[idx];\n if (newInstruction.equals(repetitionInstruction)) {\n addInstruction = false;\n break;\n }\n }\n if (addInstruction) {\n currentRepetitionInstructions.push(newInstruction);\n }\n }\n}\n","import {SourceMeasure} from \"../../VoiceData/SourceMeasure\";\nimport {RepetitionInstruction, RepetitionInstructionEnum, AlignmentType} from \"../../VoiceData/Instructions/RepetitionInstruction\";\nimport {RepetitionInstructionComparer} from \"../../VoiceData/Instructions/RepetitionInstruction\";\nimport {ArgumentOutOfRangeException} from \"../../Exceptions\";\nimport {MusicSheet} from \"../../MusicSheet\";\n\nexport class RepetitionCalculator {\n private musicSheet: MusicSheet;\n private repetitionInstructions: RepetitionInstruction[] = [];\n private currentMeasure: SourceMeasure;\n private currentMeasureIndex: number;\n\n /**\n * Is called when all repetition symbols have been read from xml.\n * Creates the repetition instructions and adds them to the corresponding measure.\n * Creates the logical repetition objects for iteration and playback.\n * @param musicSheet\n * @param repetitionInstructions\n */\n public calculateRepetitions(musicSheet: MusicSheet, repetitionInstructions: RepetitionInstruction[]): void {\n this.musicSheet = musicSheet;\n this.repetitionInstructions = repetitionInstructions;\n const sourceMeasures: SourceMeasure[] = this.musicSheet.SourceMeasures;\n for (let idx: number = 0, len: number = this.repetitionInstructions.length; idx < len; ++idx) {\n const instruction: RepetitionInstruction = this.repetitionInstructions[idx];\n this.currentMeasureIndex = instruction.measureIndex;\n this.currentMeasure = sourceMeasures[this.currentMeasureIndex];\n this.handleRepetitionInstructions(instruction);\n }\n\n // if there are more than one instruction at measure begin or end,\n // sort them according to the nesting of the repetitions:\n for (let idx: number = 0, len: number = this.musicSheet.SourceMeasures.length; idx < len; ++idx) {\n const measure: SourceMeasure = this.musicSheet.SourceMeasures[idx];\n if (measure.FirstRepetitionInstructions.length > 1) {\n measure.FirstRepetitionInstructions.sort(RepetitionInstructionComparer.Compare);\n }\n if (measure.LastRepetitionInstructions.length > 1) {\n measure.LastRepetitionInstructions.sort(RepetitionInstructionComparer.Compare);\n }\n }\n }\n\n private handleRepetitionInstructions(currentRepetitionInstruction: RepetitionInstruction): boolean {\n if (!this.currentMeasure) {\n return false;\n }\n switch (currentRepetitionInstruction.type) {\n case RepetitionInstructionEnum.StartLine:\n this.currentMeasure.FirstRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.BackJumpLine:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.Ending:\n // set ending start or end\n if (currentRepetitionInstruction.alignment === AlignmentType.Begin) { // ending start\n this.currentMeasure.FirstRepetitionInstructions.push(currentRepetitionInstruction);\n } else { // ending end\n for (let idx: number = 0, len: number = currentRepetitionInstruction.endingIndices.length; idx < len; ++idx) {\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n }\n }\n break;\n case RepetitionInstructionEnum.Segno:\n this.currentMeasure.FirstRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.Fine:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.ToCoda:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.Coda:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.DaCapo:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.DalSegno:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.DalSegnoAlFine:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.DaCapoAlFine:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.DalSegnoAlCoda:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.DaCapoAlCoda:\n this.currentMeasure.LastRepetitionInstructions.push(currentRepetitionInstruction);\n break;\n case RepetitionInstructionEnum.None:\n break;\n default:\n throw new ArgumentOutOfRangeException(\"currentRepetitionInstruction\");\n }\n return true;\n }\n}\n","// created from 'create-ts-index'\n\nexport * from \"./Exceptions\";\nexport * from \"./Instrument\";\nexport * from \"./InstrumentalGroup\";\nexport * from \"./Label\";\nexport * from \"./MusicSheet\";\nexport * from \"./SubInstrument\";\nexport * from \"./VoiceData\";\nexport * from \"./MusicSource\";\nexport * from \"./ScoreIO\";\nexport * from \"./Graphical\";\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\nvar Dictionary_1 = require(\"./Dictionary\");\nvar Set_1 = require(\"./Set\");\nvar Bag = /** @class */ (function () {\n /**\n * Creates an empty bag.\n * @class

A bag is a special kind of set in which members are\n * allowed to appear more than once.

\n *

If the inserted elements are custom objects a function\n * which converts elements to unique strings must be provided. Example:

\n *\n *
\n     * function petToString(pet) {\n     *  return pet.name;\n     * }\n     * 
\n *\n * @constructor\n * @param {function(Object):string=} toStrFunction optional function used\n * to convert elements to strings. If the elements aren't strings or if toString()\n * is not appropriate, a custom function which receives an object and returns a\n * unique string must be provided.\n */\n function Bag(toStrFunction) {\n this.toStrF = toStrFunction || util.defaultToString;\n this.dictionary = new Dictionary_1.default(this.toStrF);\n this.nElements = 0;\n }\n /**\n * Adds nCopies of the specified object to this bag.\n * @param {Object} element element to add.\n * @param {number=} nCopies the number of copies to add, if this argument is\n * undefined 1 copy is added.\n * @return {boolean} true unless element is undefined.\n */\n Bag.prototype.add = function (element, nCopies) {\n if (nCopies === void 0) { nCopies = 1; }\n if (util.isUndefined(element) || nCopies <= 0) {\n return false;\n }\n if (!this.contains(element)) {\n var node = {\n value: element,\n copies: nCopies\n };\n this.dictionary.setValue(element, node);\n }\n else {\n this.dictionary.getValue(element).copies += nCopies;\n }\n this.nElements += nCopies;\n return true;\n };\n /**\n * Counts the number of copies of the specified object in this bag.\n * @param {Object} element the object to search for..\n * @return {number} the number of copies of the object, 0 if not found\n */\n Bag.prototype.count = function (element) {\n if (!this.contains(element)) {\n return 0;\n }\n else {\n return this.dictionary.getValue(element).copies;\n }\n };\n /**\n * Returns true if this bag contains the specified element.\n * @param {Object} element element to search for.\n * @return {boolean} true if this bag contains the specified element,\n * false otherwise.\n */\n Bag.prototype.contains = function (element) {\n return this.dictionary.containsKey(element);\n };\n /**\n * Removes nCopies of the specified object to this bag.\n * If the number of copies to remove is greater than the actual number\n * of copies in the Bag, all copies are removed.\n * @param {Object} element element to remove.\n * @param {number=} nCopies the number of copies to remove, if this argument is\n * undefined 1 copy is removed.\n * @return {boolean} true if at least 1 element was removed.\n */\n Bag.prototype.remove = function (element, nCopies) {\n if (nCopies === void 0) { nCopies = 1; }\n if (util.isUndefined(element) || nCopies <= 0) {\n return false;\n }\n if (!this.contains(element)) {\n return false;\n }\n else {\n var node = this.dictionary.getValue(element);\n if (nCopies > node.copies) {\n this.nElements -= node.copies;\n }\n else {\n this.nElements -= nCopies;\n }\n node.copies -= nCopies;\n if (node.copies <= 0) {\n this.dictionary.remove(element);\n }\n return true;\n }\n };\n /**\n * Returns an array containing all of the elements in this big in arbitrary order,\n * including multiple copies.\n * @return {Array} an array containing all of the elements in this bag.\n */\n Bag.prototype.toArray = function () {\n var a = [];\n var values = this.dictionary.values();\n for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {\n var node = values_1[_i];\n var element = node.value;\n var copies = node.copies;\n for (var j = 0; j < copies; j++) {\n a.push(element);\n }\n }\n return a;\n };\n /**\n * Returns a set of unique elements in this bag.\n * @return {collections.Set} a set of unique elements in this bag.\n */\n Bag.prototype.toSet = function () {\n var toret = new Set_1.default(this.toStrF);\n var elements = this.dictionary.values();\n for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {\n var ele = elements_1[_i];\n var value = ele.value;\n toret.add(value);\n }\n return toret;\n };\n /**\n * Executes the provided function once for each element\n * present in this bag, including multiple copies.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element. To break the iteration you can\n * optionally return false.\n */\n Bag.prototype.forEach = function (callback) {\n this.dictionary.forEach(function (k, v) {\n var value = v.value;\n var copies = v.copies;\n for (var i = 0; i < copies; i++) {\n if (callback(value) === false) {\n return false;\n }\n }\n return true;\n });\n };\n /**\n * Returns the number of elements in this bag.\n * @return {number} the number of elements in this bag.\n */\n Bag.prototype.size = function () {\n return this.nElements;\n };\n /**\n * Returns true if this bag contains no elements.\n * @return {boolean} true if this bag contains no elements.\n */\n Bag.prototype.isEmpty = function () {\n return this.nElements === 0;\n };\n /**\n * Removes all of the elements from this bag.\n */\n Bag.prototype.clear = function () {\n this.nElements = 0;\n this.dictionary.clear();\n };\n return Bag;\n}()); // End of bag\nexports.default = Bag;\n//# sourceMappingURL=Bag.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BSTreeKV_1 = require(\"./BSTreeKV\");\n/**\n * Special-case of the binary search tree in which the search key is equal to the element type.\n * This definition is suitable when the element type can not be split between what defines its order\n * and what does not (eg. primitive types as opposed to indexed records).\n *\n * The table below shows some use-case examples for both interfaces:\n *\n * element type | most suitable interface\n * ------------------------------------|----------------------------\n * number | BSTree\n * string | BSTree\n * { order: number, data: string } | BSTreeKV<{order: number}, {order: number, data: string}>\n *\n * @see BSTreeKV\n */\nvar BSTree = /** @class */ (function (_super) {\n __extends(BSTree, _super);\n function BSTree() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return BSTree;\n}(BSTreeKV_1.default));\nexports.default = BSTree;\n//# sourceMappingURL=BSTree.js.map","\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Dictionary_1 = require(\"./Dictionary\");\nvar util = require(\"./util\");\n/**\n * This class is used by the LinkedDictionary Internally\n * Has to be a class, not an interface, because it needs to have\n * the 'unlink' function defined.\n */\nvar LinkedDictionaryPair = /** @class */ (function () {\n function LinkedDictionaryPair(key, value) {\n this.key = key;\n this.value = value;\n }\n LinkedDictionaryPair.prototype.unlink = function () {\n this.prev.next = this.next;\n this.next.prev = this.prev;\n };\n return LinkedDictionaryPair;\n}());\n/**\n * The head and tail elements of the list have null key and value properties but they\n * usually link to normal nodes.\n */\nvar HeadOrTailLinkedDictionaryPair = /** @class */ (function () {\n function HeadOrTailLinkedDictionaryPair() {\n this.key = null;\n this.value = null;\n }\n HeadOrTailLinkedDictionaryPair.prototype.unlink = function () {\n this.prev.next = this.next;\n this.next.prev = this.prev;\n };\n return HeadOrTailLinkedDictionaryPair;\n}());\nfunction isHeadOrTailLinkedDictionaryPair(p) {\n return !p.next;\n}\nvar LinkedDictionary = /** @class */ (function (_super) {\n __extends(LinkedDictionary, _super);\n function LinkedDictionary(toStrFunction) {\n var _this = _super.call(this, toStrFunction) || this;\n _this.head = new HeadOrTailLinkedDictionaryPair();\n _this.tail = new HeadOrTailLinkedDictionaryPair();\n _this.head.next = _this.tail;\n _this.tail.prev = _this.head;\n return _this;\n }\n /**\n * Inserts the new node to the 'tail' of the list, updating the\n * neighbors, and moving 'this.tail' (the End of List indicator) that\n * to the end.\n */\n LinkedDictionary.prototype.appendToTail = function (entry) {\n var lastNode = this.tail.prev;\n lastNode.next = entry;\n entry.prev = lastNode;\n entry.next = this.tail;\n this.tail.prev = entry;\n };\n /**\n * Retrieves a linked dictionary from the table internally\n */\n LinkedDictionary.prototype.getLinkedDictionaryPair = function (key) {\n if (util.isUndefined(key)) {\n return undefined;\n }\n var k = '$' + this.toStr(key);\n var pair = (this.table[k]);\n return pair;\n };\n /**\n * Returns the value to which this dictionary maps the specified key.\n * Returns undefined if this dictionary contains no mapping for this key.\n * @param {Object} key key whose associated value is to be returned.\n * @return {*} the value to which this dictionary maps the specified key or\n * undefined if the map contains no mapping for this key.\n */\n LinkedDictionary.prototype.getValue = function (key) {\n var pair = this.getLinkedDictionaryPair(key);\n if (!util.isUndefined(pair)) {\n return pair.value;\n }\n return undefined;\n };\n /**\n * Removes the mapping for this key from this dictionary if it is present.\n * Also, if a value is present for this key, the entry is removed from the\n * insertion ordering.\n * @param {Object} key key whose mapping is to be removed from the\n * dictionary.\n * @return {*} previous value associated with specified key, or undefined if\n * there was no mapping for key.\n */\n LinkedDictionary.prototype.remove = function (key) {\n var pair = this.getLinkedDictionaryPair(key);\n if (!util.isUndefined(pair)) {\n _super.prototype.remove.call(this, key); // This will remove it from the table\n pair.unlink(); // This will unlink it from the chain\n return pair.value;\n }\n return undefined;\n };\n /**\n * Removes all mappings from this LinkedDictionary.\n * @this {collections.LinkedDictionary}\n */\n LinkedDictionary.prototype.clear = function () {\n _super.prototype.clear.call(this);\n this.head.next = this.tail;\n this.tail.prev = this.head;\n };\n /**\n * Internal function used when updating an existing KeyValue pair.\n * It places the new value indexed by key into the table, but maintains\n * its place in the linked ordering.\n */\n LinkedDictionary.prototype.replace = function (oldPair, newPair) {\n var k = '$' + this.toStr(newPair.key);\n // set the new Pair's links to existingPair's links\n newPair.next = oldPair.next;\n newPair.prev = oldPair.prev;\n // Delete Existing Pair from the table, unlink it from chain.\n // As a result, the nElements gets decremented by this operation\n this.remove(oldPair.key);\n // Link new Pair in place of where oldPair was,\n // by pointing the old pair's neighbors to it.\n newPair.prev.next = newPair;\n newPair.next.prev = newPair;\n this.table[k] = newPair;\n // To make up for the fact that the number of elements was decremented,\n // We need to increase it by one.\n ++this.nElements;\n };\n /**\n * Associates the specified value with the specified key in this dictionary.\n * If the dictionary previously contained a mapping for this key, the old\n * value is replaced by the specified value.\n * Updating of a key that already exists maintains its place in the\n * insertion order into the map.\n * @param {Object} key key with which the specified value is to be\n * associated.\n * @param {Object} value value to be associated with the specified key.\n * @return {*} previous value associated with the specified key, or undefined if\n * there was no mapping for the key or if the key/value are undefined.\n */\n LinkedDictionary.prototype.setValue = function (key, value) {\n if (util.isUndefined(key) || util.isUndefined(value)) {\n return undefined;\n }\n var existingPair = this.getLinkedDictionaryPair(key);\n var newPair = new LinkedDictionaryPair(key, value);\n var k = '$' + this.toStr(key);\n // If there is already an element for that key, we\n // keep it's place in the LinkedList\n if (!util.isUndefined(existingPair)) {\n this.replace(existingPair, newPair);\n return existingPair.value;\n }\n else {\n this.appendToTail(newPair);\n this.table[k] = newPair;\n ++this.nElements;\n return undefined;\n }\n };\n /**\n * Returns an array containing all of the keys in this LinkedDictionary, ordered\n * by insertion order.\n * @return {Array} an array containing all of the keys in this LinkedDictionary,\n * ordered by insertion order.\n */\n LinkedDictionary.prototype.keys = function () {\n var array = [];\n this.forEach(function (key, value) {\n array.push(key);\n });\n return array;\n };\n /**\n * Returns an array containing all of the values in this LinkedDictionary, ordered by\n * insertion order.\n * @return {Array} an array containing all of the values in this LinkedDictionary,\n * ordered by insertion order.\n */\n LinkedDictionary.prototype.values = function () {\n var array = [];\n this.forEach(function (key, value) {\n array.push(value);\n });\n return array;\n };\n /**\n * Executes the provided function once for each key-value pair\n * present in this LinkedDictionary. It is done in the order of insertion\n * into the LinkedDictionary\n * @param {function(Object,Object):*} callback function to execute, it is\n * invoked with two arguments: key and value. To break the iteration you can\n * optionally return false.\n */\n LinkedDictionary.prototype.forEach = function (callback) {\n var crawlNode = this.head.next;\n while (!isHeadOrTailLinkedDictionaryPair(crawlNode)) {\n var ret = callback(crawlNode.key, crawlNode.value);\n if (ret === false) {\n return;\n }\n crawlNode = crawlNode.next;\n }\n };\n return LinkedDictionary;\n}(Dictionary_1.default)); // End of LinkedDictionary\nexports.default = LinkedDictionary;\n// /**\n// * Returns true if this dictionary is equal to the given dictionary.\n// * Two dictionaries are equal if they contain the same mappings.\n// * @param {collections.Dictionary} other the other dictionary.\n// * @param {function(Object,Object):boolean=} valuesEqualFunction optional\n// * function used to check if two values are equal.\n// * @return {boolean} true if this dictionary is equal to the given dictionary.\n// */\n// collections.Dictionary.prototype.equals = function(other,valuesEqualFunction) {\n// \tconst eqF = valuesEqualFunction || collections.defaultEquals;\n// \tif(!(other instanceof collections.Dictionary)){\n// \t\treturn false;\n// \t}\n// \tif(this.size() !== other.size()){\n// \t\treturn false;\n// \t}\n// \treturn this.equalsAux(this.firstNode,other.firstNode,eqF);\n// }\n//# sourceMappingURL=LinkedDictionary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\nvar Dictionary_1 = require(\"./Dictionary\");\nvar arrays = require(\"./arrays\");\nvar MultiDictionary = /** @class */ (function () {\n /**\n * Creates an empty multi dictionary.\n * @class

A multi dictionary is a special kind of dictionary that holds\n * multiple values against each key. Setting a value into the dictionary will\n * add the value to an array at that key. Getting a key will return an array,\n * holding all the values set to that key.\n * You can configure to allow duplicates in the values.\n * This implementation accepts any kind of objects as keys.

\n *\n *

If the keys are custom objects a function which converts keys to strings must be\n * provided. Example:

\n *\n *
\n     * function petToString(pet) {\n     *     return pet.name;\n     * }\n     * 
\n *

If the values are custom objects a function to check equality between values\n * must be provided. Example:

\n *\n *
\n     * function petsAreEqualByAge(pet1,pet2) {\n     *     return pet1.age === pet2.age;\n     * }\n     * 
\n * @constructor\n * @param {function(Object):string=} toStrFunction optional function\n * to convert keys to strings. If the keys aren't strings or if toString()\n * is not appropriate, a custom function which receives a key and returns a\n * unique string must be provided.\n * @param {function(Object,Object):boolean=} valuesEqualsFunction optional\n * function to check if two values are equal.\n *\n * @param allowDuplicateValues\n */\n function MultiDictionary(toStrFunction, valuesEqualsFunction, allowDuplicateValues) {\n if (allowDuplicateValues === void 0) { allowDuplicateValues = false; }\n this.dict = new Dictionary_1.default(toStrFunction);\n this.equalsF = valuesEqualsFunction || util.defaultEquals;\n this.allowDuplicate = allowDuplicateValues;\n }\n /**\n * Returns an array holding the values to which this dictionary maps\n * the specified key.\n * Returns an empty array if this dictionary contains no mappings for this key.\n * @param {Object} key key whose associated values are to be returned.\n * @return {Array} an array holding the values to which this dictionary maps\n * the specified key.\n */\n MultiDictionary.prototype.getValue = function (key) {\n var values = this.dict.getValue(key);\n if (util.isUndefined(values)) {\n return [];\n }\n return arrays.copy(values);\n };\n /**\n * Adds the value to the array associated with the specified key, if\n * it is not already present.\n * @param {Object} key key with which the specified value is to be\n * associated.\n * @param {Object} value the value to add to the array at the key\n * @return {boolean} true if the value was not already associated with that key.\n */\n MultiDictionary.prototype.setValue = function (key, value) {\n if (util.isUndefined(key) || util.isUndefined(value)) {\n return false;\n }\n var array = this.dict.getValue(key);\n if (util.isUndefined(array)) {\n this.dict.setValue(key, [value]);\n return true;\n }\n if (!this.allowDuplicate) {\n if (arrays.contains(array, value, this.equalsF)) {\n return false;\n }\n }\n array.push(value);\n return true;\n };\n /**\n * Removes the specified values from the array of values associated with the\n * specified key. If a value isn't given, all values associated with the specified\n * key are removed.\n * @param {Object} key key whose mapping is to be removed from the\n * dictionary.\n * @param {Object=} value optional argument to specify the value to remove\n * from the array associated with the specified key.\n * @return {*} true if the dictionary changed, false if the key doesn't exist or\n * if the specified value isn't associated with the specified key.\n */\n MultiDictionary.prototype.remove = function (key, value) {\n if (util.isUndefined(value)) {\n var v = this.dict.remove(key);\n return !util.isUndefined(v);\n }\n var array = this.dict.getValue(key);\n if (!util.isUndefined(array) && arrays.remove(array, value, this.equalsF)) {\n if (array.length === 0) {\n this.dict.remove(key);\n }\n return true;\n }\n return false;\n };\n /**\n * Returns an array containing all of the keys in this dictionary.\n * @return {Array} an array containing all of the keys in this dictionary.\n */\n MultiDictionary.prototype.keys = function () {\n return this.dict.keys();\n };\n /**\n * Returns an array containing all of the values in this dictionary.\n * @return {Array} an array containing all of the values in this dictionary.\n */\n MultiDictionary.prototype.values = function () {\n var values = this.dict.values();\n var array = [];\n for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {\n var v = values_1[_i];\n for (var _a = 0, v_1 = v; _a < v_1.length; _a++) {\n var w = v_1[_a];\n array.push(w);\n }\n }\n return array;\n };\n /**\n * Returns true if this dictionary at least one value associatted the specified key.\n * @param {Object} key key whose presence in this dictionary is to be\n * tested.\n * @return {boolean} true if this dictionary at least one value associatted\n * the specified key.\n */\n MultiDictionary.prototype.containsKey = function (key) {\n return this.dict.containsKey(key);\n };\n /**\n * Removes all mappings from this dictionary.\n */\n MultiDictionary.prototype.clear = function () {\n this.dict.clear();\n };\n /**\n * Returns the number of keys in this dictionary.\n * @return {number} the number of key-value mappings in this dictionary.\n */\n MultiDictionary.prototype.size = function () {\n return this.dict.size();\n };\n /**\n * Returns true if this dictionary contains no mappings.\n * @return {boolean} true if this dictionary contains no mappings.\n */\n MultiDictionary.prototype.isEmpty = function () {\n return this.dict.isEmpty();\n };\n return MultiDictionary;\n}()); // end of multi dictionary\nexports.default = MultiDictionary;\n//# sourceMappingURL=MultiDictionary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util = require(\"./util\");\nvar Heap_1 = require(\"./Heap\");\nvar PriorityQueue = /** @class */ (function () {\n /**\n * Creates an empty priority queue.\n * @class

In a priority queue each element is associated with a \"priority\",\n * elements are dequeued in highest-priority-first order (the elements with the\n * highest priority are dequeued first). Priority Queues are implemented as heaps.\n * If the inserted elements are custom objects a compare function must be provided,\n * otherwise the <=, === and >= operators are used to compare object priority.

\n *
\n     * function compare(a, b) {\n     *  if (a is less than b by some ordering criterion) {\n     *     return -1;\n     *  } if (a is greater than b by the ordering criterion) {\n     *     return 1;\n     *  }\n     *  // a must be equal to b\n     *  return 0;\n     * }\n     * 
\n * @constructor\n * @param {function(Object,Object):number=} compareFunction optional\n * function used to compare two element priorities. Must return a negative integer,\n * zero, or a positive integer as the first argument is less than, equal to,\n * or greater than the second.\n */\n function PriorityQueue(compareFunction) {\n this.heap = new Heap_1.default(util.reverseCompareFunction(compareFunction));\n }\n /**\n * Inserts the specified element into this priority queue.\n * @param {Object} element the element to insert.\n * @return {boolean} true if the element was inserted, or false if it is undefined.\n */\n PriorityQueue.prototype.enqueue = function (element) {\n return this.heap.add(element);\n };\n /**\n * Inserts the specified element into this priority queue.\n * @param {Object} element the element to insert.\n * @return {boolean} true if the element was inserted, or false if it is undefined.\n */\n PriorityQueue.prototype.add = function (element) {\n return this.heap.add(element);\n };\n /**\n * Retrieves and removes the highest priority element of this queue.\n * @return {*} the the highest priority element of this queue,\n * or undefined if this queue is empty.\n */\n PriorityQueue.prototype.dequeue = function () {\n if (this.heap.size() !== 0) {\n var el = this.heap.peek();\n this.heap.removeRoot();\n return el;\n }\n return undefined;\n };\n /**\n * Retrieves, but does not remove, the highest priority element of this queue.\n * @return {*} the highest priority element of this queue, or undefined if this queue is empty.\n */\n PriorityQueue.prototype.peek = function () {\n return this.heap.peek();\n };\n /**\n * Returns true if this priority queue contains the specified element.\n * @param {Object} element element to search for.\n * @return {boolean} true if this priority queue contains the specified element,\n * false otherwise.\n */\n PriorityQueue.prototype.contains = function (element) {\n return this.heap.contains(element);\n };\n /**\n * Checks if this priority queue is empty.\n * @return {boolean} true if and only if this priority queue contains no items; false\n * otherwise.\n */\n PriorityQueue.prototype.isEmpty = function () {\n return this.heap.isEmpty();\n };\n /**\n * Returns the number of elements in this priority queue.\n * @return {number} the number of elements in this priority queue.\n */\n PriorityQueue.prototype.size = function () {\n return this.heap.size();\n };\n /**\n * Removes all of the elements from this priority queue.\n */\n PriorityQueue.prototype.clear = function () {\n this.heap.clear();\n };\n /**\n * Executes the provided function once for each element present in this queue in\n * no particular order.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element value, to break the iteration you can\n * optionally return false.\n */\n PriorityQueue.prototype.forEach = function (callback) {\n this.heap.forEach(callback);\n };\n return PriorityQueue;\n}()); // end of priority queue\nexports.default = PriorityQueue;\n//# sourceMappingURL=PriorityQueue.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar LinkedList_1 = require(\"./LinkedList\");\nvar Stack = /** @class */ (function () {\n /**\n * Creates an empty Stack.\n * @class A Stack is a Last-In-First-Out (LIFO) data structure, the last\n * element added to the stack will be the first one to be removed. This\n * implementation uses a linked list as a container.\n * @constructor\n */\n function Stack() {\n this.list = new LinkedList_1.default();\n }\n /**\n * Pushes an item onto the top of this stack.\n * @param {Object} elem the element to be pushed onto this stack.\n * @return {boolean} true if the element was pushed or false if it is undefined.\n */\n Stack.prototype.push = function (elem) {\n return this.list.add(elem, 0);\n };\n /**\n * Pushes an item onto the top of this stack.\n * @param {Object} elem the element to be pushed onto this stack.\n * @return {boolean} true if the element was pushed or false if it is undefined.\n */\n Stack.prototype.add = function (elem) {\n return this.list.add(elem, 0);\n };\n /**\n * Removes the object at the top of this stack and returns that object.\n * @return {*} the object at the top of this stack or undefined if the\n * stack is empty.\n */\n Stack.prototype.pop = function () {\n return this.list.removeElementAtIndex(0);\n };\n /**\n * Looks at the object at the top of this stack without removing it from the\n * stack.\n * @return {*} the object at the top of this stack or undefined if the\n * stack is empty.\n */\n Stack.prototype.peek = function () {\n return this.list.first();\n };\n /**\n * Returns the number of elements in this stack.\n * @return {number} the number of elements in this stack.\n */\n Stack.prototype.size = function () {\n return this.list.size();\n };\n /**\n * Returns true if this stack contains the specified element.\n *

If the elements inside this stack are\n * not comparable with the === operator, a custom equals function should be\n * provided to perform searches, the function must receive two arguments and\n * return true if they are equal, false otherwise. Example:

\n *\n *
\n     * const petsAreEqualByName (pet1, pet2) {\n     *  return pet1.name === pet2.name;\n     * }\n     * 
\n * @param {Object} elem element to search for.\n * @param {function(Object,Object):boolean=} equalsFunction optional\n * function to check if two elements are equal.\n * @return {boolean} true if this stack contains the specified element,\n * false otherwise.\n */\n Stack.prototype.contains = function (elem, equalsFunction) {\n return this.list.contains(elem, equalsFunction);\n };\n /**\n * Checks if this stack is empty.\n * @return {boolean} true if and only if this stack contains no items; false\n * otherwise.\n */\n Stack.prototype.isEmpty = function () {\n return this.list.isEmpty();\n };\n /**\n * Removes all of the elements from this stack.\n */\n Stack.prototype.clear = function () {\n this.list.clear();\n };\n /**\n * Executes the provided function once for each element present in this stack in\n * LIFO order.\n * @param {function(Object):*} callback function to execute, it is\n * invoked with one argument: the element value, to break the iteration you can\n * optionally return false.\n */\n Stack.prototype.forEach = function (callback) {\n this.list.forEach(callback);\n };\n return Stack;\n}()); // End of stack\nexports.default = Stack;\n//# sourceMappingURL=Stack.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Direction;\n(function (Direction) {\n Direction[Direction[\"BEFORE\"] = 0] = \"BEFORE\";\n Direction[Direction[\"AFTER\"] = 1] = \"AFTER\";\n Direction[Direction[\"INSIDE_AT_END\"] = 2] = \"INSIDE_AT_END\";\n Direction[Direction[\"INSIDE_AT_START\"] = 3] = \"INSIDE_AT_START\";\n})(Direction || (Direction = {}));\nvar MultiRootTree = /** @class */ (function () {\n function MultiRootTree(rootIds, nodes) {\n if (rootIds === void 0) { rootIds = []; }\n if (nodes === void 0) { nodes = {}; }\n this.rootIds = rootIds;\n this.nodes = nodes;\n this.initRootIds();\n this.initNodes();\n }\n MultiRootTree.prototype.initRootIds = function () {\n for (var _i = 0, _a = this.rootIds; _i < _a.length; _i++) {\n var rootId = _a[_i];\n this.createEmptyNodeIfNotExist(rootId);\n }\n };\n MultiRootTree.prototype.initNodes = function () {\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n for (var _i = 0, _a = this.nodes[nodeKey]; _i < _a.length; _i++) {\n var nodeListItem = _a[_i];\n this.createEmptyNodeIfNotExist(nodeListItem);\n }\n }\n }\n };\n MultiRootTree.prototype.createEmptyNodeIfNotExist = function (nodeKey) {\n if (!this.nodes[nodeKey]) {\n this.nodes[nodeKey] = [];\n }\n };\n MultiRootTree.prototype.getRootIds = function () {\n var clone = this.rootIds.slice();\n return clone;\n };\n MultiRootTree.prototype.getNodes = function () {\n var clone = {};\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n clone[nodeKey] = this.nodes[nodeKey].slice();\n }\n }\n return clone;\n };\n MultiRootTree.prototype.getObject = function () {\n return {\n rootIds: this.getRootIds(),\n nodes: this.getNodes(),\n };\n };\n MultiRootTree.prototype.toObject = function () {\n return this.getObject();\n };\n MultiRootTree.prototype.flatten = function () {\n var _this = this;\n var extraPropsObject = [];\n for (var i = 0; i < this.rootIds.length; i++) {\n var rootId = this.rootIds[i];\n extraPropsObject.push({\n id: rootId,\n level: 0,\n hasParent: false,\n childrenCount: 0,\n });\n traverse(rootId, this.nodes, extraPropsObject, 0);\n }\n for (var _i = 0, extraPropsObject_1 = extraPropsObject; _i < extraPropsObject_1.length; _i++) {\n var o = extraPropsObject_1[_i];\n o.childrenCount = countChildren(o.id);\n }\n return extraPropsObject;\n function countChildren(id) {\n if (!_this.nodes[id]) {\n return 0;\n }\n else {\n var childrenCount = _this.nodes[id].length;\n return childrenCount;\n }\n }\n function traverse(startId, nodes, returnArray, level) {\n if (level === void 0) { level = 0; }\n if (!startId || !nodes || !returnArray || !nodes[startId]) {\n return;\n }\n level++;\n var idsList = nodes[startId];\n for (var i = 0; i < idsList.length; i++) {\n var id = idsList[i];\n returnArray.push({ id: id, level: level, hasParent: true });\n traverse(id, nodes, returnArray, level);\n }\n level--;\n }\n };\n MultiRootTree.prototype.moveIdBeforeId = function (moveId, beforeId) {\n return this.moveId(moveId, beforeId, Direction.BEFORE);\n };\n MultiRootTree.prototype.moveIdAfterId = function (moveId, afterId) {\n return this.moveId(moveId, afterId, Direction.AFTER);\n };\n MultiRootTree.prototype.moveIdIntoId = function (moveId, insideId, atStart) {\n if (atStart === void 0) { atStart = true; }\n if (atStart) {\n return this.moveId(moveId, insideId, Direction.INSIDE_AT_START);\n }\n else {\n return this.moveId(moveId, insideId, Direction.INSIDE_AT_END);\n }\n };\n MultiRootTree.prototype.swapRootIdWithRootId = function (rootId, withRootId) {\n var leftIndex = this.findRootId(rootId);\n var rightIndex = this.findRootId(withRootId);\n this.swapRootPositionWithRootPosition(leftIndex, rightIndex);\n };\n MultiRootTree.prototype.swapRootPositionWithRootPosition = function (swapRootPosition, withRootPosition) {\n var temp = this.rootIds[withRootPosition];\n this.rootIds[withRootPosition] = this.rootIds[swapRootPosition];\n this.rootIds[swapRootPosition] = temp;\n };\n MultiRootTree.prototype.deleteId = function (id) {\n this.rootDeleteId(id);\n this.nodeAndSubNodesDelete(id);\n this.nodeRefrencesDelete(id);\n };\n MultiRootTree.prototype.insertIdBeforeId = function (beforeId, insertId) {\n var foundRootIdIndex = this.findRootId(beforeId);\n if (foundRootIdIndex > -1) {\n this.insertIdIntoRoot(insertId, foundRootIdIndex);\n }\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n var foundNodeIdIndex = this.findNodeId(nodeKey, beforeId);\n if (foundNodeIdIndex > -1) {\n this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex);\n }\n }\n }\n };\n MultiRootTree.prototype.insertIdAfterId = function (belowId, insertId) {\n var foundRootIdIndex = this.findRootId(belowId);\n if (foundRootIdIndex > -1) {\n this.insertIdIntoRoot(insertId, foundRootIdIndex + 1);\n }\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n var foundNodeIdIndex = this.findNodeId(nodeKey, belowId);\n if (foundNodeIdIndex > -1) {\n this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex + 1);\n }\n }\n }\n };\n MultiRootTree.prototype.insertIdIntoId = function (insideId, insertId) {\n this.nodeInsertAtEnd(insideId, insertId);\n this.nodes[insertId] = [];\n };\n MultiRootTree.prototype.insertIdIntoRoot = function (id, position) {\n if (position === undefined) {\n this.rootInsertAtEnd(id);\n }\n else {\n if (position < 0) {\n var length_1 = this.rootIds.length;\n this.rootIds.splice((position + length_1 + 1), 0, id);\n }\n else {\n this.rootIds.splice(position, 0, id);\n }\n }\n this.nodes[id] = this.nodes[id] || [];\n };\n MultiRootTree.prototype.insertIdIntoNode = function (nodeKey, id, position) {\n this.nodes[nodeKey] = this.nodes[nodeKey] || [];\n this.nodes[id] = this.nodes[id] || [];\n if (position === undefined) {\n this.nodeInsertAtEnd(nodeKey, id);\n }\n else {\n if (position < 0) {\n var length_2 = this.nodes[nodeKey].length;\n this.nodes[nodeKey].splice((position + length_2 + 1), 0, id);\n }\n else {\n this.nodes[nodeKey].splice(position, 0, id);\n }\n }\n };\n MultiRootTree.prototype.moveId = function (moveId, beforeId, direction) {\n var sourceId = moveId;\n var sourceRootIndex = this.findRootId(sourceId);\n var sourceNodeKey;\n var sourceNodeIdIndex;\n if (this.nodes[beforeId]) {\n sourceNodeKey = beforeId;\n }\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n sourceNodeIdIndex = this.findNodeId(nodeKey, beforeId);\n break;\n }\n }\n // got all\n var targetId = beforeId;\n var targetRootIndex = this.findRootId(targetId);\n var targetNodeKey;\n var targetNodeIdIndex;\n if (this.nodes[beforeId]) {\n targetNodeKey = beforeId;\n }\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n targetNodeIdIndex = this.findNodeId(nodeKey, beforeId);\n break;\n }\n }\n // got all\n if (sourceRootIndex > -1) {\n if (targetRootIndex > -1) {\n // moving root to root\n // console.log(`Moving ROOT to ROOT`);\n // console.log(`RootIds:`);\n // console.log(this.rootIds);\n // console.log(`TargetIndex=${targetRootIndex}, SourceIndex=${sourceRootIndex}`);\n // console.log(`TargetId=${targetId}, SourceId=${sourceId}`);\n this.rootDelete(sourceRootIndex); // indexes change now\n if (targetRootIndex > sourceRootIndex) {\n targetRootIndex--;\n }\n else {\n }\n switch (direction) {\n case Direction.BEFORE:\n this.insertIdIntoRoot(sourceId, targetRootIndex);\n break;\n case Direction.AFTER:\n this.insertIdIntoRoot(sourceId, targetRootIndex + 1);\n break;\n case Direction.INSIDE_AT_START:\n this.nodeInsertAtStart(targetId, sourceId);\n break;\n case Direction.INSIDE_AT_END:\n this.nodeInsertAtEnd(targetId, sourceId);\n break;\n }\n }\n else {\n // moving root (source) ABOVE node (target)\n // will remove one entry from roots\n this.rootDelete(sourceRootIndex);\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n var index = this.findNodeId(nodeKey, targetId);\n if (index > -1) {\n switch (direction) {\n case Direction.BEFORE:\n this.insertIdIntoNode(nodeKey, sourceId, index);\n break;\n case Direction.AFTER:\n this.insertIdIntoNode(nodeKey, sourceId, index + 1);\n break;\n case Direction.INSIDE_AT_START:\n this.nodeInsertAtStart(targetId, sourceId);\n break;\n case Direction.INSIDE_AT_END:\n this.nodeInsertAtEnd(targetId, sourceId);\n break;\n }\n break;\n }\n }\n }\n }\n }\n else {\n if (targetRootIndex > -1) {\n // moving node (source) ABOVE root (target)\n // delete source id from each node\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n var index = this.findNodeId(nodeKey, sourceId);\n if (index > -1) {\n // this.nodeInsertId(nodeKey, sourceId, index);\n this.nodeDeleteAtIndex(nodeKey, index);\n break;\n }\n }\n }\n switch (direction) {\n case Direction.BEFORE:\n this.insertIdIntoRoot(sourceId, targetRootIndex);\n break;\n case Direction.AFTER:\n this.insertIdIntoRoot(sourceId, targetRootIndex + 1);\n break;\n case Direction.INSIDE_AT_START:\n this.nodeInsertAtStart(targetId, sourceId);\n break;\n case Direction.INSIDE_AT_END:\n this.nodeInsertAtEnd(targetId, sourceId);\n break;\n }\n }\n else {\n // moving node (source) ABOVE node (target)\n // delete source id from each node\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n var index = this.findNodeId(nodeKey, sourceId);\n if (index > -1) {\n this.nodeDeleteAtIndex(nodeKey, index);\n break;\n }\n }\n }\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n var index = this.findNodeId(nodeKey, targetId);\n if (index > -1) {\n switch (direction) {\n case Direction.BEFORE:\n this.insertIdIntoNode(nodeKey, sourceId, index);\n break;\n case Direction.AFTER:\n this.insertIdIntoNode(nodeKey, sourceId, index + 1);\n break;\n case Direction.INSIDE_AT_START:\n this.nodeInsertAtStart(targetId, sourceId);\n break;\n case Direction.INSIDE_AT_END:\n this.nodeInsertAtEnd(targetId, sourceId);\n break;\n }\n break;\n }\n }\n }\n }\n }\n };\n MultiRootTree.prototype.swapArrayElements = function (arr, indexA, indexB) {\n var temp = arr[indexA];\n arr[indexA] = arr[indexB];\n arr[indexB] = temp;\n return arr;\n };\n MultiRootTree.prototype.rootDeleteId = function (id) {\n var index = this.findRootId(id);\n if (index > -1) {\n this.rootDelete(index);\n }\n };\n MultiRootTree.prototype.nodeAndSubNodesDelete = function (nodeKey) {\n var toDeleteLater = [];\n for (var i = 0; i < this.nodes[nodeKey].length; i++) {\n var id = this.nodes[nodeKey][i];\n this.nodeAndSubNodesDelete(id);\n toDeleteLater.push(nodeKey);\n }\n this.nodeDelete(nodeKey);\n for (var i = 0; i < toDeleteLater.length; i++) {\n this.nodeDelete(toDeleteLater[i]);\n }\n };\n MultiRootTree.prototype.nodeRefrencesDelete = function (id) {\n for (var nodeKey in this.nodes) {\n if (this.nodes.hasOwnProperty(nodeKey)) {\n for (var i = 0; i < this.nodes[nodeKey].length; i++) {\n var targetId = this.nodes[nodeKey][i];\n if (targetId === id) {\n this.nodeDeleteAtIndex(nodeKey, i);\n }\n }\n }\n }\n };\n MultiRootTree.prototype.nodeDelete = function (nodeKey) {\n delete this.nodes[nodeKey];\n };\n MultiRootTree.prototype.findRootId = function (id) {\n return this.rootIds.indexOf(id);\n };\n MultiRootTree.prototype.findNodeId = function (nodeKey, id) {\n return this.nodes[nodeKey].indexOf(id);\n };\n MultiRootTree.prototype.findNode = function (nodeKey) {\n return this.nodes[nodeKey];\n };\n MultiRootTree.prototype.nodeInsertAtStart = function (nodeKey, id) {\n this.nodes[nodeKey].unshift(id);\n };\n MultiRootTree.prototype.nodeInsertAtEnd = function (nodeKey, id) {\n this.nodes[nodeKey].push(id);\n };\n MultiRootTree.prototype.rootDelete = function (index) {\n this.rootIds.splice(index, 1);\n };\n MultiRootTree.prototype.nodeDeleteAtIndex = function (nodeKey, index) {\n this.nodes[nodeKey].splice(index, 1);\n };\n MultiRootTree.prototype.rootInsertAtStart = function (id) {\n this.rootIds.unshift(id);\n };\n MultiRootTree.prototype.rootInsertAtEnd = function (id) {\n this.rootIds.push(id);\n };\n return MultiRootTree;\n}());\nexports.default = MultiRootTree;\n//# sourceMappingURL=MultiRootTree.js.map","import { IXmlElement } from \"./../Common/FileIO/Xml\";\nimport { VexFlowMusicSheetCalculator } from \"./../MusicalScore/Graphical/VexFlow/VexFlowMusicSheetCalculator\";\nimport { VexFlowBackend } from \"./../MusicalScore/Graphical/VexFlow/VexFlowBackend\";\nimport { MusicSheetReader } from \"./../MusicalScore/ScoreIO/MusicSheetReader\";\nimport { GraphicalMusicSheet } from \"./../MusicalScore/Graphical/GraphicalMusicSheet\";\nimport { MusicSheetCalculator } from \"./../MusicalScore/Graphical/MusicSheetCalculator\";\nimport { VexFlowMusicSheetDrawer } from \"./../MusicalScore/Graphical/VexFlow/VexFlowMusicSheetDrawer\";\nimport { SvgVexFlowBackend } from \"./../MusicalScore/Graphical/VexFlow/SvgVexFlowBackend\";\nimport { CanvasVexFlowBackend } from \"./../MusicalScore/Graphical/VexFlow/CanvasVexFlowBackend\";\nimport { MusicSheet } from \"./../MusicalScore/MusicSheet\";\nimport { Cursor } from \"./Cursor\";\nimport { MXLHelper } from \"../Common/FileIO/Mxl\";\nimport { AJAX } from \"./AJAX\";\nimport log from \"loglevel\";\nimport { DrawingParametersEnum, DrawingParameters, ColoringModes } from \"../MusicalScore/Graphical/DrawingParameters\";\nimport { IOSMDOptions, OSMDOptions, AutoBeamOptions, BackendType } from \"./OSMDOptions\";\nimport { EngravingRules, PageFormat } from \"../MusicalScore/Graphical/EngravingRules\";\nimport { AbstractExpression } from \"../MusicalScore/VoiceData/Expressions/AbstractExpression\";\nimport { Dictionary } from \"typescript-collections\";\nimport { NoteEnum } from \"..\";\nimport { AutoColorSet, GraphicalMusicPage } from \"../MusicalScore\";\nimport { MusicPartManagerIterator } from \"../MusicalScore/MusicParts\";\nimport { ITransposeCalculator } from \"../MusicalScore/Interfaces\";\n/**\n * The main class and control point of OpenSheetMusicDisplay.
\n * It can display MusicXML sheet music files in an HTML element container.
\n * After the constructor, use load() and render() to load and render a MusicXML file.\n */\nexport class OpenSheetMusicDisplay {\n private version: string = \"0.8.2-release\"; // getter: this.Version\n // at release, bump version and change to -release, afterwards to -dev again\n\n /**\n * Creates and attaches an OpenSheetMusicDisplay object to an HTML element container.
\n * After the constructor, use load() and render() to load and render a MusicXML file.\n * @param container The container element OSMD will be rendered into.
\n * Either a string specifying the ID of an HTML container element,
\n * or a reference to the HTML element itself (e.g. div)\n * @param options An object for rendering options like the backend (svg/canvas) or autoResize.
\n * For defaults see the OSMDOptionsStandard method in the [[OSMDOptions]] class.\n */\n constructor(container: string | HTMLElement,\n options: IOSMDOptions = OSMDOptions.OSMDOptionsStandard()) {\n // Store container element\n if (typeof container === \"string\") {\n // ID passed\n this.container = document.getElementById(container);\n } else if (container && \"appendChild\" in container) {\n // Element passed\n this.container = container;\n }\n if (!this.container) {\n throw new Error(\"Please pass a valid div container to OpenSheetMusicDisplay\");\n }\n\n if (options.autoResize === undefined) {\n options.autoResize = true;\n }\n this.backendType = BackendType.SVG; // default, can be changed by options\n this.setOptions(options);\n }\n\n public cursor: Cursor;\n public zoom: number = 1.0;\n private zoomUpdated: boolean = false;\n\n private container: HTMLElement;\n private backendType: BackendType;\n private needBackendUpdate: boolean;\n private sheet: MusicSheet;\n private drawer: VexFlowMusicSheetDrawer;\n private drawBoundingBox: string;\n private drawSkyLine: boolean;\n private drawBottomLine: boolean;\n private graphic: GraphicalMusicSheet;\n private drawingParameters: DrawingParameters;\n private rules: EngravingRules;\n private autoResizeEnabled: boolean;\n private resizeHandlerAttached: boolean;\n private followCursor: boolean;\n\n /**\n * Load a MusicXML file\n * @param content is either the url of a file, or the root node of a MusicXML document, or the string content of a .xml/.mxl file\n */\n public load(content: string | Document): Promise<{}> {\n // Warning! This function is asynchronous! No error handling is done here.\n this.reset();\n //console.log(\"typeof content: \" + typeof content);\n if (typeof content === \"string\") {\n const str: string = content;\n const self: OpenSheetMusicDisplay = this;\n // console.log(\"substring: \" + str.substr(0, 5));\n if (str.substr(0, 4) === \"\\x50\\x4b\\x03\\x04\") {\n log.debug(\"[OSMD] This is a zip file, unpack it first: \" + str);\n // This is a zip file, unpack it first\n return MXLHelper.MXLtoXMLstring(str).then(\n (x: string) => {\n return self.load(x);\n },\n (err: any) => {\n log.debug(err);\n throw new Error(\"OpenSheetMusicDisplay: Invalid MXL file\");\n }\n );\n }\n // Javascript loads strings as utf-16, which is wonderful BS if you want to parse UTF-8 :S\n if (str.substr(0, 3) === \"\\uf7ef\\uf7bb\\uf7bf\") {\n log.debug(\"[OSMD] UTF with BOM detected, truncate first three bytes and pass along: \" + str);\n // UTF with BOM detected, truncate first three bytes and pass along\n return self.load(str.substr(3));\n }\n let trimmedStr: string = str;\n if (/^\\s/.test(trimmedStr)) { // only trim if we need to. (end of string is irrelevant)\n trimmedStr = trimmedStr.trim(); // trim away empty lines at beginning etc\n }\n if (trimmedStr.substr(0, 6).includes(\" { return self.load(s); },\n (exc: Error) => { throw exc; }\n );\n } else {\n console.error(\"[OSMD] osmd.load(string): Could not process string. Did not find content).nodeName) {\n return Promise.reject(new Error(\"OpenSheetMusicDisplay: The document which was provided is invalid\"));\n }\n const xmlDocument: Document = (content);\n const xmlDocumentNodes: NodeList = xmlDocument.childNodes;\n log.debug(\"[OSMD] load(), Document url: \" + xmlDocument.URL);\n\n let scorePartwiseElement: Element;\n for (let i: number = 0, length: number = xmlDocumentNodes.length; i < length; i += 1) {\n const node: Node = xmlDocumentNodes[i];\n if (node.nodeType === Node.ELEMENT_NODE && node.nodeName.toLowerCase() === \"score-partwise\") {\n scorePartwiseElement = node;\n break;\n }\n }\n if (!scorePartwiseElement) {\n console.error(\"Could not parse MusicXML, no valid partwise element found\");\n return Promise.reject(new Error(\"OpenSheetMusicDisplay: Document is not a valid 'partwise' MusicXML\"));\n }\n const score: IXmlElement = new IXmlElement(scorePartwiseElement);\n const reader: MusicSheetReader = new MusicSheetReader(undefined, this.rules);\n this.sheet = reader.createMusicSheet(score, \"Untitled Score\");\n if (this.sheet === undefined) {\n // error loading sheet, probably already logged, do nothing\n return Promise.reject(new Error(\"given music sheet was incomplete or could not be loaded.\"));\n }\n log.info(`[OSMD] Loaded sheet ${this.sheet.TitleString} successfully.`);\n\n this.needBackendUpdate = true;\n this.updateGraphic();\n\n return Promise.resolve({});\n }\n\n /**\n * (Re-)creates the graphic sheet from the music sheet\n */\n public updateGraphic(): void {\n const calc: MusicSheetCalculator = new VexFlowMusicSheetCalculator(this.rules);\n this.graphic = new GraphicalMusicSheet(this.sheet, calc);\n if (this.drawingParameters.drawCursors && this.cursor) {\n this.cursor.init(this.sheet.MusicPartManager, this.graphic);\n }\n }\n\n /**\n * Render the music sheet in the container\n */\n public render(): void {\n if (!this.graphic) {\n throw new Error(\"OpenSheetMusicDisplay: Before rendering a music sheet, please load a MusicXML file\");\n }\n if (this.drawer) {\n this.drawer.clear(); // clear canvas before setting width\n }\n // musicSheetCalculator.clearSystemsAndMeasures() // maybe? don't have reference though\n // musicSheetCalculator.clearRecreatedObjects();\n\n // Set page width\n let width: number = this.container.offsetWidth;\n if (this.rules.RenderSingleHorizontalStaffline) {\n width = 32767; // set safe maximum (browser limit), will be reduced later\n // reduced later in MusicSheetCalculator.calculatePageLabels (sets sheet.pageWidth to page.PositionAndShape.Size.width before labels)\n // rough calculation:\n // width = 600 * this.sheet.SourceMeasures.length;\n }\n // log.debug(\"[OSMD] render width: \" + width);\n\n this.sheet.pageWidth = width / this.zoom / 10.0;\n if (this.rules.PageFormat && !this.rules.PageFormat.IsUndefined) {\n this.rules.PageHeight = this.sheet.pageWidth / this.rules.PageFormat.aspectRatio;\n log.debug(\"[OSMD] PageHeight: \" + this.rules.PageHeight);\n } else {\n log.debug(\"[OSMD] endless/undefined pageformat, id: \" + this.rules.PageFormat.idString);\n this.rules.PageHeight = 100001; // infinite page height // TODO maybe Number.MAX_VALUE or Math.pow(10, 20)?\n }\n\n // Before introducing the following optimization (maybe irrelevant), tests\n // have to be modified to ensure that width is > 0 when executed\n //if (isNaN(width) || width === 0) {\n // return;\n //}\n\n // Calculate again\n this.graphic.reCalculate();\n\n if (this.drawingParameters.drawCursors) {\n this.graphic.Cursors.length = 0;\n }\n\n // needBackendUpdate is well intentioned, but we need to cover all cases.\n // backends also need an update when this.zoom was set from outside, which unfortunately doesn't have a setter method to set this in.\n // so just for compatibility, we need to assume users set osmd.zoom, so we'd need to check whether it was changed compared to last time.\n if (true || this.needBackendUpdate) {\n this.createOrRefreshRenderBackend();\n this.needBackendUpdate = false;\n }\n\n this.drawer.setZoom(this.zoom);\n // Finally, draw\n this.drawer.drawSheet(this.graphic);\n\n this.enableOrDisableCursor(this.drawingParameters.drawCursors);\n\n if (this.drawingParameters.drawCursors && this.cursor) {\n // Update the cursor position\n this.cursor.update();\n }\n this.zoomUpdated = false;\n //console.log(\"[OSMD] render finished\");\n }\n\n private createOrRefreshRenderBackend(): void {\n // console.log(\"[OSMD] createOrRefreshRenderBackend()\");\n\n // Remove old backends\n if (this.drawer && this.drawer.Backends) {\n // removing single children to remove all is error-prone, because sometimes a random SVG-child remains.\n // for (const backend of this.drawer.Backends) {\n // backend.removeFromContainer(this.container);\n // }\n if (this.drawer.Backends[0]) {\n this.drawer.Backends[0].removeAllChildrenFromContainer(this.container);\n }\n this.drawer.Backends.clear();\n }\n\n // Create the drawer\n this.drawingParameters.Rules = this.rules;\n this.drawer = new VexFlowMusicSheetDrawer(this.drawingParameters); // note that here the drawer.drawableBoundingBoxElement is lost. now saved in OSMD.\n this.drawer.drawableBoundingBoxElement = this.DrawBoundingBox;\n this.drawer.bottomLineVisible = this.drawBottomLine;\n this.drawer.skyLineVisible = this.drawSkyLine;\n\n // Set page width\n let width: number = this.container.offsetWidth;\n if (this.rules.RenderSingleHorizontalStaffline) {\n width = this.graphic.MusicPages[0].PositionAndShape.Size.width * 10 * this.zoom;\n // this.container.style.width = width + \"px\";\n // console.log(\"width: \" + width)\n }\n // TODO width may need to be coordinated with render() where width is also used\n let height: number;\n const canvasDimensionsLimit: number = 32767; // browser limitation. Chrome/Firefox (16 bit, 32768 causes an error).\n // Could be calculated by canvas-size module.\n // see #678 on Github and here: https://stackoverflow.com/a/11585939/10295942\n\n // TODO check if resize is necessary. set needResize or something when size was changed\n for (const page of this.graphic.MusicPages) {\n const backend: VexFlowBackend = this.createBackend(this.backendType, page);\n const sizeWarningPartTwo: string = \" exceeds CanvasBackend limit of 32767. Cutting off score.\";\n if (backend.getOSMDBackendType() === BackendType.Canvas && width > canvasDimensionsLimit) {\n console.log(\"[OSMD] Warning: width of \" + width + sizeWarningPartTwo);\n width = canvasDimensionsLimit;\n }\n if (this.rules.PageFormat && !this.rules.PageFormat.IsUndefined) {\n height = width / this.rules.PageFormat.aspectRatio;\n // console.log(\"pageformat given. height: \" + page.PositionAndShape.Size.height);\n } else {\n height = (page.PositionAndShape.Size.height + 15) * this.zoom * 10.0;\n // console.log(\"pageformat not given. height: \" + page.PositionAndShape.Size.height);\n }\n if (backend.getOSMDBackendType() === BackendType.Canvas && height > canvasDimensionsLimit) {\n console.log(\"[OSMD] Warning: height of \" + height + sizeWarningPartTwo);\n height = Math.min(height, canvasDimensionsLimit); // this cuts off the the score, but doesn't break rendering.\n // TODO optional: reduce zoom to fit the score within the limit.\n }\n\n backend.resize(width, height);\n backend.clear(); // set bgcolor if defined (this.rules.PageBackgroundColor, see OSMDOptions)\n this.drawer.Backends.push(backend);\n }\n }\n\n /** States whether the render() function can be safely called. */\n public IsReadyToRender(): boolean {\n return this.graphic !== undefined;\n }\n\n /** Clears what OSMD has drawn on its canvas. */\n public clear(): void {\n this.drawer.clear();\n this.reset(); // without this, resize will draw loaded sheet again\n }\n\n /** Set OSMD rendering options using an IOSMDOptions object.\n * Can be called during runtime. Also called by constructor.\n * For example, setOptions({autoResize: false}) will disable autoResize even during runtime.\n */\n public setOptions(options: IOSMDOptions): void {\n if (!this.rules) {\n this.rules = new EngravingRules();\n }\n if (!this.drawingParameters) {\n this.drawingParameters = new DrawingParameters();\n this.drawingParameters.Rules = this.rules;\n }\n if (options === undefined || options === null) {\n log.warn(\"warning: osmd.setOptions() called without an options parameter, has no effect.\"\n + \"\\n\" + \"example usage: osmd.setOptions({drawCredits: false, drawPartNames: false})\");\n return;\n }\n if (options.drawingParameters) {\n this.drawingParameters.DrawingParametersEnum =\n (DrawingParametersEnum)[options.drawingParameters.toLowerCase()];\n // see DrawingParameters.ts: set DrawingParametersEnum, and DrawingParameters.ts:setForCompactTightMode()\n }\n\n const backendNotInitialized: boolean = !this.drawer || !this.drawer.Backends || this.drawer.Backends.length < 1;\n let needBackendUpdate: boolean = backendNotInitialized;\n if (options.backend !== undefined) {\n const backendTypeGiven: BackendType = OSMDOptions.BackendTypeFromString(options.backend);\n needBackendUpdate = needBackendUpdate || this.backendType !== backendTypeGiven;\n this.backendType = backendTypeGiven;\n }\n this.needBackendUpdate = needBackendUpdate;\n // TODO this is a necessary step during the OSMD constructor. Maybe move this somewhere else\n\n // individual drawing parameters options\n if (options.autoBeam !== undefined) { // only change an option if it was given in options, otherwise it will be undefined\n this.rules.AutoBeamNotes = options.autoBeam;\n }\n const autoBeamOptions: AutoBeamOptions = options.autoBeamOptions;\n if (autoBeamOptions) {\n if (autoBeamOptions.maintain_stem_directions === undefined) {\n autoBeamOptions.maintain_stem_directions = false;\n }\n this.rules.AutoBeamOptions = autoBeamOptions;\n if (autoBeamOptions.groups && autoBeamOptions.groups.length) {\n for (const fraction of autoBeamOptions.groups) {\n if (fraction.length !== 2) {\n throw new Error(\"Each fraction in autoBeamOptions.groups must be of length 2, e.g. [3,4] for beaming three fourths\");\n }\n }\n }\n }\n if (options.percussionOneLineCutoff !== undefined) {\n this.rules.PercussionOneLineCutoff = options.percussionOneLineCutoff;\n }\n if (this.rules.PercussionOneLineCutoff !== 0 &&\n options.percussionForceVoicesOneLineCutoff !== undefined) {\n this.rules.PercussionForceVoicesOneLineCutoff = options.percussionForceVoicesOneLineCutoff;\n }\n if (options.alignRests !== undefined) {\n this.rules.AlignRests = options.alignRests;\n }\n if (options.coloringMode !== undefined) {\n this.setColoringMode(options);\n }\n if (options.coloringEnabled !== undefined) {\n this.rules.ColoringEnabled = options.coloringEnabled;\n }\n if (options.colorStemsLikeNoteheads !== undefined) {\n this.rules.ColorStemsLikeNoteheads = options.colorStemsLikeNoteheads;\n }\n if (options.disableCursor) {\n this.drawingParameters.drawCursors = false;\n }\n\n // alternative to if block: this.drawingsParameters.drawCursors = options.drawCursors !== false. No if, but always sets drawingParameters.\n // note that every option can be undefined, which doesn't mean the option should be set to false.\n if (options.drawHiddenNotes) {\n this.drawingParameters.drawHiddenNotes = true; // not yet supported\n }\n if (options.drawCredits !== undefined) {\n this.drawingParameters.DrawCredits = options.drawCredits; // sets DrawComposer, DrawTitle, DrawSubtitle, DrawLyricist.\n }\n if (options.drawComposer !== undefined) {\n this.drawingParameters.DrawComposer = options.drawComposer;\n }\n if (options.drawTitle !== undefined) {\n this.drawingParameters.DrawTitle = options.drawTitle;\n }\n if (options.drawSubtitle !== undefined) {\n this.drawingParameters.DrawSubtitle = options.drawSubtitle;\n }\n if (options.drawLyricist !== undefined) {\n this.drawingParameters.DrawLyricist = options.drawLyricist;\n }\n if (options.drawMetronomeMarks !== undefined) {\n this.rules.MetronomeMarksDrawn = options.drawMetronomeMarks;\n }\n if (options.drawPartNames !== undefined) {\n this.drawingParameters.DrawPartNames = options.drawPartNames; // indirectly writes to EngravingRules\n\n // by default, disable part abbreviations too, unless set explicitly.\n if (!options.drawPartAbbreviations) {\n this.rules.RenderPartAbbreviations = options.drawPartNames;\n }\n }\n if (options.drawPartAbbreviations !== undefined) {\n this.rules.RenderPartAbbreviations = options.drawPartAbbreviations;\n }\n if (options.drawFingerings === false) {\n this.rules.RenderFingerings = false;\n }\n if (options.drawMeasureNumbers !== undefined) {\n this.rules.RenderMeasureNumbers = options.drawMeasureNumbers;\n }\n if (options.drawLyrics !== undefined) {\n this.rules.RenderLyrics = options.drawLyrics;\n }\n if (options.drawSlurs !== undefined) {\n this.rules.RenderSlurs = options.drawSlurs;\n }\n if (options.measureNumberInterval !== undefined) {\n this.rules.MeasureNumberLabelOffset = options.measureNumberInterval;\n }\n if (options.fingeringPosition !== undefined) {\n this.rules.FingeringPosition = AbstractExpression.PlacementEnumFromString(options.fingeringPosition);\n }\n if (options.fingeringInsideStafflines !== undefined) {\n this.rules.FingeringInsideStafflines = options.fingeringInsideStafflines;\n }\n if (options.newSystemFromXML !== undefined) {\n this.rules.NewSystemAtXMLNewSystemAttribute = options.newSystemFromXML;\n }\n if (options.newPageFromXML !== undefined) {\n this.rules.NewPageAtXMLNewPageAttribute = options.newPageFromXML;\n }\n if (options.fillEmptyMeasuresWithWholeRest !== undefined) {\n this.rules.FillEmptyMeasuresWithWholeRest = options.fillEmptyMeasuresWithWholeRest;\n }\n if (options.followCursor !== undefined) {\n this.FollowCursor = options.followCursor;\n }\n if (options.setWantedStemDirectionByXml !== undefined) {\n this.rules.SetWantedStemDirectionByXml = options.setWantedStemDirectionByXml;\n }\n if (options.defaultColorNotehead) {\n this.rules.DefaultColorNotehead = options.defaultColorNotehead;\n }\n if (options.defaultColorRest) {\n this.rules.DefaultColorRest = options.defaultColorRest;\n }\n if (options.defaultColorStem) {\n this.rules.DefaultColorStem = options.defaultColorStem;\n }\n if (options.defaultColorLabel) {\n this.rules.DefaultColorLabel = options.defaultColorLabel;\n }\n if (options.defaultColorTitle) {\n this.rules.DefaultColorTitle = options.defaultColorTitle;\n }\n if (options.defaultFontFamily) {\n this.rules.DefaultFontFamily = options.defaultFontFamily; // default \"Times New Roman\", also used if font family not found\n }\n if (options.defaultFontStyle) {\n this.rules.DefaultFontStyle = options.defaultFontStyle; // e.g. FontStyles.Bold\n }\n if (options.drawUpToMeasureNumber) {\n this.rules.MaxMeasureToDrawIndex = options.drawUpToMeasureNumber - 1;\n }\n if (options.drawFromMeasureNumber) {\n this.rules.MinMeasureToDrawIndex = options.drawFromMeasureNumber - 1;\n }\n if (options.tupletsRatioed) {\n this.rules.TupletsRatioed = true;\n }\n if (options.tupletsBracketed) {\n this.rules.TupletsBracketed = true;\n }\n if (options.tripletsBracketed) {\n this.rules.TripletsBracketed = true;\n }\n if (options.autoResize) {\n if (!this.resizeHandlerAttached) {\n this.autoResize();\n }\n this.autoResizeEnabled = true;\n } else if (options.autoResize === false) { // not undefined\n this.autoResizeEnabled = false;\n // we could remove the window EventListener here, but not necessary.\n }\n if (options.pageFormat !== undefined) { // only change this option if it was given, see above\n this.setPageFormat(options.pageFormat);\n }\n if (options.pageBackgroundColor !== undefined) {\n this.rules.PageBackgroundColor = options.pageBackgroundColor;\n }\n if (options.renderSingleHorizontalStaffline !== undefined) {\n this.rules.RenderSingleHorizontalStaffline = options.renderSingleHorizontalStaffline;\n }\n }\n\n public setColoringMode(options: IOSMDOptions): void {\n if (options.coloringMode === ColoringModes.XML) {\n this.rules.ColoringMode = ColoringModes.XML;\n return;\n }\n const noteIndices: NoteEnum[] = [NoteEnum.C, NoteEnum.D, NoteEnum.E, NoteEnum.F, NoteEnum.G, NoteEnum.A, NoteEnum.B, -1];\n let colorSetString: string[];\n if (options.coloringMode === ColoringModes.CustomColorSet) {\n if (!options.coloringSetCustom || options.coloringSetCustom.length !== 8) {\n throw new Error(\"Invalid amount of colors: With coloringModes.customColorSet, \" +\n \"you have to provide a coloringSetCustom parameter with 8 strings (C to B, rest note).\");\n }\n // validate strings input\n for (const colorString of options.coloringSetCustom) {\n const regExp: RegExp = /^\\#[0-9a-fA-F]{6}$/;\n if (!regExp.test(colorString)) {\n throw new Error(\n \"One of the color strings in options.coloringSetCustom was not a valid HTML Hex color:\\n\" + colorString);\n }\n }\n colorSetString = options.coloringSetCustom;\n } else if (options.coloringMode === ColoringModes.AutoColoring) {\n colorSetString = [];\n const keys: string[] = Object.keys(AutoColorSet);\n for (let i: number = 0; i < keys.length; i++) {\n colorSetString.push(AutoColorSet[keys[i]]);\n }\n } // for both cases:\n const coloringSetCurrent: Dictionary = new Dictionary();\n for (let i: number = 0; i < noteIndices.length; i++) {\n coloringSetCurrent.setValue(noteIndices[i], colorSetString[i]);\n }\n coloringSetCurrent.setValue(-1, colorSetString[7]);\n this.rules.ColoringSetCurrent = coloringSetCurrent;\n\n this.rules.ColoringMode = options.coloringMode;\n }\n\n /**\n * Sets the logging level for this OSMD instance. By default, this is set to `warn`.\n *\n * @param: content can be `trace`, `debug`, `info`, `warn` or `error`.\n */\n public setLogLevel(level: string): void {\n switch (level) {\n case \"trace\":\n log.setLevel(log.levels.TRACE);\n break;\n case \"debug\":\n log.setLevel(log.levels.DEBUG);\n break;\n case \"info\":\n log.setLevel(log.levels.INFO);\n break;\n case \"warn\":\n log.setLevel(log.levels.WARN);\n break;\n case \"error\":\n log.setLevel(log.levels.ERROR);\n break;\n default:\n log.warn(`Could not set log level to ${level}. Using warn instead.`);\n log.setLevel(log.levels.WARN);\n break;\n }\n }\n\n public getLogLevel(): number {\n return log.getLevel();\n }\n\n /**\n * Initialize this object to default values\n * FIXME: Probably unnecessary\n */\n private reset(): void {\n if (this.drawingParameters.drawCursors && this.cursor) {\n this.cursor.hide();\n }\n this.sheet = undefined;\n this.graphic = undefined;\n this.zoom = 1.0;\n }\n\n /**\n * Attach the appropriate handler to the window.onResize event\n */\n private autoResize(): void {\n\n const self: OpenSheetMusicDisplay = this;\n this.handleResize(\n () => {\n // empty\n },\n () => {\n // The following code is probably not needed\n // (the width should adapt itself to the max allowed)\n //let width: number = Math.max(\n // document.documentElement.clientWidth,\n // document.body.scrollWidth,\n // document.documentElement.scrollWidth,\n // document.body.offsetWidth,\n // document.documentElement.offsetWidth\n //);\n //self.container.style.width = width + \"px\";\n\n // recalculate beams, are otherwise not updated and can detach from stems, see #724\n if (this.graphic?.GetCalculator instanceof VexFlowMusicSheetCalculator) { // null and type check\n (this.graphic.GetCalculator as VexFlowMusicSheetCalculator).beamsNeedUpdate = true;\n }\n if (self.IsReadyToRender()) {\n self.render();\n }\n }\n );\n }\n\n /**\n * Helper function for managing window's onResize events\n * @param startCallback is the function called when resizing starts\n * @param endCallback is the function called when resizing (kind-of) ends\n */\n private handleResize(startCallback: () => void, endCallback: () => void): void {\n let rtime: number;\n let timeout: number = undefined;\n const delta: number = 200;\n const self: OpenSheetMusicDisplay = this;\n\n function resizeStart(): void {\n if (!self.AutoResizeEnabled) {\n return;\n }\n rtime = (new Date()).getTime();\n if (!timeout) {\n startCallback();\n rtime = (new Date()).getTime();\n timeout = window.setTimeout(resizeEnd, delta);\n }\n }\n\n function resizeEnd(): void {\n timeout = undefined;\n window.clearTimeout(timeout);\n if ((new Date()).getTime() - rtime < delta) {\n timeout = window.setTimeout(resizeEnd, delta);\n } else {\n endCallback();\n }\n }\n\n if ((window).attachEvent) {\n // Support IE<9\n (window).attachEvent(\"onresize\", resizeStart);\n } else {\n window.addEventListener(\"resize\", resizeStart);\n }\n this.resizeHandlerAttached = true;\n\n window.setTimeout(startCallback, 0);\n window.setTimeout(endCallback, 1);\n }\n\n /** Enable or disable (hide) the cursor.\n * @param enable whether to enable (true) or disable (false) the cursor\n */\n public enableOrDisableCursor(enable: boolean): void {\n this.drawingParameters.drawCursors = enable;\n if (enable) {\n // save previous cursor state\n const hidden: boolean = this.cursor?.Hidden;\n const previousIterator: MusicPartManagerIterator = this.cursor?.Iterator;\n\n // create new cursor\n if (this.drawer?.Backends?.length >= 1 && this.drawer.Backends[0].getRenderElement()) {\n this.cursor = new Cursor(this.drawer.Backends[0].getRenderElement(), this);\n }\n if (this.sheet && this.graphic && this.cursor) { // else init is called in load()\n this.cursor.init(this.sheet.MusicPartManager, this.graphic);\n }\n\n // restore old cursor state\n if (this.rules.RestoreCursorAfterRerender) {\n this.cursor.hidden = hidden;\n if (previousIterator) {\n this.cursor.iterator = previousIterator;\n }\n }\n } else { // disable cursor\n if (!this.cursor) {\n return;\n }\n this.cursor.hide();\n // this.cursor = undefined;\n // TODO cursor should be disabled, not just hidden. otherwise user can just call osmd.cursor.hide().\n // however, this could cause null calls (cursor.next() etc), maybe that needs some solution.\n }\n }\n\n public createBackend(type: BackendType, page: GraphicalMusicPage): VexFlowBackend {\n let backend: VexFlowBackend;\n if (type === undefined || type === BackendType.SVG) {\n backend = new SvgVexFlowBackend(this.rules);\n } else {\n backend = new CanvasVexFlowBackend(this.rules);\n }\n backend.graphicalMusicPage = page; // the page the backend renders on. needed to identify DOM element to extract image/SVG\n backend.initialize(this.container);\n return backend;\n }\n\n /** Standard page format options like A4 or Letter, in portrait and landscape. E.g. PageFormatStandards[\"A4_P\"] or PageFormatStandards[\"Letter_L\"]. */\n public static PageFormatStandards: { [type: string]: PageFormat } = {\n \"A3_L\": new PageFormat(420, 297, \"A3_L\"), // id strings should use underscores instead of white spaces to facilitate use as URL parameters.\n \"A3_P\": new PageFormat(297, 420, \"A3_P\"),\n \"A4_L\": new PageFormat(297, 210, \"A4_L\"),\n \"A4_P\": new PageFormat(210, 297, \"A4_P\"),\n \"A5_L\": new PageFormat(210, 148, \"A5_L\"),\n \"A5_P\": new PageFormat(148, 210, \"A5_P\"),\n \"A6_L\": new PageFormat(148, 105, \"A6_L\"),\n \"A6_P\": new PageFormat(105, 148, \"A6_P\"),\n \"Endless\": PageFormat.UndefinedPageFormat,\n \"Letter_L\": new PageFormat(279.4, 215.9, \"Letter_L\"),\n \"Letter_P\": new PageFormat(215.9, 279.4, \"Letter_P\")\n };\n\n public static StringToPageFormat(pageFormatString: string): PageFormat {\n let pageFormat: PageFormat = PageFormat.UndefinedPageFormat; // default: 'endless' page height, take canvas/container width\n\n // check for widthxheight parameter, e.g. \"800x600\"\n if (pageFormatString.match(\"^[0-9]+x[0-9]+$\")) {\n const widthAndHeight: string[] = pageFormatString.split(\"x\");\n const width: number = Number.parseInt(widthAndHeight[0], 10);\n const height: number = Number.parseInt(widthAndHeight[1], 10);\n if (width > 0 && width < 32768 && height > 0 && height < 32768) {\n pageFormat = new PageFormat(width, height, `customPageFormat${pageFormatString}`);\n }\n }\n\n // check for formatId from OpenSheetMusicDisplay.PageFormatStandards\n pageFormatString = pageFormatString.replace(\" \", \"_\");\n pageFormatString = pageFormatString.replace(\"Landscape\", \"L\");\n pageFormatString = pageFormatString.replace(\"Portrait\", \"P\");\n //console.log(\"change format to: \" + formatId);\n if (OpenSheetMusicDisplay.PageFormatStandards.hasOwnProperty(pageFormatString)) {\n pageFormat = OpenSheetMusicDisplay.PageFormatStandards[pageFormatString];\n return pageFormat;\n }\n return pageFormat;\n }\n\n /** Sets page format by string. Used by setOptions({pageFormat: \"A4_P\"}) for example. */\n public setPageFormat(formatId: string): void {\n const newPageFormat: PageFormat = OpenSheetMusicDisplay.StringToPageFormat(formatId);\n this.needBackendUpdate = !(newPageFormat.Equals(this.rules.PageFormat));\n this.rules.PageFormat = newPageFormat;\n }\n\n public setCustomPageFormat(width: number, height: number): void {\n if (width > 0 && height > 0) {\n const f: PageFormat = new PageFormat(width, height);\n this.rules.PageFormat = f;\n }\n }\n\n //#region GETTER / SETTER\n public set DrawSkyLine(value: boolean) {\n this.drawSkyLine = value;\n if (this.drawer) {\n this.drawer.skyLineVisible = value;\n // this.render(); // note: we probably shouldn't automatically render when someone sets the setter\n // this can cause a lot of rendering time.\n }\n }\n public get DrawSkyLine(): boolean {\n return this.drawer.skyLineVisible;\n }\n\n public set DrawBottomLine(value: boolean) {\n this.drawBottomLine = value;\n if (this.drawer) {\n this.drawer.bottomLineVisible = value;\n // this.render(); // note: we probably shouldn't automatically render when someone sets the setter\n // this can cause a lot of rendering time.\n }\n }\n public get DrawBottomLine(): boolean {\n return this.drawer.bottomLineVisible;\n }\n\n public set DrawBoundingBox(value: string) {\n this.drawBoundingBox = value;\n this.drawer.drawableBoundingBoxElement = value; // drawer is sometimes created anew, losing this value, so it's saved in OSMD now.\n this.render(); // may create new Drawer.\n }\n public get DrawBoundingBox(): string {\n return this.drawBoundingBox;\n }\n\n public get AutoResizeEnabled(): boolean {\n return this.autoResizeEnabled;\n }\n public set AutoResizeEnabled(value: boolean) {\n this.autoResizeEnabled = value;\n }\n\n public set Zoom(value: number) {\n this.zoom = value;\n this.zoomUpdated = true;\n if (this.graphic?.GetCalculator instanceof VexFlowMusicSheetCalculator) { // null and type check\n (this.graphic.GetCalculator as VexFlowMusicSheetCalculator).beamsNeedUpdate = this.zoomUpdated;\n }\n }\n\n public set FollowCursor(value: boolean) {\n this.followCursor = value;\n }\n\n public get FollowCursor(): boolean {\n return this.followCursor;\n }\n\n public set TransposeCalculator(calculator: ITransposeCalculator) {\n MusicSheetCalculator.transposeCalculator = calculator;\n }\n\n public get TransposeCalculator(): ITransposeCalculator {\n return MusicSheetCalculator.transposeCalculator;\n }\n\n public get Sheet(): MusicSheet {\n return this.sheet;\n }\n public get Drawer(): VexFlowMusicSheetDrawer {\n return this.drawer;\n }\n public get GraphicSheet(): GraphicalMusicSheet {\n return this.graphic;\n }\n public get DrawingParameters(): DrawingParameters {\n return this.drawingParameters;\n }\n public get EngravingRules(): EngravingRules { // custom getter, useful for engraving parameter setting in Demo\n return this.rules;\n }\n /** Returns the version of OSMD this object is built from (the version you are using). */\n public get Version(): string {\n return this.version;\n }\n //#endregion\n}\n","import {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\nimport {GraphicalObject} from \"./GraphicalObject\";\n\nexport abstract class AbstractGraphicalInstruction extends GraphicalObject {\n protected parent: GraphicalStaffEntry;\n constructor(parent: GraphicalStaffEntry) {\n super();\n this.parent = parent;\n }\n public get Parent(): GraphicalStaffEntry {\n return this.parent;\n }\n public set Parent(value: GraphicalStaffEntry) {\n this.parent = value;\n }\n}\n","import {GraphicalLabel} from \"./GraphicalLabel\";\n\nexport class GraphicalComment {\n constructor(label: GraphicalLabel, settingsLabel: GraphicalLabel) {\n this.label = label;\n this.settings = settingsLabel;\n }\n public label: GraphicalLabel;\n public settings: GraphicalLabel;\n}\n","import {GraphicalLabel} from \"./GraphicalLabel\";\nimport {GraphicalRectangle} from \"./GraphicalRectangle\";\n\nexport class GraphicalMarkedArea {\n constructor(systemRectangle: GraphicalRectangle, labelRectangle: GraphicalRectangle = undefined, label: GraphicalLabel = undefined,\n settingsLabel: GraphicalLabel = undefined) {\n this.systemRectangle = systemRectangle;\n this.labelRectangle = labelRectangle;\n this.label = label;\n this.settings = settingsLabel;\n }\n\n public systemRectangle: GraphicalRectangle;\n public labelRectangle: GraphicalRectangle;\n public label: GraphicalLabel;\n public settings: GraphicalLabel;\n}\n","import {OutlineAndFillStyleEnum} from \"./DrawingEnums\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {GraphicalObject} from \"./GraphicalObject\";\n\nexport class GraphicalRectangle extends GraphicalObject {\n\n constructor(upperLeftPoint: PointF2D, lowerRightPoint: PointF2D, parent: BoundingBox, style: OutlineAndFillStyleEnum) {\n super();\n this.boundingBox = new BoundingBox(parent);\n this.boundingBox.RelativePosition = upperLeftPoint;\n this.boundingBox.BorderRight = lowerRightPoint.x - upperLeftPoint.x;\n this.boundingBox.BorderBottom = lowerRightPoint.y - upperLeftPoint.y;\n this.style = style;\n }\n\n public style: OutlineAndFillStyleEnum;\n}\n","import { PointF2D } from \"./PointF2D\";\n\nexport class Matrix2D {\n private matrix: number[][];\n\n constructor() {\n this.matrix = [];\n for (let i: number = 0; i < 2; i++) {\n this.matrix[i] = [];\n for (let j: number = 0; j < 2; j++) {\n this.matrix[i][j] = 0;\n }\n }\n }\n\n public static getRotationMatrix(angle: number): Matrix2D {\n const rotation: Matrix2D = new Matrix2D();\n const cos: number = Math.cos(angle);\n const sin: number = Math.sin(angle);\n rotation.matrix[0][0] = cos;\n rotation.matrix[0][1] = -sin;\n rotation.matrix[1][0] = sin;\n rotation.matrix[1][1] = cos;\n return rotation;\n }\n\n public scalarMultiplication(scalar: number): void {\n for (let i: number = 0; i < 2; i++) {\n for (let j: number = 0; j < 2; j++) {\n this.matrix[i][j] *= scalar;\n }\n }\n }\n\n public getTransposeMatrix(): Matrix2D {\n const transpose: Matrix2D = new Matrix2D();\n for (let i: number = 0; i < 2; i++) {\n for (let j: number = 0; j < 2; j++) {\n transpose.matrix[i][j] = this.matrix[j][i];\n }\n }\n return transpose;\n }\n\n public vectorMultiplication(point: PointF2D): PointF2D {\n const result: PointF2D = new PointF2D();\n result.x = point.x * this.matrix[0][0] + point.y * this.matrix[0][1];\n result.y = point.x * this.matrix[1][0] + point.y * this.matrix[1][1];\n return result;\n }\n\n // public get Matrix(index: number): number[] {\n // return this.matrix[index];\n // }\n // public set Matrix(index: number, value: number[]): void {\n // this.matrix[index] = value;\n // }\n}\n","import {StaffEntryLink} from \"../VoiceData/StaffEntryLink\";\nimport {GraphicalStaffEntry} from \"./GraphicalStaffEntry\";\nimport {GraphicalNote} from \"./GraphicalNote\";\n\n/**\n * The graphical counterpart of a [[StaffEntryLink]].\n * Used for linked voices.\n */\nexport class GraphicalStaffEntryLink {\n private staffEntryLink: StaffEntryLink;\n private graphicalLinkedStaffEntries: GraphicalStaffEntry[] = [];\n constructor(staffEntryLink: StaffEntryLink) {\n this.staffEntryLink = staffEntryLink;\n this.initialize();\n }\n public get GetStaffEntryLink(): StaffEntryLink {\n return this.staffEntryLink;\n }\n public get GraphicalLinkedStaffEntries(): GraphicalStaffEntry[] {\n return this.graphicalLinkedStaffEntries;\n }\n public set GraphicalLinkedStaffEntries(value: GraphicalStaffEntry[]) {\n this.graphicalLinkedStaffEntries = value;\n }\n public isFilled(): boolean {\n for (let i: number = 0; i < this.graphicalLinkedStaffEntries.length; i++) {\n if (!this.graphicalLinkedStaffEntries[i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Return all the [[GraphicalNote]]s that correspond to the [[LinkedVoiceEntry]] (the one saved in [[StaffEntryLink]]).\n * @param graphicalStaffEntry\n * @returns {any}\n */\n public getLinkedStaffEntriesGraphicalNotes(graphicalStaffEntry: GraphicalStaffEntry): GraphicalNote[] {\n if (this.graphicalLinkedStaffEntries.indexOf(graphicalStaffEntry) !== -1) {\n const notes: GraphicalNote[] = [];\n for (let idx: number = 0, len: number = this.graphicalLinkedStaffEntries.length; idx < len; ++idx) {\n const graphicalLinkedStaffEntry: GraphicalStaffEntry = this.graphicalLinkedStaffEntries[idx];\n for (const gve of graphicalLinkedStaffEntry.graphicalVoiceEntries) {\n for (const graphicalNote of gve.notes) {\n if (graphicalNote.sourceNote.ParentStaffEntry.Link\n && graphicalNote.sourceNote.ParentVoiceEntry === this.staffEntryLink.GetVoiceEntry) {\n notes.push(graphicalNote);\n }\n }\n }\n }\n return notes;\n }\n return undefined;\n }\n private initialize(): void {\n for (let idx: number = 0, len: number = this.staffEntryLink.LinkStaffEntries.length; idx < len; ++idx) {\n this.graphicalLinkedStaffEntries.push(undefined);\n }\n }\n}\n","import {GraphicalObject} from \"./GraphicalObject\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {OutlineAndFillStyleEnum} from \"./DrawingEnums\";\nimport {StaffLine} from \"./StaffLine\";\nimport {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {GraphicalLine} from \"./GraphicalLine\";\nimport {CollectionUtil} from \"../../Util/CollectionUtil\";\n\nexport class SelectionEndSymbol extends GraphicalObject {\n\n constructor(system: MusicSystem, xPosition: number) {\n super();\n const xCoordinate: number = xPosition;\n const yCoordinate: number = system.PositionAndShape.AbsolutePosition.y;\n const lineThickness: number = 0.4;\n const height: number = CollectionUtil.last(system.StaffLines).PositionAndShape.RelativePosition.y + 4;\n this.verticalLine = new GraphicalLine(\n new PointF2D(xCoordinate, yCoordinate),\n new PointF2D(xCoordinate, yCoordinate + height),\n lineThickness,\n OutlineAndFillStyleEnum.SelectionSymbol\n );\n for (let idx: number = 0, len: number = system.StaffLines.length; idx < len; ++idx) {\n const staffLine: StaffLine = system.StaffLines[idx];\n const anchor: PointF2D = new PointF2D(xCoordinate, yCoordinate + staffLine.PositionAndShape.RelativePosition.y);\n const arrowPoints: PointF2D[] = new Array(3);\n anchor.y -= .2;\n arrowPoints[0].x = anchor.x - 3;\n arrowPoints[0].y = anchor.y + 1.2;\n arrowPoints[1].x = anchor.x - 2;\n arrowPoints[1].y = anchor.y + 0.4;\n arrowPoints[2].x = anchor.x - 2;\n arrowPoints[2].y = anchor.y + 2;\n this.arrows.push(arrowPoints);\n const linePoints: PointF2D[] = new Array(8);\n const arrowThickness: number = .8;\n anchor.x -= .1;\n anchor.y += .3;\n const hilfsVar: number = .2;\n linePoints[0].x = anchor.x - 2;\n linePoints[0].y = anchor.y + 1.5 - hilfsVar;\n linePoints[1].x = anchor.x - 1;\n linePoints[1].y = anchor.y + 1.5 - hilfsVar;\n linePoints[2].x = anchor.x - 1;\n linePoints[2].y = anchor.y + 2.5;\n linePoints[3].x = anchor.x - 2;\n linePoints[3].y = anchor.y + 2.5;\n linePoints[4].x = linePoints[0].x;\n linePoints[4].y = linePoints[0].y - arrowThickness;\n linePoints[5].x = linePoints[4].x + arrowThickness + 1;\n linePoints[5].y = linePoints[4].y;\n linePoints[6].x = linePoints[5].x;\n linePoints[6].y = linePoints[3].y + arrowThickness;\n linePoints[7].x = linePoints[3].x;\n linePoints[7].y = linePoints[6].y;\n this.arrowlines.push(linePoints);\n }\n this.boundingBox = new BoundingBox(this);\n this.boundingBox.AbsolutePosition = new PointF2D(xCoordinate, yCoordinate);\n this.boundingBox.BorderLeft = -lineThickness;\n this.boundingBox.BorderRight = 4;\n this.boundingBox.BorderBottom = height;\n }\n\n public verticalLine: GraphicalLine;\n public arrows: PointF2D[][];\n public arrowlines: PointF2D[][];\n}\n","import {PointF2D} from \"../../Common/DataObjects/PointF2D\";\nimport {StaffLine} from \"./StaffLine\";\nimport {OutlineAndFillStyleEnum} from \"./DrawingEnums\";\nimport {GraphicalLine} from \"./GraphicalLine\";\nimport {MusicSystem} from \"./MusicSystem\";\nimport {GraphicalObject} from \"./GraphicalObject\";\nimport {BoundingBox} from \"./BoundingBox\";\nimport {CollectionUtil} from \"../../Util/CollectionUtil\";\n\nexport class SelectionStartSymbol extends GraphicalObject {\n\n constructor(system: MusicSystem, xPosition: number) {\n super();\n const xCoordinate: number = xPosition;\n const yCoordinate: number = system.PositionAndShape.AbsolutePosition.y;\n const lineThickness: number = 0.4;\n const height: number = CollectionUtil.last(system.StaffLines).PositionAndShape.RelativePosition.y + 4;\n this.verticalLine = new GraphicalLine(\n new PointF2D(xCoordinate, yCoordinate),\n new PointF2D(xCoordinate, yCoordinate + height),\n lineThickness,\n OutlineAndFillStyleEnum.SelectionSymbol\n );\n for (let idx: number = 0, len: number = system.StaffLines.length; idx < len; ++idx) {\n const staffLine: StaffLine = system.StaffLines[idx];\n const anchor: PointF2D = new PointF2D(xCoordinate, yCoordinate + staffLine.PositionAndShape.RelativePosition.y);\n const arrowPoints: PointF2D[] = new Array(7);\n arrowPoints[0].x = anchor.x + 4;\n arrowPoints[0].y = anchor.y + 2;\n arrowPoints[1].x = anchor.x + 2.5;\n arrowPoints[1].y = anchor.y + 0.5;\n arrowPoints[2].x = anchor.x + 2.5;\n arrowPoints[2].y = anchor.y + 1.3;\n arrowPoints[3].x = anchor.x + 1;\n arrowPoints[3].y = anchor.y + 1.3;\n arrowPoints[4].x = anchor.x + 1;\n arrowPoints[4].y = anchor.y + 2.7;\n arrowPoints[5].x = anchor.x + 2.5;\n arrowPoints[5].y = anchor.y + 2.7;\n arrowPoints[6].x = anchor.x + 2.5;\n arrowPoints[6].y = anchor.y + 3.5;\n this.arrows.push(arrowPoints);\n }\n this.boundingBox = new BoundingBox(this);\n this.boundingBox.AbsolutePosition = new PointF2D(xCoordinate, yCoordinate);\n this.boundingBox.BorderLeft = -lineThickness;\n this.boundingBox.BorderRight = 4;\n this.boundingBox.BorderBottom = height;\n }\n\n public verticalLine: GraphicalLine;\n public arrows: PointF2D[][];\n}\n","// created from 'create-ts-index'\n\nexport * from \"./CanvasVexFlowBackend\";\nexport * from \"./SvgVexFlowBackend\";\nexport * from \"./VexFlowBackend\";\nexport * from \"./VexFlowContinuousDynamicExpression\";\nexport * from \"./VexFlowConverter\";\nexport * from \"./VexFlowGraphicalNote\";\nexport * from \"./VexFlowGraphicalSymbolFactory\";\nexport * from \"./VexFlowInstantaneousDynamicExpression\";\nexport * from \"./VexFlowInstrumentBrace\";\nexport * from \"./VexFlowInstrumentBracket\";\nexport * from \"./VexFlowMeasure\";\nexport * from \"./VexFlowMusicSheetCalculator\";\nexport * from \"./VexFlowMusicSheetDrawer\";\nexport * from \"./VexFlowMusicSystem\";\nexport * from \"./VexFlowOctaveShift\";\nexport * from \"./VexFlowSlur\";\nexport * from \"./VexFlowStaffEntry\";\nexport * from \"./VexFlowStaffLine\";\nexport * from \"./VexFlowTextMeasurer\";\nexport * from \"./VexFlowVoiceEntry\";\n","export enum DynamicExpressionSymbolEnum {\n p = 0,\n f = 1,\n s = 2,\n z = 3,\n m = 4,\n r = 5\n}\n","import Vex from \"vexflow\";\nimport { Slur } from \"../../VoiceData/Expressions/ContinuousExpressions/Slur\";\n\nexport interface ICurveOptions {\n spacing: number;\n thickness: number;\n x_shift: number;\n y_shift: number;\n position: CurvePositionEnum;\n position_end: CurvePositionEnum;\n invert: boolean;\n cps: [{ x: number, y: number }, { x: number, y: number }];\n}\n\nexport enum CurvePositionEnum {\n NEAR_HEAD = 1,\n NEAR_TOP = 2,\n}\n\nexport class VexFlowSlur {\n\n constructor(parentslur: Slur) {\n this.parentSlur = parentslur;\n }\n\n /**\n * Copy constructor: generate a VexFlowSlur from an existing one\n */\n public static createFromVexflowSlur(vfSlur: VexFlowSlur): VexFlowSlur {\n return new VexFlowSlur(vfSlur.parentSlur);\n }\n\n public get vfSlur(): Slur {\n return this.parentSlur;\n }\n\n private parentSlur: Slur;\n\n public vfStartNote: Vex.Flow.StemmableNote = undefined;\n public vfEndNote: Vex.Flow.StemmableNote = undefined;\n\n public vfCurve: Vex.Flow.Curve;\n\n public curve_Options(): ICurveOptions {\n return {\n cps: [{ x: 0, y: 10 }, { x: 0, y: 10 }],\n invert: false,\n position: CurvePositionEnum.NEAR_TOP,\n position_end: CurvePositionEnum.NEAR_TOP,\n spacing: 2,\n thickness: 2,\n x_shift: 0,\n y_shift: 10\n };\n }\n\n // public createVexFlowCurve(): void {\n // if (this.voiceentrySlurStart || this.voiceentrySlurEnd) {\n // this.vfCurve = new Vex.Flow.Curve( (this.voiceentrySlurStart as VexFlowVoiceEntry).vfStaveNote,\n // (this.voiceentrySlurEnd as VexFlowVoiceEntry).vfStaveNote,\n // this.curve_Options()\n // );\n // }\n // }\n public createVexFlowCurve(): void {\n this.vfCurve = new Vex.Flow.Curve( this.vfStartNote,\n this.vfEndNote,\n undefined//this.curve_Options()\n );\n }\n}\n\n\n\n\n","// created from 'create-ts-index'\n\nexport * from \"./AbstractNotationInstruction\";\nexport * from \"./ClefInstruction\";\nexport * from \"./KeyInstruction\";\nexport * from \"./RepetitionInstruction\";\nexport * from \"./RhythmInstruction\";\nexport * from \"./TechnicalInstruction\";\n","import Vex from \"vexflow\";\nimport { Staff } from \"../../VoiceData/Staff\";\nimport { SourceMeasure } from \"../../VoiceData/SourceMeasure\";\nimport { VexFlowMeasure } from \"./VexFlowMeasure\";\nimport { VexFlowStaffEntry } from \"./VexFlowStaffEntry\";\nimport { VexFlowConverter } from \"./VexFlowConverter\";\nimport { StaffLine } from \"../StaffLine\";\nimport { GraphicalVoiceEntry } from \"../GraphicalVoiceEntry\";\nimport { VexFlowVoiceEntry } from \"./VexFlowVoiceEntry\";\nimport { Arpeggio } from \"../../VoiceData/Arpeggio\";\nimport { Voice } from \"../../VoiceData/Voice\";\nimport log from \"loglevel\";\n\nexport class VexFlowTabMeasure extends VexFlowMeasure {\n constructor(staff: Staff, sourceMeasure: SourceMeasure = undefined, staffLine: StaffLine = undefined) {\n super(staff, sourceMeasure, staffLine);\n }\n\n /**\n * Reset all the geometric values and parameters of this measure and put it in an initialized state.\n * This is needed to evaluate a measure a second time by system builder.\n */\n public resetLayout(): void {\n // Take into account some space for the begin and end lines of the stave\n // Will be changed when repetitions will be implemented\n //this.beginInstructionsWidth = 20 / UnitInPixels;\n //this.endInstructionsWidth = 20 / UnitInPixels;\n this.stave = new Vex.Flow.TabStave(0, 0, 0, {\n space_above_staff_ln: 0,\n space_below_staff_ln: 0,\n });\n this.updateInstructionWidth();\n }\n\n public graphicalMeasureCreatedCalculations(): void {\n for (let idx: number = 0, len: number = this.staffEntries.length; idx < len; ++idx) {\n const graphicalStaffEntry: VexFlowStaffEntry = (this.staffEntries[idx] as VexFlowStaffEntry);\n\n // create vex flow Notes:\n for (const gve of graphicalStaffEntry.graphicalVoiceEntries) {\n if (gve.notes[0].sourceNote.isRest()) {\n (gve as VexFlowVoiceEntry).vfStaveNote = VexFlowConverter.GhostNote(gve.notes[0].sourceNote.Length);\n } else {\n (gve as VexFlowVoiceEntry).vfStaveNote = VexFlowConverter.CreateTabNote(gve);\n }\n }\n }\n\n this.finalizeTuplets();\n\n const voices: Voice[] = this.getVoicesWithinMeasure();\n\n for (const voice of voices) {\n if (!voice) {\n continue;\n }\n\n // add a vexFlow voice for this voice:\n this.vfVoices[voice.VoiceId] = new Vex.Flow.Voice({\n beat_value: this.parentSourceMeasure.Duration.Denominator,\n num_beats: this.parentSourceMeasure.Duration.Numerator,\n resolution: Vex.Flow.RESOLUTION,\n }).setMode(Vex.Flow.Voice.Mode.SOFT);\n\n const restFilledEntries: GraphicalVoiceEntry[] = this.getRestFilledVexFlowStaveNotesPerVoice(voice);\n // create vex flow voices and add tickables to it:\n for (const voiceEntry of restFilledEntries) {\n if (voiceEntry.parentVoiceEntry) {\n if (voiceEntry.parentVoiceEntry.IsGrace && !voiceEntry.parentVoiceEntry.GraceAfterMainNote) {\n continue;\n }\n }\n\n const vexFlowVoiceEntry: VexFlowVoiceEntry = voiceEntry as VexFlowVoiceEntry;\n if (voiceEntry.notes.length === 0 || !voiceEntry.notes[0] || !voiceEntry.notes[0].sourceNote.PrintObject) {\n // GhostNote, don't add modifiers like in-measure clefs\n this.vfVoices[voice.VoiceId].addTickable(vexFlowVoiceEntry.vfStaveNote);\n continue;\n }\n\n // add fingering\n if (voiceEntry.parentVoiceEntry && this.rules.RenderFingerings) {\n this.createFingerings(voiceEntry);\n }\n\n // add Arpeggio\n if (voiceEntry.parentVoiceEntry && voiceEntry.parentVoiceEntry.Arpeggio) {\n const arpeggio: Arpeggio = voiceEntry.parentVoiceEntry.Arpeggio;\n // TODO right now our arpeggio object has all arpeggio notes from arpeggios across all voices.\n // see VoiceGenerator. Doesn't matter for Vexflow for now though\n if (voiceEntry.notes && voiceEntry.notes.length > 1) {\n const type: Vex.Flow.Stroke.Type = VexFlowConverter.StrokeTypeFromArpeggioType(arpeggio.type);\n const stroke: Vex.Flow.Stroke = new Vex.Flow.Stroke(type, {\n all_voices: this.rules.ArpeggiosGoAcrossVoices\n // default: false. This causes arpeggios to always go across all voices, which is often unwanted.\n // also, this can cause infinite height of stroke, see #546\n });\n //if (arpeggio.notes.length === vexFlowVoiceEntry.notes.length) { // different workaround for endless y bug\n if (this.rules.RenderArpeggios) {\n vexFlowVoiceEntry.vfStaveNote.addStroke(0, stroke);\n }\n } else {\n log.debug(`[OSMD] arpeggio in measure ${this.MeasureNumber} could not be drawn.\n voice entry had less than two notes, arpeggio is likely between voice entries, not currently supported in Vexflow.`);\n // TODO: create new arpeggio with all the arpeggio's notes (arpeggio.notes), perhaps with GhostNotes in a new vfStaveNote. not easy.\n }\n }\n\n this.vfVoices[voice.VoiceId].addTickable(vexFlowVoiceEntry.vfStaveNote);\n }\n }\n //this.createArticulations();\n //this.createOrnaments();\n }\n}\n","import { IStafflineNoteCalculator } from \"../../Interfaces/IStafflineNoteCalculator\";\nimport { GraphicalNote } from \"../GraphicalNote\";\nimport { ClefInstruction, ClefEnum } from \"../../VoiceData\";\nimport { Pitch, NoteEnum, AccidentalEnum } from \"../../../Common\";\nimport { VexFlowGraphicalNote } from \"./VexFlowGraphicalNote\";\nimport { Dictionary } from \"typescript-collections\";\nimport { EngravingRules } from \"../EngravingRules\";\n\nexport class VexflowStafflineNoteCalculator implements IStafflineNoteCalculator {\n private instrumentVoiceMapping: Dictionary> =\n new Dictionary>();\n private rules: EngravingRules;\n private voiceIdx: number = 0;\n\n constructor(rules: EngravingRules) {\n this.rules = rules;\n }\n /**\n * This method is called for each note, and should make any necessary position changes based on the number of stafflines, clef, etc.\n * Right now this just directly maps a voice number to a position above or below a staffline\n * @param graphicalNote The note to be checked/positioned\n * @param currentClef The clef that is active for this note\n * @param stafflineCount The number of stafflines we are rendering on\n * @returns the minimum required x width of the source measure (=list of staff measures)\n */\n public positionNote(graphicalNote: GraphicalNote, currentClef: ClefInstruction, stafflineCount: number): GraphicalNote {\n if (!(graphicalNote instanceof VexFlowGraphicalNote) || currentClef.ClefType !== ClefEnum.percussion ||\n graphicalNote.sourceNote.isRest() || stafflineCount > 1 || this.rules.PercussionOneLineCutoff === 0 ) {\n return graphicalNote;\n }\n\n const forceOneLineCutoff: number = this.rules.PercussionForceVoicesOneLineCutoff;\n const forceOneLine: boolean = (forceOneLineCutoff !== undefined && forceOneLineCutoff !== 0) &&\n (forceOneLineCutoff === -1 ||\n graphicalNote.sourceNote.ParentStaff.ParentInstrument.SubInstruments.length < forceOneLineCutoff);\n\n const instrumentId: string = graphicalNote.sourceNote.PlaybackInstrumentId;\n const voiceNumber: number = graphicalNote.parentVoiceEntry.parentVoiceEntry.ParentVoice.VoiceId;\n let currentInstrumentMapping: Dictionary = undefined;\n\n if (!this.instrumentVoiceMapping.containsKey(instrumentId)) {\n currentInstrumentMapping = new Dictionary();\n this.instrumentVoiceMapping.setValue(instrumentId, currentInstrumentMapping);\n } else {\n currentInstrumentMapping = this.instrumentVoiceMapping.getValue(instrumentId);\n }\n\n let fundamental: NoteEnum = NoteEnum.B;\n let octave: number = 1;\n const vfGraphicalNote: VexFlowGraphicalNote = graphicalNote as VexFlowGraphicalNote;\n\n //if we are forcing to one line, just set to B\n if (!forceOneLine) {\n if (!currentInstrumentMapping.containsKey(voiceNumber)) {\n //Direct mapping for more than one voice, position voices\n switch (this.voiceIdx % 5) {\n case 1:\n fundamental = NoteEnum.A;\n break;\n case 2:\n fundamental = NoteEnum.F;\n break;\n case 3:\n fundamental = NoteEnum.D;\n break;\n case 4:\n fundamental = NoteEnum.B;\n octave = 0;\n break;\n default:\n fundamental = NoteEnum.C;\n octave = 2;\n break;\n }\n //For every new instrument/voice for a instrument, render on diff line\n this.voiceIdx++;\n currentInstrumentMapping.setValue(voiceNumber, {note: fundamental, octave: octave});\n } else {\n const storageObj: {note: NoteEnum, octave: number} = currentInstrumentMapping.getValue(voiceNumber);\n fundamental = storageObj.note;\n octave = storageObj.octave;\n }\n }\n\n //TODO: Check for playback side effects\n vfGraphicalNote.setAccidental(new Pitch(fundamental, octave, AccidentalEnum.NONE));\n return graphicalNote;\n }\n}\n","// created from 'create-ts-index'\n\nexport * from \"./Mxl\";\nexport * from \"./Xml\";\n","/*!\n\nJSZip v3.3.0 - A JavaScript class for generating and reading zip files\n\n\n(c) 2009-2016 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n*/\n\n!function(t){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=t()}}(function(){return function s(a,o,h){function u(r,t){if(!o[r]){if(!a[r]){var e=\"function\"==typeof require&&require;if(!t&&e)return e(r,!0);if(l)return l(r,!0);var i=new Error(\"Cannot find module '\"+r+\"'\");throw i.code=\"MODULE_NOT_FOUND\",i}var n=o[r]={exports:{}};a[r][0].call(n.exports,function(t){var e=a[r][1][t];return u(e||t)},n,n.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,t=0;t>2,s=(3&e)<<4|r>>4,a=1>6:64,o=2>4,r=(15&n)<<4|(s=p.indexOf(t.charAt(o++)))>>2,i=(3&s)<<6|(a=p.indexOf(t.charAt(o++))),l[h++]=e,64!==s&&(l[h++]=r),64!==a&&(l[h++]=i);return l}},{\"./support\":30,\"./utils\":32}],2:[function(t,e,r){\"use strict\";var i=t(\"./external\"),n=t(\"./stream/DataWorker\"),s=t(\"./stream/DataLengthProbe\"),a=t(\"./stream/Crc32Probe\");s=t(\"./stream/DataLengthProbe\");function o(t,e,r,i,n){this.compressedSize=t,this.uncompressedSize=e,this.crc32=r,this.compression=i,this.compressedContent=n}o.prototype={getContentWorker:function(){var t=new n(i.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new s(\"data_length\")),e=this;return t.on(\"end\",function(){if(this.streamInfo.data_length!==e.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),t},getCompressedWorker:function(){return new n(i.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(t,e,r){return t.pipe(new a).pipe(new s(\"uncompressedSize\")).pipe(e.compressWorker(r)).pipe(new s(\"compressedSize\")).withStreamInfo(\"compression\",e)},e.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(t,e,r){\"use strict\";var i=t(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(t){return new i(\"STORE compression\")},uncompressWorker:function(){return new i(\"STORE decompression\")}},r.DEFLATE=t(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(t,e,r){\"use strict\";var i=t(\"./utils\");var o=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e){return void 0!==t&&t.length?\"string\"!==i.getTypeOf(t)?function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e[a])];return-1^t}(0|e,t,t.length,0):function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e.charCodeAt(a))];return-1^t}(0|e,t,t.length,0):0}},{\"./utils\":32}],5:[function(t,e,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(t,e,r){\"use strict\";var i=null;i=\"undefined\"!=typeof Promise?Promise:t(\"lie\"),e.exports={Promise:i}},{lie:37}],7:[function(t,e,r){\"use strict\";var i=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,n=t(\"pako\"),s=t(\"./utils\"),a=t(\"./stream/GenericWorker\"),o=i?\"uint8array\":\"array\";function h(t,e){a.call(this,\"FlateWorker/\"+t),this._pako=null,this._pakoAction=t,this._pakoOptions=e,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(t){this.meta=t.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,t.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new n[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},r.compressWorker=function(t){return new h(\"Deflate\",t)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(t,e,r){\"use strict\";function A(t,e){var r,i=\"\";for(r=0;r>>=8;return i}function i(t,e,r,i,n,s){var a,o,h=t.file,u=t.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),d=I.transformTo(\"string\",O.utf8encode(h.name)),c=h.comment,p=I.transformTo(\"string\",s(c)),m=I.transformTo(\"string\",O.utf8encode(c)),_=d.length!==h.name.length,g=m.length!==c.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(x.crc32=t.crc32,x.compressedSize=t.compressedSize,x.uncompressedSize=t.uncompressedSize);var S=0;e&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===n?(C=798,z|=function(t,e){var r=t;return t||(r=e?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(t){return 63&(t||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+d,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(i,4)+f+b+p}}var I=t(\"../utils\"),n=t(\"../stream/GenericWorker\"),O=t(\"../utf8\"),B=t(\"../crc32\"),R=t(\"../signature\");function s(t,e,r,i){n.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=i,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,n),s.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,i=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,n.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-i-1))/r:100}}))},s.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=i(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=i(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:function(t){return R.DATA_DESCRIPTOR+A(t.crc32,4)+A(t.compressedSize,4)+A(t.uncompressedSize,4)}(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return i.transformTo(\"string\",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},e.exports=n},{\"../utils\":32}],19:[function(t,e,r){\"use strict\";var i=t(\"./Uint8ArrayReader\");function n(t){i.call(this,t)}t(\"../utils\").inherits(n,i),n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(t,e,r){\"use strict\";var i=t(\"./DataReader\");function n(t){i.call(this,t)}t(\"../utils\").inherits(n,i),n.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},n.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},n.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{\"../utils\":32,\"./DataReader\":18}],21:[function(t,e,r){\"use strict\";var i=t(\"./ArrayReader\");function n(t){i.call(this,t)}t(\"../utils\").inherits(n,i),n.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(t,e,r){\"use strict\";var i=t(\"../utils\"),n=t(\"../support\"),s=t(\"./ArrayReader\"),a=t(\"./StringReader\"),o=t(\"./NodeBufferReader\"),h=t(\"./Uint8ArrayReader\");e.exports=function(t){var e=i.getTypeOf(t);return i.checkSupport(e),\"string\"!==e||n.uint8array?\"nodebuffer\"===e?new o(t):n.uint8array?new h(i.transformTo(\"uint8array\",t)):new s(i.transformTo(\"array\",t)):new a(t)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(t,e,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(t,e,r){\"use strict\";var i=t(\"./GenericWorker\"),n=t(\"../utils\");function s(t){i.call(this,\"ConvertWorker to \"+t),this.destType=t}n.inherits(s,i),s.prototype.processChunk=function(t){this.push({data:n.transformTo(this.destType,t.data),meta:t.meta})},e.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(t,e,r){\"use strict\";var i=t(\"./GenericWorker\"),n=t(\"../crc32\");function s(){i.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}t(\"../utils\").inherits(s,i),s.prototype.processChunk=function(t){this.streamInfo.crc32=n(t.data,this.streamInfo.crc32||0),this.push(t)},e.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(t,e,r){\"use strict\";var i=t(\"../utils\"),n=t(\"./GenericWorker\");function s(t){n.call(this,\"DataLengthProbe for \"+t),this.propName=t,this.withStreamInfo(t,0)}i.inherits(s,n),s.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}n.prototype.processChunk.call(this,t)},e.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(t,e,r){\"use strict\";var i=t(\"../utils\"),n=t(\"./GenericWorker\");function s(t){n.call(this,\"DataWorker\");var e=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,t.then(function(t){e.dataIsReady=!0,e.data=t,e.max=t&&t.length||0,e.type=i.getTypeOf(t),e.isPaused||e._tickAndRepeat()},function(t){e.error(t)})}i.inherits(s,n),s.prototype.cleanUp=function(){n.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!n.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,i.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(i.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var t=null,e=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":t=this.data.substring(this.index,e);break;case\"uint8array\":t=this.data.subarray(this.index,e);break;case\"array\":case\"nodebuffer\":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},e.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(t,e,r){\"use strict\";function i(t){this.name=t||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}i.prototype={push:function(t){this.emit(\"data\",t)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(t){this.emit(\"error\",t)}return!0},error:function(t){return!this.isFinished&&(this.isPaused?this.generatedError=t:(this.isFinished=!0,this.emit(\"error\",t),this.previous&&this.previous.error(t),this.cleanUp()),!0)},on:function(t,e){return this._listeners[t].push(e),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(t,e){if(this._listeners[t])for(var r=0;r \"+t:t}},e.exports=i},{}],29:[function(t,e,r){\"use strict\";var h=t(\"../utils\"),n=t(\"./ConvertWorker\"),s=t(\"./GenericWorker\"),u=t(\"../base64\"),i=t(\"../support\"),a=t(\"../external\"),o=null;if(i.nodestream)try{o=t(\"../nodejs/NodejsStreamOutputAdapter\")}catch(t){}function l(t,o){return new a.Promise(function(e,r){var i=[],n=t._internalType,s=t._outputType,a=t._mimeType;t.on(\"data\",function(t,e){i.push(t),o&&o(e)}).on(\"error\",function(t){i=[],r(t)}).on(\"end\",function(){try{var t=function(t,e,r){switch(t){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",e),r);case\"base64\":return u.encode(e);default:return h.transformTo(t,e)}}(s,function(t,e){var r,i=0,n=null,s=0;for(r=0;r>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e}(t)},s.utf8decode=function(t){return h.nodebuffer?o.transformTo(\"nodebuffer\",t).toString(\"utf-8\"):function(t){var e,r,i,n,s=t.length,a=new Array(2*s);for(e=r=0;e>10&1023,a[r++]=56320|1023&i)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(t=o.transformTo(h.uint8array?\"uint8array\":\"array\",t))},o.inherits(a,i),a.prototype.processChunk=function(t){var e=o.transformTo(h.uint8array?\"uint8array\":\"array\",t.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=e;(e=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),e.set(r,this.leftOver.length)}else e=this.leftOver.concat(e);this.leftOver=null}var i=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+u[t[r]]>e?r:e}(e),n=e;i!==e.length&&(h.uint8array?(n=e.subarray(0,i),this.leftOver=e.subarray(i,e.length)):(n=e.slice(0,i),this.leftOver=e.slice(i,e.length))),this.push({data:s.utf8decode(n),meta:t.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,i),l.prototype.processChunk=function(t){this.push({data:s.utf8encode(t.data),meta:t.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(t,e,a){\"use strict\";var o=t(\"./support\"),h=t(\"./base64\"),r=t(\"./nodejsUtils\"),i=t(\"set-immediate-shim\"),u=t(\"./external\");function n(t){return t}function l(t,e){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==t&&(this.dosPermissions=63&this.externalFileAttributes),3==t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=i(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,i,n=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e},r.buf2binstring=function(t){return l(t,t.length)},r.binstring2buf=function(t){for(var e=new h.Buf8(t.length),r=0,i=e.length;r>10&1023,o[i++]=56320|1023&n)}return l(o,i)},r.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+u[t[r]]>e?r:e}},{\"./common\":41}],43:[function(t,e,r){\"use strict\";e.exports=function(t,e,r,i){for(var n=65535&t|0,s=t>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e[a])];return-1^t}},{}],46:[function(t,e,r){\"use strict\";var h,d=t(\"../utils/common\"),u=t(\"./trees\"),c=t(\"./adler32\"),p=t(\"./crc32\"),i=t(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,n=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(t,e){return t.msg=i[e],e}function T(t){return(t<<1)-(4t.avail_out&&(r=t.avail_out),0!==r&&(d.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function N(t,e){u._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,F(t.strm)}function U(t,e){t.pending_buf[t.pending++]=e}function P(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function L(t,e){var r,i,n=t.max_chain_length,s=t.strstart,a=t.prev_length,o=t.nice_match,h=t.strstart>t.w_size-z?t.strstart-(t.w_size-z):0,u=t.window,l=t.w_mask,f=t.prev,d=t.strstart+S,c=u[s+a-1],p=u[s+a];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(u[(r=e)+a]===p&&u[r+a-1]===c&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--n);return a<=t.lookahead?a:t.lookahead}function j(t){var e,r,i,n,s,a,o,h,u,l,f=t.w_size;do{if(n=t.window_size-t.lookahead-t.strstart,t.strstart>=f+(f-z)){for(d.arraySet(t.window,t.window,f,f,0),t.match_start-=f,t.strstart-=f,t.block_start-=f,e=r=t.hash_size;i=t.head[--e],t.head[e]=f<=i?i-f:0,--r;);for(e=r=f;i=t.prev[--e],t.prev[e]=f<=i?i-f:0,--r;);n+=f}if(0===t.strm.avail_in)break;if(a=t.strm,o=t.window,h=t.strstart+t.lookahead,u=n,l=void 0,l=a.avail_in,u=x)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x)if(i=u._tr_tally(t,t.strstart-t.match_start,t.match_length-x),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=x){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x&&t.match_length<=t.prev_length){for(n=t.strstart+t.lookahead-x,i=u._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-x),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=n&&(t.ins_h=(t.ins_h<t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(j(t),0===t.lookahead&&e===l)return A;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+r;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,N(t,!1),0===t.strm.avail_out))return A;if(t.strstart-t.block_start>=t.w_size-z&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):(t.strstart>t.block_start&&(N(t,!1),t.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(t,e){return Y(t,e,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?_:(t.state.gzhead=e,m):_},r.deflate=function(t,e){var r,i,n,s;if(!t||!t.state||5>8&255),U(i,i.gzhead.time>>16&255),U(i,i.gzhead.time>>24&255),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(U(i,255&i.gzhead.extra.length),U(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=p(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(U(i,0),U(i,0),U(i,0),U(i,0),U(i,0),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,3),i.status=E);else{var a=v+(i.w_bits-8<<4)<<8;a|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(a|=32),a+=31-a%31,i.status=E,P(i,a),0!==i.strstart&&(P(i,t.adler>>>16),P(i,65535&t.adler)),t.adler=1}if(69===i.status)if(i.gzhead.extra){for(n=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending!==i.pending_buf_size));)U(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&F(t),i.pending+2<=i.pending_buf_size&&(U(i,255&t.adler),U(i,t.adler>>8&255),t.adler=0,i.status=E)):i.status=E),0!==i.pending){if(F(t),0===t.avail_out)return i.last_flush=-1,m}else if(0===t.avail_in&&T(e)<=T(r)&&e!==f)return R(t,-5);if(666===i.status&&0!==t.avail_in)return R(t,-5);if(0!==t.avail_in||0!==i.lookahead||e!==l&&666!==i.status){var o=2===i.strategy?function(t,e){for(var r;;){if(0===t.lookahead&&(j(t),0===t.lookahead)){if(e===l)return A;break}if(t.match_length=0,r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):3===i.strategy?function(t,e){for(var r,i,n,s,a=t.window;;){if(t.lookahead<=S){if(j(t),t.lookahead<=S&&e===l)return A;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=x&&0t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=x?(r=u._tr_tally(t,1,t.match_length-x),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):h[i.level].func(i,e);if(o!==O&&o!==B||(i.status=666),o===A||o===O)return 0===t.avail_out&&(i.last_flush=-1),m;if(o===I&&(1===e?u._tr_align(i):5!==e&&(u._tr_stored_block(i,0,0,!1),3===e&&(D(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),F(t),0===t.avail_out))return i.last_flush=-1,m}return e!==f?m:i.wrap<=0?1:(2===i.wrap?(U(i,255&t.adler),U(i,t.adler>>8&255),U(i,t.adler>>16&255),U(i,t.adler>>24&255),U(i,255&t.total_in),U(i,t.total_in>>8&255),U(i,t.total_in>>16&255),U(i,t.total_in>>24&255)):(P(i,t.adler>>>16),P(i,65535&t.adler)),F(t),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new d.Buf8(r.w_size),d.arraySet(u,e,l-r.w_size,r.w_size,0),e=u,l=r.w_size),a=t.avail_in,o=t.next_in,h=t.input,t.avail_in=l,t.next_in=0,t.input=e,j(r);r.lookahead>=x;){for(i=r.strstart,n=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(c&(1<>>=y,p-=y),p<15&&(c+=z[i++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(c&(1<>>=y,p-=y,(y=s-a)>3,c&=(1<<(p-=w<<3))-1,t.next_in=i,t.next_out=s,t.avail_in=i>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg=\"\",e.wrap&&(t.adler=1&e.wrap),e.mode=P,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new I.Buf32(i),e.distcode=e.distdyn=new I.Buf32(n),e.sane=1,e.back=-1,N):U}function o(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,a(t)):U}function h(t,e){var r,i;return t&&t.state?(i=t.state,e<0?(r=0,e=-e):(r=1+(e>>4),e<48&&(e&=15)),e&&(e<8||15=s.wsize?(I.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(i<(n=s.wsize-s.wnext)&&(n=i),I.arraySet(s.window,e,r-i,n,s.wnext),(i-=n)?(I.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=n,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){t.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){t.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){t.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break t;o--,u+=i[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break t;o--,u+=i[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break t;o--,u+=i[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(c=r.length)&&(c=o),c&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,i,s,c,k)),512&r.flags&&(r.check=B(r.check,i,c,s)),o-=c,s+=c,r.length-=c),r.length))break t;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break t;for(c=0;k=i[s+c++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&c>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break t;o--,u+=i[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break t;o--,u+=i[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==e)break;u>>>=2,l-=2;break t;case 2:r.mode=17;break;case 3:t.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break t;o--,u+=i[s++]<>>16^65535)){t.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===e)break t;case 15:r.mode=16;case 16:if(c=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){t.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],c=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+c>r.nlen+r.ndist){t.msg=\"invalid bit length repeat\",r.mode=30;break}for(;c--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){t.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){t.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===e)break t;case 20:r.mode=21;case 21:if(6<=o&&258<=h){t.next_out=a,t.avail_out=h,t.next_in=s,t.avail_in=o,r.hold=u,r.bits=l,R(t,d),a=t.next_out,n=t.output,h=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){t.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){t.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break t;if(c=d-h,r.offset>c){if((c=r.offset-c)>r.whave&&r.sane){t.msg=\"invalid distance too far back\",r.mode=30;break}p=c>r.wnext?(c-=r.wnext,r.wsize-c):r.wnext-c,c>r.length&&(c=r.length),m=r.window}else m=n,p=a-r.offset,c=r.length;for(hc?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=e[r+a[v]]}if(k>>7)]}function U(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function P(t,e,r){t.bi_valid>c-r?(t.bi_buf|=e<>c-t.bi_valid,t.bi_valid+=r-c):(t.bi_buf|=e<>>=1,r<<=1,0<--e;);return r>>>1}function Z(t,e,r){var i,n,s=new Array(g+1),a=0;for(i=1;i<=g;i++)s[i]=a=a+r[i-1]<<1;for(n=0;n<=e;n++){var o=t[2*n+1];0!==o&&(t[2*n]=j(s[o]++,o))}}function W(t){var e;for(e=0;e>1;1<=r;r--)G(t,s,r);for(n=h;r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],G(t,s,1),i=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=i,s[2*n]=s[2*r]+s[2*i],t.depth[n]=(t.depth[r]>=t.depth[i]?t.depth[r]:t.depth[i])+1,s[2*r+1]=s[2*i+1]=n,t.heap[1]=n++,G(t,s,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,i,n,s,a,o,h=e.dyn_tree,u=e.max_code,l=e.stat_desc.static_tree,f=e.stat_desc.has_stree,d=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,p=e.stat_desc.max_length,m=0;for(s=0;s<=g;s++)t.bl_count[s]=0;for(h[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;r<_;r++)p<(s=h[2*h[2*(i=t.heap[r])+1]+1]+1)&&(s=p,m++),h[2*i+1]=s,u>=7;i>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return o;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return h;for(e=32;e>>3,(s=t.static_len+3+7>>>3)<=n&&(n=s)):n=s=r+5,r+4<=n&&-1!==e?J(t,e,r,i):4===t.strategy||s===n?(P(t,2+(i?1:0),3),K(t,z,C)):(P(t,4+(i?1:0),3),function(t,e,r,i){var n;for(P(t,e-257,5),P(t,r-1,5),P(t,i-4,4),n=0;n>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(A[r]+u+1)]++,t.dyn_dtree[2*N(e)]++),t.last_lit===t.lit_bufsize-1},r._tr_align=function(t){P(t,2,3),L(t,m,z),function(t){16===t.bi_valid?(U(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},{\"../utils/common\":41}],53:[function(t,e,r){\"use strict\";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,e,r){\"use strict\";e.exports=\"function\"==typeof setImmediate?setImmediate:function(){var t=[].slice.apply(arguments);t.splice(1,0,0),setTimeout.apply(null,t)}},{}]},{},[10])(10)});","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n","(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a