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