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 5
42 #define VERSION_MINOR 8
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_OSTAFF,
286  //
287  UNSPECIFIED
288 };
289 
294 enum InterfaceId {
295  INTERFACE,
296  INTERFACE_ALT_SYM,
297  INTERFACE_AREA_POS,
298  INTERFACE_BOUNDARY,
299  INTERFACE_DURATION,
300  INTERFACE_LINKING,
301  INTERFACE_FACSIMILE,
302  INTERFACE_OFFSET,
303  INTERFACE_OFFSET_SPANNING,
304  INTERFACE_PITCH,
305  INTERFACE_PLIST,
306  INTERFACE_POSITION,
307  INTERFACE_SCOREDEF,
308  INTERFACE_TEXT_DIR,
309  INTERFACE_TIME_POINT,
310  INTERFACE_TIME_SPANNING
311 };
312 
313 //----------------------------------------------------------------------------
314 // Typedefs
315 //----------------------------------------------------------------------------
316 
317 class Alignment;
318 class Arpeg;
319 class ClassIdComparison;
320 class BeamElementCoord;
321 class BoundingBox;
322 class Comparison;
323 class CurveSpannedElement;
324 class DivLine;
325 class FloatingPositioner;
326 class FloatingCurvePositioner;
327 class GraceAligner;
328 class InterfaceComparison;
329 class LayerElement;
330 class LedgerLine;
331 class LinkingInterface;
332 class Liquescent;
333 class Nc;
334 class Note;
335 class Neume;
336 class Object;
337 class PlistInterface;
338 class Point;
339 class Staff;
340 class Option;
341 class TextElement;
342 class TimePointInterface;
343 class TimeSpanningInterface;
344 
345 typedef std::vector<Object *> ArrayOfObjects;
346 
347 typedef std::vector<const Object *> ArrayOfConstObjects;
348 
349 typedef std::list<Object *> ListOfObjects;
350 
351 typedef std::list<const Object *> ListOfConstObjects;
352 
353 typedef std::set<Object *> SetOfObjects;
354 
355 typedef std::set<const Object *> SetOfConstObjects;
356 
357 typedef std::set<const Object *> SetOfConstObjects;
358 
359 typedef std::vector<Note *> ChordNoteGroup;
360 
361 typedef std::vector<std::tuple<Alignment *, Alignment *, int>> ArrayOfAdjustmentTuples;
362 
363 typedef std::vector<std::tuple<Alignment *, Arpeg *, int, bool>> ArrayOfAlignmentArpegTuples;
364 
365 typedef std::vector<BeamElementCoord *> ArrayOfBeamElementCoords;
366 
367 typedef std::vector<std::pair<int, int>> ArrayOfIntPairs;
368 
369 typedef std::multimap<std::string, LinkingInterface *> MapOfLinkingInterfaceIDPairs;
370 
371 typedef std::map<std::string, Note *> MapOfNoteIDPairs;
372 
373 typedef std::vector<std::pair<Object *, std::string>> ArrayOfPlistObjectIDPairs;
374 
375 typedef std::vector<CurveSpannedElement *> ArrayOfCurveSpannedElements;
376 
377 typedef std::list<std::pair<Object *, data_MEASUREBEAT>> ListOfObjectBeatPairs;
378 
379 typedef std::list<std::pair<const Object *, std::string>> ListOfObjectAttNamePairs;
380 
381 typedef std::list<std::pair<TimePointInterface *, ClassId>> ListOfPointingInterClassIdPairs;
382 
383 typedef std::list<std::pair<TimeSpanningInterface *, ClassId>> ListOfSpanningInterClassIdPairs;
384 
385 typedef std::list<std::pair<TimeSpanningInterface *, Object *>> ListOfSpanningInterOwnerPairs;
386 
387 typedef std::vector<FloatingPositioner *> ArrayOfFloatingPositioners;
388 
389 typedef std::vector<FloatingCurvePositioner *> ArrayOfFloatingCurvePositioners;
390 
391 typedef std::vector<BoundingBox *> ArrayOfBoundingBoxes;
392 
393 typedef std::vector<LedgerLine> ArrayOfLedgerLines;
394 
395 typedef std::vector<TextElement *> ArrayOfTextElements;
396 
397 typedef std::map<const Staff *, std::multiset<int>> MapOfNoteLocs;
398 
399 typedef std::map<const Staff *, std::set<int>> MapOfDotLocs;
400 
401 typedef std::map<std::string, Option *> MapOfStrOptions;
402 
403 typedef std::map<int, data_ACCIDENTAL_WRITTEN> MapOfOctavedPitchAccid;
404 
405 typedef std::map<int, GraceAligner *> MapOfIntGraceAligners;
406 
407 typedef std::vector<std::pair<std::u32string, bool>> ArrayOfStringDynamTypePairs;
408 
409 typedef std::map<ClassId, std::function<Object *(void)>> MapOfClassIdConstructors;
410 
411 typedef std::map<std::string, ClassId> MapOfStrClassIds;
412 
413 typedef std::vector<std::pair<LayerElement *, LayerElement *>> MeasureTieEndpoints;
414 
415 typedef bool (*NotePredicate)(const Note *);
416 
417 typedef std::vector<std::pair<LayerElement *, data_DURATION>> ArrayOfElementDurPairs;
418 
419 typedef std::map<int, std::list<int>> MapOfOssiaStaffNs;
420 
430 struct IntTree {
431  std::map<int, IntTree> child;
432 };
433 
434 typedef std::map<int, IntTree> IntTree_t;
435 
442 typedef std::map<int, bool> VerseN_t;
443 typedef std::map<int, VerseN_t> LayerN_VerserN_t;
444 typedef std::map<int, LayerN_VerserN_t> StaffN_LayerN_VerseN_t;
445 
446 //----------------------------------------------------------------------------
447 // Global defines
448 //----------------------------------------------------------------------------
449 
450 #define DEFINITION_FACTOR 10
451 
452 #define DEFAULT_UNIT 9.0
453 
454 #define isIn(x, a, b) (((x) >= std::min((a), (b))) && ((x) <= std::max((a), (b))))
455 
462 enum FunctorCode { FUNCTOR_CONTINUE = 0, FUNCTOR_SIBLINGS, FUNCTOR_STOP };
463 
464 //----------------------------------------------------------------------------
465 // Maximum number of levels between parent and children for optimizing search
466 //----------------------------------------------------------------------------
467 
471 #define MAX_ACCID_DEPTH -1
472 
474 #define MAX_BEAM_DEPTH -1
475 
477 #define MAX_CHORD_DEPTH -1
478 
480 #define MAX_FTREM_DEPTH -1
481 
483 #define MAX_LIGATURE_DEPTH -1
484 
486 #define MAX_TABGRP_DEPTH -1
487 
489 #define MAX_TUPLET_DEPTH -1
490 
492 #define MAX_STAFFGRP_DEPTH -1
493 
495 #define MAX_NOTE_DEPTH -1
496 
497 //----------------------------------------------------------------------------
498 // Ossia staff / layer @n offset (assuming we never have @n that high)
499 //----------------------------------------------------------------------------
500 
501 #define OSSIA_N_OFFSET 1000000
502 
503 //----------------------------------------------------------------------------
504 // Unicode music codepoints
505 //----------------------------------------------------------------------------
506 
507 #define UNICODE_FLAT U'\u266D' // ♭
508 #define UNICODE_NATURAL U'\u266E' // ♮
509 #define UNICODE_SHARP U'\u266F' // ♯
510 
511 #define UNICODE_UNDERTIE U'\u203F' // ‿
512 
513 #define UNICODE_DAL_SEGNO U'\U0001D109' // 𝄉
514 #define UNICODE_DA_CAPO U'\U0001D10A' // 𝄊
515 #define UNICODE_SEGNO U'\U0001D10B' // 𝄋
516 #define UNICODE_CODA U'\U0001D10C' // 𝄌
517 
518 #define UNICODE_DOUBLE_FLAT U'\U0001D12B' // 𝄫
519 #define UNICODE_DOUBLE_SHARP U'\U0001D12A' // 𝄪
520 
521 //----------------------------------------------------------------------------
522 // VerovioText codepoints
523 //----------------------------------------------------------------------------
524 
533 #define VRV_TEXT_HARM \
534  U"\u266D\u266E\u266F" \
535  U"\uE260\uE261\uE262\uE263\uE264" \
536  U"\uEA50\uEA51\uEA52\uEA53\uEA54\uEA55\uEA56\uEA57\uEA58\uEA59\uEA5A\uEA5B\uEA5C\uEA5D\uEA5E" \
537  U"\uEA5F\uEA60\uEA61\uEA62\uEA63\uEA64\uEA65\uEA66\uEA67" \
538  U"\uECC0"
539 
540 //----------------------------------------------------------------------------
541 // data.LINEWIDTHTERM factors
542 //----------------------------------------------------------------------------
543 
544 #define LINEWIDTHTERM_factor_narrow 1.0
545 #define LINEWIDTHTERM_factor_medium 2.0
546 #define LINEWIDTHTERM_factor_wide 4.0
547 
548 //----------------------------------------------------------------------------
549 // Types for editorial element
550 //----------------------------------------------------------------------------
551 
552 // the maximum is 255 (unsigned char)
553 enum EditorialLevel {
554  EDITORIAL_UNDEFINED = 0,
555  EDITORIAL_SCORE,
556  EDITORIAL_TOPLEVEL,
557  EDITORIAL_SCOREDEF,
558  EDITORIAL_STAFFGRP,
559  EDITORIAL_MEASURE,
560  EDITORIAL_STAFF,
561  EDITORIAL_LAYER,
562  EDITORIAL_NOTE,
563  EDITORIAL_TEXT,
564  EDITORIAL_FB,
565  EDITORIAL_RUNNING,
566 };
567 
568 //----------------------------------------------------------------------------
569 // Visibility for editorial and mdiv elements
570 //----------------------------------------------------------------------------
571 
572 enum VisibilityType { Hidden = 0, Visible };
573 
574 //----------------------------------------------------------------------------
575 // The used SMuFL glyph anchors
576 //----------------------------------------------------------------------------
577 
578 enum SMuFLGlyphAnchor {
579  SMUFL_stemDownNW = 0,
580  SMUFL_stemUpSE,
581  SMUFL_cutOutNE,
582  SMUFL_cutOutNW,
583  SMUFL_cutOutSE,
584  SMUFL_cutOutSW
585 };
586 
587 //----------------------------------------------------------------------------
588 // Spanning types for control events
589 //----------------------------------------------------------------------------
590 
591 enum { SPANNING_START_END = 0, SPANNING_START, SPANNING_END, SPANNING_MIDDLE };
592 
593 //----------------------------------------------------------------------------
594 // Types for layer element
595 //----------------------------------------------------------------------------
596 
602 enum ElementScoreDefRole {
603  SCOREDEF_NONE = 0,
604  SCOREDEF_SYSTEM,
605  SCOREDEF_INTERMEDIATE,
606  SCOREDEF_CAUTIONARY,
607  SCOREDEF_OSSIA
608 };
609 
610 //----------------------------------------------------------------------------
611 // ScoreDef drawing labels
612 //----------------------------------------------------------------------------
613 
614 enum ScoreDefDrawingLabels { DRAWING_LABEL_FULL = 0, DRAWING_LABEL_ABBR, DRAWING_LABEL_NONE };
615 
616 //----------------------------------------------------------------------------
617 // Artic types
618 //----------------------------------------------------------------------------
619 
620 enum ArticType { ARTIC_INSIDE = 0, ARTIC_OUTSIDE };
621 
622 //----------------------------------------------------------------------------
623 // Visibility optimization
624 //----------------------------------------------------------------------------
625 
626 enum VisibilityOptimization { OPTIMIZATION_NONE = 0, OPTIMIZATION_HIDDEN, OPTIMIZATION_SHOW };
627 
628 //----------------------------------------------------------------------------
629 // Layout positions (3 x 3 grid)
630 //----------------------------------------------------------------------------
631 
632 enum {
633  POSITION_LEFT = 0,
634  POSITION_CENTER,
635  POSITION_RIGHT,
636 };
637 
638 enum {
639  POSITION_TOP = 0,
640  POSITION_MIDDLE = 3,
641  POSITION_BOTTOM = 6,
642 };
643 
644 //----------------------------------------------------------------------------
645 // Ligature shape bitfields
646 //----------------------------------------------------------------------------
647 
648 enum {
649  LIGATURE_DEFAULT = 0,
650  LIGATURE_STEM_LEFT_UP = 1,
651  LIGATURE_STEM_LEFT_DOWN = 2,
652  LIGATURE_STEM_RIGHT_UP = 4,
653  LIGATURE_STEM_RIGHT_DOWN = 8,
654  LIGATURE_OBLIQUE = 16,
655  LIGATURE_STACKED = 32
656 };
657 
658 //----------------------------------------------------------------------------
659 // Analytical markup bitfields
660 //----------------------------------------------------------------------------
661 
662 enum {
663  MARKUP_DEFAULT = 0,
664  MARKUP_ANALYTICAL_TIE = 1,
665  MARKUP_ANALYTICAL_FERMATA = 2,
666  MARKUP_GRACE_ATTRIBUTE = 4,
667  MARKUP_ARTIC_MULTIVAL = 8,
668  MARKUP_SCOREDEF_DEFINITIONS = 16
669 };
670 
671 //----------------------------------------------------------------------------
672 // Layout information
673 //----------------------------------------------------------------------------
674 
675 enum LayoutInformation { LAYOUT_NONE = 0, LAYOUT_ENCODED, LAYOUT_DONE };
676 
677 //----------------------------------------------------------------------------
678 // Bounding box access
679 //----------------------------------------------------------------------------
680 
681 enum Accessor { SELF = 0, CONTENT };
682 
683 //----------------------------------------------------------------------------
684 // Some keys
685 //----------------------------------------------------------------------------
686 
687 enum { KEY_LEFT = 37, KEY_UP = 38, KEY_RIGHT = 39, KEY_DOWN = 40 };
688 
689 //----------------------------------------------------------------------------
690 // Stem sameas drawing role
691 //----------------------------------------------------------------------------
692 
693 enum StemSameasDrawingRole { SAMEAS_NONE = 0, SAMEAS_UNSET, SAMEAS_PRIMARY, SAMEAS_SECONDARY };
694 
695 //----------------------------------------------------------------------------
696 // Smufl text font (selected font or fallback)
697 //----------------------------------------------------------------------------
698 
699 enum SmuflTextFont { SMUFL_NONE = 0, SMUFL_FONT_SELECTED, SMUFL_FONT_FALLBACK };
700 
701 //----------------------------------------------------------------------------
702 // Graphic ID type
703 //----------------------------------------------------------------------------
704 
705 enum GraphicID { PRIMARY = 0, SPANNING, SYMBOLREF };
706 
707 //----------------------------------------------------------------------------
708 // Measure type
709 //----------------------------------------------------------------------------
710 
711 enum MeasureType { MEASURED = 0, UNMEASURED, NEUMELINE };
712 
713 //----------------------------------------------------------------------------
714 // Focus status type
715 //----------------------------------------------------------------------------
716 
717 enum FocusStatusType { FOCUS_UNSET = 0, FOCUS_SET, FOCUS_USED };
718 
719 //----------------------------------------------------------------------------
720 // The score time unit (quarter note)
721 //----------------------------------------------------------------------------
722 
723 #define SCORE_TIME_UNIT 4
724 
725 //----------------------------------------------------------------------------
726 // Section representing a line in neon
727 //----------------------------------------------------------------------------
728 
729 #define NEUME_LINE_TYPE "neon-neume-line"
730 
731 //----------------------------------------------------------------------------
732 // Legacy Wolfgang defines
733 //----------------------------------------------------------------------------
734 
735 #define OCTAVE_OFFSET 4
736 
737 // in half staff spaces (but should be 6 in two-voice notation)
738 #define STANDARD_STEMLENGTH 7
739 #define STANDARD_STEMLENGTH_TAB 3
740 
741 //----------------------------------------------------------------------------
742 // Temporary - to be made an option?
743 //----------------------------------------------------------------------------
744 
745 #define TABLATURE_STAFF_RATIO 1.75
746 #define GERMAN_TAB_STAFF_RATIO 2.2
747 
748 #define SUPER_SCRIPT_FACTOR 0.58
749 #define SUPER_SCRIPT_POSITION -0.20 // lowered down from the midline
750 #define SUB_SCRIPT_POSITION -0.17 // lowered down from the baseline
751 
752 //----------------------------------------------------------------------------
753 // Neume notation note size to staff size ratio defines
754 //----------------------------------------------------------------------------
755 
756 #define NOTE_HEIGHT_TO_STAFF_SIZE_RATIO 2
757 #define NOTE_WIDTH_TO_STAFF_SIZE_RATIO 1.4
758 
759 } // namespace vrv
760 
761 #endif // __VRV_DEF_H__
Generic int map recursive structure for storing hierachy of values For example, we want to process al...
Definition: vrvdef.h:430