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