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