LibMusicXML  3.18
mxmlTree2MsrSkeletonBuilder.h
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 //________________________________________________________________________
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,
36  int startPosition);
37 
38  protected:
39 
40  // constructors/destructor
41  // ------------------------------------------------------
42 
44  int startInputLineNumber,
45  int partGroupNumber,
47  int startPosition);
48 
49  virtual ~mxmlPartGroupDescr ();
50 
51  public:
52 
53  // set and get
54  // ------------------------------------------------------
55 
56  int getStartInputLineNumber () const
57  { return fStartInputLineNumber; }
58 
59  int getStopInputLineNumber () const
60  { return fStopInputLineNumber; }
61 
62  int getPartGroupNumber () const
63  { return fPartGroupNumber; }
64 
65  S_msrPartGroup getPartGroup () const
66  { return fPartGroup; }
67 
68  int getStartPosition () const
69  { return fStartPosition; }
70 
71  void setStopPosition (
72  int stopInputLineNumber,
73  int stopPosition)
74  {
75  fStopInputLineNumber = stopInputLineNumber;
76  fStopPosition = stopPosition;
77  }
78 
79  int getStopPosition () const
80  { return fStopPosition; }
81 
82  // services
83  // ------------------------------------------------------
84 
85  string partGroupDescrAsString () const;
86 
87  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 };
115 EXP ostream& operator<< (ostream& os, const S_mxmlPartGroupDescr& elt);
116 
117 //________________________________________________________________________
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 
271  indentedOstream& ios);
272 
273  virtual ~mxmlTree2MsrSkeletonBuilder ();
274 
275  // set and get
276  // ------------------------------------------------------
277 
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
MusicXML2::mxmlTree2MsrSkeletonBuilder
Definition: mxmlTree2MsrSkeletonBuilder.h:264
MusicXML2::smartable
the base class for smart pointers implementation
Definition: smartpointer.h:29
MusicXML2::partGroup
Definition: partlistvisitor.h:29
MusicXML2::mxmlPartGroupDescr
Definition: mxmlTree2MsrSkeletonBuilder.h:22
MusicXML2::SMARTP< mxmlPartGroupDescr >
MusicXML2::visitor
Definition: visitor.h:27
MusicXML2::indentedOstream
Definition: utilities.h:213