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