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