1 /* 2 MusicXML Library 3 Copyright (C) Grame 2006-2013 4 5 This Source Code Form is subject to the terms of the Mozilla Public 6 License, v. 2.0. If a copy of the MPL was not distributed with this 7 file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 9 Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France 10 research@grame.fr 11 */ 12 13 #ifndef ___mxmlTree2MsrSkeletonBuilder___ 14 #define ___mxmlTree2MsrSkeletonBuilder___ 15 16 17 namespace MusicXML2 18 { 19 20 //________________________________________________________________________ 21 struct mxmlPartGroupDescr : public smartable 22 { 23 /* 24 * positions represent the order in which the parts appear in <part-list /> 25 */ 26 27 public: 28 29 // creation 30 // ------------------------------------------------------ 31 32 static SMARTP<mxmlPartGroupDescr> create ( 33 int startInputLineNumber, 34 int partGroupNumber, 35 S_msrPartGroup partGroup, 36 int startPosition); 37 38 protected: 39 40 // constructors/destructor 41 // ------------------------------------------------------ 42 43 mxmlPartGroupDescr ( 44 int startInputLineNumber, 45 int partGroupNumber, 46 S_msrPartGroup partGroup, 47 int startPosition); 48 49 virtual ~mxmlPartGroupDescr (); 50 51 public: 52 53 // set and get 54 // ------------------------------------------------------ 55 getStartInputLineNumbermxmlPartGroupDescr56 int getStartInputLineNumber () const 57 { return fStartInputLineNumber; } 58 getStopInputLineNumbermxmlPartGroupDescr59 int getStopInputLineNumber () const 60 { return fStopInputLineNumber; } 61 getPartGroupNumbermxmlPartGroupDescr62 int getPartGroupNumber () const 63 { return fPartGroupNumber; } 64 getPartGroupmxmlPartGroupDescr65 S_msrPartGroup getPartGroup () const 66 { return fPartGroup; } 67 getStartPositionmxmlPartGroupDescr68 int getStartPosition () const 69 { return fStartPosition; } 70 setStopPositionmxmlPartGroupDescr71 void setStopPosition ( 72 int stopInputLineNumber, 73 int stopPosition) 74 { 75 fStopInputLineNumber = stopInputLineNumber; 76 fStopPosition = stopPosition; 77 } 78 getStopPositionmxmlPartGroupDescr79 int getStopPosition () const 80 { return fStopPosition; } 81 82 // services 83 // ------------------------------------------------------ 84 85 string partGroupDescrAsString () const; 86 getPartGroupCombinedNamemxmlPartGroupDescr87 string getPartGroupCombinedName () const 88 { 89 return 90 fPartGroup-> 91 getPartGroupCombinedName (); 92 } 93 94 // print 95 // ------------------------------------------------------ 96 97 virtual void print (ostream& os) const; 98 99 private: 100 101 // fields 102 // ------------------------------------------------------ 103 104 int fStartInputLineNumber; 105 int fStopInputLineNumber; 106 107 int fPartGroupNumber; // may be reused later 108 109 S_msrPartGroup fPartGroup; 110 111 int fStartPosition; 112 int fStopPosition; 113 }; 114 typedef SMARTP<mxmlPartGroupDescr> S_mxmlPartGroupDescr; 115 EXP ostream& operator<< (ostream& os, const S_mxmlPartGroupDescr& elt); 116 117 //________________________________________________________________________ 118 class mxmlTree2MsrSkeletonBuilder : 119 120 // score partwise 121 122 public visitor<S_score_partwise>, 123 124 // rights 125 // ------------------------------------------------------ 126 127 public visitor<S_work_number>, 128 public visitor<S_work_title>, 129 public visitor<S_movement_number>, 130 public visitor<S_movement_title>, 131 132 // identification 133 // ------------------------------------------------------ 134 135 public visitor<S_identification>, 136 public visitor<S_creator>, 137 public visitor<S_rights>, 138 public visitor<S_source>, 139 public visitor<S_relation>, 140 141 // encoding 142 // ------------------------------------------------------ 143 144 public visitor<S_encoding>, 145 public visitor<S_encoding_date>, 146 public visitor<S_encoder>, 147 public visitor<S_software>, 148 public visitor<S_encoding_description>, 149 public visitor<S_supports>, 150 151 // miscellaneous 152 // ------------------------------------------------------ 153 154 public visitor<S_miscellaneous>, 155 public visitor<S_miscellaneous_field>, 156 157 // scaling 158 // ------------------------------------------------------ 159 160 public visitor<S_millimeters>, 161 public visitor<S_tenths>, 162 public visitor<S_scaling>, 163 164 // print 165 // ------------------------------------------------------ 166 167 public visitor<S_system_layout>, 168 public visitor<S_system_margins>, 169 public visitor<S_system_distance>, 170 public visitor<S_top_system_distance>, 171 172 public visitor<S_system_dividers>, 173 public visitor<S_left_divider>, 174 public visitor<S_right_divider>, 175 176 // layout 177 // ------------------------------------------------------ 178 179 public visitor<S_page_layout>, 180 public visitor<S_page_height>, 181 public visitor<S_page_width>, 182 public visitor<S_page_margins>, 183 public visitor<S_left_margin>, 184 public visitor<S_right_margin>, 185 public visitor<S_top_margin>, 186 public visitor<S_bottom_margin>, 187 188 // credits 189 // ------------------------------------------------------ 190 191 public visitor<S_credit>, 192 public visitor<S_credit_words>, 193 194 // parts & part groups 195 // ------------------------------------------------------ 196 197 public visitor<S_part_list>, 198 199 public visitor<S_display_text>, 200 201 public visitor<S_part_group>, 202 203 public visitor<S_group_name>, 204 public visitor<S_group_name_display>, 205 206 public visitor<S_accidental_text>, 207 public visitor<S_group_abbreviation>, 208 public visitor<S_group_symbol>, 209 public visitor<S_group_barline>, 210 211 public visitor<S_score_part>, 212 213 public visitor<S_part_name>, 214 public visitor<S_part_name_display>, 215 216 public visitor<S_part_abbreviation>, 217 public visitor<S_part_abbreviation_display>, 218 219 public visitor<S_instrument_name>, 220 public visitor<S_instrument_abbreviation>, 221 222 public visitor<S_part>, 223 224 // staves 225 // ------------------------------------------------------ 226 227 public visitor<S_staves>, 228 public visitor<S_staff>, 229 230 // voices 231 // ------------------------------------------------------ 232 233 public visitor<S_voice>, 234 235 // measures 236 // ------------------------------------------------------ 237 238 public visitor<S_measure>, 239 240 // notes 241 // ------------------------------------------------------ 242 243 public visitor<S_note>, 244 245 // lyrics 246 // ------------------------------------------------------ 247 248 public visitor<S_lyric>, 249 public visitor<S_syllabic>, 250 public visitor<S_text>, 251 public visitor<S_elision>, 252 public visitor<S_extend>, 253 254 // harmonies 255 // ------------------------------------------------------ 256 257 public visitor<S_harmony>, 258 259 // figured bass 260 // ------------------------------------------------------ 261 262 public visitor<S_figured_bass> 263 264 { 265 public: 266 267 // constructors/destructor 268 // ------------------------------------------------------ 269 270 mxmlTree2MsrSkeletonBuilder ( 271 indentedOstream& ios); 272 273 virtual ~mxmlTree2MsrSkeletonBuilder (); 274 275 // set and get 276 // ------------------------------------------------------ 277 getMsrScore()278 S_msrScore getMsrScore () const 279 { return fMsrScore; } 280 281 282 // services 283 // ------------------------------------------------------ 284 285 // visitors 286 // ------------------------------------------------------ 287 288 void browseMxmlTree ( 289 const Sxmlelement& xmlTree); 290 291 protected: 292 293 // score partwise 294 // ------------------------------------------------------ 295 296 virtual void visitStart ( S_score_partwise& elt); 297 virtual void visitEnd ( S_score_partwise& elt); 298 299 // identification 300 // ------------------------------------------------------ 301 302 virtual void visitStart ( S_identification& elt); 303 virtual void visitEnd ( S_identification& elt); 304 virtual void visitStart ( S_creator& elt); 305 virtual void visitStart ( S_rights& elt); 306 virtual void visitStart ( S_source& elt); 307 virtual void visitStart ( S_relation& elt); 308 309 // encoding 310 // ------------------------------------------------------ 311 312 virtual void visitStart ( S_encoding& elt); 313 virtual void visitEnd ( S_encoding& elt); 314 virtual void visitStart ( S_encoding_date& elt); 315 virtual void visitStart ( S_encoder& elt); 316 virtual void visitStart ( S_software& elt); 317 virtual void visitStart ( S_encoding_description& elt); 318 virtual void visitStart ( S_supports& elt); 319 320 321 322 virtual void visitStart ( S_work_number& elt); 323 virtual void visitStart ( S_work_title& elt); 324 virtual void visitStart ( S_movement_number& elt); 325 virtual void visitStart ( S_movement_title& elt); 326 327 // miscellaneous 328 // ------------------------------------------------------ 329 330 virtual void visitStart ( S_miscellaneous& elt); 331 virtual void visitEnd ( S_miscellaneous& elt); 332 virtual void visitStart ( S_miscellaneous_field& elt); 333 334 // rights 335 // ------------------------------------------------------ 336 337 338 // scaling 339 // ------------------------------------------------------ 340 341 // scaling, margins, layout, divider JMI 342 343 virtual void visitStart ( S_millimeters& elt); 344 virtual void visitStart ( S_tenths& elt); 345 virtual void visitEnd ( S_scaling& elt); 346 347 virtual void visitStart ( S_system_layout& elt); 348 virtual void visitEnd ( S_system_layout& elt); 349 350 virtual void visitStart ( S_system_margins& elt); 351 virtual void visitEnd ( S_system_margins& elt); 352 virtual void visitStart ( S_system_distance& elt); 353 virtual void visitStart ( S_top_system_distance& elt); 354 355 virtual void visitStart ( S_system_dividers& elt); 356 virtual void visitStart ( S_left_divider& elt); 357 virtual void visitStart ( S_right_divider& elt); 358 359 // print 360 // ------------------------------------------------------ 361 362 // JMI bool fOnGoingPrint; 363 364 // layout 365 // ------------------------------------------------------ 366 367 virtual void visitStart ( S_page_layout& elt); 368 virtual void visitEnd ( S_page_layout& elt); 369 virtual void visitStart ( S_page_height& elt); 370 virtual void visitStart ( S_page_width& elt); 371 virtual void visitStart ( S_page_margins& elt); 372 virtual void visitEnd ( S_page_margins& elt); 373 virtual void visitStart ( S_left_margin& elt); 374 virtual void visitStart ( S_right_margin& elt); 375 virtual void visitStart ( S_top_margin& elt); 376 virtual void visitStart ( S_bottom_margin& elt); 377 378 // credits 379 // ------------------------------------------------------ 380 381 virtual void visitStart ( S_credit& elt); 382 virtual void visitEnd ( S_credit& elt); 383 virtual void visitStart ( S_credit_words& elt); 384 385 // parts & part groups 386 // ------------------------------------------------------ 387 388 virtual void visitStart ( S_part_list& elt); 389 virtual void visitEnd ( S_part_list& elt); 390 391 virtual void visitStart ( S_display_text& elt); 392 393 virtual void visitStart ( S_part_group& elt); 394 virtual void visitEnd ( S_part_group& elt); 395 396 virtual void visitStart ( S_group_name& elt); 397 virtual void visitStart ( S_group_name_display& elt); 398 virtual void visitEnd ( S_group_name_display& elt); 399 400 virtual void visitStart ( S_accidental_text& elt); 401 virtual void visitStart ( S_group_abbreviation& elt); 402 virtual void visitStart ( S_group_symbol& elt); 403 virtual void visitStart ( S_group_barline& elt); 404 405 virtual void visitStart ( S_score_part& elt); 406 virtual void visitEnd ( S_score_part& elt); 407 408 virtual void visitStart ( S_part_name& elt); 409 virtual void visitStart ( S_part_name_display& elt); 410 virtual void visitEnd ( S_part_name_display& elt); 411 412 virtual void visitStart ( S_part_abbreviation& elt); 413 virtual void visitStart ( S_part_abbreviation_display& elt); 414 virtual void visitEnd ( S_part_abbreviation_display& elt); 415 416 virtual void visitStart ( S_instrument_name& elt); 417 virtual void visitStart ( S_instrument_abbreviation& elt); 418 419 virtual void visitStart ( S_part& elt); 420 virtual void visitEnd ( S_part& elt); 421 422 // staves 423 // ------------------------------------------------------ 424 425 virtual void visitStart ( S_staves& elt); 426 427 virtual void visitStart ( S_staff& elt); 428 429 // voices 430 // ------------------------------------------------------ 431 432 virtual void visitStart ( S_voice& elt ); 433 434 // measures 435 // ------------------------------------------------------ 436 437 virtual void visitStart ( S_measure& elt); 438 virtual void visitEnd ( S_measure& elt); 439 440 // notes 441 // ------------------------------------------------------ 442 443 virtual void visitStart ( S_note& elt); 444 virtual void visitEnd ( S_note& elt); 445 446 // lyrics 447 // ------------------------------------------------------ 448 449 virtual void visitStart ( S_lyric& elt); 450 virtual void visitEnd ( S_lyric& elt); 451 452 // harmonies 453 // ------------------------------------------------------ 454 455 virtual void visitStart ( S_harmony& elt); 456 457 // figured bass 458 // ------------------------------------------------------ 459 460 virtual void visitStart ( S_figured_bass& elt); 461 462 private: 463 464 indentedOstream& fLogOutputStream; 465 466 467 // the MSR score we're building 468 // ------------------------------------------------------ 469 470 S_msrScore fMsrScore; 471 472 473 // scaling handling 474 // ------------------------------------------------------ 475 476 float fCurrentMillimeters; 477 int fCurrentTenths; 478 479 bool fOnGoingPageLayout; 480 481 bool fOnGoingPageMargins; 482 msrMarginTypeKind fCurrentMarginTypeKind; 483 484 bool fOnGoingSystemLayout; 485 486 bool fOnGoingSystemMargins; 487 488 489 // credits handling 490 // ------------------------------------------------------ 491 492 S_msrCredit fCurrentCredit; 493 494 495 // part groups handling 496 // ------------------------------------------------------ 497 498 int fCurrentPartGroupNumber; 499 msrPartGroup::msrPartGroupTypeKind 500 fCurrentPartGroupTypeKind; 501 string fCurrentPartGroupName; 502 string fCurrentPartGroupAbbreviation; 503 504 bool fOnGoingPartGroupNameDisplay; 505 string fCurrentPartGroupNameDisplayText; 506 507 string fCurrentPartGroupAccidentalText; 508 msrPartGroup::msrPartGroupSymbolKind 509 fCurrentPartGroupSymbolKind; 510 msrPartGroup::msrPartGroupBarlineKind 511 fCurrentPartGroupBarlineKind; 512 int fCurrentPartGroupSymbolDefaultX; 513 514 // an implicit part group has to be created to contain everything, 515 // since there can be parts out of any explicit part group 516 S_mxmlPartGroupDescr fImplicitPartGroupDescr; 517 S_msrPartGroup fImplicitPartGroup; 518 519 void createImplicitPartGroup (); 520 521 // part groups numbers can be re-used, they're no identifier 522 // we use a map to access them by part group number 523 int fPartGroupsCounter; 524 vector<S_mxmlPartGroupDescr> 525 fPartGroupDescsVector; 526 map<int, S_mxmlPartGroupDescr> 527 fAllPartGroupDescrsMap; 528 map<int, S_mxmlPartGroupDescr> 529 fStartedPartGroupDescrsMap; 530 531 void showPartGroupDescrsVector ( 532 int inputLineNumber); 533 534 void showAllPartGroupDescrsMap ( 535 int inputLineNumber); 536 537 void showStartedPartGroupDescrsMap ( 538 int inputLineNumber); 539 540 S_mxmlPartGroupDescr fetchStartedPartGroupDescr ( 541 int partGroupNumber); 542 543 list<S_mxmlPartGroupDescr> 544 fPartGroupsDescrStack; 545 546 void showPartGroupsStack ( 547 int inputLineNumber); 548 549 S_mxmlPartGroupDescr fetchPartGroupDescrStackTop (); 550 551 void registerPartGroupDescrAsStarted ( 552 int inputLineNumber, 553 S_mxmlPartGroupDescr partGroupDescr); 554 555 void registerPartGroupDescrAsStopped ( 556 int inputLineNumber, 557 S_mxmlPartGroupDescr partGroupDescr); 558 559 void showPartGroupsData ( 560 int inputLineNumber, 561 string context); 562 563 void handlePartGroupStart ( 564 int inputLineNumber); 565 566 void handlePartGroupStop ( 567 int inputLineNumber); 568 569 vector<list<S_mxmlPartGroupDescr> > 570 fPositionStartingPartGroupDescrsVector; 571 vector<list<S_mxmlPartGroupDescr> > 572 fPositionStoppingPartGroupDescrsVector; 573 574 void showPositionStartingPartGroupDescrsVector ( 575 int inputLineNumber); 576 577 void showPositionStoppingPartGroupDescrsVector ( 578 int inputLineNumber); 579 580 void insertPartGroupDescInStartingList ( 581 int inputLineNumber, 582 S_mxmlPartGroupDescr partGroupDescr, 583 list<S_mxmlPartGroupDescr>& 584 startingPartGroupDescrsList); 585 586 void insertPartGroupDescInStoppingList ( 587 int inputLineNumber, 588 S_mxmlPartGroupDescr partGroupDescr, 589 list<S_mxmlPartGroupDescr>& 590 stoppingPartGroupDescrsList); 591 592 void registerPartGroupDescrAsStoppingAtCurrentPosition ( 593 int inputLineNumber, 594 S_mxmlPartGroupDescr partGroupDescr); 595 596 void registerPart ( 597 int inputLineNumber, 598 int partPosition, 599 S_msrPart part); 600 601 void doNestPartGroupDescrInItsContainer ( 602 int inputLineNumber, 603 S_mxmlPartGroupDescr partGroupDescrToBeStopped, 604 S_mxmlPartGroupDescr containingPartGroupDescr); 605 606 void doPartGroupsNestingAndPartsAllocation ( 607 int inputLineNumber); 608 609 610 611 // parts handling 612 // ------------------------------------------------------ 613 614 string fCurrentPartID; // used throughout 615 616 string fCurrentPartName; 617 string fCurrentPartNameDisplayText; 618 bool fOnGoingPartNameDisplay; 619 620 621 string fCurrentPartAbbreviation; 622 string fCurrentPartAbbreviationDisplayText; 623 bool fOnGoingPartAbbreviationDisplay; 624 625 string fCurrentPartInstrumentName; 626 string fCurrentPartInstrumentAbbreviation; 627 628 map<string, S_msrPart> fPartsMap; 629 630 int fCurrentNoIDPartNumber; 631 632 // handling the part, each one incrementing the 'position' 633 // of the part groups, used for handling nesting/overlapping 634 int fCurrentPartsPosition; 635 vector<S_msrPart> fPartsVector; 636 637 void showPartsVector ( 638 int inputLineNumber); 639 640 S_msrPart fCurrentPart; // used throughout 641 642 643 // staff handling 644 // ------------------------------------------------------ 645 646 int fCurrentStaffMusicXMLNumber; // used throughout 647 648 S_msrStaff createStaffInCurrentPartIfNotYetDone ( 649 int inputLineNumber, 650 int staffNumber); 651 652 653 // voice handling 654 // ------------------------------------------------------ 655 656 int fCurrentVoiceMusicXMLNumber; // used throughout 657 658 S_msrVoice createRegularVoiceInStaffIfNotYetDone ( 659 int inputLineNumber, 660 int staffNumber, 661 int voiceNumber); 662 663 S_msrVoice fetchFirstRegularVoiceFromStaff ( 664 int inputLineNumber, 665 int staffNumber); 666 667 668 // measures 669 // ------------------------------------------------------ 670 671 string fCurrentMeasureNumber; 672 673 int fScoreNumberOfMeasures; 674 int fPartNumberOfMeasures; 675 676 // notes handling 677 // ------------------------------------------------------ 678 679 bool fOnGoingNote; 680 681 682 // lyrics handling 683 // ------------------------------------------------------ 684 685 string fCurrentStanzaNumber; 686 string fCurrentStanzaName; 687 688 689 // harmonies handling 690 // ------------------------------------------------------ 691 692 bool fThereAreHarmoniesToBeAttachedToCurrentNote; 693 int fHarmonyVoicesCounter; 694 695 S_msrVoice createHarmonyVoiceForVoiceIfNotYetDone ( 696 int inputLineNumber, 697 S_msrVoice voice); 698 699 700 // figured bass handling 701 // ------------------------------------------------------ 702 703 bool fThereAreFiguredBassToBeAttachedToCurrentNote; 704 int fFiguredBassVoicesCounter; 705 706 S_msrVoice createFiguredBassVoiceForVoiceIfNotYetDone ( 707 int inputLineNumber, 708 S_msrVoice voice); 709 }; 710 711 712 } 713 714 #endif 715