Verovio
Source code documentation
vrvdef.h
1 // Name: vrvdef.h
3 // Author: Laurent Pugin
4 // Created: 2005
5 // Copyright (c) Authors and others. All rights reserved.
7 
8 #ifndef __VRV_DEF_H__
9 #define __VRV_DEF_H__
10 
11 #include <algorithm>
12 #include <functional>
13 #include <list>
14 #include <map>
15 #include <set>
16 #include <tuple>
17 #include <vector>
18 
19 //----------------------------------------------------------------------------
20 
21 #include "attdef.h"
22 
23 #define VRV_UNSET MEI_UNSET
24 
25 //----------------------------------------------------------------------------
26 
27 #define _USE_MATH_DEFINES // needed by Windows for math constants like "M_PI"
28 #include <math.h>
29 
30 // In case it is not defined before...
31 #ifndef M_PI
32 #define M_PI (3.14159265358979323846264338327950288)
33 #endif
34 
35 namespace vrv {
36 
37 //----------------------------------------------------------------------------
38 // Version
39 //----------------------------------------------------------------------------
40 
41 #define VERSION_MAJOR 6
42 #define VERSION_MINOR 1
43 #define VERSION_REVISION 0
44 // Adds "-dev" in the version number - should be set to false for releases
45 #define VERSION_DEV true
46 
47 //----------------------------------------------------------------------------
48 // Resource directory
49 //----------------------------------------------------------------------------
50 #ifdef RESOURCE_DIR
51 #define VRV_RESOURCE_DIR RESOURCE_DIR
52 #else
53 #define VRV_RESOURCE_DIR "/usr/local/share/verovio"
54 #endif
55 
56 //----------------------------------------------------------------------------
57 // Cast redefinition
58 //----------------------------------------------------------------------------
59 
60 // Can be changed between static and dynamic for debug purposes
61 #ifdef VRV_DYNAMIC_CAST
62 // To be used for all cases where type is cheched through Object::m_type
63 #define vrv_cast dynamic_cast
64 #else
65 #define vrv_cast static_cast
66 #endif
67 
68 //----------------------------------------------------------------------------
69 // Default MIDI values
70 //----------------------------------------------------------------------------
71 
72 #define MIDI_VELOCITY 90
73 #define MIDI_TEMPO 120
74 
75 #define UNACC_GRACENOTE_DUR 27 // in milliseconds
76 #define UNACC_GRACENOTE_FRACTION Fraction(1, 2048)
77 
78 //----------------------------------------------------------------------------
79 // Object defines
80 //----------------------------------------------------------------------------
81 
89 enum ClassId : uint16_t {
90  BOUNDING_BOX = 0, // Should not be instanciated as is
91  OBJECT, // Should not be instanciated as is
92  DEVICE_CONTEXT, // Should not be instanciated as is,
93  FLOATING_OBJECT,
94  FLOATING_POSITIONER,
95  FLOATING_CURVE_POSITIONER,
96  // Ids for ungrouped objects
97  ACCID_FLOATING,
98  ALIGNMENT,
99  ALIGNMENT_REFERENCE,
100  CLEF_ATTR,
101  COURSE,
102  DOC,
103  FACSIMILE,
104  FB,
105  GRPSYM,
106  GRACE_ALIGNER,
107  GRAPHIC,
108  INSTRDEF,
109  KEYSIG_ATTR,
110  LABEL,
111  LABELABBR,
112  LAYER,
113  MEASURE,
114  MEASURE_ALIGNER,
115  MENSUR_ATTR,
116  METERSIG_ATTR,
117  OSSIA,
118  PAGE,
119  PAGES,
120  STAFF,
121  STAFF_ALIGNMENT,
122  STAFFGRP,
123  SURFACE,
124  SVG,
125  SYMBOLDEF,
126  SYMBOLTABLE,
127  SYSTEM,
128  SYSTEM_ALIGNER,
129  SYSTEM_ALIGNMENT,
130  TIMESTAMP_ALIGNER,
131  TUNING,
132  ZONE,
133  // Ids for EditorialElement child classes
134  EDITORIAL_ELEMENT,
135  ABBR,
136  ADD,
137  ANNOT,
138  APP,
139  CHOICE,
140  CORR,
141  DAMAGE,
142  DEL,
143  EXPAN,
144  LEM,
145  ORIG,
146  RDG,
147  REF,
148  REG,
149  RESTORE,
150  SIC,
151  SUBST,
152  SUPPLIED,
153  UNCLEAR,
154  EDITORIAL_ELEMENT_max,
155  // Ids for TextLayoutElement child classes
156  TEXT_LAYOUT_ELEMENT,
157  DIV,
158  // Ids for RunningElement child classes
159  RUNNING_ELEMENT,
160  PGFOOT,
161  PGHEAD,
162  RUNNING_ELEMENT_max,
163  TEXT_LAYOUT_ELEMENT_max,
164  // Ids for PageElement child classes
165  PAGE_ELEMENT,
166  PAGE_MILESTONE_END,
167  MDIV,
168  SCORE,
169  PAGE_ELEMENT_max,
170  // Ids for SystemElement child classes
171  SYSTEM_ELEMENT,
172  SYSTEM_MILESTONE_END,
173  ENDING,
174  EXPANSION,
175  PB,
176  SB,
177  SECTION,
178  SYSTEM_ELEMENT_max,
179  // Ids for ControlElement child classes
180  CONTROL_ELEMENT,
181  ANCHOREDTEXT,
182  ANNOTSCORE,
183  ARPEG,
184  BEAMSPAN,
185  BRACKETSPAN,
186  BREATH,
187  CAESURA,
188  CPMARK,
189  DIR,
190  DYNAM,
191  FERMATA,
192  FING,
193  GLISS,
194  HAIRPIN,
195  HARM,
196  LV,
197  MORDENT,
198  MNUM,
199  ORNAM,
200  OCTAVE,
201  PEDAL,
202  PHRASE,
203  PITCHINFLECTION,
204  REH,
205  REPEATMARK,
206  SLUR,
207  TEMPO,
208  TIE,
209  TRILL,
210  TURN,
211  CONTROL_ELEMENT_max,
212  // Ids for LayerElement child classes
213  LAYER_ELEMENT,
214  ACCID,
215  ARTIC,
216  BARLINE,
217  BEAM,
218  BEATRPT,
219  BTREM,
220  CHORD,
221  CLEF,
222  CUSTOS,
223  DIVLINE,
224  DOT,
225  DOTS,
226  FLAG,
227  FTREM,
228  GENERIC_ELEMENT,
229  GRACEGRP,
230  HALFMRPT,
231  KEYSIG,
232  KEYACCID,
233  LIGATURE,
234  LIQUESCENT,
235  MENSUR,
236  METERSIG,
237  METERSIGGRP,
238  MREST,
239  MRPT,
240  MRPT2,
241  MSPACE,
242  MULTIREST,
243  MULTIRPT,
244  NC,
245  NOTE,
246  NEUME,
247  ORISCUS,
248  PLICA,
249  PROPORT,
250  QUILISMA,
251  REST,
252  SPACE,
253  STEM,
254  SYL,
255  SYLLABLE,
256  TABGRP,
257  TABDURSYM,
258  TIMESTAMP_ATTR,
259  TUPLET,
260  TUPLET_BRACKET,
261  TUPLET_NUM,
262  VERSE,
263  LAYER_ELEMENT_max,
264  // Ids for ScoreDefElement child classes
265  SCOREDEF_ELEMENT,
266  LAYERDEF,
267  SCOREDEF,
268  STAFFDEF,
269  SCOREDEF_ELEMENT_max,
270  // Ids for TextElement child classes
271  TEXT_ELEMENT,
272  FIG,
273  FIGURE,
274  LB,
275  NUM,
276  REND,
277  SYMBOL,
278  TEXT,
279  TEXT_ELEMENT_max,
280  //
281  BBOX_DEVICE_CONTEXT,
282  SVG_DEVICE_CONTEXT,
283  CUSTOM_DEVICE_CONTEXT,
284  // Pseudo ids for custom factory functions
285  FACTORY_STAGEDIR,
286  FACTORY_OSTAFF,
287  //
288  UNSPECIFIED
289 };
290 
295 enum InterfaceId {
296  INTERFACE,
297  INTERFACE_ALT_SYM,
298  INTERFACE_AREA_POS,
299  INTERFACE_BOUNDARY,
300  INTERFACE_DURATION,
301  INTERFACE_LINKING,
302  INTERFACE_FACSIMILE,
303  INTERFACE_OFFSET,
304  INTERFACE_OFFSET_SPANNING,
305  INTERFACE_PITCH,
306  INTERFACE_PLIST,
307  INTERFACE_POSITION,
308  INTERFACE_SCOREDEF,
309  INTERFACE_TEXT_DIR,
310  INTERFACE_TIME_POINT,
311  INTERFACE_TIME_SPANNING
312 };
313 
314 //----------------------------------------------------------------------------
315 // Typedefs
316 //----------------------------------------------------------------------------
317 
318 class Alignment;
319 class Arpeg;
320 class ClassIdComparison;
321 class BeamElementCoord;
322 class BoundingBox;
323 class Comparison;
324 class CurveSpannedElement;
325 class DivLine;
326 class FloatingPositioner;
327 class FloatingCurvePositioner;
328 class GraceAligner;
329 class InterfaceComparison;
330 class LayerElement;
331 class LedgerLine;
332 class LinkingInterface;
333 class Liquescent;
334 class Nc;
335 class Note;
336 class Neume;
337 class Object;
338 class PlistInterface;
339 class Point;
340 class Staff;
341 class Option;
342 class TextElement;
343 class TimePointInterface;
344 class TimeSpanningInterface;
345 
346 typedef std::vector<Object *> ArrayOfObjects;
347 
348 typedef std::vector<const Object *> ArrayOfConstObjects;
349 
350 typedef std::list<Object *> ListOfObjects;
351 
352 typedef std::list<const Object *> ListOfConstObjects;
353 
354 typedef std::set<Object *> SetOfObjects;
355 
356 typedef std::set<const Object *> SetOfConstObjects;
357 
358 typedef std::set<const Object *> SetOfConstObjects;
359 
360 typedef std::vector<Note *> ChordNoteGroup;
361 
362 typedef std::vector<std::tuple<Alignment *, Alignment *, int>> ArrayOfAdjustmentTuples;
363 
364 typedef std::vector<std::tuple<Alignment *, Arpeg *, int, bool>> ArrayOfAlignmentArpegTuples;
365 
366 typedef std::vector<BeamElementCoord *> ArrayOfBeamElementCoords;
367 
368 typedef std::vector<std::pair<int, int>> ArrayOfIntPairs;
369 
370 typedef std::multimap<std::string, LinkingInterface *> MapOfLinkingInterfaceIDPairs;
371 
372 typedef std::map<std::string, Note *> MapOfNoteIDPairs;
373 
374 typedef std::vector<std::pair<Object *, std::string>> ArrayOfPlistObjectIDPairs;
375 
376 typedef std::vector<CurveSpannedElement *> ArrayOfCurveSpannedElements;
377 
378 typedef std::list<std::pair<Object *, data_MEASUREBEAT>> ListOfObjectBeatPairs;
379 
380 typedef std::list<std::pair<const Object *, std::string>> ListOfObjectAttNamePairs;
381 
382 typedef std::list<std::pair<TimePointInterface *, ClassId>> ListOfPointingInterClassIdPairs;
383 
384 typedef std::list<std::pair<TimeSpanningInterface *, ClassId>> ListOfSpanningInterClassIdPairs;
385 
386 typedef std::list<std::pair<TimeSpanningInterface *, Object *>> ListOfSpanningInterOwnerPairs;
387 
388 typedef std::vector<FloatingPositioner *> ArrayOfFloatingPositioners;
389 
390 typedef std::vector<FloatingCurvePositioner *> ArrayOfFloatingCurvePositioners;
391 
392 typedef std::vector<BoundingBox *> ArrayOfBoundingBoxes;
393 
394 typedef std::vector<LedgerLine> ArrayOfLedgerLines;
395 
396 typedef std::vector<TextElement *> ArrayOfTextElements;
397 
398 typedef std::map<const Staff *, std::multiset<int>> MapOfNoteLocs;
399 
400 typedef std::map<const Staff *, std::set<int>> MapOfDotLocs;
401 
402 typedef std::map<std::string, Option *> MapOfStrOptions;
403 
404 typedef std::map<int, data_ACCIDENTAL_WRITTEN> MapOfOctavedPitchAccid;
405 
406 typedef std::map<int, GraceAligner *> MapOfIntGraceAligners;
407 
408 typedef std::vector<std::pair<std::u32string, bool>> ArrayOfStringDynamTypePairs;
409 
410 typedef std::map<ClassId, std::function<Object *(void)>> MapOfClassIdConstructors;
411 
412 typedef std::map<std::string, ClassId> MapOfStrClassIds;
413 
414 typedef std::vector<std::pair<LayerElement *, LayerElement *>> MeasureTieEndpoints;
415 
416 typedef bool (*NotePredicate)(const Note *);
417 
418 typedef std::vector<std::pair<LayerElement *, data_DURATION>> ArrayOfElementDurPairs;
419 
420 typedef std::map<int, std::list<int>> MapOfOssiaStaffNs;
421 
431 struct IntTree {
432  std::map<int, IntTree> child;
433 };
434 
435 typedef std::map<int, IntTree> IntTree_t;
436 
443 typedef std::map<int, bool> VerseN_t;
444 typedef std::map<int, VerseN_t> LayerN_VerserN_t;
445 typedef std::map<int, LayerN_VerserN_t> StaffN_LayerN_VerseN_t;
446 
447 //----------------------------------------------------------------------------
448 // Global defines
449 //----------------------------------------------------------------------------
450 
451 #define DEFINITION_FACTOR 10
452 
453 #define DEFAULT_UNIT 9.0
454 
455 #define isIn(x, a, b) (((x) >= std::min((a), (b))) && ((x) <= std::max((a), (b))))
456 
463 enum FunctorCode { FUNCTOR_CONTINUE = 0, FUNCTOR_SIBLINGS, FUNCTOR_STOP };
464 
465 //----------------------------------------------------------------------------
466 // Maximum number of levels between parent and children for optimizing search
467 //----------------------------------------------------------------------------
468 
472 #define MAX_ACCID_DEPTH -1
473 
475 #define MAX_BEAM_DEPTH -1
476 
478 #define MAX_CHORD_DEPTH -1
479 
481 #define MAX_FTREM_DEPTH -1
482 
484 #define MAX_LIGATURE_DEPTH -1
485 
487 #define MAX_TABGRP_DEPTH -1
488 
490 #define MAX_TUPLET_DEPTH -1
491 
493 #define MAX_STAFFGRP_DEPTH -1
494 
496 #define MAX_NOTE_DEPTH -1
497 
498 //----------------------------------------------------------------------------
499 // Ossia staff / layer @n offset (assuming we never have @n that high)
500 //----------------------------------------------------------------------------
501 
502 #define OSSIA_N_OFFSET 1000000
503 
504 //----------------------------------------------------------------------------
505 // Unicode music codepoints
506 //----------------------------------------------------------------------------
507 
508 #define UNICODE_FLAT U'\u266D' // ♭
509 #define UNICODE_NATURAL U'\u266E' // ♮
510 #define UNICODE_SHARP U'\u266F' // ♯
511 
512 #define UNICODE_UNDERTIE U'\u203F' // ‿
513 
514 #define UNICODE_DAL_SEGNO U'\U0001D109' // 𝄉
515 #define UNICODE_DA_CAPO U'\U0001D10A' // 𝄊
516 #define UNICODE_SEGNO U'\U0001D10B' // 𝄋
517 #define UNICODE_CODA U'\U0001D10C' // 𝄌
518 
519 #define UNICODE_DOUBLE_FLAT U'\U0001D12B' // 𝄫
520 #define UNICODE_DOUBLE_SHARP U'\U0001D12A' // 𝄪
521 
522 //----------------------------------------------------------------------------
523 // VerovioText codepoints
524 //----------------------------------------------------------------------------
525 
534 #define VRV_TEXT_HARM \
535  U"\u266D\u266E\u266F" \
536  U"\uE260\uE261\uE262\uE263\uE264" \
537  U"\uEA50\uEA51\uEA52\uEA53\uEA54\uEA55\uEA56\uEA57\uEA58\uEA59\uEA5A\uEA5B\uEA5C\uEA5D\uEA5E" \
538  U"\uEA5F\uEA60\uEA61\uEA62\uEA63\uEA64\uEA65\uEA66\uEA67" \
539  U"\uECC0"
540 
541 //----------------------------------------------------------------------------
542 // data.LINEWIDTHTERM factors
543 //----------------------------------------------------------------------------
544 
545 #define LINEWIDTHTERM_factor_narrow 1.0
546 #define LINEWIDTHTERM_factor_medium 2.0
547 #define LINEWIDTHTERM_factor_wide 4.0
548 
549 //----------------------------------------------------------------------------
550 // Types for editorial element
551 //----------------------------------------------------------------------------
552 
553 // the maximum is 255 (unsigned char)
554 enum EditorialLevel {
555  EDITORIAL_UNDEFINED = 0,
556  EDITORIAL_SCORE,
557  EDITORIAL_TOPLEVEL,
558  EDITORIAL_SCOREDEF,
559  EDITORIAL_STAFFGRP,
560  EDITORIAL_MEASURE,
561  EDITORIAL_STAFF,
562  EDITORIAL_LAYER,
563  EDITORIAL_NOTE,
564  EDITORIAL_TEXT,
565  EDITORIAL_FB,
566  EDITORIAL_RUNNING,
567 };
568 
569 //----------------------------------------------------------------------------
570 // Visibility for editorial and mdiv elements
571 //----------------------------------------------------------------------------
572 
573 enum VisibilityType { Hidden = 0, Visible };
574 
575 //----------------------------------------------------------------------------
576 // The used SMuFL glyph anchors
577 //----------------------------------------------------------------------------
578 
579 enum SMuFLGlyphAnchor {
580  SMUFL_stemDownNW = 0,
581  SMUFL_stemUpSE,
582  SMUFL_cutOutNE,
583  SMUFL_cutOutNW,
584  SMUFL_cutOutSE,
585  SMUFL_cutOutSW
586 };
587 
588 //----------------------------------------------------------------------------
589 // Spanning types for control events
590 //----------------------------------------------------------------------------
591 
592 enum { SPANNING_START_END = 0, SPANNING_START, SPANNING_END, SPANNING_MIDDLE };
593 
594 //----------------------------------------------------------------------------
595 // Types for layer element
596 //----------------------------------------------------------------------------
597 
603 enum ElementScoreDefRole {
604  SCOREDEF_NONE = 0,
605  SCOREDEF_SYSTEM,
606  SCOREDEF_INTERMEDIATE,
607  SCOREDEF_CAUTIONARY,
608  SCOREDEF_OSSIA
609 };
610 
611 //----------------------------------------------------------------------------
612 // ScoreDef drawing labels
613 //----------------------------------------------------------------------------
614 
615 enum ScoreDefDrawingLabels { DRAWING_LABEL_FULL = 0, DRAWING_LABEL_ABBR, DRAWING_LABEL_NONE };
616 
617 //----------------------------------------------------------------------------
618 // Artic types
619 //----------------------------------------------------------------------------
620 
621 enum ArticType { ARTIC_INSIDE = 0, ARTIC_OUTSIDE };
622 
623 //----------------------------------------------------------------------------
624 // Visibility optimization
625 //----------------------------------------------------------------------------
626 
627 enum VisibilityOptimization { OPTIMIZATION_NONE = 0, OPTIMIZATION_HIDDEN, OPTIMIZATION_SHOW };
628 
629 //----------------------------------------------------------------------------
630 // Layout positions (3 x 3 grid)
631 //----------------------------------------------------------------------------
632 
633 enum {
634  POSITION_LEFT = 0,
635  POSITION_CENTER,
636  POSITION_RIGHT,
637 };
638 
639 enum {
640  POSITION_TOP = 0,
641  POSITION_MIDDLE = 3,
642  POSITION_BOTTOM = 6,
643 };
644 
645 //----------------------------------------------------------------------------
646 // Ligature shape bitfields
647 //----------------------------------------------------------------------------
648 
649 enum {
650  LIGATURE_DEFAULT = 0,
651  LIGATURE_STEM_LEFT_UP = 1,
652  LIGATURE_STEM_LEFT_DOWN = 2,
653  LIGATURE_STEM_RIGHT_UP = 4,
654  LIGATURE_STEM_RIGHT_DOWN = 8,
655  LIGATURE_OBLIQUE = 16,
656  LIGATURE_STACKED = 32
657 };
658 
659 //----------------------------------------------------------------------------
660 // Analytical markup bitfields
661 //----------------------------------------------------------------------------
662 
663 enum {
664  MARKUP_DEFAULT = 0,
665  MARKUP_ANALYTICAL_TIE = 1,
666  MARKUP_ANALYTICAL_FERMATA = 2,
667  MARKUP_GRACE_ATTRIBUTE = 4,
668  MARKUP_ARTIC_MULTIVAL = 8,
669  MARKUP_SCOREDEF_DEFINITIONS = 16
670 };
671 
672 //----------------------------------------------------------------------------
673 // Layout information
674 //----------------------------------------------------------------------------
675 
676 enum LayoutInformation { LAYOUT_NONE = 0, LAYOUT_ENCODED, LAYOUT_DONE };
677 
678 //----------------------------------------------------------------------------
679 // Bounding box access
680 //----------------------------------------------------------------------------
681 
682 enum Accessor { SELF = 0, CONTENT };
683 
684 //----------------------------------------------------------------------------
685 // Some keys
686 //----------------------------------------------------------------------------
687 
688 enum { KEY_LEFT = 37, KEY_UP = 38, KEY_RIGHT = 39, KEY_DOWN = 40 };
689 
690 //----------------------------------------------------------------------------
691 // Stem sameas drawing role
692 //----------------------------------------------------------------------------
693 
694 enum StemSameasDrawingRole { SAMEAS_NONE = 0, SAMEAS_UNSET, SAMEAS_PRIMARY, SAMEAS_SECONDARY };
695 
696 //----------------------------------------------------------------------------
697 // Smufl text font (selected font or fallback)
698 //----------------------------------------------------------------------------
699 
700 enum SmuflTextFont { SMUFL_NONE = 0, SMUFL_FONT_SELECTED, SMUFL_FONT_FALLBACK };
701 
702 //----------------------------------------------------------------------------
703 // Graphic ID type
704 //----------------------------------------------------------------------------
705 
706 enum GraphicID { PRIMARY = 0, SPANNING, SYMBOLREF };
707 
708 //----------------------------------------------------------------------------
709 // Measure type
710 //----------------------------------------------------------------------------
711 
712 enum MeasureType { MEASURED = 0, UNMEASURED, NEUMELINE };
713 
714 //----------------------------------------------------------------------------
715 // Focus status type
716 //----------------------------------------------------------------------------
717 
718 enum FocusStatusType { FOCUS_UNSET = 0, FOCUS_SET, FOCUS_USED };
719 
720 //----------------------------------------------------------------------------
721 // The score time unit (quarter note)
722 //----------------------------------------------------------------------------
723 
724 #define SCORE_TIME_UNIT 4
725 
726 //----------------------------------------------------------------------------
727 // Section representing a line in neon
728 //----------------------------------------------------------------------------
729 
730 #define NEUME_LINE_TYPE "neon-neume-line"
731 
732 //----------------------------------------------------------------------------
733 // Legacy Wolfgang defines
734 //----------------------------------------------------------------------------
735 
736 #define OCTAVE_OFFSET 4
737 
738 // in half staff spaces (but should be 6 in two-voice notation)
739 #define STANDARD_STEMLENGTH 7
740 #define STANDARD_STEMLENGTH_TAB 3
741 
742 //----------------------------------------------------------------------------
743 // Temporary - to be made an option?
744 //----------------------------------------------------------------------------
745 
746 #define TABLATURE_STAFF_RATIO 1.75
747 #define GERMAN_TAB_STAFF_RATIO 2.2
748 
749 #define SUPER_SCRIPT_FACTOR 0.58
750 #define SUPER_SCRIPT_POSITION -0.20 // lowered down from the midline
751 #define SUB_SCRIPT_POSITION -0.17 // lowered down from the baseline
752 
753 //----------------------------------------------------------------------------
754 // Neume notation note size to staff size ratio defines
755 //----------------------------------------------------------------------------
756 
757 #define NOTE_HEIGHT_TO_STAFF_SIZE_RATIO 2
758 #define NOTE_WIDTH_TO_STAFF_SIZE_RATIO 1.4
759 
760 } // namespace vrv
761 
762 #endif // __VRV_DEF_H__
Generic int map recursive structure for storing hierachy of values For example, we want to process al...
Definition: vrvdef.h:431