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 7
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  PAGE,
118  PAGES,
119  STAFF,
120  STAFF_ALIGNMENT,
121  STAFFGRP,
122  SURFACE,
123  SVG,
124  SYMBOLDEF,
125  SYMBOLTABLE,
126  SYSTEM,
127  SYSTEM_ALIGNER,
128  SYSTEM_ALIGNMENT,
129  TIMESTAMP_ALIGNER,
130  TUNING,
131  ZONE,
132  // Ids for EditorialElement child classes
133  EDITORIAL_ELEMENT,
134  ABBR,
135  ADD,
136  ANNOT,
137  APP,
138  CHOICE,
139  CORR,
140  DAMAGE,
141  DEL,
142  EXPAN,
143  LEM,
144  ORIG,
145  RDG,
146  REF,
147  REG,
148  RESTORE,
149  SIC,
150  SUBST,
151  SUPPLIED,
152  UNCLEAR,
153  EDITORIAL_ELEMENT_max,
154  // Ids for TextLayoutElement child classes
155  TEXT_LAYOUT_ELEMENT,
156  DIV,
157  // Ids for RunningElement child classes
158  RUNNING_ELEMENT,
159  PGFOOT,
160  PGHEAD,
161  RUNNING_ELEMENT_max,
162  TEXT_LAYOUT_ELEMENT_max,
163  // Ids for PageElement child classes
164  PAGE_ELEMENT,
165  PAGE_MILESTONE_END,
166  MDIV,
167  SCORE,
168  PAGE_ELEMENT_max,
169  // Ids for SystemElement child classes
170  SYSTEM_ELEMENT,
171  SYSTEM_MILESTONE_END,
172  ENDING,
173  EXPANSION,
174  PB,
175  SB,
176  SECTION,
177  SYSTEM_ELEMENT_max,
178  // Ids for ControlElement child classes
179  CONTROL_ELEMENT,
180  ANCHOREDTEXT,
181  ANNOTSCORE,
182  ARPEG,
183  BEAMSPAN,
184  BRACKETSPAN,
185  BREATH,
186  CAESURA,
187  CPMARK,
188  DIR,
189  DYNAM,
190  FERMATA,
191  FING,
192  GLISS,
193  HAIRPIN,
194  HARM,
195  LV,
196  MORDENT,
197  MNUM,
198  ORNAM,
199  OCTAVE,
200  PEDAL,
201  PHRASE,
202  PITCHINFLECTION,
203  REH,
204  REPEATMARK,
205  SLUR,
206  TEMPO,
207  TIE,
208  TRILL,
209  TURN,
210  CONTROL_ELEMENT_max,
211  // Ids for LayerElement child classes
212  LAYER_ELEMENT,
213  ACCID,
214  ARTIC,
215  BARLINE,
216  BEAM,
217  BEATRPT,
218  BTREM,
219  CHORD,
220  CLEF,
221  CUSTOS,
222  DIVLINE,
223  DOT,
224  DOTS,
225  FLAG,
226  FTREM,
227  GENERIC_ELEMENT,
228  GRACEGRP,
229  HALFMRPT,
230  KEYSIG,
231  KEYACCID,
232  LIGATURE,
233  LIQUESCENT,
234  MENSUR,
235  METERSIG,
236  METERSIGGRP,
237  MREST,
238  MRPT,
239  MRPT2,
240  MSPACE,
241  MULTIREST,
242  MULTIRPT,
243  NC,
244  NOTE,
245  NEUME,
246  ORISCUS,
247  PLICA,
248  PROPORT,
249  QUILISMA,
250  REST,
251  SPACE,
252  STEM,
253  SYL,
254  SYLLABLE,
255  TABGRP,
256  TABDURSYM,
257  TIMESTAMP_ATTR,
258  TUPLET,
259  TUPLET_BRACKET,
260  TUPLET_NUM,
261  VERSE,
262  LAYER_ELEMENT_max,
263  // Ids for ScoreDefElement child classes
264  SCOREDEF_ELEMENT,
265  LAYERDEF,
266  SCOREDEF,
267  STAFFDEF,
268  SCOREDEF_ELEMENT_max,
269  // Ids for TextElement child classes
270  TEXT_ELEMENT,
271  FIG,
272  FIGURE,
273  LB,
274  NUM,
275  REND,
276  SYMBOL,
277  TEXT,
278  TEXT_ELEMENT_max,
279  //
280  BBOX_DEVICE_CONTEXT,
281  SVG_DEVICE_CONTEXT,
282  CUSTOM_DEVICE_CONTEXT,
283  //
284  UNSPECIFIED
285 };
286 
291 enum InterfaceId {
292  INTERFACE,
293  INTERFACE_ALT_SYM,
294  INTERFACE_AREA_POS,
295  INTERFACE_BOUNDARY,
296  INTERFACE_DURATION,
297  INTERFACE_LINKING,
298  INTERFACE_FACSIMILE,
299  INTERFACE_OFFSET,
300  INTERFACE_OFFSET_SPANNING,
301  INTERFACE_PITCH,
302  INTERFACE_PLIST,
303  INTERFACE_POSITION,
304  INTERFACE_SCOREDEF,
305  INTERFACE_TEXT_DIR,
306  INTERFACE_TIME_POINT,
307  INTERFACE_TIME_SPANNING
308 };
309 
310 //----------------------------------------------------------------------------
311 // Typedefs
312 //----------------------------------------------------------------------------
313 
314 class Alignment;
315 class Arpeg;
316 class ClassIdComparison;
317 class BeamElementCoord;
318 class BoundingBox;
319 class Comparison;
320 class CurveSpannedElement;
321 class DivLine;
322 class FloatingPositioner;
323 class FloatingCurvePositioner;
324 class GraceAligner;
325 class InterfaceComparison;
326 class LayerElement;
327 class LedgerLine;
328 class LinkingInterface;
329 class Liquescent;
330 class Nc;
331 class Note;
332 class Neume;
333 class Object;
334 class PlistInterface;
335 class Point;
336 class Staff;
337 class Option;
338 class TextElement;
339 class TimePointInterface;
340 class TimeSpanningInterface;
341 
342 typedef std::vector<Object *> ArrayOfObjects;
343 
344 typedef std::vector<const Object *> ArrayOfConstObjects;
345 
346 typedef std::list<Object *> ListOfObjects;
347 
348 typedef std::list<const Object *> ListOfConstObjects;
349 
350 typedef std::set<Object *> SetOfObjects;
351 
352 typedef std::set<const Object *> SetOfConstObjects;
353 
354 typedef std::set<const Object *> SetOfConstObjects;
355 
356 typedef std::vector<Note *> ChordNoteGroup;
357 
358 typedef std::vector<std::tuple<Alignment *, Alignment *, int>> ArrayOfAdjustmentTuples;
359 
360 typedef std::vector<std::tuple<Alignment *, Arpeg *, int, bool>> ArrayOfAlignmentArpegTuples;
361 
362 typedef std::vector<BeamElementCoord *> ArrayOfBeamElementCoords;
363 
364 typedef std::vector<std::pair<int, int>> ArrayOfIntPairs;
365 
366 typedef std::multimap<std::string, LinkingInterface *> MapOfLinkingInterfaceIDPairs;
367 
368 typedef std::map<std::string, Note *> MapOfNoteIDPairs;
369 
370 typedef std::vector<std::pair<Object *, std::string>> ArrayOfPlistObjectIDPairs;
371 
372 typedef std::vector<CurveSpannedElement *> ArrayOfCurveSpannedElements;
373 
374 typedef std::list<std::pair<Object *, data_MEASUREBEAT>> ListOfObjectBeatPairs;
375 
376 typedef std::list<std::pair<const Object *, std::string>> ListOfObjectAttNamePairs;
377 
378 typedef std::list<std::pair<TimePointInterface *, ClassId>> ListOfPointingInterClassIdPairs;
379 
380 typedef std::list<std::pair<TimeSpanningInterface *, ClassId>> ListOfSpanningInterClassIdPairs;
381 
382 typedef std::list<std::pair<TimeSpanningInterface *, Object *>> ListOfSpanningInterOwnerPairs;
383 
384 typedef std::vector<FloatingPositioner *> ArrayOfFloatingPositioners;
385 
386 typedef std::vector<FloatingCurvePositioner *> ArrayOfFloatingCurvePositioners;
387 
388 typedef std::vector<BoundingBox *> ArrayOfBoundingBoxes;
389 
390 typedef std::vector<LedgerLine> ArrayOfLedgerLines;
391 
392 typedef std::vector<TextElement *> ArrayOfTextElements;
393 
394 typedef std::map<const Staff *, std::multiset<int>> MapOfNoteLocs;
395 
396 typedef std::map<const Staff *, std::set<int>> MapOfDotLocs;
397 
398 typedef std::map<std::string, Option *> MapOfStrOptions;
399 
400 typedef std::map<int, data_ACCIDENTAL_WRITTEN> MapOfOctavedPitchAccid;
401 
402 typedef std::map<int, GraceAligner *> MapOfIntGraceAligners;
403 
404 typedef std::vector<std::pair<std::u32string, bool>> ArrayOfStringDynamTypePairs;
405 
406 typedef std::map<ClassId, std::function<Object *(void)>> MapOfClassIdConstructors;
407 
408 typedef std::map<std::string, ClassId> MapOfStrClassIds;
409 
410 typedef std::vector<std::pair<LayerElement *, LayerElement *>> MeasureTieEndpoints;
411 
412 typedef bool (*NotePredicate)(const Note *);
413 
414 typedef std::vector<std::pair<LayerElement *, data_DURATION>> ArrayOfElementDurPairs;
415 
425 struct IntTree {
426  std::map<int, IntTree> child;
427 };
428 
429 typedef std::map<int, IntTree> IntTree_t;
430 
437 typedef std::map<int, bool> VerseN_t;
438 typedef std::map<int, VerseN_t> LayerN_VerserN_t;
439 typedef std::map<int, LayerN_VerserN_t> StaffN_LayerN_VerseN_t;
440 
441 //----------------------------------------------------------------------------
442 // Global defines
443 //----------------------------------------------------------------------------
444 
445 #define DEFINITION_FACTOR 10
446 
447 #define DEFAULT_UNIT 9.0
448 
449 #define isIn(x, a, b) (((x) >= std::min((a), (b))) && ((x) <= std::max((a), (b))))
450 
457 enum FunctorCode { FUNCTOR_CONTINUE = 0, FUNCTOR_SIBLINGS, FUNCTOR_STOP };
458 
459 //----------------------------------------------------------------------------
460 // Maximum number of levels between parent and children for optimizing search
461 //----------------------------------------------------------------------------
462 
466 #define MAX_ACCID_DEPTH -1
467 
469 #define MAX_BEAM_DEPTH -1
470 
472 #define MAX_CHORD_DEPTH -1
473 
475 #define MAX_FTREM_DEPTH -1
476 
478 #define MAX_LIGATURE_DEPTH -1
479 
481 #define MAX_TABGRP_DEPTH -1
482 
484 #define MAX_TUPLET_DEPTH -1
485 
487 #define MAX_STAFFGRP_DEPTH -1
488 
490 #define MAX_NOTE_DEPTH -1
491 
492 //----------------------------------------------------------------------------
493 // Unicode music codepoints
494 //----------------------------------------------------------------------------
495 
496 #define UNICODE_FLAT U'\u266D' // ♭
497 #define UNICODE_NATURAL U'\u266E' // ♮
498 #define UNICODE_SHARP U'\u266F' // ♯
499 
500 #define UNICODE_UNDERTIE U'\u203F' // ‿
501 
502 #define UNICODE_DAL_SEGNO U'\U0001D109' // 𝄉
503 #define UNICODE_DA_CAPO U'\U0001D10A' // 𝄊
504 #define UNICODE_SEGNO U'\U0001D10B' // 𝄋
505 #define UNICODE_CODA U'\U0001D10C' // 𝄌
506 
507 #define UNICODE_DOUBLE_FLAT U'\U0001D12B' // 𝄫
508 #define UNICODE_DOUBLE_SHARP U'\U0001D12A' // 𝄪
509 
510 //----------------------------------------------------------------------------
511 // VerovioText codepoints
512 //----------------------------------------------------------------------------
513 
522 #define VRV_TEXT_HARM \
523  U"\u266D\u266E\u266F" \
524  U"\uE260\uE261\uE262\uE263\uE264" \
525  U"\uEA50\uEA51\uEA52\uEA53\uEA54\uEA55\uEA56\uEA57\uEA58\uEA59\uEA5A\uEA5B\uEA5C\uEA5D\uEA5E" \
526  U"\uEA5F\uEA60\uEA61\uEA62\uEA63\uEA64\uEA65\uEA66\uEA67" \
527  U"\uECC0"
528 
529 //----------------------------------------------------------------------------
530 // data.LINEWIDTHTERM factors
531 //----------------------------------------------------------------------------
532 
533 #define LINEWIDTHTERM_factor_narrow 1.0
534 #define LINEWIDTHTERM_factor_medium 2.0
535 #define LINEWIDTHTERM_factor_wide 4.0
536 
537 //----------------------------------------------------------------------------
538 // Types for editorial element
539 //----------------------------------------------------------------------------
540 
541 // the maximum is 255 (unsigned char)
542 enum EditorialLevel {
543  EDITORIAL_UNDEFINED = 0,
544  EDITORIAL_SCORE,
545  EDITORIAL_TOPLEVEL,
546  EDITORIAL_SCOREDEF,
547  EDITORIAL_STAFFGRP,
548  EDITORIAL_MEASURE,
549  EDITORIAL_STAFF,
550  EDITORIAL_LAYER,
551  EDITORIAL_NOTE,
552  EDITORIAL_TEXT,
553  EDITORIAL_FB,
554  EDITORIAL_RUNNING,
555 };
556 
557 //----------------------------------------------------------------------------
558 // Visibility for editorial and mdiv elements
559 //----------------------------------------------------------------------------
560 
561 enum VisibilityType { Hidden = 0, Visible };
562 
563 //----------------------------------------------------------------------------
564 // The used SMuFL glyph anchors
565 //----------------------------------------------------------------------------
566 
567 enum SMuFLGlyphAnchor {
568  SMUFL_stemDownNW = 0,
569  SMUFL_stemUpSE,
570  SMUFL_cutOutNE,
571  SMUFL_cutOutNW,
572  SMUFL_cutOutSE,
573  SMUFL_cutOutSW
574 };
575 
576 //----------------------------------------------------------------------------
577 // Spanning types for control events
578 //----------------------------------------------------------------------------
579 
580 enum { SPANNING_START_END = 0, SPANNING_START, SPANNING_END, SPANNING_MIDDLE };
581 
582 //----------------------------------------------------------------------------
583 // Types for layer element
584 //----------------------------------------------------------------------------
585 
591 enum ElementScoreDefRole { SCOREDEF_NONE = 0, SCOREDEF_SYSTEM, SCOREDEF_INTERMEDIATE, SCOREDEF_CAUTIONARY };
592 
593 //----------------------------------------------------------------------------
594 // ScoreDef drawing labels
595 //----------------------------------------------------------------------------
596 
597 enum ScoreDefDrawingLabels { DRAWING_LABEL_FULL = 0, DRAWING_LABEL_ABBR, DRAWING_LABEL_NONE };
598 
599 //----------------------------------------------------------------------------
600 // Artic types
601 //----------------------------------------------------------------------------
602 
603 enum ArticType { ARTIC_INSIDE = 0, ARTIC_OUTSIDE };
604 
605 //----------------------------------------------------------------------------
606 // Visibility optimization
607 //----------------------------------------------------------------------------
608 
609 enum VisibilityOptimization { OPTIMIZATION_NONE = 0, OPTIMIZATION_HIDDEN, OPTIMIZATION_SHOW };
610 
611 //----------------------------------------------------------------------------
612 // Layout positions (3 x 3 grid)
613 //----------------------------------------------------------------------------
614 
615 enum {
616  POSITION_LEFT = 0,
617  POSITION_CENTER,
618  POSITION_RIGHT,
619 };
620 
621 enum {
622  POSITION_TOP = 0,
623  POSITION_MIDDLE = 3,
624  POSITION_BOTTOM = 6,
625 };
626 
627 //----------------------------------------------------------------------------
628 // Ligature shape bitfields
629 //----------------------------------------------------------------------------
630 
631 enum {
632  LIGATURE_DEFAULT = 0,
633  LIGATURE_STEM_LEFT_UP = 1,
634  LIGATURE_STEM_LEFT_DOWN = 2,
635  LIGATURE_STEM_RIGHT_UP = 4,
636  LIGATURE_STEM_RIGHT_DOWN = 8,
637  LIGATURE_OBLIQUE = 16,
638  LIGATURE_STACKED = 32
639 };
640 
641 //----------------------------------------------------------------------------
642 // Analytical markup bitfields
643 //----------------------------------------------------------------------------
644 
645 enum {
646  MARKUP_DEFAULT = 0,
647  MARKUP_ANALYTICAL_TIE = 1,
648  MARKUP_ANALYTICAL_FERMATA = 2,
649  MARKUP_GRACE_ATTRIBUTE = 4,
650  MARKUP_ARTIC_MULTIVAL = 8,
651  MARKUP_SCOREDEF_DEFINITIONS = 16
652 };
653 
654 //----------------------------------------------------------------------------
655 // Layout information
656 //----------------------------------------------------------------------------
657 
658 enum LayoutInformation { LAYOUT_NONE = 0, LAYOUT_ENCODED, LAYOUT_DONE };
659 
660 //----------------------------------------------------------------------------
661 // Bounding box access
662 //----------------------------------------------------------------------------
663 
664 enum Accessor { SELF = 0, CONTENT };
665 
666 //----------------------------------------------------------------------------
667 // Some keys
668 //----------------------------------------------------------------------------
669 
670 enum { KEY_LEFT = 37, KEY_UP = 38, KEY_RIGHT = 39, KEY_DOWN = 40 };
671 
672 //----------------------------------------------------------------------------
673 // Stem sameas drawing role
674 //----------------------------------------------------------------------------
675 
676 enum StemSameasDrawingRole { SAMEAS_NONE = 0, SAMEAS_UNSET, SAMEAS_PRIMARY, SAMEAS_SECONDARY };
677 
678 //----------------------------------------------------------------------------
679 // Smufl text font (selected font or fallback)
680 //----------------------------------------------------------------------------
681 
682 enum SmuflTextFont { SMUFL_NONE = 0, SMUFL_FONT_SELECTED, SMUFL_FONT_FALLBACK };
683 
684 //----------------------------------------------------------------------------
685 // Graphic ID type
686 //----------------------------------------------------------------------------
687 
688 enum GraphicID { PRIMARY = 0, SPANNING, SYMBOLREF };
689 
690 //----------------------------------------------------------------------------
691 // Measure type
692 //----------------------------------------------------------------------------
693 
694 enum MeasureType { MEASURED = 0, UNMEASURED, NEUMELINE };
695 
696 //----------------------------------------------------------------------------
697 // Focus status type
698 //----------------------------------------------------------------------------
699 
700 enum FocusStatusType { FOCUS_UNSET = 0, FOCUS_SET, FOCUS_USED };
701 
702 //----------------------------------------------------------------------------
703 // The score time unit (quarter note)
704 //----------------------------------------------------------------------------
705 
706 #define SCORE_TIME_UNIT 4
707 
708 //----------------------------------------------------------------------------
709 // Section representing a line in neon
710 //----------------------------------------------------------------------------
711 
712 #define NEUME_LINE_TYPE "neon-neume-line"
713 
714 //----------------------------------------------------------------------------
715 // Legacy Wolfgang defines
716 //----------------------------------------------------------------------------
717 
718 #define OCTAVE_OFFSET 4
719 
720 // in half staff spaces (but should be 6 in two-voice notation)
721 #define STANDARD_STEMLENGTH 7
722 #define STANDARD_STEMLENGTH_TAB 3
723 
724 //----------------------------------------------------------------------------
725 // Temporary - to be made an option?
726 //----------------------------------------------------------------------------
727 
728 #define TABLATURE_STAFF_RATIO 1.75
729 #define GERMAN_TAB_STAFF_RATIO 2.2
730 
731 #define SUPER_SCRIPT_FACTOR 0.58
732 #define SUPER_SCRIPT_POSITION -0.20 // lowered down from the midline
733 #define SUB_SCRIPT_POSITION -0.17 // lowered down from the baseline
734 
735 //----------------------------------------------------------------------------
736 // Neume notation note size to staff size ratio defines
737 //----------------------------------------------------------------------------
738 
739 #define NOTE_HEIGHT_TO_STAFF_SIZE_RATIO 2
740 #define NOTE_WIDTH_TO_STAFF_SIZE_RATIO 1.4
741 
742 } // namespace vrv
743 
744 #endif // __VRV_DEF_H__
Generic int map recursive structure for storing hierachy of values For example, we want to process al...
Definition: vrvdef.h:425