1 //=============================================================================
2 //  MuseScore
3 //  Music Composition & Notation
4 //
5 //  Copyright (C) 2017 Werner Schweer
6 //
7 //  This program is free software; you can redistribute it and/or modify
8 //  it under the terms of the GNU General Public License version 2
9 //  as published by the Free Software Foundation and appearing in
10 //  the file LICENCE.GPL
11 //=============================================================================
12 
13 #ifndef __TYPES_H__
14 #define __TYPES_H__
15 
16 #include "config.h"
17 
18 /**
19  * \namespace Ms .
20  */
21 
22 namespace Ms {
23 #ifdef SCRIPT_INTERFACE
24 Q_NAMESPACE
25 #endif
26 
27 //-------------------------------------------------------------------
28 ///   \internal
29 ///   The value of this enum determines the "stacking order"
30 ///   of elements on the canvas.
31 ///   Note: keep in sync with array elementNames[] in scoreElement.cpp
32 //-------------------------------------------------------------------
33 
34 enum class ElementType {
35       ///.\{
36       INVALID = 0,
37       BRACKET_ITEM,
38       PART,
39       STAFF,
40       SCORE,
41       SYMBOL,
42       TEXT,
43       MEASURE_NUMBER,
44       MMREST_RANGE,
45       INSTRUMENT_NAME,
46       SLUR_SEGMENT,
47       TIE_SEGMENT,
48       BAR_LINE,
49       STAFF_LINES,
50       SYSTEM_DIVIDER,
51       STEM_SLASH,
52       ARPEGGIO,
53       ACCIDENTAL,
54       LEDGER_LINE,
55       STEM,                   // list STEM before NOTE: notes in TAB might 'break' stems
56       NOTE,                   // and this requires stems to be drawn before notes
57       CLEF,                   // elements from CLEF to TIMESIG need to be in the order
58       KEYSIG,                 // in which they appear in a measure
59       AMBITUS,
60       TIMESIG,
61       REST,
62       BREATH,
63       REPEAT_MEASURE,
64       TIE,
65       ARTICULATION,
66       FERMATA,
67       CHORDLINE,
68       DYNAMIC,
69       BEAM,
70       HOOK,
71       LYRICS,
72       FIGURED_BASS,
73       MARKER,
74       JUMP,
75       FINGERING,
76       TUPLET,
77       TEMPO_TEXT,
78       STAFF_TEXT,
79       SYSTEM_TEXT,
80       REHEARSAL_MARK,
81       INSTRUMENT_CHANGE,
82       STAFFTYPE_CHANGE,
83       HARMONY,
84       FRET_DIAGRAM,
85       BEND,
86       TREMOLOBAR,
87       VOLTA,
88       HAIRPIN_SEGMENT,
89       OTTAVA_SEGMENT,
90       TRILL_SEGMENT,
91       LET_RING_SEGMENT,
92       VIBRATO_SEGMENT,
93       PALM_MUTE_SEGMENT,
94       TEXTLINE_SEGMENT,
95       VOLTA_SEGMENT,
96       PEDAL_SEGMENT,
97       LYRICSLINE_SEGMENT,
98       GLISSANDO_SEGMENT,
99       LAYOUT_BREAK,
100       SPACER,
101       STAFF_STATE,
102       NOTEHEAD,
103       NOTEDOT,
104       TREMOLO,
105       IMAGE,
106       MEASURE,
107       SELECTION,
108       LASSO,
109       SHADOW_NOTE,
110       TAB_DURATION_SYMBOL,
111       FSYMBOL,
112       PAGE,
113       HAIRPIN,
114       OTTAVA,
115       PEDAL,
116       TRILL,
117       LET_RING,
118       VIBRATO,
119       PALM_MUTE,
120       TEXTLINE,
121       TEXTLINE_BASE,
122       NOTELINE,
123       LYRICSLINE,
124       GLISSANDO,
125       BRACKET,
126       SEGMENT,
127       SYSTEM,
128       COMPOUND,
129       CHORD,
130       SLUR,
131       ELEMENT,
132       ELEMENT_LIST,
133       STAFF_LIST,
134       MEASURE_LIST,
135       HBOX,
136       VBOX,
137       TBOX,
138       FBOX,
139       ICON,
140       OSSIA,
141       BAGPIPE_EMBELLISHMENT,
142       STICKING,
143 
144       MAXTYPE
145       ///\}
146       };
147 
148 //---------------------------------------------------------
149 //   AccidentalType
150 //---------------------------------------------------------
151 // NOTE: keep this in sync with with accList array in accidentals.cpp
152 
153 enum class AccidentalType : unsigned char {
154       ///.\{
155       NONE,
156       FLAT,
157       NATURAL,
158       SHARP,
159       SHARP2,
160       FLAT2,
161       SHARP3,
162       FLAT3,
163       NATURAL_FLAT,
164       NATURAL_SHARP,
165       SHARP_SHARP,
166 
167       // Gould arrow quartertone
168       FLAT_ARROW_UP,
169       FLAT_ARROW_DOWN,
170       NATURAL_ARROW_UP,
171       NATURAL_ARROW_DOWN,
172       SHARP_ARROW_UP,
173       SHARP_ARROW_DOWN,
174       SHARP2_ARROW_UP,
175       SHARP2_ARROW_DOWN,
176       FLAT2_ARROW_UP,
177       FLAT2_ARROW_DOWN,
178       ARROW_DOWN,
179       ARROW_UP,
180 
181       // Stein-Zimmermann
182       MIRRORED_FLAT,
183       MIRRORED_FLAT2,
184       SHARP_SLASH,
185       SHARP_SLASH4,
186 
187       // Arel-Ezgi-Uzdilek (AEU)
188       FLAT_SLASH2,
189       FLAT_SLASH,
190       SHARP_SLASH3,
191       SHARP_SLASH2,
192 
193       // Extended Helmholtz-Ellis accidentals (just intonation)
194       DOUBLE_FLAT_ONE_ARROW_DOWN,
195       FLAT_ONE_ARROW_DOWN,
196       NATURAL_ONE_ARROW_DOWN,
197       SHARP_ONE_ARROW_DOWN,
198       DOUBLE_SHARP_ONE_ARROW_DOWN,
199       DOUBLE_FLAT_ONE_ARROW_UP,
200 
201       FLAT_ONE_ARROW_UP,
202       NATURAL_ONE_ARROW_UP,
203       SHARP_ONE_ARROW_UP,
204       DOUBLE_SHARP_ONE_ARROW_UP,
205       DOUBLE_FLAT_TWO_ARROWS_DOWN,
206       FLAT_TWO_ARROWS_DOWN,
207 
208       NATURAL_TWO_ARROWS_DOWN,
209       SHARP_TWO_ARROWS_DOWN,
210       DOUBLE_SHARP_TWO_ARROWS_DOWN,
211       DOUBLE_FLAT_TWO_ARROWS_UP,
212       FLAT_TWO_ARROWS_UP,
213       NATURAL_TWO_ARROWS_UP,
214 
215       SHARP_TWO_ARROWS_UP,
216       DOUBLE_SHARP_TWO_ARROWS_UP,
217       DOUBLE_FLAT_THREE_ARROWS_DOWN,
218       FLAT_THREE_ARROWS_DOWN,
219       NATURAL_THREE_ARROWS_DOWN,
220       SHARP_THREE_ARROWS_DOWN,
221 
222       DOUBLE_SHARP_THREE_ARROWS_DOWN,
223       DOUBLE_FLAT_THREE_ARROWS_UP,
224       FLAT_THREE_ARROWS_UP,
225       NATURAL_THREE_ARROWS_UP,
226       SHARP_THREE_ARROWS_UP,
227       DOUBLE_SHARP_THREE_ARROWS_UP,
228 
229       LOWER_ONE_SEPTIMAL_COMMA,
230       RAISE_ONE_SEPTIMAL_COMMA,
231       LOWER_TWO_SEPTIMAL_COMMAS,
232       RAISE_TWO_SEPTIMAL_COMMAS,
233       LOWER_ONE_UNDECIMAL_QUARTERTONE,
234       RAISE_ONE_UNDECIMAL_QUARTERTONE,
235 
236       LOWER_ONE_TRIDECIMAL_QUARTERTONE,
237       RAISE_ONE_TRIDECIMAL_QUARTERTONE,
238 
239       DOUBLE_FLAT_EQUAL_TEMPERED,
240       FLAT_EQUAL_TEMPERED,
241       NATURAL_EQUAL_TEMPERED,
242       SHARP_EQUAL_TEMPERED,
243       DOUBLE_SHARP_EQUAL_TEMPERED,
244       QUARTER_FLAT_EQUAL_TEMPERED,
245       QUARTER_SHARP_EQUAL_TEMPERED,
246 
247       FLAT_17,
248       SHARP_17,
249       FLAT_19,
250       SHARP_19,
251       FLAT_23,
252       SHARP_23,
253       FLAT_31,
254       SHARP_31,
255       FLAT_53,
256       SHARP_53,
257       //EQUALS_ALMOST,
258       //EQUALS,
259       //TILDE,
260 
261       // Persian
262       SORI,
263       KORON,
264 
265       // Wyschnegradsky
266       TEN_TWELFTH_FLAT,
267       TEN_TWELFTH_SHARP,
268       ELEVEN_TWELFTH_FLAT,
269       ELEVEN_TWELFTH_SHARP,
270       ONE_TWELFTH_FLAT,
271       ONE_TWELFTH_SHARP,
272       TWO_TWELFTH_FLAT,
273       TWO_TWELFTH_SHARP,
274       THREE_TWELFTH_FLAT,
275       THREE_TWELFTH_SHARP,
276       FOUR_TWELFTH_FLAT,
277       FOUR_TWELFTH_SHARP,
278       FIVE_TWELFTH_FLAT,
279       FIVE_TWELFTH_SHARP,
280       SIX_TWELFTH_FLAT,
281       SIX_TWELFTH_SHARP,
282       SEVEN_TWELFTH_FLAT,
283       SEVEN_TWELFTH_SHARP,
284       EIGHT_TWELFTH_FLAT,
285       EIGHT_TWELFTH_SHARP,
286       NINE_TWELFTH_FLAT,
287       NINE_TWELFTH_SHARP,
288 
289       // (Spartan) Sagittal
290       SAGITTAL_5V7KD,
291       SAGITTAL_5V7KU,
292       SAGITTAL_5CD,
293       SAGITTAL_5CU,
294       SAGITTAL_7CD,
295       SAGITTAL_7CU,
296       SAGITTAL_25SDD,
297       SAGITTAL_25SDU,
298       SAGITTAL_35MDD,
299       SAGITTAL_35MDU,
300       SAGITTAL_11MDD,
301       SAGITTAL_11MDU,
302       SAGITTAL_11LDD,
303       SAGITTAL_11LDU,
304       SAGITTAL_35LDD,
305       SAGITTAL_35LDU,
306       SAGITTAL_FLAT25SU,
307       SAGITTAL_SHARP25SD,
308       SAGITTAL_FLAT7CU,
309       SAGITTAL_SHARP7CD,
310       SAGITTAL_SHARP5CD,
311       SAGITTAL_SHARP5V7KD,
312       SAGITTAL_FLAT5CU,
313       SAGITTAL_FLAT5V7KU,
314       SAGITTAL_FLAT,
315       SAGITTAL_SHARP,
316 
317       END
318       ///\}
319       };
320 
321 //---------------------------------------------------------
322 //   NoteType
323 //---------------------------------------------------------
324 
325 enum class NoteType {
326       ///.\{
327       NORMAL        = 0,
328       ACCIACCATURA  = 0x1,
329       APPOGGIATURA  = 0x2,       // grace notes
330       GRACE4        = 0x4,
331       GRACE16       = 0x8,
332       GRACE32       = 0x10,
333       GRACE8_AFTER  = 0x20,
334       GRACE16_AFTER = 0x40,
335       GRACE32_AFTER = 0x80,
336       INVALID       = 0xFF
337       ///\}
338       };
339 
340 constexpr NoteType operator| (NoteType t1, NoteType t2) {
341       return static_cast<NoteType>(static_cast<int>(t1) | static_cast<int>(t2));
342       }
343 constexpr bool operator& (NoteType t1, NoteType t2) {
344       return static_cast<int>(t1) & static_cast<int>(t2);
345       }
346 
347 
348 //---------------------------------------------------------
349 //   Direction
350 //---------------------------------------------------------
351 
352 enum class Direction {
353       ///.\{
354       AUTO, UP, DOWN
355       ///\}
356       };
357 
358 //---------------------------------------------------------
359 //   GlissandoType
360 //---------------------------------------------------------
361 
362 enum class GlissandoType {
363       ///.\{
364       STRAIGHT, WAVY
365       ///\}
366       };
367 
368 //---------------------------------------------------------
369 //   GlissandoStyle
370 //---------------------------------------------------------
371 
372 enum class GlissandoStyle {
373       ///.\{
374       CHROMATIC, WHITE_KEYS, BLACK_KEYS, DIATONIC, PORTAMENTO
375       ///\}
376       };
377 
378 //---------------------------------------------------------
379 //   HarmonyType
380 //---------------------------------------------------------
381 
382 enum class HarmonyType {
383       ///.\{
384       STANDARD,
385       ROMAN,
386       NASHVILLE
387       ///\}
388       };
389 
390 //---------------------------------------------------------
391 //   Placement
392 //---------------------------------------------------------
393 
394 enum class Placement {
395       ///.\{
396       ABOVE, BELOW
397       ///\}
398       };
399 
400 //---------------------------------------------------------
401 //   HPlacement
402 //---------------------------------------------------------
403 
404 enum class HPlacement {
405       ///.\{
406       LEFT, CENTER, RIGHT
407       ///\}
408       };
409 
410 //---------------------------------------------------------
411 //   MMRestRangeBracketType
412 //---------------------------------------------------------
413 
414 enum class MMRestRangeBracketType {
415       ///.\{
416       BRACKETS, PARENTHESES, NONE
417       ///\}
418       };
419 
420 
421 //---------------------------------------------------------
422 //   OffsetType
423 //---------------------------------------------------------
424 
425 enum class OffsetType : char {
426       ABS,       ///< offset in point units
427       SPATIUM    ///< offset in staff space units
428       };
429 
430 //-------------------------------------------------------------------
431 //   SegmentType
432 //
433 //    Type values determine the order of segments for a given tick
434 //-------------------------------------------------------------------
435 
436 enum class SegmentType {
437       ///.\{
438       Invalid            = 0x0,
439       BeginBarLine       = 0x1,
440       HeaderClef         = 0x2,
441       KeySig             = 0x4,
442       Ambitus            = 0x8,
443       TimeSig            = 0x10,
444       StartRepeatBarLine = 0x20,
445       Clef               = 0x40,
446       BarLine            = 0x80,
447       Breath             = 0x100,
448       //--
449       ChordRest          = 0x200,
450       //--
451       EndBarLine         = 0x400,
452       KeySigAnnounce     = 0x800,
453       TimeSigAnnounce    = 0x1000,
454       All                = -1, ///< Includes all barline types
455       /// Alias for `BeginBarLine | StartRepeatBarLine | BarLine | EndBarLine`
456       BarLineType        = BeginBarLine | StartRepeatBarLine | BarLine | EndBarLine
457       ///\}
458       };
459 
460 constexpr SegmentType operator| (const SegmentType t1, const SegmentType t2) {
461       return static_cast<SegmentType>(static_cast<int>(t1) | static_cast<int>(t2));
462       }
463 constexpr bool operator& (const SegmentType t1, const SegmentType t2) {
464       return static_cast<int>(t1) & static_cast<int>(t2);
465       }
466 
467 //-------------------------------------------------------------------
468 //   Tid
469 ///   Enumerates the list of built-in text substyles
470 ///   \internal
471 ///   Must be in sync with textStyles array (in style.cpp)
472 //-------------------------------------------------------------------
473 
474 enum class Tid {
475       ///.\{
476       DEFAULT,
477       TITLE,
478       SUBTITLE,
479       COMPOSER,
480       POET,
481       TRANSLATOR,
482       FRAME,
483       INSTRUMENT_EXCERPT,
484       INSTRUMENT_LONG,
485       INSTRUMENT_SHORT,
486       INSTRUMENT_CHANGE,
487       HEADER,
488       FOOTER,
489       MEASURE_NUMBER,
490       MMREST_RANGE,
491       TEMPO,
492       METRONOME,
493       REPEAT_LEFT,       // align to start of measure
494       REPEAT_RIGHT,      // align to end of measure
495       REHEARSAL_MARK,
496       SYSTEM,
497       STAFF,
498       EXPRESSION,
499       DYNAMICS,
500       HAIRPIN,
501       LYRICS_ODD,
502       LYRICS_EVEN,
503       HARMONY_A,
504       HARMONY_B,
505       HARMONY_ROMAN,
506       HARMONY_NASHVILLE,
507       TUPLET,
508       STICKING,
509       FINGERING,
510       LH_GUITAR_FINGERING,
511       RH_GUITAR_FINGERING,
512       STRING_NUMBER,
513       TEXTLINE,
514       VOLTA,
515       OTTAVA,
516       GLISSANDO,
517       PEDAL,
518       BEND,
519       LET_RING,
520       PALM_MUTE,
521       USER1,
522       USER2,
523       USER3,
524       USER4,
525       USER5,
526       USER6,
527       USER7,
528       USER8,
529       USER9,
530       USER10,
531       USER11,
532       USER12,
533       // special, no-contents, styles used while importing older scores
534       TEXT_STYLES,           // used for user-defined styles
535       IGNORED_STYLES         // used for styles no longer relevant (mainly Figured bass text style)
536       ///.\}
537       };
538 
539 //---------------------------------------------------------
540 ///   Align
541 ///   Because the Align enum has Top = 0 and Left = 0,
542 ///   align() & Align::Top will always return false.
543 ///   @warning Do not use if (align() & Align::Top) { doSomething(); }
544 ///   because doSomething() will never be executed!
545 ///   use this instead:
546 ///   `if ((static_cast<char>(align()) & static_cast<char>(Align::VMASK)) == Align::Top) { doSomething(); }`
547 ///   Same applies to Align::Left.
548 //---------------------------------------------------------
549 
550 enum class Align : char {
551       ///.\{
552       LEFT     = 0,
553       RIGHT    = 1,
554       HCENTER  = 2,
555       TOP      = 0,
556       BOTTOM   = 4,
557       VCENTER  = 8,
558       BASELINE = 16,
559       CENTER = Align::HCENTER | Align::VCENTER,
560       HMASK  = Align::LEFT    | Align::RIGHT    | Align::HCENTER,
561       VMASK  = Align::TOP     | Align::BOTTOM   | Align::VCENTER | Align::BASELINE
562       ///.\}
563       };
564 
565 constexpr Align operator| (Align a1, Align a2) {
566       return static_cast<Align>(static_cast<char>(a1) | static_cast<char>(a2));
567       }
568 constexpr bool operator& (Align a1, Align a2) {
569       return static_cast<char>(a1) & static_cast<char>(a2);
570       }
571 constexpr Align operator~ (Align a) {
572       return static_cast<Align>(~static_cast<char>(a));
573       }
574 
575 //---------------------------------------------------------
576 //   FontStyle
577 //---------------------------------------------------------
578 
579 enum class FontStyle : char {
580       Normal = 0, Bold = 1, Italic = 2, Underline = 4
581       };
582 
583 constexpr FontStyle operator+ (FontStyle a1, FontStyle a2) {
584       return static_cast<FontStyle>(static_cast<char>(a1) | static_cast<char>(a2));
585       }
586 constexpr FontStyle operator- (FontStyle a1, FontStyle a2) {
587       return static_cast<FontStyle>(static_cast<char>(a1) & ~static_cast<char>(a2));
588       }
589 constexpr bool operator& (FontStyle a1, FontStyle a2) {
590       return static_cast<bool>(static_cast<char>(a1) & static_cast<char>(a2));
591       }
592 
593 //---------------------------------------------------------
594 //   PlayEventType
595 /// Determines whether oranaments are automatically generated
596 /// when playing a score and whether the PlayEvents are saved
597 /// in the score file.
598 //---------------------------------------------------------
599 
600 enum class PlayEventType : char {
601       ///.\{
602       Auto,       ///< Play events for all notes are calculated by MuseScore.
603       User,       ///< Some play events are modified by user. Those events are written into the mscx file.
604       ///.\}
605       };
606 
607 //---------------------------------------------------------
608 //   Tuplets
609 //---------------------------------------------------------
610 
611 enum class TupletNumberType  : char { SHOW_NUMBER, SHOW_RELATION, NO_TEXT         };
612 enum class TupletBracketType : char { AUTO_BRACKET, SHOW_BRACKET, SHOW_NO_BRACKET };
613 
614 #ifdef SCRIPT_INTERFACE
615 Q_ENUM_NS(ElementType);
616 Q_ENUM_NS(Direction);
617 Q_ENUM_NS(GlissandoType);
618 Q_ENUM_NS(GlissandoStyle);
619 Q_ENUM_NS(Placement);
620 Q_ENUM_NS(HPlacement);
621 Q_ENUM_NS(SegmentType);
622 Q_ENUM_NS(Tid);
623 Q_ENUM_NS(Align);
624 Q_ENUM_NS(NoteType);
625 Q_ENUM_NS(PlayEventType);
626 Q_ENUM_NS(AccidentalType);
627 Q_ENUM_NS(HarmonyType);
628 #endif
629 
630 //hack: to force the build system to run moc on this file
631 /// \private
632 class Mops : public QObject {
633       Q_GADGET
634       };
635 
636 extern Direction toDirection(const QString&);
637 extern const char* toString(Direction);
638 extern QString toUserString(Direction);
639 extern void fillComboBoxDirection(QComboBox*);
640 
641 
642 } // namespace Ms
643 
644 Q_DECLARE_METATYPE(Ms::Align);
645 
646 Q_DECLARE_METATYPE(Ms::Direction);
647 
648 Q_DECLARE_METATYPE(Ms::NoteType);
649 
650 Q_DECLARE_METATYPE(Ms::PlayEventType);
651 
652 Q_DECLARE_METATYPE(Ms::AccidentalType);
653 
654 Q_DECLARE_METATYPE(Ms::HPlacement);
655 
656 #endif
657