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 #include <iomanip>      // setw, setprecision, ...
14 #include <cmath>
15 #include <string>
16 
17 #include "bsr2BsrFinalizer.h"
18 
19 #include "musicXMLOah.h"
20 #include "bsrOah.h"
21 
22 
23 using namespace std;
24 
25 namespace MusicXML2
26 {
27 
28 //________________________________________________________________________
bsr2BsrFinalizer(S_bsrOah & bsrOpts,indentedOstream & logOstream,S_bsrScore bScore)29 bsr2BsrFinalizer::bsr2BsrFinalizer (
30   S_bsrOah&    bsrOpts,
31   indentedOstream& logOstream,
32   S_bsrScore       bScore)
33     : fLogOutputStream (
34         logOstream)
35 {
36   fBsrOah = bsrOpts;
37 
38   // the MSR score we're relying on
39   fBaseMsrScore = bScore->getMsrScore ();
40 
41   // the BSR score we're visiting
42   fVisitedBsrScore = bScore;
43 };
44 
~bsr2BsrFinalizer()45 bsr2BsrFinalizer::~bsr2BsrFinalizer ()
46 {}
47 
48 //________________________________________________________________________
generateFinalizedBsrScoreFromBsrScore()49 void bsr2BsrFinalizer::generateFinalizedBsrScoreFromBsrScore ()
50 {
51   if (fVisitedBsrScore) {
52     // browse a bsrScore browser
53     bsrBrowser<bsrScore> browser (this);
54     browser.browse (*fVisitedBsrScore);
55   }
56 }
57 
58 //________________________________________________________________________
visitStart(S_bsrScore & elt)59 void bsr2BsrFinalizer::visitStart (S_bsrScore& elt)
60 {
61 #ifdef TRACE_OAH
62   if (gBsrOah->fTraceBsrVisitors) {
63     fLogOutputStream <<
64       "% --> Start visiting bsrScore" <<
65       ", line " << elt->getInputLineNumber () <<
66       endl;
67   }
68 #endif
69 
70   // create the BSR score
71   fBsrScore =
72     bsrScore::create (
73       K_NO_INPUT_LINE_NUMBER,
74       fBaseMsrScore);
75 }
76 
visitEnd(S_bsrScore & elt)77 void bsr2BsrFinalizer::visitEnd (S_bsrScore& elt)
78 {
79 #ifdef TRACE_OAH
80   if (gBsrOah->fTraceBsrVisitors) {
81     fLogOutputStream <<
82       "% --> End visiting bsrScore" <<
83       ", line " << elt->getInputLineNumber () <<
84       endl;
85   }
86 #endif
87 }
88 
89 //________________________________________________________________________
visitStart(S_bsrSpaces & elt)90 void bsr2BsrFinalizer::visitStart (S_bsrSpaces& elt)
91 {
92 #ifdef TRACE_OAH
93   if (gBsrOah->fTraceBsrVisitors) {
94     fLogOutputStream <<
95       "% --> Start visiting bsrSpaces" <<
96       ", line " << elt->getInputLineNumber () <<
97       endl;
98   }
99 #endif
100 /* JMI
101   fCurrentLine->
102     appendSpacesToLine (elt);
103     */
104 }
105 
visitEnd(S_bsrSpaces & elt)106 void bsr2BsrFinalizer::visitEnd (S_bsrSpaces& elt)
107 {
108 #ifdef TRACE_OAH
109   if (gBsrOah->fTraceBsrVisitors) {
110     fLogOutputStream <<
111       "% --> End visiting bsrSpaces" <<
112       ", line " << elt->getInputLineNumber () <<
113       endl;
114   }
115 #endif
116 }
117 
118 //________________________________________________________________________
visitStart(S_bsrBarline & elt)119 void bsr2BsrFinalizer::visitStart (S_bsrBarline& elt)
120 {
121 #ifdef TRACE_OAH
122   if (gBsrOah->fTraceBsrVisitors) {
123     fLogOutputStream <<
124       "% --> Start visiting bsrBarline" <<
125       ", line " << elt->getInputLineNumber () <<
126       endl;
127   }
128 #endif
129 
130   fCurrentMeasure->
131     appendBarlineToMeasure (elt);
132 }
133 
134 //________________________________________________________________________
visitStart(S_bsrTranscriptionNotes & elt)135 void bsr2BsrFinalizer::visitStart (S_bsrTranscriptionNotes& elt)
136 {
137 #ifdef TRACE_OAH
138   if (gBsrOah->fTraceBsrVisitors) {
139     fLogOutputStream <<
140       "% --> Start visiting bsrTranscriptionNotes" <<
141       ", line " << elt->getInputLineNumber () <<
142       endl;
143   }
144 #endif
145 }
146 
visitEnd(S_bsrTranscriptionNotes & elt)147 void bsr2BsrFinalizer::visitEnd (S_bsrTranscriptionNotes& elt)
148 {
149 #ifdef TRACE_OAH
150   if (gBsrOah->fTraceBsrVisitors) {
151     fLogOutputStream <<
152       "% --> End visiting bsrTranscriptionNotes" <<
153       ", line " << elt->getInputLineNumber () <<
154       endl;
155   }
156 #endif
157 }
158 
159 //________________________________________________________________________
visitStart(S_bsrTranscriptionNotesElement & elt)160 void bsr2BsrFinalizer::visitStart (S_bsrTranscriptionNotesElement& elt)
161 {
162 #ifdef TRACE_OAH
163   if (gBsrOah->fTraceBsrVisitors) {
164     fLogOutputStream <<
165       "% --> Start visiting bsrTranscriptionNotesElement" <<
166       ", line " << elt->getInputLineNumber () <<
167       endl;
168   }
169 #endif
170 
171   // JMI create the BSR score
172   fBsrScore->
173     appendTranscriptionNotesElementToScore (
174       elt);
175 }
176 
visitEnd(S_bsrTranscriptionNotesElement & elt)177 void bsr2BsrFinalizer::visitEnd (S_bsrTranscriptionNotesElement& elt)
178 {
179 #ifdef TRACE_OAH
180   if (gBsrOah->fTraceBsrVisitors) {
181     fLogOutputStream <<
182       "% --> End visiting bsrTranscriptionNotesElement" <<
183       ", line " << elt->getInputLineNumber () <<
184       endl;
185   }
186 #endif
187 }
188 
189 //________________________________________________________________________
visitStart(S_bsrPage & elt)190 void bsr2BsrFinalizer::visitStart (S_bsrPage& elt)
191 {
192 #ifdef TRACE_OAH
193   if (gBsrOah->fTraceBsrVisitors) {
194     fLogOutputStream <<
195       "% --> Start visiting bsrPage '" <<
196       elt->asString () <<
197       "'" <<
198       ", line " << elt->getInputLineNumber () <<
199       endl;
200   }
201 #endif
202 
203   fCurrentPage = elt->createPageNewbornClone ();
204 
205   fBsrScore->
206     appendPageToScore (fCurrentPage);
207 }
208 
visitEnd(S_bsrPage & elt)209 void bsr2BsrFinalizer::visitEnd (S_bsrPage& elt)
210 {
211 #ifdef TRACE_OAH
212   if (gBsrOah->fTraceBsrVisitors) {
213     fLogOutputStream <<
214       "% --> End visiting bsrPage '" <<
215       elt->asString () <<
216       "'" <<
217       ", line " << elt->getInputLineNumber () <<
218       endl;
219   }
220 #endif
221 }
222 
223 //________________________________________________________________________
visitStart(S_bsrPageHeading & elt)224 void bsr2BsrFinalizer::visitStart (S_bsrPageHeading& elt)
225 {
226 #ifdef TRACE_OAH
227   if (gBsrOah->fTraceBsrVisitors) {
228     fLogOutputStream <<
229       "% --> Start visiting bsrPageHeading '" <<
230       elt->asString () <<
231       "'" <<
232       ", line " << elt->getInputLineNumber () <<
233       endl;
234   }
235 #endif
236 
237  // JMI fCurrentPageHeading = elt->createPageHeadingNewbornClone ();
238 
239   fCurrentPageHeading = elt;
240 
241   fCurrentPage->
242     appendPageHeadingToPage (fCurrentPageHeading);
243 }
244 
visitEnd(S_bsrPageHeading & elt)245 void bsr2BsrFinalizer::visitEnd (S_bsrPageHeading& elt)
246 {
247 #ifdef TRACE_OAH
248   if (gBsrOah->fTraceBsrVisitors) {
249     fLogOutputStream <<
250       "% --> End visiting bsrPageHeading '" <<
251       elt->asString () <<
252       "'" <<
253       ", line " << elt->getInputLineNumber () <<
254       endl;
255   }
256 #endif
257 
258   fCurrentPageHeading = nullptr;
259 }
260 
261 //________________________________________________________________________
visitStart(S_bsrMusicHeading & elt)262 void bsr2BsrFinalizer::visitStart (S_bsrMusicHeading& elt)
263 {
264 #ifdef TRACE_OAH
265   if (gBsrOah->fTraceBsrVisitors) {
266     fLogOutputStream <<
267       "% --> Start visiting bsrMusicHeading '" <<
268       elt->asString () <<
269       "'" <<
270       ", line " << elt->getInputLineNumber () <<
271       endl;
272   }
273 #endif
274 
275  // JMI fCurrentPageHeading = elt->createPageHeadingNewbornClone ();
276 
277   fCurrentMusicHeading = elt;
278 
279   fCurrentPage->
280     appendMusicHeadingToPage (fCurrentMusicHeading);
281 }
282 
visitEnd(S_bsrMusicHeading & elt)283 void bsr2BsrFinalizer::visitEnd (S_bsrMusicHeading& elt)
284 {
285 #ifdef TRACE_OAH
286   if (gBsrOah->fTraceBsrVisitors) {
287     fLogOutputStream <<
288       "% --> End visiting bsrMusicHeading '" <<
289       elt->asString () <<
290       "'" <<
291       ", line " << elt->getInputLineNumber () <<
292       endl;
293   }
294 #endif
295 
296   fCurrentMusicHeading = nullptr;
297 }
298 
299 //________________________________________________________________________
visitStart(S_bsrFootNotes & elt)300 void bsr2BsrFinalizer::visitStart (S_bsrFootNotes& elt)
301 {
302 #ifdef TRACE_OAH
303   if (gBsrOah->fTraceBsrVisitors) {
304     fLogOutputStream <<
305       "% --> Start visiting bsrFootNotes '" <<
306       elt->asString () <<
307       "'" <<
308       ", line " << elt->getInputLineNumber () <<
309       endl;
310   }
311 #endif
312 
313  // JMI fCurrentPageHeading = elt->createPageHeadingNewbornClone ();
314 
315   fCurrentFootNotes = elt;
316 
317   fCurrentPage->
318     appendFootNotesToPage (fCurrentFootNotes);
319 }
320 
visitEnd(S_bsrFootNotes & elt)321 void bsr2BsrFinalizer::visitEnd (S_bsrFootNotes& elt)
322 {
323 #ifdef TRACE_OAH
324   if (gBsrOah->fTraceBsrVisitors) {
325     fLogOutputStream <<
326       "% --> End visiting bsrFootNotes '" <<
327       elt->asString () <<
328       "'" <<
329       ", line " << elt->getInputLineNumber () <<
330       endl;
331   }
332 #endif
333 
334   fCurrentFootNotes = nullptr;
335 }
336 
337 //________________________________________________________________________
visitStart(S_bsrLine & elt)338 void bsr2BsrFinalizer::visitStart (S_bsrLine& elt)
339 {
340 #ifdef TRACE_OAH
341   if (gBsrOah->fTraceBsrVisitors) {
342     fLogOutputStream <<
343       "% --> Start visiting bsrLine '" <<
344       elt->asString () <<
345       "'" <<
346       ", line " << elt->getInputLineNumber () <<
347       endl;
348   }
349 #endif
350 
351   fCurrentLine = elt->createLineNewbornClone ();
352 
353   fCurrentPage->
354     appendLineToPage (fCurrentLine);
355 }
356 
visitEnd(S_bsrLine & elt)357 void bsr2BsrFinalizer::visitEnd (S_bsrLine& elt)
358 {
359 #ifdef TRACE_OAH
360   if (gBsrOah->fTraceBsrVisitors) {
361     fLogOutputStream <<
362       "% --> End visiting bsrLine '" <<
363       elt->asString () <<
364       "'" <<
365       ", line " << elt->getInputLineNumber () <<
366       endl;
367   }
368 #endif
369 }
370 
371 //________________________________________________________________________
visitStart(S_bsrLineContents & elt)372 void bsr2BsrFinalizer::visitStart (S_bsrLineContents& elt)
373 {
374 #ifdef TRACE_OAH
375   if (gBsrOah->fTraceBsrVisitors) {
376     fLogOutputStream <<
377       "% --> Start visiting bsrLineContents '" <<
378       elt->asString () <<
379       "'" <<
380       ", line " << elt->getInputLineNumber () <<
381       endl;
382   }
383 #endif
384 
385 /* JMI ???
386   fCurrentLine = elt->createLineNewbornClone ();
387 
388   fCurrentPage->
389     appendLineToPage (fCurrentLine);
390     */
391 }
392 
visitEnd(S_bsrLineContents & elt)393 void bsr2BsrFinalizer::visitEnd (S_bsrLineContents& elt)
394 {
395 #ifdef TRACE_OAH
396   if (gBsrOah->fTraceBsrVisitors) {
397     fLogOutputStream <<
398       "% --> End visiting bsrLineContents '" <<
399       elt->asString () <<
400       "'" <<
401       ", line " << elt->getInputLineNumber () <<
402       endl;
403   }
404 #endif
405 }
406 
407 //________________________________________________________________________
visitStart(S_bsrMeasure & elt)408 void bsr2BsrFinalizer::visitStart (S_bsrMeasure& elt)
409 {
410 #ifdef TRACE_OAH
411   if (gBsrOah->fTraceBsrVisitors) {
412     fLogOutputStream <<
413       "% --> Start visiting bsrMeasure '" <<
414       elt->asString () <<
415       "'" <<
416       ", line " << elt->getInputLineNumber () <<
417       endl;
418   }
419 #endif
420 
421   fCurrentMeasure =
422     elt->createMeasureNewbornClone ();
423 
424   fCurrentLine->
425     appendMeasureToLine (fCurrentMeasure);
426 }
427 
visitEnd(S_bsrMeasure & elt)428 void bsr2BsrFinalizer::visitEnd (S_bsrMeasure& elt)
429 {
430 #ifdef TRACE_OAH
431   if (gBsrOah->fTraceBsrVisitors) {
432     fLogOutputStream <<
433       "% --> End visiting bsrMeasure '" <<
434       elt->asString () <<
435       "'" <<
436       ", line " << elt->getInputLineNumber () <<
437       endl;
438   }
439 #endif
440 }
441 
442 //________________________________________________________________________
visitStart(S_bsrNumber & elt)443 void bsr2BsrFinalizer::visitStart (S_bsrNumber& elt)
444 {
445 #ifdef TRACE_OAH
446   if (gBsrOah->fTraceBsrVisitors) {
447     fLogOutputStream <<
448       "% --> Start visiting bsrNumber '" <<
449       elt->asString () <<
450       "'" <<
451       ", line " << elt->getInputLineNumber () <<
452       endl;
453   }
454 #endif
455 
456   fCurrentMeasure->
457     appendNumberToMeasure (elt);
458 }
459 
visitEnd(S_bsrNumber & elt)460 void bsr2BsrFinalizer::visitEnd (S_bsrNumber& elt)
461 {
462 #ifdef TRACE_OAH
463   if (gBsrOah->fTraceBsrVisitors) {
464     fLogOutputStream <<
465       "% --> End visiting bsrNumber '" <<
466       elt->asString () <<
467       "'" <<
468       ", line " << elt->getInputLineNumber () <<
469       endl;
470   }
471 #endif
472 }
473 
474 //________________________________________________________________________
visitStart(S_bsrWords & elt)475 void bsr2BsrFinalizer::visitStart (S_bsrWords& elt)
476 {
477 #ifdef TRACE_OAH
478   if (gBsrOah->fTraceBsrVisitors) {
479     fLogOutputStream <<
480       "% --> Start visiting bsrWords '" <<
481       elt->asString () <<
482       "'" <<
483       ", line " << elt->getInputLineNumber () <<
484       endl;
485   }
486 #endif
487 
488   fCurrentMeasure->
489     appendWordsToMeasure (elt);
490 }
491 
visitEnd(S_bsrWords & elt)492 void bsr2BsrFinalizer::visitEnd (S_bsrWords& elt)
493 {
494 #ifdef TRACE_OAH
495   if (gBsrOah->fTraceBsrVisitors) {
496     fLogOutputStream <<
497       "% --> End visiting bsrWords '" <<
498       elt->asString () <<
499       "'" <<
500       ", line " << elt->getInputLineNumber () <<
501       endl;
502   }
503 #endif
504 }
505 
506 //________________________________________________________________________
visitStart(S_bsrClef & elt)507 void bsr2BsrFinalizer::visitStart (S_bsrClef& elt)
508 {
509 #ifdef TRACE_OAH
510   if (gBsrOah->fTraceBsrVisitors) {
511     fLogOutputStream <<
512       "% --> Start visiting bsrClef '" <<
513       elt->asString () <<
514       "'" <<
515       ", line " << elt->getInputLineNumber () <<
516       endl;
517   }
518 #endif
519 
520   fCurrentMeasure->
521     appendClefToMeasure (elt);
522 }
523 
visitEnd(S_bsrClef & elt)524 void bsr2BsrFinalizer::visitEnd (S_bsrClef& elt)
525 {
526 #ifdef TRACE_OAH
527   if (gBsrOah->fTraceBsrVisitors) {
528     fLogOutputStream <<
529       "% --> End visiting bsrClef '" <<
530       elt->asString () <<
531       "'" <<
532       ", line " << elt->getInputLineNumber () <<
533       endl;
534   }
535 #endif
536 }
537 
538 //________________________________________________________________________
visitStart(S_bsrKey & elt)539 void bsr2BsrFinalizer::visitStart (S_bsrKey& elt)
540 {
541 #ifdef TRACE_OAH
542   if (gBsrOah->fTraceBsrVisitors) {
543     fLogOutputStream <<
544       "% --> Start visiting bsrKey '" <<
545       elt->asString () <<
546       "'" <<
547       ", line " << elt->getInputLineNumber () <<
548       endl;
549   }
550 #endif
551 
552   if (fCurrentMusicHeading) {
553     fCurrentMusicHeading->
554       setMusicHeadingKey (elt);
555   }
556   else {
557     fCurrentLine->
558       appendKeyToLine (elt);
559   }
560 }
561 
visitEnd(S_bsrKey & elt)562 void bsr2BsrFinalizer::visitEnd (S_bsrKey& elt)
563 {
564 #ifdef TRACE_OAH
565   if (gBsrOah->fTraceBsrVisitors) {
566     fLogOutputStream <<
567       "% --> End visiting bsrKey '" <<
568       elt->asString () <<
569       "'"  <<
570       ", line " << elt->getInputLineNumber () <<
571       endl;
572   }
573 #endif
574 }
575 
576 //________________________________________________________________________
visitStart(S_bsrTime & elt)577 void bsr2BsrFinalizer::visitStart (S_bsrTime& elt)
578 {
579 #ifdef TRACE_OAH
580   if (gBsrOah->fTraceBsrVisitors) {
581     fLogOutputStream <<
582       "% --> Start visiting bsrTime " <<
583       elt->asString () <<
584       ", line " << elt->getInputLineNumber () <<
585       endl;
586   }
587 #endif
588 
589   if (fCurrentMusicHeading) {
590     fCurrentMusicHeading->
591       setMusicHeadingTime (elt);
592   }
593   else {
594     fCurrentLine->
595       appendTimeToLine (elt);
596   }
597 }
598 
visitEnd(S_bsrTime & elt)599 void bsr2BsrFinalizer::visitEnd (S_bsrTime& elt)
600 {
601 #ifdef TRACE_OAH
602   if (gBsrOah->fTraceBsrVisitors) {
603     fLogOutputStream <<
604       "% --> End visiting bsrTime " <<
605       elt->asString () <<
606       ", line " << elt->getInputLineNumber () <<
607       endl;
608   }
609 #endif
610 }
611 
612 //________________________________________________________________________
visitStart(S_bsrTempo & elt)613 void bsr2BsrFinalizer::visitStart (S_bsrTempo& elt)
614 {
615 #ifdef TRACE_OAH
616   if (gBsrOah->fTraceBsrVisitors) {
617     fLogOutputStream <<
618       "% --> Start visiting bsrTempo " <<
619       elt->asString () <<
620       ", line " << elt->getInputLineNumber () <<
621       endl;
622   }
623 #endif
624 
625 /* JMI ???
626   if (fCurrentMusicHeading) {
627     fCurrentMusicHeading->
628       setMusicHeadingTempo (elt);
629   }
630   else {
631   */
632     fCurrentLine->
633       appendTempoToLine (elt);
634  // }
635 }
636 
visitEnd(S_bsrTempo & elt)637 void bsr2BsrFinalizer::visitEnd (S_bsrTempo& elt)
638 {
639 #ifdef TRACE_OAH
640   if (gBsrOah->fTraceBsrVisitors) {
641     fLogOutputStream <<
642       "% --> End visiting bsrTempo " <<
643       elt->asString () <<
644       ", line " << elt->getInputLineNumber () <<
645       endl;
646   }
647 #endif
648 }
649 
650 //________________________________________________________________________
visitStart(S_bsrNote & elt)651 void bsr2BsrFinalizer::visitStart (S_bsrNote& elt)
652 {
653 #ifdef TRACE_OAH
654   if (gBsrOah->fTraceBsrVisitors) {
655     fLogOutputStream <<
656       "% --> Start visiting bsrNote " <<
657       elt->asString () <<
658       ", line " << elt->getInputLineNumber () <<
659       endl;
660   }
661 #endif
662 
663   fCurrentMeasure->
664     appendNoteToMeasure (elt);
665 }
666 
visitEnd(S_bsrNote & elt)667 void bsr2BsrFinalizer::visitEnd (S_bsrNote& elt)
668 {
669 #ifdef TRACE_OAH
670   if (gBsrOah->fTraceBsrVisitors) {
671     fLogOutputStream <<
672       "% --> End visiting bsrNote " <<
673       elt->asString () <<
674       ", line " << elt->getInputLineNumber () <<
675       endl;
676   }
677 #endif
678 }
679 
680 
681 } // namespace
682