From fd96ed174ab002a01297fca3536dbbba54647836 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 6 Jan 2020 19:11:21 +0100 Subject: [PATCH 001/164] xml2guido: Replaced fingering dy calculation by "placement" parameter --- src/guido/xmlpart2guido.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 5863a719d..f346bc625 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2396,15 +2396,16 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) stringstream s; s << "text=\"" << fingeringText << "\""; /// Get placement: AVOIDING since rendering is not coherent! -// std::string placement = fingerings[i]->getAttributeValue("placement"); -// if (placement.size() > 0) { -// s << ", position=\""<getAttributeValue("placement"); + if (placement.size() > 0) { + s << ", position=\""<add (guidoparam::create(s.str(), false)); /// GUID-156: x-pos is highly dependent on Layout. AVOID! //xml2guidovisitor::addPosX(fingerings[i], tag, 0); // xml x-pos can be safely added /// In MusicXML, default-y for Fingering is from TOP of the staff. Dy in Guido is from the NOTEHEAD. Therefore the dy is a function of the Note and the Clef! - addPosYforNoteHead(nv, fingerings[i], tag, 2); // FIXME: +2 offset is experimental + /// GUID-160: Remove verticals to allow automatic positioning of stacks in GuidoLib + //addPosYforNoteHead(nv, fingerings[i], tag, 2); // FIXME: +2 offset is experimental push(tag); hasFingerings++; } From 4262a8d52c0055448cc83d91a2f04754bd7a36ee Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 8 Jan 2020 18:04:50 +0100 Subject: [PATCH 002/164] xml2guido: improve exception handling for number of dashes parsing of tremolo --- src/guido/xmlpart2guido.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 52fc84029..409761c45 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2065,7 +2065,13 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) std::stringstream convert; convert << note.fTremolo->getValue(); int numDashes = 0; - convert >> numDashes; + try { + convert >> numDashes; + } + catch (const exception& e) { + numDashes = 0; + } + s << "style=\""; for (int id=0; id Date: Thu, 9 Jan 2020 15:28:54 +0100 Subject: [PATCH 003/164] WIP: New Beam Grouping parsing --- src/elements/xml.cpp | 22 ++++++++-- src/elements/xml.h | 3 ++ src/guido/xmlpart2guido.cpp | 86 +++++++++++++++++++++++++++++++------ src/guido/xmlpart2guido.h | 7 +-- 4 files changed, 97 insertions(+), 21 deletions(-) diff --git a/src/elements/xml.cpp b/src/elements/xml.cpp index 16b5983fa..12ded9df1 100644 --- a/src/elements/xml.cpp +++ b/src/elements/xml.cpp @@ -220,10 +220,24 @@ float xmlelement::getFloatValue (int subElementType, float defaultvalue) return (iter != end()) ? float(*(*iter)) : defaultvalue; } - bool xmlelement::hasSubElement(int subElementType) - { - ctree::iterator iter = find(subElementType); - return (iter != end()); +bool xmlelement::hasSubElement(int subElementType) +{ + ctree::iterator iter = find(subElementType); + return (iter != end()); +} + +bool xmlelement::hasSubElement(int subElementType, std::string value) +{ + ctree::iterator iter = begin(); + while (iter != end()) { + if ( ((*iter)->getType() == subElementType) + && ((*iter)->getValue() == value) ){ + return true; + } + iter++; } + return false; + +} } diff --git a/src/elements/xml.h b/src/elements/xml.h index 981529297..a30460b6f 100644 --- a/src/elements/xml.h +++ b/src/elements/xml.h @@ -154,7 +154,10 @@ class EXP xmlelement : public ctree, public visitable int getIntValue (int subElementType, int defaultvalue); long getLongValue (int subElementType, long defaultvalue); float getFloatValue (int subElementType, float defaultvalue); + //! returns true if subelement exists bool hasSubElement(int subElementType); + //! returns true if subelement with given value exists + bool hasSubElement(int subElementType, std::string value); // misc bool empty () const { return fValue.empty() && elements().empty(); } diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 409761c45..7d4e8042a 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -52,10 +52,9 @@ namespace MusicXML2 void xmlpart2guido::reset () { guidonotestatus::resetall(); - fCurrentBeamNumber = 0; fMeasNum = 0; fInCue = fInGrace = fInhibitNextBar = fPendingBar = fDoubleBar - = fBeamOpened = fCrescPending = fSkipDirection = fWavyTrillOpened = fSingleScopeTrill = fNonStandardNoteHead = false; + = fBeamOpened = fBeamGrouping = fCrescPending = fSkipDirection = fWavyTrillOpened = fSingleScopeTrill = fNonStandardNoteHead = false; fCurrentStemDirection = kStemUndefined; fCurrentDivision = 1; fCurrentOffset = 0; @@ -1432,16 +1431,51 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con //______________________________________________________________________________ - void xmlpart2guido::checkBeamBegin ( const std::vector& beams ) + void xmlpart2guido::checkBeamBegin ( const std::vector& beams, const S_note& elt ) { /// !IMPORTANT NOTE from MXML DOC: Note that the beam number does not distinguish sets of beams that overlap, as it does for slur and other elements. /// So we need to track them with s Stack /// ! IMPORTANT NOTE from MXML DOC: "Beaming groups are distinguished by being in different voices and/or the presence or absence of grace and cue elements." /// This means that we should treate Grace and Cue elements separately. + /// !IMPORTANT NOTE on Guido Syntax: In Guido, the semantic of beam is the following: Nested beams make sense up to 2 order. The higher order has ONLY a Grouping semantics (meaning will link the two beams with a single-dashed line). It is only the internal and foremost internal beam that can deduct correct durations. Nested beams beyond level 2 does not have any effect. In MusicXML, beams do not have any semantics and only indicate lines! - //std::vector::const_iterator i = findValue(beams, "begin"); - //if (i != beams.end()) { - std::vector::const_iterator i ; + /// How to detect a grouping then? A grouping occurs if an xml beam ends, and if the current and next note are of the same xml Type (16th for two beams). One should probably check the number of beams with the type?! This is a look-ahead operation! + + std::vector::const_iterator began = findValue(beams, "begin"); + + // Create beamBegin only if no beam is already opened. Groupings will be handled upon the initial openning. + if ( (began != beams.end()) && (fBeamOpened == false)){ + stringstream tagName; + tagName << "beamBegin" << ":1"; // This is the initial beam! + Sguidoelement tag = guidotag::create(tagName.str()); + add (tag); + if ( (!fInCue)&&(!fInGrace)) { + fBeamOpened = true; + } + cerr << "Measure "<< fMeasNum << " beam BEGIN Beam-level="<<(*began)->getAttributeIntValue("number", 0)<< " fBeamOpened?="<::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), elt); + nextnote.forward_up(); // forward one element + while (nextnote != fCurrentMeasure->end()) { + if (( (nextnote->getType() == k_note) && (nextnote->getIntValue(k_voice,0) == fTargetVoice) )) { + // Check if there is a beam end + if (nextnote->hasSubElement(k_beam, "end")) { + // Get its Type + string endingType = nextnote->getValue(k_type); + // Check if the Next note has a beam Begin and if it has the same "type" + ctree::iterator postnote; + if (findNextNote(dynamic_cast(*nextnote), postnote)) { + + } + } + } + } + } + } + + + /*std::vector::const_iterator i ; for (i = beams.begin(); (i != beams.end()); i++) { if ((*i)->getValue() != "begin") continue; @@ -1464,7 +1498,7 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con if ( (!fInCue)&&(!fInGrace)) { fBeamOpened = true; } - fCurrentBeamNumber = lastBeamInternalNumber; + //fCurrentBeamNumber = lastBeamInternalNumber; // Add to stack: std::pair toto2(lastBeamInternalNumber, (*i)->getAttributeIntValue("number", 0)); @@ -1472,9 +1506,9 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con //cerr << " Created!"< >::const_iterator xmlpart2guido::findSlur ( con { /// IMPORTANT: Beam Numbering in MusicXML is not the same as in Slurs and are NOT incremental. /// The only assumption we make here is that the numbers are sorted. So we use a REVERSE iterator to close Beams in Order. - std::vector::const_reverse_iterator i ; + + std::vector::const_iterator end = findValue(beams, "end"); + std::vector::const_iterator continuity = findValue(beams, "continue"); + std::vector::const_iterator begin = findValue(beams, "begin"); + + bool ended = (end != beams.end()); + bool began = (begin != beams.end()); + bool withContinuity = (continuity != beams.end()); + + if (ended && (!began) && !withContinuity && fBeamOpened) { + stringstream tagName; + tagName << "beamEnd" << ":1"; + Sguidoelement tag = guidotag::create(tagName.str()); + add (tag); + if ((fBeamOpened) && (!fInCue) && (!fInGrace)) { + fBeamOpened = false; + } + + // If there is a grouping, close it! + if (fBeamGrouping) { + stringstream tagName2; + tagName2 << "beamEnd" << ":2"; + tag = guidotag::create(tagName2.str()); + add (tag); + fBeamGrouping = false; + } + } + + /*std::vector::const_reverse_iterator i ; for (i = beams.rbegin(); (i != beams.rend() && (!fBeamStack.empty())); i++) { if (((*i)->getValue() == "end") && ((*i)->getAttributeIntValue("number", 0) == fBeamStack.top().second)) { @@ -1516,7 +1578,7 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con fBeamStack.pop(); } - } + }*/ // Experimental //if (beamStackSizeBeforeClosing > fBeamStack.size()) @@ -2655,7 +2717,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) checkGrace(*this); checkSlurBegin (notevisitor::getSlur()); - checkBeamBegin (notevisitor::getBeam()); + checkBeamBegin (notevisitor::getBeam(), elt); checkTupletBegin(notevisitor::getTuplet(), *this, elt); checkLyricBegin (notevisitor::getLyric()); checkWavyTrillBegin(*this); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index acd15f6b7..c5282524a 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -75,16 +75,14 @@ class EXP xmlpart2guido : vector fDelayed; // fields to controls the guido output generation bool fGenerateComments, fGenerateBars, fGeneratePositions, fGenerateAutoMeasureNum, fLyricsManualSpacing; -// bool fGenerateStem; // internal parsing state - bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress; + bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress; int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets std::queue fDirectionEraserStack; // To skip already visited Directions when looking ahead because of grace notes - std::stack< std::pair > fBeamStack; // first int: Internal num, 2nd int: XML num std::vector< std::pair > fSlurStack; // first int: Internal num, 2nd int: XML num Sguidoelement fLyricOpened; @@ -109,7 +107,6 @@ class EXP xmlpart2guido : rational fCurrentTimeSign; // the current time signature int fMeasNum; - int fCurrentBeamNumber; // number attribute of the current beam int fCurrentStemDirection; // the current stems direction, used for stem direction changes int fPendingPops; // elements to be popped at chord exit (like fermata, articulations...) @@ -133,7 +130,7 @@ class EXP xmlpart2guido : std::vector getChord ( const Sxmlelement& note ); // build a chord vector void checkStaff (int staff ); // check for staff change void checkStem ( const S_stem& stem ); - void checkBeamBegin ( const std::vector& beams ); + void checkBeamBegin ( const std::vector& beams, const S_note& elt ); void checkBeamEnd ( const std::vector& beams ); void checkTupletBegin( const std::vector& tuplets, const notevisitor& nv, From b39fbbdb4efb3f7ec48cd2ab5699727d388f1d52 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 9 Jan 2020 16:11:04 +0100 Subject: [PATCH 004/164] xml2guido: Fixed ordering of grace note tag creation + added unit test --- files/xml2guido/GUID-153-DoubleGraceNotes.xml | 713 ++++++++++++++++++ src/guido/xmlpart2guido.cpp | 4 +- 2 files changed, 715 insertions(+), 2 deletions(-) create mode 100644 files/xml2guido/GUID-153-DoubleGraceNotes.xml diff --git a/files/xml2guido/GUID-153-DoubleGraceNotes.xml b/files/xml2guido/GUID-153-DoubleGraceNotes.xml new file mode 100644 index 000000000..5f910128c --- /dev/null +++ b/files/xml2guido/GUID-153-DoubleGraceNotes.xml @@ -0,0 +1,713 @@ + + + + Introduction & Rondo Capriccioso + + Camille Saint-Saëns + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2020-01-09 + + + + + + + + + + 6.4347 + 40 + + + 1846 + 1305 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 237 + 158 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Introduction & Rondo Capriccioso + + + Camille Saint-Saëns + + + + Violin + Vn. + + SmartMusic SoftSynth + strings.violin + + + + 3 + 15489 + 41 + 80 + 0 + + + + + + + + + 1846 + 1305 + + 93 + 93 + 93 + 81 + + + + + 73 + 0 + + 237 + + system + + + 4 + + 0 + major + + + + G + 2 + + + + + + B + 5 + + 4 + 1 + quarter + down + + + + A + 5 + + 2 + 1 + eighth + down + + + + + A + 5 + + 1 + 16th + up + begin + begin + + + + + + + + B + 5 + + 1 + 16th + up + end + end + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + 1 + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + 1 + + + + + + + + + 171 + + + + + E + 5 + + 4 + 1 + quarter + down + + + + D + 5 + + 2 + 1 + eighth + down + + + + + D + 5 + + 1 + 16th + up + begin + begin + + + + + + + + E + 5 + + 1 + 16th + up + end + end + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + cresc. + + + + + C + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + 1 + + + + + + D + 5 + + 2 + 1 + eighth + down + end + + + + + + 1 + + + + + + + + + C + 4 + + 1 + 1 + 16th + up + begin + begin + + + + D + 4 + + 1 + 1 + 16th + up + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + continue + continue + + + + B + 3 + + 1 + 1 + 16th + up + continue + end + + + + A + 3 + + 2 + 1 + eighth + up + end + + + + + E + 6 + + 1 + 16th + up + begin + begin + + + + + + + + F + 6 + + 1 + 16th + up + end + end + + + + E + 6 + + 2 + 1 + eighth + down + begin + + + + + + + + + + D + 1 + 6 + + 2 + 1 + eighth + sharp + down + continue + + + + + + + + + E + 6 + + 2 + 1 + eighth + down + end + + + + + + + + + + + + 181 + + + + + B + 5 + + 4 + 1 + quarter + down + + + + A + 5 + + 2 + 1 + eighth + down + + + + + A + 5 + + 1 + 16th + up + begin + begin + + + + + + + + B + -1 + 5 + + 1 + 16th + flat + up + end + end + + + + cresc. + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + + + E + 5 + + 4 + 1 + quarter + down + + + + D + 5 + + 2 + 1 + eighth + down + + + + + D + 5 + + 1 + 16th + up + begin + begin + + + + + + + + E + 5 + + 1 + 16th + up + end + end + + + + dim. + + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + C + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + + + + D + 5 + + 2 + 1 + eighth + down + end + + + + + + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 52fc84029..7a542ca10 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2221,6 +2221,8 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) { if (nv.isGrace()) { if (!fInGrace) { + Sguidoelement tag = guidotag::create("grace"); + push(tag); /// GUID-153: Fetch directions after grace ctree::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), nv.getSnote()); nextnote.forward_up(); // forward one element @@ -2251,8 +2253,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } /// End-of Guid-153 fInGrace = true; - Sguidoelement tag = guidotag::create("grace"); - push(tag); } } else if (fInGrace) { From 4807ba26c47d85cbd38931bb398a6dd7013d55db Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 9 Jan 2020 16:56:44 +0100 Subject: [PATCH 005/164] xml2guido: Added Grouping detection for Beaming in Guido from Xml --- src/guido/xmlpart2guido.cpp | 108 ++++++++++++------------------------ src/guido/xmlpart2guido.h | 2 +- 2 files changed, 36 insertions(+), 74 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 3f467b6d7..eff6c083d 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1452,62 +1452,46 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con if ( (!fInCue)&&(!fInGrace)) { fBeamOpened = true; } - cerr << "Measure "<< fMeasNum << " beam BEGIN Beam-level="<<(*began)->getAttributeIntValue("number", 0)<< " fBeamOpened?="<getInputLineNumber()<::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), elt); nextnote.forward_up(); // forward one element while (nextnote != fCurrentMeasure->end()) { if (( (nextnote->getType() == k_note) && (nextnote->getIntValue(k_voice,0) == fTargetVoice) )) { - // Check if there is a beam end - if (nextnote->hasSubElement(k_beam, "end")) { + // Check if there is a beam end with a beam Continue, it can be a Grouping candidate! + if (nextnote->hasSubElement(k_beam, "end") && nextnote->hasSubElement(k_beam, "continue") ) { + //cerr << " \tNextNote with beam end, line:"<getInputLineNumber()<<" type="<getValue(k_type)<getValue(k_type); // Check if the Next note has a beam Begin and if it has the same "type" ctree::iterator postnote; - if (findNextNote(dynamic_cast(*nextnote), postnote)) { - + if (findNextNote(nextnote, postnote)) { + //cerr << " \tPostnote with beam end, line:"<getInputLineNumber()<<" type="<getValue(k_type) <hasSubElement(k_beam, "continue")) { + string postType = postnote->getValue(k_type); + if (postType == endingType) { + // We are in a grouping continuity! + stringstream tagName2; + tagName2 << "beamBegin" << ":2"; + tag = guidotag::create(tagName2.str()); + add (tag); + fBeamGrouping = true; + //cerr << " \t\t CONTINUITY CREATED! Line:"<getInputLineNumber()<hasSubElement(k_beam, "continue")) { + // If there is no beam element with "continue" value, then our search is over! + break; } } + nextnote.forward_up(); } } } - - /*std::vector::const_iterator i ; - for (i = beams.begin(); (i != beams.end()); i++) { - if ((*i)->getValue() != "begin") - continue; - // There is a Beam Begin. Creat BeamBegin tag, and add its number to Stack - int lastBeamInternalNumber = 1; - if (!fBeamStack.empty()) { - std::pair toto = fBeamStack.top(); - lastBeamInternalNumber = toto.first + 1; - } - - //cerr << "Measure "<< fMeasNum << " beam BEGIN "<< lastBeamInternalNumber<< " Beam-level="<<(*i)->getAttributeIntValue("number", 0)<< " fBeamOpened?="< toto2(lastBeamInternalNumber, (*i)->getAttributeIntValue("number", 0)); - fBeamStack.push(toto2); - - //cerr << " Created!"< >::const_iterator xmlpart2guido::findSlur ( con add (tag); fBeamGrouping = false; } + }else if (withContinuity && fBeamGrouping && ended) { + // This occurs only during a grouping continuity: + stringstream tagName; + tagName << "beamEnd" << ":2"; + Sguidoelement tag = guidotag::create(tagName.str()); + add (tag); + stringstream tagName2; + tagName2 << "beamBegin" << ":2"; + tag = guidotag::create(tagName2.str()); + add (tag); } - /*std::vector::const_reverse_iterator i ; - for (i = beams.rbegin(); (i != beams.rend() && (!fBeamStack.empty())); i++) - { - if (((*i)->getValue() == "end") && ((*i)->getAttributeIntValue("number", 0) == fBeamStack.top().second)) { - // There is a Beam End. create tag and pop from stack - int lastBeamInternalNumber = 0; - if (!fBeamStack.empty()) { - lastBeamInternalNumber = fBeamStack.top().first; - }else { - cerr<< "XML2Guido: Got Beam End without a beam in Stack. Skipping!"< CLOSED! fBeamOpened="<getInputLineNumber()< >::const_iterator xmlpart2guido::findSlur ( con if (postType == endingType) { // We are in a grouping continuity! stringstream tagName2; - tagName2 << "beamBegin" << ":2"; + tagName2 << "beamBegin" << ":"<< (beamNumber+1); tag = guidotag::create(tagName2.str()); add (tag); fBeamGrouping = true; @@ -1513,9 +1517,13 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con bool began = (begin != beams.end()); bool withContinuity = (continuity != beams.end()); - if (ended && (!began) && !withContinuity && fBeamOpened) { + if (ended && (!began) && !withContinuity && (fBeamOpened || fInGrace)) { stringstream tagName; - tagName << "beamEnd" << ":1"; + int beamNumber = 1; + if (fInGrace && fBeamOpened) { + beamNumber = 2; + } + tagName << "beamEnd" << ":"< >::const_iterator xmlpart2guido::findSlur ( con // If there is a grouping, close it! if (fBeamGrouping) { stringstream tagName2; - tagName2 << "beamEnd" << ":2"; + tagName2 << "beamEnd" << ":"< Date: Thu, 9 Jan 2020 18:01:34 +0100 Subject: [PATCH 007/164] xml2guido: Adds unit test for nested beaming of grace notes --- .../xml2guido/GUID-153-DoubleGraceNotes2.xml | 497 ++++++++++++++++++ 1 file changed, 497 insertions(+) create mode 100644 files/xml2guido/GUID-153-DoubleGraceNotes2.xml diff --git a/files/xml2guido/GUID-153-DoubleGraceNotes2.xml b/files/xml2guido/GUID-153-DoubleGraceNotes2.xml new file mode 100644 index 000000000..a9a083136 --- /dev/null +++ b/files/xml2guido/GUID-153-DoubleGraceNotes2.xml @@ -0,0 +1,497 @@ + + + + Serenade for String Orchestra + + Victor Herbert + www.antescofo.com + + Finale v25 for Mac + 2020-01-09 + + + + + + + + + + 6.604 + 40 + + + 1799 + 1272 + + 91 + 91 + 78 + 60 + + + + + 0 + 0 + + 109 + 60 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Serenade for String Orchestra + + + Victor Herbert + + + 4. Canzonetta + + + + Violin + Vln. + + SmartMusicSoftSynth + strings.violin + + + + Bank 1 + + 1 + 15489 + 41 + 80 + -63 + + + + + + + + + + 93 + 0 + + 280 + + system + + + 4 + + -2 + major + + + + G + 2 + + + 95 + + + + + + + F + 4 + + 1 + 16th + up + begin + begin + + + + + + + + G + 4 + + 1 + 16th + up + end + end + + + + (IV) + + + + + F + 4 + + 2 + 1 + eighth + up + begin + + + + + + + E + 4 + + 1 + 1 + 16th + natural + up + continue + begin + + + + + + 2 + + + + + + D + 4 + + 1 + 1 + 16th + up + end + end + + + + + + + + + F + 4 + + 4 + 1 + quarter + up + + + + + + + 152 + + + + + (IV) + + + + + F + 4 + + 2 + 1 + eighth + up + begin + + + + E + 4 + + 1 + 1 + 16th + natural + up + continue + begin + + + + + + + + + C + 1 + 4 + + 1 + 1 + 16th + sharp + up + end + end + + + + + + + + + A + 3 + + 4 + 1 + quarter + up + + + + + + + 151 + + + + + +

+ + + + + + + ord. + + + + + C + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + B + -1 + 4 + + 1 + 16th + flat + up + begin + begin + + + + + C + 5 + + 1 + 16th + up + end + end + + + + B + -1 + 4 + + 1 + 1 + 16th + down + continue + begin + + + + + + + A + 4 + + 1 + 1 + 16th + down + end + end + + + + + + + D + 5 + + 3 + 1 + eighth + + down + begin + + + + 0 + + + + + + D + 5 + + 1 + 1 + 16th + down + end + backward hook + + + + + + + G + 5 + + 2 + 1 + eighth + down + begin + + + + + F + 5 + + 1 + 16th + natural + up + begin + begin + + + + + + + + G + 5 + + 1 + 16th + up + end + end + + + + F + 5 + + 1 + 1 + 16th + down + continue + begin + + + + + + + E + 5 + + 1 + 1 + 16th + natural + down + end + end + + + + F + 5 + + 4 + 1 + quarter + down + + + light-heavy + + + + + From ff0e1b8ee953a1523a9fc62136d6a222728957f1 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 21 Jan 2020 16:36:10 +0100 Subject: [PATCH 008/164] xml2guido: evade slur generation on musicxml if start and stop do not correspond (Finale bug) --- src/guido/xmlpart2guido.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 0212dfdc7..856824746 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1366,6 +1366,13 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { iterSlur = iter->find(k_slur); if (iterSlur != iter->end()) { + + if ((iterSlur->getAttributeValue("type")=="start") && + ((iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber)) && + (thisNoteVoice == fTargetVoice)) { + return false; + } + if ((iterSlur->getAttributeValue("type")=="stop") && (iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber) ) { @@ -1400,10 +1407,13 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { if (slurEndToBeErase != fSlurStack.end()) { lastSlurInternalNumber = slurEndToBeErase->first; }else { + cerr<<"\tSlurEnd with NO opening??? line:"<<(*i)->getInputLineNumber()<getInputLineNumber() <<" xmlNum:"<< (*i)->getAttributeIntValue("number", 0)<<" GuidoNum="<getInputLineNumber() <<": Got Slur Stop with number:"<< (*i)->getAttributeIntValue("number", 0) <<" without a Slur in Stack. Skipping!"<getInputLineNumber() <<": Got Slur Stop with number:"<< (*i)->getAttributeIntValue("number", 0) <<" without a Slur in Stack. Skipping!"< Date: Tue, 21 Jan 2020 16:37:14 +0100 Subject: [PATCH 009/164] removed debug cerr --- src/guido/xmlpart2guido.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 856824746..7e04d30cc 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1410,7 +1410,6 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { cerr<<"\tSlurEnd with NO opening??? line:"<<(*i)->getInputLineNumber()<getInputLineNumber() <<" xmlNum:"<< (*i)->getAttributeIntValue("number", 0)<<" GuidoNum="<getInputLineNumber() <<": Got Slur Stop with number:"<< (*i)->getAttributeIntValue("number", 0) <<" without a Slur in Stack. Skipping!"< Date: Tue, 21 Jan 2020 16:38:12 +0100 Subject: [PATCH 010/164] removed cerr --- src/guido/xmlpart2guido.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 7e04d30cc..ba3ec7b3a 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1407,7 +1407,6 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { if (slurEndToBeErase != fSlurStack.end()) { lastSlurInternalNumber = slurEndToBeErase->first; }else { - cerr<<"\tSlurEnd with NO opening??? line:"<<(*i)->getInputLineNumber()< Date: Wed, 22 Jan 2020 18:40:28 +0100 Subject: [PATCH 011/164] xml2guido: Ability to handle nested ties with correct sequencing of TieEnd in case of Chord creation with unit tests --- files/xml2guido/GUID-162-UnitTest.xml | 514 ++++++++++++++++++++ files/xml2guido/Guid-163-MultiTie-fixed.xml | 215 ++++++++ src/guido/guido.cpp | 18 +- src/guido/guido.h | 28 +- src/guido/xmlpart2guido.cpp | 50 +- src/guido/xmlpart2guido.h | 1 + 6 files changed, 810 insertions(+), 16 deletions(-) create mode 100644 files/xml2guido/GUID-162-UnitTest.xml create mode 100644 files/xml2guido/Guid-163-MultiTie-fixed.xml diff --git a/files/xml2guido/GUID-162-UnitTest.xml b/files/xml2guido/GUID-162-UnitTest.xml new file mode 100644 index 000000000..e627fc45c --- /dev/null +++ b/files/xml2guido/GUID-162-UnitTest.xml @@ -0,0 +1,514 @@ + + + + Orphée aux enfers + + Jacques Offenbach + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2020-01-21 + + + + + + + + + + 6.096 + 40 + + + 1949 + 1378 + + 98 + 98 + 98 + 98 + + + + + 0 + 0 + + 151 + 98 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Orphée aux enfers + + + Jacques Offenbach + + + French Cancan + + + + Violin + Vn. + + SmartMusic SoftSynth + strings.violin + + + + 3 + 15489 + 41 + 80 + 0 + + + + + + + + + + 75 + 0 + + 289 + + system + + + 2 + + 2 + major + + + + G + 2 + + + + + + + C + 1 + 6 + + 1 + eighth + up + + + + + + + B + 5 + + 1 + 1 + eighth + down + begin + + + + + + + + + + A + 5 + + 1 + 1 + eighth + down + end + + + + + + + + + + A + 5 + + 2 + 1 + quarter + down + + + + + + + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + + 3 + 6 + + 156 + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + + 0 + 9 + + 168 + + + + + + + + + + + + + D + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + D + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + light-heavy + + + + + diff --git a/files/xml2guido/Guid-163-MultiTie-fixed.xml b/files/xml2guido/Guid-163-MultiTie-fixed.xml new file mode 100644 index 000000000..10edba4a6 --- /dev/null +++ b/files/xml2guido/Guid-163-MultiTie-fixed.xml @@ -0,0 +1,215 @@ + + + + Sonata No.3 in F major + + Johann Ernst Galliard + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2020-01-22 + + + + + + + + + + 6.2653 + 40 + + + 1896 + 1341 + + 96 + 96 + 96 + 96 + + + + + 0 + 0 + + 147 + 96 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Sonata No.3 in F major + + + Johann Ernst Galliard + + + 4. Allegro spiritoso + + + + Cello + Cello + + SmartMusic SoftSynth + strings.cello + + + + 6 + 15489 + 43 + 80 + 0 + + + + + + + + + + 64 + 0 + + 217 + + system + + + 2 + + -1 + major + + + + F + 4 + + + + + + F + 2 + + 3 + 1 + quarter + + down + + + + + + + + + + C + 3 + + 3 + 1 + quarter + + down + + + + + A + 3 + + 3 + + 1 + quarter + + down + + + + + + + + F + 4 + + 3 + + 1 + quarter + + down + + + + + + + A + 3 + + 2 + + 1 + quarter + down + + + + + + + + F + 4 + + 2 + + 1 + quarter + down + + + + + + light-heavy + + + + + diff --git a/src/guido/guido.cpp b/src/guido/guido.cpp index 931dd3e86..7dee4b429 100644 --- a/src/guido/guido.cpp +++ b/src/guido/guido.cpp @@ -133,12 +133,26 @@ void guidochord::print(ostream& os) const { os << fStartList; int n = countNotes(); - const char* seqsep = ""; + std::string seqsep = ""; for (auto e: fElements) { + // checking for elements separator // sequences (i.e. score) are handled as chords // that's why there are special cases for seq - const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + //const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + std::string sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + /// Handle the special cases: + /// - If we are in a chord and e is a note, and next event is TieEnd, then the separater is " " and "," should be applied after TieEnd! + Sguidoelement next_e, pre_e; + bool nextExist = getNext(e, next_e); + bool preExist = getPrev(e, pre_e); + + if ((e->isNote())&& nextExist && (next_e->getName().find("tieEnd") != std::string::npos) ) { + sep = " "; + } + if ((e->getName().find("tieEnd") != std::string::npos) && (preExist) && (pre_e->isNote()) && nextExist) { + sep = ", "; + } os << seqsep << e << sep; if (e->isSeq()) seqsep = ", \n"; } diff --git a/src/guido/guido.h b/src/guido/guido.h index a9b7f087b..9593383a3 100755 --- a/src/guido/guido.h +++ b/src/guido/guido.h @@ -96,7 +96,33 @@ class EXP guidoelement : public smartable { virtual bool isNote () const { return false; } int countNotes () const; - + + /// Get next subelement + const bool getNext(Sguidoelement &i, Sguidoelement &next_e) const { + std::vector::const_iterator e = find(fElements.begin(), fElements.end(), i); + if (e != fElements.end()) { + auto next = std::next(e); + if (next != fElements.end()) { + next_e = *next; + return true; + } + } + return false; + } + + const bool getPrev(Sguidoelement &i, Sguidoelement &next_e) const { + std::vector::const_reverse_iterator e = find(fElements.rbegin(), fElements.rend(), i); + if (e != fElements.rend()) { + auto next = std::next(e); + if (next != fElements.rend()) { + next_e = *next; + return true; + } + } + return false; + } + + protected: guidoelement(std::string name, std::string sep=" "); virtual ~guidoelement(); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index ba3ec7b3a..6682619d3 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1263,10 +1263,20 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) std::vector::const_iterator i; for (i = tied.begin(); i != tied.end(); i++) { if ((*i)->getAttributeValue("type") == "start") { - Sguidoelement tag = guidotag::create("tieBegin"); + /// MusicXML does not always contain the "number" attribtue! if not, we'll assign them ourselves! + stringstream tagName; + if (fTiedOpen.empty()) { + fTiedOpen.push(1); + }else { + fTiedOpen.push( fTiedOpen.back()+1 ); + } string num = (*i)->getAttributeValue ("number"); - if (num.size()) - tag->add (guidoparam::create(num, false)); + if (num.size()) { + tagName << "tieBegin" << ":"<< num; + }else{ + tagName << "tieBegin" << ":"<< fTiedOpen.back(); + } + Sguidoelement tag = guidotag::create(tagName.str()); string placement = (*i)->getAttributeValue("orientation"); if (placement == "under") tag->add (guidoparam::create("curve=\"down\"", false)); @@ -1277,13 +1287,25 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) void xmlpart2guido::checkTiedEnd ( const std::vector& tied ) { + // Don't even bother if there is no priorly opened Tied + if (fTiedOpen.empty()) { + return; + } std::vector::const_iterator i; for (i = tied.begin(); i != tied.end(); i++) { if ((*i)->getAttributeValue("type") == "stop") { - Sguidoelement tag = guidotag::create("tieEnd"); + /// MusicXML does not always contain the "number" attribtue! We'll assign them ourselves! + stringstream tagName; string num = (*i)->getAttributeValue ("number"); - if (num.size()) - tag->add (guidoparam::create(num, false)); + if (num.size()) { + tagName << "tieEnd" << ":"<< num; + }else{ + tagName << "tieEnd" << ":"<< fTiedOpen.front(); + } + + Sguidoelement tag = guidotag::create(tagName.str()); + + fTiedOpen.pop(); add(tag); } } @@ -2423,6 +2445,9 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) //______________________________________________________________________________ void xmlpart2guido::newNote ( const notevisitor& nv, rational posInMeasure, const S_note& elt) { + // Check for Tied Begin + checkTiedBegin(nv.getTied()); + // Fingering is tied to single notes (in chords) int hasFingerings = 0; // 0 if none, greater otherwise! if (nv.getFingerings().size()) { @@ -2520,15 +2545,19 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } } - if (noteFormat == true) { push(noteFormatTag); } } + // Tie End should appear BEFORE the note itself in Guido: + add (note); + checkTiedEnd(nv.getTied()); + + if (noteFormat) pop(); @@ -2542,7 +2571,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } } - //checkTiedEnd (nv.getTied()); } int xmlpart2guido::checkNoteFormatDx ( const notevisitor& nv , rational posInMeasure) @@ -2710,10 +2738,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (notevisitor::getType()==kRest) pendingPops += checkRestFormat(*this); - - // Check for TIES before creating the chord sequence. \tieBeing and \tieEnd should live OUTSIDE chord sequence in Guido - checkTiedBegin((*this).getTied()); - + vector chord = getChord(elt); if (chord.size()) { @@ -2737,7 +2762,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) newNote (nv, thisNoteHeadPosition, elt); } - checkTiedEnd((*this).getTied()); isProcessingChord = false; while (pendingPops--) pop(); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index e40d24462..7667da761 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -81,6 +81,7 @@ class EXP xmlpart2guido : int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets + std::queue fTiedOpen; // Number of ongoing opened Tied std::queue fDirectionEraserStack; // To skip already visited Directions when looking ahead because of grace notes std::vector< std::pair > fSlurStack; // first int: Internal num, 2nd int: XML num From 1cea0c5bfab963cd37a1ef15153b73d1afb8eda3 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 22 Jan 2020 18:45:34 +0100 Subject: [PATCH 012/164] Revert back to const char* as before --- src/guido/guido.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/guido/guido.cpp b/src/guido/guido.cpp index 7dee4b429..15d055a8f 100644 --- a/src/guido/guido.cpp +++ b/src/guido/guido.cpp @@ -133,14 +133,13 @@ void guidochord::print(ostream& os) const { os << fStartList; int n = countNotes(); - std::string seqsep = ""; + const char* seqsep = ""; for (auto e: fElements) { // checking for elements separator // sequences (i.e. score) are handled as chords // that's why there are special cases for seq - //const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; - std::string sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; /// Handle the special cases: /// - If we are in a chord and e is a note, and next event is TieEnd, then the separater is " " and "," should be applied after TieEnd! Sguidoelement next_e, pre_e; From 00da4c721c02868412d54a14880e837c3f33cf7c Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 7 Feb 2020 18:33:34 +0100 Subject: [PATCH 013/164] Remove WASM for Javascript (Antescofo only) --- javascript/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/Makefile b/javascript/Makefile index 99b7b4894..e16e1906d 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -74,7 +74,7 @@ $(npmdir)/$(library).js : $(library).js # building the library as web assembly ############################################################## $(library).js : $(objects) - emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=1 + emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=0 clean: rm -f $(objects) $(target) From fc7bd88170477b9ffc13a5fee902ea68dc8406e5 Mon Sep 17 00:00:00 2001 From: Victor Lenoir Date: Wed, 12 Feb 2020 10:39:26 +0100 Subject: [PATCH 014/164] src/guido/guido.h: add missing algorithm include for std::find --- src/guido/guido.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/guido/guido.h b/src/guido/guido.h index 9593383a3..f86031f2b 100755 --- a/src/guido/guido.h +++ b/src/guido/guido.h @@ -16,6 +16,7 @@ #include #include #include +#include #include "exports.h" #include "smartpointer.h" From 07e1b163ca2040b8c326d98e74af904c8bc4bc3a Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 21 Feb 2020 17:30:42 +0100 Subject: [PATCH 015/164] xml2guido: Fingering on chords based on new syntax. - Created specific method for chord generation: splitting fingering based on placement on lowest/highest note in the chord. - Note generation is called inside Chord generation and for single notes only. Fingering is a parameter. This prepares future improvements similar to "ties" where tags are on the note-level instead of chord level. (FIX GUID-160) --- src/guido/xmlpart2guido.cpp | 167 +++++++++++++++++++++++------------- src/guido/xmlpart2guido.h | 5 +- 2 files changed, 108 insertions(+), 64 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index fda84e513..6234cceee 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2211,9 +2211,10 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } //______________________________________________________________________________ - vector xmlpart2guido::getChord ( const S_note& elt ) + deque xmlpart2guido::getChord ( const S_note& elt ) { - vector v; + deque notevisitors; + ctree::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), elt); if (nextnote != fCurrentMeasure->end()) nextnote++; // advance one step while (nextnote != fCurrentMeasure->end()) { @@ -2221,13 +2222,23 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if ((nextnote->getType() == k_note) && (nextnote->getIntValue(k_voice,0) == fTargetVoice)) { ctree::iterator iter; // and when there is one iter = nextnote->find(k_chord); - if (iter != nextnote->end()) - v.push_back(*nextnote); - else break; + if (iter != nextnote->end()) { + //v.push_back(*nextnote); + + notevisitor nv; + xml_tree_browser browser(&nv); + Sxmlelement note = *nextnote; + browser.browse(*note); + + notevisitors.push_back(nv); + } + else { + break; + } } nextnote++; } - return v; + return notevisitors; } vector xmlpart2guido::getChord ( const Sxmlelement& elt ) @@ -2442,47 +2453,85 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) return dur; } +void xmlpart2guido::newChord(const deque& nvs, rational posInMeasure) { + // Fingering treatment: Bring all fingerings together in two vectors for placement below/above. The "above" placement should be hooked to the highest pitch in the chord, and "below" to the lowest. + std::vector belowFingerings; + std::vector aboveFingerings; + int highestPitchIndex = 0, lowestPitchIndex = 0, counter =0; + float lowestPitch = 128, highestPitch = 0; + for (auto note: nvs) { + auto localFingerings = note.getFingerings(); + for (auto fingering: localFingerings) { + std::string placement = fingering->getAttributeValue("placement"); + if (placement == "below") { + belowFingerings.push_back(fingering); + }else { + aboveFingerings.push_back(fingering); + } + } + + float localPitch = note.getMidiPitch(); + if (localPitch > highestPitch) { + highestPitch = localPitch; + highestPitchIndex = counter; + } + if (localPitch < lowestPitch) { + lowestPitch = localPitch; + lowestPitchIndex = counter; + } + + // increment index counter + counter++; + } + + // Generate notes with correct fingering + std::vector emptyFingerings; + for ( int index = 0; index < nvs.size(); index++) { + if (index == lowestPitchIndex) { + newNote(nvs.at(index), posInMeasure, belowFingerings); + continue; + }else if (index == highestPitchIndex) { + newNote(nvs.at(index), posInMeasure, aboveFingerings); + }else { + newNote(nvs.at(index), posInMeasure, emptyFingerings); + } + } +} + //______________________________________________________________________________ - void xmlpart2guido::newNote ( const notevisitor& nv, rational posInMeasure, const S_note& elt) + void xmlpart2guido::newNote( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings) { // Check for Tied Begin checkTiedBegin(nv.getTied()); // Fingering is tied to single notes (in chords) int hasFingerings = 0; // 0 if none, greater otherwise! - if (nv.getFingerings().size()) { - auto fingerings = nv.getFingerings(); + if (fingerings.size()) { + Sguidoelement tag = guidotag::create("fingering"); + stringstream s; + + /// Add Placement + std::string placement = fingerings[0]->getAttributeValue("placement"); + if (placement.size() > 0) { + s << "position=\""<::iterator nextnote; -// if (findNextNote(elt, nextnote)) { -// int nextNoteDefaultX = nextnote->getAttributeIntValue("default-x", 0); -// int thisNoteDefaultX = elt->getAttributeIntValue("default-x", 0); -// int fingeringDefaultX = fingerings[i]->getAttributeIntValue("default-x", 0); -// if (fingeringDefaultX+thisNoteDefaultX > nextNoteDefaultX) { -// cerr<<"XML2Guido: Fingering X-position ("<"<getInputLineNumber()<<", measure:"<< fMeasNum<<" bypasses proceeding note("<getValue(); - stringstream s; - s << "text=\"" << fingeringText << "\""; - /// Get placement: AVOIDING since rendering is not coherent! - std::string placement = fingerings[i]->getAttributeValue("placement"); - if (placement.size() > 0) { - s << ", position=\""<add (guidoparam::create(s.str(), false)); - /// GUID-156: x-pos is highly dependent on Layout. AVOID! - //xml2guidovisitor::addPosX(fingerings[i], tag, 0); // xml x-pos can be safely added - /// In MusicXML, default-y for Fingering is from TOP of the staff. Dy in Guido is from the NOTEHEAD. Therefore the dy is a function of the Note and the Clef! - /// GUID-160: Remove verticals to allow automatic positioning of stacks in GuidoLib - //addPosYforNoteHead(nv, fingerings[i], tag, 2); // FIXME: +2 offset is experimental - push(tag); - hasFingerings++; } + tag->add (guidoparam::create(s.str(), false)); + push(tag); + hasFingerings++; } int octave = nv.getOctave() - 3; // octave offset between MusicXML and GUIDO is -3 @@ -2551,9 +2600,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) push(noteFormatTag); } } - - // Tie End should appear BEFORE the note itself in Guido: - + add (note); checkTiedEnd(nv.getTied()); @@ -2740,28 +2787,32 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (notevisitor::getType()==kRest) pendingPops += checkRestFormat(*this); - vector chord = getChord(elt); + deque chord = getChord(elt); + + // Add chord or note with proper preprocessing if (chord.size()) { - Sguidoelement chord = guidochord::create(); - //// FIXME: The following line removed since it introduced bad behavior on REINE de La NUIT Piano accompaniment! - //pendingPops += checkNoteFormatDx(*this, thisNoteHeadPosition); - push (chord); + Sguidoelement chordtag = guidochord::create(); + push (chordtag); pendingPops++; isProcessingChord = true; + // Add current note to the beginning of the Chord vector to separate processing of notes and chords + chord.push_front(*this); + + newChord(chord, thisNoteHeadPosition); + }else { + newNote (*this, thisNoteHeadPosition, this->getFingerings()); } - newNote (*this, thisNoteHeadPosition, elt); // Add chord notes (in case of a real chord) - for (vector::const_iterator iter = chord.begin(); iter != chord.end(); iter++) { - isProcessingChord = true; - notevisitor nv; - xml_tree_browser browser(&nv); - Sxmlelement note = *iter; - browser.browse(*note); - checkStaff(nv.getStaff()); - newNote (nv, thisNoteHeadPosition, elt); - } +// for (vector::const_iterator iter = chord.begin(); iter != chord.end(); iter++) { +// notevisitor nv; +// xml_tree_browser browser(&nv); +// Sxmlelement note = *iter; +// browser.browse(*note); +// checkStaff(nv.getStaff()); +// newNote (nv, thisNoteHeadPosition, elt); +// } isProcessingChord = false; @@ -2784,14 +2835,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) checkTextEnd(); } - /* - if (fBeamStack.size()==0) - { - // this is will close any ongoing Guido TEXT tag once a sequence is embedded - // In case of ongoing \Beam, do it after the \beam is closed! (Potential Guido parser issue) - checkTextEnd(); - }*/ - checkPostArticulation(*this); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 7667da761..074f2d62b 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -127,7 +127,7 @@ class EXP xmlpart2guido : int checkChordOrnaments ( const notevisitor& note ); // returns the count of articulations pushed on the stack - std::vector getChord ( const S_note& note ); // build a chord vector + deque getChord ( const S_note& note ); // build a chord vector std::vector getChord ( const Sxmlelement& note ); // build a chord vector void checkStaff (int staff ); // check for staff change void checkStem ( const S_stem& stem ); @@ -153,7 +153,8 @@ class EXP xmlpart2guido : void checkWavyTrillBegin ( const notevisitor& nv ); void checkWavyTrillEnd ( const notevisitor& nv ); void checkTextEnd(); - void newNote ( const notevisitor& nv, rational posInMeasure, const S_note& elt); + void newNote ( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings); + void newChord (const deque& nvs, rational posInMeasure); int checkTremolo(const notevisitor& note, const S_note& elt); From 77edf295a8c5ebb0496e7e66c7e0645173812168 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 21 Feb 2020 17:32:48 +0100 Subject: [PATCH 016/164] code cleanup --- src/guido/xmlpart2guido.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 6234cceee..a3db762a5 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2223,13 +2223,10 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) ctree::iterator iter; // and when there is one iter = nextnote->find(k_chord); if (iter != nextnote->end()) { - //v.push_back(*nextnote); - notevisitor nv; xml_tree_browser browser(&nv); Sxmlelement note = *nextnote; browser.browse(*note); - notevisitors.push_back(nv); } else { @@ -2804,16 +2801,6 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur newNote (*this, thisNoteHeadPosition, this->getFingerings()); } - // Add chord notes (in case of a real chord) -// for (vector::const_iterator iter = chord.begin(); iter != chord.end(); iter++) { -// notevisitor nv; -// xml_tree_browser browser(&nv); -// Sxmlelement note = *iter; -// browser.browse(*note); -// checkStaff(nv.getStaff()); -// newNote (nv, thisNoteHeadPosition, elt); -// } - isProcessingChord = false; while (pendingPops--) pop(); From 57103a0bbcb940480360162c61bcb2b673c4b496 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 25 Feb 2020 14:03:29 +0100 Subject: [PATCH 017/164] Fermatas now do not inherit y-position from XML to allow GuidoLib to take care of collisions. Added Unit Tests for other bugs. This fixes: GUID-157, GUID-91, GUID-141, GUID-136 and GUID-91 --- files/xml2guido/GUID-141-CrossStaffSlurs.xml | 1376 ++++++++++++++ ....xml => GUID-145-CautionaryOnKeyNotes.xml} | 0 files/xml2guido/GUID-149-Slurs.xml | 1047 +++++++++++ .../GUID-160-ArticulationFingeringStack1.xml | 1587 +++++++++++++++++ files/xml2guido/GUID-91-EmbeddedSlurs.xml | 768 ++++++++ files/xml2guido/GUID-91-SlurGrace.xml | 655 +++++++ files/xml2guido/GUID157-CrossStaff.xml | 233 +++ src/guido/xmlpart2guido.cpp | 18 +- 8 files changed, 5675 insertions(+), 9 deletions(-) create mode 100644 files/xml2guido/GUID-141-CrossStaffSlurs.xml rename files/xml2guido/{GUID145-CautionaryOnKeyNotes.xml => GUID-145-CautionaryOnKeyNotes.xml} (100%) create mode 100644 files/xml2guido/GUID-149-Slurs.xml create mode 100644 files/xml2guido/GUID-160-ArticulationFingeringStack1.xml create mode 100644 files/xml2guido/GUID-91-EmbeddedSlurs.xml create mode 100644 files/xml2guido/GUID-91-SlurGrace.xml create mode 100644 files/xml2guido/GUID157-CrossStaff.xml diff --git a/files/xml2guido/GUID-141-CrossStaffSlurs.xml b/files/xml2guido/GUID-141-CrossStaffSlurs.xml new file mode 100644 index 000000000..9d9e43bc7 --- /dev/null +++ b/files/xml2guido/GUID-141-CrossStaffSlurs.xml @@ -0,0 +1,1376 @@ + + + + Romance + + Camille Saint-Saëns + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2019-09-27 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 143 + 93 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Romance + + + composer + Camille Saint-Saëns + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 75 + 0 + + 273 + + + 78 + + system + + + 4 + + -5 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + 1 + 1 + 16th + 1 + + + + F + 3 + + 1 + 1 + 16th + up + 2 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + + + 16 + + + + D + -1 + 2 + + 16 + 2 + whole + 2 + + + + + D + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 166 + + + 78 + + + + + 1 + 1 + 16th + 1 + + + + F + 3 + + 1 + 1 + 16th + up + 2 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + + + 16 + + + + D + -1 + 2 + + 16 + 2 + whole + 2 + + + + + D + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 1 + 1 + 16th + 1 + + + + F + 3 + + 1 + 1 + 16th + up + 2 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + + + 16 + + + + D + -1 + 2 + + 16 + 2 + whole + 2 + + + + + D + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 165 + + + 78 + + + + + 1 + 1 + 16th + 1 + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + + + 16 + + + + E + -1 + 2 + + 16 + 2 + whole + 2 + + + + + E + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 1 + 1 + 16th + 1 + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + + + 16 + + + + F + 2 + + 16 + 2 + whole + 2 + + + + + F + 3 + + 16 + 2 + whole + 2 + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID145-CautionaryOnKeyNotes.xml b/files/xml2guido/GUID-145-CautionaryOnKeyNotes.xml similarity index 100% rename from files/xml2guido/GUID145-CautionaryOnKeyNotes.xml rename to files/xml2guido/GUID-145-CautionaryOnKeyNotes.xml diff --git a/files/xml2guido/GUID-149-Slurs.xml b/files/xml2guido/GUID-149-Slurs.xml new file mode 100644 index 000000000..a83b96cb5 --- /dev/null +++ b/files/xml2guido/GUID-149-Slurs.xml @@ -0,0 +1,1047 @@ + + + + Wiegenlied + + Franz Schubert + www.antescofo.com + + Finale v25 for Mac + 2019-10-28 + + + + + + + + + + 6.4347 + 40 + + + 1846 + 1305 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 143 + 93 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + www.antescofo.com + + + Wiegenlied + + + Franz Schubert + + + Lullaby + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 66 + 0 + + 269 + + + 86 + + system + + + 4 + + -1 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + C + 4 + + 4 + 1 + quarter + up + 1 + + + + + E + 4 + + 4 + 1 + quarter + up + 1 + + + + + G + 4 + + 4 + 1 + quarter + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + E + 4 + + 2 + 1 + eighth + up + 1 + + + + + G + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + end + + + + + E + 4 + + 2 + 1 + eighth + up + 1 + + + + + G + 4 + + 2 + 1 + eighth + up + 1 + + + + F + 4 + + 3 + 1 + eighth + + up + 1 + begin + + + + + + + + A + 4 + + 3 + 1 + eighth + + up + 1 + + + + E + 4 + + 1 + 1 + 16th + up + 1 + end + backward hook + + + + + G + 4 + + 1 + 1 + 16th + up + 1 + + + + F + 4 + + 4 + 1 + quarter + up + 1 + + + + + + 16 + + + 8 + 2 + 1 + + + + C + 4 + + 8 + 2 + half + down + 1 + + + 16 + + + + C + 3 + + 4 + 3 + quarter + up + 2 + + + + C + 3 + + 2 + 3 + eighth + up + 2 + begin + + + + C + 3 + + 2 + 3 + eighth + up + 2 + end + + + + F + 3 + + 3 + 3 + eighth + + down + 2 + begin + + + + + + + C + 3 + + 1 + 3 + 16th + down + 2 + end + backward hook + + + + A + 2 + + 4 + 3 + quarter + up + 2 + + + + + + + + + + 152 + + + 100 + + + + + C + 5 + + 4 + 1 + quarter + up + 1 + + + + + + + E + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + B + -1 + 4 + + 2 + 1 + eighth + up + 1 + + + + F + 4 + + 2 + 1 + eighth + up + 1 + end + + + + + + + + A + 4 + + 2 + 1 + eighth + up + 1 + + + + G + 4 + + 6 + 1 + quarter + + up + 1 + + + + + + + G + 1 + 4 + + 2 + 1 + eighth + sharp + up + 1 + + + + + + 16 + + + + C + 4 + + 8 + 2 + half + down + 1 + + + + C + 4 + + 8 + 2 + half + down + 1 + + + + + E + 4 + + 8 + 2 + half + down + 1 + + + 16 + + + + A + 3 + + 4 + 3 + quarter + down + 2 + + + + + + + G + 3 + + 2 + 3 + eighth + down + 2 + begin + + + + F + 3 + + 2 + 3 + eighth + down + 2 + end + + + + + + + C + 3 + + 8 + 3 + half + up + 2 + + + + + + + F + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + + + + A + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + F + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + + A + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + end + + + + E + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + B + -1 + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + E + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + + G + 4 + + 2 + 1 + eighth + natural + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + end + + + + + + 16 + + + + F + 2 + + 8 + 3 + half + up + 2 + + + + + F + 3 + + 8 + 3 + half + up + 2 + + + + C + 2 + + 8 + 3 + half + up + 2 + + + + + C + 3 + + 8 + 3 + half + up + 2 + + + + + + + A + 4 + + 4 + 1 + quarter + up + 1 + + + + + + + E + 4 + + 4 + 1 + quarter + up + 1 + + + + + + + + G + 4 + + 4 + 1 + quarter + up + 1 + + + + A + 3 + + 2 + 1 + eighth + up + 1 + begin + + + + + + + + F + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + A + 3 + + 2 + 1 + eighth + up + 1 + continue + + + + + F + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 5 + + 2 + 1 + eighth + up + 1 + end + + + + + + 16 + + + + F + 4 + + 2 + 2 + eighth + down + 1 + begin + + + + + + + C + 4 + + 2 + 2 + eighth + down + 1 + end + + + + B + -1 + 3 + + 2 + 2 + eighth + down + 1 + begin + + + + C + 4 + + 2 + 2 + eighth + down + 1 + end + + + + + + 8 + 2 + 1 + + + 16 + + + + F + 2 + + 4 + 3 + quarter + up + 2 + + + + + F + 3 + + 4 + 3 + quarter + up + 2 + + + + C + 3 + + 4 + 3 + quarter + up + 2 + + + + F + 2 + + 8 + 3 + half + up + 2 + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID-160-ArticulationFingeringStack1.xml b/files/xml2guido/GUID-160-ArticulationFingeringStack1.xml new file mode 100644 index 000000000..a14a2d515 --- /dev/null +++ b/files/xml2guido/GUID-160-ArticulationFingeringStack1.xml @@ -0,0 +1,1587 @@ + + + + Stack articulations II + + www.antescofo.com + + Finale v25 for Mac + 2020-02-19 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 156 + 62 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + + Violin + Vn. + + ARIA Player + strings.violin + + + + ARIA Player + + 1 + 1 + 80 + -63 + + + + + + + + + 248 + + system + + + 4 + + 3 + major + + + + G + 2 + + + + + + A + 4 + + 2 + 1 + eighth + up + + + 1 + + + + + + + + + + A + 5 + + 2 + 1 + eighth + up + + + + B + 4 + + 2 + 1 + eighth + up + + + + + + 2 + + + + + + C + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + + + D + 5 + + 2 + 1 + eighth + up + + + + + + + + + + E + 5 + + 2 + 1 + eighth + up + + + 0 + + + + + + + F + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + 5 + + + + + + G + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + 4 + + + + + + A + 5 + + 2 + 1 + eighth + up + + + + + + + + + + + + A + 5 + + 2 + 1 + eighth + up + + + + + + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + up + + + + + + 1 + + + + + + F + 1 + 5 + + 2 + 1 + eighth + up + + + + 1 + + + + + + E + 5 + + 2 + 1 + eighth + up + + + 0 + + + + + + D + 5 + + 2 + 1 + eighth + up + + + + + + + + + + + + C + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + + + B + 4 + + 2 + 1 + eighth + up + + + + + + + + + + + + A + 4 + + 2 + 1 + eighth + up + + + 0 + + + + + + + + + + 216 + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + + + + + + 0 + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + 2 + + + + + + D + 5 + + 2 + 1 + eighth + down + + + + + + 1 + + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + + + + 0 + + + + + + B + 4 + + 2 + 1 + eighth + down + + + + + + 2 + + + + + + A + 4 + + 2 + 1 + eighth + down + + + + + + 1 + + + + + + G + 1 + 4 + + 2 + 1 + eighth + down + + + + + + 4 + + + + + + F + 1 + 4 + + 2 + 1 + eighth + down + + + + + + + + + + + + + + 216 + + + + + A + 4 + + 2 + 1 + eighth + up + begin + + + + + + + + + + + + G + 1 + 4 + + 2 + 1 + eighth + up + continue + + + + + + 1 + + + + + + F + 1 + 4 + + 2 + 1 + eighth + up + continue + + + + 1 + + + + + + E + 4 + + 2 + 1 + eighth + up + continue + + + 0 + + + + + + + + + D + 4 + + 2 + 1 + eighth + up + continue + + + + + + + + + + + + C + 1 + 4 + + 2 + 1 + eighth + up + continue + + + + + + 3 + + + + + + B + 3 + + 2 + 1 + eighth + up + continue + + + + + + + + + 5 + + + + + + A + 3 + + 1 + 1 + 16th + up + continue + begin + + + 0 + + + + + + + + + A + 3 + + 1 + 1 + 16th + up + end + end + + + + + + + + + + 252 + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + 2 + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + 4 + + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + end + + + + + + 2 + + + + + + E + 5 + + 2 + 1 + eighth + down + begin + + + + + + 0 + + + + + + D + 5 + + 2 + 1 + eighth + down + continue + + + + + + 2 + + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + + + 1 + + + + + + B + 4 + + 2 + 1 + eighth + down + continue + + + + + + 0 + + + + + + A + 4 + + 2 + 1 + eighth + down + end + + + + + + + + + + + + + + 215 + + + + + E + 4 + + 2 + 1 + eighth + down + begin + + + 1 + 2 + 5 + + + + + + + G + 1 + 4 + + 2 + 1 + eighth + down + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + + F + 1 + 4 + + 2 + 1 + eighth + down + continue + + + 2 + 4 + 1 + + + + + + + A + 4 + + 2 + 1 + eighth + down + + + + + D + 5 + + 2 + 1 + eighth + down + + + + A + 4 + + 2 + 1 + eighth + down + continue + + + 3 + 5 + 1 + + + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + + + + B + 4 + + 2 + 1 + eighth + down + end + + + + + + + + + + + D + 5 + + 2 + 1 + eighth + down + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + + + 5 + + + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + + + + + B + 5 + + 2 + 1 + eighth + down + + + + E + 5 + + 2 + 1 + eighth + down + continue + + + + + + 1 + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + + C + 1 + 6 + + 2 + 1 + eighth + down + + + + F + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + + + + + + + + + + B + 5 + + 2 + 1 + eighth + down + + + + + F + 1 + 6 + + 2 + 1 + eighth + down + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + E + 6 + + 2 + 1 + eighth + down + + + + + C + 1 + 7 + + 2 + 1 + eighth + down + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + + + + D + 6 + + 2 + 1 + eighth + down + + + + + B + 6 + + 2 + 1 + eighth + down + + + + F + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + + + 3 + + + + + + + B + 5 + + 2 + 1 + eighth + down + + + + + F + 1 + 6 + + 2 + 1 + eighth + down + + + + E + 5 + + 2 + 1 + eighth + down + continue + + + + + + + 0 + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + + C + 1 + 6 + + 2 + 1 + eighth + down + + + + D + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + 2 + 3 + 5 + + + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + + + + + B + 5 + + 2 + 1 + eighth + down + + + + + + + A + 4 + + 2 + 1 + eighth + down + continue + + + + 4 + + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + + D + 6 + + 2 + 1 + eighth + down + + + + F + 1 + 4 + + 2 + 1 + eighth + down + continue + + + + + + + 5 + 2 + + + + + + + B + 4 + + 2 + 1 + eighth + down + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + D + 4 + + 2 + 1 + eighth + down + end + + + + + + 1 + 3 + 4 + + + + + + + + F + 1 + 4 + + 2 + 1 + eighth + down + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID-91-EmbeddedSlurs.xml b/files/xml2guido/GUID-91-EmbeddedSlurs.xml new file mode 100644 index 000000000..cf529d0ae --- /dev/null +++ b/files/xml2guido/GUID-91-EmbeddedSlurs.xml @@ -0,0 +1,768 @@ + + + + Je crois entendre encore + + Georges Bizet + www.antescofo.com + + Finale v25 for Mac + 2019-09-25 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 144 + 94 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Je crois entendre encore + + + composer + Georges Bizet + + + + Tenor + T + + SmartMusic SoftSynth + voice.tenor + + + 16 + 15489 + 53 + 80 + 0 + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + system + + + 2 + + 0 + major + + + + G + 2 + -1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + light-heavy + + + + + + + + + + 84 + 0 + + 164 + + + 134 + + system + + + 2 + + 0 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + + + + + 1 + + + + + Andante + + 1 + + + + E + 4 + + 6 + + 1 + half + + up + 1 + + + + + + + 6 + + + + C + 4 + + 2 + 2 + quarter + 2 + + + + E + 3 + + 1 + 2 + eighth + up + 2 + + + + + + + B + 3 + + 2 + 2 + quarter + up + 2 + + + + C + 4 + + 1 + 2 + eighth + up + 2 + + + 6 + + + + E + 2 + + 2 + 3 + quarter + down + 2 + + + + E + 2 + + 1 + 3 + eighth + 2 + + + + E + 2 + + 3 + 3 + quarter + + 2 + + + + + + + E + 4 + + 2 + + 1 + quarter + up + 1 + + + + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + G + 4 + + 2 + 1 + quarter + up + 1 + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + + + 6 + + + + D + 4 + + 3 + 2 + quarter + + up + 2 + + + + A + 3 + + 3 + 2 + quarter + + up + 2 + + + + + + + + C + 4 + + 3 + 2 + quarter + + up + 2 + + + + + + + E + 4 + + 6 + + 1 + half + + up + 1 + + + + + + + 6 + + + + C + 4 + + 2 + 2 + quarter + 2 + + + + E + 3 + + 1 + 2 + eighth + up + 2 + + + + + + + B + 3 + + 2 + 2 + quarter + up + 2 + + + + C + 4 + + 1 + 2 + eighth + up + 2 + + + 6 + + + + E + 2 + + 2 + 3 + quarter + down + 2 + + + + E + 2 + + 1 + 3 + eighth + 2 + + + + E + 2 + + 3 + 3 + quarter + + 2 + + + + + + + E + 4 + + 2 + + 1 + quarter + up + 1 + + + + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + G + 4 + + 2 + 1 + quarter + up + 1 + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + + + 6 + + + + D + 4 + + 3 + 2 + quarter + + up + 2 + + + + A + 3 + + 3 + 2 + quarter + + up + 2 + + + + + + + + C + 4 + + 3 + 2 + quarter + + up + 2 + + + + + + + E + 4 + + 3 + + 1 + quarter + + up + 1 + + + + + + + E + 4 + + 2 + + 1 + quarter + up + 1 + + + + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + 6 + + + + C + 4 + + 2 + 2 + quarter + 2 + + + + E + 3 + + 1 + 2 + eighth + up + 2 + + + + + + + ten. + + 2 + + + + B + 3 + + 2 + 2 + quarter + up + 2 + + + + + + + C + 4 + + 1 + 2 + eighth + 2 + + + 6 + + + + E + 2 + + 2 + 3 + quarter + down + 2 + + + + E + 2 + + 1 + 3 + eighth + 2 + + + + E + 2 + + 3 + 3 + quarter + + 2 + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID-91-SlurGrace.xml b/files/xml2guido/GUID-91-SlurGrace.xml new file mode 100644 index 000000000..603d46b6e --- /dev/null +++ b/files/xml2guido/GUID-91-SlurGrace.xml @@ -0,0 +1,655 @@ + + + + Vortrag-Stücke + + Wilhelm Popp + www.antescofo.com + + Finale 2014.5 for Mac + Dolet 7.0 for Finale + 2019-02-14 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 143 + 93 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Vortrag-Stücke + + + composer + Wilhelm Popp + + + subtitle + 2. Russisches Zigeunerlied + + + + Flute + + ARIA Player + wind.flutes.flute + + + 1 + 15489 + 74 + 100 + 0 + + + + Piano + + ARIA Player + keyboard.piano + + + 2 + 15489 + 1 + 46 + -6 + + + + + + + + + + 67 + 0 + + 267 + + system + + + 4 + + -1 + minor + + + + G + 2 + + + + + + + G + 1 + 5 + + 1 + eighth + sharp + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + + G + 1 + 5 + + 1 + eighth + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + C + 6 + + 3 + 1 + eighth + + down + begin + + + + + + + + + B + 5 + + 1 + 1 + 16th + natural + down + end + backward hook + + + + + + + + G + 1 + 5 + + 1 + eighth + sharp + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + + G + 1 + 5 + + 1 + eighth + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + C + 6 + + 3 + 1 + eighth + + down + begin + + + + + + + + + D + 6 + + 1 + 1 + 16th + down + end + backward hook + + + light-heavy + + + + + + + + + 78 + + + 83 + + none + + + 2 + + -1 + minor + + + 2 + + G + 2 + + + F + 4 + + + + + + C + 4 + + 1 + 1 + eighth + up + 1 + begin + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + C + 4 + + 1 + 1 + eighth + up + 1 + end + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + D + 4 + + 2 + 1 + quarter + up + 1 + + + + + + + + + + F + 4 + + 2 + 1 + quarter + up + 1 + + + 4 + + + + A + 2 + + 1 + 2 + eighth + down + 2 + begin + + + + + + + + + A + 3 + + 1 + 2 + eighth + down + 2 + end + + + + + + + + + A + 3 + + 2 + 2 + quarter + down + 2 + + + + + + + + + + + + C + 4 + + 1 + 1 + eighth + up + 1 + begin + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + C + 4 + + 1 + 1 + eighth + up + 1 + end + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + quarter + up + 1 + + + + + + + + + + F + 4 + + 2 + 1 + quarter + up + 1 + + + 4 + + + + A + 2 + + 1 + 2 + eighth + down + 2 + begin + + + + + + + + + A + 3 + + 1 + 2 + eighth + down + 2 + end + + + + + + + + + A + -1 + 3 + + 2 + 2 + quarter + flat + down + 2 + + + + + + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID157-CrossStaff.xml b/files/xml2guido/GUID157-CrossStaff.xml new file mode 100644 index 000000000..01d40cfe3 --- /dev/null +++ b/files/xml2guido/GUID157-CrossStaff.xml @@ -0,0 +1,233 @@ + + + + Titre + + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2019-11-28 + + + + + + + + + + 6.35 + 40 + + + 1871 + 1323 + + 94 + 94 + 94 + 94 + + + + + 0 + 0 + + 145 + 94 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Titre + + + composer + Prénom Nom + + + subtitle + Nom ou numéro du mouvement + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 94 + 0 + + 229 + + + 78 + + system + + + 4 + + 0 + major + + + 2 + + G + 2 + + + F + 4 + + + + + 16 + 1 + 1 + + + 16 + + + + A + 3 + + 1 + 2 + 16th + up + 2 + begin + begin + + + + A + 4 + + 1 + 2 + 16th + down + 1 + end + end + + + + 1 + 2 + 16th + 2 + + + + A + 3 + + 1 + 2 + 16th + down + 2 + + + 12 + 2 + 2 + + + + + + + 16 + 1 + 1 + + + 16 + + + + 16 + 2 + 2 + + + + + + + 16 + 1 + 1 + + + 16 + + + + 16 + 2 + 2 + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index a3db762a5..c61f025c0 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2376,15 +2376,15 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) s << "position=" << "\"below\""; tag->add (guidoparam::create(s.str(), false)); - // XML reports distance from top of staff, Guido needs from bottom in Inverted mode. This is offset 8 - xml2guidovisitor::addPosY(nv.fFermata, tag, 8, 1.0); - }else{ - float noteDistanceFromTopStaff = getNoteDistanceFromStaffTop(nv); - // Do not infer fermata position if note is above top of the staff. Let guido do it - if (noteDistanceFromTopStaff < 2) { - xml2guidovisitor::addPosY(nv.fFermata, tag, 0, 1.0); - } - } + // We don't add dY since GuidoLib resolves collisions between articulations. + } +// else{ +// float noteDistanceFromTopStaff = getNoteDistanceFromStaffTop(nv); +// // Do not infer fermata position if note is above top of the staff. Let guido do it +// if (noteDistanceFromTopStaff < 2) { +// xml2guidovisitor::addPosY(nv.fFermata, tag, 0, 1.0); +// } +// } push(tag); return 1; } From 05b54fd21ba43baeccac08c7779300f805211952 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 27 Mar 2020 16:01:30 +0100 Subject: [PATCH 018/164] xml2guido: - Fixed Octava parsing for Guido - Added support for Staccatissimo --- src/guido/xmlpart2guido.cpp | 42 +++++++++++++++++++++++++++++++----- src/guido/xmlpart2guido.h | 3 ++- src/visitors/notevisitor.cpp | 1 + src/visitors/notevisitor.h | 5 ++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index c61f025c0..21e7f392e 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -46,6 +46,7 @@ namespace MusicXML2 fIgnoreWedgeWithOffset = false; fTupletOpen = 0; fTremoloInProgress = false; + fShouldStopOctava = false; } //______________________________________________________________________________ @@ -65,6 +66,7 @@ namespace MusicXML2 fIgnoreWedgeWithOffset = false; fTupletOpen = 0; fTremoloInProgress = false; + fShouldStopOctava = false; } //______________________________________________________________________________ @@ -81,6 +83,7 @@ namespace MusicXML2 fIgnoreWedgeWithOffset = false; fTupletOpen = 0; fTremoloInProgress = false; + fShouldStopOctava = false; start (seq); } @@ -374,7 +377,11 @@ namespace MusicXML2 { // !IMPORTANT: Avoid using default-x since it is measured from the beginning of the measure for S_direction! - if (fSkipDirection) return; + if (fSkipDirection) { + // set back to false for next elements! + fSkipDirection = false; + return; + } /// Skip already visited Direction in case of grace notes (GUID-153) if ((!fDirectionEraserStack.empty())) { @@ -876,7 +883,9 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) //______________________________________________________________________________ void xmlpart2guido::visitStart( S_octave_shift& elt) { - if (fSkipDirection) return; + if (fSkipDirection) { + return; + } const string& type = elt->getAttributeValue("type"); int size = elt->getAttributeIntValue("size", 0); @@ -890,8 +899,11 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) if (type == "up") size = -size; else if (type == "stop") - size = 0; - else if (type != "down") return; + { + // in MusicXML, octava stop appears BEFORE the note it should be applied upon! We therefore keep this for the next note visit + fShouldStopOctava = true; + return; + } Sguidoelement tag = guidotag::create("oct"); if (tag) { @@ -899,6 +911,17 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) add (tag); } } + + void xmlpart2guido::checkOctavaEnd() { + if (!fShouldStopOctava) { + return; + } + Sguidoelement tag = guidotag::create("oct"); + tag->add (guidoparam::create(0, false)); + add(tag); + + fShouldStopOctava = false; + } //______________________________________________________________________________ void xmlpart2guido::visitStart ( S_note& elt ) @@ -1933,6 +1956,13 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con push(tag); n++; } + if (note.fStaccatissimo) { + tag = guidotag::create("stacc"); + tag->add (guidoparam::create("type=\"heavy\"", false)); + if (fGeneratePositions) xml2guidovisitor::addPlacement(note.fStaccatissimo, tag); + push(tag); + n++; + } if (note.fTenuto) { tag = guidotag::create("ten"); if (fGeneratePositions) xml2guidovisitor::addPlacement(note.fTenuto, tag); @@ -1965,6 +1995,8 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) xml2guidovisitor::addPosY(note.fBreathMark, tag, -3, 1); add(tag); } + + checkOctavaEnd(); } @@ -2519,7 +2551,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur if (i==0) { s << ", text=\"" << fingeringText; }else { - s << ", " << fingeringText; + s << "," << fingeringText; } if (i+1 == fingerings.size()) { diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 074f2d62b..3e3424614 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -77,7 +77,7 @@ class EXP xmlpart2guido : bool fGenerateComments, fGenerateBars, fGeneratePositions, fGenerateAutoMeasureNum, fLyricsManualSpacing; // internal parsing state - bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress; + bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress, fShouldStopOctava; int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets @@ -153,6 +153,7 @@ class EXP xmlpart2guido : void checkWavyTrillBegin ( const notevisitor& nv ); void checkWavyTrillEnd ( const notevisitor& nv ); void checkTextEnd(); + void checkOctavaEnd(); void newNote ( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings); void newChord (const deque& nvs, rational posInMeasure); diff --git a/src/visitors/notevisitor.cpp b/src/visitors/notevisitor.cpp index d50a365fd..d31e55ea7 100644 --- a/src/visitors/notevisitor.cpp +++ b/src/visitors/notevisitor.cpp @@ -86,6 +86,7 @@ void notevisitor::reset () fBowDown = (void*)0; fHarmonic = (void*)0; fSnapPizzicato = (void*)0; + fStaccatissimo = (void*)0; } //________________________________________________________________________ diff --git a/src/visitors/notevisitor.h b/src/visitors/notevisitor.h index 8dea6b8b2..b63ddf99e 100644 --- a/src/visitors/notevisitor.h +++ b/src/visitors/notevisitor.h @@ -82,7 +82,8 @@ class EXP notevisitor : public visitor, public visitor, public visitor, - public visitor + public visitor, + public visitor { public: S_stem fStem; @@ -106,6 +107,7 @@ class EXP notevisitor : std::string fCautionary; S_harmonic fHarmonic; S_snap_pizzicato fSnapPizzicato; + S_staccatissimo fStaccatissimo; S_up_bow fBowUp; S_down_bow fBowDown; @@ -231,6 +233,7 @@ class EXP notevisitor : virtual void visitStart( S_up_bow& elt) {fBowUp = elt;} virtual void visitStart( S_harmonic& elt) {fHarmonic = elt;} virtual void visitStart( S_snap_pizzicato& elt) {fSnapPizzicato = elt;} + virtual void visitStart( S_staccatissimo& elt) {fStaccatissimo = elt;} private: bool fGrace, fCue, fChord; From 69f883c9920d6a6267d467720aaaabdd3949addd Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 7 Apr 2020 19:05:59 +0200 Subject: [PATCH 019/164] GUID-132: Better StaffDistance inference --- src/guido/xml2guidovisitor.cpp | 65 ++++++++++++++++++---------------- src/guido/xmlpart2guido.cpp | 49 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 30 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 4440087b5..4f83eec67 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -171,10 +171,10 @@ namespace MusicXML2 defaultStaffDistance = elt->getIntValue(k_staff_distance, 0); // Convert to HS - /// Guido's default staff-distance seems to be 10HS or 50 tenths + /// Guido's default staff-distance seems to be 8 or 80 tenths if (defaultStaffDistance > 0) { - float xmlDistance = defaultStaffDistance - 50.0; - float HalfSpaceDistance = -1.0 * (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 + float xmlDistance = defaultStaffDistance - 80.0; + float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // (pos/10)*2 if (HalfSpaceDistance < 0.0) { defaultGuidoStaffDistance = HalfSpaceDistance; }else @@ -245,37 +245,42 @@ namespace MusicXML2 //// Add staffFormat if needed // Case1: If previous staff has Lyrics, then move current staff lower to create space: \staffFormat int stafflines = elt->getIntValue(k_staff_lines, 0); - - if ((previousStaffHasLyrics)||stafflines||defaultGuidoStaffDistance||ps.fStaffDistances.size()) + if (stafflines>0) { Sguidoelement tag2 = guidotag::create("staffFormat"); - if (previousStaffHasLyrics) - { - tag2->add (guidoparam::create("dy=-5", false)); - }else if (ps.fStaffDistances.size()> size_t(targetStaff-1)) { - - if (ps.fStaffDistances[targetStaff-1] > 0) { - float xmlDistance = ps.fStaffDistances[targetStaff-1] - 50.0; - float HalfSpaceDistance = -1.0 * (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 - - stringstream s; - s << "dy="<< HalfSpaceDistance; - tag2->add (guidoparam::create(s.str().c_str(), false)); - } - }else if (defaultGuidoStaffDistance) { - stringstream s; - s << "dy="<< defaultGuidoStaffDistance; - tag2->add (guidoparam::create(s.str().c_str(), false)); - } - - if (stafflines>0) - { - stringstream staffstyle; - staffstyle << "style=\"" << stafflines<<"-line\""; - tag2->add (guidoparam::create(staffstyle.str(),false)); - } + stringstream staffstyle; + staffstyle << "style=\"" << stafflines<<"-line\""; + tag2->add (guidoparam::create(staffstyle.str(),false)); add (tag2); } + +// if ((previousStaffHasLyrics)||stafflines||defaultGuidoStaffDistance||ps.fStaffDistances.size()) +// { +// Sguidoelement tag2 = guidotag::create("staffFormat"); +// if (previousStaffHasLyrics) +// { +// tag2->add (guidoparam::create("dy=-5", false)); +// add (tag2); +// }else if (ps.fStaffDistances.size()> size_t(targetStaff-1)) { +// +// if (ps.fStaffDistances[targetStaff-1] > 0) { +// float xmlDistance = ps.fStaffDistances[targetStaff-1] - 80.0; +// float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 +// +// stringstream s; +// s << "distance="<< HalfSpaceDistance; +// cerr<<"StaffDistance "<add (guidoparam::create(s.str().c_str(), false)); +// add (tag2); +// } +// } //// flushHeader (fHeader); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 21e7f392e..cc6d911ea 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -27,6 +27,8 @@ using namespace std; +bool checkTempoMarkup(std::string input); + namespace MusicXML2 { @@ -290,6 +292,24 @@ namespace MusicXML2 Sguidoelement elt = guidoelement ::create(comment); add (elt); } + + // Take care of staff-distance + auto sLayout = elt->find(k_staff_layout); + while (sLayout != elt->end() ) + { + if (sLayout->getAttributeIntValue("number", 0) == fTargetStaff) { + int xmlStaffDistance = sLayout->getIntValue(k_staff_distance, 0); + Sguidoelement tag2 = guidotag::create("staffFormat"); + float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; // 80 is ~default Guido staff distance + stringstream s; + s << "distance="<< HalfSpaceDistance; + cerr<<"StaffDistance measure= "<"<getValue()); + if (generateTempo) { tempoWording = element->getValue(); } @@ -2952,3 +2975,29 @@ float xmlpart2guido::getNoteDistanceFromStaffTop(const notevisitor& nv) { } } + +bool checkTempoMarkup(std::string input) { + std::vector tempoMarkings = { + // Italian terms + "andant", "adagi", "a tempo", "agitato", "allegr", + "moderato", "largo", "larghetto", "lent", "scherz", "vivace", "vivacissimo", "marcia", + // French terms + "au mouvement", "grave", "modéré", "vif", + // German terms + "langsam", "lebhaft", "kräftig", "mässig", "massig", "rasch", "schnell", "bewegt" + }; + + // convert input to lowercase + std::string victim = input; + std::transform(input.begin(), input.end(), victim.begin(), [](unsigned char c){ return std::tolower(c); }); + + vector::const_iterator it_found = find_if(tempoMarkings.begin(), tempoMarkings.end(), [&victim](string s) -> bool { + return (victim.find(s) != string::npos); + }); + + if (it_found != tempoMarkings.end()) { + return true; + }else { + return false; + } +} From 9b113247be9b2f40d22ea398552e35df031a4c9d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 7 Apr 2020 20:56:32 +0200 Subject: [PATCH 020/164] xml2guido: Improved Tempo Markup "detection" and Staff-Distance parsing --- src/guido/xml2guidovisitor.cpp | 60 +++++++++++++++------------------- src/guido/xml2guidovisitor.h | 1 + src/guido/xmlpart2guido.cpp | 60 ++++++++++++++++++---------------- 3 files changed, 60 insertions(+), 61 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 4f83eec67..80483053e 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -173,7 +173,7 @@ namespace MusicXML2 // Convert to HS /// Guido's default staff-distance seems to be 8 or 80 tenths if (defaultStaffDistance > 0) { - float xmlDistance = defaultStaffDistance - 80.0; + float xmlDistance = defaultStaffDistance; float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // (pos/10)*2 if (HalfSpaceDistance < 0.0) { defaultGuidoStaffDistance = HalfSpaceDistance; @@ -245,42 +245,25 @@ namespace MusicXML2 //// Add staffFormat if needed // Case1: If previous staff has Lyrics, then move current staff lower to create space: \staffFormat int stafflines = elt->getIntValue(k_staff_lines, 0); - if (stafflines>0) + if (stafflines||defaultGuidoStaffDistance) { Sguidoelement tag2 = guidotag::create("staffFormat"); - stringstream staffstyle; - staffstyle << "style=\"" << stafflines<<"-line\""; - tag2->add (guidoparam::create(staffstyle.str(),false)); + if (defaultGuidoStaffDistance) { + stringstream s; + s << "distance="<< defaultGuidoStaffDistance; + cerr<<"defaultGuidoStaffDistance "<add (guidoparam::create(s.str().c_str(), false)); + } + if (stafflines>0) + { + Sguidoelement tag2 = guidotag::create("staffFormat"); + stringstream staffstyle; + staffstyle << "style=\"" << stafflines<<"-line\""; + tag2->add (guidoparam::create(staffstyle.str(),false)); + } add (tag2); + // TODO: It seems like in MusicXML the default Staff Distance is reapplied to every new system (?) in case of staff distance change in the middle of a score. } - -// if ((previousStaffHasLyrics)||stafflines||defaultGuidoStaffDistance||ps.fStaffDistances.size()) -// { -// Sguidoelement tag2 = guidotag::create("staffFormat"); -// if (previousStaffHasLyrics) -// { -// tag2->add (guidoparam::create("dy=-5", false)); -// add (tag2); -// }else if (ps.fStaffDistances.size()> size_t(targetStaff-1)) { -// -// if (ps.fStaffDistances[targetStaff-1] > 0) { -// float xmlDistance = ps.fStaffDistances[targetStaff-1] - 80.0; -// float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 -// -// stringstream s; -// s << "distance="<< HalfSpaceDistance; -// cerr<<"StaffDistance "<add (guidoparam::create(s.str().c_str(), false)); -// add (tag2); -// } -// } //// flushHeader (fHeader); @@ -424,6 +407,17 @@ namespace MusicXML2 tag->add (guidoparam::create(s.str(), false)); } } + +void xml2guidovisitor::addRelativeX(Sxmlelement elt, Sguidoelement& tag, float xoffset){ + float posx = elt->getAttributeFloatValue("relative-x", 0); + posx = (posx / 10) * 2; // convert to half spaces + posx += xoffset; + + stringstream s; + s << "dx=" << posx << "hs"; + tag->add (guidoparam::create(s.str(), false)); + +} void xml2guidovisitor::addPlacement ( Sxmlelement elt, Sguidoelement& tag) { diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 7c465664e..99f9c45de 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -127,6 +127,7 @@ class EXP xml2guidovisitor : static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float xoffset); static void addPosY ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float ymultiplier); static void addPosX ( Sxmlelement elt, Sguidoelement& tag, float xoffset); + static void addRelativeX(Sxmlelement elt, Sguidoelement& tag, float xoffset); static void addPlacement ( Sxmlelement elt, Sguidoelement& tag); static float getYposition ( Sxmlelement elt, float yoffset, bool useDefault); static float getXposition ( Sxmlelement elt, float xoffset); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index cc6d911ea..755e7670e 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -303,7 +303,6 @@ namespace MusicXML2 float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; // 80 is ~default Guido staff distance stringstream s; s << "distance="<< HalfSpaceDistance; - cerr<<"StaffDistance measure= "<"<getValue()); + // Candidate for tempo Markup: default-y>10 and font-weight="bold" + if ( (element->getAttributeValue("font-weight")=="bold") + && (element->getAttributeIntValue("default-y", 0)>10)) { + generateTempo = true; + } if (generateTempo) { tempoWording = element->getValue(); @@ -547,7 +550,8 @@ namespace MusicXML2 tag->add (guidoparam::create(wordParameters.str(), false)); // FIXME: XML x-pos is from beginning of measure, whereas nested Text in Guido from the notehead - //xml2guidovisitor::addPosX(element, tag, 0); + // Seems like we can add relative-x which is relative to its hanging position + xml2guidovisitor::addRelativeX(element, tag, 0); // apply inherited Y-position if (commonDy != 0.0) { @@ -2976,28 +2980,28 @@ float xmlpart2guido::getNoteDistanceFromStaffTop(const notevisitor& nv) { } -bool checkTempoMarkup(std::string input) { - std::vector tempoMarkings = { - // Italian terms - "andant", "adagi", "a tempo", "agitato", "allegr", - "moderato", "largo", "larghetto", "lent", "scherz", "vivace", "vivacissimo", "marcia", - // French terms - "au mouvement", "grave", "modéré", "vif", - // German terms - "langsam", "lebhaft", "kräftig", "mässig", "massig", "rasch", "schnell", "bewegt" - }; - - // convert input to lowercase - std::string victim = input; - std::transform(input.begin(), input.end(), victim.begin(), [](unsigned char c){ return std::tolower(c); }); - - vector::const_iterator it_found = find_if(tempoMarkings.begin(), tempoMarkings.end(), [&victim](string s) -> bool { - return (victim.find(s) != string::npos); - }); - - if (it_found != tempoMarkings.end()) { - return true; - }else { - return false; - } -} +//bool checkTempoMarkup(std::string input) { +// std::vector tempoMarkings = { +// // Italian terms +// "andant", "adagi", "a tempo", "agitato", "allegr", +// "moderato", "largo", "larghetto", "lent", "scherz", "vivace", "vivacissimo", "marcia", +// // French terms +// "au mouvement", "grave", "modéré", "vif", +// // German terms +// "langsam", "lebhaft", "kräftig", "mässig", "massig", "rasch", "schnell", "bewegt" +// }; +// +// // convert input to lowercase +// std::string victim = input; +// std::transform(input.begin(), input.end(), victim.begin(), [](unsigned char c){ return std::tolower(c); }); +// +// vector::const_iterator it_found = find_if(tempoMarkings.begin(), tempoMarkings.end(), [&victim](string s) -> bool { +// return (victim.find(s) != string::npos); +// }); +// +// if (it_found != tempoMarkings.end()) { +// return true; +// }else { +// return false; +// } +//} From 9b7eb0c302ae07dfc20d7c77e88fbac3bd96a417 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 8 Apr 2020 14:45:32 +0200 Subject: [PATCH 021/164] xml2guido: Adds Font-size condition for tempo markup detection --- src/guido/xmlpart2guido.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 755e7670e..0726625c1 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -471,9 +471,10 @@ namespace MusicXML2 case k_words: { /// GUID-147: Detect Tempo Markups using specific substrings such as "Andante" etc. - // Candidate for tempo Markup: default-y>10 and font-weight="bold" + // Candidate for tempo Markup: default-y>10 and font-weight="bold" and font-size > 12.0 if ( (element->getAttributeValue("font-weight")=="bold") - && (element->getAttributeIntValue("default-y", 0)>10)) { + && (element->getAttributeIntValue("default-y", 0)>10) + && (element->getAttributeFloatValue("font-size", 0.0) >= 12.0) ) { generateTempo = true; } From c5ea56b57649513263354cff3d77fd81635c383f Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 13 Apr 2020 16:42:04 +0200 Subject: [PATCH 022/164] xml2guido: Fixed inference of staff-distance in erroneous MusicXMLs in case of staff disappearance --- src/guido/xml2guidovisitor.cpp | 19 ++++++++++--------- src/guido/xml2guidovisitor.h | 6 ++++-- src/guido/xmlpart2guido.cpp | 21 ++++++++++++++++++++- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 80483053e..83030e91d 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -27,14 +27,17 @@ using namespace std; + namespace MusicXML2 { + int xml2guidovisitor::defaultGuidoStaffDistance = 0; + int xml2guidovisitor::defaultStaffDistance = 0; //______________________________________________________________________________ xml2guidovisitor::xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar, int partNum) : fGenerateComments(generateComments), fGenerateStem(generateStem), fGenerateBars(generateBar), fGeneratePositions(true), - fCurrentStaffIndex(0), previousStaffHasLyrics(false), fCurrentAccoladeIndex(0), fPartNum(partNum), defaultStaffDistance(0), defaultGuidoStaffDistance(1) + fCurrentStaffIndex(0), previousStaffHasLyrics(false), fCurrentAccoladeIndex(0), fPartNum(partNum) { timePositions.clear(); } @@ -168,19 +171,19 @@ namespace MusicXML2 void xml2guidovisitor::visitStart( S_defaults& elt) { - defaultStaffDistance = elt->getIntValue(k_staff_distance, 0); + xml2guidovisitor::defaultStaffDistance = elt->getIntValue(k_staff_distance, 0); // Convert to HS /// Guido's default staff-distance seems to be 8 or 80 tenths if (defaultStaffDistance > 0) { - float xmlDistance = defaultStaffDistance; + float xmlDistance = xml2guidovisitor::defaultStaffDistance; float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // (pos/10)*2 - if (HalfSpaceDistance < 0.0) { - defaultGuidoStaffDistance = HalfSpaceDistance; + if (HalfSpaceDistance > 0.0) { + xml2guidovisitor::defaultGuidoStaffDistance = HalfSpaceDistance; }else - defaultGuidoStaffDistance = 0; + xml2guidovisitor::defaultGuidoStaffDistance = 0; }else { - defaultGuidoStaffDistance = 0; + xml2guidovisitor::defaultGuidoStaffDistance = 0; } } @@ -243,7 +246,6 @@ namespace MusicXML2 add(tag); //// Add staffFormat if needed - // Case1: If previous staff has Lyrics, then move current staff lower to create space: \staffFormat int stafflines = elt->getIntValue(k_staff_lines, 0); if (stafflines||defaultGuidoStaffDistance) { @@ -251,7 +253,6 @@ namespace MusicXML2 if (defaultGuidoStaffDistance) { stringstream s; s << "distance="<< defaultGuidoStaffDistance; - cerr<<"defaultGuidoStaffDistance "<add (guidoparam::create(s.str().c_str(), false)); } if (stafflines>0) diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 99f9c45de..9da91c5b0 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -102,8 +102,7 @@ class EXP xml2guidovisitor : int fPartNum; // 0 (default) to parse all score-parts. 1 for "P1" only, etc. - int defaultStaffDistance; // xml staff-distance value in defaults - int defaultGuidoStaffDistance; // the above converted to Guido value + static int defaultStaffDistance; // xml staff-distance value in defaults /// multimap containing //std::multimap > staffClefMap; @@ -122,6 +121,9 @@ class EXP xml2guidovisitor : // this is to control exact positionning of elements when information is present // ie converts relative-x/-y into dx/dy attributes void generatePositions (bool state) { fGeneratePositions = state; } + + /// Shared default derived from MusicXML + static int defaultGuidoStaffDistance; // the above converted to Guido value static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset); static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float xoffset); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 0726625c1..eecc4c386 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -293,6 +293,22 @@ namespace MusicXML2 add (elt); } + // Take care of StaffOn StaffOff + // REMOVED: StaffOn / StaffOff in GuidoLib does not behave well in presence of multi-staff Parts +// auto sStaffDetails = elt->find(k_staff_details); +// if (sStaffDetails != elt->end()) { +// if (sStaffDetails->getAttributeIntValue("number", 0) == fTargetStaff) { +// std::string print = sStaffDetails->getAttributeValue("print-object"); +// if (print=="no") { +// Sguidoelement tag = guidotag::create("staffOff"); +// add(tag); +// }else if (print=="yes") { +// Sguidoelement tag = guidotag::create("staffOn"); +// add(tag); +// } +// } +// } + // Take care of staff-distance auto sLayout = elt->find(k_staff_layout); while (sLayout != elt->end() ) @@ -300,7 +316,10 @@ namespace MusicXML2 if (sLayout->getAttributeIntValue("number", 0) == fTargetStaff) { int xmlStaffDistance = sLayout->getIntValue(k_staff_distance, 0); Sguidoelement tag2 = guidotag::create("staffFormat"); - float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; // 80 is ~default Guido staff distance + float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; + if (HalfSpaceDistance < xml2guidovisitor::defaultGuidoStaffDistance) { + HalfSpaceDistance = xml2guidovisitor::defaultGuidoStaffDistance; + } stringstream s; s << "distance="<< HalfSpaceDistance; tag2->add (guidoparam::create(s.str().c_str(), false)); From 5a448403015c8fe9640abc225221b60cf7f65e8a Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Mon, 11 May 2020 14:39:07 +0200 Subject: [PATCH 023/164] web site removed, should only be on master (for docs) and web branch --- docs/CNAME | 1 - docs/css/bootstrap.min.css | 6 - docs/css/bootstrap.min.css.map | 1 - docs/css/lxmlweb.css | 188 ----------------- docs/css/print.css | 17 -- docs/imgs/favicon.ico | Bin 153748 -> 0 bytes docs/imgs/grame.png | Bin 3767 -> 0 bytes docs/index.html | 119 ----------- docs/lib/bootstrap.min.js | 6 - docs/lib/jquery.min.js | 2 - docs/lxmlconverter.js | 260 ----------------------- web/.gitignore | 5 - web/LICENSE | 373 --------------------------------- web/Makefile | 91 -------- web/README.html | 44 ---- web/README.md | 42 ---- web/changelog.txt | 7 - web/package-lock.json | 41 ---- web/package.json | 33 --- web/src/converter.ts | 165 --------------- web/src/download.ts | 26 --- web/src/main.ts | 22 -- web/src/tsconfig.json | 14 -- 23 files changed, 1463 deletions(-) delete mode 100644 docs/CNAME delete mode 100644 docs/css/bootstrap.min.css delete mode 100644 docs/css/bootstrap.min.css.map delete mode 100644 docs/css/lxmlweb.css delete mode 100644 docs/css/print.css delete mode 100644 docs/imgs/favicon.ico delete mode 100755 docs/imgs/grame.png delete mode 100644 docs/index.html delete mode 100644 docs/lib/bootstrap.min.js delete mode 100644 docs/lib/jquery.min.js delete mode 100644 docs/lxmlconverter.js delete mode 100644 web/.gitignore delete mode 100644 web/LICENSE delete mode 100644 web/Makefile delete mode 100644 web/README.html delete mode 100755 web/README.md delete mode 100755 web/changelog.txt delete mode 100644 web/package-lock.json delete mode 100755 web/package.json delete mode 100644 web/src/converter.ts delete mode 100644 web/src/download.ts delete mode 100644 web/src/main.ts delete mode 100644 web/src/tsconfig.json diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 15363f5e0..000000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -libmusicxml.grame.fr \ No newline at end of file diff --git a/docs/css/bootstrap.min.css b/docs/css/bootstrap.min.css deleted file mode 100644 index 5b96335ff..000000000 --- a/docs/css/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.4.1 (https://getbootstrap.com/) - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/docs/css/bootstrap.min.css.map b/docs/css/bootstrap.min.css.map deleted file mode 100644 index 0ae3de508..000000000 --- a/docs/css/bootstrap.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["bootstrap.css","less/normalize.less","dist/css/bootstrap.css","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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A,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,EFCJ,yBCzEC,Ub2zDC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcnxDI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFUJ,yBClFC,Ubo+DC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,Uc57DI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GFmBJ,0BC3FC,Ub6oEC,WACA,WACA,WAVA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UcrmEI,MAAA,KDvCL,WC+CG,MAAA,KD/CH,WC+CG,MAAA,aD/CH,WC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,ID/CH,UC+CG,MAAA,aD/CH,UC+CG,MAAA,YD/CH,gBC8DG,MAAA,KD9DH,gBC8DG,MAAA,aD9DH,gBC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,ID9DH,eC8DG,MAAA,aD9DH,eC8DG,MAAA,YD9DH,eCmEG,MAAA,KDnEH,gBCoDG,KAAA,KDpDH,gBCoDG,KAAA,aDpDH,gBCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,IDpDH,eCoDG,KAAA,aDpDH,eCoDG,KAAA,YDpDH,eCyDG,KAAA,KDzDH,kBCwEG,YAAA,KDxEH,kBCwEG,YAAA,aDxEH,kBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,IDxEH,iBCwEG,YAAA,aDxEH,iBCwEG,YAAA,YDxEH,iBCwEG,YAAA,GCjEJ,MACE,iBAAA,YADF,uBAQI,SAAA,OACA,QAAA,aACA,MAAA,KAKA,sBf+xEJ,sBe9xEM,SAAA,OACA,QAAA,WACA,MAAA,KAKN,QACE,YAAA,IACA,eAAA,IACA,MAAA,KACA,WAAA,KAGF,GACE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","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n//\n\nabbr[title] {\n border-bottom: none; // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: none;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n -moz-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"../fonts/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\");\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: 400;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: \"\\2014 \\00A0\";\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: \"\";\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: \"\\00A0 \\2014\";\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n.row-no-gutters [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1,\n .col-sm-2,\n .col-sm-3,\n .col-sm-4,\n .col-sm-5,\n .col-sm-6,\n .col-sm-7,\n .col-sm-8,\n .col-sm-9,\n .col-sm-10,\n .col-sm-11,\n .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1,\n .col-md-2,\n .col-md-3,\n .col-md-4,\n .col-md-5,\n .col-md-6,\n .col-md-7,\n .col-md-8,\n .col-md-9,\n .col-md-10,\n .col-md-11,\n .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1,\n .col-lg-2,\n .col-lg-3,\n .col-lg-4,\n .col-lg-5,\n .col-lg-6,\n .col-lg-7,\n .col-lg-8,\n .col-lg-9,\n .col-lg-10,\n .col-lg-11,\n .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: 0.01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: 700;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: 400;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n background-image: none;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: 400;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n -o-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: 400;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: 400;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-right: 15px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-right: -15px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: 0.2em 0.6em 0.3em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777777;\n cursor: not-allowed;\n background-color: #eeeeee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: 0.2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 12px;\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: 400;\n line-height: 1.42857143;\n line-break: auto;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: -webkit-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: 0.5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n filter: alpha(opacity=90);\n opacity: 0.9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: \"\\2039\";\n}\n.carousel-control .icon-next:before {\n content: \"\\203a\";\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable declaration-no-important, selector-no-qualifying-type\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important; // Black prints faster: h5bp.com/s\n text-shadow: none !important;\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n}\n","// stylelint-disable value-list-comma-newline-after, value-list-comma-space-after, indentation, declaration-colon-newline-after, font-family-no-missing-generic-family-keyword\n\n//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: \"Glyphicons Halflings\";\n src: url(\"@{icon-font-path}@{icon-font-name}.eot\");\n src: url(\"@{icon-font-path}@{icon-font-name}.eot?#iefix\") format(\"embedded-opentype\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff2\") format(\"woff2\"),\n url(\"@{icon-font-path}@{icon-font-name}.woff\") format(\"woff\"),\n url(\"@{icon-font-path}@{icon-font-name}.ttf\") format(\"truetype\"),\n url(\"@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}\") format(\"svg\");\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: \"Glyphicons Halflings\";\n font-style: normal;\n font-weight: 400;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: https://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// stylelint-disable media-feature-name-no-vendor-prefix, media-feature-parentheses-space-inside, media-feature-name-no-unknown, indentation, at-rule-name-space-after\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","// stylelint-disable selector-list-comma-newline-after, selector-no-qualifying-type\n\n//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: 400;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n padding: .2em;\n background-color: @state-warning-bg;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: 700;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n}\n\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: \"\"; }\n &:after {\n content: \"\\00A0 \\2014\"; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n color: @pre-color;\n word-break: break-all;\n word-wrap: break-word;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n.row-no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n padding-right: ceil((@gutter / 2));\n padding-left: floor((@gutter / 2));\n margin-right: auto;\n margin-left: auto;\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-right: floor((@gutter / -2));\n margin-left: ceil((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-right: (@gutter / 2);\n padding-left: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-right: floor((@grid-gutter-width / 2));\n padding-left: ceil((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-no-qualifying-type\n\n//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","// stylelint-disable selector-no-qualifying-type, property-no-vendor-prefix, media-feature-name-no-vendor-prefix\n\n//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: 700;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\ninput[type=\"search\"] {\n // Override content-box in Normalize (* isn't specific enough)\n .box-sizing(border-box);\n\n // Search inputs in iOS\n //\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n -webkit-appearance: none;\n appearance: none;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n\n // Apply same disabled cursor tweak as for inputs\n // Some special care is needed because

    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 20px;\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n background-color: @list-group-disabled-bg;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n color: @list-group-link-hover-color;\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","// stylelint-disable selector-max-type, selector-max-compound-selectors, selector-max-combinators, no-duplicate-selectors\n\n//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0, 0, 0, .05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-right: @panel-body-padding;\n padding-left: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n border-bottom-left-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n margin-bottom: 0;\n border: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0, 0, 0, .05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","// stylelint-disable property-no-vendor-prefix\n\n//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0); }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n background-clip: padding-box;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0, 0, 0, .5));\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n margin-left: 5px;\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0, 0, 0, .5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top {\n padding: @tooltip-arrow-width 0;\n margin-top: -3px;\n }\n &.right {\n padding: 0 @tooltip-arrow-width;\n margin-left: 3px;\n }\n &.bottom {\n padding: @tooltip-arrow-width 0;\n margin-top: 3px;\n }\n &.left {\n padding: 0 @tooltip-arrow-width;\n margin-left: -3px;\n }\n\n // Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n right: @tooltip-arrow-width;\n bottom: 0;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: 400;\n line-height: @line-height-base;\n line-break: auto;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0, 0, 0, .2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n\n // Arrows\n // .arrow is outer, .arrow:after is inner\n > .arrow {\n border-width: @popover-arrow-outer-width;\n\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n\n &:after {\n content: \"\";\n border-width: @popover-arrow-width;\n }\n }\n\n &.top > .arrow {\n bottom: -@popover-arrow-outer-width;\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n border-bottom-width: 0;\n &:after {\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n content: \" \";\n border-top-color: @popover-arrow-color;\n border-bottom-width: 0;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n border-left-width: 0;\n &:after {\n bottom: -@popover-arrow-width;\n left: 1px;\n content: \" \";\n border-right-color: @popover-arrow-color;\n border-left-width: 0;\n }\n }\n &.bottom > .arrow {\n top: -@popover-arrow-outer-width;\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n &:after {\n top: 1px;\n margin-left: -@popover-arrow-width;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n right: 1px;\n bottom: -@popover-arrow-width;\n content: \" \";\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n }\n }\n}\n\n.popover-title {\n padding: 8px 14px;\n margin: 0; // reset heading margin\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n","// stylelint-disable media-feature-name-no-unknown\n\n//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n\n > .item {\n position: relative;\n display: none;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~\"0.6s ease-in-out\");\n .backface-visibility(~\"hidden\");\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: @carousel-control-width;\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n .opacity(@carousel-control-opacity);\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0, 0, 0, .5); @end-color: rgba(0, 0, 0, .0001));\n }\n &.right {\n right: 0;\n left: auto;\n #gradient > .horizontal(@start-color: rgba(0, 0, 0, .0001); @end-color: rgba(0, 0, 0, .5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n color: @carousel-control-color;\n text-decoration: none;\n outline: 0;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n }\n\n .icon-prev {\n &:before {\n content: \"\\2039\";// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: \"\\203a\";// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0, 0, 0, 0); // IE9\n\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n }\n\n .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n display: table; // 2\n content: \" \"; // 1\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n","// stylelint-disable font-family-name-quotes, font-family-no-missing-generic-family-keyword\n\n// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","// stylelint-disable declaration-no-important, at-rule-no-vendor-prefix\n\n//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: https://getbootstrap.com/docs/3.4/getting-started/#support-ie10-width\n// Source: https://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: https://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// stylelint-disable declaration-no-important\n\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/docs/css/lxmlweb.css b/docs/css/lxmlweb.css deleted file mode 100644 index 0ec493adf..000000000 --- a/docs/css/lxmlweb.css +++ /dev/null @@ -1,188 +0,0 @@ - -html, body { - padding : 0px; - margin-right : 20px; - margin-left : 20px; - margin-top : 5px; - margin-bottom : 0px; - height: 99%; - min-height: 500px; -} - -.header { grid-area: header; } -.left { grid-area: left; height: 100%; } -.right { - grid-area: right; - height: 100%; - border-width: 0; - margin-left: 10px; -} -.footer { - grid-area: footer; - padding: 5px; - text-align: center; - border-width: 0; - border-radius: 5px; - font-size: 85%; - background: #dddddd; - width: 100%; -} - -.grid-container { - display: grid; - grid-template-columns: 70% 30%; - grid-template-rows: 50px calc(100% - 100px) auto; - grid-template-areas: - 'header header' - 'left right' - 'footer footer'; - align-content: start; - grid-gap: 10px; - padding: 3px; - height: 98%; -} - -.grid-container > div { - background-color: rgba(255, 255, 255, 1); - padding: 0 0; - font-size: 14px; - } - -#codepane { height: 100%; } -#code { height: 98%; } -#logs { height: 100%; } -#logpane { height: 98%; } -#guidotry { } -.tab-content { height: calc(100% - 25px); } -.tab-pane { width: 100%; height: 100%; overflow-y: none; } - -.img-centered { - display: block; - margin-left: auto; - margin-right: auto; -} - -.info { - display: block; - margin: auto; - padding-top: calc(35%); - font-size: 150%; - color: lightgrey; - text-align: center; -} -.filename { - position: absolute; - top: 91%; - /* top: calc(100% - 80px); */ - color: rgb(83, 82, 82); - font-size: 95%; -} -.options-table > td { - padding-top: 10px; - padding-left: 20px; - padding-right: 20px; -} - -@media only screen and (max-width: 900px) { - html, body { - padding : 0px; - margin-right : 5px; - margin-left : 5px; - margin-top : 0px; - } - - li > .dropdown-menu { font-size: 100%; } - .navbar { font-size: 120%; } - .tab-pane { font-size: 120%; } - .nav-tabs { font-size: 110%; } - .grid-container { - display: grid; - grid-template-columns: 100%; - grid-template-rows: 50px 55% 40% auto; - grid-template-areas: - 'header' - 'left ' - 'right' - 'footer'; - grid-gap: 5px; - padding: 5px; - } - .filename { - position: relative; - color: rgb(83, 82, 82); - font-size: 100%; - } -} - -/* -#about { padding: 40px; font-size: 14pt; font-family: "Arial, Helvetica"; } -#container { } -#ilogs { } -#prefs { margin: 20px; width: calc(100% - 10px); } -#score { } -#code { resize: none; width: 100%; height: calc(100% - 47px); } -#logs { - padding: 5px; - height: calc(100% - 50px); - border-radius: 8px; - background: rgb(243, 243, 240); - line-height: 1.3em; -} - - .prefs-table > td { - padding-top: 10px; - padding-left: 20px; - padding-right: 20px; -} -.btn-success { height: 30px; font-size: 90%; border-width: 1px; } - - -*/ - -/* .dropdown-submenu { - position: relative; -} - -.dropdown-submenu>.dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover>.dropdown-menu { - display: block; -} - -.dropdown-submenu>a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #ccc; - margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu:hover>a:after { - border-left-color: #fff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left>.dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} */ diff --git a/docs/css/print.css b/docs/css/print.css deleted file mode 100644 index 0f8cdbc2b..000000000 --- a/docs/css/print.css +++ /dev/null @@ -1,17 +0,0 @@ - -/* @media only print { */ - .header { display: none; } - .gmn { display: none; } - .rsize { display: none; } - .svg { display: block; border: 0px} - .footer { display: none; } - - .noprint { display: none; } - .well { border: 0px; } - .page { border: 0px; } - .tab-content{ border: 0px; } - .tab-pane { border: 0px; } - - html, body { margin: 0px; } - .grid-container { display: block; border: 0px; } -/* } */ diff --git a/docs/imgs/favicon.ico b/docs/imgs/favicon.ico deleted file mode 100644 index 8712296e5d45ff28ebd9d2d4376bc5e3d11cd234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153748 zcmeFa2Ygjk);@d@+l*~SXGUQh(Xn?BN34hqaV(=VIu^vPD2gJA1&|^rpaRlcNNAyV z2t5fckU&Cu&n-!A3MCK-gd`+c-}9_<_RY;D3E-&jJMaHHzu(Hax%ZU4_o{oXwbyny znmNvL{O)%SoG*90d%DB%nZx0@U{1nZxxh9*Bd_9}(kloH??Y<2wA0N8uamdz>5&yyv2G zEYSb`{?t}iJ8Elc&aSDde4?hRYGLiMV?|P1TO%Sh_`ay7qGDmyp+iqp9Xxn;)xlEV zow&{+H8l=g*Yeo@lJQ4!J*8zi*>c$Bl*-Zrf_tUnz@m`zxFC&i1A}( z&(_T=59j5!Jd~Zqd(Q%lPf1RZ>9~L4!bP%R;X+w8d$#OPN|2P87#TNqoCHmsDr3iu zmlfE!!5%lce}~aeF+HmYylYgED2zyi{4c zIZn20-6|W_Z;&wDzj)CiNyq=k4jsg+YYPj!-kQ{u6xkKMUEFTB`SKrTmWI78ZHl;vj zF7?W^WqFdFlcTuZg)w#lDoaWZ;QhQ;>8G})R!U1t<-maha_C?waG5Ml7st~po?QvD zJ2PEM_U@Ivd-h2A;WD<}(2vqDp0g65M-|4Fw2+&dEBP2#Z+x5_NJ=zg&TDvWO91aR z!2kKo(%RZuIe@kpeC)-TR_xtFdMUN9@!e|}(SFX^I6nbccntiDXVjoSHI+w>6k)6u z+Q0D{bDP6+mcy~JIpj$*-&ZI6z-xIA@1>l9D04tusr=EKA=4U@Gx|IJunk7$;M@T) z3jIp}O_kv{b6}ur6ZjisQiqyjRg_P9uX#>G=Nif+k!Hur%kMaLdMN|%90mVx-?T}7=+{p^?EI2^+WAEp z^YKTrGkA&=ZdhAh5+BzOeLCx~$F1+cb9LNsejjvM{(iS^^7^Z<%KPtilTUhnBAYLBbg6{SnkA8t{pbT^biNn(YIm%xjL#?C&H_j!WJNOgi}E@N=Xmfl<-)dQOU1Kv zk?e`uBJPNA>G$D>G8*!J#flaB9=>Za-#2ZV>@J678r9v&`h zA-luE!gQRLV2l=FjGU{(1UgW_7nH-~o%nr}!8>BagRxsXcaFH-9&x!`lAWEc?-=l7 z7W6^3OkbHMQ9ELxSE6JS+QE0M!8@p*mO{rZoi|Us+qYRV$KsXvvV(^XZHn9|o1n** zO`asHq0^`{@_(wN+_h4RE~$ZC?Qh1FjF| z=Sem6Cfbgnkwc}ByE)l8`pj&M37=`?pC>m@Vv{|xG{PlcPjN}#iB5Uvn;Z#Vkqo@Y zXdiaWn=5;^Y(oE`A0i{<2y_5>-G07QVVsJKcU#XyyUnwCc0*t7O39bmD{`g#@LYNR zOOHIz#U*3sr%QC~F4+cs8$Wlpq|TWot0#;T7ieeS&K*(#o53eb&<7m8=X&v6>OwxB zpQ%&lhk51SJw5Wm7an<|uUl4ahF*+KQXZK(Vz_kf^r$@b*xzNt#PL!98-+Tqrm}*4 zID|2ZhfJ5t@j6UX=yB7UMyhDF>*0#`FAj z0PUTAdk(StY;--9m320nt zkk{~9-oty%;~G5kcN<7o9RQ@^1jv!H!>}U`mz7D?(W7OMzX>*d^BP{O_XR$*+Ht?5 z)Nz5s<2cK)(a~IC04%0cJ$R3~pU>hm`E1%@mjgNgI1khV6TlPMVb+Cpe?dQ(2Ueef zKHUoF1qcHjc>p?LK>v8~GrtSdYpSbn1)rQjyX&VOpl=7CQC(SiA9Q92zze8`z2~EA zyiZ@QfAE>K&TFcVmV05_g}{!x54Ok|m>ZpRGw@7D6|M*UT?RX26l}MWO7JplC*>*f z75|4F$@zw*Pw;NoqEZDKI10NQHlyld*b^nt`J-S1URIi!;edVEWIH(4hg{i?>dK0H z@!lBNQv$nC_9w7YrsPkCbDzsCn@7azTwC55k z3%vE(0Q?!=y0`M^QD^APnbNcShw{dYFUd>K{8L{1=f9-$v(L)Q&ps!;-+oJyXHJ)* z$Z*w%M9by&*$}$Oj*Emv6rLR>qARFCih*Wai9S5;ASNj2=Bk*1&gA zym_PAi$@_(CXb&W!-jo_>q2A}Y%yLN92_hoMvPQDdilr^lDlM~U<_b~<_=yKZ4 z1o|gU{nMt0?%E-|7`oEt(5Zdh9Mz?RA+mcdliV+IBB(UwuD(FHs@EQn+rl&WFG|CE)G$pk2QI3_viz z(o^Wa6ZR=}JMC@LhJ=I!iG?1H#5-aqj+OY3AlW>5f=mRR-PfkI{Oxadz^}4U?PB)Z z*xo$PpFdwVObr4JgvmkZUgh2DYQB^2ZVkxixWo2WdUnD7j)mPqdprYU!8Xw5r`@y$ zbBEsVzAZ02`iR`uwyoR@dh7UTCm9bKSO=fTYRqYjZ^*QP?IO*P25F<%@6Wg2-3$J* z>gtN4LY_MU8$KPj_IBuX4}3qg)!7C!@7T68QGN*CEWL&;lF2h>Yd^!oBYbwde;d?( z2ma~*T8%l5HCJ>R{l`gfFW@_jGNcqX#6H+(oR>z;nXNV(eMc_X6l?==kq%ijDkM|h zACV*D7oLg5 zMd2Rl^@Cf6&UDJ4kQ{k`NRGTYI9np3cVT`Vt+?2Lxs`L_JlVTFN=jgF#sMEi@w@1w z1nsHqW8SYkw|DP8eRtqH&HuDrlhZMu*p)9^V?FZu*j(v0%p+aC$(6_6bIEIcvSo98 zqQvZsmFVbb*#du_Yi_9I!xl}2Y{*-?8uEIB>MhGIg}DGZV;_|jM=R8JHt+MD?eRDN zC!!7W*LvltuDSB*gj{L=FPB_@pGyW#$&sZS(qv~`yzGRG2ww>Q>acI+>o;GQHrHJz zV?OOEdGG@iZH!Qv={E+nTimp*X|tR6C>}`rqyZZjc{nGfc_l5!E1!RzEBC$ZmbWk; z=`|@=qLVWv26LWGG4Q)WPOS&6b${b^X@B?K(*47aWcs8@k_7piAGSgcU|tV@IcycR z9o%?-7{}o#=BAv-(f0};uoU3kv7i~Y#k9eb=ar2+3S?PCf%N>sBiG;Mk~{wmT3Fi}6kZjCxhfm9w zKEYmjvwxnvX1F+_CRh0RBH+4Wr-OKTb@5fw?a>vL3 zg9DC1Hu}EvUUhnKmS$ z4F^^JVGdhWRf4{^2N?bDvp?{9eScwLk&Zp*u0^0r&Ykwc-@OmOaq)Wd@w+9b3JSfL z!{$pN`c?=zSqR?o0&=0hD7UFQc7v|z-+|ue3)KF=S?xf)lI>^(hz96ETI9T{0(`+( z0BjYtb)9(Dbm(%n!HkEupim0pVkLLkVkyQL(+^g482(+{$9pMb`Cjyw@8&yN0em(n zKihCG&Q3u61NgvwI_KW7ZmmRM-fiBkXN*xH?26o#%Y6P=TgU5teh=fb`3`-buL1aA zzQef_zy&z&I0nAVM*r)*+m=uC0Th9^IQLh(9OI__t$PZe$!8z;Zqp9)8_sNF450pj zF(|_v$Db!nTln4H%nZy|QjMR)zwdljgZ(z|HfLOC#^N%3CY|{B0-xbRuaYA8y3Bjc znKW7k{l-0%dg}U=Qs!_%eud z$~EvWuMGk4UgdHBXP?Sv+|PFN8Mgu`FT((y>T1jqLEGdH@J1!x>w!+u`L})TNxfGF zG!t-P|7wTh{tAbq6=p>jcpQ$iHaZ;52f%eeaQwu>+`kde^5B_#Hs8T_@tu4({S>VM zuK|31imOiDPl4MTJZdq1HT3V))?Ng>JOHNXgU`zVDHtclmhiLh;Aeiv-*`z>++ zYHDkn@masdfkrswST*D5XJ9Vg8nUY&d;?K{{eT*P#oLxV^EJNS2kBm94tbU-a^$x4; zYNP1&N6W!mM;Nawt|~he1m8%zW2L3d0jJWmCa;BK6@H&X^!r>2|KL#Yaxr6s^sz90 z$9V(u7YO_x?NDDi#<8Np{7?o_9`Jg`1&-49h`G8A#pOkXLt&3!dN|MHKrl;FS104fCo;;Dd^(++R|Q*rk+1CLe}Rh;b*{9X`PS@IxS;vsZmqY^$Lu({}dz zDCBIJ$0eo657>`bCj2J~w4n~9rqseW6;qm#_Q;{^?9&crWuB;+4gL<=cGOhYoCzA~ z2Ay48j(2j7zCS5ZZAJQ-=r<{bUZZa38L>wFjqNIj+^64-eV~pfT`{i9{vXQ9l>M-G z_e9~|hz(M(ZjE>`2lrw=QW(BYp9kMqG5XaF?LYHCT55xBZ0t+$C;eq-W6ZunKFkru z@|fpBzsT;5;ZnF3@4_4?f5lSCU%mu@Ge3tdmxA?cWHAU$ESoWRT`_Kq%>Dj5nf}dS3Ho}VOa+8~`;BZs>^TRyFtoJ_ zHmp;6I08B&y;OiFwnj$E0OYtl{rA61>+7$VmVf-CTy(+t(&C~E<(j`-Djndf`S`hK zWz}~>#5Et!!JLGB*t>JbQH;e`$ZI$ge$OVmV7I*)&WsBjNkA<2HN>tT?buQ7zVlA? z1K!r=Ho5)wze&4xcgfv%-z)drd!L@$-+hma|LjxA#Ta^lAI?X}BgfGGjN~MFwM!Sd z@1A?)j<&bU?S$L!fN!atv}w~;u7h8(<)1H=bI&_ZT3vF9O#kw8$%TJ27jsuic40orn0QHIyxM!r|H;N&|J`@qk=|eSk@4du$h2wG)%P%a_8j;n zL-qd&6DG>w!QaR$uf8ttzx=W!gQh%-=7TT7bS%*RV$6>^LS8wlj~qU(4`?piekp)< zv>qjpZ);YsfqyPeIPXhHNYpc9b7ua<*#9>8iK5^mS%quYPM;yg95du}(Juj+B}X8S zLTAiWKi-NJR{Y=iGX2lSzc+Piuq+xqTAcG{OCI=&a)Lflv_Beg%u6AE>$M+}8MZ*p zX=wCNyXks53VUuV{5JHl(eKJR6Z^sTn>j4o&$%?)AGR_~qTtgk-W;hh(=zztX>-G` zEz#>Y$c$+-)DLRfY5afZE_mpAUx1e1B^Kq`PvVC z!&o5Wfb>%a_JO$&{(WG4e;slZvO%{6@W<{!o)~F}@^(MuyBGZ56Zsv(hmSbUj~Up0 z;$#N!7(QvDcBI2|^iX@48v*c&|$orAzEd^ItecjE7_HMB%uHt`UP zIrw_`qqmG6DTzVw355j7&Z(1S^~m8e0_}e6?z`kSXPqS%Uwn!3K7FXn^Duqjcn9KO zKJqT+jYSRuVl-?&`H4O@&<}Nb5!&9yul@aW>`mLDZ+Kk|{ILl;nVS)%^J?ax7@xE8 zeVaaPgnS?LaSwUx@yF!(2Rg_Dx3!ULFS|@Gyx;;k_uO;kh8u2@-o5+i*fURs{_v*y zun@k=P>etQl~(&X{=W9pp6Ul0;rL$!h%)vSeaMK@DXmpOb|gTygu~xOe=&UyP4!_l z@&&)@-%mQf`ieaJEaFT5eqP>v_dWUcn<0o5EYREt`myOh^Y4T4>-*z@?VknTzjM(7 zo%=Ih$2q9d59k{0jk4R0xkoMSceR1ZPBJ!n~Kf0=+H!V54n7F4S`P-03f3+`C&>QVvhW1N2^n5DhdNgR$4S8D>0bkDQl`?Jc*AfQbKYg&wVQQ!knVIP_ zZEmJqc8gQmzv`4Vh|_&PAyuY?rNIBYL$*RkY}&TH(LOLP!uGE~`%NF%{&~>TyD^Ti zA7IZGT7Cq|74WHj=zNvFEao1Cz!sP?W~|H`KVBlHOqNAId@qB#cb6!PR{`2jpGZS} z$O3M+#bn4+&t%DyFTrP@lq%B~rAmLqGD0_|$hg_b5*85)J$F1FNJoq@&Yl`9vqPrK z9M}}>!y>eQ8F=O(>|W9{=SjY?uWP@~wfF4aBP*7zkS!ZG!H)$Q1AVnDbhZrd-CKf3 zjuaR8*59|pK9HZ?ZZ~2tPK`sc5An$v5(QYaB|~}+%aXfaa7)(_P6^$bBHLn-Ux+x! zHX9Gh51^;Th{3H73KA!L@C6v_h?T3%9L7XQWIdyEeX&=w@9X8Zzv2&5L*25!HRy$?#DyMut z$|+;kWJ{X|bL5Thz!y;ovIApmY$mpU9op}LotD39rREPI7eMwxmSt?*D0_FsNhx@X zw9k12=hWoYzyrDIntvVGe$&o|&h$}dWO-%L>H>^wKJvglGIg$7`b^7}0h3+Q9r2sj z2YKYf$sW1ko*emna<;^!A&vxH&A0*kunDo0jj)-VvuBEjb`Iu_d$%F4B5I4;u*^l+ z6TJji>=SeC=;!wq=1Yz@Px^e9EC1@7FYh7#cHIMR zdFZ1&Y4emzTHS)U?Ak0@2pPM2bCTK{%p2f(0mgJ)q0_~KIakuG=`!+@k7abPPsE9N z5N&7D)jsf!`p)6s@bR#P1R{exAoMvFH{gG5XzcyJb0coDAsYGjs|w`HA^CDsN4HFl z%a@*mTyn$hIr66~o$~x=9vL+sJg_`nqGFiGYuVq7DXy40RaOihD8ZP!J$3Ir^4qh| zmWwaCNalXsU-DqPXT~nT+vYoS&T)BV z6XHE-prxb?ue5)}C3n2!k?%KorSJ57dG7OkS-jOLyOPo+H9bWVFn`~XkfeFSadEq3 zA?(aoo_bPlzVb?G@uxq@gAYC=0|tIA!9V^esk3HSb1?WN=wqQzLw(70G-UZBEnLVE z_zD8sNT2vY^gB9oquM@!zq22V(|EuSaajd2Xq;DCwsOh^mpi4?XZi91aI!Afh2OFe z*UFNqOR{7|q?Id5+m&>*5VCU60L)9j|3U3K+8e7OJJ*KebFTs zUXm^6w#bpkKFyUr^YdkDm`lQ=G9@wD&fCCTj(srmQTBy2MSFw!G%JvskTC~-74QM) zkXCLLcz`}i*gR_cSox~7h4f$_hzG_)kh5gjbnq93uU&`n&u*~&9>gotG72OY{Om3A ziW9hqM2>EskzV=R{ciak`f&3TZVBF%D@mR#*#RB5H6Aft=oe#ub1r9cflMD(uMC4f zV3zuqc1K|j3|&)M$HPd})O>Txel{I2XYdF5sJ_^8^krjsgt(z^^U*d#`}NNFKGo@! z)!>C0z{7&ISXYzkl}Vv_^6BJ!>DJdH9bWUuh}F3=X`xHjY|fGt*nP~OX{-<7cxMdq zwet}_qi-)@{Au&E?VJPjGtI7dMjxmz%3ym$ZP}_ebiFo%#?1e2(9jCd(CWF9zomemnLBUg?m#Ztc})I&pnrz>J8`f}Y5#Nn$UG$Gfur3;Xnz}k zX@C9sdq5xd6z`U_)bu9X&;GFeTM@$!T@79iE0D+-#PWfcFs$$D@RUa`{~PQ%=(cpP zN1U(;>++8p?gRNCW9wGrRwSt}kMlyCcj;^JpTDyo_5CM)eaMH7a^|>BsGli^!nYJi z9P-8$7m%x(V~q2*9bOrNJn}VL@{wO|*{=TcAg=8&cu0c%6Q2OT0O+U~F?;%~8C#$q z7;`U5#f=Aj2MmpcqyaujpU3Ov8E{D?R+GLU1lreQuun~O1TC`6uYA!NyJ0r z>;p7?xD@_*jPF6Tb^pE+UAxD820oj*itz)CH+hk5V;fDgeP@1WgU^49|Mh^M1@;lv zk8zHSXK6fw&-8->c;BS4W90|rm@+@Yf9(00wssXALt{cZLITh zJ`ZzqZ7XHB4U{2(Vl;+r({}nA?)Sm|&F4SY#s~hfWfGrhp3iqiL+6iy&9W6XePecP zF>I)OtV?q*Wc%q?j^57U;mb!e)PK%4Hg)iKz?p!r07xi2!GV4- zcVNrrP3miGtnG>e(9mx9FY*|tS!ZlA%*$;$@wLDHE7=CNg>7o8>Av519pG#L?_=Ma zJV;Y6C+2TxUm)EC{?D}~MX+TUmtal?V|}(vH)HMpF20*>U|W3cJDCr>9>6{mZ=}7( z58!|{)5**qn9s2nvQgtRkfW4~^=PN=Eqo{6ebVC|*e~46J}@ru2!OdNV5Ei*t}CW& z3LNji|97MP2VgsBJi_va2hPj+4!(=;Vdf7F@i289^CxNlGJa1# zv0vNyEIyOZ<~y2d%1{1{&$WR$ILtBZ2cRFA^M@LM&Vd+r;u>?#M+wwRN5LP*G^d9- z5>=YNfpO=(e1^$a)aU=?2A;x=cqiXQT|pcC0YD!B=X2`QgU+iVPY|FVYM|@N04eyq z48QaN@E+dFXPm;D>t718K*A8>U`!z5*@J{4o;M=7h-Y4oKble4-+?tyIPP~ia5-*p zU|kfB3+m1u{*U$Q8+pdsb#orT|B>+&c;?stlg9wQyn%LYV~?vDXM5b4r_}*40N~5h!WXByo(#92@&SHlEfU)CEnz%#1V4NUmE$O0(ehHFkVaicse2(r`(QT^9I3MFhDc#QA_mwIkbBU&WV77 zfEs|#dC@0y?IaHHDW1W5`HU%e?sKpwT7qSpA(!yi>{^rWf~*2on;9p@(7_DlYVb-fPM zJvj|?zt(_puyqP)?`ZxTbQtwmJwToie`g*)#{szY*UxpM;p@AV8^z}_#$o5vsg8uN zq7ZY7aj>ykS05-n4Rw2d$*$IWHd^gK?F4DSg7nV5 za~v6$X8xh(1iD?i7LD;<16-R1d$k6z70?m6iOu0ltcS0k>z|sc3asy~IuC8@1v_mI z@xlHb#@wAYGuy&=3ghYYNwGEo*Usn}|I^RU*g1X890$@0`)SDrwMFXnojxu46%WED z_vIEMW^iHKjwkZZ=ku8@Cnl|?+=VK@OQS8 zcq3hqrkS^(d6b|7`p{HfVoWN*Ejuke&hP$ajfQ)9oXe*poLAOJGqn(gPN8#IHt)L=|c^+`! zL{4PJ{JFZ`IuWs_*H2V&nL zRBH)A;<>laI?+$b*^Lx3@%3L>>`hw7JN|@!%bK zT+hP1ikN8TdaOc?u2y9^CzoFuI1Z$Hz{TkQ63XfWph>Rf*%lco%aBVKG<>)W`|?Za z^T7x5@mp_8H>@Xqr^~DI=F45=&CXr$`4#E@`scRu^fGvt~}FO?6lUVQubG2+4V zIR+eK@*RC}kV#9BQ++XLEwFn{{%`mFT%3c@|Jq}q&4Gxc-Eqeqatqpa%{AA`l~-P+ zaMjgU%e7duc*Bi1$<4RiioDa?q;1>V67e=G z$&=-&#~+vb@4HX#YS#{Vv3JXT_qLY~9Uhd2AAUq0dgu{p-~N7GH+}u}Hz2R|&+^-I z&XH!#n#mJ)-6_c-K^oH|KhOtBK7%Z-#XEv350spHbl;vP`)q!+`%eExF8~xZ>{Y-I z-+wQE_`@HhRjXF$V;i*RVR;ej{oh0Vsn0(9Tm}sqjP>(BV!i!X8G~GxQKQBnCvJo= zFZRth-=Lfp|E0=CO0ZP9JPCbr^&XNGn7AB z6N38EmjeP_n30em{rdJ3_S57_`RC9!^qIMZtW7u`IjO@i&O3r8+cW?^gI=JVp>9V1 z_n_0lozB5)jwyxv&WcQtC<_xSt{v6|h z{<*e>4*X-Z{&Wx#5h?4DOO=gW9_Czd?E%+M&_<+P$MrG0fu}vNCAJ{1{1)gFu3=zJ zlBV)-1IK}5#5DtRke6q@2f2|ESi_I8rJc@sm~C&5g*)PO*xf$#qo)S<1-|~X@0^bi zs$u)UK3#*DGjr|zbEf_2fMejFhtIYB>sPIoq?yyiiT*q1%(Ub))}qi>ETZj-7{tQ% z)CQpaxBJfi5ApB2uiu!jv+o4PFo|2{HU{P^`_qAM43KlM9{Dz_M*JWm`+GplsoBY|683W4B$GqGO6 zF7;g;gpG>%cvM6<@?kN*LA=!D2%O9qu=ei&*ho)5^q|~}^;E5|y+*FP;tIJMaQ(H{ z$vt=9E3drrnv6u-S0G1}_5$;FnSZ<%I_G4^Ky|>6qlI%2u3OU@9)|zni(#MWUqHXv z*MHmnXIy29!M*k!vX1?xUgnxY$`91SlBl(7kW-9xD2QjeTy^>490UKHl|VY!1v@MP zvVFpWr802h6d5#nqSWkq2KH-`^>)o8IY*54!?1X*mvqo^*>~1sSkoRRU;QI6xylmzuWEB zF{sOPu0IAQXCx8y7rrA|`i{<&*T2k`SH8%WfwMAXO=3K9Pj>k7+KjDe^5}oc7-;`t zdnX__i@pNt7p(WR^*{QL`K$Wfto|q3eW!n(erCuxu7O3)2Jp_lbBYnRmrV&){TX8? z`H#WL(t)v+sSip26UK}~4I8YDfbM6zX=l@4W90&X?9opf{|C{3D>gy@JaDgTIpLGo zdUu)Nz zdJZO6-k%OA7mYl~fX{C$)-SYamkr&PDc9WRltsvojEYN;u3u!z>?q{_g9f%D2XEEZ zIOKbyHq}Xt!7A7kiJ`kfmxeD`kxH@IS*r63jFCD3w*4;#`?5x#=we6fghMx zL_0N@YcmnlDvk`VYfR*W4Z%YGaoBR~I4`n>zDY=S&4giJKC_Y;mmW`>NPoGG{8 zl`U`g%9gFjag9q&k{(}Y$}r@9PurL#L#C$54?!u&f!*m_vuJpMv|#99J!pXIIHmx{ zGttj!m4bk}`$AI{s78ERdvobX=TzZWhJNkZ=P!g&i& zqkaYI*e8ew@;w#y+yd0a8}`{}@-^10j2k>ia`5cHd^P_upj@OpFm#XwpAl=@MDNOw zo#2OUndvfnQwD0wXG^=zx$@4BZke(%T_WPJrpV?6e|f<5AZ85a!7f+`-&hLQ&Vj#+ zc42+qvK2A~IHP@}YwJSi$YIEP`j6?Gr#z$W)6?8d zpBEtaF$&+Wg>97%+n3)N+}Ar(9)N$y3-!hTc2asymh8;Tl9?NGPWl)ZUCa24mB-F-*%wc|H;24Bseb}5SL6Q#J)~j>7jp{=?gn8pS;4BDu zXT8JqE5oc<1O3a?`Lx{{@4v=jxgIqhHS$^eHZa$RR zwSJc}Va?igvJx_ha~rOsr*3CmgEGkK{gClt3l?E-f+^xcZYJl|w0XHkS@ZI(yl^A; z4ej%+h5%_J8@a>G#cU`?r5>J5UmH1-7c$&=vTjE{YVPIB2-Lfpv)UsA$GPQs)Q(<} z=#;M}x@6X-9C;mm4vN9~^K7~BuTJSX)g^1UVUGmJLw_Fv^WN92St}dBi*EXR;YU?J zFJ(OJJFd;y2YaFbeqZ_)I4%c4bAkL%8>iu;7W+RyrZG<$bEQ-1Z{W48c{XQRflQuT zARD4kPdVFz@o>xQ==<=Mxti<$!dD)d5apJ?Loaq4?~%@5U`;@)92pgnEjyE~b+;y0 zo9lVV4{Oo?&C^1}1^Mq(Wgd_PM8ZF*x$haneUy2nrpeBgM9dQa-n|{GCcC=i@7pzjaNP$?U74waZ8tp zsKNbhzH|-AmDU|| zXMz@Dpqt&035LfqlFkHUj6` zT8{uRFv@23(}n)K;YXmKZ^1WT%MLasIL$wEL za$I-$gMMcV=Pef?)QJlmfK$N$mp~JnUjWfaZ~c;-WT%ZJFHQR zjLAa1M)(yW%d~bY;-tG0QPaU*2Sj*{K47ek>l_a` z?Ku$q8TL90qYJG(E3m&A0M@MEi&&q*r8%?j%y~R|V83_}znusFTw~*8?%_Gxi`s|S zb6^_Q9t{a9lz+aQE9ab>C1;$QEmvbr;f?>um9IDF%lbmMtWU~8jasa+4Z_|HGqK(o z^F_{|jW3CD2HJ=b;SunQt%jc<(pRH|_A+gx`N1KQ4*!?N05ET%USJLZW384Rz#I^C z4!h5q|5&je&INr3)BqT(U9xDg z$^d^{2Y%+B7D?cB+63eU>V!O;UAwWi6!l2o8{n0zZg$I=XJ<+CGqdHv9=S3XYhre} zv#|#jYFcBi5DS|$0q^6w6@NOQUhrR6XYA#*uoKr~pA5!>^Hv}Rg8rjUlobOg<9Y_$ z2ZFph^pw6I`hYC|m(}&UzqPh66m}EkrsW65-cXRuYr<9^XDbKxpZ_cW+x^EDkS_>5KE^v3K(1)h}|T)ipWtXwO_(;Lep*@mQ<9*eStFu|_o&d)R>I zOr0A;2Mvt@*KV&0#oA%pMhb`l`S1@JX#8LFeOvy|x}MknWX1t>!!g*k18bC_kBlFn zp?>>+mzq-`iz3kH&_bC!zfd+{En*gUqX2qg)3$thraSx&po^(td2-zyZg~>xTfYfK zeORnl-5aOykG+;FtFt_k>7tK4v%z?i{}>oLppM)QTbc90Z0rNYn(yiZbLLn+FqQw% zf7R8==zmL`iF*Te@sCEvfO->qW=Qn5?UI?1c|!eXXn;1cPZxq0Jm`0FZh@?hDU|UG zi{$a=bLHm8vHmo*NH&2cx(z|?g2Y_(A8QG-ta>C3#oQVi1JXdmsx`X55_zAsk{DlA zUjXOAmLFt@9IbHFq7EMqdkos(To?Ze90Sq-pd4%7cE;?)TCm(xn=7H;F2HuICk|a( zD5Gc>E-sXKM$ZqAf}Dd>05!a~^gg;*0_0ND;* zfbaPmX(MW zH)8-z*KqzrK>z6@NX44rV$hUndt+zXPX-t>AT)L@zb7qloixGJ@ix9i7seq6w9wQT zu>T40UG9gy#uyHLKW5H@exr-E{iO0R;-2-_xSBDrX`p`oOF;h*94JNH$K%s|>>qt5 z)P=MeS(jed!Gce?k6xJ#1@H$DmnZVC@b^6g_^|e%zk6{m!PxA_c<;yD!|Y+n`rfoZ z8G~@SEIHxKampUFgYjC8_0#WV$veufE$9mSX1aUa+3r8(;iCX6{|O)b4}?l|4V398 zZA99K70BUZj>Iv{G5K!Bn)HnS51_3RQTJ~=Kz###bYG7i(4Rg04f8h6UviPxS+D^* z46!HjGHv)ub3++);FP!fsu-+2&v-a8UH+2^J&c3iuD(jEyxZfA{HFf!K{++i! zbB?5Yd*Ru9K4gjVm+~0j3$Q*{Nd?AcIrdlh>|@k#88N)!HPH5WurB%@(1;7RtMT#B zpQHJbm>V)*tj?$Fhg++UR$EM)?C;R`N;I3feC(57PaFTp>i|~%BSsIO8$W9Cb7Swv z_nDY0asBZ~j{#lATx;#W=CMGY5zlsC(MRI= zc(B?YgvPTkjd!?#UwA#>V!#r>iI0Hyvu*UJL}AVzI%9^_cl52PzUyz~0gMsj8`^){ zhSl1+#6RXRS+SQBk8 zeEQ5`V;-aWFtU*^y_bGG$aKqwx9G0%Rkf-H7jxJ4gduGwk2D6MhEnOVD4&FqkLLedV;q8A-p4kuEgji5w(*xd z@E#)*XiN16n!gcly%1G9kp)8>7&V5K|zmqR$6R}1G=hl^&v(Ub!ua!2mJ#V9J z!)Nl@djC-^km62M^D{ zi@}rLcz+!p4PJR6E;D#%ornPdj;yav1U~&5bt3rMU+X}Jjov;7{B#qbJ$S1V&Tr$l z$$%(8E`T*(jzYh|$W(jZU*YmIG_d}5)V`MY@LoRSZT!{==k|b`0OtUHRlWRcjpu*E zd+f1q28>+;cm=}tbDSpu;sGT9IBV3P0^0o1j5|;LP};z4#{k^NjPJm^^qqJ&+VCIN z)cJ21^Z&^lLHr`E6!-@`a>22P7%Gr^ct|F7jQ2*AHTJ@~Hs z&*gwcJ_h#z??k&8doD&>H^V>p9_EIvkD={y@X-GWT>M&{z#wD3fxXCTj$MK}DqY|Y zoeU_#xYCwZpZp2W0k|PO_~_t25dt>u{priUEq-x=TFiBdFt?wKa~HrRfdAiKXo85U zt5A2TO5?W|1K+&>kr>az7&o0ansY7wZwSoqJmcOvAkFyEgX)BzLIeJ|$7jX6i3izj zq+eXyfw^v7oUGz7)>uZux8DoDU5uK7r(;gs#7O+V^%HQZ_0?)BtF8jSe2Otj!*>C9{BP*slxe^p_k0d%inup;=X>GjP~Q$? zrHIqA_6vQReoz5_UmD=kV@JxasyJlN0bCy)>t^S#}hGT z#`(F{MFC@K#`w6i{>J#YeGl1K)|T{-~Si9;sE^iSY<_LoHqiO6|A*t@eRh2 zyu(}o_z|mgOj%>j0_Hn41m<@gf83|fARpTPR??N~4bXt%pEiMw+eXzvgSfZx&h{#g z<6USQ^HLbcqJNt?X^iXC0czY~?X3kR=KG4ul9G*p&ZxQeTfqN$!~@UV*Y^zQ!`qN= zJO|@6m6H~(RW2e2MDdIGD97@s%`3h!#TXstIPuK!^#lFR{*Bj@$Cy*Z z=keJpkHM$9P6RSr*9y>f15c|hS4%e`z#r%4v#sxG->FU_&vVTP=!~@__&&CUYmv&Z zF7Y7pTeOZR^17JY#5h0eEpSgkAMk&C&-{nd%nXf(GY<~;SAsS|kK}pURus4#sMYY_ zgzDqk3Y>G!dlqc4=OOnqf%_Vj(a?=Le&m~?mWwD+e?<0MHCTh^fOg!`XvK;4G z2Q$--8`uAaFSM>~RYgnK_5Cs4rB$$tslO>NSxc94Qu)U1_TiYd(+(=%*kg&cf?Nm9 zeHNMT&v9jqxf0X|*k=Pj>-YF=Kd#xIjB&)88m^5}S^@n~&Zo}U zIfn0{FUa?*>%sSwDcW|(Z|1R(kJ(1zkvL`TRMtUb{V%RlDB9#-Hx{)GSl?h%r2fX= zxsGkmcGSLQP84Y*E>`IQYkW%~H~N=mWV8hQH=tbG2z*n|6RyJNxxjrnaZkHgaSz!{ z{wALi-@fr9eu-1?gz^o>g86}3e|H;e@Y?l(F*b*3xuAoq01m?c z_M;XyKF04B;64iazDDP8m={t0k_U+gj@^F9N|lq8k>nZRPVow!&@m*Ra2&(eTXlMn zJ8q39#}s1*;8{Q8H(tkD%37P*@D*^vec&itxmJue7wzz)kU`W#*4)6Nf#Y#+`EzKe zaz0W4dy;aCvV`(paSvHUo+bUU&BPAUw!|&PJGcL@ML+aBb$v6~P#rLq$;vyNACq?| zH+AgtbnNy+u2VmfSCxlB_l1gUj2&>wT9O=(e5`Y3y-(J}<{nT@0k7k_Xzu-|G(lR} z41R)K;NIBO3n~Yw3t$@(pPa9gK8-y`Xr*5IH@!@_GYGs4| z*lxB%+ev(*CM0Wmuy!xkJ=6nyr!}tmJJz%-O{@extX`?~Qy78T-;@VvKV>4?pA6mD zK@OHTEBEC7uc8AV?rUp1L4VSJtNu_OKkyFcbF|0Fe;hmNaK-(WO%~q4GdgzYyES&; z7x0Yo3&uvr5aZv#b}Mi#B_}-yXKr;2bq;a{*kp z&H4pC;Q#oZ!1VyUUi+~eHP%7vT2~#qfwlr^fVvUyO*@pG*+~u@Zg#}w`d>izlh8#x= zP#2x!XM>I(`O6+dKEsS5>xHnMJL!!!BpRlp<<9c%bN`ZepZ%wN`24@+^DdobaM!nG z9QJlzg#GL{jTt2|6UR&Z)X9>GJ)d(y2YCSQ0nPO=N)zad)eq1CX_;#zK*!W4qycR| z^TyNDa-e^ns4hKn+Og8cYd-%P#9{azljly5`%aCqa87OTPhW|x`>A*7{~-QLz&m@W zGpR3O2NjZEAurv)UlztCeeP^Yo;_0%P#0zwYU9LB3zk>_&+!=hM0}Ty-?c{mf;n0f zfMZCS;20|1K=zUb@?mpPFO%MA3-JA%r_+w(9F)ARzGL8D?Lp!kK)-VyaJ~t(Iwy?! zQM$j|RUYs7h}_<~wOoJo)p9v%oL-E&>8x}58|;C7+G(dLG{^b$=FR1d(@&SPQ2+Ed zXPu=rV6XnmU*w^-w@J5W{vqQ&{z#S&`9_jLf+QC-z}im==mTk5*T`X=H|rc28YteP z`#>05#(Bi!?sVYrv1Vljg}(->k9&vW9=1Mk-vN+D--+VC8vb?8o#-dUm~veo?f%0U z?^29s9&~X6>i=$<9V#m)O+xLP5fTDk8b4rwjOf!xhJOBq4F0s2^#2&V^-&M`vinE! z`3D~=e9`?w>GNR^>EENLeA}y+jOyK6W(*!I;p4_g7U+RB#FP$fc}h8;b(0{UDFbL{ z(iWsYfj%S7<>v(}7ufYAY#9hj$nA=)NpF2MaN4nZbN z1zo=O$}95plTS*gN3cJ`z4yu;ZQIJtsAGK<>M>o~qJ{k7!VBd*)O0@k%rkYbhLgp8 z;C1JLejdQS3!!~`i)#+{ngtCQouG1nx&U&Fa|2_`aL#GZXOdvc+`2C(`qv` zdEwvxmZzS0LLPqbLAmFyyX3Z8Z}eaw75h; z-7k+n{v^hPjtLF&W}9O zQTOEO3cRI42B;lq%YXXW=%3+yoqho7f5ws+7tmNEd_jy!(FTady6)Gybb)SqN*?Rj zQJ#c;dZo*&`kv1}>y15ZzSBK$CQh6zQ>O;Yv}rSRKbslYr^LYY>DG54A=6O5b*fB2 zeLL=(^WAsDWx#+z+HTU!OD}Z+O*|r3!KOI(-1FpojL(lByeCfBGOQDzGyt2>=m8@G z=qKa+^FVs4`qMDCItu?<|H^}h&Z^kI{}-VFpjQ1mIKKcW1=JmW_|M78lDFP`Q|%(| zdC&rK^4e>!1>LuUp6?``J9kF^d&-a@LnSykME3-kJ9mN1pT7`$-Yk+ui-SRZ_&5j9U z)fO;%fb*JM_&a>I4CaHRW!-ZQeW70!`6H#6%e){}$C^Q({p>UVWE1~w0hx7(w?7&D zLj;t;-X92C-s~MU3AWVIrORZ?maVAi$GX4U0M?oR6IkOdI+}I9c4&QE);cnEzgP#) z)WT!ETvJD!bpcs7(bSPHK-p88+%CJwH?aB~F(uTc-Fn`24xfqzmqeLR$Fx>u==UuH9sO-@apNO1Jn*M{fSZ^U^_22m{&YY(X^I9|Pn`QJj2SyYW{nyx zF4)fWE7JDUxgT|ZrWFV9;lISr4}c$lc3?I1fHNgU20=~_95`5U&N}?W|1U)YMrO>L zHxF_QdjvwqEgCUGYvCF@K=ql<1yBcg!#ee6ke<2U8s>qTbHuqUa$Q2J%F8dT`k80| zh$im27P|+a0&x7{hkyG2mXlW?n^||<)b}%chp^V6*-wZxVDQfxpk}`@|GIYu|2&_J z9AHiTkdPS?GIF$JLH`%px_=*P&rn`6W=sE{%75e^&<9kPFNAy)j3M{%oP&M6zWsKX z>KWFcH~aMbQZ!)n3FW~k=&}L5zmn}!CRuubHFKZ?Jhl!n_6+9%%rT)~o$(ds8$ypU z&$!2tW7VgD4t@%|`|bgviF?9rfE+->hd=%?4~zz%PMtax^$qLScr-K+C=Y&48X*2B zVc&o`kf(0U{TL@y-H)+i-05Jp9Ses2r+G%80qOxC&?kidm%|nrVDrD(tLoRF0n!2G z0Chp|kYSPoTTuN%wjEe+J{v6-&KsYe7 z`wfsjyJ5uJ-}>R7K0r6>n~jA0%EaCXW)G=AIq-ARfWJ*Z8({R0VHympz}PtbSvsF_BBq6U6F&UIjzx~`Y{cMy^Pj9W0q%+amw{#0dT9Lc$3H%ofQN{G z%5&}+!@7?CwH<$|90;@v{p|tL0C}Htfth2+OXdRXB|zUP=FG*L5kGJTV2xP|8u0Z*~BANNZs45A63f_B;Jid6II#$bw(e9-s`EGiMI=4ec*0QCrVr z`-QDJ?PB$5Gv9%6LFPvJVw%up>dOND!T$#l$9@@m-2No?2eK*mF9U3B6!A9RjsJ)C zANl_fY^g~TCP-vtq}I5k3^)}U@Ye@{Heq8l!1=`j%+02bpC~)9AE{+8EkXPwO!rG; z{6}Q~X#g^lacIrG1TD}etjjyI_N}C!aL>*ivJU>tPe1A@^gVEX|7+0z=b3|He}oK$ z4!}IX=hK8uqjHVDK=g?@G^U;sW7?YUe3-e;h+|b%Z3J8fI3*geaZmhz2*5JjMvg}C ze-!VZiCW!DVF$8~CF|S%(lihjwn{>#1k1*d;JP^z{eLP0Y~ML@$T)8Y~+Bi zB?&Q46BnXSQ}Mrnb`5;Nm;+FrF`lJ44W+0nRfqp$zFAa@6LvF!Oukld=CAGUqkLh2Tk_vfz2ETL(}wWGOtDb+3;JbKchbWF(0o=#GL#p zSqZw!$AXdekWFo0Y4zeYuZhLo{IQ zLfV6YHepjVKs`X{l45sCnt1<6-%Sdv>5p#$ORw`&=;Wjb&;S0;Foz7 z3j9onL_PxKDsxiuR;`pV*ce~*xb6{4>5uh7UEAh3pDg}a6Edwq%m>Q+0Nit} z41&SfYi^ee8#)xcpDiwzOJ%^%O#_qz^#3h_?>HKAI(ue_WGnus>%7V5J5d_2@+s&; zXAUmoshXP$|A6M_f;KdF5V=SxpqsCe@6iJJ9mKuC|C3KXEn~)v_wC#IOVR-G&;4=- zVjj30d{o~LXvH)G@y~T<%xMe2KXcmCAe%3SoIY9nllPnS^^nI^?(+-DUJs&l)sRIb7LIaKYiTr(qk+Auf0{>|=I?Z04joF0%sV-Qs zV4=pFW_|a)`T}VKsysvc8PjHdD07-Lrw#mHLEi;@Koi+g}@kJL}dvE#W@-Rkw%Pp;? zH+*u$i9h~-NgALpaQN^aW#Zs(t^Ke3@edhB-L;qa$6S^1Y=8VSm(36Vw9O)cvr7OC z(g2W6+!MM04g=~AgZBWQr>~#6erAn5&sf%7C9L2Y4Ut zjgg2&aPKS4ZKEz*4*vJyA3k6k|Em9O{%-*Phas=KPzM09$I$@41F)_g>)q8qi2nfG z8(D91<#ioRg_Sp5gL4UT=!Op)hP}(?3HMJh`>Go{2-F2;en@*T&?an(2B-@*Y>1G_ z7^e@Af7|UJPfE{c|0TUUzbIe5(pkR1`6K-QI`*f3y8XTK@a=8o&Kqx(>#w+6{`{vu z!oK^R=5U^mSoLp_r@%eyDeno)*SYMnR>(D zJaN~Z((!M%ONTbC<*u7=lD5}fD>q;HSGl&;W%5_#Z(VlDCDP)Le~>@IzW*I^c+WlO z961}jPgzgAGk5E*yY7(>KIoyj8!J|<1f5xXb^ls4K>nXNak31CA24N><!ebF=pbelN`hjfXz8T;>0GQoAY}}Lg36%HN8W}4;Uh#d{)a5XB zPOS40$f3!={gAK4t%T$icbdioYV?^ij>}8ang`nK?65 z<$ZW~xDWr_uic*pj4Wu(Cj6hy;ZMn)k>}+Tz-Yz zfV{$c?z&r^{nvByA##WMLDn(`&zvO2l9*3GApRSpfwgPb`fP%qlLmG63sx)AH1oRaL$^qiHDSt744-O8I{*eFivu0ZBT9(^u8tDIp zFO%!S)c@D8|F>R^3-CU1OB@r|f&AYW-&F!ACoJ6K%(=bF{0bZQx}MLj-+-J0=AIpa ztB^S~WV5SIbx=)~3ioz_hVr zq#JTUxu+y`0Br!miD)3uE;O-Ye_23ZvA-^eLmV_ZHA&W|q)2dNntV1XNB;GxTVCq# zlHRkkBq%mjmZm4lnuJ){yfa3&BOfRl`4j#zWP^W`Q}|2MfXO9lOb%H1p9cO1{^6Ta zzZLvdngfW0iDlwiZ2+8!f7Y;OU2C7rSDzl{_FD4@_Py4>fK8`s z;KARDci@}(XUsw3x;m~&Ae17VN@FS+s%=y+c>3d`z(3z@l3hz;S9OH1_~mWh@^CP$L^8~C<=mr)OpXD-N9uqD#rc4zu*6T=ks}(9d>qi zX1?b+ea?g9BjGP<=P~{qq$85~q~lS1iRL|FPclc)yF<|LhUvqCu_(&1ru9iPv1i9+ z^#ATa{KL^t&*I+@8X)Z1AubC(DI(Z~lPkmg*1<6*(tG#E0K1G+a;!9FknyfNR) z8`q7rw2OrW>Phg|xKuEGod{17qrn~droS+!kj*O;r2&=~)F%tRMFS)UepD8GjRtD@ zKjI(l@Q8_1P`?n${h=BF%4c9|0TB<%Wn*gDkViAM%;bl|`OD1XY5_kNng1V!n6vm( z|NL6sUpx2Fk3-+Z@_qV^+Wr?f#|8a6zQoH(9?_s&>m-b)oYv8X-5b_J2+prO^Z{j{ z9zdfZG{E`^>*E6~4aB0aCo^#{DH6a%KP#*}14u@Ah zQ80043e3<Y2QyFl`D;>5!=7Mn)5AJ5AfNNqb1fXsZ5*-0otzx0) zKn@&pOaYg~NL-&e6arBXU~`L!5BLjZ0nLAQd`%ztQ9i)xg(L?=WkG$m0oetF|E*i* zppWxE6?IptnP=t~<|$7pLy-&d2CoxeNcL)~bOJEKH)mJcm9B|H4-wGNo7_-(| zyA}>&EoC&?WiZep6@2{QvEdF(|rz6qfwR*SxR1FgHh3)#xR1p6M=tg(BmV>CAqx5(33|6s95v zYLWy)Dj8IEX26}~6!1!jfgrLEP!??56%R8sQsGf_Jh;b1f*-~w1A{|w1cN^gAAH7S zA9&+)_7&p=;(Xv|Xh0A@`Vu>0`2d?oBI+X`y?|;5sh%kluZwj3_n5y(^N;#U*48oN z+-LGWFz<`{l~LS}iOsRt|8wpW{5#Jm=Nq=Wu5GT?4>3izTP5P~*Bcw8jtpH6_Gleu6Sm>5A;SE z>WliSFZv36&^C0%d`kN_k?=AI?L?vh5xby1ov@R8Ru{X%gr(VqH@QVu)KeWs5M`s7%>kD2>I-jCP{{5gbp-Hq}(1?yy? zU$_?k$|`1UbHe_PwGCLCTY?3~Aa3GyTtgZ#J9QdNjgG?w14DR-@tvT1cOc=B9VDQA z5@2}?>`s}$al~AA(^QqV}PXsb5E%kLs5MIp2c*MP#!vxj3S8zyA483c&^(H<3nYW9S6) z1tA7&wCo-{g!`C(c9)?63$Q>wWR5g&>*6K2aqc`^#`@iJNA_bKuNK6E$7fG;oYZ^?M&xKuj zsqh@-LI~=r;h66ohVv%`alYf60Dp~0g(J_=Kb4*gHercia61K-?Mj8^+tc9CnFP51 z1a(8ySp(2EVEqF>Lj$A-*xEk89G){^fIi$SSkLqL`VH{7Zwt;iE@N&7zk(Fyn0RY3F+X}K^-``e?J)S z-3!OHwBQ)hfWeOKV1zjq;W&Q^&@b^d?AiZ|>V);_0}Y`8;sc>EsPBa*LJ-<`;faWS zd>n+LZz=#~fNv`L0OONj)T|VkbtDrs%(Gzju5?h>=D?W;iSXDj3cOGr1V)ffAkYg* zCuIEtKS~4l?>_+JV<*7+>^TTSKAHB^3Ht=TuI=BzN15b;xhuyEj$@4Z@;_*RY5%&*`xf zJjPg>6V~I01fs5wJp2RNm$cq7t!Yc^`M!Vu9ukmO*dk4z*VV;-Xa~UrYv)gB?SbPM zbFsIyfL!GJ4P7JtTQtC_CuYFvgshK%;R9H69E0*P66ItV_GAu7M*WbJ1P%!)VDdN( zHlIj^ZvB%%whagVoRkUcFJ*v5TngB86W~d5EV!X=<%=pZ^T z&(3|?e|vk6ZrH+Q&x?It|Aa+S&3uEqZ)<{BgZ)a#i1XG|{wod2J)urDssz%#T9 zDF49H(u&~&6ra9@@#(jCpUip)#QV{X7Vv)Z^?lL#DMnj6{~M0KU_D&se8eAVC=unO zyQ>Gh@$!bO%q)0^c3?v=BVIsxo;2TS&*Xd{k7&qezjlr|4b=JxIb29Zd610xB=I<+ zP#+FWPXj-Eeb=1_I+u7bdutZ7>coLgz0+XtB@R4C9`BQugy$rH&Ff@P9+3j)UZsHx zCjp!S<6+vO6p(6^0uwg#;8HpV?D79E(Qoi79Cd=QaPUW;i>RMSJZ{MPiD*x~YOY|N zK!By7c9+GUYEY=Ygz4vsdIr@XGWtCFa42?OfcNnb`G!8$oRZ#8doPSrlby#5)c>f? zSCHq4Jb-$Zu)3d!&0ov=zd!#mIK=3IjJzP9L0T#Y-gv%&kYK^wug`A(8ead#|3ztl zi?L%4j$|AO>0F4-;6fPk8m|N{Tzr%P>vc0=)xJ#FelinA%ua`v?bG0h4HrBzQW5uL za0*R@f*#tQMMQe}0MgxRD^*gdepBc%1(HbPCe-rx5 zs2-iELq!=tadYAWMQFQFEQjil3y?0d@b}*0?=n8WDD?YbEb{~L3+nfS{DA5CgtkA$ zWd$~XFyj$LMK~*9ZX#^ z+8-20e~Ug}it!74{=rPVmDWvQVm>$@sHZy9yN2Wd=3Y}iwy5u~fi!?DfVhBw6iP6D z7#$UZ`TGAs_@lqWCp-s?uOQ}ov(ZPF17_A);2DwuNf{^)P!=SkK9Gp`JG|jRJB$Ho z7-oQLE*F9`Q{jv?7y67yhbv)Rc%G96Zk!a*yT*Z@!_r`$P6jO6n+ZG5abf&I!ao^W zDIwo?%wS^3OzaTx7p*^LYfr`X0g?wa{~x36Y=?Qf35Y-S@~f@gBN>1`^4eamei$o9 zTadvQX@S-U60CP3TtCL=4HILb_$pJgjPFyuH|1TB-cZ}a5c%{MKY*AVK%V}cO#r-b z{^PpUkerkXDajb;#qa%3nEzQhS#ZrF8}v>1@YFpE!V)rpla0AVC<{m*;BZkN#F2=4 z)X{U9(BV%G9C6474?g0Lc<(!r25q`>;aE^6oJXFZYn1`hR-`lkTXi-AZiS_R9rC-0 z%gBG61d6>lpz|DUT24F!BJT~w{NhmJ0T{<5J`jv{;n!$@=Ko`y|4tSbkbv?(73h|7hkjfz^5w&e{B(Hpjtkq5b3hVx`;i)1FhwT^)K6u> z!8@6tteOcs?xP-2$bo~l>7dY=@K1z4Q8&CC!3DSEI3{jLd8Hv3cMC!~2tt`0jJg}i z0#+V~@&ShbJE1Sv$_f$*e_=g3)6bK75(wo0vpxaV@G!gpW2n>%pO3Zy9a9}L8%G!H zh3ApnKwdy{fmzcAyGlF1*hIGY;AaOEO`JX*%q2&4%tH1+t&`|F{)ga6mo53;o9dsCNb8@I}9% zcVra!BR?R0fbCHyP6PhvBX@f83|uhokz`{f#GmTX1w9FvzRpAg)RzKf0r7$aJbr0* z0sO7ZfrtMiJ(0=vq}Re@T33eR?8GxDzl!Z;D(nHx_=lLa43Gz~xqsh_0SmGJ(#Mym z0BNAQs*2$O@85rbT(P+Qw{ZENe2-`#9ch4r{=yXG2MIap5W>%Z>6il|(<~JRspY`5 z-8r!ROb(bn%z&Ze(iq;}tbHmBS)B>XEOX&+wM=N+p9`&fBKDF3-M>YLR5;|A4ldjz z@J>y@*kC-^`Xr*AkqU-p$pU>)SZ^Xu10)kj2Y8D1pR3JnNV;u_HR(8nJqgl;G(dIS zREHdY|1R7*qyy7Njf9?EIx{tiM!0SW#n7qOAG4kb>I}?!C`2m^4PY-D%Kb#Wf%PFV zvA{g+|Mx*)4+`?X#CSmc^PjLMAK;fw$OB40m7*0m2(g6p1dy_19amEDJ&z%EG9Xm3$XS8kzCgd|Uske_FX4bh8UEhYO`$8HZdBF66 zr`|u9gT?g!LmT%K`dO(KN2LE3%78CE!LQf?gnjxK@P)6C2C#1!6ro)~vAh2S9gw99 z!k&jZ0AU}(%LW@aKI}P}4Qmhb;Q;P8>1KnRd@{r9)h%+s=6yD}B5w%ba^cJ^9t=c2 zFD+dcccOvTUD9B&ZaSR7{6TFC9;`aRgSGp4V0bwlk)$O2cTX;aRl-oGX0+zTR@-(*7}5zpR@5@F{}xD z!5R*tZwPt7XS63t2l!9IKOON8iOYhk_j6&xz8u)Fmk$@Ma=;}Z8=^C^!80-wI(8Dw z^NvG!a4>`q_Y2V$KpF@}f8nzL%niNHgGC$DVdTtoXod1%^x90&ypaVOCRwm(OFHZ} zNQavb(JzEKLJ_C~M4`6|)-??Z3 z%tBtT+#PGr+qSFiIl%TCkj8aks8@a)tVzDCwM)?VvA(q+P!2GDWV8pE`d_pMDJP%J z1EfCI;`QI8*D<5693bqeCj6huA)Z%(JmBNUk6+E*Vdv!k)IJO6eJVE_&Rx!iJ%@AP z!Am|wCTBq!(nJP7o8b%bXeX@QktyWs$)Kdd1MT1(xQjI4jIzL+&jTOy`M9Cq;PR_X z=s$`BLl$MjyuDeVdpRAR_@-jMP!hzTFD@2yN1|h6nH+Pb-UxXBLjxF(ixA@jqBP)( z@meRxr=W{#gDq86fw^Nw!$hn_9^S7n^y}6Qx^==eL)x@~md%?pYX=eT-MV$hH6mui zX6*mHe*GrcwQfBGn`8f9!e6)+1QSOf9|G!!Obrm~0pv5F8W2VgBwMgRR0d$3HpX>4Bx_SNc}`uc6qJADLpvBu^+8{AYOz7x9fr$cEGmfgDIjnqce! zq5&M~s0%o_WI`9T0T|hidR;fwblBmY2R93I;7)E9n0jZywzHYALOTa~4dj8!+AO%8 zlmY(SRHUawh{ar@ILsf3i;oAYF<|OWkq)8||41BRG>{*JAq|8JbpgVkrGen!5X|>; zXL9D&%$W^ShYo?!fAxofy?Ozy1JXtu-V}S9eeogI_Wz)MX3lIMcUT03T-Rc{GCaqjbQq$2(adD-BHy5X!9XbTAKI))cW zr9j6K8L<3rE}Y`!!u|3rSaUWD{+^QwcTj)w<)uOt#^T~Ik0cIxKrGThH15Ok*@mPh zf`3W^IQk{Qd7BitVw(yAVB^Ou{*+g2i}Am!NCP3b?jhG!5JwQK2Sk2kk^yWF2sp`> zgx0nE;tLY4ZCoiL0|wChWP0IpIz=K`iP49!WWH_8}iu?Bhe>7xIX!% zKwsS`FNpNOhWdgi*PDFDpYStfcr8>nO1Y{DXe*t;d{IZFd7`IZjV&|SBi@PV0|-dZ z21m5_kDBGesvSA7*C-b(9^?PsWWz?SOlZ?iU=uKWKu8DV4{X(g11UGS}*rNj>i zYZ~-AC`eF$E}log;!nBdqz~M@X!a$RY%g37>M7~~=nJ5FJF)|*7K~Zf2IpC=4p{ol zm>^sKC4s*T0ktE`d1^o0bh+j2H7z-;2k%!S#FDFk&nRnzaW{C}ix zt+>CK=z#FAj|PYzyn5w=xnwuM%fkGN9Y8t&#gZ925c5efpNv`8G%Zz_7r@#8f|>xP z4jAV!`G7?HK!iDAPh$;^VjN%HL}`HdfVlon$E4pApD05gH07jIEh^J12LDGj#39Jz zE}lCNFVR2xtMi|9z&P~ppTYUQ8+|^v?&Uyed=BObAny1c#fezGfNTW%Ul95Yj+uEu23HxBtz@oJm|YH8y20{4EaZ2dQ~km_w2c=k2p# z;_@tzYw=GykVD#-aUA^&**WkCV~E};3nGMiA=w2??J?N}!V!&hKz;&N7Kq9NaeaV% zg)9#sIuMN=)<*-x101mS!Upw#c&s5{dcca!e9}7_a{@?2ADwGH1j9&N&v87Q?cvB7{`kcw{DCh?%SWBDf4~XZuySTuW zOJ?AO{;}WTSIk0uDK~&{XEA5@wYcLsH1|_*BqH{)Xd8GX=D@92*|6?N9!y%41{w1MnxT33JgNKu7SHdIL3lL%o1} zL^K%LLa#~AAitsbGeZMN6GVfbasI!;nur^i&m4ej0R9gAS*%6(Ebe3ra&XS4AbljD zju?f*0eOYNjU3o`m=9Y~W?a0Tjdpw%T)LYHe_$MN&Vd{lk9`DMW8NsyL8HdWFdlOY z&!uL=(>xy9hnQ!KvLGCvb0{YnT(Gv(>=EXWy-I};tTiDY0rjI0?@c7G6SDSUL-~Lg z+Jd(&ZQ#vq#Glpw*jzHgpUEfxGXE(K^bP)xL7|!>h!=xB{XxKK)b0P)a4KNzNd|wU z2WF2nKy)CW0Rb;4##l1R{oCl{ia;L7v%LJrRLWV8tgb01DNSh?iF zPW^1qME{S$g&cV3oCOgmGdQ`JSBNoVM;9J+!JN;-E;!fGjxfdi-$`?M(1dsb@`0)Q zF#jks8=O!UICC*K0CR&4uBOAPoji;SW`I57ABp&j>jR?wseXk9$R4>3`>J9kg8{$qrg*r4KOqJr73R&<67b_w!*L`T?%k=7LW|Hs%YWPJlK6lSf4K zf}e5q&49L@F~)l<8{CVsArxuCD?S4boJPB`LkcvOPl46fvq0Yy^Nder!(z-a(mI|2 z_g-MlK?KPJ@)rwq!XN2f+)zG1zJW&$PT*{VxrA72&GrBltZVKLw5~N{|6v@M{4A6c z%EW=|xBt8mr{?wGPx63zgCdweu@Maj^-Izd8CnqX04ywmY|PboinWep`=_O*F}mZg z&Uewz6P{ryIbiWD2lio};QIZ!plysi-z5j)FlLm7?~@%s{DGAb%pPMV-eFnL9dpL! z?azS6`8nW?^g+2KZ!$7r?U5{yML)7aS1wH3o(+f0GvPVT|8T4~ibZ`O0b{RJcgXf5 z5${p=GqQly3rQbjb;74ulllD4T}VaUFN1hL)e;E(f7FMkj{k@7M|(@)|0R8_wl<9F z{I?<=l899;{}+(~|Lp(#Bcvcs1Ed!q_E1#`T&x>@f_bqov5zv<75$Ew5{p0C0+Hwk zIC6pyJ9Trx%qkn)Fy==(AH{=M%-Qor@u&G8l#l}|vokU8F9R+nr z-^W4vVG`0uWG?E2hq6%LONF_5e3*MA7Z#(;Ft*`?b12r7V4P^^ST0OmlL0R=h8&1_ z1o4P}67m4H_E?k-*xppEENBP~uyi1*6N=IR#Sy3;D9MrL{+Aw*Y%N(4+9INB08#vp z=>>zbS5Oy-X`a>9H=&}UDdO=p{7Da7jic`R55I^%)uzYA#KLp*d;7leVRZkWi6^mG zeszy@z}kYM*wguROqi1`NIoL63lh;5^ylS(xho&zfSK4oCIy;zL_OePKHNbcwg<|A zu$&Bt%*p`0i&>a2k_JwA?2mb-32B1bQ??%k;r}~nK$H&1N8sk}iFIL*AerJm==UeP zkMhOI_fNG!R1ZLFT8rj_vw5Hl{#8{aD3@2`kU&SxKkygf0UZ!-&mV!j&bgv8fb;?6 zJ7sA5M`9mF7iSlY|AsR7|Ellzt2BTZi@qm{dn#fc&tQu30eSve8_XfX9Dpq-GmNih zgUSpZNMUZ+_>Gxp^W}kk5%T-DS@0%53vPI3GyMfEld`}U<3tIlYf=3%;m^_l%L_!; zIb-z!mKS_Y9}xEw5&ohy;DNp~7v!I5&Y1g!e4ohyCA%*I*8r#3ALak#)vf_uw-*p% zfIQg~>-#(4s26+opNJ*#fP*;7>)`q$2Q2SL{An#HiUEd&go1~gC!_n5uTb27EQ;Ch zculxdo*)w!L|ZTceLn$c$3OJS0o{wauzVZFh>S4?{4yJY$4)pAk#@PLX z&@ZI(CKs+`<-rXOAC@1>h91~s?p#O?_~fQT0+++oNU{CN{tX&n^T|jKcwj#!4~!kA zyJHOi&3nQgYs5(Jqq$!<_d~4zvta$FgEaTQw;{}ge|sGDum9E%IuPLjWD|V+Pzb@; zL&WEeFK{{78vtW}zXRj1eFtGrd_Eavdo*JIB8m@Z@8`fagIrj@HwR8){+L%N(gfQ2 zWHXYk!1#wzE?mEx13j=u1jU3}bmqXoW!a!SFB@brZq&Iy2hIlNf*lY8faL??d8LHEFY16fzPOGp@_d^2wd9G{W)i^&jzsuWp3D$aw#*00RB7*D8)&e(rC#{YB}3!5;CaTu^&&K4_oLVeJ2d z#yMd5C}e7z$rPBo zAp>(qQHQ`>A*ws1x-;%?paD@jVEu$FA0Qea{3)k60p-9)^fxg50uXo7_nH2GjK7EK z{{-=VviBK3Jjwl-uv8zlOc&|B((Te~gpHg`mI? zh>E}(cJu@PPTQ|O99_|Nw?cj&k%VgxbU?HqI zCdOrcHJ6;F1t#{7bVNC%-@D7 zUhD;a2dfJV!PjZ@r9Zl%`pL}u5bPzFo16E;xILLC%Fp2o<~inJGni9;6@$AV-$vlytzoU92@+Y#R zoOxXW<@jD1or9lALOqFt&zG?I9l9pr_<^p6t_x*<0ml8_V!qG2I9%rleQ$L90rl~Z zD4&b*`aj|C(sg|Lh`H~0?Ik!q;_G5&|B<;T`aYr+y5AhcH=E=O>6KjUXTsq!`y6~O zMHtJWo*uQiG{PJ!Caz9%UVPry)DT956=5b0=T9Be_uy!Q;~tJ5-l|Y0<>loI@DR=i zW=@M>O*m8Up--46#9)m4tsLq7GmZ)z%rl_pATlVv!Q__VxlHd9q=7iJm$b1D@jmQ9 z?2Yy^(b2ES1e(8v_#JQ2$DWRLceORykFhQvbFir%TTqLO{y6L%&#c9aakx)Ho1D?n z5O>POtDx(|>!9Hare}_*vrTE zE-*bjs3seG`LI3xs4ojskB@wT>C1z>p!^-$XNAH(oro`Uo$S4ljgEtvzruOUq2^+%bYcT%w|LHq%Na9$IqY%drZB#?ThWvw7v$o8k=sJ-MKPuM z`<20B&F*XGJA1wW6T*ft`e~fM^+Ebx98GZO{VujjowG$MGSgoQp1!sc5L z{_=bD{Wv<{cz{C;Q2fu2ZsIgR$KM)6FDz{c`9&o9M=zP0!fC86J&8TYjgB6HtH}FF z2PFP2KCge|nDi8?UCzTA+q4IFzwmz+f7AgoUkUqhP#zxEgOY!?6#aBx=Kq&kTmk+_ z!*~zh#9cTq{xQ!*pN-&I69$9@Ve-rPHslNFcX0fP!w<)=Z|pq@=K}Lwg!f-(F3|t* zTxJMqpa^v{M+XPEdigS#A?BuM&cOA{W)OvXAn6*vBKui7p|#73P^ZuF_eC1OxzF-{ z%Ec1mpW`W9k2N|H*XBvCga4QQtYWr0-3#3_4fYv)Z~xDyO&Aas4T0{rokPEeV<3)b z9KUD#-n|Q-7xT=7=WtO%mPm!KIVes2>t=NYt52B=y%xt?EI%aqYENGdC%dX-RH#EflMAY zlZPwBALaiCv=gb9HzWT=W3ptUpq|R&&&vDSd0+bw8vKHuIX!y@hlb+zJI@pTHtCzx zLnIByzrV3O0Qo=J4}|{;Dm~$IJHT z7x?MfI!solVdnmiKP`I3^sIlIf3Klff9*WH7NP-`5BwfkfM594O^81|$4vB@hG1Sq zQexu2msczjQzHL$A@LXI7tDI>*{;}w1#SQQKwRf63TyCEum%(JGRpBh^8JwR$NGIp z_ZRiw`~?2=Z2u$Xy*Mr4b+I&{imzk7irw#cgVhu8yNKT>qQ5^Ec{9z;U-9+UH{Zqo zN3j61IY{5nLcNdn%-j#7T+G-ndDu)&4%Ofb{66HPVq`zkY_0zKW6y$~DLvc&>pWi^ zd(mUcFUD*98wc4XXxRLV8`1&!j*0J6JcV?0alC%_G3k|re=gdB)R$e*j~n$4vimSM zi|N6YC+NjniSdj&F`pci_!~3=8L(h($A(OvH&-TA%!)qoQ z=!8Qb#}CH~@G}kDkOs&Opxz_Yf97}NE&hG1FNj%}g~c9YK5Py?vo;sn2m+fQ^*)MO zRSM-kE4OI>{f(ZPJ`Q?@|1GfBxlX!n98HjJm*JjbQ@>vx;IkxoT88nzU-k8hV_n}d z{YDY$8t-t8p7&7^SbHN}iv@K)M(4*IEy0>xv<`c@p!W*WXRXeU58*o-J)yM7Y;<^0mUWn;rOv0Bj0&g%-cu0&-nNnCiCgp&@*CUxc^Q3{(Gc@_e8uv0SD!#q~Z9j8{4P!clvzA zX@>fq6(jy1xf~|OL-p3==VP!(+oJ+=d{}*-@%6FT6TheN?TwxZJsWyP-+P?@mG9Gi z;gG>W`GmGOembuhKU-(Rxq>~Y%5c5Xf5!%-{4|OKmY`kFtiedQ=L*(fr<`0SAD3)B z#?Sku{(`~%+t|}Hpl3nPgr3cRCAL3u(I~MguUH<(O1xh$9OXEEd83>X$`fp8pHlJp z{k3EA{gd1;!My8I8<15&*e(`Og$4kj-bbD0<)FXb#zjsnU2Z_j(WXS(+lI4H;Z zM;_t-igW3naVX)SIwOi@{jz@8&_1PK!&?0RggxbeP!H=ewEL;ID)rZ{pd5UvwM4sv zS#JmZ5R|9a0PN`=>0arcm2mv8!18Brg6-hms&>i9CLb^S}Qyz+?gDFjO&n|&*XJ{d*0JM(Y?_<(!Ksi`|*Aj&!7DqJ`bV; zX&h90PS3~_M+uG}-iQV&(AQ2r0m6@bb`7Ni@*h(^Hu;i@5bsj_j?WCm=2bPt|5=$`1_=pKLeG5xRq96cN1=zut`#@9D-@Ns-sfyQ&{Y@`o} z<{guNm~;b*zFosRZYk4U_NS)T-XJoysIr%1I0Ob;#0&t`ahE#@@eg*n;6IWLyS zLDx#xd{cN29q=`CU;pa?{Eas#d}hsXKL`i)rt`*;i=)9l1mXo`8&aHr)-fRckaEun zV|IM0FDZdCJcsh~nLKow-^?5r$ac{@d?uDd*t2$hO$`!64P6^uBV8+9GhO>{d?NpE zeic1K9MqG7o+tGwJ%WRJ*is+kk2t>18;}kNE20I;KW7HYhzi8F66H7ByO`nS6sHv% zwep=XC*8iPihAjN#1VnxF=9{GMAt^wNZ0!RCRqOicTLY02kB4L!+JF$tBv~`IEWq! za8%+Tny5<`tZb$|(gM*#ogu)L#h2aJ2(hMG`T`sgi1iKJYvWjrgRbHK>vI1CxYzd+ z`0QDIfqEDIg<}Ga88|lJAl<>x8IItOd4H@QG+FVWZSAahX3EZmj7?aAX%W(f5 zF;B<69~P?I#Mc|}{TcYV2}n8g8}wWME95!e2X0;x62!6CjcE_5!X7bi*EvA|MD6>+ zZj!Yh;0fMu!k%CtIHozmY=T3k&j=mYHltKw-i1Q;{g#4b9(yeOLNE4Mc**Rc@C!v^ zr26y)wO=nGp+d*yU(Q#eW8Rlz<_EmK95X*)@a34fgD;1I9~3(l`FRNm{W?F-T!6^W zOGw}a)ZQ(958g3P^!xCF#E-p1-^U9y5Ix2V6h9Vyn=V-FxX$I`1&bexJU#lPN}bEc z8~EOFo!i436hG$Gy`CoG$6j^cZ}g+b26aC#`J=~mKmPxZ{@b3wkK!$UzE|BF{$cv# z)%|=E@niA%Ab$M4`6d3o_Az1 z0py2uZa@V!IMMGzep=@O@$etV246nF@N2Ix#|%H`eK}_My~qV9(f5g5fC?RpT!20u zi~JySNWxRFF<&q81emWE;qXFvR{H}gg3s4}q41Dp;mp<3|9FD07k*vs6{@i33%{WD zP;f=UtD*lgzo_!%eGz$oYQene&E-4E<4-i7Ib+Hq2?-+277wV7%{3#CoQdZ=X^VE z8Bi@#u~6S2KDw&M*x8+C-nl)Bw`Wu<$<`8`ckEtM$wnexFpiqd4twQ>(~*^X+bW4)>BR+^b{J`255CiJG&foG_5I zZV_uRC8|T)Hl^1JC#l^V_ozn?<<=9rb$Y4Q}3WR4TPmJ5~PF4YQ}b zR&AdsvAXR=8Qz#ZW8c|Z$)4mJP0*E}e?$4KCGW;dnOMc)s*^AD<1O~uY+&X!QSbI>qpn4)fdQ6X}e|x{SJ7_Rmp`Cfmb}v(#K(|Jz%~Hk}Z7!6%QWCU9Wuo1q z(vyYup9fcMn;;b`vDxriq4LqD5xJH7-+%11zw^k-i0}fZJFWhbPLI-Ec*aQ0H2ucP zH%(78*X;UA_DHi-nWa-U%sl?qtF2p5;i;vC(s^bV)27RxZI`K5nc7>)%kiUzzx}6x zBB^d`tpYS&1gtf&%P{Y`IZ!jDeM(8N%)=^$DbjMYPL|Y^S=(DLlPGx~)4$c}w@Vck zDJ)fee5$YwZ>3$;jN=22MRa$2I$zqmCaO^LZwBd{_va5cp6H%qWo68%{8x+ZtJO6B-Wz=EF z`A}`Yt?>hnsqX9()1`Yh9(=4{2My&pX_*t>xlB}ucz^6#W8M8x`kP;Fl^i{}QpH7M zQmctYEqqpbo%A}aqwz+nP;$akr=UKYynDvu#lGcl_k^!=7|>z7{^t*?*UB%^w_g-waBT4X^3GE)!aMz5n-BGDJZP;--sow% za}GJkA6xKXi%g1)A-L~f(XR8BR*g?5G@H=4M&C<&$)}qpSvha|c=Ng=EQe&}+dOMr z)vj=*UB!KqP+nZsOgDGW5Bb&eHaPql^7PmfhZla@E`xGklxYu@skrfEe`>a!{@=}P z`g%`U*h<1>1kZS)M|At?1zP=Pm^OWLOU^y#xXQAQ4+CEq<|{T2c<$A1P19GlcG^?3 z#`9E+mzA}VbkeTaaQEPC54EQ!mKAAu+keuKo^Z#m&(vPJHxn*9=BS-;)O#7fw2Qub zvyul($Jn{ir6a=;v;=w6AV_a{Z9*xfv> zILb&#!nyFGam&K)flk~$i;woH*sw$yAL!r-!$z94%&b1j(=M8%DItG6ZSfuRDEm29 z_w!z=!OTl0t)?nynP2EN*nf(_#Ni3jcTElNMMwwA7?j+UdowIorcczJwo5$U-Z5Cd zp=m^wzFgJd31?rOZ#jBX+~M-$vTypPZ(Y;k4n@V07ShKET&UwvtOXeDm zmzOL&rrEURT#r-Qt@S#WD;140n!i`EVhh)x&p_o*gXcBUX^Q`O{&_sF`MCI+8(}xi zKf9l{Y8z^`@oFFUj1MC=RY%Dzn4{R;VDUtYWfx{~Zy)ksY&ulAam?1K%B`XmVr_fL zJy?3fW7yUu+KN)fM(qYVX*AUjFr4ir!&|Mk^IAYvcDu%&m$kV8B_~>&=}VQ{dhKpB zy=ZV{pZ8&&N}n97)UQVG(%ut3!G3n~w1tWndkx<<+{(^cdHHs!;uC7At-Mbea_2g( zk2G1J+PrVIwC>&X?!yhu_uhKYC{@Cvag~apz0NaDGwZhH>#ILL@fpbdV_9F>W8Hc7 zUb`h6rEClB^v>}$k3JD_jxUG zuUhn};u^PeKVu`6d=FX4!b#R=MmGPu5#M09guc|H>LEk)=6UY#ZJ^e4!u*;GHhrXZ z+myfc+FW!H_6_b_;a=^M233Pq4BE{LY(2fz+AhmKjczjU`P1OpgXG4=wCTV}Z^9k5 z`|mC3vty?ZZeq7&?z0Id+F4z_`5WDA?Uos+cdOpmrm?4@_R58ydv;q|VqoLhGjN&A zXL(MH()jtA7ahx8D!99xpNu$c7w$2=yQ566UNf8XdqgWnKiaTpeY4)9YR)Rm+0`kl zlWI+hS(NnNMdK_rEf%#Y@3g0h(g3F#ortjgI_pZ#=$}-S>gL@iy{ZMr6^7h1%5~|~ zg#X;BY~M)@=M=f3YQDwsQRlY|YdolTkC5YG0~}>^!mNX<7HyHapV24K*r2_1_6H}& zNfK_|mityVnczRYX-!WjsYH#&l7&roN-bF$(nzPWW;m}5Ck0PkgZn7 zzFxNDs-tTk$8KwV!RUf<7i06Hqtb75VpJ!d(_G?J-g??Sb?Xj&9t7QydVMa>US?jY zW{V{=3u`Rps*YV)wz8ttD4g+CTKZZtZw97XsCAfHDD~K|NnzD`-m=1jHH(`Ry{oQ} z+vaIn`FQv7^M9OS)#}1icT?WeTopw-i-n)LwiVq(*Q0^TuJaSvc z!rkFU`8{tm8ttbuR8wAMceBC)M|QnYQ>!*sURmnh)W9zIgZWVZ>pi`=jcR&(yxNqh zu90c<;kMhgF3C-g`&zd5E9K4$|LkTw>b%j4mRs#^Z!%1fS|Zm;BFj)!q0!$;*H+0I zjF~uBR$-Eo?4rY=h5?b%cKchEI~E3M=*w5>TkKmFr(&%kYsNEfFVS|^l&mtfPfDi) zQ*^5Iiq$n@eJ;H|l2ayc)c)ef{3&*)PaW@N=rF)X`%c%jX12_L%(JCmyZyoiSzI(Y<^c*`3E2Xnm+e^%+= z0~V;Emn?G4sHoJHk&QkcscEl$rJsEpzlBpS$;S8FYS-5v+R54VE}!tRy30MQr6C)7 ze9|*mRei0Sbnut~OO8lZ&YD~<8!e|0R5`S&!z(j>Tek-hxyFhTM_+t0&Gb2>FYVUl zW3h&bZPd!ww~ndXP2$N|EW1*?5>##Npyu$!dnd{1#%z~{mKi>KU`tLp9%p9wOi9bZY^wX2x4w8x?DGOE@JZrY%2 z=*UaAc(M8DLeqIEZ_CG@nd8}KVz|21m@YH_^zJ?}*SOilS=}#~HhIlk@>fl9y{sTvs%=~Ru3#pkbCeHx`A@4i6F+NPARrd!j36QiG@ zu91?t$TG*(;FFD`>L%@m-jUo)zA9PH20xT zf~!)B7In&R^X~1=<`TOz->RHXH}-D1spu^x~Jj+O56fVdrkfVY^oM%R0W`ai0e@OI6M1%kOP* zcA=vjuRyQS3_q0n`Lix2Tv=X&`TB80q-D#Ss~WYMI;Cm34qeO%sZ^V-5y@&+Eh*T(4KI?@LEfAv`JX1yxPG5+wC*rzT}f^y>9g|E2O zYv9YRDuLX{WLhCHoDMj=wocqP$lR<$(jj{&X;( zKD(fwsq7Nx2rIt{#rKYPRe+UlTMPAlH+MXEFj!4zO|FZgL|ePe?IqO%i#~n6Z}my0 zV5Iu?q~v6qn9_~;uhahibjae+c;&r(jSa&zA7}9AT)%&QSeW62W1|Z5T5ved;Ycza ztzKGQHo|`D-@U5<)}WMI{u2&wqsUz^i4+2hYwz^<(D=@{5f7* z%DQ#t?(`e*K>{SKoT2H|@P6u>wmPTmA7io3_(8&3WYehpjjlWvE17sBc$dntur6Ek zCoQ^Qs41Og|9s!)+2fxr+i_IQ@1ahBwVa;Bqz(&YXS)T+&3NB@!`Q~Werx;BOXt7q zw5G3H(;eeXmmBh@Nt8US9&n^L*HfbAZ;y2mO=pkQEh+A*r@kp~|Cs%*t5tLNFYeT+ zQL`2=O>AVh_f-C~KtuJ?9;L|lqlVaDiPTK&;alv`=*fh#fR27Eng>lf{hFsTsN3xg z*GElle%)?o%Z=$1Ew@dvwwhMB>20qD#xooT~In(a`PYd_S=26TFYAIt<1Ps#^ibro2a}| z@d*P)ye(L`Twb#IR`1)rZW_(-o8ENEnVrS{QZh@Gb>NWjmj=9Nb!=KHhucTgtz-$ExO6Bk-ikUaMb-2wGku! zdfQoD;?t7Jx|caeuC;F()X{lZ6T6hdI!>gqGWM`-?(3n0 zBCVI&w>6$*wL7@7vHt`4kdS`;?NRMeZ~bV+t2<}&)rK`vo-^OkhoeHDwT_w1&d z&fRu)nb}0Am!Z<378(Tyo4h)=FZfiOfGs0B8$|AMwtBm0t-tK2*JTgVpcN2{i4g8fE&A6M_jZ3p*yA+2!e zsiecc#L>EO)oK)N62)mR+smw%O$89(0Yk*IV;!_nF&#wdS}MEPs`-QET*i`<-Xr zPq37{_tb8-WYK_tFw@1K*B(yuw3926T06OC)hbwhq)#Sv-t+$2v_`Vl?e5r}oSIcu zl>J&iy_KF*id~QKFLx+*Y`oIwFaOzh^Hy9O_~Dk(D~ZmG)Z(QMFe|Ed))uj%K@dH~`SWVUa zBVx`WbN`6yw|1}Jo4d-4T5q{)SIXkH5?2mJH|JSB%vX_1tl=Lk&2T$>z40IJY1_ML ze6~Mnl6gETN(-}lCb!ibFxRkfoAc0JsjrNiN?h+by~V{|GovQF(|yqS`cQp`tJWQs zF8fQHKjyE$_B)MOmQ?BT)VbTX7x#?pDm2&J{v#_Ti=&^nu$BB`>lNMa>g;-~+Oypn zqYHatl@tO^omJL<^qT9x?!6Dg9P!BIYjTzKpy3aca`pjEnDI z@vm2}eKYEO2PLJ=d-e>PA|1V;`71?YBF8WR(<*tk{T)6Jc`Dqgf1 zI%vv{M`L%TZX4` ze6F>^=yQDI(Y%O4xheC{S)P`7AaV4jj&+1e0DpmsbEs#E&*9jhsFfv8V|$++jEoLf z8}Hb)>)KuKcgeI_a8qjDm3!HLj5mTl>Os%Z_`OE^e01*`(^YAgJlZB|hg4-+sEisCuh&rt#{P zI+o>Q%R}FIO23}pb4cOyIRLl6Ro@R!5_48pHBimq=AFFA2_Szj4o& z3yqqz+*8Qwo?I{jyYXke+|#wk^Z4{d0Y_YY3RXS~wOFpXcb$3P(+avHnol`5c*?@F z`@A#O1$(<+{?xqlbuIp2?#mua7fIPSyAonh#ph&b#6`IGTocFV2O>JgciCvo_#yEoRSbH?vVySY(k zi^;S*^A2o0ydta3(H=H|k$HWKo34(Jf69B5y0ua-U`tTpqP@D=>RY&W8t$HHqi5Zo z(}uIwO1Z^tW+TR!6=0 zlhtO%JU6*GeW9Y=+ww=xYnFdJn3FK!@ai(%jaM@6U0L7s{0jH*C+h=n>BMzM*IRT> zaEvLanCi8{wE3R+wH6z9?zA{u)^29ZWkbVhs)`eKZnjojzun>KldXCC(~dejj*+sr zKNOUEue;{n&>7__1I?BW@>yduBJOD3IoXnJM>f8>5U}=T>g7be0bR3YyE-j#_us4G z#rLUF*wf_I)O$mV%&hwiK(FbC%!PWJz4?7+-79`%ZW8Wd+3B#~6#Lj)j*nZUm>+Pe zR+#akG$a;G`h-EueeeY09!{o|p% z<0omJ+^5LNKB?60!-f2q#HM_+#nYw-=;W1jyn1cv7VR;q9tZlzN;`G$l{?($Tk&a+)&|LR))OU160 zn` z$jXmxOixQlXxMtJNQ++_C!5<`Jx$wOdH10^Qh#QIT{l7b5pJ$~6B{8mPnu=rUEroy+Q5UZpHOYVAoxEb2?c39Xw(KfvH{oj6 zIjS8q%qF0NVg7A}EI2s1U1^|4RTR$b=*&DT+5@!o5;Q>bG;B~7AetsTp&NBd>Gd@-o`a1&*_QByu|u79)BZ8cj)*fvpEe*Dp_ z;Ww;TD2>}ATYWh*+#+R5?vs(DNBe~gv`Q~8S|7V@rev2x?Jg$_AJ+R$)QnMsR@+|f zkdrg^k%Ri{t#MKPx^?m&-Lktp`aF8deemHgpRta+VA$#7eLp(*%w3YBXtL#AW9!mb z1=(fGbVttk?Dg|r((a^9)^e`*Li2fc2@AS9xv%4b7G|dviR$ zyQ5x`)3K!m;cLRImAj35H++)syWstCuMep02{{KFxPr5w%PH+_*LJJN zZP&j!X$9X~!fwQl;phMIlV3Q->EP*@-5L&e7kLCLDcua~)MtKIANARaH*5yY2(OBt zkg~yg)rE@iY3Ipp*sM{b#@m~3%|9$TX8QbvkySMxwMIy-J06%7C846{Uoxh}Z2d_! zspDcEZd|!;iAOYlQrys&{VzRs%Y3onU_zf>AG!9kolPe8n5?+-VlTN*hm2OZPrOu8 z;d1zP?^#>_T-u|R@eQZuBX8_B8yn*(T{WU`fSSeTfTLY4yRMWdaX7Y{x82I($h-cB zWuL}B^?2!zu&Q6Z$dBP0p)^zb6no4u>$%0p78BHzCadk+)3Vj1maXS~&U^bpTCHVe z!Tuv#2W_{q`lzXEI$0wv@c3TM-dS?8!_6`Wb$#El#Lho1)HC{d?&`3R4=)`{vMcko zJGHP&ULRLhwbbN;)4BV)I!Tca5;}J2a)0=!vx66IZQOY08f#ninMJGhG}=DaM*ZYqp?HS+}&o412imm z6!&@(tJnJSq;(^+)~YRjP;*cveZfolvLz4fD|8f0`pjO_dBK6@EB#i#TixN>S@rSv zcdakXFKt<=ZM(i;e`sO%RZ~B&JT+8n$F5DUc!@h+o|x2c*Z>2QsZC?M!iB5u&9r6Z zmKn`UFKOfDD53wScSMojRHdBmr0AfrQCEcn9lb++syX=0Ifh$ zzcC_A;dyKU_;-}0#vhp;Spe9IQ%%uHLH;hj%+XV=G2rvzGcs#Yry+JMIBT(4MpCPJ z@9i_9oo&17-(MCgon*yG?2(E4b33*d@aX-m|NZ^Ww-@Ty271mBG=a3+L7k&9FoZEN zaU7SfUsHmA^3^^EIORhlg^ANUU;3~ru?W8lv{m`O2pf5oD(H69prutU;I_eo`|_Kv+#3J0SWm(stl-dR+Zm&j-!wJ#2$II zmLh~DF9BZ#jy&$gJSs&|L>$n4`M}wr8K7nH&F7(X)-NXMeZSidx82)H{2*V)gP3?X zb78N{zuUF+Y)5X}3)W_AZmf|cbsCM9$DmLm9P@Cc2`WGin-dAq1rv_wy@r0@oy~!x z2ww%R@R${Z9!UcTg%^w?`%WwDgZ6pQc6;4#&&=N!%T(v+v^QyQZP86rk9)9r5|@AZRX^|l zP>ED%Xn>kWIQle!(g&m{I)Sep@VY2XQA}=8}hE z=tpt(?U&l$zt01mhWV(A;GCn|?Xb1AMZNB8C3+1Y_$?~ck&OZ4@+1h~=~xO7S+6FL z53Bbb05GWV*A*6lKLOSs7QV#S=kZ~{r$*c6ga}DMWYNj<=N)MlLVY;oEV8zY9zO=-V`v2SUI1)vV2m%43K{@miWqO} z`(B6!Ott7qaQB;12virXK3`UZ>gQFtEyCASAFbEmqiO&Re2K4Dc@Ap&8xi897P{ly#E0@f6oK<&z^)o_-pXmYcMhi8iPv^V%!dHn7yd|55v$;ZRM}L z7ZFSpfhuX*p}n<1y*`XFe#~5+1CbvyZ;z&e7~dHgSE4|RgfiJRIv}9az^fo9qDWSF zgt`HbDgfRB{wYrx@wbyRNyK|2;w148fLuFvzPxrGM19H)7xwY4JrCCsq}hP=HS}Nq zkLXYnIewVvm9x0BXUPs717lDpi1YiEb?~e7XsAfYRa8r~xeDL@7WNz8qVv%u^zOXB zu22ZTT)$0n=MLr{{VnwOehXt8l{R07-1XEOU3)OY?eyJ#n+|)umisLvHp^&t+6<%? zF^Z}!GEjYq^xUp@s0v0sgR9A(kA|EF35`(m)Zy~^mA)-bg8Wle{#)Rkhkdep765%W zdiT&BTWb@0o z;CIQ7ZZ_Jmx=QldGep1nDO@xfPG=BFDs!nfNoP-2^Msgxugv{G62ZC@?Y8N5Q$#F? zD{?||0g(4fh$5f+pi#xI)mOPVU%N^n(4*#0f&MngcSP(v|MhXXnuis`3^c3qb30tdvkztHQR5s|52I$QKJm~-}(D@ zSl6Y~NkMFA1s}2)rB?trCunT8Inj!wuwWXLZPm6RDr+JfRn^m-PIT~({)l-I_M9a0 zumWHZ_|Nf(zh}n$c}OI$HluhfKx87s7@YM?pIJ-V?fNXbIOatT11bVh0*OJSh8~Hr zgQMu#SCRPz;yZURvv+Vm_&)AGeG7A78hPm?^2%B4$(L|LqhLLA<_`M@Ep#G^#s;&x zN_6gBy8rf1>3r?mxWy$eWOwL!P(s}mSzW=*-@%NGp>Yc(L2+e8M0J&D&a+Yb_seHc zd}j=Z_d#{LT|`o%IL3%pR)6m*DG%Y;Rw*gGG3ry4Q7M$MO6!Asj~eLj#<4B}|D6cS zd!1Jg6aYJT{(l``s^}RS)fHG}Sn_ixjEN#Ln_-Y69~skr7N3%FL zYL1krH6U*rqql(nNtNZjMg$&41E>Lq@U_dIdfflP5236j=K`=Im%_eaMkAO3J2}Rl zcd9%@4Z5JSo_THN)$8eL+~gR1{?o|XI_CUE^u6=Ab05QZeuRvV5xwyW?#;K*W5-}< z2#IT`iP0!Qh^iI!{HwEpdGDvVKm8AE{>gvDEiU^BUXO@I8r05CQU8t8n6W0hmEvYs z>3shhouAL*tPM+?MafXf%a(-<$J_+SA71es9}g?=s6eCp9p_<=pRbC}Ic%1anH1I7 zS2Hq#8WWs;8u0rL#9%@%g}jThI`LVAqL4cc9boc00)zx202L7#6p>@VA!Br&Jr)jm z7yq5s2boBKVYM*<3>| zpQrn0e?j`^-^8u1p+Gz~z`z$zV7~G)eC9aJjN)nyG!t~ALwxch82$;JA6`Li-p#i_ zu=TF`kH}>E&HVd`GSu8G4asOG@=iciuK_p%k>0t!GOZZg8$%oiy-zmT8Tv}FbNZ+L<1}*coyJ<>RL;_6V zH+V6roHTwMV!)Rs6RTcl#G%Bv(FRORBQIsJwg}g+q315Zg)7MN8s^3|SYJVI-h=~( zk;y4!atg-Bq1k|iJGig?C(`fzm~?i|J6ey9QTzOHlE3jLeEC(}iGw(spst3h_wGl@ z5b;_@=iD9dfUGxAiKy1e(;_)`uh0DHG5@1n&$iz~{Q{qnYD29@KVPFL2SVg^Dm0+` zvMtO0ltSg{}4Vkl)N1cHKYr#642&OrNJ$n{TpTMMD1+^XU5@V;q=M$B|FHfqm^Ym>k8O|B&?G{yFaAHE$TSYBYZDb!z|MbGSE;<60xI z)xfzLxCW};r{HEz;$B&T`Zv)=9UUI_W=0W;49`)uxR+<8_CKl#@E}cq5aYMjBG!RX za{r*GQV4+er&w{JqEuN7MYRL~`FsH|L1WOO47wEOL>K@$4IBcOsA}e%)B9my_M!na z@s7VQ@C=y0T;cs)mX%WaZF!#%l++SbeHx~yBXwP}EUP#GUsNaHPSk6&=c=F-U5~tg zP$DF*L!!8b!m&Y2YaBg$7Ut$KckW>B&Z9s00s8gtq60PD?Ym?*ZsW3y=L?C6+xIJ(^Nw>^*le($T_y%5arzxCCe z#3IfMVkN2+eurEL7%^A_##PgUeZr6lITlXE0|JW>cOJ#js!|xb9_av{SI>cbTUGB{ zG-NLVpauLE@EM-6=f8Jst5S4lCXS+*B&h`z%vbugYI`8TFK!gzezZLYK!`$pd-0A# zryxEEM?HZfBXHsb(%FDJx6zM3hL0~Hm#*V}_#XE1ZQPbemd3*kYHuAzPanVzjiR>c zUv2=kb?f#b#OY`GpVw1>EaF8}6R`QywD1YXPAoRo;z6Ew~Jo1U+yF znVvv?^=-`j9kT!3{}uPMONc;JkB9~$Sl)o!t4M7Ft=EHw5uqBR8hjB>F&D1GkKaey z9i(1IY7LaQT=|0syhw)U!6v|?z;d7F%D>aLE-<}uc~OtNGN9?H58y)45aSf*B>1&* z6Cf`U-@EeX;|Nu4xMw1qM&wOkzzC$N-#AIOPpAiJ00a2WJ~MmR_L-B3BH}nI(lQkv zj!CnOG)+lD<)G)Cq|^4{y`dq9A|xycy_0Y+_aT+PmE3?L%{07Bj3x~vjWAu%%=zgW z8Ir&DDz#4?Mi)1*|HF6D1MlA{atZ zkzKk_#fr?R<9L=a7e#FCHbWl7)F<#Y{-1iWk4GUBns(%cL9BH+^*sYRovyFb_FM~q zV8buWBe!p2qX-!uM#jg`u~8&RLIaVodErQ_7=pX{)~mr|K%yWJ1YGEoxYC8ov*@x< zEsv*$h`;g*@~bbQAKXUI&!hLYh|-&|(#76bgo8eUV4?__oh5zu9Cq#=^|wzU(o_tB!7( z(do2lHV1eC_#fu)B0u;pa{UHodJ^;YTiDlMLnp?OI6;liu~#t|Jh*B5c-{X-{q|ws zT!^f7;POpaUc(GGsJ(p*dF>eX?Xz(93~WZ2+iURitGM?r;eK)+qKN3FlbF#V-1&>> zhv%VL$DBEUOb?TViL1Hb3Ab2Yu?Y1S7^fVw{p?DQPzi1MnQz1;{7dv7@+O`6AKSkT16J{qLgR z{Vq&TVa}X{vuDwRhjD|$s1vY-HC^$t_iF^ZM?eIRF4WC7?)F`DZ37u?5xsQ+4ou_X z5ojf7y^ba`xW+Vk;w6}$N9O0@)?Ms77f3(6LUwZwGd+wP9Y>~ypcbRu1eM4mnfsn; z700n3$h>FC{2F{u&N-aAz~rU`@>J$^9tth({NCcAuJ8f$g#k4r3gwENRv_`@VM7II ziRf7>i}y~|v3Jt|B48Zfl4yjz8JznSj=XsS9iK$IH8iV(tE06VdTattpT?}OU_Sg1clkQq z4=$43T7=9J)gxG2N6%kFHUu*~jSfvgBk}Pr^?40iF=3uI^Y1$P525z&bbdeQd>sm- zCb(U9aO!PS@hk70dH_%%Fr*?h2t`7qc%;>yf|ZDXh%gEq1~UaLTC29deE4oYfEK>T z--if&0}C+z;k|6rj#i9YkM$9hsZMEG)qFE4Yi7 z(1Di6_n$e9o;-ycn?&OVWZof_aYFteEamsK|#5r zacAeY2Oq z=Sncp^Iai02k+pQ2{AZ{kf{M=<{%i0+?#`om(UN+qZhBjt$EDmA}lYUv$M#7!!SMt z!z1YM2wJNn>hen6NJ3_}uyioX#mF{Bn*T}E%;fgk?_`_1ps z{qB3XjV(+qA~`Zf^lN9}4?Y8N6Xv^cVG;M<4fNxinAuxIo2$6xCAf1J4je+qCeWc# z+|UR_HPkBoc(W(L{P#P?{b<+Y<5zfFbg2Rf1yOr_TD^aZC_w=MmL1MnIZ1f+8+U%z z?5GkP!}D@|r~8S^lk^P006vVc<4#YK`d5A^)&73(D207h{w|2`*&apMAWhRW^Cp10 zvTN^iTOqg-yH^P+vS(87Ap#ML4vk{pd>wh^CCtV;a%T=cynuWE0`_}9MFv}#QzwzP z-b7z}&6f!?5r}`~UU|*O(^*`a;?gcM*&>=5!9@~Mjvd-v1B!)%<*HmP192uHGh9+=FPr}{1$oxFAvI^h(F1+(Yn4CmTpFqyM zgdR8qjTVYQtn(?r?KW&~cvW?31UWnbjTl*9Bl`Fz^4>M<`G-~LnQF!Srl5Qc_uE4qT=(!8Xjag*=4rXNm zcW)jJABD*&%*Y5jG>q13NP88txr(SF^#nFM=#MX=cf0Vjo9K_uk)69ny0B8rHW2e-aUX7*{2-P^DR(~&4{_RnmAVPSM1W;vE zgf9bE*@FN$hEM!?;#Gh0ut`q7e_y|Y4}4F*DiER~xx;@&hy)>u6U4+pd-Xyf?WTnj z@cBjqR%yEsDA0R__uPdtTN-S93zFcD97PUH!moaYXlVtxasz$;W8BxjgSNYvL(@dB zy@Gr5RrL5#%H{h#pW8XTB zGec;%;hEnK;A{8&F9Ob0)?K0+TU}G z(2+XpreqmJwe12RU*O6xpf8VxY*+oO3uJEYJ_Zc}pHbx-{Xgs^0LJn7|Hk8-aVN3? znB$8Dx*6ms9KYiLwlJD~1 zwIcf^)C5pVk#Lg4Xk!o^bTBfF3{QBc;7g}4bMu(hW#raXJP7{|kakd_qKSsmq@2^>lavTJQ^>fUZp^p*MATQQZ8MfZXU3Kok?gnYG zZ6(~OdD{1$CRYQ`)7#AYxbH?2U>Fbn*|*f+9O`JD#Ri+xxt*EOh(U}&BNNJANsjL+ zVUkMk${$84SE)quw&5|__N~IL4c^)3NdWZMHPGFJzyl5v!a#mZLJ2Mxd?2WgAWR;F z>1pH(Z(;7-!unI>7WPvw z;TjWYyNSzMxXh;r=ggmLEE2+AUI-A9ge+1~dsTg2Lh1j>lb9a7qCe<;{&~OE{+zNb zqtodG0not609667J(?xkk6E-&+jlZ}o*ot<0n*%Du4(`^e7(OJydc;Yav=<71M}r- zzqQ+ifUnpS`Al|IjB#EFn6jRIt{D~@L>RKtuNUeDh#@w|`21wZg2=7!w2+w1r?EXcx5|Bx~c=*U1)FNat73G(<)21GF+ga%_b9 zzxX`z8?Rtb9Kl6{xK0C?wL*=6I?e^VKZG*#cz1bkrVw`3Kw8!DRYeFst(AW-TEK2V zp)5^lZ*7s;3?#vr0UvRBekj57_EF#_p=fAT05pLw0%!N*Y*j|L){VPlcAv>;E^1wrvX}(dYQ}2+)dzcF!VLv`kcJVUl)f>1gx3G6taNX>I9?>Wg zk}n-6`ReP)@4tyVau^$r;m;Me9D6E5}N4w`Ut|XX(8726eQ7^V znKOUB`ez|0-`cFl@wa^-EY?QFLyMvaLe*3sRxv$A5ww_H`H1=Ny$KNN)H&yyg@$uK z`#ynQ6_$;4%#Ca4>`ioH0zG*W#wU>B5v18d8v{rb+I#gd&hF$jZXX?x%?)IE5x2Mm zmoDIb@+0i`eoT7lCU&d);4p}QX~dXDL_D03yfuY6GljDeZo%OagVqLd+QMlKG)61- z`;NBlHjjRJvM0^__Z_$UXc^VdyPYddyL37o)EUIo5K}9BGY@2^%G9lPfzOexQg#X{ z#;^Qt&mZf^QzuZvq@=A5wqIRo^qe$KrPi=ih@KgjdzQ07;UBB;>&tt4NP? zsMs^yrT-KeLlVc}at%Pqf(B3ufJd>p_klcO2|aKC-B^RGmvMjfb+q&6M8}UHufGbf zzlJ+;0v%`unPxx?ySMiWcnBP7Q%JXvOXo4){5IKN{ebN94P18<-Q0q1x~CYZF+%UtlP~>u0gYDn{tn%lmJG_5<=6{@M z!A`&5kNNZY+U@vOU}6RlGr*(GtLk#U9p|?XG==B!qN`U`0L1u`-@}i3^n9?Y%-`*H zNz?Qpk#~81bXFWQj^oh%*L(W&R7vd{C<$Ib2_?dn;CytpNDkV^0eviT%_e&62=c36 zgu^q)++Ad270!Q%Ub={mk0XZ`5SM#l)vZiN0{0=u=1F*c6%!ptDILsrrqAc zIVDbpFj149-2BQ^+p#e14woktfQ#%>`9~`M?{Y`|Uku}Uyx{w|a$_}oyzr4Z!y}=x zKDEDFbm)Ef<2kad%(1T3YQDi@Kv=1oZT5fFXAniP$7lC2|8o=tFoKSc!^G#{b8jI_ zbMWE&=zAZam#-t&u3)Z@A@jGfi;FOG2!=+WHH0(<&?NDXOC8c}qjO8}!3Xe-Z(#rQ zKat+L^H7%~^@wP)Npg0KvJZP*n5ztI*$`O4fy9(B}+(NHYM>?_~6QQG{xX*qH-Z+D- zu3~P^A{VdXE?z;u`6Cz_B6{T|cC@P$>5!hB$H6=>$giHgCcu8H{rB5;w{7~5^`P_GEMsG1gLbD2GC-UR z5k)&!&+ldIDueew389KuEzR3~(OTWRJDG>9yCp9vWPqhqDfXGA`6BWmNwq`(CzyxPJwm%v`hiWi7flg+~ z_yKfc#$)$y-N7uccsTF3z5ze|DKb5U9GXJsmvHaAi~ZqG$gbYRZfxy3?1~TPMRh}b zcAV(o5H5r6PiJ9r5Pthr`1BdHHGyk4aNPmaHo(oWTobHy~y=x4#rxL)HH$RF#RH z=X9Uo7{v4Xb>MO?03HkeTOIIx_0O`5{a$fZy(R!qtL2@3AX34jV71~C5F~V@$@l8ecv^d}I_iyNGB*)b%bfh&40YBPIUvRuOeh*_qNw<;${-Je73g$2Y^<-*?RG#0iE9&xBmrx( z^NQVT5=hC=g&^3;WRPv|s@wFN5WVNyb`67gUjI220Wb-i{eTtM8o1-f z(3x@g_0M3gT!rudlYTy!_i*Z$_s{%OhtWt-HL1H00as-(ig)e-H=-wjHjalU4HTe2> zFxhv|Prpg}xzCfHekJq_EVY1~9+vsDEF2^9jpfeZdWnNNUwM?mr;+RIWNxfbt zNs>LCtN*&%TU)FxuaKn~aea_leF|f0VcXo12URVgSh2&ZZzRXRR0Kf?Qk5z3`>Ltd z@w`3>r8jUGp9Wle*rVmlpKAd*b3RGR&4K)Vk|Y5y;K#~0Lh!3=mRUrgRkE&1L(~wn8ggK)i5JNKm%v%sA~jBZw)l^;2tLxr7lPEX^Br4pgsfxgD?p? zc>p^;gN#lhQ@4Cm(prSET@YKj=Q8#8VeEJxehW;WWpq0omX=mnTwG#lWrg*%HQJpv zYAs?6^?Hq=p+TmnrWhR^#X3i)?M=#ofdQhvvhnv5I^AxUjrDalx7xw>A102QNH8(` zN_6+W?^(I~SO2Q*U;Vvu2+5nn=GVrK`&757Pz}%P!%zx<7BI#`Hvdrd#X1U!TX6zD z4a!@7sVcQvjW{Z8yErz~Yc(2;I-_HwOifQwuh%OA>#1DgLr@OymCE}Z{1afk8o|Z} zdgD6wYd@mbXb9bE;i4w8avPoRAOj6# zVg#srb-%#!n}E+ZeUQuYI#tCBDwWU#!vm2VEtnpF=|jk8Qq1}~@vYmq;Xy9|dJ3LA zB=cv!$jjE&Chg5Fwzk@=t#5Ga)+{$}-s0BnS?(3qET7!c)YpFLHzMR}HW~yHyngg$G5bSpL!@OkAZ5d4*y;ueSi=keX2kT7oGTPV5sn-^M61>8aSlB@+6{|P#WYj}fq%*_ieP0G{`gO^-~53u zdA7rmP0i4FZIa~BAeadIvpcw3TbQ?&kT+gNPqwh*186jeZW_3^LDZ-rV?#J%a8XDm zGCtI*VL9o;T~xz*s(mTHxU$@sIEV~x$k07m^X0|p_uOmcSoaUfWm(47<`!wUL$}l6 z&YgKKUb@DGOINtJxXAkYI$K+tbUIt4-EKgDT9%fUxOMwBAD%nM#P~R;Po3oT*I(o4 zkt1~5ZR(8%%~p${;bE^)vRweFDxFS;rG*97SJzO}q&9GXxHc9_&W9)2W6xLKn?B~Q z{BEQ_1W2D&urKC-QM5%c_v6s4C=ukL)PL{1>9zgsGfB5CJF5Cg>4>73D2f;v8Q|>M z(?oH^(C{F}L={ldQ@qZq2<{o5-69cXvQNGeIT7T}Eb^lt)BWy`$gbS%9czIo7NRo~ z#J_T!W%k<+J6arEd>CMPEg@LHqM zpwVcM)M{nKz&X~})>vFzWPN=NM}vCf07-2W6YcCi>t$pDqi=WknW}>zJkaVk6hDP9 zA=U5u1w$T6++{iIT~XK zPnE0<9U>JX<7a@s2y=>&Mor62bZ{V^#;q!E2s)d zQY#oLD|%`>H1hBB6*bFJuHU%H?b%tbUc1KUKKoftojl3-_&AMvouT1jhK7b{Hk(9o zT-g1K3k%%4caJnv>dh$zT1SbZfnH0$@XD8rSz!AKT7W6lbt9F}VY{kRuy!WlFveljd2_}YoH2+qh&Vc(4%e?=XKihb3l}f)@|iQd_S$O*u(i1vLd{-q zb-P_U?KWu!V#Y~o)6{CC7~`V|)zDwR>K|qTNT}{86vsA^2eug_#j6(uSQg7EbTg61 zH3lYuS7LnYuZKV2&O}4jsfD zIDih1`a~b6Wz&d4-B!P7Zf+8N`~mKx^JMpyOU4k0YKHjJ2Z{giP2{)U!W}=1O$X4_ z7v@A0oEo$q!$1UwBh0Zan3=(}n&|a8)EI~j%q_#8y@O2MB$_&cOdrP09L5fgc~#vh z1na33SN*<#{KlpDP5UbRR#pDqeR`i^|KBY2>U)-1?%Y}8_Ut0su#T-6>ynGg3K8rnc6lpYlSD&Pg znAj_5If5+`*jR&aejEMZ!=6>q48$ZajT3+MP0WAsC3J8a*B-`Y&7wGmFUe)l)cKlz z*%swMCEU~ZM%o@{HNV6-EK;^n=!wz%JT9iQ4~|FHLx}+%D{P)XqRpm)H#f?L~2lD zP>nDqFH2`a-3iFD)N2778{D{glc}jG4jnwm%=9#agM+9#R#sN9+F<6u2rmsx(-;`V z+H4!6?PT|tYJZ=~UpNLm^H-gHI~}KgYL$M0a^DjX({canpU9kP?9BG!Zx!GZPb(5{F4$dlZT%*w##6&s5Q%Tb z-Qb;%FvgpK{;w%sc_k_rO4V&`Z81AL%i`i97cN{VBLXO&{oLQ+%*($@vpIzCGf`f< zuo%+j5^ zi_1KMQGw{>ILYt5jQRCfeK+BD3zrR|wuQO@oT(!lTST{Rq8Bd1wQJbhv&hX`u(X7> z+pxNUU0R23N_ue~H*^s_K1DP+4#y_Y$uYRGh*{jk%-uv*mf*v4xS45mW(GGiLpDAM zNj;?hhN{cq|NE)>d(FPfKU?Q;*3#~D+1j$ST9X_(Izgi`K&{pwijrV13)W_IIvcF5 zF0#5Z&(hLe7UplVvN9i5Y$<#Osu5A7g%+C&o^H2Gx7%ecTtgJajEzk*HhzQy2TqYB zb*es_ZD_t+<(FROHI-Gru=$G+U}-uOzJUDr<-k(m{hsqz={^p?oQ72OP+kMzzU{yJ zpH-Gwx@i|9Wr*dehSgpu3NdsGDuNrIg7GnU`wduML2g_}fBqi&?nmg)evTO%#+*6< zufB{sbsCel;iGft))skjbQ1~D+lPt&&Zlux2e6$%T-x%?ZyUa{ZhHf{d=>M(AK?D| z*U8RZ!gjlrX7%&{d%8cohP-nXY1F9y_G_3w_#E!DZ@{m$(Ai~p_Y%B&8S}w8qQMrN zIF5b!4DRGhxS>%bZeWudnAihiaz94JIhfO<6yzww%?eUydge5>`Zz;FqeM|sPI#%{ zQ*6rW>OF4VyuihaKjr3)^Q^8cu(h>Dx7#K!OXr=%UPIUo#5T|zL*7@K7ADT@=;u47)=L)+F$csbv8GNzxH+9*S|yeXCI=o^XOLl{+Ae{653Ab zeD5OBt!1JgT!6pzE9mQ|Nhd#r`|PX8+$z!aIpoG&qQCkk_3k&&g9mZ1oF#qr72MP` zS{v{VO-ta$+(gj(Y5}`t=ea!D%vq9TfZ>rL2J9$eTEubWOUMTyBZ1RIfH-DsY=(h> zK@J~ziMhMixNzaeT=@7W+`W4ZtXKa%;?bK1#^{dW?9tIlKKr@f=H$uOLl$b~>F(h0 z>(B5LBf;BmdKf%^MV0TXfS*brAo%}!5rXCX+LPn2N_7z#it&8__f!SAcp%P_r73Ze z6wbg;`2T*CKa~Kdb?TF6q>i={7#cy3I%H!LH**jsuHvrVfVnxid<}cy8f*&fR+*u@U z#>iko`sS;+UwO5JGe~8?^g`1c_XQpun4q!(o$Qmsm>WTO7 zeA@e@{f5=w7j%tDYJ(WpLN$S+NsLxh_JG-To4*$Y=o!4a>PxZON8#1K;umH? z(Kp0nDGID^@V)L4|GyI@z(9;&{ddg)=(YXJwBPE3ayiK56S@yog+Q(mL>{D)S-_#u zAnwE&^u$Rd-NMY@LI3#Qq3>Vx-fX<*-y9i(dL6yBfyOPAR!ACB3yz?Kpa`^)m7iVd=H-Ws8b-8P;R_Dyw&+z## z{2pWDGenWuW+qfMfSkFj&cEK(J}`YGL{Wd-KldAG87i!p0EPUN9z5W#`2Pn8f*7dB z`0Stu7BJ5bzPYhU8diS;xIGm5{DgAKnZS36^(h_(5#x(_5_$K&v1lCO4$dHxV@N&r z544$(j5OfNBJN-Q5FI#2boMOfwKuTGPNJE^eQ*x@jUVDF%nuMxHL1TngL!2J85=;C zw%Gd9^Vn-kB;$3m)s$>A>jjirNB80a@sF>N{N_#4+Ay}(K%)rN7#b07Dn=W1vg3!5 zr4^z(b40UqL>De2qmyvtSjZE|SEvetUGhpA94PpAM@dd-{;=^EM4sup|nP$$;nf%@u|0eowH{@L$lc`j?@2K3kEj% zs$Zh~jCh1~$?%m`zaj*p;0usG6krY<>b326g8%MxZM#wg)MC6Uup3bGVTa zfB+{p6*J)BnV(z>$kqLdOZNh|v$)^+4Afhg3ybK_uA%Q;N3Z+{S>J%W%jEd%XsAy8(+811`gQo? zX>8oUMFYrPvAmA{_}{mPqvS6!V; zC!0eZjE;;mGV%ppdG*sQ-kam@-Rs=DcbCzzDGnVv$>_)=Nm56#es$H}et-0>%%%F@ zZ||3@ykF_J3x;i(e-*$`_5Sj4%Q>x7uV`My*~8 z@z!dY?N4Ys^-uDh&~l0w#yOTEXa>%JL`YJHfjSt2H0zj&VeCK)H#Cl(8G*3_=%?R= z%eUdb|8ux_n*hxrnr;!jeHado;hKZEsD;x3%*GmeYn=#i!%ec0F_=CCGDJKvj{TQE zK!1LtSQ1=2BfY*vw6H{+uHz&qj*9o7yNYQe_=M9uaoCkD-2519Z~6XE)qd3>xV(T; zX$Dl2Zs=c;D@+(xW(m!A{BJR0>eOmAM#skKcH1OLgGQrC9Qm?xF7HsS)v|MyCz<;I z1f<8)pP$1NCO~9_C^F$C74yK9cmOJxfnY}X^Mve?O4;y7^uHO@I|A;TR*-vcv$V_R z#zqL2l)2KMXaIdA!Qk^buSMK_cjot0Hv7;5Stl5zR)f}n?~fQqzSOp>;dB6P)zD^w zo=%X-DcryQI&PzlBoWEU36j?iAW4M%{#D$^t1vx<95@2E*U_6xm_`ia!&n;Vz!>t< z5N2S6_~UzUYYDrw=~aEeZl%PFE12a)WM}|P9nF%U)`#eZmKvHT(N!Jxs#=_X*S`WAp-{m~6G1T|H0pH*8Vv|5s&gTKK*5)yrvjmn3g1=Af3tn% zFPOYw{(c8wKO&Fe8e7`|b7~1N2#%D)CM`^?Uw}5xU(Do15#PN@VgHe4hw_ zZIq_4zUH4|97CMvOfB}~bF8I)2HI$d%r}W+T1Kx+fy;Xc&Wd(FSw*F3N zI%7%)oR`n}dlQ(y$~<}6u=-*}QudyxUVra%%)vKO9IOAl{yoHTQ2+Zvf+a|ZA|a@! zbeL4n)q9^F%=GY(;JiEVgLhL$+U>Hrx#cUWej)&NBsGFuy^Q?DzemQ$;LX=@FP%nO zO;EvE7c&0x6yW|z)yD)P$mj@iXa?T9gs!#Gg-x`psK&l*mx~J_AdLo*0ONz`r%qwN za0+*K4ZYii+iP%Z5q@|9_wfy~k7r3{TAp!I2O6U^a7m5qvv0zk74+K|pb!8G^UKKW zJm%CXOyaOo3a)&U9!*Be``T;T@BIXUj|5mmeKXS%4^LqZeb}MyXe{yT)qg?6PT$<7@tCih9PML z3!$nLSJbXTwG(t|5;=Vw27ZDrZQyP#p=}Fd3iVrENOl<h)*)^*$u}uV=af8mp@8W;^(= zm92J%PN>IUcqaM==@Sal_}~okJHH9YiL_>*#J5+ z0-v77oIQhD;71>#tvW2M!oU6w@ysNgIf;GkCG0CF!3t5Uj*TSr_ygK0y46M1diB33 zU_h7%LbY*eRl|AYl|R=qMLhV&c@U7VRz$Jl_J;p@Rb;6+-Qr@^rO*4G-$=QdI+p{E zz^I@`x7}BjO5`8g?Eg3}SNy04_um&WDD3}m%$~UZcF%wH+z<br&B%&qhvt6_g+V z`r!wkP=%bswVLqCS(q6`KlKVSKZm(93v=`6zx{XUKnrvD5OU@v+}W402M&hS9M4ZK zsLrY&iVh9I!2?92gXooObkE%+URoux-QbN5ZO@V#^4d#q`6}71CD>G;fjWzGHB=g4 zEb;mxy0U?dBlyy*@a0!vy#upr$m|O8XWt_F#*fjJb^oC232b(~IWpY9j13?$NM0GF z2j5>})Ays*SN=D*sl6Fsp~nQ+?)WQx0F{`$NLcx+j9E#s4NGkgyE$+!)GREtoT?D$ zy{7`k+XwV1y#28d$Gy1#Vob^K)m6V5-lShh`LXsw;L)dR?gQw1Fy-Ie1gHvt{u|Hn z$DdG`v~i3b9fyfgcbFgbx68AIz$ zkSNEyqHzqPBg8KsBfD}PduN&C{8i-03^IApd&Ql_)oQp;y#ePgqu0KJxpEg?S-}mB zpv0()kZy+Dnn!NW`^j_m815@?qumU9VF^B*#a+CGSzSXGS8(kvRLZ=`P#qZ?fW)9- zmgZ()>F9j0Z|I@Ie&meh8PPe5ae3FNUYocY^Y1kQs*wPCRB@A|_RJ296)EaG*sU~i z^5nN(A5InfFCs)nD*~W$KC?X`s7L^ZL3q9z>bds3Mqqz+p?qxi9`nB+#nn<-JAr?k zD&1~}G)*g+f3A2ipXdWQ`Ouwe2rxUpVo5R#FTIMMJdI>sDdOdUcSO*D@OS%qc;^J{NoZp~tU`Z4mYpTqPR^5s#GI%*>{u93cc7W0`m zi9WhO^xh@h^f>lcJ`HiG`Rc&U-Sggj6QlJeHg4jw3_Ur9J8~BN&5U?{j_5DHi@tLn z?PSFrs)*0|-{?Trg)Bw1UMU6M@9+b7FoW;(ey6^FIac4ftZxpM+iW)hN*i4IeF4EC zmlxwGsxlDDOJ+8u=Rfk3o4*34D(2GpDz%0>x0OITYMG@5MAQ?6m++Y(<9D%zF zn7a!^^Y?H+{3(3zCzy#zG4h>viCe>DFTI8xX`#-dbNA5p7Utj>uGR9s0*!Fd0BY(` zSKL5?9-i?GpWlfpdUX-~iw}t2U7&XS6msGf^vFwSE%G5sfucXaL+1S7?{BqCmf{5f zXt4cz8KJbpWt%{VDyy#t-<0|JrQI!suqm|N+=(frFz^_GKHr9vG5kD}FUpy}M-!lM z02XFS4=y1OCzd8v$^4J)`7bY5L~|2hM2}kiEmy9Z`NZ#EUg|-& z6&`P&-~+~Y!E%Zdpf(7HnsDR@rrUw}d$@C#u;(t~Zp{+S-9g&x=;9oD<2r6?943d* zsX^rR(?qYG@TI}N_aVvAY2Hh83l~D&f7T$MIN!B!{vP)n*~R!`5q-RL$*uSa<{Id>7^y z@m+V)wCh)WXK^anEF(?5KcK&b(k~-bnZLL8o&W1U8XsqOf`|)twZjpiV|DBoC(+M+ z23A)vmo6da&cnHnkZ*pEXmSL3{U!8MFC$0B;SauuU0lKa^fFln96yE`8%1Rh)fy@h zc4`Lu557u#`7(0h3ao7)?M>8X==>tO)xpe6K(mRuuzKhH|1yVMxQY4bDlQ0mGciEz zw@>5#-WPGFjw0t4(f4j+&Rrt;*3Zzt(MD$`(5Qhk{#fY4d;ago{AieOMsco-Ru-Mz z)Zh|MTgKUY063C^a=dV9;Q z^>ysEyTpI`O(co2zw$Y7vDXBQfyN-&vE$h05IQvEVZ><%yRwd`5*-*v2O40-*UAs2 zvc;wF&Ijq9X_4^ci$+9X)=ugg*NlWv6xJVbuO@ z`w1R{f?{o_u)j-Zm~3N?ZE3Ytrt7KDTbArL)fHF-b;|7R>s-D35qIz0WMh35Rb_te zHX9o&oH+F=qhpg5O`zZTC>3>Iwuk&miPK}_lUGrYUXx^>*ISMK`1WD}iuvlCZyI5J z?KBNem`Z_jEb-J3x-dxh>H_+WpF;jpeBaZb`!gAMd_1CAMV)8cH5BlgEpdLjbV@!IKq_497bpU;CRiinIsZHlv9R5L^( zc8bUMf7m%f&t^pe2z!6e%Upskn_jm;2uH6b6VroXbP}!(S8)*+*q9HeV;rM+LUp z9hO&Ci~j0yoRDSv(H7i0Y2rBUfgI;l_8`o9suDeIdhp7>(`1$&6Tt=BvJeotLFl|1 z?r=yg!JTR$$4;QX-6pzo6FL78^8PvG`aO&>q<2;@fAT$|k8fiB;qN1#dm9~_L8CfC zRF)rG+a$g|r3tNs1I#c@m=MW7vAwu!S_L~*OJXQ=;$cZ2M!R|YFxW~nU$4$+_?5J$Bv(7WMs4`#*s5V z^f?&|6M(|YPem&UO8+)(rt0|H*J+HpSddJ;FQBXnRMp-B7Qi{5>Zwj?Z?##G6-Guz zsMTtrIH)TcbUr-!uuPI9-mEYYB0{_48$lQ`G#b9uw{yM+V3wt!(dW}`Nb)GmUrgiz zMDFjoJWj|S6z@FDRcMDp;smKTz+~7)gbp__rw+nrUnTzNDt!B0+();_esmGDo+3Xu zNBri?xL^Mw_UMstya?%RVrFM?o14C5*U<^w=m2bGL<=j(JMST1e+T!2caixe%!w(? zS3igT?i<)sN3b$T)@@+Z1~#jg0-$Ic9yE!bcsV-437>obMPP|V`Dhy7#SI%y|u~4 z`YOwd^Nfs)(rgV?5Q+4y^1Wrhss&5(?Fox+dB;zboFG{Yq*5eU_KjIUD)}S~7rdg5 zEOY3(V`*ubI7t{BY!Sx^s$lKIHQ&r@v?obItyZJkO?``|wGCERH)wad7!jJy27`kw zTCD+EtpRGaIv}AF?9-`9xOcU`cc0$B#hv%SNqtIfj&92fUwHFCtn(#XYQwn01IV$% zm^U|wK6M*2F$#x2#$B34FW*G2-a^h_fwe8X3-cep2j{P#Nrb$49P{N@;O~8j?C12~)n1UyJ1rdF#F zM-f?OnVp^I(#0EGy?UGVjZJK3K@}4jhK2_@dh8%)&z|7$p{dXbR#5Fe@xr8!ruOd@ z?_P{Z&*~{571cR>V@?-=jSz`(MA(TM=0BSx`mJA~cHs*A+izfhd;$B>4cz5_h16<9 zLj#ysjv|SH>vu6O!>p|n{nb0fv+JZE+#o4Pe>n-eCCvjsVSO#$I z2F^AD^CvhLc{P8RZa@#R|94{ky=Vb(l2EJHF_9rnSLk+^X=uiMYT8yNTUd3&KR^Gf z4m-cm=Eeq>FMY(-%OA6{yhO9rWO{m<$*C!#D8f01F^1-#xBJ)E)>&MfXJdT@ks}xr zJUj)%mvG){O7C+3ptJbi(R5U)?X*P{N7Rx85Ug|FHQ{^}Ag8`S==|I~h+$@Cie_^F zV@y!dvx*?-zhSTP$8l1$@m^V3TE`X4?_tF|ulf(R;~$0jtALQ;tgmwO#uYA}|A2c7cd6HF%p5$(==eBs92de%L`af^dcBS@!s^Nr z8=LDrNj!e$NYClEhxfflPr}>2Ji8}N8PJJ=EuhgeRN*2bV~CT4IEs)U1bl@Q#X3c; zV|8VfZdj!!CdO$D3=~YAre=q(!4*fJiLjYvX=#;f*KYISdl$L8u*6oog9+-en4l`F z(CKz*&$U@uUS(r_lfl6zM~@t!UXQUhD*#ISK_$-nQTE;2WZ(VxQqef_Nt73+$id(S zRSP!rxcs36^Tlz@XI{h1-$OpS3Ljj-eS8x;zk=SJM{mseIxuTnxEl*Zr)H2>j}pCh z3jOq1vcpqk7~keAGdP#vGSB?ZCa8-+O|bXNaeB}=>^3gDjluoKt5&ZwJTlD2`Wo%_ z3Y+UUh~k7Onk;+x?Q~6f&Vu%Gn1~m&o%R;DZ(il{#dFNvxkVHiCMGADn3$k3Ft9E1 zWQ-xH)rjMmt<4R#HaAdbeG!;qGk?Auz^4S>QrWKL_pFh-gQ)hAQeZ1q)isd9lOla$ z%9x0HqfU~dBKH0p)QwA0`jW9YQI%-vn! z!;da=_3AA));8&OJ^07R^e#8AU&a_=`rrX( z4jv+@)wVgBt5Jzst;W{Y3Z1Pjy4?=-9&lWK&w}Q#Ugu?~r!ba51;`PU+kF^iF2X*- z?>nlx7K^Z;N~Jld_PjI3FxVPowZ6>8#zxTy)Hy9WwpdjF9p~KT0J$e9RBBIDXwg7nA%)dLcgzt?<>gLOcI6{7YUYycHc^%$2AS7Vw&=`b4 zi=#`Nu0X8@wHWjH6GWdq28|dtGW5zFzF^ylr9v ziWQcZ=9#^9m8)0JGk50}Vua~~2bq|hqTXn1TZgOH6~!^NdL0p=(`mE0u|bm5h@zw@ zmoK4iL0&n{hz|jq{+fO{%s1aY#QXEYD*evOeV|QXJ_fmsZxFhj0{n7#WSHfZLGCRs z1*Q)bQbL{fyk7gp<|gaw8_X}E|C3^V5eJ*= zn2l9PJ4htZsAF4$xG45BN~;X&!*c43j~rxz*bXeLB6F)~6v3xXqJQHpG>Oo23%H-( zMz1em?yOzA4OmN47$=GzIq#T{wmQ=KcN2gAHv88ymp4}>#x#1avT~% zIAR>W{8%|&@__ro6U3D@5!AG#XvdY}tJx-lIMy;0k(3w6QIH>CF-)%DQ_Wq&c z**uu}jZx&zEb^y+4)48(ox6iCM0`7~S_G!E}E^S`T6H|f!%>)+K zkVW5J*foc6%@Ncoc3=QkYrqg_a~K&LhvP?)JNJl|*D!bQkleb13=HB99U^_@Rno)9 zaHhAJ)K30@{bc^#wn>tNp`jt<&>@=5CM(NJtgWrFwRMkndyTb~yVUCgB((;$q(&4+ zD2^=MVryfK_4Q?Dx9x|6>Y)d%&d_I1hZWa;a=n?^GEa9OU4^gRHHs)9rTY zcDsS$eW6AT@16A;LB3K~QC6yl-JmBIh>A32E#T8_215>Z#8coy;pxq3Y z21lQZaHG@c_%ys`G0SVj*KQMico9CjLUijc(c(QAYT?F5am`_nq&)sENk99&^6#`? z9LJ1}kJD^6X|`H4mzP;vU8TLXMP}F7*jT}>RqFeT2e-vh#K1tE;gJzW1M}yhzP(+vLao*o!(1P)+DZu&X>h(N^5Lf`t$G}IbEcBnO zEJolTaFWy*9v97SX#Qn+}u@GmhO~Mg)ji?>zgbst$2+>b{@3dXg}2c zM_u`QJ$JBrLJ@m_8#*H8IlgH)vT~QUC zg~erGt@!XHZlLKkhRonx&7=BkR5%$yvGs)PbCKI(#*fj9#0a+#>N;P9wtpw(oToXtu3~;w&-*^q+JgdGjUA4R%4*qWT@4m z)@b-fx5n)0nfCi4;>g3+ZPumJ-tx(Fj%@-UpO+$zC@KYXk$d2ROE=FBRPPgTc?xi) z+@~6rpfO?06s%l3I*m}q5FCW+d@TX1 zAcoe^2;<`i86KUX*&HK|8o?xRMZSSCN)&r+Qj*k(;>2fDA>6xn8*6=$N>!!Z>9Dc6 zNoIYrk}<+w(gU8A+P~vI1laY)D)EQ!!uP(9{pccYtFz0+1NW9N*REr}u!h7bbb}wD zsLbofTbzUWMWo$9P9B8D0BS>DKbxR7_Q<}fEiVbw8_2*QGG@_{VY;IuAO_oNp^-r7 zW~@c{YVTw4pt0NQv#5T~P1PJNXd4Y0%_eD@7QnO|#TUh~2lCWv+j?B?Jv>`YC^A@U z>9pISc#e`~y6yTT%2x|cYyApsD?R~r7%|lAH5vm$jEx^)diprES_@U*26YzeX4D2f;y93cwr$ksQO$=18x>;SAyLwy3D800hT?oZEy+F$wPqaBffjTNFF z{s4FGBiu&&{ug62=ynjgh@^{)b_*hj~ubeZ?3b1*q5WdtCPz*HzRUj3Xae=ypgm zOJ-fr0II^Gx@tpiYUhP_M2v@gd)ZnD3y%O*s)hTsVjeuA12E@zjl%)Dz=nEA@GcxA zMd8GxR%c>zie_twg@t);-MqowJ9A{~YY12L)+Zdl61 ziM|xb>R`172g$N&M($0LcH6Yu>xJaDS;ofZ7HOIl4`sK>^8Bd%o=Lr6Rm3>xY@s)A zp-U?de1bAqhXXCN4j$EMQMEn_kUv6ap}mD$TJ`+~j!xs6O`Mfr`-g;{K3sp!-CE?@ z=M6wY=t{*KtA(#&?_;oE%>OXhjOu*Y&+E$nMkWIFMRL;Al4afr-ebF)s%e_nGF0;7 zq0Tw4!377QL_s5S>J!1FcdWxvE7!4SfRF<=@H}5+QEUK9z!2=57f_X6CSbDTq(&4) z)RH>mTW9p=7s4=Ko=1}K15^}TE5t?7* z=Z|Q%2AP~Z#OCG-TU)C|daZMo_EwuT&8XF)UGMyUYX5^K*nX@1R4+ySeM+~3yEcbd zOMGyYY+(&eZSP|jh#LlTW(xP&lQ7iuIse-p7?_Q9qPusH^>y4(6FG4ZZ8gD#d;;}3 z`~;@FPypKJp`wsQ(r!>Y66u0v>XpW z=q{8WLxP{o7YNBqGK%(gT9RM_Q~^T0g7={`feg><8&C>>RbUo40MvGOqA7V%tNe3g zpvi%QO{QlKvANY|b!C;!%}uh*VWJxKdW$HkVVxh8EOQ|uP)(aGn;aHU({N+e%c#|A zOiUeQaq%|y?%l$>p#1~tbh^HEd2Q#+u=}n24^r#*U+vF7``-YhbL8Lkt*I*EMgH13TPIMYJA0SuH^9SZZqEH9H>x`b|S!oexrktwt} zfLZ|;`~XEI_H{Tu@$1wyb_2=t-|^Az$u`UkprUSEY$04xAkfY(GAtV;B< z9$BuklqdGT<5z9<3_3D8N~<*#>>z@j52~(E^P|GZs9tnXWAcd=LMB={moYVlhsS9) zhlou~W_@*7r@m6qZpA?!hWYoh@;{6gu+ug5Zks#c6(T`K8%V20^u@EpzjYS-gOAC+ z{tKIvOg!qWv@Welin`)Hp3hi0-zIQ~;%{xBdur9IRt%rY{oSPQn=_fZ5VKD4ir ztLrY<`Jvv1qYwz?tK#9$|C6$@Y|f9>h`=69fexP67oZdX*MXk^zX446)wtKm(C_KZ z9TSCOD8BHaBneRz6In-=`W4^bpm^_oWV~}KFC?EIF24~M9D#X1`RXaf5XVBZHON47 zkoEPY!j5(}L!EB3m7bK^|DXx>AR$q`HdPR(P)jh!rjdJh(bX;ZjZY!39K?M37;L4O zX5ve8f8i`{VhY=C;%q%6>;!eb7)wR&&ZF;NAR4N{u_>(`+a05?_ndHB)al4roXY)Z7Sh+MvkyFN?w z>#reak9hmj5$yh;j}~hF?)Ouw`o%AM8iV~{vd4+gJPqcD(s}Kihq~J=7XW^&q*(R+ zH_lLG)aE{bg82Wq5I74JyG2t}wj-{%g$W@`;d=R-ecVJ+ER;v}%r?NhQs|c5V74=!E z{SV$RcX|qLV36#M*Wo80As?J0`QarP9l{-(#yNwtQBd_GF9d82m(@ZFZ^!|Nz-(?& z`|fv$e)MCA4B2O2#=U+TCvj+YF99@EYD-m3>3*x~(`2%z8KHR?0a7KQ(w$hfguRD3 zP%P$}H!4*hg%N`d(I2C}38|mYeLgU!zTQLlE^im^P3jW!(W|Y8YuiB}DB1z$fvzCL zl@Li6SPvhiyzzd7VE+lkJ1=s^Hv#S|z7tMv*Z5iu1}fM#A#Cq*i6|IRoY9KdgHNBqzIqZnF^;;bpP+gTyK6g7 zg83iz7`u(-UY^-rBQ%e~{6JXr@(?+sX-1Z2rEVv^ZNBnCpw=nIX(-EHoQa;aYt^DX zTmN#L*ARY4QoIJx&99~EGSBdmVHFt3FJ-u_w*UZ1Nl8ROR3aAuJzmHBLZp;%UK08b zDjFC&cs{5)H-ZqzwFC!Fyb#G_p7|iSzR8(qM-2=#LisW8q!KhVe=G;DKmNOy3AUdT z`k_}Mrx3;1(Mh5&d>UCU5EV)Um(%|YZ%kclZIYNAmB#3(VjK`Gr1W^0r9+7*%? z{t!O8fR4A2zy3w+@k3bSA-~QUZ~N09#@l}V&&$fc+c@sWH9pLKyHTzI-7lngrn#ox zCnx6dJl@T}s0x4$;77n~z-jUjW?w|0Gzlt4-qxWt02_?2e3IXExsM`hyt<#G0IQ6k zT7e^0BL)7w?-9@_R(KJJD~&`R)={_T2ff2F@25)cbz*8R)q^Up1B2-4)0n^Y*DzC~ znD;IrKRu6Lo`vHdArn)?L!*$?&~^%&n?wuuFz$q-$ zwV~u!4~nl>x!ey2=%e~h9>?MLFvovvwZD&wQLH%jyraCgsi&_IkYfj=NZ#syRja_2 z7eplxklSz7klzCnf)u!j=kbmF%c=m_1bzVg3h?_qH&}WE`l16;Mg+pWiIF0mG521o zsi2y2Pp8W@hTQX+58&>@T$mws-z0>J!y=A-+oe|}PG|K6Fu-(Mj}$3lIO z?w5a+l6n$^3hD(msxs@g$f(?2S`z0vOd$COoM0Mnc(-J_c8y;`sA|K??A- z)6lc8>I2ZgR@E@_gDJ)H_6;iSd}E-xQl@w(;0hiPWO^l0#U9W75CvQ@Fg|#Xw8_=@ za-}H+K&~3~O1u&xTzv@r$R>}xs@0-!euohWJqly&4n;xlXDdF`^b{sNhO92)=I79Ri?F$Y8>pefEp%*{Y+@8!Z~C@fX@tuR*7`dB>hjWI z62?^Sd(FH3_B5HlfB%Ou5gzo+9`^hXrW^|pOaN21+bY!i;N-5}Pmw}j@yC?E!*0wi zmF@P>Gtl9AdX>QZ`93=V=NIvgf)>#1btd%IB+DIpsv*1_Y#yVE!%G8G!i0R$0})DC zaJagPEtC&faif)+D?^YGaUA7CjxkVgG>DU!terj71bbXNc7N5_Qp&3ukWl#3DVkmT$-Aqv%SgQl^|q{<)6<2vW|bBrI? zG}-N$-S7N+B`qFWzdfJN_h1@`7Z9dT2$beP^;)F&1iSM1P7v;G)W-AlV*d|234k0H zd< z8bj)WhlU7Yi&rdu7$#>OTa>l;P6D_{A>k~zgXP#YSHhU&m#43Y87UaQq;)ax`F^`fYy zF^0$(Oca%WbHNb0Hb3aT_k;QS_jw$(|6#A|QAz**?Y;Z6B-wG__sLWJ?!NDto!Ob$ z+1VEsj|D)24~Qm6n<5P>%pk+EWZ7Xm!gknU|KPvCKll&u5BgDL*g=ITQL-q5V8D>c zAOY|p5M)qtvqH zZ|2EVrAVpvin|bO-x$QcUlbJsv* zp1Znt#+ql``|^9>veAyUhkvu zco`3ldhD|8$1VK%x$^%OWVI7pS)jv%OYUw3D>xpN@wFwigO%x9)emw7AZ5RAj4c~H z1)8OwTjCCcYn#bSb&&fzs0#;TO;KFI4-0V?iyn@`fHcLm3$qHK)oPZ^)$o<`{0V|t z)qM{$nA0?6JQ|V2G1JME-Q5GOUBAVZYd6{1-D5ZyFquw>XEAXSyEf@5X_^$J*@E>E zK1+UhFLoZ4d3mB=0pZ3%c2MYP-Ym~O8}!!^Y4MOq)k zgX8e-QQfSgp5sKw|Bm|X)*`~>9rC5`0UrWhrZNRDcLyYo@#mHR&K(H8mpNR(`z|?x>X`MQN0g?StqG_~qtUQg zfk6oHB;0^^OZZilBuSV}r_5$E_V@bSy|c~r8@IT6?It&G-DNQ76UQ?&2LN5+Rrm6> z5wg^7r@?1dIi#+lb4C;y>k_nDbUGb+y)GMTYpkx=wr=fqn{Kbi>gp=%Yimp=6NZBU zt#+GMyG^szDq%0j<=2B|{^LBaMdx^|!tcnp%X10wXdvi<%ko}$%>*(qznJF)NL9He z!uPN;Jx9wFzzFyY;1z(&WeQ-31r0t0{PLm$s#d^Z?tnYOMFhiP%)?6vdZO zvcj)6#abmVkSbz|v{avvk`>EIy_ISgra0>%wu)#l9B}9EUEX}_E$befKFx*m=Q)4w z9BG=ezqiNQ`Z^n1Tl7}u`!gOz*&b!zA|4<1?4E@1`*}}Yimyl%R9LEBr}y^@i}x@A zFIfW*sRx|+d|QM+BS`-ZX-)ySftX?!4&1;Zh?_^f42vguh6H>H(uNgmvQUnmE@p=Y zS|+UYlcou?S&XXEYBlL}JDA8?0E^m@ADvvzb!>Eqc8Uk+T4n3IEe(_E*1`q^b4$r&D%!4tVFC z``o&{&1f{Wae3E*ORy-s$xL2E!us_IX=V_y4N{Z@$-J_#3IV@TGb?J^YiJ#)hmxhV zveL$^Gp4f{_wLoyu6_ZKfuaxejN`40V@k=UI)GiJj((Fu&iuY2x|CD zsKVco{C8}bBP|s?ES`{XFpqB^x^8xz&?3N#k=bz`&^Usqyw<1jvPMbahz z@CQFcn%Vl6#?*rGZYeCK=UMNr*1BK#NvpV*91~a|6N+yVa=1aRa9`kyBD@~Dj#a90 zI9WpjRZqP=P+FjxzmYs8AW33ovk9u13r(%$3ZQr{ zM;id|w(xsQBaUMx;|Y8FL+;)`U~hjytF_9?%4r&nCbe3Vdc8rdRwt^}Fn+Olt^^X2 zWJWxjGK;6oW@F;nnCZ-J&!%Ih(-D)&kjZ$+crs)<9h0Rtnxc95rD#HtyAm?LvNFpu z2E!qv@tDbU$}EoULKs^DnpUgD%Gz3P2|TK~|Db30t_VL4J4rKC1ryn>$$ml$^8h@1 z=W&4Wy2}={KBV*Ss&s5)W%tTqy5d0!V2sTnzJskI@}T2^LJ2H-5OWa%AIWrX!IEr8 zJNskHE5~unbZVEuw%cu1R(cp?NRp&-?tm#rF#Df0dhPewEWViWWXhep2Mk6jo$fm8 z>(8*cd6u=c)AV}l)as2~ix(AUf^_T>e=}yYF@wQA!@(Z?{tgER+wAS#V{i8kd%Jfz zIM`-99+0>^0{cqx;uPLZu4{eWl+f|qGA`z?rSxz`eil-K>K%ovs*LkooCUN{pcflG2j#;KU~jd=vze_apD5#L#OCIU zoIAfoyWOMN?9ga5sW+OrNgh6xac};_gdTFv)z7%-r8waS5ILi%FTR>Hm3pqf@BkC9r?vnp1;NjwOZ3v zPg=zy)eiXwvMgmV*ysNJo7}tm4)^X}=ia?{*x9+m?(Q9Sckj_Z*kLjm=g!%(zKcnc zu)V#_J2!6R3SijpGa3%*J@aCC}h86tH|)W}2C#dA7(9Pfl~A;T{G z`4g6e{z5v60vG{*415Im6^;-M2&p_+!`Ul*c-7>ge7McqMG8}wCD(4Z^U`1*@G3L( z@tFN531azL@=20nOoPp>3uM}LNm4~2m5`sIMmMF`SN$!-oE7)9NG43HcC8CS(8bk0K+fYbJhEh2Ce zTT|>+pncREDI=m`G0J&2!5uZXZO!H4#M9}N>2ylREmE<_bhgk(eb`v>lZY5BI;Syp z&?^^Osz^ z`UCd&x0gP51^R;l+dDfpyKppO*zc2`K7Aw}JSxARG^JTaoY?vkQBLY1)yZvi(&GzR7pv#N9?P|wkuz?Xq7;JJroT6rsCw(nDQ<<0JO2V>>5DQ>?CSE<}u~#Zk(_Z`WZMSAtsnpfbU+ z?u%6`qPV6E0ov_0olciCXD=|FevAvxy~6tXDNdjM_gudGU2fgH%w#fN$h$O68IDHu z`+WxeKJ9j!EM06d9OXGYt-=q51(0b*J*rcywLnZUVLgbX5dNdnax6iF`&b!$^QdP# zjskcc_#E&V9zg-v3oX_}`w&w>Wdt=m-ghCIO=rwzQ_h@uhE}tQrfD9|3h5|j|C0m_ zmz~GfG7wZ#L?(zdfqKBN2hIF;g`bg7F%T#O$s+{fIi)c20rACj-tpsE;C zC#tmq5b$uy`G0cAKiGC(pA(VSkNSnD*(+EfIlClvj=UzgXdMNMKqgD>h%|CHQQ`#oaSp^{nvc!TYtfLJe(8o zEKM1Y$2l;YFHe35en05gcavf}7bPv-vW5uLwW*jMNw~M71VS z)O@f7P-6XIk*Gz-FQrVCZ(wC}2#1IMLOPBG0JgT+=dp`}eu4*pfeY{dA(eoLEsr%E z4w+0Qh!NJ-R%tYwE_tO$RrUYhZL|NVgE@*K>Wv2VdPJIxA=^iyHn8FzQF%78{Loyu z%ffGnA}K5am*Q)!gyjoRifeZL=P5ea;>wk0Zf!xk-R9Fj^I5vRRr>v1-hTV_5+-1b zq0wwouhoi>#1VLRoCwX+KxvW?#|dH@L{SrCLWM1J<9R+6AdK1+1#NuA?C_We&`0SY9&u_T=zKCfTc2dz*#UGy}3H|;7lgWfyRAY5@ zl~%L4F#LB^Merod{s(;rpxJEE>2?u;EZu|jF1C?tF+hySoC^?|{a*MZV^@9^FWZ_b ziiBFtzM{w!pG88gX534NY7o_+7TMyfrQ;%@UXNH?UE`HkUgK~7;@{)N7e7|ImqxwL z*2V@aD=W56fWtT*#IN^~@B<{NZ3G%cO=?ktMS>T)abnzhi-oguG2Vl3=l^o$5o8p) zI$ExuhrHcvHgA3Y^Z!ROnLIH3pVN^ofJy?$TfiRyzlwDS9+?ia1U#ymBnbxx2P8>M ztJR|2ZrdfYv+U4WH)rufgyl}!>|b_W^?IFlr^9GCB1!tB@eXJQQ!|L^1j1i^Nm1r2 z5PoCIQ32x7h6f*0x(8cSy{mtaW(IjM**tuAGh!?JLa%+7D+&cR=Y*F z*CUBzhQkr@><*Y3^~M>DX(E#4{(LdZ8%$&ieHs%AzacV`y9kjfLV%%3X)nULVc<%J zXxhz5;9>crx(B?Ws#m77WYTOLU!0Hi zjY>pd0Q@O%4%Wz)FFxtB2fYCiB|*x2p9$KKqRile29-fP0|Da$e&=A2FuF*KU1)a#wnF`@9!D}u6; zush2UtVP(Vbs};~fv*evDatTh2zDHL6rmjfU%*BLeim4Nj64Ut1+b5ZI0ax1tpV^T z$vKOTTlV?Gn*GZZP_x;D)m6shF-g2nJln-Yx2&)?H^>p@09m%m0EYoUt>yv2G9KWS z00gP0Ze;n(@h*XP$1ICY@LtK(5YI;J+`q=|_7$>tkIjvBI^7N%o12_DdzMbOyO0mZ ziO@Waq+S8cW{7mDH&&Lq0Obi@a}1zZp*z2hqx5~3&AGrN9sqw}jC?_r$-~~uLn#0e zA=50wDuLI5uL|6wQikTRud!v6j~olcw8)wPlZP^FU;{=?4ysAhll z8a#jNjRxzRo1|&V?#>>Q(JjO@s5Mp)sUyy(my+3UfxajZ_$Vq1f1v<`dDJ<)ZX3?B z%~sqqcf~I=Rd%-Ta^s!1xpD1H_IB^ms7IWB<`k=IYxGuD=yba!)BpV<{9wzsjYlIg zHMHAn)apJ1(00fyCI5t0|AH*uYJ|r>|D|M4y{*chi|~4u=?I|l5avHTf(780=PLS^ zAYT;Zd5)m~mfm0Pn9dJ|*(_!-7_hRk!rIzu?vFhR_;(V*|0rhvBKIY8rM0@xzB__$;d?7+yBfx{Ar7`*EBh)mV@%yv@LOoYdw~xl1LgPrJBuxUpA-io zl7M^}60AF&id-xKvCrJH%pML*9R z&pn5VD^QIJR45bS9-?0|M!qB>lcTOYJd93C0i?h#77+YPY%{_WBUNQE=rb7f>GgWF z+pT=@&v8xhN1geXMI9dWTMrvCuo-xUW~)WL-mpICY(Nr^$+Pxg;j$8cs$yM0ITB!J zdgE5G83!!7SGaAAJ5I>5gwfEZo3}e1jL-Lf01uAB=ckoC)-)Iltoffpt8<2CYct1U z+>wEFyH>~_XiC6RspnH?ISNQJ?g&d_F><7(Dx3@Nq87{0c?JNF$T>tl6XdzC8g*| z9;*+u!6E@HDbv=Ia-c%Vyi~v%|KJbL@i#^NHjN zxR++W3N0>kuUJH-3Yz)f0S>*a`AoGCkebs0E(ACp4;c&&EZ+}-dEZyUuSz_f(%;`_ ze|MK8QQF-NI^DC>o3_wu!KT6mn-l)hK9A89UoYbar3aA$w^6>9sr(Vhey{iNK7W-? z$^{5%4E#%M^`Pk^o-3!pV8C!VVts9uPN!YU06gjLGgXuQNt^wP?#1^G05G*WVrp0y zAS3q!s3h@ZMF_7r?R@U3$(__7E?vnlK$KgzZ*ukO6SScd*@sKg|*Q3LgF-vfTgbbh>n1hFO+nq-s;uG*}Pd0jc6axE%Q4oT2No ztkm_RSP$W64-+oTuN$8N-Dfl&qco`1x1af)7BQVnY`wn)Sj=&F^i)tVK2(+2bjomG-OhvkJ;sw6QGJc> z%5!v9E)dn4bI+rOB#sS?!Hki`%adb_@r<9L=`|#MR1~W0v~(WbE?`Zz@yQS-Q8WTUB5=Ze_)vyMMP0VRI5>oBKxY<@;>c(G}b@dx#Vii zar06d%o4wL;q@)N=0{6>@!zurCt?l`4%pw{BaSm#?Nw^^F2*$6>|ZE>%;oB50Ult_ zRqj{kc~ZOy2e9V*{BgE_K%eW^uX5$eWqO?sopy`yWWsPbM2y7)7V+Sye0;Ylb9E)t zG$l?FMuP!+ySwacZ!?)psW(>GTz`)4%5yZDYu@=H0O^8t76s~0knB@hiy;LTQ1E@O z2F6uEe$R+}CrM-i(Cwb=oc%Z#@VpKDHnyL@C2aMeW4Rn6Hv4aPcbDmO%B|bC`K{mj z=frVLqfuvbYm2STO}0**;?&j_r%#_|YjcxUyNwYkA_alF;4OrrPM&{wmg^P)FSeyp zR{3!!3W4jyJDoB(IAC{YhrQh$#*+!n)@fGOFH)~GH%oELS zY_kA=c11=8!vU8szs;RHw;2qFXqH(EU_9pbjhmc4bB6WJjU#mcdK$?tY8o>d4jJ_O z3s;9aRm?nf+=tViv`rN#Y0-hJ>P5=bN~K*#^W)A!GLdm>s#~>4yZTk z^m@JgwX(8eU%j5q6==0+Hk&k?wlhxK6%g^SZnsOb)v_~}2ifxH>9&tx2`sWMs?qq8 zQtz;Yk3*t;0I+q9?@>MX|~&WIk06p z?T~=#WxOkJe$pkXEPGFJsJ+#+1X)dXNT?G9rpJ7T)6m2UOfMC+TATo zR6{e{f_>iKUzF(M>oK~pt1;!pS)nCR)Nh;tzb7J}OH;kEzaOXT>yM83FQUh~gcl0} z{=WO2k6=@Uo5wjp9M8Ca|316By9|dz4i5IM**OyS_V!B0<}veTlWw+AG-J=?^RFj1q>)`e!4A|@V1`8FaLcbvB>pdwygnW$Rf^s}+6W01Pq z^0V2Di8HAuZmoHoBn*cmB;-zO&s+0TB$)XNv)`zqneA4aMG`FEwRc!n0?VoB zW2Yo>%K(`}_MCV~AsmNvP|_G#-!G+udb#ZH<-HRXSbUufcXP7Q~o9D8l{( zkDf6;XK{r}*1va(Hc65^kAFIyGMP*)wlW%7#p^7A?d@&exp|Yj_wJKvjhA2jEYDy1 z1oe7@EKBpA3n9OxGG_9%8G-PJMO%G+hOlU>`#%+tH$~+CX|?LVKbt+C%vw*6TLCB* z6#Q%8{{;Rg;Kz=0f;hGoz_n{vxqbTa`jelbhjL)y>cliMMEdNdb7^Qk5)88BgtC+}Yb> zZ+Dm7-5qvz_h`1(c;Uq#qt$+fc6+VFSU>Y?KF#}TzBVN23whYG>0qnMrbLk;Q(+p%On3L`4@dO69oAM?QB_8xk*h&qONlpIEm!cg zp1*3fTK+7&A`Nkvl7^}-lA#=_NuBSWq^WDLn&g(0SFZ7F#%wktae!s!_@5+pb?N=> zZSHSxv%Ry!-rk-CoJT`Coi#r4(Vyh}`Io8J8>OnsKK8#n+$Tj=Wv&42=SI9+FrPD^ zw!p`42>kW#?jT-WeI)$+f%MoEKm}R91$+f-0c>J(1QzB8coWq#Yc`v4|NcGh-n~n| z-=|)$QH#vnz^I-ipLJbb`Wej45P}5~8}+*FU*}%UU^{>L!CSA>aAmx`C2;7>77W(R zUyl?1)D7GuNr-1Llj(%vXvAnVVmKT!91eNq)r(xX_z61QO~gc~rupE@*&9RxJP(U1 zK1C4^dktbOg$3Q0N+D>my$Oe-0SEm9(lo&sK{1%rkf^=xSv+Gpn=%*<+1@S$z1eKg z>vnT%pjNB7LZr2lB~_h0{e_eiLe5Gp@lyk3nq^sD87d1pMa8ojL&wk2Xq3I#?w3&^cWf+jBceLI&~ zzp5%{pxLw!v^%hbtu!tL94*x%bj zRcSSkaW^Se!9N}0I!FX%JTNf2K!ON2$$XTF}{Hztb87s@O(#$7f=yX=Obm^mf z=tDn2yWO$oryG2s67Vy=no!_FP|ypGSc}AntNFhG0Q7^{UAv!Qeaf(^;@gEAV@Q&O z;c&?Q{sE}w7FDO+qTA`xX}77@YlVMX>4PWEMF`!jP>E`w)x7d7Sz9m%@`h>Rv)PRP zV8CE7pznnI;NZZ`@}s3)r8}J-=g+^y%dh-6n_JJKnj)CF#Hs45D%d7)2l6!-ZuxdO zk3jke|3-{_DN`87;5Nl#Bf!DCzFBW{S*goj@xpwUu!_kON zr*k5H;{z!K1P{AEf3YG(W}*m^B&B0?!MXjw&duP`AsMY!kBb*S%!TJ(q22Bw66Hd_ z;Bo_(pgmg!@4}iM7aWpqR0uN1hbs&avYCFE>hrpaOeNlq8fGQa@A{5 z?tazkc7M%hRVs;UlwuLJ)C`0ufaLW`hVRNagm&uF!pY;J7QY&Mxp#w1DVW+L(y;>EW8{=&Hb z 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 diff --git a/docs/imgs/grame.png b/docs/imgs/grame.png deleted file mode 100755 index 0a365724be6afcd5a03ebe69d06bd165e478bb19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3767 zcmV;o4oLBdP)%xKL7v@X-PyuRCt{2o$YaBsS<|4wg2TCfqf&eHv(%S7;OZjjbL;m7)=DL ziNJCMYe%qh1S>@_at2le+`{wX!oc~4hI7Kc`G=KaA(4nl~H zQfljcQUFrQr4V8zgt%$Anv)Ph3vfM_2IbtCy!fP)T6EvM51M%vLM%(ExKc`Ot+y>i z7vj58Y8^PvWMs19lTu!y<-hYjY>&1c3#HVK`uc6)DsNj@?K+;&n7r2f4MWJ3#kcQi zB|`kJl-dW5Cr3)D`*Z(9`kiN`)Z9DDWZ`0pk6lW+i6}hH4*f<_@S8CQPVVq*m;#ub z<%?`7Y{;#KlyW!FZLZ=|ZdaO_rsYdDuy6-qlYrk!Av}@r88IE0l=v_rn5x1G4DnNu z^0)5rteA{U&GIe1BXRjmaT6G+P5oP`pB2-<)Wny(H79aCDXbD(zRXNbd?{T{14X5s ziolr~COOrRn9GUW$B+qoCIT!zhRMWa#78&@PGR{-tSbg~m`qH`@==LzN`oQX@5{)P z#JBK{q#@~`4y+Nyz>y#t*kLMQ@$~?!3{pXMA3WEWmq~~ZVz}}?NJq-(6G}l`QHIPh zADKj8wUqKmEI!R2u~Rjm5&7HuAT0-_6!-lyFnY^}B{I~)(`;jo7UEnvQditywLe45 zsKtkTCSSb|XqaK0-(Uga9J`DY-{0^o8A3)YK2(-_?*m$Hh6>OUUd+Y6eYj@<(lR>n z>B=gld@MkC1}&O>pMeYX@s0%u&!7eP$dm6hjApAv)q(+;MiDDk1iy+tvtuSp79igjqi39h7@bm~Jp>ja^gOv$dlwAHvJ9?_KH? z?k5OuaI`!6ggJL~{h^eK61$2-v$=v2PVhpwPe;i6R0B3Gq1ZcN5o?(VDod^~rsr6~ z6Tj|di4nvcELeE-yjecN0O$u)vZxSQY?uGW9%9D^pg+A2(vswzFwGdtN44AQ+B*^l z>Saq0Ddx6t&Ij*xWK_uzeyj?GBV?UL-BFwI?@_tT1~YJ>Qn|? zc(5fi7wB|T3~i_0D3M|##-!5>2BPT(9&E{s>GM%+T)#jVTXb+V$0qi!s`qjbz8295v8!YhXllk5=SHNgr2BfwrRsI`JUweX%}S?Ru5jpERE!U=5) z!;5gyFB>k__rz9E3rD91T(`A?$cVir5Z(!WysW}A416cL0r{PUS01%ngh3Q5toKW~ z?C6A{Z!M~wUEy&JCf8-^e3u7Y$F|hbKs=8nN>u}7a))j?c)DC_#b<+;ZU!C9{~KXc zRe};Zm?W@>@-QOXk8Swfc_#)=ZaWg9Y>tV(+q&Q_!A_W?+w#h7rWB&?ObZci3)_SJ z8JVP6bWBlr11>|*6&zauQzrqc!VH?Q@R;IAvYrpA=yD5C3y(8%F~t(q?R1e+?lQTc zIx82&DhGz?O=|I7V?>cMoqM!&^bC`dq-iA3*P>hrpxLnSm@$yl@`*et(Er2YW5z)8 z1WLr&q@P%L%vhkxUPcv3&ygL>XrK}w)jS)=F*2iJYT{#<(ZES_8731`6CYbxW;7(9 zYA{GClmC!XN_qzwrcfv?U+U?GC+`Tu6bz;KQl~NC#6ZlbpmaMg(I-n0=gIM$%;+Gq zd=N&eIL|c;j~N?emd}tN3G6c#@D>BME1M$?qn#e{h_V}!*r+0ROB2Ubi;9uT(ak{D zJ10)X{YA}9Q?aF7?KLA#IabE?y|zfC1uscg0u`a?mvKpb521pWvPD9sHuv_5yf>Y% zAHoiuv(0aA;i7xz?Rnpqf!|R`-QoTH!264G-8JW*hyLFB-a7D|zGY56&lfQXY_zoV zLqRUlpGY9pwog059ur3?CDp>;8LsiClrq+S4NLFHFH-CWQT1E7&NGNClk9MR<^wio z`Jt1@<`y23`0fU7)S?CPx0I5)Li~kBV<=VEeUo4};#Gug2ChrVviF;Jga`;nKg=y! z$)*Ql62Y!ZNQl(1SA^0Dy_8b)%q)Fqur%g(-IN~RbmP&t|A~qm zx_`qW@*vv`=NvL^Rrj2_@-X09==*$C1$~DF{A#z<`r?_ccNg&Wk8Q3M_qqvu|FuoO zCeUZuh5jz^y+xo;+UmQZf{N_kzy0rh=z9bDWC{aE-gi3GvARBa?Yj%~`PQMoYkfVT zgIwxMpwjgk{HZw4HuSd*m9w>gDt@!qpcU@fK2J#8od-z*_ve;H=zBfyJ)8J=RYOPM zKDvFSUV}eMsZAg(?n|oev#sBJaSnIhdobW~p0NFx8)+27&2u-0>3hziHU(wzb!Qdm zuPp`){)8$-XbvhSZlAf&z=(U@kIsJ$F-CH?jsWj4x7ZpCXxW?nydax-HduV!aVy=R z?V|DBPfkgl4kN~Zl`E>ZffZOkTPRmug%ThX9TjS{>TpM8vnNz$@pS-E5w6u6JesFR z8=aDRG}jeFr{9B^K3EYa`oy(~2BOR@APQq|PN9gvHklSA3(&mWF{GR~XMdEUhc14_2hY^^DPv zbzQ|q*Rx_$y$JDTn`9p;uA4KOY-yRe94qf_aZL!Xy!B&3vjboet4 z&GbM@gA3_e$A^gC%DhLE(0fn=i?18**4V9HVvkn8>k5Qhgt=958|bSFRK&XPg=lg) z?c=uiV#Tj+Eb$369zpS0+nNjK?_+Tnh#G1Gi*G0uEq;i90>|q3-m#L*dQ<`(AKPc% ztJdW-XxCFpd9p;Wt<(Z8X>W96A*DQ67W~bnt!PBtJ^Y_a+N+WKd;>^18J-Y5xAm!y z@UZ&AuFO>~ry<3hp9u8Xsv0WycoBU)1B-7ML+7tzae}Da;zox24?FdStVA1J@ibX6 zPkb>NEcEg0D4jcZ+5ruP-Ays;_HUH2C>yVQ`5_Vn>mC%MD?Kr zTKaY0%8&24;?n~l^QwYAvE2a70_W(9cW=(Wi=1AtVexgt?JtyK`GTO8wJpRfP)Xb3 zx}2K7(4VaTgI^Uv}*yr_6+xmb+4Zzxt?_) zXT@7R!Q$(T+lRS|v;sZ$itl$Yy66TFcdCpK%V+O{{=~F?HfE)}J;iYf{9O_7R6_?a z$$M}ns&zl=abTvd)E0E<><)a_VshHXy}p;gd|w^Qz?|P;LEwEnSm&MvypwIIA%HBt z?r5uVZ++_u$NE~p&=RGnppxo*IbW^wZaOp?-Y936kwYovt0O+`dR|AGb6Y#-b|ZL- zbU6jPo!x=8aNW2s$VJl$xU55xFLhxZ75AtLIWeD6+1yHci|eHf>`$o7g&T?@cV%6Cr0$ zPS)&W%na8R^a-ps>{xs~K}9whpk3i~3AlZMb@|u(Bn>Mk*7U9_=CWe#U$21@G*~ZA z)Je3|f=a0z(>{FztKVR^a{#EYw>5o^CUk3kThS*S{(~#2j933pa zfoQi0p - - - - - - - - - - - - - LibMusicXML Tools - - - - - - - - - - - diff --git a/docs/lib/bootstrap.min.js b/docs/lib/bootstrap.min.js deleted file mode 100644 index eb0a8b410..000000000 --- a/docs/lib/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.4.1 (https://getbootstrap.com/) - * Copyright 2011-2019 Twitter, Inc. - * Licensed under the MIT license - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(idocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth
      - - -
      - -
      -
      -
      -				Drop any MusicXML file here
      -			
      -
      - -
      -
      -			
      -
      -
      -
      - -
      -
      -

      Output

      - -
      - -
      -
      - -
      -
      - -
      - -
      - Converter version: -
      -
      -

      Options

      - -
      -
      - -
      -
      - -
      - - -
      - Not yet available -
      - - -
      - Not yet available -
      - -
      -
      - -
      - Current file: -
      - -
      -
      - - -
      ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:t},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){var e=this.$element.data();for(var i in e)e.hasOwnProperty(i)&&-1!==g.inArray(i,o)&&delete e[i];return(t=g.extend({},this.getDefaults(),e,t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.sanitize&&(t.template=n(t.template,t.whiteList,t.sanitizeFn)),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-dc.width?"left":"left"==s&&l.left-ha.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})},m.prototype.sanitizeHtml=function(t){return n(t,this.options.whiteList,this.options.sanitizeFn)};var e=g.fn.tooltip;g.fn.tooltip=function i(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=e,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.1",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();if(this.options.html){var o=typeof i;this.options.sanitize&&(e=this.sanitizeHtml(e),"string"===o&&(i=this.sanitizeHtml(i))),t.find(".popover-title").html(e),t.find(".popover-content").children().detach().end()["string"===o?"html":"append"](i)}else t.find(".popover-title").text(e),t.find(".popover-content").children().detach().end().text(i);t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.1",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(n[t+1]===undefined||e .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.1",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -/// -//---------------------------------------------------------------------------- -// the libMusicXML interface -//---------------------------------------------------------------------------- -var libmusicxml = /** @class */ (function () { - function libmusicxml() { - } - libmusicxml.prototype.initialise = function () { - return __awaiter(this, void 0, void 0, function () { - var module; - var _this = this; - return __generator(this, function (_a) { - module = MusicXMLModule(); - return [2 /*return*/, new Promise(function (success, failure) { - module['onRuntimeInitialized'] = function () { - _this.fLibrary = new module.libMusicXMLAdapter(); - // this.moduleInit (module); - success(_this); - }; - })]; - }); - }); - }; - //------------------------------------------------------------------------ - // async initialization - // moduleInit ( module ) { - // this.fLibrary = new module.libMusicXMLAdapter(); - // } - //------------------------------------------------------------------------ - // libMusicXML interface - libmusicxml.prototype.libVersion = function () { return this.fLibrary.libVersion(); }; - libmusicxml.prototype.libVersionStr = function () { return this.fLibrary.libVersionStr(); }; - libmusicxml.prototype.musicxml2guidoVersion = function () { return this.fLibrary.musicxml2guidoVersion(); }; - libmusicxml.prototype.musicxml2guidoVersionStr = function () { return this.fLibrary.musicxml2guidoVersionStr(); }; - libmusicxml.prototype.string2guido = function (xml, genBars) { return this.fLibrary.string2guido(xml, genBars); }; - libmusicxml.prototype.xmlStringTranspose = function (xml, interval) { return this.fLibrary.xmlStringTranspose(xml, interval); }; - return libmusicxml; -}()); -//---------------------------------------------------------------------------- -// a download function -//---------------------------------------------------------------------------- -function download(filename, text) { - downloadMedia(filename, text, "text/plain;charset=utf-8,"); - // var element = document.createElement('a'); - // element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); - // element.setAttribute('download', filename); - // element.style.display = 'none'; - // document.body.appendChild(element); - // element.click(); - // document.body.removeChild(element); -} -function downloadMedia(filename, data, type) { - var element = document.createElement('a'); - element.setAttribute('href', 'data:' + type + encodeURIComponent(data)); - element.setAttribute('download', filename); - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); -} -/// -/// -var kGuidoMode = "1"; -var kLilyMode = "2"; -var kBrailleMode = "3"; -//---------------------------------------------------------------------------- -// this is the editor part, currently using CodeMirror -//---------------------------------------------------------------------------- -var XMLConverter = /** @class */ (function () { - function XMLConverter() { - this.fFileName = ""; - this.fXmlContent = ""; - this.fCode = document.getElementById("code"); - this.fLogs = document.getElementById("logs"); - $(document).on({ - dragover: function () { return false; }, - drop: function () { return false; } - }); - } - XMLConverter.prototype.capture = function (event) { - event.stopImmediatePropagation(); - event.preventDefault(); - }; - XMLConverter.prototype.dragEnter = function (event) { - this.capture(event); - this.fCode.style.opacity = "0.3"; - }; - XMLConverter.prototype.dragLeave = function (event) { - this.capture(event); - this.fCode.style.opacity = "1"; - }; - XMLConverter.prototype.drop = function (event) { - this.dragLeave(event); - var data = event.dataTransfer.getData("text"); - if (data) - this.convert(data, "noname"); - else { - var filelist = event.dataTransfer.files; - if (!filelist) - return; - var filecount = filelist.length; - for (var i = 0; i < filecount; i++) - this.droppedFile(filelist[i]); - } - }; - XMLConverter.prototype.droppedFile = function (file) { - var _this = this; - var reader = new FileReader(); - reader.onload = function (event) { _this.convert(reader.result.toString(), file.name); }; - reader.readAsText(file, file.name); - }; - XMLConverter.prototype.initialize = function (xmlengine) { - var _this = this; - this.fXmlEngine = xmlengine; - var div = document.getElementById("codepane"); - div.addEventListener("dragenter", function (e) { _this.dragEnter(e); }, true); - div.addEventListener("dragleave", function (e) { _this.dragLeave(e); }, true); - div.addEventListener("drop", function (e) { _this.drop(e); }, true); - $("input[name='output'").change(function (event) { _this.changeMode($("input[name='output']:checked").val()); }); - $("#gmnbars").change(function (event) { _this.convert(_this.fXmlContent, _this.fFileName + ".xml"); }); - $("#guidotry").click(function (event) { _this.tryGuido(); }); - $("#save").click(function (event) { _this.save(); }); - this.changeMode($("input[name='output']:checked").val()); - var logs = document.getElementById("logs"); - // $("#log-font").click ( () => { logs.style.fontFamily = $("#log-font").val(); }); - // $("#log-size").click ( () => { logs.style.fontSize = $("#log-size").val() + "px"; }); - // logs.style.fontFamily = $("#log-font").val(); - // logs.style.fontSize = $("#log-size").val() + "px"; - }; - XMLConverter.prototype.tryGuido = function () { - var gmn = $("#code").text(); - if (gmn.length) - window.open("https://guidoeditor.grame.fr/?code=" + btoa(gmn), '_blank'); - }; - XMLConverter.prototype.save = function () { - if (this.fXmlContent.length) { - var content = this.fCode.innerText; - if (content.length) - download(this.fFileName + this.outSuffix(), this.fCode.innerText); - } - }; - XMLConverter.prototype.outSuffix = function () { - switch (this.fMode) { - case kGuidoMode: return ".gmn"; - case kLilyMode: return ".ly"; - case kBrailleMode: return ".brl"; - } - return ""; - }; - XMLConverter.prototype.cversion = function () { - switch (this.fMode) { - case kGuidoMode: return this.fXmlEngine.musicxml2guidoVersionStr(); - case kLilyMode: return "0.1"; - case kBrailleMode: return "0.1"; - } - return ""; - }; - XMLConverter.prototype.changeGuidoTryStatus = function () { - var disable = (this.fXmlContent.length == 0) || ($("#code").text().length == 0); - $("#guidotry").prop('disabled', disable); - }; - XMLConverter.prototype.changeOptionsStatus = function (mode) { - $("#guidoOptions").hide(); - $("#lilyOptions").hide(); - $("#brailleOptions").hide(); - switch (mode) { - case kGuidoMode: - $("#guidoOptions").show(); - break; - case kLilyMode: - $("#lilyOptions").show(); - break; - case kBrailleMode: - $("#brailleOptions").show(); - break; - } - }; - XMLConverter.prototype.changeMode = function (mode) { - this.fMode = mode; - $("#convVersion").text(this.cversion()); - this.changeGuidoTryStatus(); - this.changeOptionsStatus(mode); - if (this.fXmlContent.length) { - this.convert(this.fXmlContent, this.fFileName + ".xml"); - } - }; - XMLConverter.prototype.convert = function (script, path) { - if (!script.length) - return; - $("#file-name").text(path); - this.fXmlContent = script; - this.fFileName = path.substring(0, path.lastIndexOf('.')); - var code = ""; - switch (this.fMode) { - case kGuidoMode: - code = this.fXmlEngine.string2guido(script, $("#gmnbars").is(":checked")); - this.changeGuidoTryStatus(); - break; - case kLilyMode: - code = "not yet available"; - break; - case kBrailleMode: - code = "not yet available"; - break; - } - $("#code").text(code); - }; - return XMLConverter; -}()); -/// -/// -//------------------------------------------------------------------------ -function xmlversion(lxml) { - console.log("LibMusicXML version " + lxml.libVersionStr()); - $("#lxmlversion").html(lxml.libVersionStr()); - console.log("MusicXML to GMN converter version " + lxml.musicxml2guidoVersionStr()); - $("#xml2guidoversion").html(lxml.musicxml2guidoVersionStr()); -} -var lxml = new libmusicxml(); -var converter = new XMLConverter(); -lxml.initialise().then(function () { - xmlversion(lxml); - converter.initialize(lxml); -}); diff --git a/web/.gitignore b/web/.gitignore deleted file mode 100644 index 0cf068b47..000000000 --- a/web/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ - -node_modules -src/lib - -.DS_Store diff --git a/web/LICENSE b/web/LICENSE deleted file mode 100644 index a612ad981..000000000 --- a/web/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/web/Makefile b/web/Makefile deleted file mode 100644 index a517f687b..000000000 --- a/web/Makefile +++ /dev/null @@ -1,91 +0,0 @@ - -MAKE ?= make - -DIST := ../docs -FONTDIR := $(DIST)/font -CSSDIR := $(DIST)/css -TSFOLDER := src -TSLIB := $(TSFOLDER)/lib -LXMLTS := libmusicxml.ts libmusicxml.d.ts -TSFILES := $(wildcard src/*.ts) $(LXMLTS:%=$(TSLIB)/%) - -CSS := css/lxmlweb.css - -LIBOUT := extern.min.js -CSSOUT := bootstrap.min.css -OUT := $(LIBOUT:%=$(DIST)/lib/%) $(CSSOUT:%=$(DIST)/css/%) -GUIDOLIB := $(DIST)/lib/libGUIDOEngine.js -LXMLLIB := $(DIST)/lib/libmusicxml.js -LXMLNODE := node_modules/@grame/libmusicxml - -.PHONY: css - -all: - $(MAKE) tslibs - $(MAKE) ts - $(MAKE) libs - $(MAKE) css - $(MAKE) readme -# git checkout $(DIST)/CNAME - - -########################################################################### -help: - @echo "============================================================" - @echo " Online libmusicxml tools" - @echo "============================================================" - @echo "Available targets are:" - @echo " all (default): generates the site into $(DIST)" - @echo " clean : remove the minified files" - @echo "========== Development targets" - @echo " ts : build the typescript version" - @echo " tslibs : update $(TSLIB) folder from nodes_modules" - @echo " libs : update $(DIST)/lib folder from nodes_modules" - @echo " css : update $(DIST)/css folder from nodes_modules" - @echo " readme : generates README.html from README.md" - @echo "============================================================" - - -########################################################################### -ts : $(TSLIB) $(DIST)/lxmlconverter.js - -$(DIST)/lxmlconverter.js : $(TSFILES) - cd $(TSFOLDER) && tsc - -tslibs: - cp $(LXMLNODE)/libmusicxml.ts $(TSLIB) - cp $(LXMLNODE)/libmusicxml.d.ts $(TSLIB) - -libs: $(DIST)/lib - cp node_modules/jquery/dist/jquery.min.js $(DIST)/lib - cp node_modules/bootstrap/dist/js/bootstrap.min.js $(DIST)/lib - cp $(LXMLNODE)/libmusicxml.js $(DIST)/lib - cp $(LXMLNODE)/libmusicxml.wasm $(DIST)/lib - -$(TSLIB): - mkdir $(TSLIB) - -$(DIST)/lib: - mkdir $(DIST)/lib - -test: - @echo $(TSFILES) - -css: - cp node_modules/bootstrap/dist/css/bootstrap.min.css* $(DIST)/css/ - -readme: - $(MAKE) README.html - -README.html : README.md - echo "" > README.html - cat README.md >> README.html - echo " " >> README.html - -########################################################################### -clean : - rm -f $(TSLIB)/* - rm -f $(DIST)/lib/* - rm -f $(DIST)/css/bootstrap.* - rm -f $(DIST)/lxmlconverter.js - \ No newline at end of file diff --git a/web/README.html b/web/README.html deleted file mode 100644 index acc8b3c85..000000000 --- a/web/README.html +++ /dev/null @@ -1,44 +0,0 @@ - -# LibMusicXML Online Tools - -The [libmusicxml online tools](https://libmusicxml.grame.fr) is based on the [libmusicxml library](git+https://github.com/grame-cncm/libmusicxml.git), a library to support the MusicXML format. - - -## Features - -The libmusicxml online tools provides conversion from MusicXML to various music score representation formats: - -- [Guido Music Notation](https://guidodoc.grame.fr) -- [Lilypond](http://lilypond.org/) -- [Braille Music Notation](https://en.wikipedia.org/wiki/Braille_music) - - -## Building - -Firstly ensure that you have [Git](https://git-scm.com/downloads) and [Node.js](https://nodejs.org/) installed. - -Clone a copy of the repo then change to the `web` directory: - -~~~~~~ -git clone https://github.com/grame-cncm/libmusicxml.git -cd web -~~~~~~ - -Install dev dependencies: -~~~~~~ -npm install -~~~~~~ - -To build everything: -~~~~~~ -make -~~~~~~ - -To test, launch an http server from the ../docs folder. -Using python3; -~~~~~~ -python -m http.server -~~~~~~ -the server should be available from [http://localhost:8000](http://localhost:8000) - - diff --git a/web/README.md b/web/README.md deleted file mode 100755 index 3b6ef73cf..000000000 --- a/web/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# LibMusicXML Online Tools - -The [libmusicxml online tools](https://libmusicxml.grame.fr) is based on the [libmusicxml library](git+https://github.com/grame-cncm/libmusicxml.git), a library to support the MusicXML format. - - -## Features - -The libmusicxml online tools provides conversion from MusicXML to various music score representation formats: - -- [Guido Music Notation](https://guidodoc.grame.fr) -- [Lilypond](http://lilypond.org/) -- [Braille Music Notation](https://en.wikipedia.org/wiki/Braille_music) - - -## Building - -Firstly ensure that you have [Git](https://git-scm.com/downloads) and [Node.js](https://nodejs.org/) installed. - -Clone a copy of the repo then change to the `web` directory: - -~~~~~~ -git clone https://github.com/grame-cncm/libmusicxml.git -cd web -~~~~~~ - -Install dev dependencies: -~~~~~~ -npm install -~~~~~~ - -To build everything: -~~~~~~ -make -~~~~~~ - -To test, launch an http server from the ../docs folder. -Using python3; -~~~~~~ -python -m http.server -~~~~~~ -the server should be available from [http://localhost:8000](http://localhost:8000) - diff --git a/web/changelog.txt b/web/changelog.txt deleted file mode 100755 index c779b4b64..000000000 --- a/web/changelog.txt +++ /dev/null @@ -1,7 +0,0 @@ -libmusicxml Web History - - ----------------------------------------------------------------- -version 1.0 -- first version - diff --git a/web/package-lock.json b/web/package-lock.json deleted file mode 100644 index f65073fdd..000000000 --- a/web/package-lock.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "libmusicxmlweb", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@grame/libmusicxml": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/@grame/libmusicxml/-/libmusicxml-3.19.1.tgz", - "integrity": "sha512-x2in9ZUrUGRVZ/LVmURu0J2zwmj41worytko1tLUUof0LXD50rIQb/zUoqDuOyDbq+fn5eB6SwhEiWAYIc6Fng==" - }, - "@types/jquery": { - "version": "3.3.36", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.36.tgz", - "integrity": "sha512-jHL8J5y5fJ0+C9zCTkeOvX4zqRnPug3r6JhAqAYl2YyBCYHiXTbZSH0MRCpayZADed5TigPjH92dEKczUFT2TQ==", - "requires": { - "@types/sizzle": "*" - } - }, - "@types/node": { - "version": "13.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", - "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" - }, - "@types/sizzle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" - }, - "bootstrap": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" - }, - "jquery": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", - "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" - } - } -} diff --git a/web/package.json b/web/package.json deleted file mode 100755 index 02f82f91e..000000000 --- a/web/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "libmusicxmlweb", - "version": "0.1.0", - "description": "LibMusicXML Tools", - "main": "index.html", - "scripts": { - "build": "make", - "dist": "make" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/grame-cncm/libmusicxml.git" - }, - "keywords": [ - "MusicXML", - "Guido Music notation", - "Lilypond", - "Braille Music Notation" - ], - "author": "Grame-CNCM", - "license": "GPL-3.0-or-later", - "bugs": { - "url": "https://github.com/grame-cncm/libmusicxml/issues" - }, - "homepage": "https://libmusicxml.grame.fr", - "dependencies": { - "@grame/libmusicxml": "^3.19.1", - "@types/jquery": "^3.3.36", - "@types/node": "^13.13.4", - "bootstrap": "^3.4.0", - "jquery": "^3.5.0" - } -} diff --git a/web/src/converter.ts b/web/src/converter.ts deleted file mode 100644 index 444469125..000000000 --- a/web/src/converter.ts +++ /dev/null @@ -1,165 +0,0 @@ - -/// -/// - -const kGuidoMode = "1"; -const kLilyMode = "2"; -const kBrailleMode = "3"; - -//---------------------------------------------------------------------------- -// this is the editor part, currently using CodeMirror -//---------------------------------------------------------------------------- -class XMLConverter { - - private fFileName = ""; - private fMode: string; - private fXmlContent = ""; - private fCode: HTMLElement; - private fLogs: HTMLElement; - private fXmlEngine: libmusicxml; - - constructor () { - this.fCode = document.getElementById ("code"); - this.fLogs = document.getElementById ("logs"); - $(document).on({ // prevents document to capture dropped files - dragover: function() { return false;}, - drop: function() { return false;} - }); - } - - capture(event: DragEvent) { - event.stopImmediatePropagation(); - event.preventDefault(); - } - - dragEnter (event : DragEvent) : void { - this.capture (event); - this.fCode.style.opacity = "0.3"; - } - - dragLeave (event : DragEvent) : void { - this.capture (event); - this.fCode.style.opacity = "1"; - } - - drop (event : DragEvent) : void { - this.dragLeave (event); - var data = event.dataTransfer.getData("text"); - if (data) this.convert (data, "noname"); - else { - let filelist = event.dataTransfer.files; - if (!filelist) return; - - let filecount = filelist.length; - for (let i = 0; i < filecount; i++ ) - this.droppedFile (filelist[i]); - } - } - - droppedFile (file: File) { - let reader = new FileReader(); - reader.onload = (event) => { this.convert (reader.result.toString(), file.name); }; - reader.readAsText(file, file.name); - } - - initialize (xmlengine: libmusicxml) { - this.fXmlEngine = xmlengine; - let div = document.getElementById ("codepane"); - div.addEventListener ("dragenter", (e: DragEvent) => { this.dragEnter(e); }, true); - div.addEventListener ("dragleave", (e: DragEvent) => { this.dragLeave(e); }, true); - div.addEventListener ("drop", (e: DragEvent) => { this.drop(e); }, true); - - $("input[name='output'").change ( (event) => { this.changeMode($("input[name='output']:checked").val()); } ); - $("#gmnbars").change ( (event) => { this.convert(this.fXmlContent, this.fFileName+".xml"); } ); - $("#guidotry").click ( (event) => { this.tryGuido(); } ); - $("#save").click ( (event) => { this.save(); } ); - - this.changeMode($("input[name='output']:checked").val()); - let logs = document.getElementById ("logs"); - // $("#log-font").click ( () => { logs.style.fontFamily = $("#log-font").val(); }); - // $("#log-size").click ( () => { logs.style.fontSize = $("#log-size").val() + "px"; }); - // logs.style.fontFamily = $("#log-font").val(); - // logs.style.fontSize = $("#log-size").val() + "px"; - } - - tryGuido () { - let gmn = $("#code").text(); - if (gmn.length) - window.open("https://guidoeditor.grame.fr/?code=" + btoa(gmn), '_blank'); - } - - save () : void { - if (this.fXmlContent.length) { - let content = this.fCode.innerText; - if (content.length) - download (this.fFileName + this.outSuffix(), this.fCode.innerText); - } - } - - outSuffix () : string { - switch (this.fMode) { - case kGuidoMode: return ".gmn"; - case kLilyMode : return ".ly"; - case kBrailleMode: return ".brl"; - } - return ""; - } - - cversion () : string { - switch (this.fMode) { - case kGuidoMode: return this.fXmlEngine.musicxml2guidoVersionStr(); - case kLilyMode : return "0.1"; - case kBrailleMode: return "0.1"; - } - return ""; - } - - changeGuidoTryStatus() : void { - let disable = (this.fXmlContent.length == 0) || ($("#code").text().length == 0); - $("#guidotry").prop('disabled', disable); - } - - changeOptionsStatus (mode: string): void { - $("#guidoOptions").hide(); - $("#lilyOptions").hide(); - $("#brailleOptions").hide(); - switch (mode) { - case kGuidoMode: $("#guidoOptions").show(); break; - case kLilyMode : $("#lilyOptions").show(); break; - case kBrailleMode: $("#brailleOptions").show(); break; - } - } - - changeMode (mode: string) : void { - this.fMode = mode; - $("#convVersion").text (this.cversion()); - this.changeGuidoTryStatus(); - this.changeOptionsStatus(mode); - if (this.fXmlContent.length) { - this.convert (this.fXmlContent, this.fFileName + ".xml"); - } - } - - convert ( script: string, path: string): void { - if (!script.length) return; - $("#file-name").text(path); - this.fXmlContent = script; - this.fFileName = path.substring(0, path.lastIndexOf('.')); - let code = ""; - switch (this.fMode) { - case kGuidoMode: - code = this.fXmlEngine.string2guido(script, $("#gmnbars").is(":checked")); - this.changeGuidoTryStatus(); - break; - case kLilyMode: - code = "not yet available"; - break; - case kBrailleMode: - code = "not yet available"; - break; - } - $("#code").text(code); - } -} - - diff --git a/web/src/download.ts b/web/src/download.ts deleted file mode 100644 index c4a113d66..000000000 --- a/web/src/download.ts +++ /dev/null @@ -1,26 +0,0 @@ - -//---------------------------------------------------------------------------- -// a download function -//---------------------------------------------------------------------------- -function download (filename : string, text: string) : void { - downloadMedia (filename, text, "text/plain;charset=utf-8,"); - // var element = document.createElement('a'); - // element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); - // element.setAttribute('download', filename); - - // element.style.display = 'none'; - // document.body.appendChild(element); - // element.click(); - // document.body.removeChild(element); -} - -function downloadMedia (filename : string, data: string, type: string) : void { - var element = document.createElement('a'); - element.setAttribute('href', 'data:'+type + encodeURIComponent(data)); - element.setAttribute('download', filename); - - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); -} diff --git a/web/src/main.ts b/web/src/main.ts deleted file mode 100644 index 80d8e7d24..000000000 --- a/web/src/main.ts +++ /dev/null @@ -1,22 +0,0 @@ - -/// -/// - - -//------------------------------------------------------------------------ -function xmlversion (lxml: libmusicxml) : void { - console.log( "LibMusicXML version " + lxml.libVersionStr()); - $("#lxmlversion").html (lxml.libVersionStr()); - console.log( "MusicXML to GMN converter version " + lxml.musicxml2guidoVersionStr()); - $("#xml2guidoversion").html (lxml.musicxml2guidoVersionStr()); -} - -const lxml = new libmusicxml(); -const converter = new XMLConverter(); -lxml.initialise ().then ( - (): void => { - xmlversion(lxml); - converter.initialize (lxml); - } -); - diff --git a/web/src/tsconfig.json b/web/src/tsconfig.json deleted file mode 100644 index e81d52d82..000000000 --- a/web/src/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "lib": [ "es2015", "dom" ], - "module": "system", - "target": "es5", - "noImplicitAny": true, - "outDir": "build", - "out": "../../docs/lxmlconverter.js", - "sourceMap": false, - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "allowJs": false - } -} From 1dfde3fda37b4612f9d08829bbc86f20af423f8e Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 15 May 2020 20:29:52 +0200 Subject: [PATCH 024/164] xml2guido: Removed default StaffFormat inference from MusicXML --- src/guido/xml2guidovisitor.cpp | 13 +++---------- src/guido/xmlpart2guido.cpp | 3 --- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 83030e91d..3e1080c74 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -245,27 +245,20 @@ namespace MusicXML2 tag = guidotag::create(autoHideTiedAccidentals); add(tag); - //// Add staffFormat if needed + /// Add staffFormat if needed + // We do not infer default staff distance from musicXML since no software seem to be able to control it! int stafflines = elt->getIntValue(k_staff_lines, 0); - if (stafflines||defaultGuidoStaffDistance) + if (stafflines) { Sguidoelement tag2 = guidotag::create("staffFormat"); - if (defaultGuidoStaffDistance) { - stringstream s; - s << "distance="<< defaultGuidoStaffDistance; - tag2->add (guidoparam::create(s.str().c_str(), false)); - } if (stafflines>0) { - Sguidoelement tag2 = guidotag::create("staffFormat"); stringstream staffstyle; staffstyle << "style=\"" << stafflines<<"-line\""; tag2->add (guidoparam::create(staffstyle.str(),false)); } add (tag2); - // TODO: It seems like in MusicXML the default Staff Distance is reapplied to every new system (?) in case of staff distance change in the middle of a score. } - //// flushHeader (fHeader); flushPartHeader (fPartHeaders[elt->getAttributeValue("id")]); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index eecc4c386..f23da10ed 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -317,9 +317,6 @@ namespace MusicXML2 int xmlStaffDistance = sLayout->getIntValue(k_staff_distance, 0); Sguidoelement tag2 = guidotag::create("staffFormat"); float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; - if (HalfSpaceDistance < xml2guidovisitor::defaultGuidoStaffDistance) { - HalfSpaceDistance = xml2guidovisitor::defaultGuidoStaffDistance; - } stringstream s; s << "distance="<< HalfSpaceDistance; tag2->add (guidoparam::create(s.str().c_str(), false)); From fb1c935dc147b208f1a68aa17c520ffefb8ae06d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 19 May 2020 18:50:07 +0200 Subject: [PATCH 025/164] xml2guido: Fix accolade and barformat staff ranges --- src/visitors/partlistvisitor.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/visitors/partlistvisitor.cpp b/src/visitors/partlistvisitor.cpp index 06ecbec00..323da7481 100644 --- a/src/visitors/partlistvisitor.cpp +++ b/src/visitors/partlistvisitor.cpp @@ -67,10 +67,10 @@ namespace MusicXML2 std::vector::iterator rangeBegin = std::min_element(staves.begin(), staves.begin()); stringstream rangeStream; - rangeStream << "\"" << (*rangeBegin) << "-" << (*rangeEnd) << "\""; + rangeStream << "\"" << (*rangeBegin)+1 << "-" << (*rangeEnd)+1 << "\""; pGroup.guidoRange = rangeStream.str(); - pGroup.guidoRangeStart = *rangeBegin; - pGroup.guidoRangeStop = *rangeEnd; + pGroup.guidoRangeStart = *rangeBegin +1; + pGroup.guidoRangeStop = *rangeEnd +1; } bool partlistvisitor::checkLonelyBarFormat(int staffID) From 2c7a40a827e3192a51c3c9ad3b041e12da2c2f1e Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 19 May 2020 21:43:36 +0200 Subject: [PATCH 026/164] Final fix for GUID-169 (brackets) --- src/guido/xml2guidovisitor.cpp | 12 ++++++++---- src/visitors/partlistvisitor.cpp | 6 +++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 3e1080c74..5192eb13a 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -128,7 +128,6 @@ namespace MusicXML2 void xml2guidovisitor::flushPartGroup (std::string partID) { - //cerr<< "Entering flushPartGroup with ID "<guidoRange.size()>0) { /// something was found. Generate Accolades and BarFormat if any + int rangeStart = fCurrentStaffIndex ; + int rangeEnd = rangeStart + (partGroupIt->guidoRangeStop - partGroupIt->guidoRangeStart); + std::stringstream rangeFixed; + rangeFixed << " range=\""<< rangeStart <<"-"<bracket) { - std::string accolParams = "id=1, range="+partGroupIt->guidoRange; + std::stringstream accolParams; + accolParams << "id=1, "<< rangeFixed.str(); Sguidoelement tag3 = guidotag::create("accol"); - tag3->add (guidoparam::create(accolParams, false)); + tag3->add (guidoparam::create(accolParams.str(), false)); add (tag3); } if (partGroupIt->barlineGrouping) { - std::string barformatParams = "style= \"system\", range="+partGroupIt->guidoRange; + std::string barformatParams = "style= \"system\", "+rangeFixed.str(); Sguidoelement tag4 = guidotag::create("barFormat"); tag4->add (guidoparam::create(barformatParams, false)); diff --git a/src/visitors/partlistvisitor.cpp b/src/visitors/partlistvisitor.cpp index 323da7481..e3ea7ff9a 100644 --- a/src/visitors/partlistvisitor.cpp +++ b/src/visitors/partlistvisitor.cpp @@ -67,10 +67,10 @@ namespace MusicXML2 std::vector::iterator rangeBegin = std::min_element(staves.begin(), staves.begin()); stringstream rangeStream; - rangeStream << "\"" << (*rangeBegin)+1 << "-" << (*rangeEnd)+1 << "\""; + rangeStream << "\"" << (*rangeBegin) << "-" << (*rangeEnd) << "\""; pGroup.guidoRange = rangeStream.str(); - pGroup.guidoRangeStart = *rangeBegin +1; - pGroup.guidoRangeStop = *rangeEnd +1; + pGroup.guidoRangeStart = *rangeBegin ; + pGroup.guidoRangeStop = *rangeEnd ; } bool partlistvisitor::checkLonelyBarFormat(int staffID) From 267d409befa6aac7a6f27486531bb27bbff0b99b Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 11:36:35 +0200 Subject: [PATCH 027/164] xml2guido: adds hidden bar inference from xml for Guido --- src/guido/xmlpart2guido.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index f23da10ed..f3f2d0c62 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -274,6 +274,13 @@ namespace MusicXML2 add (tag); } + }else { + // Create a HIDDEN Bar in case of fPendingBar equal to false. + // This is the case for "bar-style" equal to "none" or "implicit" measures + Sguidoelement tag = guidotag::create("bar"); + std::string hidden = "hidden=\"true\""; + tag->add(guidoparam::create(hidden.c_str(), false)); + add(tag); } fCurrentMeasure = elt; fMeasNum++; From 0d7764c01857f7fa54e78287928187bfcf24f6c4 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 13:43:50 +0200 Subject: [PATCH 028/164] xml2guido: Evade crash if XML is not compliant on Wedge parsing --- src/guido/xmlpart2guido.cpp | 122 ++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index f3f2d0c62..dd5538e95 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -771,57 +771,59 @@ namespace MusicXML2 } //______________________________________________________________________________ - void xmlpart2guido::visitStart ( S_wedge& elt ) - { - if (fSkipDirection) return; - -// bool wedgeStart = false; - - string type = elt->getAttributeValue("type"); - Sguidoelement tag; - if (type == "crescendo") { - tag = guidotag::create("crescBegin"); - fCrescPending = true; -// wedgeStart = true; - } - else if (type == "diminuendo") { - tag = guidotag::create("dimBegin"); - fCrescPending = false; -// wedgeStart = true; +void xmlpart2guido::visitStart ( S_wedge& elt ) +{ + if (fSkipDirection) return; + + // bool wedgeStart = false; + + string type = elt->getAttributeValue("type"); + Sguidoelement tag; + if (type == "crescendo") { + tag = guidotag::create("crescBegin"); + fCrescPending = true; + // wedgeStart = true; + } + else if (type == "diminuendo") { + tag = guidotag::create("dimBegin"); + fCrescPending = false; + // wedgeStart = true; + } + else if (type == "stop") { + if (fIgnoreWedgeWithOffset) { + fIgnoreWedgeWithOffset = false; + return; // FIXME: Ignore Offset Wedge à la Verovio } - else if (type == "stop") { - if (fIgnoreWedgeWithOffset) { - fIgnoreWedgeWithOffset = false; - return; // FIXME: Ignore Offset Wedge à la Verovio + + tag = guidotag::create(fCrescPending ? "crescEnd" : "dimEnd"); + } + + if (tag) { + //// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) + //// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type + if (type == "diminuendo") { + float spreadValue = elt->getAttributeFloatValue("spread", 15.0); + if (spreadValue != 15.0) { + stringstream s; + s << "deltaY=" << (spreadValue/10)*2 << "hs"; + tag->add (guidoparam::create(s.str(), false)); } - tag = guidotag::create(fCrescPending ? "crescEnd" : "dimEnd"); - } - - if (tag) { - //// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) - //// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type - if (type == "diminuendo") { - float spreadValue = elt->getAttributeFloatValue("spread", 15.0); - if (spreadValue != 15.0) { - stringstream s; - s << "deltaY=" << (spreadValue/10)*2 << "hs"; - tag->add (guidoparam::create(s.str(), false)); - } - - /*stringstream s; - s << "autopos=\"on\""; - tag->add (guidoparam::create(s.str(), false));*/ - - }else if (type == "crescendo") - { - ctree::iterator wedgeBegin= find(fCurrentPart->begin(), fCurrentPart->end(), elt); - int crescendoNumber = elt->getAttributeIntValue("number", 1); // default is 1 for wedge! - ctree::iterator nextevent = wedgeBegin; - nextevent++; // advance one step - - // find next S_direction in measure - ctree::iterator nextWedge = fCurrentMeasure->find(k_wedge, nextevent); + /*stringstream s; + s << "autopos=\"on\""; + tag->add (guidoparam::create(s.str(), false));*/ + + }else if (type == "crescendo") + { + ctree::iterator wedgeBegin= find(fCurrentPart->begin(), fCurrentPart->end(), elt); + int crescendoNumber = elt->getAttributeIntValue("number", 1); // default is 1 for wedge! + ctree::iterator nextevent = wedgeBegin; + nextevent++; // advance one step + + // find next S_direction in measure + ctree::iterator nextWedge = fCurrentPart->find(k_wedge, nextevent); + + if (nextWedge != fCurrentPart->end()) { while ( ( nextWedge->getAttributeIntValue("number", 1) != crescendoNumber) && @@ -897,21 +899,21 @@ namespace MusicXML2 s << "autopos=\"on\""; tag->add (guidoparam::create(s.str(), false));*/ } - - stringstream s; - s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; - tag->add (guidoparam::create(s.str(), false)); - //xml2guidovisitor::addPosY(elt, tag, -2, 1.0); // removed negative multiplier. Fixed in GuidoLib 1.6.5 - - if (fCurrentOffset) { - addDelayed(tag, fCurrentOffset); - } - else { - add (tag); - } } + stringstream s; + s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; + tag->add (guidoparam::create(s.str(), false)); + //xml2guidovisitor::addPosY(elt, tag, -2, 1.0); // removed negative multiplier. Fixed in GuidoLib 1.6.5 + + if (fCurrentOffset) { + addDelayed(tag, fCurrentOffset); + } + else { + add (tag); + } } +} std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) From 8f5c169c0f822430731932a220e3310a04a119e3 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 14:47:47 +0200 Subject: [PATCH 029/164] Minor cleanups --- src/guido/xmlpart2guido.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index dd5538e95..fb3cb5bf6 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -774,20 +774,16 @@ namespace MusicXML2 void xmlpart2guido::visitStart ( S_wedge& elt ) { if (fSkipDirection) return; - - // bool wedgeStart = false; - + string type = elt->getAttributeValue("type"); Sguidoelement tag; if (type == "crescendo") { tag = guidotag::create("crescBegin"); fCrescPending = true; - // wedgeStart = true; } else if (type == "diminuendo") { tag = guidotag::create("dimBegin"); fCrescPending = false; - // wedgeStart = true; } else if (type == "stop") { if (fIgnoreWedgeWithOffset) { @@ -799,8 +795,8 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) } if (tag) { - //// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) - //// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type + /// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) + /// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type if (type == "diminuendo") { float spreadValue = elt->getAttributeFloatValue("spread", 15.0); if (spreadValue != 15.0) { @@ -904,7 +900,6 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) stringstream s; s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; tag->add (guidoparam::create(s.str(), false)); - //xml2guidovisitor::addPosY(elt, tag, -2, 1.0); // removed negative multiplier. Fixed in GuidoLib 1.6.5 if (fCurrentOffset) { addDelayed(tag, fCurrentOffset); From 5d0ff60dd4c568690c4c1f5c685ab9796be24139 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 14:50:35 +0200 Subject: [PATCH 030/164] Increment xml2guidoVersion to 3.1 --- src/elements/versions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/elements/versions.cpp b/src/elements/versions.cpp index c1504e12c..d17d709b6 100755 --- a/src/elements/versions.cpp +++ b/src/elements/versions.cpp @@ -18,8 +18,8 @@ namespace MusicXML2 float versions::libVersion() { return 3.19f; } const char* versions::libVersionStr() { return "3.19"; } -float versions::xml2guidoVersion() { return 3.0f; } -const char* versions::xml2guidoVersionStr() { return "3.0"; } +float versions::xml2guidoVersion() { return 3.1f; } +const char* versions::xml2guidoVersionStr() { return "3.1"; } float versions::xml2lilypondVersion() { return 0.92f; } const char* versions::xml2lilypondVersionStr() { return "0.92"; } From 69a1118e69799aa67171b75ba5d17637a2b552e9 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 6 Jan 2020 19:11:21 +0100 Subject: [PATCH 031/164] xml2guido: Replaced fingering dy calculation by "placement" parameter --- src/guido/xmlpart2guido.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 52fc84029..a80774e6a 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2399,15 +2399,16 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) stringstream s; s << "text=\"" << fingeringText << "\""; /// Get placement: AVOIDING since rendering is not coherent! -// std::string placement = fingerings[i]->getAttributeValue("placement"); -// if (placement.size() > 0) { -// s << ", position=\""<getAttributeValue("placement"); + if (placement.size() > 0) { + s << ", position=\""<add (guidoparam::create(s.str(), false)); /// GUID-156: x-pos is highly dependent on Layout. AVOID! //xml2guidovisitor::addPosX(fingerings[i], tag, 0); // xml x-pos can be safely added /// In MusicXML, default-y for Fingering is from TOP of the staff. Dy in Guido is from the NOTEHEAD. Therefore the dy is a function of the Note and the Clef! - addPosYforNoteHead(nv, fingerings[i], tag, 2); // FIXME: +2 offset is experimental + /// GUID-160: Remove verticals to allow automatic positioning of stacks in GuidoLib + //addPosYforNoteHead(nv, fingerings[i], tag, 2); // FIXME: +2 offset is experimental push(tag); hasFingerings++; } From 7cdd2418c4cde2826b4b3d1f4845ae1131fedff0 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 8 Jan 2020 18:04:50 +0100 Subject: [PATCH 032/164] xml2guido: improve exception handling for number of dashes parsing of tremolo --- src/guido/xmlpart2guido.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index a80774e6a..29651dd70 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2065,7 +2065,13 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) std::stringstream convert; convert << note.fTremolo->getValue(); int numDashes = 0; - convert >> numDashes; + try { + convert >> numDashes; + } + catch (const exception& e) { + numDashes = 0; + } + s << "style=\""; for (int id=0; id Date: Thu, 9 Jan 2020 15:28:54 +0100 Subject: [PATCH 033/164] WIP: New Beam Grouping parsing --- src/elements/xml.cpp | 22 ++++++++-- src/elements/xml.h | 3 ++ src/guido/xmlpart2guido.cpp | 86 +++++++++++++++++++++++++++++++------ src/guido/xmlpart2guido.h | 7 +-- 4 files changed, 97 insertions(+), 21 deletions(-) diff --git a/src/elements/xml.cpp b/src/elements/xml.cpp index 16b5983fa..12ded9df1 100644 --- a/src/elements/xml.cpp +++ b/src/elements/xml.cpp @@ -220,10 +220,24 @@ float xmlelement::getFloatValue (int subElementType, float defaultvalue) return (iter != end()) ? float(*(*iter)) : defaultvalue; } - bool xmlelement::hasSubElement(int subElementType) - { - ctree::iterator iter = find(subElementType); - return (iter != end()); +bool xmlelement::hasSubElement(int subElementType) +{ + ctree::iterator iter = find(subElementType); + return (iter != end()); +} + +bool xmlelement::hasSubElement(int subElementType, std::string value) +{ + ctree::iterator iter = begin(); + while (iter != end()) { + if ( ((*iter)->getType() == subElementType) + && ((*iter)->getValue() == value) ){ + return true; + } + iter++; } + return false; + +} } diff --git a/src/elements/xml.h b/src/elements/xml.h index 981529297..a30460b6f 100644 --- a/src/elements/xml.h +++ b/src/elements/xml.h @@ -154,7 +154,10 @@ class EXP xmlelement : public ctree, public visitable int getIntValue (int subElementType, int defaultvalue); long getLongValue (int subElementType, long defaultvalue); float getFloatValue (int subElementType, float defaultvalue); + //! returns true if subelement exists bool hasSubElement(int subElementType); + //! returns true if subelement with given value exists + bool hasSubElement(int subElementType, std::string value); // misc bool empty () const { return fValue.empty() && elements().empty(); } diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 29651dd70..0e9a2b23e 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -52,10 +52,9 @@ namespace MusicXML2 void xmlpart2guido::reset () { guidonotestatus::resetall(); - fCurrentBeamNumber = 0; fMeasNum = 0; fInCue = fInGrace = fInhibitNextBar = fPendingBar = fDoubleBar - = fBeamOpened = fCrescPending = fSkipDirection = fWavyTrillOpened = fSingleScopeTrill = fNonStandardNoteHead = false; + = fBeamOpened = fBeamGrouping = fCrescPending = fSkipDirection = fWavyTrillOpened = fSingleScopeTrill = fNonStandardNoteHead = false; fCurrentStemDirection = kStemUndefined; fCurrentDivision = 1; fCurrentOffset = 0; @@ -1432,16 +1431,51 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con //______________________________________________________________________________ - void xmlpart2guido::checkBeamBegin ( const std::vector& beams ) + void xmlpart2guido::checkBeamBegin ( const std::vector& beams, const S_note& elt ) { /// !IMPORTANT NOTE from MXML DOC: Note that the beam number does not distinguish sets of beams that overlap, as it does for slur and other elements. /// So we need to track them with s Stack /// ! IMPORTANT NOTE from MXML DOC: "Beaming groups are distinguished by being in different voices and/or the presence or absence of grace and cue elements." /// This means that we should treate Grace and Cue elements separately. + /// !IMPORTANT NOTE on Guido Syntax: In Guido, the semantic of beam is the following: Nested beams make sense up to 2 order. The higher order has ONLY a Grouping semantics (meaning will link the two beams with a single-dashed line). It is only the internal and foremost internal beam that can deduct correct durations. Nested beams beyond level 2 does not have any effect. In MusicXML, beams do not have any semantics and only indicate lines! - //std::vector::const_iterator i = findValue(beams, "begin"); - //if (i != beams.end()) { - std::vector::const_iterator i ; + /// How to detect a grouping then? A grouping occurs if an xml beam ends, and if the current and next note are of the same xml Type (16th for two beams). One should probably check the number of beams with the type?! This is a look-ahead operation! + + std::vector::const_iterator began = findValue(beams, "begin"); + + // Create beamBegin only if no beam is already opened. Groupings will be handled upon the initial openning. + if ( (began != beams.end()) && (fBeamOpened == false)){ + stringstream tagName; + tagName << "beamBegin" << ":1"; // This is the initial beam! + Sguidoelement tag = guidotag::create(tagName.str()); + add (tag); + if ( (!fInCue)&&(!fInGrace)) { + fBeamOpened = true; + } + cerr << "Measure "<< fMeasNum << " beam BEGIN Beam-level="<<(*began)->getAttributeIntValue("number", 0)<< " fBeamOpened?="<::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), elt); + nextnote.forward_up(); // forward one element + while (nextnote != fCurrentMeasure->end()) { + if (( (nextnote->getType() == k_note) && (nextnote->getIntValue(k_voice,0) == fTargetVoice) )) { + // Check if there is a beam end + if (nextnote->hasSubElement(k_beam, "end")) { + // Get its Type + string endingType = nextnote->getValue(k_type); + // Check if the Next note has a beam Begin and if it has the same "type" + ctree::iterator postnote; + if (findNextNote(dynamic_cast(*nextnote), postnote)) { + + } + } + } + } + } + } + + + /*std::vector::const_iterator i ; for (i = beams.begin(); (i != beams.end()); i++) { if ((*i)->getValue() != "begin") continue; @@ -1464,7 +1498,7 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con if ( (!fInCue)&&(!fInGrace)) { fBeamOpened = true; } - fCurrentBeamNumber = lastBeamInternalNumber; + //fCurrentBeamNumber = lastBeamInternalNumber; // Add to stack: std::pair toto2(lastBeamInternalNumber, (*i)->getAttributeIntValue("number", 0)); @@ -1472,9 +1506,9 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con //cerr << " Created!"< >::const_iterator xmlpart2guido::findSlur ( con { /// IMPORTANT: Beam Numbering in MusicXML is not the same as in Slurs and are NOT incremental. /// The only assumption we make here is that the numbers are sorted. So we use a REVERSE iterator to close Beams in Order. - std::vector::const_reverse_iterator i ; + + std::vector::const_iterator end = findValue(beams, "end"); + std::vector::const_iterator continuity = findValue(beams, "continue"); + std::vector::const_iterator begin = findValue(beams, "begin"); + + bool ended = (end != beams.end()); + bool began = (begin != beams.end()); + bool withContinuity = (continuity != beams.end()); + + if (ended && (!began) && !withContinuity && fBeamOpened) { + stringstream tagName; + tagName << "beamEnd" << ":1"; + Sguidoelement tag = guidotag::create(tagName.str()); + add (tag); + if ((fBeamOpened) && (!fInCue) && (!fInGrace)) { + fBeamOpened = false; + } + + // If there is a grouping, close it! + if (fBeamGrouping) { + stringstream tagName2; + tagName2 << "beamEnd" << ":2"; + tag = guidotag::create(tagName2.str()); + add (tag); + fBeamGrouping = false; + } + } + + /*std::vector::const_reverse_iterator i ; for (i = beams.rbegin(); (i != beams.rend() && (!fBeamStack.empty())); i++) { if (((*i)->getValue() == "end") && ((*i)->getAttributeIntValue("number", 0) == fBeamStack.top().second)) { @@ -1516,7 +1578,7 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con fBeamStack.pop(); } - } + }*/ // Experimental //if (beamStackSizeBeforeClosing > fBeamStack.size()) @@ -2656,7 +2718,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) checkGrace(*this); checkSlurBegin (notevisitor::getSlur()); - checkBeamBegin (notevisitor::getBeam()); + checkBeamBegin (notevisitor::getBeam(), elt); checkTupletBegin(notevisitor::getTuplet(), *this, elt); checkLyricBegin (notevisitor::getLyric()); checkWavyTrillBegin(*this); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index acd15f6b7..c5282524a 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -75,16 +75,14 @@ class EXP xmlpart2guido : vector fDelayed; // fields to controls the guido output generation bool fGenerateComments, fGenerateBars, fGeneratePositions, fGenerateAutoMeasureNum, fLyricsManualSpacing; -// bool fGenerateStem; // internal parsing state - bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress; + bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress; int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets std::queue fDirectionEraserStack; // To skip already visited Directions when looking ahead because of grace notes - std::stack< std::pair > fBeamStack; // first int: Internal num, 2nd int: XML num std::vector< std::pair > fSlurStack; // first int: Internal num, 2nd int: XML num Sguidoelement fLyricOpened; @@ -109,7 +107,6 @@ class EXP xmlpart2guido : rational fCurrentTimeSign; // the current time signature int fMeasNum; - int fCurrentBeamNumber; // number attribute of the current beam int fCurrentStemDirection; // the current stems direction, used for stem direction changes int fPendingPops; // elements to be popped at chord exit (like fermata, articulations...) @@ -133,7 +130,7 @@ class EXP xmlpart2guido : std::vector getChord ( const Sxmlelement& note ); // build a chord vector void checkStaff (int staff ); // check for staff change void checkStem ( const S_stem& stem ); - void checkBeamBegin ( const std::vector& beams ); + void checkBeamBegin ( const std::vector& beams, const S_note& elt ); void checkBeamEnd ( const std::vector& beams ); void checkTupletBegin( const std::vector& tuplets, const notevisitor& nv, From 8c54fad9a5bd9061e395d6f81fdf94aee1ea648d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 9 Jan 2020 16:11:04 +0100 Subject: [PATCH 034/164] xml2guido: Fixed ordering of grace note tag creation + added unit test --- files/xml2guido/GUID-153-DoubleGraceNotes.xml | 713 ++++++++++++++++++ src/guido/xmlpart2guido.cpp | 4 +- 2 files changed, 715 insertions(+), 2 deletions(-) create mode 100644 files/xml2guido/GUID-153-DoubleGraceNotes.xml diff --git a/files/xml2guido/GUID-153-DoubleGraceNotes.xml b/files/xml2guido/GUID-153-DoubleGraceNotes.xml new file mode 100644 index 000000000..5f910128c --- /dev/null +++ b/files/xml2guido/GUID-153-DoubleGraceNotes.xml @@ -0,0 +1,713 @@ + + + + Introduction & Rondo Capriccioso + + Camille Saint-Saëns + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2020-01-09 + + + + + + + + + + 6.4347 + 40 + + + 1846 + 1305 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 237 + 158 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Introduction & Rondo Capriccioso + + + Camille Saint-Saëns + + + + Violin + Vn. + + SmartMusic SoftSynth + strings.violin + + + + 3 + 15489 + 41 + 80 + 0 + + + + + + + + + 1846 + 1305 + + 93 + 93 + 93 + 81 + + + + + 73 + 0 + + 237 + + system + + + 4 + + 0 + major + + + + G + 2 + + + + + + B + 5 + + 4 + 1 + quarter + down + + + + A + 5 + + 2 + 1 + eighth + down + + + + + A + 5 + + 1 + 16th + up + begin + begin + + + + + + + + B + 5 + + 1 + 16th + up + end + end + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + 1 + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + 1 + + + + + + + + + 171 + + + + + E + 5 + + 4 + 1 + quarter + down + + + + D + 5 + + 2 + 1 + eighth + down + + + + + D + 5 + + 1 + 16th + up + begin + begin + + + + + + + + E + 5 + + 1 + 16th + up + end + end + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + cresc. + + + + + C + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + 1 + + + + + + D + 5 + + 2 + 1 + eighth + down + end + + + + + + 1 + + + + + + + + + C + 4 + + 1 + 1 + 16th + up + begin + begin + + + + D + 4 + + 1 + 1 + 16th + up + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + continue + continue + + + + B + 3 + + 1 + 1 + 16th + up + continue + end + + + + A + 3 + + 2 + 1 + eighth + up + end + + + + + E + 6 + + 1 + 16th + up + begin + begin + + + + + + + + F + 6 + + 1 + 16th + up + end + end + + + + E + 6 + + 2 + 1 + eighth + down + begin + + + + + + + + + + D + 1 + 6 + + 2 + 1 + eighth + sharp + down + continue + + + + + + + + + E + 6 + + 2 + 1 + eighth + down + end + + + + + + + + + + + + 181 + + + + + B + 5 + + 4 + 1 + quarter + down + + + + A + 5 + + 2 + 1 + eighth + down + + + + + A + 5 + + 1 + 16th + up + begin + begin + + + + + + + + B + -1 + 5 + + 1 + 16th + flat + up + end + end + + + + cresc. + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + + + E + 5 + + 4 + 1 + quarter + down + + + + D + 5 + + 2 + 1 + eighth + down + + + + + D + 5 + + 1 + 16th + up + begin + begin + + + + + + + + E + 5 + + 1 + 16th + up + end + end + + + + dim. + + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + C + 1 + 5 + + 2 + 1 + eighth + sharp + down + continue + + + + + + + + + D + 5 + + 2 + 1 + eighth + down + end + + + + + + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 0e9a2b23e..21ce3dc37 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2289,6 +2289,8 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) { if (nv.isGrace()) { if (!fInGrace) { + Sguidoelement tag = guidotag::create("grace"); + push(tag); /// GUID-153: Fetch directions after grace ctree::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), nv.getSnote()); nextnote.forward_up(); // forward one element @@ -2319,8 +2321,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } /// End-of Guid-153 fInGrace = true; - Sguidoelement tag = guidotag::create("grace"); - push(tag); } } else if (fInGrace) { From 237f170a0908e9942cc358eddff26b94f64ba54c Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 9 Jan 2020 16:56:44 +0100 Subject: [PATCH 035/164] xml2guido: Added Grouping detection for Beaming in Guido from Xml --- src/guido/xmlpart2guido.cpp | 108 ++++++++++++------------------------ src/guido/xmlpart2guido.h | 2 +- 2 files changed, 36 insertions(+), 74 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 21ce3dc37..5ffa32375 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1452,62 +1452,46 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con if ( (!fInCue)&&(!fInGrace)) { fBeamOpened = true; } - cerr << "Measure "<< fMeasNum << " beam BEGIN Beam-level="<<(*began)->getAttributeIntValue("number", 0)<< " fBeamOpened?="<getInputLineNumber()<::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), elt); nextnote.forward_up(); // forward one element while (nextnote != fCurrentMeasure->end()) { if (( (nextnote->getType() == k_note) && (nextnote->getIntValue(k_voice,0) == fTargetVoice) )) { - // Check if there is a beam end - if (nextnote->hasSubElement(k_beam, "end")) { + // Check if there is a beam end with a beam Continue, it can be a Grouping candidate! + if (nextnote->hasSubElement(k_beam, "end") && nextnote->hasSubElement(k_beam, "continue") ) { + //cerr << " \tNextNote with beam end, line:"<getInputLineNumber()<<" type="<getValue(k_type)<getValue(k_type); // Check if the Next note has a beam Begin and if it has the same "type" ctree::iterator postnote; - if (findNextNote(dynamic_cast(*nextnote), postnote)) { - + if (findNextNote(nextnote, postnote)) { + //cerr << " \tPostnote with beam end, line:"<getInputLineNumber()<<" type="<getValue(k_type) <hasSubElement(k_beam, "continue")) { + string postType = postnote->getValue(k_type); + if (postType == endingType) { + // We are in a grouping continuity! + stringstream tagName2; + tagName2 << "beamBegin" << ":2"; + tag = guidotag::create(tagName2.str()); + add (tag); + fBeamGrouping = true; + //cerr << " \t\t CONTINUITY CREATED! Line:"<getInputLineNumber()<hasSubElement(k_beam, "continue")) { + // If there is no beam element with "continue" value, then our search is over! + break; } } + nextnote.forward_up(); } } } - - /*std::vector::const_iterator i ; - for (i = beams.begin(); (i != beams.end()); i++) { - if ((*i)->getValue() != "begin") - continue; - // There is a Beam Begin. Creat BeamBegin tag, and add its number to Stack - int lastBeamInternalNumber = 1; - if (!fBeamStack.empty()) { - std::pair toto = fBeamStack.top(); - lastBeamInternalNumber = toto.first + 1; - } - - //cerr << "Measure "<< fMeasNum << " beam BEGIN "<< lastBeamInternalNumber<< " Beam-level="<<(*i)->getAttributeIntValue("number", 0)<< " fBeamOpened?="< toto2(lastBeamInternalNumber, (*i)->getAttributeIntValue("number", 0)); - fBeamStack.push(toto2); - - //cerr << " Created!"< >::const_iterator xmlpart2guido::findSlur ( con add (tag); fBeamGrouping = false; } + }else if (withContinuity && fBeamGrouping && ended) { + // This occurs only during a grouping continuity: + stringstream tagName; + tagName << "beamEnd" << ":2"; + Sguidoelement tag = guidotag::create(tagName.str()); + add (tag); + stringstream tagName2; + tagName2 << "beamBegin" << ":2"; + tag = guidotag::create(tagName2.str()); + add (tag); } - /*std::vector::const_reverse_iterator i ; - for (i = beams.rbegin(); (i != beams.rend() && (!fBeamStack.empty())); i++) - { - if (((*i)->getValue() == "end") && ((*i)->getAttributeIntValue("number", 0) == fBeamStack.top().second)) { - // There is a Beam End. create tag and pop from stack - int lastBeamInternalNumber = 0; - if (!fBeamStack.empty()) { - lastBeamInternalNumber = fBeamStack.top().first; - }else { - cerr<< "XML2Guido: Got Beam End without a beam in Stack. Skipping!"< CLOSED! fBeamOpened="<getInputLineNumber()< >::const_iterator xmlpart2guido::findSlur ( con if (postType == endingType) { // We are in a grouping continuity! stringstream tagName2; - tagName2 << "beamBegin" << ":2"; + tagName2 << "beamBegin" << ":"<< (beamNumber+1); tag = guidotag::create(tagName2.str()); add (tag); fBeamGrouping = true; @@ -1513,9 +1517,13 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con bool began = (begin != beams.end()); bool withContinuity = (continuity != beams.end()); - if (ended && (!began) && !withContinuity && fBeamOpened) { + if (ended && (!began) && !withContinuity && (fBeamOpened || fInGrace)) { stringstream tagName; - tagName << "beamEnd" << ":1"; + int beamNumber = 1; + if (fInGrace && fBeamOpened) { + beamNumber = 2; + } + tagName << "beamEnd" << ":"< >::const_iterator xmlpart2guido::findSlur ( con // If there is a grouping, close it! if (fBeamGrouping) { stringstream tagName2; - tagName2 << "beamEnd" << ":2"; + tagName2 << "beamEnd" << ":"< Date: Thu, 9 Jan 2020 18:01:34 +0100 Subject: [PATCH 037/164] xml2guido: Adds unit test for nested beaming of grace notes --- .../xml2guido/GUID-153-DoubleGraceNotes2.xml | 497 ++++++++++++++++++ 1 file changed, 497 insertions(+) create mode 100644 files/xml2guido/GUID-153-DoubleGraceNotes2.xml diff --git a/files/xml2guido/GUID-153-DoubleGraceNotes2.xml b/files/xml2guido/GUID-153-DoubleGraceNotes2.xml new file mode 100644 index 000000000..a9a083136 --- /dev/null +++ b/files/xml2guido/GUID-153-DoubleGraceNotes2.xml @@ -0,0 +1,497 @@ + + + + Serenade for String Orchestra + + Victor Herbert + www.antescofo.com + + Finale v25 for Mac + 2020-01-09 + + + + + + + + + + 6.604 + 40 + + + 1799 + 1272 + + 91 + 91 + 78 + 60 + + + + + 0 + 0 + + 109 + 60 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Serenade for String Orchestra + + + Victor Herbert + + + 4. Canzonetta + + + + Violin + Vln. + + SmartMusicSoftSynth + strings.violin + + + + Bank 1 + + 1 + 15489 + 41 + 80 + -63 + + + + + + + + + + 93 + 0 + + 280 + + system + + + 4 + + -2 + major + + + + G + 2 + + + 95 + + + + + + + F + 4 + + 1 + 16th + up + begin + begin + + + + + + + + G + 4 + + 1 + 16th + up + end + end + + + + (IV) + + + + + F + 4 + + 2 + 1 + eighth + up + begin + + + + + + + E + 4 + + 1 + 1 + 16th + natural + up + continue + begin + + + + + + 2 + + + + + + D + 4 + + 1 + 1 + 16th + up + end + end + + + + + + + + + F + 4 + + 4 + 1 + quarter + up + + + + + + + 152 + + + + + (IV) + + + + + F + 4 + + 2 + 1 + eighth + up + begin + + + + E + 4 + + 1 + 1 + 16th + natural + up + continue + begin + + + + + + + + + C + 1 + 4 + + 1 + 1 + 16th + sharp + up + end + end + + + + + + + + + A + 3 + + 4 + 1 + quarter + up + + + + + + + 151 + + + + + +

      + + + + + + + ord. + + + + + C + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + B + -1 + 4 + + 1 + 16th + flat + up + begin + begin + + + + + C + 5 + + 1 + 16th + up + end + end + + + + B + -1 + 4 + + 1 + 1 + 16th + down + continue + begin + + + + + + + A + 4 + + 1 + 1 + 16th + down + end + end + + + + + + + D + 5 + + 3 + 1 + eighth + + down + begin + + + + 0 + + + + + + D + 5 + + 1 + 1 + 16th + down + end + backward hook + + + + + + + G + 5 + + 2 + 1 + eighth + down + begin + + + + + F + 5 + + 1 + 16th + natural + up + begin + begin + + + + + + + + G + 5 + + 1 + 16th + up + end + end + + + + F + 5 + + 1 + 1 + 16th + down + continue + begin + + + + + + + E + 5 + + 1 + 1 + 16th + natural + down + end + end + + + + F + 5 + + 4 + 1 + quarter + down + + + light-heavy + + + + + From b74971ca76818b87d851518ea582ca105bbac211 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 21 Jan 2020 16:36:10 +0100 Subject: [PATCH 038/164] xml2guido: evade slur generation on musicxml if start and stop do not correspond (Finale bug) --- src/guido/xmlpart2guido.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index d88ee7dc7..5e4d30821 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1366,6 +1366,13 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { iterSlur = iter->find(k_slur); if (iterSlur != iter->end()) { + + if ((iterSlur->getAttributeValue("type")=="start") && + ((iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber)) && + (thisNoteVoice == fTargetVoice)) { + return false; + } + if ((iterSlur->getAttributeValue("type")=="stop") && (iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber) ) { @@ -1400,10 +1407,13 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { if (slurEndToBeErase != fSlurStack.end()) { lastSlurInternalNumber = slurEndToBeErase->first; }else { + cerr<<"\tSlurEnd with NO opening??? line:"<<(*i)->getInputLineNumber()<getInputLineNumber() <<" xmlNum:"<< (*i)->getAttributeIntValue("number", 0)<<" GuidoNum="<getInputLineNumber() <<": Got Slur Stop with number:"<< (*i)->getAttributeIntValue("number", 0) <<" without a Slur in Stack. Skipping!"<getInputLineNumber() <<": Got Slur Stop with number:"<< (*i)->getAttributeIntValue("number", 0) <<" without a Slur in Stack. Skipping!"< Date: Tue, 21 Jan 2020 16:37:14 +0100 Subject: [PATCH 039/164] removed debug cerr --- src/guido/xmlpart2guido.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 5e4d30821..7a86855b2 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1410,7 +1410,6 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { cerr<<"\tSlurEnd with NO opening??? line:"<<(*i)->getInputLineNumber()<getInputLineNumber() <<" xmlNum:"<< (*i)->getAttributeIntValue("number", 0)<<" GuidoNum="<getInputLineNumber() <<": Got Slur Stop with number:"<< (*i)->getAttributeIntValue("number", 0) <<" without a Slur in Stack. Skipping!"< Date: Tue, 21 Jan 2020 16:38:12 +0100 Subject: [PATCH 040/164] removed cerr --- src/guido/xmlpart2guido.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 7a86855b2..e034501ae 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1407,7 +1407,6 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { if (slurEndToBeErase != fSlurStack.end()) { lastSlurInternalNumber = slurEndToBeErase->first; }else { - cerr<<"\tSlurEnd with NO opening??? line:"<<(*i)->getInputLineNumber()< Date: Wed, 22 Jan 2020 18:40:28 +0100 Subject: [PATCH 041/164] xml2guido: Ability to handle nested ties with correct sequencing of TieEnd in case of Chord creation with unit tests --- files/xml2guido/GUID-162-UnitTest.xml | 514 ++++++++++++++++++++ files/xml2guido/Guid-163-MultiTie-fixed.xml | 215 ++++++++ src/guido/guido.cpp | 18 +- src/guido/guido.h | 28 +- src/guido/xmlpart2guido.cpp | 50 +- src/guido/xmlpart2guido.h | 1 + 6 files changed, 810 insertions(+), 16 deletions(-) create mode 100644 files/xml2guido/GUID-162-UnitTest.xml create mode 100644 files/xml2guido/Guid-163-MultiTie-fixed.xml diff --git a/files/xml2guido/GUID-162-UnitTest.xml b/files/xml2guido/GUID-162-UnitTest.xml new file mode 100644 index 000000000..e627fc45c --- /dev/null +++ b/files/xml2guido/GUID-162-UnitTest.xml @@ -0,0 +1,514 @@ + + + + Orphée aux enfers + + Jacques Offenbach + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2020-01-21 + + + + + + + + + + 6.096 + 40 + + + 1949 + 1378 + + 98 + 98 + 98 + 98 + + + + + 0 + 0 + + 151 + 98 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Orphée aux enfers + + + Jacques Offenbach + + + French Cancan + + + + Violin + Vn. + + SmartMusic SoftSynth + strings.violin + + + + 3 + 15489 + 41 + 80 + 0 + + + + + + + + + + 75 + 0 + + 289 + + system + + + 2 + + 2 + major + + + + G + 2 + + + + + + + C + 1 + 6 + + 1 + eighth + up + + + + + + + B + 5 + + 1 + 1 + eighth + down + begin + + + + + + + + + + A + 5 + + 1 + 1 + eighth + down + end + + + + + + + + + + A + 5 + + 2 + 1 + quarter + down + + + + + + + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + + 3 + 6 + + 156 + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + F + 1 + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + + 0 + 9 + + 168 + + + + + + + + + + + + + D + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + + + + + D + 5 + + 4 + 1 + half + down + + + 2 + + + + + + + D + 6 + + 4 + 1 + half + down + + + light-heavy + + + + + diff --git a/files/xml2guido/Guid-163-MultiTie-fixed.xml b/files/xml2guido/Guid-163-MultiTie-fixed.xml new file mode 100644 index 000000000..10edba4a6 --- /dev/null +++ b/files/xml2guido/Guid-163-MultiTie-fixed.xml @@ -0,0 +1,215 @@ + + + + Sonata No.3 in F major + + Johann Ernst Galliard + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2020-01-22 + + + + + + + + + + 6.2653 + 40 + + + 1896 + 1341 + + 96 + 96 + 96 + 96 + + + + + 0 + 0 + + 147 + 96 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + www.antescofo.com + + + Sonata No.3 in F major + + + Johann Ernst Galliard + + + 4. Allegro spiritoso + + + + Cello + Cello + + SmartMusic SoftSynth + strings.cello + + + + 6 + 15489 + 43 + 80 + 0 + + + + + + + + + + 64 + 0 + + 217 + + system + + + 2 + + -1 + major + + + + F + 4 + + + + + + F + 2 + + 3 + 1 + quarter + + down + + + + + + + + + + C + 3 + + 3 + 1 + quarter + + down + + + + + A + 3 + + 3 + + 1 + quarter + + down + + + + + + + + F + 4 + + 3 + + 1 + quarter + + down + + + + + + + A + 3 + + 2 + + 1 + quarter + down + + + + + + + + F + 4 + + 2 + + 1 + quarter + down + + + + + + light-heavy + + + + + diff --git a/src/guido/guido.cpp b/src/guido/guido.cpp index 931dd3e86..7dee4b429 100644 --- a/src/guido/guido.cpp +++ b/src/guido/guido.cpp @@ -133,12 +133,26 @@ void guidochord::print(ostream& os) const { os << fStartList; int n = countNotes(); - const char* seqsep = ""; + std::string seqsep = ""; for (auto e: fElements) { + // checking for elements separator // sequences (i.e. score) are handled as chords // that's why there are special cases for seq - const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + //const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + std::string sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + /// Handle the special cases: + /// - If we are in a chord and e is a note, and next event is TieEnd, then the separater is " " and "," should be applied after TieEnd! + Sguidoelement next_e, pre_e; + bool nextExist = getNext(e, next_e); + bool preExist = getPrev(e, pre_e); + + if ((e->isNote())&& nextExist && (next_e->getName().find("tieEnd") != std::string::npos) ) { + sep = " "; + } + if ((e->getName().find("tieEnd") != std::string::npos) && (preExist) && (pre_e->isNote()) && nextExist) { + sep = ", "; + } os << seqsep << e << sep; if (e->isSeq()) seqsep = ", \n"; } diff --git a/src/guido/guido.h b/src/guido/guido.h index a9b7f087b..9593383a3 100755 --- a/src/guido/guido.h +++ b/src/guido/guido.h @@ -96,7 +96,33 @@ class EXP guidoelement : public smartable { virtual bool isNote () const { return false; } int countNotes () const; - + + /// Get next subelement + const bool getNext(Sguidoelement &i, Sguidoelement &next_e) const { + std::vector::const_iterator e = find(fElements.begin(), fElements.end(), i); + if (e != fElements.end()) { + auto next = std::next(e); + if (next != fElements.end()) { + next_e = *next; + return true; + } + } + return false; + } + + const bool getPrev(Sguidoelement &i, Sguidoelement &next_e) const { + std::vector::const_reverse_iterator e = find(fElements.rbegin(), fElements.rend(), i); + if (e != fElements.rend()) { + auto next = std::next(e); + if (next != fElements.rend()) { + next_e = *next; + return true; + } + } + return false; + } + + protected: guidoelement(std::string name, std::string sep=" "); virtual ~guidoelement(); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index e034501ae..fda84e513 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1263,10 +1263,20 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) std::vector::const_iterator i; for (i = tied.begin(); i != tied.end(); i++) { if ((*i)->getAttributeValue("type") == "start") { - Sguidoelement tag = guidotag::create("tieBegin"); + /// MusicXML does not always contain the "number" attribtue! if not, we'll assign them ourselves! + stringstream tagName; + if (fTiedOpen.empty()) { + fTiedOpen.push(1); + }else { + fTiedOpen.push( fTiedOpen.back()+1 ); + } string num = (*i)->getAttributeValue ("number"); - if (num.size()) - tag->add (guidoparam::create(num, false)); + if (num.size()) { + tagName << "tieBegin" << ":"<< num; + }else{ + tagName << "tieBegin" << ":"<< fTiedOpen.back(); + } + Sguidoelement tag = guidotag::create(tagName.str()); string placement = (*i)->getAttributeValue("orientation"); if (placement == "under") tag->add (guidoparam::create("curve=\"down\"", false)); @@ -1277,13 +1287,25 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) void xmlpart2guido::checkTiedEnd ( const std::vector& tied ) { + // Don't even bother if there is no priorly opened Tied + if (fTiedOpen.empty()) { + return; + } std::vector::const_iterator i; for (i = tied.begin(); i != tied.end(); i++) { if ((*i)->getAttributeValue("type") == "stop") { - Sguidoelement tag = guidotag::create("tieEnd"); + /// MusicXML does not always contain the "number" attribtue! We'll assign them ourselves! + stringstream tagName; string num = (*i)->getAttributeValue ("number"); - if (num.size()) - tag->add (guidoparam::create(num, false)); + if (num.size()) { + tagName << "tieEnd" << ":"<< num; + }else{ + tagName << "tieEnd" << ":"<< fTiedOpen.front(); + } + + Sguidoelement tag = guidotag::create(tagName.str()); + + fTiedOpen.pop(); add(tag); } } @@ -2423,6 +2445,9 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) //______________________________________________________________________________ void xmlpart2guido::newNote ( const notevisitor& nv, rational posInMeasure, const S_note& elt) { + // Check for Tied Begin + checkTiedBegin(nv.getTied()); + // Fingering is tied to single notes (in chords) int hasFingerings = 0; // 0 if none, greater otherwise! if (nv.getFingerings().size()) { @@ -2521,15 +2546,19 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } } - if (noteFormat == true) { push(noteFormatTag); } } + // Tie End should appear BEFORE the note itself in Guido: + add (note); + checkTiedEnd(nv.getTied()); + + if (noteFormat) pop(); @@ -2543,7 +2572,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } } - //checkTiedEnd (nv.getTied()); } int xmlpart2guido::checkNoteFormatDx ( const notevisitor& nv , rational posInMeasure) @@ -2711,10 +2739,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (notevisitor::getType()==kRest) pendingPops += checkRestFormat(*this); - - // Check for TIES before creating the chord sequence. \tieBeing and \tieEnd should live OUTSIDE chord sequence in Guido - checkTiedBegin((*this).getTied()); - + vector chord = getChord(elt); if (chord.size()) { @@ -2738,7 +2763,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) newNote (nv, thisNoteHeadPosition, elt); } - checkTiedEnd((*this).getTied()); isProcessingChord = false; while (pendingPops--) pop(); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index e40d24462..7667da761 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -81,6 +81,7 @@ class EXP xmlpart2guido : int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets + std::queue fTiedOpen; // Number of ongoing opened Tied std::queue fDirectionEraserStack; // To skip already visited Directions when looking ahead because of grace notes std::vector< std::pair > fSlurStack; // first int: Internal num, 2nd int: XML num From 7cb42a738e746a7b7304c87059f824c62daab34e Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 22 Jan 2020 18:45:34 +0100 Subject: [PATCH 042/164] Revert back to const char* as before --- src/guido/guido.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/guido/guido.cpp b/src/guido/guido.cpp index 7dee4b429..15d055a8f 100644 --- a/src/guido/guido.cpp +++ b/src/guido/guido.cpp @@ -133,14 +133,13 @@ void guidochord::print(ostream& os) const { os << fStartList; int n = countNotes(); - std::string seqsep = ""; + const char* seqsep = ""; for (auto e: fElements) { // checking for elements separator // sequences (i.e. score) are handled as chords // that's why there are special cases for seq - //const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; - std::string sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; + const char* sep = ((e->isNote() || (!e->isSeq() && e->countNotes())) && --n) ? ", " : " "; /// Handle the special cases: /// - If we are in a chord and e is a note, and next event is TieEnd, then the separater is " " and "," should be applied after TieEnd! Sguidoelement next_e, pre_e; From 3802919907a5b57f2628b19c509eb6f1fd7e40af Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 7 Feb 2020 18:33:34 +0100 Subject: [PATCH 043/164] Remove WASM for Javascript (Antescofo only) --- javascript/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/Makefile b/javascript/Makefile index 99b7b4894..e16e1906d 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -74,7 +74,7 @@ $(npmdir)/$(library).js : $(library).js # building the library as web assembly ############################################################## $(library).js : $(objects) - emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=1 + emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=0 clean: rm -f $(objects) $(target) From 46fecb6756a14f1b35e20d3f2427a7a50c5e4182 Mon Sep 17 00:00:00 2001 From: Victor Lenoir Date: Wed, 12 Feb 2020 10:39:26 +0100 Subject: [PATCH 044/164] src/guido/guido.h: add missing algorithm include for std::find --- src/guido/guido.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/guido/guido.h b/src/guido/guido.h index 9593383a3..f86031f2b 100755 --- a/src/guido/guido.h +++ b/src/guido/guido.h @@ -16,6 +16,7 @@ #include #include #include +#include #include "exports.h" #include "smartpointer.h" From 3c5c8093a2b09e9403c94a246a48463c98dcf7a9 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 21 Feb 2020 17:30:42 +0100 Subject: [PATCH 045/164] xml2guido: Fingering on chords based on new syntax. - Created specific method for chord generation: splitting fingering based on placement on lowest/highest note in the chord. - Note generation is called inside Chord generation and for single notes only. Fingering is a parameter. This prepares future improvements similar to "ties" where tags are on the note-level instead of chord level. (FIX GUID-160) --- src/guido/xmlpart2guido.cpp | 167 +++++++++++++++++++++++------------- src/guido/xmlpart2guido.h | 5 +- 2 files changed, 108 insertions(+), 64 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index fda84e513..6234cceee 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2211,9 +2211,10 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } //______________________________________________________________________________ - vector xmlpart2guido::getChord ( const S_note& elt ) + deque xmlpart2guido::getChord ( const S_note& elt ) { - vector v; + deque notevisitors; + ctree::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), elt); if (nextnote != fCurrentMeasure->end()) nextnote++; // advance one step while (nextnote != fCurrentMeasure->end()) { @@ -2221,13 +2222,23 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if ((nextnote->getType() == k_note) && (nextnote->getIntValue(k_voice,0) == fTargetVoice)) { ctree::iterator iter; // and when there is one iter = nextnote->find(k_chord); - if (iter != nextnote->end()) - v.push_back(*nextnote); - else break; + if (iter != nextnote->end()) { + //v.push_back(*nextnote); + + notevisitor nv; + xml_tree_browser browser(&nv); + Sxmlelement note = *nextnote; + browser.browse(*note); + + notevisitors.push_back(nv); + } + else { + break; + } } nextnote++; } - return v; + return notevisitors; } vector xmlpart2guido::getChord ( const Sxmlelement& elt ) @@ -2442,47 +2453,85 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) return dur; } +void xmlpart2guido::newChord(const deque& nvs, rational posInMeasure) { + // Fingering treatment: Bring all fingerings together in two vectors for placement below/above. The "above" placement should be hooked to the highest pitch in the chord, and "below" to the lowest. + std::vector belowFingerings; + std::vector aboveFingerings; + int highestPitchIndex = 0, lowestPitchIndex = 0, counter =0; + float lowestPitch = 128, highestPitch = 0; + for (auto note: nvs) { + auto localFingerings = note.getFingerings(); + for (auto fingering: localFingerings) { + std::string placement = fingering->getAttributeValue("placement"); + if (placement == "below") { + belowFingerings.push_back(fingering); + }else { + aboveFingerings.push_back(fingering); + } + } + + float localPitch = note.getMidiPitch(); + if (localPitch > highestPitch) { + highestPitch = localPitch; + highestPitchIndex = counter; + } + if (localPitch < lowestPitch) { + lowestPitch = localPitch; + lowestPitchIndex = counter; + } + + // increment index counter + counter++; + } + + // Generate notes with correct fingering + std::vector emptyFingerings; + for ( int index = 0; index < nvs.size(); index++) { + if (index == lowestPitchIndex) { + newNote(nvs.at(index), posInMeasure, belowFingerings); + continue; + }else if (index == highestPitchIndex) { + newNote(nvs.at(index), posInMeasure, aboveFingerings); + }else { + newNote(nvs.at(index), posInMeasure, emptyFingerings); + } + } +} + //______________________________________________________________________________ - void xmlpart2guido::newNote ( const notevisitor& nv, rational posInMeasure, const S_note& elt) + void xmlpart2guido::newNote( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings) { // Check for Tied Begin checkTiedBegin(nv.getTied()); // Fingering is tied to single notes (in chords) int hasFingerings = 0; // 0 if none, greater otherwise! - if (nv.getFingerings().size()) { - auto fingerings = nv.getFingerings(); + if (fingerings.size()) { + Sguidoelement tag = guidotag::create("fingering"); + stringstream s; + + /// Add Placement + std::string placement = fingerings[0]->getAttributeValue("placement"); + if (placement.size() > 0) { + s << "position=\""<::iterator nextnote; -// if (findNextNote(elt, nextnote)) { -// int nextNoteDefaultX = nextnote->getAttributeIntValue("default-x", 0); -// int thisNoteDefaultX = elt->getAttributeIntValue("default-x", 0); -// int fingeringDefaultX = fingerings[i]->getAttributeIntValue("default-x", 0); -// if (fingeringDefaultX+thisNoteDefaultX > nextNoteDefaultX) { -// cerr<<"XML2Guido: Fingering X-position ("<"<getInputLineNumber()<<", measure:"<< fMeasNum<<" bypasses proceeding note("<getValue(); - stringstream s; - s << "text=\"" << fingeringText << "\""; - /// Get placement: AVOIDING since rendering is not coherent! - std::string placement = fingerings[i]->getAttributeValue("placement"); - if (placement.size() > 0) { - s << ", position=\""<add (guidoparam::create(s.str(), false)); - /// GUID-156: x-pos is highly dependent on Layout. AVOID! - //xml2guidovisitor::addPosX(fingerings[i], tag, 0); // xml x-pos can be safely added - /// In MusicXML, default-y for Fingering is from TOP of the staff. Dy in Guido is from the NOTEHEAD. Therefore the dy is a function of the Note and the Clef! - /// GUID-160: Remove verticals to allow automatic positioning of stacks in GuidoLib - //addPosYforNoteHead(nv, fingerings[i], tag, 2); // FIXME: +2 offset is experimental - push(tag); - hasFingerings++; } + tag->add (guidoparam::create(s.str(), false)); + push(tag); + hasFingerings++; } int octave = nv.getOctave() - 3; // octave offset between MusicXML and GUIDO is -3 @@ -2551,9 +2600,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) push(noteFormatTag); } } - - // Tie End should appear BEFORE the note itself in Guido: - + add (note); checkTiedEnd(nv.getTied()); @@ -2740,28 +2787,32 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (notevisitor::getType()==kRest) pendingPops += checkRestFormat(*this); - vector chord = getChord(elt); + deque chord = getChord(elt); + + // Add chord or note with proper preprocessing if (chord.size()) { - Sguidoelement chord = guidochord::create(); - //// FIXME: The following line removed since it introduced bad behavior on REINE de La NUIT Piano accompaniment! - //pendingPops += checkNoteFormatDx(*this, thisNoteHeadPosition); - push (chord); + Sguidoelement chordtag = guidochord::create(); + push (chordtag); pendingPops++; isProcessingChord = true; + // Add current note to the beginning of the Chord vector to separate processing of notes and chords + chord.push_front(*this); + + newChord(chord, thisNoteHeadPosition); + }else { + newNote (*this, thisNoteHeadPosition, this->getFingerings()); } - newNote (*this, thisNoteHeadPosition, elt); // Add chord notes (in case of a real chord) - for (vector::const_iterator iter = chord.begin(); iter != chord.end(); iter++) { - isProcessingChord = true; - notevisitor nv; - xml_tree_browser browser(&nv); - Sxmlelement note = *iter; - browser.browse(*note); - checkStaff(nv.getStaff()); - newNote (nv, thisNoteHeadPosition, elt); - } +// for (vector::const_iterator iter = chord.begin(); iter != chord.end(); iter++) { +// notevisitor nv; +// xml_tree_browser browser(&nv); +// Sxmlelement note = *iter; +// browser.browse(*note); +// checkStaff(nv.getStaff()); +// newNote (nv, thisNoteHeadPosition, elt); +// } isProcessingChord = false; @@ -2784,14 +2835,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) checkTextEnd(); } - /* - if (fBeamStack.size()==0) - { - // this is will close any ongoing Guido TEXT tag once a sequence is embedded - // In case of ongoing \Beam, do it after the \beam is closed! (Potential Guido parser issue) - checkTextEnd(); - }*/ - checkPostArticulation(*this); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 7667da761..074f2d62b 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -127,7 +127,7 @@ class EXP xmlpart2guido : int checkChordOrnaments ( const notevisitor& note ); // returns the count of articulations pushed on the stack - std::vector getChord ( const S_note& note ); // build a chord vector + deque getChord ( const S_note& note ); // build a chord vector std::vector getChord ( const Sxmlelement& note ); // build a chord vector void checkStaff (int staff ); // check for staff change void checkStem ( const S_stem& stem ); @@ -153,7 +153,8 @@ class EXP xmlpart2guido : void checkWavyTrillBegin ( const notevisitor& nv ); void checkWavyTrillEnd ( const notevisitor& nv ); void checkTextEnd(); - void newNote ( const notevisitor& nv, rational posInMeasure, const S_note& elt); + void newNote ( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings); + void newChord (const deque& nvs, rational posInMeasure); int checkTremolo(const notevisitor& note, const S_note& elt); From 551b760e60ac567c77d41dc034a06cb438c03de0 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 21 Feb 2020 17:32:48 +0100 Subject: [PATCH 046/164] code cleanup --- src/guido/xmlpart2guido.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 6234cceee..a3db762a5 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2223,13 +2223,10 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) ctree::iterator iter; // and when there is one iter = nextnote->find(k_chord); if (iter != nextnote->end()) { - //v.push_back(*nextnote); - notevisitor nv; xml_tree_browser browser(&nv); Sxmlelement note = *nextnote; browser.browse(*note); - notevisitors.push_back(nv); } else { @@ -2804,16 +2801,6 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur newNote (*this, thisNoteHeadPosition, this->getFingerings()); } - // Add chord notes (in case of a real chord) -// for (vector::const_iterator iter = chord.begin(); iter != chord.end(); iter++) { -// notevisitor nv; -// xml_tree_browser browser(&nv); -// Sxmlelement note = *iter; -// browser.browse(*note); -// checkStaff(nv.getStaff()); -// newNote (nv, thisNoteHeadPosition, elt); -// } - isProcessingChord = false; while (pendingPops--) pop(); From d85d665939ab080ef515ad3534f3086cc2a71b9d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 25 Feb 2020 14:03:29 +0100 Subject: [PATCH 047/164] Fermatas now do not inherit y-position from XML to allow GuidoLib to take care of collisions. Added Unit Tests for other bugs. This fixes: GUID-157, GUID-91, GUID-141, GUID-136 and GUID-91 --- files/xml2guido/GUID-141-CrossStaffSlurs.xml | 1376 ++++++++++++++ ....xml => GUID-145-CautionaryOnKeyNotes.xml} | 0 files/xml2guido/GUID-149-Slurs.xml | 1047 +++++++++++ .../GUID-160-ArticulationFingeringStack1.xml | 1587 +++++++++++++++++ files/xml2guido/GUID-91-EmbeddedSlurs.xml | 768 ++++++++ files/xml2guido/GUID-91-SlurGrace.xml | 655 +++++++ files/xml2guido/GUID157-CrossStaff.xml | 233 +++ src/guido/xmlpart2guido.cpp | 18 +- 8 files changed, 5675 insertions(+), 9 deletions(-) create mode 100644 files/xml2guido/GUID-141-CrossStaffSlurs.xml rename files/xml2guido/{GUID145-CautionaryOnKeyNotes.xml => GUID-145-CautionaryOnKeyNotes.xml} (100%) create mode 100644 files/xml2guido/GUID-149-Slurs.xml create mode 100644 files/xml2guido/GUID-160-ArticulationFingeringStack1.xml create mode 100644 files/xml2guido/GUID-91-EmbeddedSlurs.xml create mode 100644 files/xml2guido/GUID-91-SlurGrace.xml create mode 100644 files/xml2guido/GUID157-CrossStaff.xml diff --git a/files/xml2guido/GUID-141-CrossStaffSlurs.xml b/files/xml2guido/GUID-141-CrossStaffSlurs.xml new file mode 100644 index 000000000..9d9e43bc7 --- /dev/null +++ b/files/xml2guido/GUID-141-CrossStaffSlurs.xml @@ -0,0 +1,1376 @@ + + + + Romance + + Camille Saint-Saëns + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2019-09-27 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 143 + 93 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Romance + + + composer + Camille Saint-Saëns + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 75 + 0 + + 273 + + + 78 + + system + + + 4 + + -5 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + 1 + 1 + 16th + 1 + + + + F + 3 + + 1 + 1 + 16th + up + 2 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + + + 16 + + + + D + -1 + 2 + + 16 + 2 + whole + 2 + + + + + D + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 166 + + + 78 + + + + + 1 + 1 + 16th + 1 + + + + F + 3 + + 1 + 1 + 16th + up + 2 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + + + 16 + + + + D + -1 + 2 + + 16 + 2 + whole + 2 + + + + + D + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 1 + 1 + 16th + 1 + + + + F + 3 + + 1 + 1 + 16th + up + 2 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 2 + continue + continue + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 3 + + 1 + 1 + 16th + up + 2 + end + end + + + + + + 16 + + + + D + -1 + 2 + + 16 + 2 + whole + 2 + + + + + D + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 165 + + + 78 + + + + + 1 + 1 + 16th + 1 + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + + + 16 + + + + E + -1 + 2 + + 16 + 2 + whole + 2 + + + + + E + -1 + 3 + + 16 + 2 + whole + 2 + + + + + + + 1 + 1 + 16th + 1 + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + + + + C + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + G + -1 + 4 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + F + 4 + + 1 + 1 + 16th + up + 1 + begin + begin + + + + D + -1 + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + F + 4 + + 1 + 1 + 16th + up + 1 + continue + continue + + + + A + -1 + 3 + + 1 + 1 + 16th + up + 1 + end + end + + + + + + 16 + + + + F + 2 + + 16 + 2 + whole + 2 + + + + + F + 3 + + 16 + 2 + whole + 2 + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID145-CautionaryOnKeyNotes.xml b/files/xml2guido/GUID-145-CautionaryOnKeyNotes.xml similarity index 100% rename from files/xml2guido/GUID145-CautionaryOnKeyNotes.xml rename to files/xml2guido/GUID-145-CautionaryOnKeyNotes.xml diff --git a/files/xml2guido/GUID-149-Slurs.xml b/files/xml2guido/GUID-149-Slurs.xml new file mode 100644 index 000000000..a83b96cb5 --- /dev/null +++ b/files/xml2guido/GUID-149-Slurs.xml @@ -0,0 +1,1047 @@ + + + + Wiegenlied + + Franz Schubert + www.antescofo.com + + Finale v25 for Mac + 2019-10-28 + + + + + + + + + + 6.4347 + 40 + + + 1846 + 1305 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 143 + 93 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + www.antescofo.com + + + Wiegenlied + + + Franz Schubert + + + Lullaby + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 66 + 0 + + 269 + + + 86 + + system + + + 4 + + -1 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + C + 4 + + 4 + 1 + quarter + up + 1 + + + + + E + 4 + + 4 + 1 + quarter + up + 1 + + + + + G + 4 + + 4 + 1 + quarter + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + E + 4 + + 2 + 1 + eighth + up + 1 + + + + + G + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + end + + + + + E + 4 + + 2 + 1 + eighth + up + 1 + + + + + G + 4 + + 2 + 1 + eighth + up + 1 + + + + F + 4 + + 3 + 1 + eighth + + up + 1 + begin + + + + + + + + A + 4 + + 3 + 1 + eighth + + up + 1 + + + + E + 4 + + 1 + 1 + 16th + up + 1 + end + backward hook + + + + + G + 4 + + 1 + 1 + 16th + up + 1 + + + + F + 4 + + 4 + 1 + quarter + up + 1 + + + + + + 16 + + + 8 + 2 + 1 + + + + C + 4 + + 8 + 2 + half + down + 1 + + + 16 + + + + C + 3 + + 4 + 3 + quarter + up + 2 + + + + C + 3 + + 2 + 3 + eighth + up + 2 + begin + + + + C + 3 + + 2 + 3 + eighth + up + 2 + end + + + + F + 3 + + 3 + 3 + eighth + + down + 2 + begin + + + + + + + C + 3 + + 1 + 3 + 16th + down + 2 + end + backward hook + + + + A + 2 + + 4 + 3 + quarter + up + 2 + + + + + + + + + + 152 + + + 100 + + + + + C + 5 + + 4 + 1 + quarter + up + 1 + + + + + + + E + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + B + -1 + 4 + + 2 + 1 + eighth + up + 1 + + + + F + 4 + + 2 + 1 + eighth + up + 1 + end + + + + + + + + A + 4 + + 2 + 1 + eighth + up + 1 + + + + G + 4 + + 6 + 1 + quarter + + up + 1 + + + + + + + G + 1 + 4 + + 2 + 1 + eighth + sharp + up + 1 + + + + + + 16 + + + + C + 4 + + 8 + 2 + half + down + 1 + + + + C + 4 + + 8 + 2 + half + down + 1 + + + + + E + 4 + + 8 + 2 + half + down + 1 + + + 16 + + + + A + 3 + + 4 + 3 + quarter + down + 2 + + + + + + + G + 3 + + 2 + 3 + eighth + down + 2 + begin + + + + F + 3 + + 2 + 3 + eighth + down + 2 + end + + + + + + + C + 3 + + 8 + 3 + half + up + 2 + + + + + + + F + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + + + + A + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + F + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + + A + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + end + + + + E + 4 + + 2 + 1 + eighth + up + 1 + begin + + + + + B + -1 + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + E + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + + G + 4 + + 2 + 1 + eighth + natural + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + end + + + + + + 16 + + + + F + 2 + + 8 + 3 + half + up + 2 + + + + + F + 3 + + 8 + 3 + half + up + 2 + + + + C + 2 + + 8 + 3 + half + up + 2 + + + + + C + 3 + + 8 + 3 + half + up + 2 + + + + + + + A + 4 + + 4 + 1 + quarter + up + 1 + + + + + + + E + 4 + + 4 + 1 + quarter + up + 1 + + + + + + + + G + 4 + + 4 + 1 + quarter + up + 1 + + + + A + 3 + + 2 + 1 + eighth + up + 1 + begin + + + + + + + + F + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + eighth + up + 1 + continue + + + + A + 3 + + 2 + 1 + eighth + up + 1 + continue + + + + + F + 4 + + 2 + 1 + eighth + up + 1 + + + + C + 5 + + 2 + 1 + eighth + up + 1 + end + + + + + + 16 + + + + F + 4 + + 2 + 2 + eighth + down + 1 + begin + + + + + + + C + 4 + + 2 + 2 + eighth + down + 1 + end + + + + B + -1 + 3 + + 2 + 2 + eighth + down + 1 + begin + + + + C + 4 + + 2 + 2 + eighth + down + 1 + end + + + + + + 8 + 2 + 1 + + + 16 + + + + F + 2 + + 4 + 3 + quarter + up + 2 + + + + + F + 3 + + 4 + 3 + quarter + up + 2 + + + + C + 3 + + 4 + 3 + quarter + up + 2 + + + + F + 2 + + 8 + 3 + half + up + 2 + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID-160-ArticulationFingeringStack1.xml b/files/xml2guido/GUID-160-ArticulationFingeringStack1.xml new file mode 100644 index 000000000..a14a2d515 --- /dev/null +++ b/files/xml2guido/GUID-160-ArticulationFingeringStack1.xml @@ -0,0 +1,1587 @@ + + + + Stack articulations II + + www.antescofo.com + + Finale v25 for Mac + 2020-02-19 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 156 + 62 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + + Violin + Vn. + + ARIA Player + strings.violin + + + + ARIA Player + + 1 + 1 + 80 + -63 + + + + + + + + + 248 + + system + + + 4 + + 3 + major + + + + G + 2 + + + + + + A + 4 + + 2 + 1 + eighth + up + + + 1 + + + + + + + + + + A + 5 + + 2 + 1 + eighth + up + + + + B + 4 + + 2 + 1 + eighth + up + + + + + + 2 + + + + + + C + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + + + D + 5 + + 2 + 1 + eighth + up + + + + + + + + + + E + 5 + + 2 + 1 + eighth + up + + + 0 + + + + + + + F + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + 5 + + + + + + G + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + 4 + + + + + + A + 5 + + 2 + 1 + eighth + up + + + + + + + + + + + + A + 5 + + 2 + 1 + eighth + up + + + + + + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + up + + + + + + 1 + + + + + + F + 1 + 5 + + 2 + 1 + eighth + up + + + + 1 + + + + + + E + 5 + + 2 + 1 + eighth + up + + + 0 + + + + + + D + 5 + + 2 + 1 + eighth + up + + + + + + + + + + + + C + 1 + 5 + + 2 + 1 + eighth + up + + + + + + + + + B + 4 + + 2 + 1 + eighth + up + + + + + + + + + + + + A + 4 + + 2 + 1 + eighth + up + + + 0 + + + + + + + + + + 216 + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + + + + + + 0 + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + 2 + + + + + + D + 5 + + 2 + 1 + eighth + down + + + + + + 1 + + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + + + + 0 + + + + + + B + 4 + + 2 + 1 + eighth + down + + + + + + 2 + + + + + + A + 4 + + 2 + 1 + eighth + down + + + + + + 1 + + + + + + G + 1 + 4 + + 2 + 1 + eighth + down + + + + + + 4 + + + + + + F + 1 + 4 + + 2 + 1 + eighth + down + + + + + + + + + + + + + + 216 + + + + + A + 4 + + 2 + 1 + eighth + up + begin + + + + + + + + + + + + G + 1 + 4 + + 2 + 1 + eighth + up + continue + + + + + + 1 + + + + + + F + 1 + 4 + + 2 + 1 + eighth + up + continue + + + + 1 + + + + + + E + 4 + + 2 + 1 + eighth + up + continue + + + 0 + + + + + + + + + D + 4 + + 2 + 1 + eighth + up + continue + + + + + + + + + + + + C + 1 + 4 + + 2 + 1 + eighth + up + continue + + + + + + 3 + + + + + + B + 3 + + 2 + 1 + eighth + up + continue + + + + + + + + + 5 + + + + + + A + 3 + + 1 + 1 + 16th + up + continue + begin + + + 0 + + + + + + + + + A + 3 + + 1 + 1 + 16th + up + end + end + + + + + + + + + + 252 + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + 2 + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + 4 + + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + end + + + + + + 2 + + + + + + E + 5 + + 2 + 1 + eighth + down + begin + + + + + + 0 + + + + + + D + 5 + + 2 + 1 + eighth + down + continue + + + + + + 2 + + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + + + 1 + + + + + + B + 4 + + 2 + 1 + eighth + down + continue + + + + + + 0 + + + + + + A + 4 + + 2 + 1 + eighth + down + end + + + + + + + + + + + + + + 215 + + + + + E + 4 + + 2 + 1 + eighth + down + begin + + + 1 + 2 + 5 + + + + + + + G + 1 + 4 + + 2 + 1 + eighth + down + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + + F + 1 + 4 + + 2 + 1 + eighth + down + continue + + + 2 + 4 + 1 + + + + + + + A + 4 + + 2 + 1 + eighth + down + + + + + D + 5 + + 2 + 1 + eighth + down + + + + A + 4 + + 2 + 1 + eighth + down + continue + + + 3 + 5 + 1 + + + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + + + + B + 4 + + 2 + 1 + eighth + down + end + + + + + + + + + + + D + 5 + + 2 + 1 + eighth + down + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + + + 5 + + + + + + + F + 1 + 5 + + 2 + 1 + eighth + down + + + + + B + 5 + + 2 + 1 + eighth + down + + + + E + 5 + + 2 + 1 + eighth + down + continue + + + + + + 1 + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + + C + 1 + 6 + + 2 + 1 + eighth + down + + + + F + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + + + + + + + + + + B + 5 + + 2 + 1 + eighth + down + + + + + F + 1 + 6 + + 2 + 1 + eighth + down + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + E + 6 + + 2 + 1 + eighth + down + + + + + C + 1 + 7 + + 2 + 1 + eighth + down + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + + + + D + 6 + + 2 + 1 + eighth + down + + + + + B + 6 + + 2 + 1 + eighth + down + + + + F + 1 + 5 + + 2 + 1 + eighth + down + continue + + + + + + 3 + + + + + + + B + 5 + + 2 + 1 + eighth + down + + + + + F + 1 + 6 + + 2 + 1 + eighth + down + + + + E + 5 + + 2 + 1 + eighth + down + continue + + + + + + + 0 + + + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + + C + 1 + 6 + + 2 + 1 + eighth + down + + + + D + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + D + 5 + + 2 + 1 + eighth + down + begin + + + + 2 + 3 + 5 + + + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + + + + + B + 5 + + 2 + 1 + eighth + down + + + + + + + A + 4 + + 2 + 1 + eighth + down + continue + + + + 4 + + + + + + + E + 5 + + 2 + 1 + eighth + down + + + + + D + 6 + + 2 + 1 + eighth + down + + + + F + 1 + 4 + + 2 + 1 + eighth + down + continue + + + + + + + 5 + 2 + + + + + + + B + 4 + + 2 + 1 + eighth + down + + + + + G + 1 + 5 + + 2 + 1 + eighth + down + + + + D + 4 + + 2 + 1 + eighth + down + end + + + + + + 1 + 3 + 4 + + + + + + + + F + 1 + 4 + + 2 + 1 + eighth + down + + + + + C + 1 + 5 + + 2 + 1 + eighth + down + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID-91-EmbeddedSlurs.xml b/files/xml2guido/GUID-91-EmbeddedSlurs.xml new file mode 100644 index 000000000..cf529d0ae --- /dev/null +++ b/files/xml2guido/GUID-91-EmbeddedSlurs.xml @@ -0,0 +1,768 @@ + + + + Je crois entendre encore + + Georges Bizet + www.antescofo.com + + Finale v25 for Mac + 2019-09-25 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 144 + 94 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Je crois entendre encore + + + composer + Georges Bizet + + + + Tenor + T + + SmartMusic SoftSynth + voice.tenor + + + 16 + 15489 + 53 + 80 + 0 + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + system + + + 2 + + 0 + major + + + + G + 2 + -1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + + + + + 6 + 1 + + + light-heavy + + + + + + + + + + 84 + 0 + + 164 + + + 134 + + system + + + 2 + + 0 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + + + + + 1 + + + + + Andante + + 1 + + + + E + 4 + + 6 + + 1 + half + + up + 1 + + + + + + + 6 + + + + C + 4 + + 2 + 2 + quarter + 2 + + + + E + 3 + + 1 + 2 + eighth + up + 2 + + + + + + + B + 3 + + 2 + 2 + quarter + up + 2 + + + + C + 4 + + 1 + 2 + eighth + up + 2 + + + 6 + + + + E + 2 + + 2 + 3 + quarter + down + 2 + + + + E + 2 + + 1 + 3 + eighth + 2 + + + + E + 2 + + 3 + 3 + quarter + + 2 + + + + + + + E + 4 + + 2 + + 1 + quarter + up + 1 + + + + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + G + 4 + + 2 + 1 + quarter + up + 1 + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + + + 6 + + + + D + 4 + + 3 + 2 + quarter + + up + 2 + + + + A + 3 + + 3 + 2 + quarter + + up + 2 + + + + + + + + C + 4 + + 3 + 2 + quarter + + up + 2 + + + + + + + E + 4 + + 6 + + 1 + half + + up + 1 + + + + + + + 6 + + + + C + 4 + + 2 + 2 + quarter + 2 + + + + E + 3 + + 1 + 2 + eighth + up + 2 + + + + + + + B + 3 + + 2 + 2 + quarter + up + 2 + + + + C + 4 + + 1 + 2 + eighth + up + 2 + + + 6 + + + + E + 2 + + 2 + 3 + quarter + down + 2 + + + + E + 2 + + 1 + 3 + eighth + 2 + + + + E + 2 + + 3 + 3 + quarter + + 2 + + + + + + + E + 4 + + 2 + + 1 + quarter + up + 1 + + + + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + G + 4 + + 2 + 1 + quarter + up + 1 + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + + + + 6 + + + + D + 4 + + 3 + 2 + quarter + + up + 2 + + + + A + 3 + + 3 + 2 + quarter + + up + 2 + + + + + + + + C + 4 + + 3 + 2 + quarter + + up + 2 + + + + + + + E + 4 + + 3 + + 1 + quarter + + up + 1 + + + + + + + E + 4 + + 2 + + 1 + quarter + up + 1 + + + + + + + F + 4 + + 1 + 1 + eighth + up + 1 + + + 6 + + + + C + 4 + + 2 + 2 + quarter + 2 + + + + E + 3 + + 1 + 2 + eighth + up + 2 + + + + + + + ten. + + 2 + + + + B + 3 + + 2 + 2 + quarter + up + 2 + + + + + + + C + 4 + + 1 + 2 + eighth + 2 + + + 6 + + + + E + 2 + + 2 + 3 + quarter + down + 2 + + + + E + 2 + + 1 + 3 + eighth + 2 + + + + E + 2 + + 3 + 3 + quarter + + 2 + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID-91-SlurGrace.xml b/files/xml2guido/GUID-91-SlurGrace.xml new file mode 100644 index 000000000..603d46b6e --- /dev/null +++ b/files/xml2guido/GUID-91-SlurGrace.xml @@ -0,0 +1,655 @@ + + + + Vortrag-Stücke + + Wilhelm Popp + www.antescofo.com + + Finale 2014.5 for Mac + Dolet 7.0 for Finale + 2019-02-14 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 143 + 93 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Vortrag-Stücke + + + composer + Wilhelm Popp + + + subtitle + 2. Russisches Zigeunerlied + + + + Flute + + ARIA Player + wind.flutes.flute + + + 1 + 15489 + 74 + 100 + 0 + + + + Piano + + ARIA Player + keyboard.piano + + + 2 + 15489 + 1 + 46 + -6 + + + + + + + + + + 67 + 0 + + 267 + + system + + + 4 + + -1 + minor + + + + G + 2 + + + + + + + G + 1 + 5 + + 1 + eighth + sharp + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + + G + 1 + 5 + + 1 + eighth + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + C + 6 + + 3 + 1 + eighth + + down + begin + + + + + + + + + B + 5 + + 1 + 1 + 16th + natural + down + end + backward hook + + + + + + + + G + 1 + 5 + + 1 + eighth + sharp + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + begin + + + + + + + + + + + G + 1 + 5 + + 1 + eighth + up + + + + + + + A + 5 + + 2 + 1 + eighth + down + end + + + + + + + + + + C + 6 + + 3 + 1 + eighth + + down + begin + + + + + + + + + D + 6 + + 1 + 1 + 16th + down + end + backward hook + + + light-heavy + + + + + + + + + 78 + + + 83 + + none + + + 2 + + -1 + minor + + + 2 + + G + 2 + + + F + 4 + + + + + + C + 4 + + 1 + 1 + eighth + up + 1 + begin + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + C + 4 + + 1 + 1 + eighth + up + 1 + end + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + D + 4 + + 2 + 1 + quarter + up + 1 + + + + + + + + + + F + 4 + + 2 + 1 + quarter + up + 1 + + + 4 + + + + A + 2 + + 1 + 2 + eighth + down + 2 + begin + + + + + + + + + A + 3 + + 1 + 2 + eighth + down + 2 + end + + + + + + + + + A + 3 + + 2 + 2 + quarter + down + 2 + + + + + + + + + + + + C + 4 + + 1 + 1 + eighth + up + 1 + begin + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + C + 4 + + 1 + 1 + eighth + up + 1 + end + + + + + + + + + + E + 4 + + 1 + 1 + eighth + up + 1 + + + + C + 4 + + 2 + 1 + quarter + up + 1 + + + + + + + + + + F + 4 + + 2 + 1 + quarter + up + 1 + + + 4 + + + + A + 2 + + 1 + 2 + eighth + down + 2 + begin + + + + + + + + + A + 3 + + 1 + 2 + eighth + down + 2 + end + + + + + + + + + A + -1 + 3 + + 2 + 2 + quarter + flat + down + 2 + + + + + + + + light-heavy + + + + + diff --git a/files/xml2guido/GUID157-CrossStaff.xml b/files/xml2guido/GUID157-CrossStaff.xml new file mode 100644 index 000000000..01d40cfe3 --- /dev/null +++ b/files/xml2guido/GUID157-CrossStaff.xml @@ -0,0 +1,233 @@ + + + + Titre + + Prénom Nom + www.antescofo.com + + Finale v25 for Mac + 2019-11-28 + + + + + + + + + + 6.35 + 40 + + + 1871 + 1323 + + 94 + 94 + 94 + 94 + + + + + 0 + 0 + + 145 + 94 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Titre + + + composer + Prénom Nom + + + subtitle + Nom ou numéro du mouvement + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 94 + 0 + + 229 + + + 78 + + system + + + 4 + + 0 + major + + + 2 + + G + 2 + + + F + 4 + + + + + 16 + 1 + 1 + + + 16 + + + + A + 3 + + 1 + 2 + 16th + up + 2 + begin + begin + + + + A + 4 + + 1 + 2 + 16th + down + 1 + end + end + + + + 1 + 2 + 16th + 2 + + + + A + 3 + + 1 + 2 + 16th + down + 2 + + + 12 + 2 + 2 + + + + + + + 16 + 1 + 1 + + + 16 + + + + 16 + 2 + 2 + + + + + + + 16 + 1 + 1 + + + 16 + + + + 16 + 2 + 2 + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index a3db762a5..c61f025c0 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2376,15 +2376,15 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) s << "position=" << "\"below\""; tag->add (guidoparam::create(s.str(), false)); - // XML reports distance from top of staff, Guido needs from bottom in Inverted mode. This is offset 8 - xml2guidovisitor::addPosY(nv.fFermata, tag, 8, 1.0); - }else{ - float noteDistanceFromTopStaff = getNoteDistanceFromStaffTop(nv); - // Do not infer fermata position if note is above top of the staff. Let guido do it - if (noteDistanceFromTopStaff < 2) { - xml2guidovisitor::addPosY(nv.fFermata, tag, 0, 1.0); - } - } + // We don't add dY since GuidoLib resolves collisions between articulations. + } +// else{ +// float noteDistanceFromTopStaff = getNoteDistanceFromStaffTop(nv); +// // Do not infer fermata position if note is above top of the staff. Let guido do it +// if (noteDistanceFromTopStaff < 2) { +// xml2guidovisitor::addPosY(nv.fFermata, tag, 0, 1.0); +// } +// } push(tag); return 1; } From 5cae8ca139467900578a8a6a6aa07eee7b9c1ee0 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 27 Mar 2020 16:01:30 +0100 Subject: [PATCH 048/164] xml2guido: - Fixed Octava parsing for Guido - Added support for Staccatissimo --- src/guido/xmlpart2guido.cpp | 42 +++++++++++++++++++++++++++++++----- src/guido/xmlpart2guido.h | 3 ++- src/visitors/notevisitor.cpp | 1 + src/visitors/notevisitor.h | 5 ++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index c61f025c0..21e7f392e 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -46,6 +46,7 @@ namespace MusicXML2 fIgnoreWedgeWithOffset = false; fTupletOpen = 0; fTremoloInProgress = false; + fShouldStopOctava = false; } //______________________________________________________________________________ @@ -65,6 +66,7 @@ namespace MusicXML2 fIgnoreWedgeWithOffset = false; fTupletOpen = 0; fTremoloInProgress = false; + fShouldStopOctava = false; } //______________________________________________________________________________ @@ -81,6 +83,7 @@ namespace MusicXML2 fIgnoreWedgeWithOffset = false; fTupletOpen = 0; fTremoloInProgress = false; + fShouldStopOctava = false; start (seq); } @@ -374,7 +377,11 @@ namespace MusicXML2 { // !IMPORTANT: Avoid using default-x since it is measured from the beginning of the measure for S_direction! - if (fSkipDirection) return; + if (fSkipDirection) { + // set back to false for next elements! + fSkipDirection = false; + return; + } /// Skip already visited Direction in case of grace notes (GUID-153) if ((!fDirectionEraserStack.empty())) { @@ -876,7 +883,9 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) //______________________________________________________________________________ void xmlpart2guido::visitStart( S_octave_shift& elt) { - if (fSkipDirection) return; + if (fSkipDirection) { + return; + } const string& type = elt->getAttributeValue("type"); int size = elt->getAttributeIntValue("size", 0); @@ -890,8 +899,11 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) if (type == "up") size = -size; else if (type == "stop") - size = 0; - else if (type != "down") return; + { + // in MusicXML, octava stop appears BEFORE the note it should be applied upon! We therefore keep this for the next note visit + fShouldStopOctava = true; + return; + } Sguidoelement tag = guidotag::create("oct"); if (tag) { @@ -899,6 +911,17 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) add (tag); } } + + void xmlpart2guido::checkOctavaEnd() { + if (!fShouldStopOctava) { + return; + } + Sguidoelement tag = guidotag::create("oct"); + tag->add (guidoparam::create(0, false)); + add(tag); + + fShouldStopOctava = false; + } //______________________________________________________________________________ void xmlpart2guido::visitStart ( S_note& elt ) @@ -1933,6 +1956,13 @@ std::vector< std::pair >::const_iterator xmlpart2guido::findSlur ( con push(tag); n++; } + if (note.fStaccatissimo) { + tag = guidotag::create("stacc"); + tag->add (guidoparam::create("type=\"heavy\"", false)); + if (fGeneratePositions) xml2guidovisitor::addPlacement(note.fStaccatissimo, tag); + push(tag); + n++; + } if (note.fTenuto) { tag = guidotag::create("ten"); if (fGeneratePositions) xml2guidovisitor::addPlacement(note.fTenuto, tag); @@ -1965,6 +1995,8 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) xml2guidovisitor::addPosY(note.fBreathMark, tag, -3, 1); add(tag); } + + checkOctavaEnd(); } @@ -2519,7 +2551,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur if (i==0) { s << ", text=\"" << fingeringText; }else { - s << ", " << fingeringText; + s << "," << fingeringText; } if (i+1 == fingerings.size()) { diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 074f2d62b..3e3424614 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -77,7 +77,7 @@ class EXP xmlpart2guido : bool fGenerateComments, fGenerateBars, fGeneratePositions, fGenerateAutoMeasureNum, fLyricsManualSpacing; // internal parsing state - bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress; + bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress, fShouldStopOctava; int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets @@ -153,6 +153,7 @@ class EXP xmlpart2guido : void checkWavyTrillBegin ( const notevisitor& nv ); void checkWavyTrillEnd ( const notevisitor& nv ); void checkTextEnd(); + void checkOctavaEnd(); void newNote ( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings); void newChord (const deque& nvs, rational posInMeasure); diff --git a/src/visitors/notevisitor.cpp b/src/visitors/notevisitor.cpp index d50a365fd..d31e55ea7 100644 --- a/src/visitors/notevisitor.cpp +++ b/src/visitors/notevisitor.cpp @@ -86,6 +86,7 @@ void notevisitor::reset () fBowDown = (void*)0; fHarmonic = (void*)0; fSnapPizzicato = (void*)0; + fStaccatissimo = (void*)0; } //________________________________________________________________________ diff --git a/src/visitors/notevisitor.h b/src/visitors/notevisitor.h index 8dea6b8b2..b63ddf99e 100644 --- a/src/visitors/notevisitor.h +++ b/src/visitors/notevisitor.h @@ -82,7 +82,8 @@ class EXP notevisitor : public visitor, public visitor, public visitor, - public visitor + public visitor, + public visitor { public: S_stem fStem; @@ -106,6 +107,7 @@ class EXP notevisitor : std::string fCautionary; S_harmonic fHarmonic; S_snap_pizzicato fSnapPizzicato; + S_staccatissimo fStaccatissimo; S_up_bow fBowUp; S_down_bow fBowDown; @@ -231,6 +233,7 @@ class EXP notevisitor : virtual void visitStart( S_up_bow& elt) {fBowUp = elt;} virtual void visitStart( S_harmonic& elt) {fHarmonic = elt;} virtual void visitStart( S_snap_pizzicato& elt) {fSnapPizzicato = elt;} + virtual void visitStart( S_staccatissimo& elt) {fStaccatissimo = elt;} private: bool fGrace, fCue, fChord; From c80ac845c92d215931ca5076704a0a8f206f3dec Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 7 Apr 2020 19:05:59 +0200 Subject: [PATCH 049/164] GUID-132: Better StaffDistance inference --- src/guido/xml2guidovisitor.cpp | 65 ++++++++++++++++++---------------- src/guido/xmlpart2guido.cpp | 49 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 30 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 4440087b5..4f83eec67 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -171,10 +171,10 @@ namespace MusicXML2 defaultStaffDistance = elt->getIntValue(k_staff_distance, 0); // Convert to HS - /// Guido's default staff-distance seems to be 10HS or 50 tenths + /// Guido's default staff-distance seems to be 8 or 80 tenths if (defaultStaffDistance > 0) { - float xmlDistance = defaultStaffDistance - 50.0; - float HalfSpaceDistance = -1.0 * (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 + float xmlDistance = defaultStaffDistance - 80.0; + float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // (pos/10)*2 if (HalfSpaceDistance < 0.0) { defaultGuidoStaffDistance = HalfSpaceDistance; }else @@ -245,37 +245,42 @@ namespace MusicXML2 //// Add staffFormat if needed // Case1: If previous staff has Lyrics, then move current staff lower to create space: \staffFormat int stafflines = elt->getIntValue(k_staff_lines, 0); - - if ((previousStaffHasLyrics)||stafflines||defaultGuidoStaffDistance||ps.fStaffDistances.size()) + if (stafflines>0) { Sguidoelement tag2 = guidotag::create("staffFormat"); - if (previousStaffHasLyrics) - { - tag2->add (guidoparam::create("dy=-5", false)); - }else if (ps.fStaffDistances.size()> size_t(targetStaff-1)) { - - if (ps.fStaffDistances[targetStaff-1] > 0) { - float xmlDistance = ps.fStaffDistances[targetStaff-1] - 50.0; - float HalfSpaceDistance = -1.0 * (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 - - stringstream s; - s << "dy="<< HalfSpaceDistance; - tag2->add (guidoparam::create(s.str().c_str(), false)); - } - }else if (defaultGuidoStaffDistance) { - stringstream s; - s << "dy="<< defaultGuidoStaffDistance; - tag2->add (guidoparam::create(s.str().c_str(), false)); - } - - if (stafflines>0) - { - stringstream staffstyle; - staffstyle << "style=\"" << stafflines<<"-line\""; - tag2->add (guidoparam::create(staffstyle.str(),false)); - } + stringstream staffstyle; + staffstyle << "style=\"" << stafflines<<"-line\""; + tag2->add (guidoparam::create(staffstyle.str(),false)); add (tag2); } + +// if ((previousStaffHasLyrics)||stafflines||defaultGuidoStaffDistance||ps.fStaffDistances.size()) +// { +// Sguidoelement tag2 = guidotag::create("staffFormat"); +// if (previousStaffHasLyrics) +// { +// tag2->add (guidoparam::create("dy=-5", false)); +// add (tag2); +// }else if (ps.fStaffDistances.size()> size_t(targetStaff-1)) { +// +// if (ps.fStaffDistances[targetStaff-1] > 0) { +// float xmlDistance = ps.fStaffDistances[targetStaff-1] - 80.0; +// float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 +// +// stringstream s; +// s << "distance="<< HalfSpaceDistance; +// cerr<<"StaffDistance "<add (guidoparam::create(s.str().c_str(), false)); +// add (tag2); +// } +// } //// flushHeader (fHeader); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 21e7f392e..cc6d911ea 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -27,6 +27,8 @@ using namespace std; +bool checkTempoMarkup(std::string input); + namespace MusicXML2 { @@ -290,6 +292,24 @@ namespace MusicXML2 Sguidoelement elt = guidoelement ::create(comment); add (elt); } + + // Take care of staff-distance + auto sLayout = elt->find(k_staff_layout); + while (sLayout != elt->end() ) + { + if (sLayout->getAttributeIntValue("number", 0) == fTargetStaff) { + int xmlStaffDistance = sLayout->getIntValue(k_staff_distance, 0); + Sguidoelement tag2 = guidotag::create("staffFormat"); + float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; // 80 is ~default Guido staff distance + stringstream s; + s << "distance="<< HalfSpaceDistance; + cerr<<"StaffDistance measure= "<"<getValue()); + if (generateTempo) { tempoWording = element->getValue(); } @@ -2952,3 +2975,29 @@ float xmlpart2guido::getNoteDistanceFromStaffTop(const notevisitor& nv) { } } + +bool checkTempoMarkup(std::string input) { + std::vector tempoMarkings = { + // Italian terms + "andant", "adagi", "a tempo", "agitato", "allegr", + "moderato", "largo", "larghetto", "lent", "scherz", "vivace", "vivacissimo", "marcia", + // French terms + "au mouvement", "grave", "modéré", "vif", + // German terms + "langsam", "lebhaft", "kräftig", "mässig", "massig", "rasch", "schnell", "bewegt" + }; + + // convert input to lowercase + std::string victim = input; + std::transform(input.begin(), input.end(), victim.begin(), [](unsigned char c){ return std::tolower(c); }); + + vector::const_iterator it_found = find_if(tempoMarkings.begin(), tempoMarkings.end(), [&victim](string s) -> bool { + return (victim.find(s) != string::npos); + }); + + if (it_found != tempoMarkings.end()) { + return true; + }else { + return false; + } +} From c2ec45cd35187cd2a13dba6a2b86c067b88e8baf Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 7 Apr 2020 20:56:32 +0200 Subject: [PATCH 050/164] xml2guido: Improved Tempo Markup "detection" and Staff-Distance parsing --- src/guido/xml2guidovisitor.cpp | 60 +++++++++++++++------------------- src/guido/xml2guidovisitor.h | 1 + src/guido/xmlpart2guido.cpp | 60 ++++++++++++++++++---------------- 3 files changed, 60 insertions(+), 61 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 4f83eec67..80483053e 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -173,7 +173,7 @@ namespace MusicXML2 // Convert to HS /// Guido's default staff-distance seems to be 8 or 80 tenths if (defaultStaffDistance > 0) { - float xmlDistance = defaultStaffDistance - 80.0; + float xmlDistance = defaultStaffDistance; float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // (pos/10)*2 if (HalfSpaceDistance < 0.0) { defaultGuidoStaffDistance = HalfSpaceDistance; @@ -245,42 +245,25 @@ namespace MusicXML2 //// Add staffFormat if needed // Case1: If previous staff has Lyrics, then move current staff lower to create space: \staffFormat int stafflines = elt->getIntValue(k_staff_lines, 0); - if (stafflines>0) + if (stafflines||defaultGuidoStaffDistance) { Sguidoelement tag2 = guidotag::create("staffFormat"); - stringstream staffstyle; - staffstyle << "style=\"" << stafflines<<"-line\""; - tag2->add (guidoparam::create(staffstyle.str(),false)); + if (defaultGuidoStaffDistance) { + stringstream s; + s << "distance="<< defaultGuidoStaffDistance; + cerr<<"defaultGuidoStaffDistance "<add (guidoparam::create(s.str().c_str(), false)); + } + if (stafflines>0) + { + Sguidoelement tag2 = guidotag::create("staffFormat"); + stringstream staffstyle; + staffstyle << "style=\"" << stafflines<<"-line\""; + tag2->add (guidoparam::create(staffstyle.str(),false)); + } add (tag2); + // TODO: It seems like in MusicXML the default Staff Distance is reapplied to every new system (?) in case of staff distance change in the middle of a score. } - -// if ((previousStaffHasLyrics)||stafflines||defaultGuidoStaffDistance||ps.fStaffDistances.size()) -// { -// Sguidoelement tag2 = guidotag::create("staffFormat"); -// if (previousStaffHasLyrics) -// { -// tag2->add (guidoparam::create("dy=-5", false)); -// add (tag2); -// }else if (ps.fStaffDistances.size()> size_t(targetStaff-1)) { -// -// if (ps.fStaffDistances[targetStaff-1] > 0) { -// float xmlDistance = ps.fStaffDistances[targetStaff-1] - 80.0; -// float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // -1.0 for Guido scale // (pos/10)*2 -// -// stringstream s; -// s << "distance="<< HalfSpaceDistance; -// cerr<<"StaffDistance "<add (guidoparam::create(s.str().c_str(), false)); -// add (tag2); -// } -// } //// flushHeader (fHeader); @@ -424,6 +407,17 @@ namespace MusicXML2 tag->add (guidoparam::create(s.str(), false)); } } + +void xml2guidovisitor::addRelativeX(Sxmlelement elt, Sguidoelement& tag, float xoffset){ + float posx = elt->getAttributeFloatValue("relative-x", 0); + posx = (posx / 10) * 2; // convert to half spaces + posx += xoffset; + + stringstream s; + s << "dx=" << posx << "hs"; + tag->add (guidoparam::create(s.str(), false)); + +} void xml2guidovisitor::addPlacement ( Sxmlelement elt, Sguidoelement& tag) { diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 7c465664e..99f9c45de 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -127,6 +127,7 @@ class EXP xml2guidovisitor : static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float xoffset); static void addPosY ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float ymultiplier); static void addPosX ( Sxmlelement elt, Sguidoelement& tag, float xoffset); + static void addRelativeX(Sxmlelement elt, Sguidoelement& tag, float xoffset); static void addPlacement ( Sxmlelement elt, Sguidoelement& tag); static float getYposition ( Sxmlelement elt, float yoffset, bool useDefault); static float getXposition ( Sxmlelement elt, float xoffset); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index cc6d911ea..755e7670e 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -303,7 +303,6 @@ namespace MusicXML2 float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; // 80 is ~default Guido staff distance stringstream s; s << "distance="<< HalfSpaceDistance; - cerr<<"StaffDistance measure= "<"<getValue()); + // Candidate for tempo Markup: default-y>10 and font-weight="bold" + if ( (element->getAttributeValue("font-weight")=="bold") + && (element->getAttributeIntValue("default-y", 0)>10)) { + generateTempo = true; + } if (generateTempo) { tempoWording = element->getValue(); @@ -547,7 +550,8 @@ namespace MusicXML2 tag->add (guidoparam::create(wordParameters.str(), false)); // FIXME: XML x-pos is from beginning of measure, whereas nested Text in Guido from the notehead - //xml2guidovisitor::addPosX(element, tag, 0); + // Seems like we can add relative-x which is relative to its hanging position + xml2guidovisitor::addRelativeX(element, tag, 0); // apply inherited Y-position if (commonDy != 0.0) { @@ -2976,28 +2980,28 @@ float xmlpart2guido::getNoteDistanceFromStaffTop(const notevisitor& nv) { } -bool checkTempoMarkup(std::string input) { - std::vector tempoMarkings = { - // Italian terms - "andant", "adagi", "a tempo", "agitato", "allegr", - "moderato", "largo", "larghetto", "lent", "scherz", "vivace", "vivacissimo", "marcia", - // French terms - "au mouvement", "grave", "modéré", "vif", - // German terms - "langsam", "lebhaft", "kräftig", "mässig", "massig", "rasch", "schnell", "bewegt" - }; - - // convert input to lowercase - std::string victim = input; - std::transform(input.begin(), input.end(), victim.begin(), [](unsigned char c){ return std::tolower(c); }); - - vector::const_iterator it_found = find_if(tempoMarkings.begin(), tempoMarkings.end(), [&victim](string s) -> bool { - return (victim.find(s) != string::npos); - }); - - if (it_found != tempoMarkings.end()) { - return true; - }else { - return false; - } -} +//bool checkTempoMarkup(std::string input) { +// std::vector tempoMarkings = { +// // Italian terms +// "andant", "adagi", "a tempo", "agitato", "allegr", +// "moderato", "largo", "larghetto", "lent", "scherz", "vivace", "vivacissimo", "marcia", +// // French terms +// "au mouvement", "grave", "modéré", "vif", +// // German terms +// "langsam", "lebhaft", "kräftig", "mässig", "massig", "rasch", "schnell", "bewegt" +// }; +// +// // convert input to lowercase +// std::string victim = input; +// std::transform(input.begin(), input.end(), victim.begin(), [](unsigned char c){ return std::tolower(c); }); +// +// vector::const_iterator it_found = find_if(tempoMarkings.begin(), tempoMarkings.end(), [&victim](string s) -> bool { +// return (victim.find(s) != string::npos); +// }); +// +// if (it_found != tempoMarkings.end()) { +// return true; +// }else { +// return false; +// } +//} From 6be64775ffe95af83f9b1a0a8b01566dfe5614b8 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 8 Apr 2020 14:45:32 +0200 Subject: [PATCH 051/164] xml2guido: Adds Font-size condition for tempo markup detection --- src/guido/xmlpart2guido.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 755e7670e..0726625c1 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -471,9 +471,10 @@ namespace MusicXML2 case k_words: { /// GUID-147: Detect Tempo Markups using specific substrings such as "Andante" etc. - // Candidate for tempo Markup: default-y>10 and font-weight="bold" + // Candidate for tempo Markup: default-y>10 and font-weight="bold" and font-size > 12.0 if ( (element->getAttributeValue("font-weight")=="bold") - && (element->getAttributeIntValue("default-y", 0)>10)) { + && (element->getAttributeIntValue("default-y", 0)>10) + && (element->getAttributeFloatValue("font-size", 0.0) >= 12.0) ) { generateTempo = true; } From 90ae0afc7a60c64446d1d6316b1d752634b78f62 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 13 Apr 2020 16:42:04 +0200 Subject: [PATCH 052/164] xml2guido: Fixed inference of staff-distance in erroneous MusicXMLs in case of staff disappearance --- src/guido/xml2guidovisitor.cpp | 19 ++++++++++--------- src/guido/xml2guidovisitor.h | 6 ++++-- src/guido/xmlpart2guido.cpp | 21 ++++++++++++++++++++- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 80483053e..83030e91d 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -27,14 +27,17 @@ using namespace std; + namespace MusicXML2 { + int xml2guidovisitor::defaultGuidoStaffDistance = 0; + int xml2guidovisitor::defaultStaffDistance = 0; //______________________________________________________________________________ xml2guidovisitor::xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar, int partNum) : fGenerateComments(generateComments), fGenerateStem(generateStem), fGenerateBars(generateBar), fGeneratePositions(true), - fCurrentStaffIndex(0), previousStaffHasLyrics(false), fCurrentAccoladeIndex(0), fPartNum(partNum), defaultStaffDistance(0), defaultGuidoStaffDistance(1) + fCurrentStaffIndex(0), previousStaffHasLyrics(false), fCurrentAccoladeIndex(0), fPartNum(partNum) { timePositions.clear(); } @@ -168,19 +171,19 @@ namespace MusicXML2 void xml2guidovisitor::visitStart( S_defaults& elt) { - defaultStaffDistance = elt->getIntValue(k_staff_distance, 0); + xml2guidovisitor::defaultStaffDistance = elt->getIntValue(k_staff_distance, 0); // Convert to HS /// Guido's default staff-distance seems to be 8 or 80 tenths if (defaultStaffDistance > 0) { - float xmlDistance = defaultStaffDistance; + float xmlDistance = xml2guidovisitor::defaultStaffDistance; float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // (pos/10)*2 - if (HalfSpaceDistance < 0.0) { - defaultGuidoStaffDistance = HalfSpaceDistance; + if (HalfSpaceDistance > 0.0) { + xml2guidovisitor::defaultGuidoStaffDistance = HalfSpaceDistance; }else - defaultGuidoStaffDistance = 0; + xml2guidovisitor::defaultGuidoStaffDistance = 0; }else { - defaultGuidoStaffDistance = 0; + xml2guidovisitor::defaultGuidoStaffDistance = 0; } } @@ -243,7 +246,6 @@ namespace MusicXML2 add(tag); //// Add staffFormat if needed - // Case1: If previous staff has Lyrics, then move current staff lower to create space: \staffFormat int stafflines = elt->getIntValue(k_staff_lines, 0); if (stafflines||defaultGuidoStaffDistance) { @@ -251,7 +253,6 @@ namespace MusicXML2 if (defaultGuidoStaffDistance) { stringstream s; s << "distance="<< defaultGuidoStaffDistance; - cerr<<"defaultGuidoStaffDistance "<add (guidoparam::create(s.str().c_str(), false)); } if (stafflines>0) diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 99f9c45de..9da91c5b0 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -102,8 +102,7 @@ class EXP xml2guidovisitor : int fPartNum; // 0 (default) to parse all score-parts. 1 for "P1" only, etc. - int defaultStaffDistance; // xml staff-distance value in defaults - int defaultGuidoStaffDistance; // the above converted to Guido value + static int defaultStaffDistance; // xml staff-distance value in defaults /// multimap containing //std::multimap > staffClefMap; @@ -122,6 +121,9 @@ class EXP xml2guidovisitor : // this is to control exact positionning of elements when information is present // ie converts relative-x/-y into dx/dy attributes void generatePositions (bool state) { fGeneratePositions = state; } + + /// Shared default derived from MusicXML + static int defaultGuidoStaffDistance; // the above converted to Guido value static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset); static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float xoffset); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 0726625c1..eecc4c386 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -293,6 +293,22 @@ namespace MusicXML2 add (elt); } + // Take care of StaffOn StaffOff + // REMOVED: StaffOn / StaffOff in GuidoLib does not behave well in presence of multi-staff Parts +// auto sStaffDetails = elt->find(k_staff_details); +// if (sStaffDetails != elt->end()) { +// if (sStaffDetails->getAttributeIntValue("number", 0) == fTargetStaff) { +// std::string print = sStaffDetails->getAttributeValue("print-object"); +// if (print=="no") { +// Sguidoelement tag = guidotag::create("staffOff"); +// add(tag); +// }else if (print=="yes") { +// Sguidoelement tag = guidotag::create("staffOn"); +// add(tag); +// } +// } +// } + // Take care of staff-distance auto sLayout = elt->find(k_staff_layout); while (sLayout != elt->end() ) @@ -300,7 +316,10 @@ namespace MusicXML2 if (sLayout->getAttributeIntValue("number", 0) == fTargetStaff) { int xmlStaffDistance = sLayout->getIntValue(k_staff_distance, 0); Sguidoelement tag2 = guidotag::create("staffFormat"); - float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; // 80 is ~default Guido staff distance + float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; + if (HalfSpaceDistance < xml2guidovisitor::defaultGuidoStaffDistance) { + HalfSpaceDistance = xml2guidovisitor::defaultGuidoStaffDistance; + } stringstream s; s << "distance="<< HalfSpaceDistance; tag2->add (guidoparam::create(s.str().c_str(), false)); From 642dfeff93d6782857335c4bb16dd63f9127dc71 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 15 May 2020 20:29:52 +0200 Subject: [PATCH 053/164] xml2guido: Removed default StaffFormat inference from MusicXML --- src/guido/xml2guidovisitor.cpp | 13 +++---------- src/guido/xmlpart2guido.cpp | 3 --- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 83030e91d..3e1080c74 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -245,27 +245,20 @@ namespace MusicXML2 tag = guidotag::create(autoHideTiedAccidentals); add(tag); - //// Add staffFormat if needed + /// Add staffFormat if needed + // We do not infer default staff distance from musicXML since no software seem to be able to control it! int stafflines = elt->getIntValue(k_staff_lines, 0); - if (stafflines||defaultGuidoStaffDistance) + if (stafflines) { Sguidoelement tag2 = guidotag::create("staffFormat"); - if (defaultGuidoStaffDistance) { - stringstream s; - s << "distance="<< defaultGuidoStaffDistance; - tag2->add (guidoparam::create(s.str().c_str(), false)); - } if (stafflines>0) { - Sguidoelement tag2 = guidotag::create("staffFormat"); stringstream staffstyle; staffstyle << "style=\"" << stafflines<<"-line\""; tag2->add (guidoparam::create(staffstyle.str(),false)); } add (tag2); - // TODO: It seems like in MusicXML the default Staff Distance is reapplied to every new system (?) in case of staff distance change in the middle of a score. } - //// flushHeader (fHeader); flushPartHeader (fPartHeaders[elt->getAttributeValue("id")]); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index eecc4c386..f23da10ed 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -317,9 +317,6 @@ namespace MusicXML2 int xmlStaffDistance = sLayout->getIntValue(k_staff_distance, 0); Sguidoelement tag2 = guidotag::create("staffFormat"); float HalfSpaceDistance = ((float)(xmlStaffDistance) / 10) * 2 ; - if (HalfSpaceDistance < xml2guidovisitor::defaultGuidoStaffDistance) { - HalfSpaceDistance = xml2guidovisitor::defaultGuidoStaffDistance; - } stringstream s; s << "distance="<< HalfSpaceDistance; tag2->add (guidoparam::create(s.str().c_str(), false)); From 1c7e404942fe1d49d1a3b68634caa9a24dd0aa24 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 19 May 2020 18:50:07 +0200 Subject: [PATCH 054/164] xml2guido: Fix accolade and barformat staff ranges --- src/visitors/partlistvisitor.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/visitors/partlistvisitor.cpp b/src/visitors/partlistvisitor.cpp index 06ecbec00..323da7481 100644 --- a/src/visitors/partlistvisitor.cpp +++ b/src/visitors/partlistvisitor.cpp @@ -67,10 +67,10 @@ namespace MusicXML2 std::vector::iterator rangeBegin = std::min_element(staves.begin(), staves.begin()); stringstream rangeStream; - rangeStream << "\"" << (*rangeBegin) << "-" << (*rangeEnd) << "\""; + rangeStream << "\"" << (*rangeBegin)+1 << "-" << (*rangeEnd)+1 << "\""; pGroup.guidoRange = rangeStream.str(); - pGroup.guidoRangeStart = *rangeBegin; - pGroup.guidoRangeStop = *rangeEnd; + pGroup.guidoRangeStart = *rangeBegin +1; + pGroup.guidoRangeStop = *rangeEnd +1; } bool partlistvisitor::checkLonelyBarFormat(int staffID) From 0c65af7ab758d4b72725682458ec3e605773e48f Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 19 May 2020 21:43:36 +0200 Subject: [PATCH 055/164] Final fix for GUID-169 (brackets) --- src/guido/xml2guidovisitor.cpp | 12 ++++++++---- src/visitors/partlistvisitor.cpp | 6 +++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 3e1080c74..5192eb13a 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -128,7 +128,6 @@ namespace MusicXML2 void xml2guidovisitor::flushPartGroup (std::string partID) { - //cerr<< "Entering flushPartGroup with ID "<guidoRange.size()>0) { /// something was found. Generate Accolades and BarFormat if any + int rangeStart = fCurrentStaffIndex ; + int rangeEnd = rangeStart + (partGroupIt->guidoRangeStop - partGroupIt->guidoRangeStart); + std::stringstream rangeFixed; + rangeFixed << " range=\""<< rangeStart <<"-"<bracket) { - std::string accolParams = "id=1, range="+partGroupIt->guidoRange; + std::stringstream accolParams; + accolParams << "id=1, "<< rangeFixed.str(); Sguidoelement tag3 = guidotag::create("accol"); - tag3->add (guidoparam::create(accolParams, false)); + tag3->add (guidoparam::create(accolParams.str(), false)); add (tag3); } if (partGroupIt->barlineGrouping) { - std::string barformatParams = "style= \"system\", range="+partGroupIt->guidoRange; + std::string barformatParams = "style= \"system\", "+rangeFixed.str(); Sguidoelement tag4 = guidotag::create("barFormat"); tag4->add (guidoparam::create(barformatParams, false)); diff --git a/src/visitors/partlistvisitor.cpp b/src/visitors/partlistvisitor.cpp index 323da7481..e3ea7ff9a 100644 --- a/src/visitors/partlistvisitor.cpp +++ b/src/visitors/partlistvisitor.cpp @@ -67,10 +67,10 @@ namespace MusicXML2 std::vector::iterator rangeBegin = std::min_element(staves.begin(), staves.begin()); stringstream rangeStream; - rangeStream << "\"" << (*rangeBegin)+1 << "-" << (*rangeEnd)+1 << "\""; + rangeStream << "\"" << (*rangeBegin) << "-" << (*rangeEnd) << "\""; pGroup.guidoRange = rangeStream.str(); - pGroup.guidoRangeStart = *rangeBegin +1; - pGroup.guidoRangeStop = *rangeEnd +1; + pGroup.guidoRangeStart = *rangeBegin ; + pGroup.guidoRangeStop = *rangeEnd ; } bool partlistvisitor::checkLonelyBarFormat(int staffID) From 5b57bd6437da4cea35284ffc6bc39eb4710909d9 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 11:36:35 +0200 Subject: [PATCH 056/164] xml2guido: adds hidden bar inference from xml for Guido --- src/guido/xmlpart2guido.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index f23da10ed..f3f2d0c62 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -274,6 +274,13 @@ namespace MusicXML2 add (tag); } + }else { + // Create a HIDDEN Bar in case of fPendingBar equal to false. + // This is the case for "bar-style" equal to "none" or "implicit" measures + Sguidoelement tag = guidotag::create("bar"); + std::string hidden = "hidden=\"true\""; + tag->add(guidoparam::create(hidden.c_str(), false)); + add(tag); } fCurrentMeasure = elt; fMeasNum++; From 846de70aa723c60b7fdadd73fdd35b7f52cae1d5 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 13:43:50 +0200 Subject: [PATCH 057/164] xml2guido: Evade crash if XML is not compliant on Wedge parsing --- src/guido/xmlpart2guido.cpp | 122 ++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index f3f2d0c62..dd5538e95 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -771,57 +771,59 @@ namespace MusicXML2 } //______________________________________________________________________________ - void xmlpart2guido::visitStart ( S_wedge& elt ) - { - if (fSkipDirection) return; - -// bool wedgeStart = false; - - string type = elt->getAttributeValue("type"); - Sguidoelement tag; - if (type == "crescendo") { - tag = guidotag::create("crescBegin"); - fCrescPending = true; -// wedgeStart = true; - } - else if (type == "diminuendo") { - tag = guidotag::create("dimBegin"); - fCrescPending = false; -// wedgeStart = true; +void xmlpart2guido::visitStart ( S_wedge& elt ) +{ + if (fSkipDirection) return; + + // bool wedgeStart = false; + + string type = elt->getAttributeValue("type"); + Sguidoelement tag; + if (type == "crescendo") { + tag = guidotag::create("crescBegin"); + fCrescPending = true; + // wedgeStart = true; + } + else if (type == "diminuendo") { + tag = guidotag::create("dimBegin"); + fCrescPending = false; + // wedgeStart = true; + } + else if (type == "stop") { + if (fIgnoreWedgeWithOffset) { + fIgnoreWedgeWithOffset = false; + return; // FIXME: Ignore Offset Wedge à la Verovio } - else if (type == "stop") { - if (fIgnoreWedgeWithOffset) { - fIgnoreWedgeWithOffset = false; - return; // FIXME: Ignore Offset Wedge à la Verovio + + tag = guidotag::create(fCrescPending ? "crescEnd" : "dimEnd"); + } + + if (tag) { + //// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) + //// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type + if (type == "diminuendo") { + float spreadValue = elt->getAttributeFloatValue("spread", 15.0); + if (spreadValue != 15.0) { + stringstream s; + s << "deltaY=" << (spreadValue/10)*2 << "hs"; + tag->add (guidoparam::create(s.str(), false)); } - tag = guidotag::create(fCrescPending ? "crescEnd" : "dimEnd"); - } - - if (tag) { - //// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) - //// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type - if (type == "diminuendo") { - float spreadValue = elt->getAttributeFloatValue("spread", 15.0); - if (spreadValue != 15.0) { - stringstream s; - s << "deltaY=" << (spreadValue/10)*2 << "hs"; - tag->add (guidoparam::create(s.str(), false)); - } - - /*stringstream s; - s << "autopos=\"on\""; - tag->add (guidoparam::create(s.str(), false));*/ - - }else if (type == "crescendo") - { - ctree::iterator wedgeBegin= find(fCurrentPart->begin(), fCurrentPart->end(), elt); - int crescendoNumber = elt->getAttributeIntValue("number", 1); // default is 1 for wedge! - ctree::iterator nextevent = wedgeBegin; - nextevent++; // advance one step - - // find next S_direction in measure - ctree::iterator nextWedge = fCurrentMeasure->find(k_wedge, nextevent); + /*stringstream s; + s << "autopos=\"on\""; + tag->add (guidoparam::create(s.str(), false));*/ + + }else if (type == "crescendo") + { + ctree::iterator wedgeBegin= find(fCurrentPart->begin(), fCurrentPart->end(), elt); + int crescendoNumber = elt->getAttributeIntValue("number", 1); // default is 1 for wedge! + ctree::iterator nextevent = wedgeBegin; + nextevent++; // advance one step + + // find next S_direction in measure + ctree::iterator nextWedge = fCurrentPart->find(k_wedge, nextevent); + + if (nextWedge != fCurrentPart->end()) { while ( ( nextWedge->getAttributeIntValue("number", 1) != crescendoNumber) && @@ -897,21 +899,21 @@ namespace MusicXML2 s << "autopos=\"on\""; tag->add (guidoparam::create(s.str(), false));*/ } - - stringstream s; - s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; - tag->add (guidoparam::create(s.str(), false)); - //xml2guidovisitor::addPosY(elt, tag, -2, 1.0); // removed negative multiplier. Fixed in GuidoLib 1.6.5 - - if (fCurrentOffset) { - addDelayed(tag, fCurrentOffset); - } - else { - add (tag); - } } + stringstream s; + s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; + tag->add (guidoparam::create(s.str(), false)); + //xml2guidovisitor::addPosY(elt, tag, -2, 1.0); // removed negative multiplier. Fixed in GuidoLib 1.6.5 + + if (fCurrentOffset) { + addDelayed(tag, fCurrentOffset); + } + else { + add (tag); + } } +} std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) From 3e20fadad58a2d56cb91e9ab33d39519128f61a8 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 14:47:47 +0200 Subject: [PATCH 058/164] Minor cleanups --- src/guido/xmlpart2guido.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index dd5538e95..fb3cb5bf6 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -774,20 +774,16 @@ namespace MusicXML2 void xmlpart2guido::visitStart ( S_wedge& elt ) { if (fSkipDirection) return; - - // bool wedgeStart = false; - + string type = elt->getAttributeValue("type"); Sguidoelement tag; if (type == "crescendo") { tag = guidotag::create("crescBegin"); fCrescPending = true; - // wedgeStart = true; } else if (type == "diminuendo") { tag = guidotag::create("dimBegin"); fCrescPending = false; - // wedgeStart = true; } else if (type == "stop") { if (fIgnoreWedgeWithOffset) { @@ -799,8 +795,8 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) } if (tag) { - //// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) - //// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type + /// Also add SPREAD values (in mXML tenths - conversion: (X / 10) * 2) + /// Spread is present right away for a diminuendo, it'll be present for crescendo at its STOP type if (type == "diminuendo") { float spreadValue = elt->getAttributeFloatValue("spread", 15.0); if (spreadValue != 15.0) { @@ -904,7 +900,6 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) stringstream s; s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; tag->add (guidoparam::create(s.str(), false)); - //xml2guidovisitor::addPosY(elt, tag, -2, 1.0); // removed negative multiplier. Fixed in GuidoLib 1.6.5 if (fCurrentOffset) { addDelayed(tag, fCurrentOffset); From 7961fcda8690492a4b8d117c36e480925d731a29 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 14:50:35 +0200 Subject: [PATCH 059/164] Increment xml2guidoVersion to 3.1 --- src/elements/versions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/elements/versions.cpp b/src/elements/versions.cpp index c1504e12c..d17d709b6 100755 --- a/src/elements/versions.cpp +++ b/src/elements/versions.cpp @@ -18,8 +18,8 @@ namespace MusicXML2 float versions::libVersion() { return 3.19f; } const char* versions::libVersionStr() { return "3.19"; } -float versions::xml2guidoVersion() { return 3.0f; } -const char* versions::xml2guidoVersionStr() { return "3.0"; } +float versions::xml2guidoVersion() { return 3.1f; } +const char* versions::xml2guidoVersionStr() { return "3.1"; } float versions::xml2lilypondVersion() { return 0.92f; } const char* versions::xml2lilypondVersionStr() { return "0.92"; } From f06238ad8c5b5f3140b8621755c9beba314679d5 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 27 May 2020 15:07:14 +0200 Subject: [PATCH 060/164] Grame revert back for WASM compilation (!) --- javascript/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/Makefile b/javascript/Makefile index e16e1906d..99b7b4894 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -74,7 +74,7 @@ $(npmdir)/$(library).js : $(library).js # building the library as web assembly ############################################################## $(library).js : $(objects) - emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=0 + emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=1 clean: rm -f $(objects) $(target) From 7cfb0a5abb7671bb7a4de3b1c3d70197543166da Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Thu, 28 May 2020 08:17:02 +0200 Subject: [PATCH 061/164] version number moved to 3.20 --- CHANGELOG.txt | 18 ++++++++++++++++++ build/CMakeLists.txt | 6 +++--- build/Makefile | 2 +- doc/Doxyfile | 2 +- javascript/npm/package.json | 3 ++- packages/Makefile | 2 +- src/elements/versions.cpp | 4 ++-- win32/libmusicxml/libmusicxml.rc | 8 ++++---- 8 files changed, 32 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index e9086e4af..e96bbf87f 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,24 @@ MusicXML Library +---------------------------------------------------------------------------------------------------- +Version 3.20 +- xml2guido v.3.1: + - Fix Accolade and barformat inference + - Removes default staffFormat distance inference as MusicXML is not consistent + - Adds Font-size and Sound element conditions to infer Tempo Markup + - Improves staff-Distance parsing + - Fixed Octava Parsing for Guido + - Adds support for Staccatissimo and SnapPizzicato + - Fixed y-pos inference from XML for Fermata and other articulations (Fingering etc.) + - Adds Guido Fingering Support on Chords + - Evade Slur generation for multi-voice slurs in XML + - Improved grouping detection for Guido Beaming (especially nested beams) + - Fixed ordering of grace notte tag creation + - Ability tto parse nested Ties with correct sequencing in Guido +- xml2ly: + + ---------------------------------------------------------------------------------------------------- Version 3.19 - fix parsing bug with comments after DOCTYPE diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 8be089485..76c2b6bb2 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -11,7 +11,7 @@ endif() # versions management set (XMLVERSION 3.1) -set (VERSION 3.1.9) +set (VERSION 3.2.0) macro (get_major_minor_patch version) string( REGEX REPLACE "([0-9]*)\\.([0-9]*)\\.([0-9]*)" "\\1" VERSION_MAJOR ${version} ) string( REGEX REPLACE "([0-9]*)\\.([0-9]*)\\.([0-9]*)" "\\2" VERSION_MINOR ${version} ) @@ -19,8 +19,8 @@ macro (get_major_minor_patch version) endmacro() get_major_minor_patch( ${VERSION} ) set (SOVERS ${VERSION_MAJOR}) -set (STRVERS "v.3.17") -set (SSTRVERS "3.17") +set (STRVERS "v.3.20") +set (SSTRVERS "3.20") message (STATUS "Configuring version ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") get_filename_component(ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) diff --git a/build/Makefile b/build/Makefile index e04780dc8..70dceda95 100644 --- a/build/Makefile +++ b/build/Makefile @@ -5,7 +5,7 @@ .PHONY : msys win32 win64 linux android PDIR ?= libdir -VERSION = 3.19 +VERSION = 3.20 system := $(shell uname -s) system := $(shell echo $(system) | grep MINGW > /dev/null && echo MINGW || echo $(system)) diff --git a/doc/Doxyfile b/doc/Doxyfile index 2dd89f506..d66f09007 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -31,7 +31,7 @@ PROJECT_NAME = LibMusicXML # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 3.19 +PROJECT_NUMBER = 3.20 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/javascript/npm/package.json b/javascript/npm/package.json index 6bbc7c79a..451fc3002 100644 --- a/javascript/npm/package.json +++ b/javascript/npm/package.json @@ -1,9 +1,10 @@ { "name": "@grame/libmusicxml", - "version": "3.19.1", + "version": "3.20", "description": "A library to support the MusicXML format.", "main": "libmusicxml.js", "directories": { + "dist": "dist" "test": "test" }, "scripts": { diff --git a/packages/Makefile b/packages/Makefile index e87a9952a..77b61b1d9 100644 --- a/packages/Makefile +++ b/packages/Makefile @@ -2,7 +2,7 @@ # current dtds and schema version CURRENT = 3.1 -VERSION := 3.19 +VERSION := 3.20 TAG :=-D tomorrow ROOTDIR := .. SRCDIR := $(ROOTDIR)/src diff --git a/src/elements/versions.cpp b/src/elements/versions.cpp index d17d709b6..37b1dc744 100755 --- a/src/elements/versions.cpp +++ b/src/elements/versions.cpp @@ -15,8 +15,8 @@ namespace MusicXML2 { //______________________________________________________________________________ -float versions::libVersion() { return 3.19f; } -const char* versions::libVersionStr() { return "3.19"; } +float versions::libVersion() { return 3.20f; } +const char* versions::libVersionStr() { return "3.20"; } float versions::xml2guidoVersion() { return 3.1f; } const char* versions::xml2guidoVersionStr() { return "3.1"; } diff --git a/win32/libmusicxml/libmusicxml.rc b/win32/libmusicxml/libmusicxml.rc index 8c9abe0c1..b35447f2c 100644 --- a/win32/libmusicxml/libmusicxml.rc +++ b/win32/libmusicxml/libmusicxml.rc @@ -53,8 +53,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,1,9,0 - PRODUCTVERSION 3,1,9,0 + FILEVERSION 3,2,0,0 + PRODUCTVERSION 3,2,0,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -71,12 +71,12 @@ BEGIN BEGIN VALUE "CompanyName", "Grame" VALUE "FileDescription", "libmusicxml library" - VALUE "FileVersion", "3, 1, 9, 0" + VALUE "FileVersion", "3, 2, 0, 0" VALUE "InternalName", "libmusicxml" VALUE "LegalCopyright", "Copyright (C) GRAME 2008-2020" VALUE "OriginalFilename", "libmusicxml3.dll" VALUE "ProductName", " libmusicxml" - VALUE "ProductVersion", "3, 1, 9, 0" + VALUE "ProductVersion", "3, 2, 0, 0" END END BLOCK "VarFileInfo" From d09c853b41c6099749fcdbe4b92a2da262fb511d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 8 Jun 2020 16:01:39 +0200 Subject: [PATCH 062/164] xml2guido: Now inferring barline MeasNum from MusicXML. Solves Pickup measure numbering issue. --- src/guido/xmlpart2guido.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index fb3cb5bf6..33f670729 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -269,8 +269,14 @@ namespace MusicXML2 // Check bar-style if doubleBar if (fDoubleBar) tag = guidotag::create("doubleBar"); - else + else { tag = guidotag::create("bar"); + stringstream parameters; + std::string measNum = elt->getAttributeValue("number"); + if (!measNum.empty()) + parameters << "measNum="<< measNum; + tag->add(guidoparam::create(parameters.str(), false)); + } add (tag); } @@ -278,12 +284,24 @@ namespace MusicXML2 // Create a HIDDEN Bar in case of fPendingBar equal to false. // This is the case for "bar-style" equal to "none" or "implicit" measures Sguidoelement tag = guidotag::create("bar"); - std::string hidden = "hidden=\"true\""; - tag->add(guidoparam::create(hidden.c_str(), false)); + stringstream parameters; + std::string measNum = elt->getAttributeValue("number"); + if (!measNum.empty()) { + parameters << "measNum="<< measNum<<", "; + } + parameters << "hidden=\"true\""; + tag->add(guidoparam::create(parameters.str(), false)); add(tag); } fCurrentMeasure = elt; - fMeasNum++; + + + std::string measNum = elt->getAttributeValue("number"); + try { + fMeasNum = std::stoi(measNum); + } catch(...) { + fMeasNum++; + } fCurrentMeasureLength.set (0, 1); fCurrentMeasurePosition.set(0, 1); fCurrentVoicePosition.set (0, 1); From 110b32ffbba227fe464da0eb892e46dc076372f0 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 9 Jun 2020 11:26:17 +0200 Subject: [PATCH 063/164] XML2GUIDO: Partial Conversion Feature on Library and Commandline Tools - cmdline: "--begin" and "--end" measure numbers for partial conversions - general `partialxml2guido` method --- samples/xml2guido.cpp | 19 +- src/guido/xml2guidovisitor.cpp | 7 +- src/guido/xml2guidovisitor.h | 148 +++++++------- src/guido/xmlpart2guido.cpp | 275 ++++++++++++++------------ src/guido/xmlpart2guido.h | 318 ++++++++++++++++--------------- src/interface/libmusicxml.h | 26 ++- src/interface/musicxml2guido.cpp | 43 ++++- 7 files changed, 480 insertions(+), 356 deletions(-) diff --git a/samples/xml2guido.cpp b/samples/xml2guido.cpp index 54774c492..e8053e376 100644 --- a/samples/xml2guido.cpp +++ b/samples/xml2guido.cpp @@ -27,7 +27,9 @@ static void usage() { cerr << " reads stdin when is '-'" << endl; cerr << " options: --autobars don't generates barlines" << endl; cerr << " --version print version and exit" << endl; - cerr << " -o file : write output to file" << endl; + cerr << " -o file : write output to file" << endl; + cerr << " --begin : starting measure number (default: 0)" << endl; + cerr << " --end : end on measure (default: infinite)" << endl; cerr << " -h --help : print this help" << endl; exit(1); } @@ -75,6 +77,14 @@ static char* fileOpt(int argc, char *argv[], const string& option) return 0; } +static int intOpt(int argc, char *argv[], const string& option) +{ + for (int i=1; i fCreators; + S_movement_title fTitle; + std::vector fCreators; } scoreHeader; - /* -typedef struct { - S_part_name fPartName; -} partHeader; -typedef std::map partHeaderMap; -*/ +/* + typedef struct { + S_part_name fPartName; + } partHeader; + typedef std::map partHeaderMap; + */ /*! -\brief A score visitor to produce a Guido representation. -*/ + \brief A score visitor to produce a Guido representation. + */ //______________________________________________________________________________ class EXP xml2guidovisitor : - public partlistvisitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor +public partlistvisitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor { - // the guido elements stack - std::stack fStack; - bool fGenerateComments, fGenerateStem, fGenerateBars, fGeneratePositions; - - scoreHeader fHeader; // musicxml header elements (should be flushed at the beginning of the first voice) - //partHeaderMap fPartHeaders; // musicxml score-part elements (should be flushed at the beginning of each part) - std::string fCurrentPartID; - int fCurrentStaffIndex; // the index of the current guido staff - - void start (Sguidoelement& elt) { fStack.push(elt); } - void add (Sguidoelement& elt) { if (fStack.size()) fStack.top()->add(elt); } - void push (Sguidoelement& elt) { add(elt); fStack.push(elt); } - void pop () { + // the guido elements stack + std::stack fStack; + bool fGenerateComments, fGenerateStem, fGenerateBars, fGeneratePositions; + + scoreHeader fHeader; // musicxml header elements (should be flushed at the beginning of the first voice) + std::string fCurrentPartID; + int fCurrentStaffIndex; // the index of the current guido staff + + void start (Sguidoelement& elt) { fStack.push(elt); } + void add (Sguidoelement& elt) { if (fStack.size()) fStack.top()->add(elt); } + void push (Sguidoelement& elt) { add(elt); fStack.push(elt); } + void pop () { if (fStack.size()) fStack.pop(); else cerr<<"xml2guido: Pop() called while EMPTY! Please REPORT!"< //std::multimap > staffClefMap; std::multimap > > staffClefMap; - + /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) std::map< int, std::map< rational, std::vector > > timePositions; - - - public: - xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar=true, int partNum = 0); - virtual ~xml2guidovisitor() {} - - Sguidoelement convert (const Sxmlelement& xml); - - // this is to control exact positionning of elements when information is present - // ie converts relative-x/-y into dx/dy attributes - void generatePositions (bool state) { fGeneratePositions = state; } + + +public: + xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar=true, int partNum = 0, int beginMeasure = 0, int endMeasure = 10000); + virtual ~xml2guidovisitor() {} + + Sguidoelement convert (const Sxmlelement& xml); + + // this is to control exact positionning of elements when information is present + // ie converts relative-x/-y into dx/dy attributes + void generatePositions (bool state) { fGeneratePositions = state; } /// Shared default derived from MusicXML static int defaultGuidoStaffDistance; // the above converted to Guido value - + static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset); - static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float xoffset); + static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float xoffset); static void addPosY ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float ymultiplier); static void addPosX ( Sxmlelement elt, Sguidoelement& tag, float xoffset); static void addRelativeX(Sxmlelement elt, Sguidoelement& tag, float xoffset); static void addPlacement ( Sxmlelement elt, Sguidoelement& tag); static float getYposition ( Sxmlelement elt, float yoffset, bool useDefault); static float getXposition ( Sxmlelement elt, float xoffset); - + static void addDirection( Sxmlelement elt, Sguidoelement& tag); - + }; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 33f670729..0ba484e7c 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -33,11 +33,12 @@ namespace MusicXML2 { //______________________________________________________________________________ - xmlpart2guido::xmlpart2guido(bool generateComments, bool generateStem, bool generateBar) : + xmlpart2guido::xmlpart2guido(bool generateComments, bool generateStem, bool generateBar, int startMeasure, int endMeasure) : fGenerateComments(generateComments), //fGenerateStem(generateStem), fGenerateBars(generateBar), fNotesOnly(false), fCurrentStaffIndex(0), fCurrentStaff(0), - fTargetStaff(0), fTargetVoice(0) + fTargetStaff(0), fTargetVoice(0), + fStartMeasure(startMeasure), fEndMeasure(endMeasure) { fGeneratePositions = true; fGenerateAutoMeasureNum = true; @@ -170,6 +171,18 @@ namespace MusicXML2 add (tag); } } + +/// Check if measure number is in range for Partial Rendering +bool xmlpart2guido::checkMeasureRange() { + if (!fCurrentMeasure) return true; + int currentXmlMeasure = atoi(fCurrentMeasure->getAttributeValue("number").c_str()); + //cerr<<"\t <<< checkMeasureRange "<< currentXmlMeasure<< "|"<0) && (currentXmlMeasure > fEndMeasure)) return false; + + return true; +} //______________________________________________________________________________ void xmlpart2guido::moveMeasureTime (int duration, bool moveVoiceToo, int x_default) @@ -256,6 +269,37 @@ namespace MusicXML2 //______________________________________________________________________________ void xmlpart2guido::visitStart ( S_measure& elt ) { + fCurrentMeasure = elt; + + std::string measNum = elt->getAttributeValue("number"); + try { + fMeasNum = std::stoi(measNum); + } catch(...) { + fMeasNum++; + } + + bool isFirstPartialMeasure = (fStartMeasure>0) && (fMeasNum == fStartMeasure); + + if (!checkMeasureRange()) { + return; + } else { + // Flush Attributes (key, clef, meter) in case of initial entry + if ( isFirstPartialMeasure ) { + if (!fNotesOnly) { + add(lastMeter); + add(lastKey); + + // Add last clef + std::string lastClef = getClef(fCurrentStaffIndex , fCurrentVoicePosition, fMeasNum); + if (!lastClef.empty()) { + Sguidoelement tag = guidotag::create("clef"); + tag->add (guidoparam::create(lastClef)); + add(tag); + } + } + } + } + const string& implicit = elt->getAttributeValue ("implicit"); if (implicit == "yes") fPendingBar = false; if (fPendingBar) { @@ -278,7 +322,8 @@ namespace MusicXML2 tag->add(guidoparam::create(parameters.str(), false)); } - add (tag); + if (!isFirstPartialMeasure) + add (tag); } }else { // Create a HIDDEN Bar in case of fPendingBar equal to false. @@ -293,15 +338,7 @@ namespace MusicXML2 tag->add(guidoparam::create(parameters.str(), false)); add(tag); } - fCurrentMeasure = elt; - - std::string measNum = elt->getAttributeValue("number"); - try { - fMeasNum = std::stoi(measNum); - } catch(...) { - fMeasNum++; - } fCurrentMeasureLength.set (0, 1); fCurrentMeasurePosition.set(0, 1); fCurrentVoicePosition.set (0, 1); @@ -1132,30 +1169,6 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) void xmlpart2guido::visitStart ( S_attributes& elt ) { // get clef, key, division, staves, time and key in order! - /* Example: - 2 - - 1 - major - - - 2 - - G - 2 - - - F - 4 - - -1 - -2 - - - *****/ ctree::iterator iter = elt->begin(); @@ -1206,7 +1219,9 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) Sguidoelement tag = guidotag::create("clef"); checkStaff (staffnum); tag->add (guidoparam::create(param)); - add(tag); + + if (checkMeasureRange()) + add(tag); std::pair foo = std::pair(fCurrentVoicePosition ,param); staffClefMap.insert(std::pair > >(fCurrentStaffIndex, std::pair< int, std::pair< rational, std::string > >(fMeasNum, foo) ) ); @@ -1220,100 +1235,113 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) // Generate key iter = elt->find(k_key); - if ((iter != elt->end())&&(!fNotesOnly)) - { - string keymode = iter->getValue(k_mode); - int keyfifths = iter->getIntValue(k_fifths, 0); - Sguidoelement tag = guidotag::create("key"); - tag->add (guidoparam::create(keyfifths, false)); - add (tag); + if ((iter != elt->end())&&(!fNotesOnly)) { + parseKey(iter); } // Generate Time Signature info and METER info iter = elt->find(k_time); - if ((iter != elt->end())&&(!fNotesOnly)) - { - //int timebeat_type = iter->getIntValue(k_beat_type, 0); - //int timebeats = iter->getIntValue(k_beats, 0); - bool senzamesura = (iter->find(k_senza_misura) != iter->end()); - string timesymbol = iter->getAttributeValue("symbol"); - std::vector > fTimeSignInternal ; - - // IOSEPRAC-185: Get all pairs for Composite Time Signatures - ctree::iterator iter_beat = iter->find(k_beats); - ctree::iterator iter_beatType = iter->find(k_beat_type); - - while (iter_beat != iter->end()) - { - // fTimeSignInternal.push_back(make_pair(iter_beat->getValue(k_beats), iter2->getValue(k_beat_type))); - fTimeSignInternal.push_back(make_pair(iter_beat->getValue(), - iter_beatType->getValue())); - iter_beat = iter->find(k_beats, iter_beat++); - iter_beatType = iter->find(k_beat_type, iter_beatType++); - } + if ((iter != elt->end())&&(!fNotesOnly)) { + parseTime(iter); + } + } + +void xmlpart2guido::parseKey(ctree::iterator &iter) { + string keymode = iter->getValue(k_mode); + int keyfifths = iter->getIntValue(k_fifths, 0); + Sguidoelement tag = guidotag::create("key"); + tag->add (guidoparam::create(keyfifths, false)); + + lastKey = tag; + if (checkMeasureRange()) + add (tag); +} + +void xmlpart2guido::parseTime(ctree::iterator &iter) { + //int timebeat_type = iter->getIntValue(k_beat_type, 0); + //int timebeats = iter->getIntValue(k_beats, 0); + bool senzamesura = (iter->find(k_senza_misura) != iter->end()); + string timesymbol = iter->getAttributeValue("symbol"); + std::vector > fTimeSignInternal ; + + // IOSEPRAC-185: Get all pairs for Composite Time Signatures + ctree::iterator iter_beat = iter->find(k_beats); + ctree::iterator iter_beatType = iter->find(k_beat_type); + + while (iter_beat != iter->end()) + { + fTimeSignInternal.push_back(make_pair(iter_beat->getValue(), + iter_beatType->getValue())); + iter_beat = iter->find(k_beats, iter_beat++); + iter_beatType = iter->find(k_beat_type, iter_beatType++); + } + + /// Actions: + string timesign; + if (!senzamesura) { + if (timesymbol == "common") { + // simulation of timesignvisitor::timesign function + //rational ts = timesignvisitor::timesign(0); + size_t index = 0; + rational ts(0,1); + if (index < fTimeSignInternal.size()) { + const pair& tss = fTimeSignInternal[index]; + long num = strtol (tss.first.c_str(), 0, 10); + long denum = strtol (tss.second.c_str(), 0, 10); + if (num && denum) ts.set(num, denum); + } + /// + if ((ts.getDenominator() == 2) && (ts.getNumerator() == 2)) + timesign = "C/"; + else if ((ts.getDenominator() == 4) && (ts.getNumerator() == 4)) + timesign = "C"; + else + timesign = string(ts); + fCurrentTimeSign = ts; + } + else if (timesymbol == "cut") { + timesign = "C/"; + fCurrentTimeSign = rational(2,2); + } + else { - //// Actions: - string timesign; - if (!senzamesura) { - if (timesymbol == "common") { - // simulation of timesignvisitor::timesign function - //rational ts = timesignvisitor::timesign(0); - size_t index = 0; - rational ts(0,1); - if (index < fTimeSignInternal.size()) { - const pair& tss = fTimeSignInternal[index]; - long num = strtol (tss.first.c_str(), 0, 10); - long denum = strtol (tss.second.c_str(), 0, 10); - if (num && denum) ts.set(num, denum); - } - /// - if ((ts.getDenominator() == 2) && (ts.getNumerator() == 2)) - timesign = "C/"; - else if ((ts.getDenominator() == 4) && (ts.getNumerator() == 4)) - timesign = "C"; - else - timesign = string(ts); - fCurrentTimeSign = ts; - } - else if (timesymbol == "cut") { - timesign = "C/"; - fCurrentTimeSign = rational(2,2); - } - else { - - stringstream s; string sep =""; - fCurrentTimeSign.set(0,1); - for (unsigned int i = 0; i < fTimeSignInternal.size(); i++) { - s << sep << fTimeSignInternal[i].first << "/" << fTimeSignInternal[i].second; - sep = "+"; - //fCurrentTimeSign += timesignvisitor::timesign(i); - // simulation of timesignvisitor::timesign function - //rational ts = timesignvisitor::timesign(i); - size_t index = i; - rational ts(0,1); - if (index < fTimeSignInternal.size()) { - const pair& tss = fTimeSignInternal[index]; - long num = strtol (tss.first.c_str(), 0, 10); - long denum = strtol (tss.second.c_str(), 0, 10); - if (num && denum) ts.set(num, denum); - } - /// - fCurrentTimeSign += ts; - } - s >> timesign; + stringstream s; string sep =""; + fCurrentTimeSign.set(0,1); + for (unsigned int i = 0; i < fTimeSignInternal.size(); i++) { + s << sep << fTimeSignInternal[i].first << "/" << fTimeSignInternal[i].second; + sep = "+"; + //fCurrentTimeSign += timesignvisitor::timesign(i); + // simulation of timesignvisitor::timesign function + //rational ts = timesignvisitor::timesign(i); + size_t index = i; + rational ts(0,1); + if (index < fTimeSignInternal.size()) { + const pair& tss = fTimeSignInternal[index]; + long num = strtol (tss.first.c_str(), 0, 10); + long denum = strtol (tss.second.c_str(), 0, 10); + if (num && denum) ts.set(num, denum); } - + /// + fCurrentTimeSign += ts; } - - Sguidoelement tag = guidotag::create("meter"); - tag->add (guidoparam::create(timesign)); - if (fGenerateBars) tag->add (guidoparam::create("autoBarlines=\"off\"", false)); - if (fGenerateAutoMeasureNum) tag->add (guidoparam::create("autoMeasuresNum=\"system\"", false)); - if (iter->getAttributeValue("print-object")!="no") - add(tag); + s >> timesign; } } + Sguidoelement tag = guidotag::create("meter"); + tag->add (guidoparam::create(timesign)); + if (fGenerateBars) + tag->add (guidoparam::create("autoBarlines=\"off\"", false)); + if (fGenerateAutoMeasureNum) + tag->add (guidoparam::create("autoMeasuresNum=\"system\"", false)); + + if (iter->getAttributeValue("print-object")!="no") { + lastMeter = tag; + if (checkMeasureRange()) + add(tag); + } +} + //______________________________________________________________________________ // tools and methods for converting notes //______________________________________________________________________________ @@ -2816,11 +2844,10 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur bool scanVoice = (notevisitor::getVoice() == fTargetVoice); if (!isGrace() ) { - //////// Track all voice default-x parameters, as positions in measures + ///Track all voice default-x parameters, as positions in measures if (true) { // had fNotesOnly - int measureNum = fCurrentMeasure->getAttributeIntValue("number", 0); - auto timePos4measure = timePositions.find(measureNum); + auto timePos4measure = timePositions.find(fMeasNum); if (notevisitor::x_default != -1) { if ( timePos4measure != timePositions.end()) { @@ -2837,7 +2864,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur }else { std::map > inner; inner.insert(std::make_pair(fCurrentVoicePosition, std::vector(1, notevisitor::x_default))); - timePositions.insert(std::make_pair(measureNum, inner)); + timePositions.insert(std::make_pair(fMeasNum, inner)); } } } diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 3e3424614..0591f66e6 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -1,14 +1,14 @@ /* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ + MusicXML Library + Copyright (C) Grame 2006-2013 + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + + Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France + research@grame.fr + */ #ifndef __xmlpart2guido__ #define __xmlpart2guido__ @@ -35,175 +35,186 @@ namespace MusicXML2 { /*! -\ingroup visitors guido -@{ -*/ + \ingroup visitors guido + @{ + */ /*! -\brief A score visitor to produce a Guido representation. -*/ + \brief A score visitor to produce a Guido representation. + */ //______________________________________________________________________________ class EXP xmlpart2guido : - public clefvisitor, - public timesignvisitor, - public notevisitor, - public keysignvisitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, // for rehearsal Markup - public visitor // to get clef, division, staves, time and key in order! +public clefvisitor, +public timesignvisitor, +public notevisitor, +public keysignvisitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, +public visitor, // for rehearsal Markup +public visitor // to get clef, division, staves, time and key in order! { - // the guido elements stack - std::stack fStack; - // structure to store delayed elements ie elements enclosed in direction with offset - typedef struct { - long delay; - Sguidoelement element; - } delayedElement; - vector fDelayed; - // fields to controls the guido output generation - bool fGenerateComments, fGenerateBars, fGeneratePositions, fGenerateAutoMeasureNum, fLyricsManualSpacing; - - // internal parsing state + // the guido elements stack + std::stack fStack; + // structure to store delayed elements ie elements enclosed in direction with offset + typedef struct { + long delay; + Sguidoelement element; + } delayedElement; + vector fDelayed; + // fields to controls the guido output generation + bool fGenerateComments, fGenerateBars, fGeneratePositions, fGenerateAutoMeasureNum, fLyricsManualSpacing; + + // internal parsing state bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress, fShouldStopOctava; int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets std::queue fTiedOpen; // Number of ongoing opened Tied - + std::queue fDirectionEraserStack; // To skip already visited Directions when looking ahead because of grace notes std::vector< std::pair > fSlurStack; // first int: Internal num, 2nd int: XML num - + Sguidoelement fLyricOpened; bool isProcessingChord; - - S_measure fCurrentMeasure; + + S_measure fCurrentMeasure; S_part fCurrentPart; - - bool fNotesOnly; // a flag to generate notes only (used for several voices on the same staff) - bool fSkipDirection; // a flag to skip direction elements (for notes only mode or due to different staff) - int fCurrentStaffIndex; // the index of the current guido staff - int fCurrentStaff; // the staff we're currently generating events for (0 by default) - int fTargetStaff; // the musicxml target staff (0 by default) - int fTargetVoice; // the musicxml target voice (0 by default) - - long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note - long fCurrentOffset; // the current direction offset: represents an element relative displacement in current division unit - rational fCurrentMeasureLength; // the current measure length (max of the current measure positions) - rational fCurrentMeasurePosition;// the current position in the measure - rational fCurrentVoicePosition; // the current position within a voice - rational fCurrentTimeSign; // the current time signature - int fMeasNum; - - int fCurrentStemDirection; // the current stems direction, used for stem direction changes - int fPendingPops; // elements to be popped at chord exit (like fermata, articulations...) - - void start (Sguidoelement& elt) { fStack.push(elt); } - void add (Sguidoelement& elt) { if (fStack.size()) fStack.top()->add(elt); } - void addDelayed (Sguidoelement elt, long offset); // adding elements to the delayed elements - void checkDelayed (long time); // checks the delayed elements for ready elements - void push (Sguidoelement& elt) { add(elt); fStack.push(elt); } - void pop () { fStack.pop(); } - - void moveMeasureTime (int duration, bool moveVoiceToo=false, int x_default = 0); - void reset (); - void stackClean (); - - int checkArticulation ( const notevisitor& note ); // returns the count of articulations pushed on the stack + + int fStartMeasure, fEndMeasure; // Starting and Ending measures for Partial conversion. Default=0 meaning non-partial. + + bool fNotesOnly; // a flag to generate notes only (used for several voices on the same staff) + bool fSkipDirection; // a flag to skip direction elements (for notes only mode or due to different staff) + int fCurrentStaffIndex; // the index of the current guido staff + int fCurrentStaff; // the staff we're currently generating events for (0 by default) + int fTargetStaff; // the musicxml target staff (0 by default) + int fTargetVoice; // the musicxml target voice (0 by default) + + long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note + long fCurrentOffset; // the current direction offset: represents an element relative displacement in current division unit + rational fCurrentMeasureLength; // the current measure length (max of the current measure positions) + rational fCurrentMeasurePosition;// the current position in the measure + rational fCurrentVoicePosition; // the current position within a voice + rational fCurrentTimeSign; // the current time signature + int fMeasNum; // Internal Measure Number mapping + + int fCurrentStemDirection; // the current stems direction, used for stem direction changes + int fPendingPops; // elements to be popped at chord exit (like fermata, articulations...) + + void start (Sguidoelement& elt) { fStack.push(elt); } + void add (Sguidoelement& elt) { + if (!checkMeasureRange()) return; + if (fStack.size()) + fStack.top()->add(elt); + } + void addDelayed (Sguidoelement elt, long offset); // adding elements to the delayed elements + void checkDelayed (long time); // checks the delayed elements for ready elements + void push (Sguidoelement& elt) { + if (!checkMeasureRange()) return; + add(elt); fStack.push(elt); + } + void pop () { + if (!checkMeasureRange()) return; + fStack.pop(); } + + void moveMeasureTime (int duration, bool moveVoiceToo=false, int x_default = 0); + void reset (); + void stackClean (); + + int checkArticulation ( const notevisitor& note ); // returns the count of articulations pushed on the stack void checkPostArticulation ( const notevisitor& note ); /// Articulations that should be generated in ADD mode after note creation - + int checkChordOrnaments ( const notevisitor& note ); // returns the count of articulations pushed on the stack deque getChord ( const S_note& note ); // build a chord vector - std::vector getChord ( const Sxmlelement& note ); // build a chord vector - void checkStaff (int staff ); // check for staff change - void checkStem ( const S_stem& stem ); - void checkBeamBegin ( const std::vector& beams, const S_note& elt ); + std::vector getChord ( const Sxmlelement& note ); // build a chord vector + void checkStaff (int staff ); // check for staff change + void checkStem ( const S_stem& stem ); + void checkBeamBegin ( const std::vector& beams, const S_note& elt ); void checkBeamEnd ( const std::vector& beams ); void checkTupletBegin( const std::vector& tuplets, const notevisitor& nv, const S_note& elt); void checkTupletEnd ( const std::vector& tuplets ); - void checkCue ( const notevisitor& nv ); - void checkGrace ( const notevisitor& nv ); + void checkCue ( const notevisitor& nv ); + void checkGrace ( const notevisitor& nv ); void checkGraceEnd(const notevisitor& nv); - int checkFermata ( const notevisitor& stem ); + int checkFermata ( const notevisitor& stem ); void checkSlur ( const std::vector& slurs ); - void checkSlurBegin ( const std::vector& slurs ); - void checkSlurEnd ( const std::vector& slurs ); + void checkSlurBegin ( const std::vector& slurs ); + void checkSlurEnd ( const std::vector& slurs ); bool isSlurClosing(S_slur elt); - void checkTiedBegin ( const std::vector& tied ); - void checkTiedEnd ( const std::vector& tied ); - void checkVoiceTime ( const rational& currTime, const rational& voiceTime); + void checkTiedBegin ( const std::vector& tied ); + void checkTiedEnd ( const std::vector& tied ); + void checkVoiceTime ( const rational& currTime, const rational& voiceTime); int checkRestFormat ( const notevisitor& nv ); int checkNoteFormatDx ( const notevisitor& nv , rational posInMeasure); void checkWavyTrillBegin ( const notevisitor& nv ); void checkWavyTrillEnd ( const notevisitor& nv ); void checkTextEnd(); void checkOctavaEnd(); - void newNote ( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings); + void newNote ( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings); void newChord (const deque& nvs, rational posInMeasure); int checkTremolo(const notevisitor& note, const S_note& elt); - std::string noteName ( const notevisitor& nv ); - guidonoteduration noteDuration ( const notevisitor& nv); - - std::vector::const_iterator findValue ( const std::vector& beams, const std::string& val ) const; - std::vector::const_iterator findTypeValue ( const std::vector& slurs, const std::string& val ) const; - std::vector::const_iterator findTypeValue ( const std::vector& tied, const std::string& val ) const; + std::string noteName ( const notevisitor& nv ); + guidonoteduration noteDuration ( const notevisitor& nv); + + std::vector::const_iterator findValue ( const std::vector& beams, const std::string& val ) const; + std::vector::const_iterator findTypeValue ( const std::vector& slurs, const std::string& val ) const; + std::vector::const_iterator findTypeValue ( const std::vector& tied, const std::string& val ) const; std::vector< std::pair >::const_iterator findSlur ( const int xmlnum ) const; - + /// Lyrics handling by AC void checkLyricBegin ( const std::vector& lyrics ); void checkLyricEnd ( const std::vector& lyrics ); std::vector::const_iterator findValue ( const std::vector& lyrics, const std::string& val ) const; std::string lyricParams; - - - static std::string alter2accident ( float alter ); - - protected: - enum { kStemUndefined, kStemUp, kStemDown, kStemNone }; - enum { kLeaveChord=-1, kNoChord, kEnterChord } chordState; - - virtual void visitStart( S_backup& elt); - virtual void visitStart( S_barline& elt); - virtual void visitStart( S_coda& elt); - virtual void visitStart( S_direction& elt); - virtual void visitStart( S_divisions& elt); - virtual void visitStart( S_forward& elt); - virtual void visitStart( S_measure& elt); - virtual void visitStart( S_note& elt); - virtual void visitStart( S_octave_shift& elt); - virtual void visitStart( S_part& elt); - virtual void visitStart( S_segno& elt); - virtual void visitStart( S_wedge& elt); - virtual void visitStart( S_rehearsal& elt); - virtual void visitStart( S_attributes& elt); - - virtual void visitEnd ( S_direction& elt); - virtual void visitEnd ( S_ending& elt); - virtual void visitEnd ( S_key& elt); - virtual void visitEnd ( S_measure& elt); - virtual void visitEnd ( S_note& elt); - virtual void visitEnd ( S_repeat& elt); - virtual void visitEnd ( S_sound& elt); - virtual void visitEnd ( S_time& elt); + + + static std::string alter2accident ( float alter ); + +protected: + enum { kStemUndefined, kStemUp, kStemDown, kStemNone }; + enum { kLeaveChord=-1, kNoChord, kEnterChord } chordState; + + virtual void visitStart( S_backup& elt); + virtual void visitStart( S_barline& elt); + virtual void visitStart( S_coda& elt); + virtual void visitStart( S_direction& elt); + virtual void visitStart( S_divisions& elt); + virtual void visitStart( S_forward& elt); + virtual void visitStart( S_measure& elt); + virtual void visitStart( S_note& elt); + virtual void visitStart( S_octave_shift& elt); + virtual void visitStart( S_part& elt); + virtual void visitStart( S_segno& elt); + virtual void visitStart( S_wedge& elt); + virtual void visitStart( S_rehearsal& elt); + virtual void visitStart( S_attributes& elt); + + virtual void visitEnd ( S_direction& elt); + virtual void visitEnd ( S_ending& elt); + virtual void visitEnd ( S_key& elt); + virtual void visitEnd ( S_measure& elt); + virtual void visitEnd ( S_note& elt); + virtual void visitEnd ( S_repeat& elt); + virtual void visitEnd ( S_sound& elt); + virtual void visitEnd ( S_time& elt); std::string parseMetronome ( metronomevisitor &mv ); @@ -213,31 +224,40 @@ class EXP xmlpart2guido : rational durationInCue; std::map fStaffDistance; - + bool fIgnoreWedgeWithOffset; // Internal Parsing facilities float xPosFromTimePos(float default_x, float relative_x); /// Infer X-Position from TimePosition - - public: - xmlpart2guido(bool generateComments, bool generateStem, bool generateBar=true); - virtual ~xmlpart2guido() {} - - Sguidoelement& current () { return fStack.top(); } - void initialize (Sguidoelement seq, int staff, int guidostaff, int voice, bool notesonly, rational defaultTimeSign); - void generatePositions (bool state) { fGeneratePositions = state; } - const rational& getTimeSign () const { return fCurrentTimeSign; } - bool fHasLyrics; - bool hasLyrics() const {return fHasLyrics;} + +public: + xmlpart2guido(bool generateComments, bool generateStem, bool generateBar = true, int startMeasure = 0, int endMeasure = 0); + virtual ~xmlpart2guido() {} + + Sguidoelement& current () { return fStack.top(); } + void initialize (Sguidoelement seq, int staff, int guidostaff, int voice, bool notesonly, rational defaultTimeSign); + void generatePositions (bool state) { fGeneratePositions = state; } + const rational& getTimeSign () const { return fCurrentTimeSign; } + bool hasLyrics() const {return fHasLyrics;} + std::multimap > > staffClefMap; - - std::string getClef(int staffIndex, rational pos, int measureNum); - /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) std::map< int, std::map< rational, std::vector > > timePositions; +private: + bool fHasLyrics; + + std::string getClef(int staffIndex, rational pos, int measureNum); + void addPosYforNoteHead(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag, float offset); + bool checkMeasureRange(); + + void parseTime(ctree::iterator &iter); + void parseKey(ctree::iterator &iter); + + Sguidoelement lastKey; // Storage used for Partial Conversions + Sguidoelement lastMeter; // Storage used for Partial Conversions }; diff --git a/src/interface/libmusicxml.h b/src/interface/libmusicxml.h index 667876716..8e5cf177c 100644 --- a/src/interface/libmusicxml.h +++ b/src/interface/libmusicxml.h @@ -101,7 +101,7 @@ EXP const char* musicxml2brailleVersionStr(); \param out the output stream \return an error code (\c kNoErr when success) */ -EXP xmlErr musicxmlfile2guido (const char *file, bool generateBars, std::ostream& out); +EXP xmlErr musicxmlfile2guido (const char *file, bool generateBars, int beginMeasure, int endMeasure, std::ostream& out); /*! \brief Converts a MusicXML representation to the Guido format. @@ -110,7 +110,7 @@ EXP xmlErr musicxmlfile2guido (const char *file, bool generateBars, std::o \param out the output stream \return an error code (\c kNoErr when success) */ -EXP xmlErr musicxmlfd2guido (FILE* fd, bool generateBars, std::ostream& out); +EXP xmlErr musicxmlfd2guido (FILE* fd, bool generateBars, int beginMeasure, int endMeasure, std::ostream& out); /*! \brief Converts a MusicXML representation to the Guido format. @@ -128,11 +128,33 @@ EXP xmlErr musicxmlstring2guido(const char *buff, bool generateBars, std::o \param buff a string containing MusicXML code \param generateBars a boolean to force barlines generation + \param partFilter 0 for all parts. Part number only otherwise. \param out the output stream \return an error code (\c kNoErr when success) */ EXP xmlErr musicxmlstring2guidoOnPart(const char * buffer, bool generateBars, int partFilter, std::ostream& out); +/*! + \brief Partial Conversion of MusicXML representation to the Guido format ONLY on asked Part number ID and asked Measure Numbers (begin/end) + + Courtesy of Antescofo + + \param buff a string containing MusicXML code + \param generateBars a boolean to force barlines generation + \param partFilter 0 for all parts. Part number only otherwise. + \param beginMeasure Beginning measure number + \param endMeausre Ending measure number + \param out the output stream + \return an error code (\c kNoErr when success) + */ +EXP xmlErr musicxmlstring2guidoPartial(const char * buffer, + bool generateBars, + int partFilter, + int beginMeasure, + int endMeasure, + std::ostream& out); + + /*! @} */ diff --git a/src/interface/musicxml2guido.cpp b/src/interface/musicxml2guido.cpp index 2802b17f5..141e05628 100644 --- a/src/interface/musicxml2guido.cpp +++ b/src/interface/musicxml2guido.cpp @@ -49,24 +49,52 @@ static xmlErr xml2guido(SXMLFile& xmlfile, bool generateBars, int partFilter, os } //_______________________________________________________________________________ -EXP xmlErr musicxmlfile2guido(const char *file, bool generateBars, ostream& out) +static xmlErr partialxml2guido(SXMLFile& xmlfile, bool generateBars, int partFilter, int beginMeasure, int endMeasure, ostream& out, const char* file) +{ + Sxmlelement st = xmlfile->elements(); + if (st) { + if (st->getName() == "score-timewise") return kUnsupported; + + xml2guidovisitor v(true, true, generateBars, partFilter, beginMeasure, endMeasure); + Sguidoelement gmn = v.convert(st); + if (file) { + out << "(*\n gmn code converted from '" << file << "'" + << "\n using libmusicxml v." << musicxmllibVersionStr(); + } + else out << "(*\n gmn code converted using libmusicxml v." << musicxmllibVersionStr(); + out << "\n and the embedded xml2guido converter v." << musicxml2guidoVersionStr() + << "\n*)" << endl; + out << gmn << endl; + return kNoErr; + } + return kInvalidFile; +} + +//_______________________________________________________________________________ +EXP xmlErr musicxmlfile2guido(const char *file, bool generateBars, int beginMeasure, int endMeasure, ostream& out) { xmlreader r; SXMLFile xmlfile; xmlfile = r.read(file); if (xmlfile) { + if ((beginMeasure != 0) || (endMeasure != 0)) { + return partialxml2guido(xmlfile, generateBars, 0, beginMeasure, endMeasure, out, 0); + } return xml2guido(xmlfile, generateBars, 0, out, file); } return kInvalidFile; } //_______________________________________________________________________________ -EXP xmlErr musicxmlfd2guido(FILE * fd, bool generateBars, ostream& out) +EXP xmlErr musicxmlfd2guido(FILE * fd, bool generateBars, int beginMeasure, int endMeasure, ostream& out) { xmlreader r; SXMLFile xmlfile; xmlfile = r.read(fd); if (xmlfile) { + if ((beginMeasure != 0) || (endMeasure != 0)) { + return partialxml2guido(xmlfile, generateBars, 0, beginMeasure, endMeasure, out, 0); + } return xml2guido(xmlfile, generateBars, 0, out, 0); } return kInvalidFile; @@ -89,6 +117,17 @@ EXP xmlErr musicxmlstring2guidoOnPart(const char * buffer, bool generateBars, in } return kInvalidFile; } + +EXP xmlErr musicxmlstring2guidoPartial(const char * buffer, bool generateBars, int partFilter, int beginMeasure, int endMeasure, std::ostream& out) +{ + xmlreader r; + SXMLFile xmlfile; + xmlfile = r.readbuff(buffer); + if (xmlfile) { + return partialxml2guido(xmlfile, generateBars, partFilter, beginMeasure, endMeasure, out, 0); + } + return kInvalidFile; +} } From 8d998e58d579c2f1b8211ad687470902f2c3c048 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 9 Jun 2020 18:43:29 +0200 Subject: [PATCH 064/164] xml2guido: Addition of partFilter for API methods + documentation --- samples/xml2guido.cpp | 10 ++++++---- src/interface/libmusicxml.h | 12 +++++++++--- src/interface/musicxml2guido.cpp | 12 ++++++------ 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/samples/xml2guido.cpp b/samples/xml2guido.cpp index e8053e376..cc0a025c4 100644 --- a/samples/xml2guido.cpp +++ b/samples/xml2guido.cpp @@ -29,7 +29,8 @@ static void usage() { cerr << " --version print version and exit" << endl; cerr << " -o file : write output to file" << endl; cerr << " --begin : starting measure number (default: 0)" << endl; - cerr << " --end : end on measure (default: infinite)" << endl; + cerr << " --end : end on measure (default: infinite)" << endl; + cerr << " --part : The part number to convert. 0 for all. (default: 0)" << endl; cerr << " -h --help : print this help" << endl; exit(1); } @@ -105,7 +106,8 @@ int main(int argc, char *argv[]) if (checkOpt (argc, argv, "-h") || checkOpt (argc, argv, "--help")) usage(); int beginMeasure = intOpt(argc, argv, "--begin"), - endMeasure = intOpt(argc, argv, "--end"); + endMeasure = intOpt(argc, argv, "--end"), + partFilter = intOpt(argc, argv, "--part"); bool generateBars = !checkOpt (argc, argv, "--autobars"); const char * file = argv[argc-1]; @@ -123,9 +125,9 @@ int main(int argc, char *argv[]) xmlErr err = kNoErr; if (!strcmp(file, "-")) - err = musicxmlfd2guido(stdin, generateBars, beginMeasure, endMeasure, *out); + err = musicxmlfd2guido(stdin, generateBars, beginMeasure, endMeasure, partFilter, *out); else - err = musicxmlfile2guido(file, generateBars, beginMeasure, endMeasure, *out); + err = musicxmlfile2guido(file, generateBars, beginMeasure, endMeasure, partFilter, *out); if (err == kUnsupported) cerr << "unsupported xml format" << endl; else if (err ) { diff --git a/src/interface/libmusicxml.h b/src/interface/libmusicxml.h index 8e5cf177c..f0522bab4 100644 --- a/src/interface/libmusicxml.h +++ b/src/interface/libmusicxml.h @@ -98,19 +98,25 @@ EXP const char* musicxml2brailleVersionStr(); \brief Converts a MusicXML representation to the Guido format. \param file a file name \param generateBars a boolean to force barlines generation + \param beginMeasure for Partial conversion: start measure number (default: 0) + \param endMeasure for Partial conversion: end measure number (default: infinite) + \param partFilter Part number to convert or 0 for all (default: 0) \param out the output stream \return an error code (\c kNoErr when success) */ -EXP xmlErr musicxmlfile2guido (const char *file, bool generateBars, int beginMeasure, int endMeasure, std::ostream& out); +EXP xmlErr musicxmlfile2guido (const char *file, bool generateBars, int beginMeasure, int endMeasure, int partFilter, std::ostream& out); /*! \brief Converts a MusicXML representation to the Guido format. \param fd a file descriptor \param generateBars a boolean to force barlines generation + \param beginMeasure for Partial conversion: start measure number (default: 0) + \param endMeasure for Partial conversion: end measure number (default: infinite) + \param partFilter Part number to convert or 0 for all (default: 0) \param out the output stream \return an error code (\c kNoErr when success) */ -EXP xmlErr musicxmlfd2guido (FILE* fd, bool generateBars, int beginMeasure, int endMeasure, std::ostream& out); +EXP xmlErr musicxmlfd2guido (FILE* fd, bool generateBars, int beginMeasure, int endMeasure, int partFilter, std::ostream& out); /*! \brief Converts a MusicXML representation to the Guido format. @@ -128,7 +134,7 @@ EXP xmlErr musicxmlstring2guido(const char *buff, bool generateBars, std::o \param buff a string containing MusicXML code \param generateBars a boolean to force barlines generation - \param partFilter 0 for all parts. Part number only otherwise. + \param partFilter 0 for all parts. Part number only otherwise (default:0). \param out the output stream \return an error code (\c kNoErr when success) */ diff --git a/src/interface/musicxml2guido.cpp b/src/interface/musicxml2guido.cpp index 141e05628..41cebc568 100644 --- a/src/interface/musicxml2guido.cpp +++ b/src/interface/musicxml2guido.cpp @@ -71,31 +71,31 @@ static xmlErr partialxml2guido(SXMLFile& xmlfile, bool generateBars, int partFil } //_______________________________________________________________________________ -EXP xmlErr musicxmlfile2guido(const char *file, bool generateBars, int beginMeasure, int endMeasure, ostream& out) +EXP xmlErr musicxmlfile2guido(const char *file, bool generateBars, int beginMeasure, int endMeasure, int partFilter, ostream& out) { xmlreader r; SXMLFile xmlfile; xmlfile = r.read(file); if (xmlfile) { if ((beginMeasure != 0) || (endMeasure != 0)) { - return partialxml2guido(xmlfile, generateBars, 0, beginMeasure, endMeasure, out, 0); + return partialxml2guido(xmlfile, generateBars, partFilter, beginMeasure, endMeasure, out, 0); } - return xml2guido(xmlfile, generateBars, 0, out, file); + return xml2guido(xmlfile, generateBars, partFilter, out, file); } return kInvalidFile; } //_______________________________________________________________________________ -EXP xmlErr musicxmlfd2guido(FILE * fd, bool generateBars, int beginMeasure, int endMeasure, ostream& out) +EXP xmlErr musicxmlfd2guido(FILE * fd, bool generateBars, int beginMeasure, int endMeasure, int partFilter, ostream& out) { xmlreader r; SXMLFile xmlfile; xmlfile = r.read(fd); if (xmlfile) { if ((beginMeasure != 0) || (endMeasure != 0)) { - return partialxml2guido(xmlfile, generateBars, 0, beginMeasure, endMeasure, out, 0); + return partialxml2guido(xmlfile, generateBars, partFilter, beginMeasure, endMeasure, out, 0); } - return xml2guido(xmlfile, generateBars, 0, out, 0); + return xml2guido(xmlfile, generateBars, partFilter, out, 0); } return kInvalidFile; } From ff69eb177467a812facb3c018693c9d6a2648357 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 10 Jun 2020 18:35:26 +0200 Subject: [PATCH 065/164] xml2guido: Check existence of lastMeter and lastKey before adding --- src/guido/xmlpart2guido.cpp | 14 ++++++++------ src/guido/xmlpart2guido.h | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 0ba484e7c..d709a6c54 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -286,8 +286,12 @@ bool xmlpart2guido::checkMeasureRange() { // Flush Attributes (key, clef, meter) in case of initial entry if ( isFirstPartialMeasure ) { if (!fNotesOnly) { - add(lastMeter); - add(lastKey); + if (lastMeter) { + add(lastMeter); + } + if (lastKey) { + add(lastKey); + } // Add last clef std::string lastClef = getClef(fCurrentStaffIndex , fCurrentVoicePosition, fMeasNum); @@ -1253,8 +1257,7 @@ void xmlpart2guido::parseKey(ctree::iterator &iter) { tag->add (guidoparam::create(keyfifths, false)); lastKey = tag; - if (checkMeasureRange()) - add (tag); + add (tag); } void xmlpart2guido::parseTime(ctree::iterator &iter) { @@ -1337,8 +1340,7 @@ void xmlpart2guido::parseTime(ctree::iterator &iter) { if (iter->getAttributeValue("print-object")!="no") { lastMeter = tag; - if (checkMeasureRange()) - add(tag); + add(tag); } } diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 0591f66e6..9ec9ecde5 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -125,9 +125,10 @@ public visitor // to get clef, division, staves, time and if (!checkMeasureRange()) return; add(elt); fStack.push(elt); } - void pop () { + void pop () { if (!checkMeasureRange()) return; - fStack.pop(); } + fStack.pop(); + } void moveMeasureTime (int duration, bool moveVoiceToo=false, int x_default = 0); void reset (); From 38307bfc1c8c1af9700831886779f0980f02a806 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 11 Jun 2020 16:57:08 +0200 Subject: [PATCH 066/164] xml2guido: Partial xml2guido conversion with ending offset and ability to return Guido Positions on Start/End - Also removed unvisited visitors in musicxmlquery --- src/guido/xml2guidovisitor.cpp | 8 +++-- src/guido/xml2guidovisitor.h | 23 ++++++++----- src/guido/xmlpart2guido.cpp | 58 ++++++++++++++++---------------- src/guido/xmlpart2guido.h | 9 +++-- src/operations/musicxmlquery.cpp | 44 +----------------------- src/operations/musicxmlquery.h | 12 ++----- 6 files changed, 58 insertions(+), 96 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 162b7c23b..091f0e03a 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -34,11 +34,11 @@ namespace MusicXML2 int xml2guidovisitor::defaultStaffDistance = 0; //______________________________________________________________________________ - xml2guidovisitor::xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar, int partNum, int beginMeasure, int endMeasure) : + xml2guidovisitor::xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar, int partNum, int beginMeasure, int endMeasure, int endMeasureOffset) : fGenerateComments(generateComments), fGenerateStem(generateStem), fGenerateBars(generateBar), fGeneratePositions(true), fCurrentStaffIndex(0), previousStaffHasLyrics(false), fCurrentAccoladeIndex(0), fPartNum(partNum), - fBeginMeasure(beginMeasure), fEndMeasure(endMeasure) + fBeginMeasure(beginMeasure), fEndMeasure(endMeasure), fEndMeasureOffset(endMeasureOffset) { timePositions.clear(); } @@ -306,7 +306,7 @@ namespace MusicXML2 //// //// Browse XML and convert - xmlpart2guido pv(fGenerateComments, fGenerateStem, fGenerateBars, fBeginMeasure, fEndMeasure); + xmlpart2guido pv(fGenerateComments, fGenerateStem, fGenerateBars, fBeginMeasure, fEndMeasure, fEndMeasureOffset); pv.generatePositions (fGeneratePositions); xml_tree_browser browser(&pv); pv.initialize(seq, targetStaff, fCurrentStaffIndex, targetVoice, notesOnly, currentTimeSign); @@ -318,6 +318,8 @@ namespace MusicXML2 previousStaffHasLyrics = pv.hasLyrics(); staffClefMap = pv.staffClefMap; timePositions = pv.timePositions; + fBeginPosition = pv.fStartPosition; + fEndPosition = pv.fEndPosition; } } diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 804937415..a58721a4e 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -43,13 +43,6 @@ typedef struct { std::vector fCreators; } scoreHeader; -/* - typedef struct { - S_part_name fPartName; - } partHeader; - typedef std::map partHeaderMap; - */ - /*! \brief A score visitor to produce a Guido representation. */ @@ -103,6 +96,12 @@ public visitor int fBeginMeasure; // Number of measure to begin parsing, used for partial conversion. (default = 0) int fEndMeasure; // Measure Number where parsing ends, used for partial conversion. (default = 0 meaning go to the end) + int fEndMeasureOffset; // Ending the score conversion at this offset (but giving fEndMeasure for fEndPosition) + + /// Guido Position corresponding to fBeginMeasure + rational fBeginPosition; + /// Guido Position corresponding to fEndMeasure (without fEndMeasureOffset) + rational fEndPosition; static int defaultStaffDistance; // xml staff-distance value in defaults @@ -115,7 +114,7 @@ public visitor public: - xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar=true, int partNum = 0, int beginMeasure = 0, int endMeasure = 10000); + xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar=true, int partNum = 0, int beginMeasure = 0, int endMeasure = 0, int endMeasureOffset = 0); virtual ~xml2guidovisitor() {} Sguidoelement convert (const Sxmlelement& xml); @@ -138,6 +137,14 @@ public visitor static void addDirection( Sxmlelement elt, Sguidoelement& tag); + std::pair getStartPosition() { + return std::pair(fBeginPosition.getNumerator(), fBeginPosition.getDenominator()); + } + + std::pair getEndPosition() { + return std::pair(fEndPosition.getNumerator(), fEndPosition.getDenominator()); + } + }; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index d709a6c54..94ce0ae10 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -33,12 +33,12 @@ namespace MusicXML2 { //______________________________________________________________________________ - xmlpart2guido::xmlpart2guido(bool generateComments, bool generateStem, bool generateBar, int startMeasure, int endMeasure) : + xmlpart2guido::xmlpart2guido(bool generateComments, bool generateStem, bool generateBar, int startMeasure, int endMeasure, int endMeasureOffset) : fGenerateComments(generateComments), //fGenerateStem(generateStem), fGenerateBars(generateBar), fNotesOnly(false), fCurrentStaffIndex(0), fCurrentStaff(0), fTargetStaff(0), fTargetVoice(0), - fStartMeasure(startMeasure), fEndMeasure(endMeasure) + fStartMeasure(startMeasure), fEndMeasure(endMeasure), fEndMeasureOffset(endMeasureOffset) { fGeneratePositions = true; fGenerateAutoMeasureNum = true; @@ -70,6 +70,7 @@ namespace MusicXML2 fTupletOpen = 0; fTremoloInProgress = false; fShouldStopOctava = false; + fCurrentScorePosition.set(0, 1); } //______________________________________________________________________________ @@ -179,7 +180,7 @@ bool xmlpart2guido::checkMeasureRange() { //cerr<<"\t <<< checkMeasureRange "<< currentXmlMeasure<< "|"<0) && (currentXmlMeasure > fEndMeasure)) return false; + if ((fEndMeasure>0) && (currentXmlMeasure > fEndMeasure+fEndMeasureOffset)) return false; return true; } @@ -217,7 +218,7 @@ bool xmlpart2guido::checkMeasureRange() { else if (diff.getNumerator() < 0) { if (!fInCue) - cerr << "warning! checkVoiceTime: measure time behind voice time " << string(diff) << "(measure "<< fMeasNum<<")" << endl; + cerr << "warning! checkVoiceTime: measure time behind voice time " << string(diff) << " (measure "<< fMeasNum<<")" << endl; } } @@ -270,6 +271,8 @@ bool xmlpart2guido::checkMeasureRange() { void xmlpart2guido::visitStart ( S_measure& elt ) { fCurrentMeasure = elt; + fCurrentScorePosition += fCurrentMeasureLength; + fCurrentScorePosition.rationalise(); std::string measNum = elt->getAttributeValue("number"); try { @@ -279,27 +282,24 @@ bool xmlpart2guido::checkMeasureRange() { } bool isFirstPartialMeasure = (fStartMeasure>0) && (fMeasNum == fStartMeasure); + + if ( isFirstPartialMeasure ) { + fStartPosition = fCurrentScorePosition; - if (!checkMeasureRange()) { - return; - } else { - // Flush Attributes (key, clef, meter) in case of initial entry - if ( isFirstPartialMeasure ) { - if (!fNotesOnly) { - if (lastMeter) { - add(lastMeter); - } - if (lastKey) { - add(lastKey); - } + if (!fNotesOnly) { + if (lastMeter) { + add(lastMeter); + } + if (lastKey) { + add(lastKey); + } - // Add last clef - std::string lastClef = getClef(fCurrentStaffIndex , fCurrentVoicePosition, fMeasNum); - if (!lastClef.empty()) { - Sguidoelement tag = guidotag::create("clef"); - tag->add (guidoparam::create(lastClef)); - add(tag); - } + // Add last clef + std::string lastClef = getClef(fCurrentStaffIndex , fCurrentVoicePosition, fMeasNum); + if (!lastClef.empty()) { + Sguidoelement tag = guidotag::create("clef"); + tag->add (guidoparam::create(lastClef)); + add(tag); } } } @@ -417,6 +417,10 @@ bool xmlpart2guido::checkMeasureRange() { fDoubleBar = true; } + + if ((fEndMeasure>0)&&(fEndMeasure+1 == fMeasNum)) { + fEndPosition = fCurrentScorePosition; + } } //______________________________________________________________________________ @@ -1223,9 +1227,7 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) Sguidoelement tag = guidotag::create("clef"); checkStaff (staffnum); tag->add (guidoparam::create(param)); - - if (checkMeasureRange()) - add(tag); + add(tag); std::pair foo = std::pair(fCurrentVoicePosition ,param); staffClefMap.insert(std::pair > >(fCurrentStaffIndex, std::pair< int, std::pair< rational, std::string > >(fMeasNum, foo) ) ); @@ -2985,9 +2987,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur return finalDx; } - }//else { - // cerr<<"ERROR: NO TIME POS FOR VOICE POSITION"< // to get clef, division, staves, time and S_measure fCurrentMeasure; S_part fCurrentPart; - int fStartMeasure, fEndMeasure; // Starting and Ending measures for Partial conversion. Default=0 meaning non-partial. + int fStartMeasure, fEndMeasure, fEndMeasureOffset; // Starting and Ending measures for Partial conversion. Default=0 meaning non-partial. bool fNotesOnly; // a flag to generate notes only (used for several voices on the same staff) bool fSkipDirection; // a flag to skip direction elements (for notes only mode or due to different staff) @@ -106,7 +106,8 @@ public visitor // to get clef, division, staves, time and long fCurrentOffset; // the current direction offset: represents an element relative displacement in current division unit rational fCurrentMeasureLength; // the current measure length (max of the current measure positions) rational fCurrentMeasurePosition;// the current position in the measure - rational fCurrentVoicePosition; // the current position within a voice + rational fCurrentVoicePosition; // the current position within a voice + rational fCurrentScorePosition; // the current position within the parsing score rational fCurrentTimeSign; // the current time signature int fMeasNum; // Internal Measure Number mapping @@ -232,7 +233,7 @@ public visitor // to get clef, division, staves, time and float xPosFromTimePos(float default_x, float relative_x); /// Infer X-Position from TimePosition public: - xmlpart2guido(bool generateComments, bool generateStem, bool generateBar = true, int startMeasure = 0, int endMeasure = 0); + xmlpart2guido(bool generateComments, bool generateStem, bool generateBar = true, int startMeasure = 0, int endMeasure = 0, int endMeasureOffset = 0); virtual ~xmlpart2guido() {} Sguidoelement& current () { return fStack.top(); } @@ -245,6 +246,8 @@ public visitor // to get clef, division, staves, time and /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) std::map< int, std::map< rational, std::vector > > timePositions; + rational fStartPosition, fEndPosition; + private: bool fHasLyrics; diff --git a/src/operations/musicxmlquery.cpp b/src/operations/musicxmlquery.cpp index afaaa39a3..e40b2db95 100644 --- a/src/operations/musicxmlquery.cpp +++ b/src/operations/musicxmlquery.cpp @@ -31,7 +31,7 @@ namespace MusicXML2 } void musicxmlQuery::init() { - beatCum = 0.0; + fCurrentVoicePosition.set(0, 1); } @@ -88,48 +88,6 @@ namespace MusicXML2 } } - - //________________________________________________________________________ - // The visit methods - //________________________________________________________________________ - void musicxmlQuery::visitEnd ( S_note& elt ) - { - notevisitor::visitEnd (elt); - - ctree::iterator next; - for (ctree::iterator i = elt->begin(); i != elt->end(); ) { - next = i; - next++; - switch (i->getType()) { - case k_step: - break; - case k_octave: - break; - case k_alter: - - break; - case k_accidental: - break; - case k_time_modification: - case k_stem: - case k_notehead: - case k_staff: - case k_beam: - case k_notations: - case k_lyric: - - break; - } - i = next; - } - } - - - void musicxmlQuery::visitEnd ( S_rehearsal& elt ) - { - //cout<< " Rehearsal Mark \""<< elt->getValue() <<"\" at beat-pos "<, // for rehearsal marks public visitor, public visitor, public partlistvisitor, @@ -83,14 +81,8 @@ namespace MusicXML2 protected: - float beatCum; - - // virtual void visitStart ( S_note& elt ); - // virtual void visitStart ( S_rehearsal& elt ); - - virtual void visitEnd ( S_note& elt ); - virtual void visitEnd ( S_rehearsal& elt ); - + rational fCurrentVoicePosition; + virtual void visitStart ( S_part& elt); virtual void visitStart ( S_staves& elt); From febc58ccd50733933f404d98d8d1a5e683f3fb0b Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 15 Jun 2020 16:53:41 +0200 Subject: [PATCH 067/164] xml2guido: Brought essential score queries into xml2guido visitor --- src/guido/xml2guidovisitor.cpp | 85 ++++++++++++++++++++++++++++++++ src/guido/xml2guidovisitor.h | 45 ++++++++++++++++- src/operations/musicxmlquery.cpp | 2 +- src/operations/musicxmlquery.h | 5 +- 4 files changed, 130 insertions(+), 7 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 091f0e03a..00d9f5005 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -201,6 +201,9 @@ namespace MusicXML2 //______________________________________________________________________________ void xml2guidovisitor::visitStart ( S_part& elt ) { + currentPart = elt->getAttributeValue("id"); + stavesInPart[currentPart] = 1; + // Filter out score-part here if (fPartNum != 0) { std::stringstream s; @@ -468,6 +471,88 @@ void xml2guidovisitor::addRelativeX(Sxmlelement elt, Sguidoelement& tag, float x tag->add (guidoparam::create(s.str(), false)); } } + +void xml2guidovisitor::visitStart ( S_staves& elt) +{ + stavesInPart[currentPart] = int(*elt); +} + +void xml2guidovisitor::visitEnd ( S_clef& elt ) +{ + std::string key; + if(clefvisitor::fSign == "G" && clefvisitor::fLine == 2 && clefvisitor::fOctaveChange == 0) { + key = "g2"; + }else if(clefvisitor::fSign == "G" && clefvisitor::fLine == 2 && clefvisitor::fOctaveChange == -1) { + key = "g-8"; + }else if(clefvisitor::fSign == "G" && clefvisitor::fLine == 2 && clefvisitor::fOctaveChange == 1) { + key = "g+8"; + }else if(clefvisitor::fSign == "F" && clefvisitor::fLine == 4 && clefvisitor::fOctaveChange == 0) { + key = "f4"; + }else if(clefvisitor::fSign == "F" && clefvisitor::fLine == 4 && clefvisitor::fOctaveChange == -1) { + key = "f-8"; + }else if(clefvisitor::fSign == "F" && clefvisitor::fLine == 4 && clefvisitor::fOctaveChange == 1) { + key = "f+8"; + }else if(clefvisitor::fSign == "C" && clefvisitor::fLine == 3 && clefvisitor::fOctaveChange == 0) { + key = "alto"; + }else if(clefvisitor::fSign == "C" && clefvisitor::fLine == 4 && clefvisitor::fOctaveChange == 0) { + key = "tenor"; + }else{ + key = "unknown"; + } + clefsInPart[currentPart].insert(key); +} + +int xml2guidovisitor::getTransposeInstrumentChromatic () { + // The chromatic element, representing the number of chromatic steps to add to the written pitch, is the one required element. The diatonic, octave-change, and double elements are optional elements. + return fChromatic + (transposevisitor::fOctaveChange * 12); +} + +std::string xml2guidovisitor::getTransposeInstrumentName() { + switch (fChromatic) { + case -2: + return "Bb"; + break; + + case -3: + return "A"; + break; + + case -5: + return "G"; + break; + + case 3: + return "Eb"; + break; + + case 2: + return "D"; + break; + + default: + return "C"; + break; + } +} + +int xml2guidovisitor::getStavesForFirstPart() { + return stavesInPart.begin()->second; +} + +std::vector xml2guidovisitor::getAllClefsOfFirstPart() { + std::set clefsSet = clefsInPart.begin()->second; + std::vector clefsVector(clefsSet.begin(), clefsSet.end()); + return clefsVector; +} + + +int xml2guidovisitor::getTotalStaves() { + int totalStaves = 0; + for (auto&& e : stavesInPart) { + totalStaves += e.second; + } + return totalStaves; +} } diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index a58721a4e..eb259b174 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -17,6 +17,7 @@ #include #include #include +#include #include "exports.h" #include "guido.h" @@ -27,7 +28,8 @@ #include "partlistvisitor.h" - +#include "transposevisitor.h" +#include "clefvisitor.h" namespace MusicXML2 { @@ -49,12 +51,16 @@ typedef struct { //______________________________________________________________________________ class EXP xml2guidovisitor : public partlistvisitor, +public transposevisitor, public visitor, public visitor, public visitor, public visitor, -public visitor +public visitor, +public visitor, +public clefvisitor { +private: // the guido elements stack std::stack fStack; bool fGenerateComments, fGenerateStem, fGenerateBars, fGeneratePositions; @@ -85,6 +91,8 @@ public visitor //virtual void visitStart( S_score_part& elt); virtual void visitStart( S_defaults& elt); virtual void visitStart( S_part& elt); + virtual void visitStart ( S_staves& elt); + virtual void visitEnd ( S_clef& elt ); Sguidoelement& current () { return fStack.top(); } @@ -112,6 +120,9 @@ public visitor /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) std::map< int, std::map< rational, std::vector > > timePositions; + std::map stavesInPart; + std::map > clefsInPart; + std::string currentPart; public: xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar=true, int partNum = 0, int beginMeasure = 0, int endMeasure = 0, int endMeasureOffset = 0); @@ -126,6 +137,8 @@ public visitor /// Shared default derived from MusicXML static int defaultGuidoStaffDistance; // the above converted to Guido value + /// MARK: Position Helpers + static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset); static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float xoffset); static void addPosY ( Sxmlelement elt, Sguidoelement& tag, float yoffset, float ymultiplier); @@ -137,6 +150,34 @@ public visitor static void addDirection( Sxmlelement elt, Sguidoelement& tag); + /// MARK: Query methods + + /*! Provides Instrument Transposer of the score in Chromatic Scale + + The transpose element represents what must be added to the written pitch to get the correct sounding pitch. + + See (MusicXML Attribute Description)[http://www.musicxml.com/tutorial/the-midi-compatible-part/attributes/] + + \return steps as Int in chromatic steps count + */ + int getTransposeInstrumentChromatic () ; + std::string getTransposeInstrumentName (); + + /*! + Return the number of staves for the first part + */ + int getStavesForFirstPart(); + + /*! + Return the number of staves for the first part + */ + std::vector getAllClefsOfFirstPart(); + + /*! + Return the total number of staves + */ + int getTotalStaves(); + std::pair getStartPosition() { return std::pair(fBeginPosition.getNumerator(), fBeginPosition.getDenominator()); } diff --git a/src/operations/musicxmlquery.cpp b/src/operations/musicxmlquery.cpp index e40b2db95..862fdf2c9 100644 --- a/src/operations/musicxmlquery.cpp +++ b/src/operations/musicxmlquery.cpp @@ -31,7 +31,7 @@ namespace MusicXML2 } void musicxmlQuery::init() { - fCurrentVoicePosition.set(0, 1); + } diff --git a/src/operations/musicxmlquery.h b/src/operations/musicxmlquery.h index 621923c15..dd696f562 100644 --- a/src/operations/musicxmlquery.h +++ b/src/operations/musicxmlquery.h @@ -16,7 +16,6 @@ #include "exports.h" #include "typedefs.h" -#include "notevisitor.h" #include "transposevisitor.h" #include "partlistvisitor.h" #include "partsummary.h" @@ -80,9 +79,7 @@ namespace MusicXML2 int getTotalStaves(); protected: - - rational fCurrentVoicePosition; - + virtual void visitStart ( S_part& elt); virtual void visitStart ( S_staves& elt); From 3b093a91ab68e7078c8b9728b0bc883d03d98b18 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 19 Jun 2020 17:02:37 +0200 Subject: [PATCH 068/164] xml2guido: Adds and fixed query methods --- src/guido/xml2guidovisitor.cpp | 37 ++++++++++++++++++++-------------- src/guido/xml2guidovisitor.h | 18 ++++++++++++++--- src/guido/xmlpart2guido.cpp | 11 +++++++++- src/guido/xmlpart2guido.h | 9 ++++++++- 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 00d9f5005..4ca243457 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -30,7 +30,6 @@ using namespace std; namespace MusicXML2 { - int xml2guidovisitor::defaultGuidoStaffDistance = 0; int xml2guidovisitor::defaultStaffDistance = 0; //______________________________________________________________________________ @@ -38,7 +37,8 @@ namespace MusicXML2 fGenerateComments(generateComments), fGenerateStem(generateStem), fGenerateBars(generateBar), fGeneratePositions(true), fCurrentStaffIndex(0), previousStaffHasLyrics(false), fCurrentAccoladeIndex(0), fPartNum(partNum), - fBeginMeasure(beginMeasure), fEndMeasure(endMeasure), fEndMeasureOffset(endMeasureOffset) + fBeginMeasure(beginMeasure), fEndMeasure(endMeasure), fEndMeasureOffset(endMeasureOffset), fTotalMeasures(0) + , fTotalDuration(0.0) { timePositions.clear(); } @@ -177,19 +177,6 @@ namespace MusicXML2 void xml2guidovisitor::visitStart( S_defaults& elt) { xml2guidovisitor::defaultStaffDistance = elt->getIntValue(k_staff_distance, 0); - - // Convert to HS - /// Guido's default staff-distance seems to be 8 or 80 tenths - if (defaultStaffDistance > 0) { - float xmlDistance = xml2guidovisitor::defaultStaffDistance; - float HalfSpaceDistance = (xmlDistance / 10) * 2 ; // (pos/10)*2 - if (HalfSpaceDistance > 0.0) { - xml2guidovisitor::defaultGuidoStaffDistance = HalfSpaceDistance; - }else - xml2guidovisitor::defaultGuidoStaffDistance = 0; - }else { - xml2guidovisitor::defaultGuidoStaffDistance = 0; - } } //______________________________________________________________________________ @@ -323,6 +310,15 @@ namespace MusicXML2 timePositions = pv.timePositions; fBeginPosition = pv.fStartPosition; fEndPosition = pv.fEndPosition; + + if (pv.lastMeasureNumber() > fTotalMeasures) { + fTotalMeasures = pv.lastMeasureNumber(); + } + measurePositionMap = pv.measurePositionMap; + + if (pv.totalPartDuration() > fTotalDuration) { + fTotalDuration = pv.totalPartDuration(); + } } } @@ -553,6 +549,17 @@ int xml2guidovisitor::getTotalStaves() { } return totalStaves; } + +int xml2guidovisitor::getTotalMeasures() { + return fTotalMeasures; +} + +std::map xml2guidovisitor::getMeasureMap() { + return measurePositionMap; +} +double xml2guidovisitor::getTotalDuration() { + return fTotalDuration; +} } diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index eb259b174..70e395979 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -124,6 +124,14 @@ public clefvisitor std::map > clefsInPart; std::string currentPart; + /// Number of total measures in score + int fTotalMeasures; + + /// Map containing measure number and Position (double output of Rational) + std::map measurePositionMap; + + double fTotalDuration; + public: xml2guidovisitor(bool generateComments, bool generateStem, bool generateBar=true, int partNum = 0, int beginMeasure = 0, int endMeasure = 0, int endMeasureOffset = 0); virtual ~xml2guidovisitor() {} @@ -134,9 +142,6 @@ public clefvisitor // ie converts relative-x/-y into dx/dy attributes void generatePositions (bool state) { fGeneratePositions = state; } - /// Shared default derived from MusicXML - static int defaultGuidoStaffDistance; // the above converted to Guido value - /// MARK: Position Helpers static void addPosition ( Sxmlelement elt, Sguidoelement& tag, float yoffset); @@ -186,6 +191,13 @@ public clefvisitor return std::pair(fEndPosition.getNumerator(), fEndPosition.getDenominator()); } + int getTotalMeasures(); + + /// Returns a map where the first are beat positions and second are measure numbers + std::map getMeasureMap(); + + double getTotalDuration(); + }; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 94ce0ae10..3ad638ef5 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -71,6 +71,7 @@ namespace MusicXML2 fTremoloInProgress = false; fShouldStopOctava = false; fCurrentScorePosition.set(0, 1); + measurePositionMap.clear(); } //______________________________________________________________________________ @@ -265,6 +266,12 @@ bool xmlpart2guido::checkMeasureRange() { } fCurrentPart = elt; } + + void xmlpart2guido::visitEnd ( S_part& elt ) + { + fCurrentScorePosition += fCurrentMeasureLength; + fCurrentScorePosition.rationalise(); + } //______________________________________________________________________________ @@ -273,7 +280,7 @@ bool xmlpart2guido::checkMeasureRange() { fCurrentMeasure = elt; fCurrentScorePosition += fCurrentMeasureLength; fCurrentScorePosition.rationalise(); - + std::string measNum = elt->getAttributeValue("number"); try { fMeasNum = std::stoi(measNum); @@ -281,6 +288,8 @@ bool xmlpart2guido::checkMeasureRange() { fMeasNum++; } + measurePositionMap[fCurrentScorePosition.toDouble()] = fMeasNum ; + bool isFirstPartialMeasure = (fStartMeasure>0) && (fMeasNum == fStartMeasure); if ( isFirstPartialMeasure ) { diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 3585d8739..852db0304 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -217,7 +217,8 @@ public visitor // to get clef, division, staves, time and virtual void visitEnd ( S_repeat& elt); virtual void visitEnd ( S_sound& elt); virtual void visitEnd ( S_time& elt); - + virtual void visitEnd ( S_part& elt); + std::string parseMetronome ( metronomevisitor &mv ); bool findNextNote(ctree::iterator& elt, ctree::iterator &nextnote); @@ -248,6 +249,12 @@ public visitor // to get clef, division, staves, time and rational fStartPosition, fEndPosition; + int lastMeasureNumber() { return fMeasNum; } + + std::map measurePositionMap; + + double totalPartDuration() { return fCurrentScorePosition.toDouble(); } + private: bool fHasLyrics; From 8d971dbdca6d640ac2a6c3cf4d066a2f237d7928 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 23 Jun 2020 18:46:48 +0200 Subject: [PATCH 069/164] Fixed Antescofo CMAKE for LIBSTD Consistency (iOS 12 crash) --- build/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 8be089485..8ac28ae98 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -59,12 +59,14 @@ endif() # mac os specific part ######################################### if(APPLE) + set (CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") + set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "gnu++14") if ( IOS ) message (STATUS "Generates project for iOS - Use -DIOS=no to change.") set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "iPhoneOS") set (CMAKE_OSX_ARCHITECTURES "arm64") # unsupported on iOS 11.4.0: armv7 armv7s set (CMAKE_OSX_SYSROOT "iphoneos") - set (CMAKE_CXX_FLAGS "-miphoneos-version-min=11.2") + set (CMAKE_OSX_DEPLOYMENT_TARGET "12.3") set (libtype STATIC) set (FMWK "false") elseif( UNIVERSAL ) From 5d0e9f31195200abc2842d2fd12b471a7449a814 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 29 Jul 2020 19:42:02 +0200 Subject: [PATCH 070/164] xml2guido: Adds fPartsAvailable with getter --- src/guido/xml2guidovisitor.cpp | 6 ++++++ src/guido/xml2guidovisitor.h | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 4ca243457..122278df2 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -41,6 +41,7 @@ namespace MusicXML2 , fTotalDuration(0.0) { timePositions.clear(); + fPartsAvailable = 0; } //______________________________________________________________________________ @@ -190,6 +191,7 @@ namespace MusicXML2 { currentPart = elt->getAttributeValue("id"); stavesInPart[currentPart] = 1; + fPartsAvailable++; // Filter out score-part here if (fPartNum != 0) { @@ -561,5 +563,9 @@ std::map xml2guidovisitor::getMeasureMap() { double xml2guidovisitor::getTotalDuration() { return fTotalDuration; } + +int xml2guidovisitor::getPartsAvailable() { + return fPartsAvailable; +} } diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 70e395979..938906da0 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -101,6 +101,7 @@ public clefvisitor int fCurrentAccoladeIndex; int fPartNum; // 0 (default) to parse all score-parts. 1 for "P1" only, etc. + int fPartsAvailable; // number of parts available in this XML int fBeginMeasure; // Number of measure to begin parsing, used for partial conversion. (default = 0) int fEndMeasure; // Measure Number where parsing ends, used for partial conversion. (default = 0 meaning go to the end) @@ -198,6 +199,9 @@ public clefvisitor double getTotalDuration(); + /// Returne the number of parts in this XML Score + int getPartsAvailable(); + }; From 746cde3f53d2e582aab8b3bb413fffcad2d167c6 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 10 Aug 2020 13:53:16 +0200 Subject: [PATCH 071/164] xml2guido: Fixed bug where hidden bars where being generated on position zero --- src/guido/xmlpart2guido.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 3ad638ef5..e8e5ec7be 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -338,7 +338,7 @@ bool xmlpart2guido::checkMeasureRange() { if (!isFirstPartialMeasure) add (tag); } - }else { + }else if (fCurrentScorePosition.toFloat() != 0.0) { // Create a HIDDEN Bar in case of fPendingBar equal to false. // This is the case for "bar-style" equal to "none" or "implicit" measures Sguidoelement tag = guidotag::create("bar"); From 7b9fb8e3e0cc26bcd3faa087f7d834b5c2ce16b0 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 14 Aug 2020 12:18:50 +0200 Subject: [PATCH 072/164] xml2guido: Fix assignment of clefs to staves for cross-staffed RestFormat positioning --- .../GUID-172-CrossStaffRestFormat.xml | 471 ++++++++++++++++++ src/guido/xml2guidovisitor.cpp | 3 - src/guido/xml2guidovisitor.h | 4 - src/guido/xmlpart2guido.cpp | 23 +- 4 files changed, 485 insertions(+), 16 deletions(-) create mode 100644 files/xml2guido/GUID-172-CrossStaffRestFormat.xml diff --git a/files/xml2guido/GUID-172-CrossStaffRestFormat.xml b/files/xml2guido/GUID-172-CrossStaffRestFormat.xml new file mode 100644 index 000000000..4dcfa2854 --- /dev/null +++ b/files/xml2guido/GUID-172-CrossStaffRestFormat.xml @@ -0,0 +1,471 @@ + + + + Gnossiennes + + Erik Satie + www.antescofo.com + + Finale v25 for Mac + 2020-08-14 + + + + + + + + + + 6.35 + 40 + + + 1871 + 1323 + + 94 + 94 + 94 + 94 + + + + + 0 + 0 + + 145 + 94 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Gnossiennes + + + composer + Erik Satie + + + subtitle + 1. Lent + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 94 + 0 + + 229 + + + 92 + + system + + + 2 + + -4 + major + + + 2 + + G + 2 + + + F + 4 + + + + + Lent + + 1 + + + + + +

      + + + 1 + + + + + 2 + 1 + quarter + 1 + + + + C + 5 + + 1 + 1 + eighth + up + 1 + begin + + + + + + + E + -1 + 5 + + 1 + 1 + eighth + up + 1 + end + + + + D + 5 + + 2 + 1 + quarter + natural + up + 1 + + + + C + 5 + + 2 + 1 + quarter + up + 1 + + + 8 + + + + D + 4 + + 2 + 2 + quarter + 2 + + + + A + -1 + 3 + + 4 + 2 + half + down + 2 + + + + + C + 4 + + 4 + 2 + half + down + 1 + + + + + F + 4 + + 4 + 2 + half + down + 1 + + + + A + -1 + 3 + + 2 + 2 + quarter + down + 2 + + + + + C + 4 + + 2 + 2 + quarter + down + 1 + + + + + F + 4 + + 2 + 2 + quarter + down + 1 + + + 8 + + + + F + 2 + + 8 + 3 + whole + 2 + + + + + + + + C + 5 + + 1 + eighth + up + 1 + + + + + + + B + 4 + + 4 + 1 + half + natural + up + 1 + + + + + + + + C + 5 + + 1 + eighth + up + 1 + + + + + + + B + 4 + + 4 + 1 + half + natural + up + 1 + + + + + + + 8 + + + + D + 4 + + 2 + 2 + quarter + 2 + + + + A + -1 + 3 + + 4 + 2 + half + down + 2 + + + + + C + 4 + + 4 + 2 + half + down + 1 + + + + + F + 4 + + 4 + 2 + half + down + 1 + + + + A + -1 + 3 + + 2 + 2 + quarter + down + 2 + + + + + C + 4 + + 2 + 2 + quarter + down + 1 + + + + + F + 4 + + 2 + 2 + quarter + down + 1 + + + 8 + + + + F + 2 + + 8 + 3 + whole + 2 + + + light-heavy + + + + + diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 122278df2..f64d4cc94 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -212,7 +212,6 @@ namespace MusicXML2 bool notesOnly = false; rational currentTimeSign (0,1); - staffClefMap.clear(); //timePositions.clear(); // browse the parts voice by voice: allows to describe voices that spans over several staves @@ -302,13 +301,11 @@ namespace MusicXML2 pv.generatePositions (fGeneratePositions); xml_tree_browser browser(&pv); pv.initialize(seq, targetStaff, fCurrentStaffIndex, targetVoice, notesOnly, currentTimeSign); - pv.staffClefMap = staffClefMap; pv.timePositions = timePositions; browser.browse(*elt); pop(); currentTimeSign = pv.getTimeSign(); previousStaffHasLyrics = pv.hasLyrics(); - staffClefMap = pv.staffClefMap; timePositions = pv.timePositions; fBeginPosition = pv.fStartPosition; fEndPosition = pv.fEndPosition; diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 938906da0..645dbb91c 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -114,10 +114,6 @@ public clefvisitor static int defaultStaffDistance; // xml staff-distance value in defaults - /// multimap containing - //std::multimap > staffClefMap; - std::multimap > > staffClefMap; - /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) std::map< int, std::map< rational, std::vector > > timePositions; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index e8e5ec7be..c207f769a 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -50,6 +50,7 @@ namespace MusicXML2 fTupletOpen = 0; fTremoloInProgress = false; fShouldStopOctava = false; + staffClefMap.clear(); } //______________________________________________________________________________ @@ -1205,13 +1206,6 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) /// Actions: int staffnum = iter->getAttributeIntValue("number", 0); - if ((staffnum != fTargetStaff) || fNotesOnly) - { - /// Search again for other clefs: - iter++; - iter = elt->find(k_clef, iter); - continue; - } stringstream s; if ( clefsign == "G") s << "g"; @@ -1233,13 +1227,24 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) param += "+8"; else if (clefoctavechange == -1) param += "-8"; + + // staffClefMap: multimap containing + std::pair positionClef = std::pair(fCurrentVoicePosition ,param); + staffClefMap.insert(std::pair > >(staffnum, std::pair< int, std::pair< rational, std::string > >(fMeasNum, positionClef) ) ); + + if ((staffnum != fTargetStaff) || fNotesOnly) + { + /// Search again for other clefs: + iter++; + iter = elt->find(k_clef, iter); + continue; + } + Sguidoelement tag = guidotag::create("clef"); checkStaff (staffnum); tag->add (guidoparam::create(param)); add(tag); - std::pair foo = std::pair(fCurrentVoicePosition ,param); - staffClefMap.insert(std::pair > >(fCurrentStaffIndex, std::pair< int, std::pair< rational, std::string > >(fMeasNum, foo) ) ); /// Search again for other clefs: iter++; From c13b9f596089d660c6884783c541081a80120b6f Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 14 Aug 2020 13:13:01 +0200 Subject: [PATCH 073/164] xml2guido: fixed regression with unit test GUID-124-restFormat --- files/xml2guido/{GUID-162-UnitTest.xml => GUID-162-Tremolo.xml} | 0 src/guido/xmlpart2guido.cpp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename files/xml2guido/{GUID-162-UnitTest.xml => GUID-162-Tremolo.xml} (100%) diff --git a/files/xml2guido/GUID-162-UnitTest.xml b/files/xml2guido/GUID-162-Tremolo.xml similarity index 100% rename from files/xml2guido/GUID-162-UnitTest.xml rename to files/xml2guido/GUID-162-Tremolo.xml diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index c207f769a..ab6d6c964 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1205,7 +1205,7 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) int clefoctavechange = iter->getIntValue(k_clef_octave_change, 0); /// Actions: - int staffnum = iter->getAttributeIntValue("number", 0); + int staffnum = iter->getAttributeIntValue("number", 1); stringstream s; if ( clefsign == "G") s << "g"; From ad713cd587bba307f99c9cb27f150179d7c7b405 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 14 Aug 2020 16:58:06 +0200 Subject: [PATCH 074/164] xml2guido: Fix for multi-voice clef where Empty was not being generated before clef --- files/xml2guido/GUID-175-MultiVoiceClef.xml | 704 ++++++++++++++++++++ src/guido/xmlpart2guido.cpp | 11 +- 2 files changed, 709 insertions(+), 6 deletions(-) create mode 100644 files/xml2guido/GUID-175-MultiVoiceClef.xml diff --git a/files/xml2guido/GUID-175-MultiVoiceClef.xml b/files/xml2guido/GUID-175-MultiVoiceClef.xml new file mode 100644 index 000000000..952b6974c --- /dev/null +++ b/files/xml2guido/GUID-175-MultiVoiceClef.xml @@ -0,0 +1,704 @@ + + + + Suite bergamasque + + Claude Debussy + www.antescofo.com + + Finale v25 for Mac + 2020-08-14 + + + + + + + + + + 6.35 + 40 + + + 1871 + 1323 + + 94 + 94 + 94 + 94 + + + + + 0 + 0 + + 142 + 63 + + + 112 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Suite bergamasque + + + composer + Claude Debussy + + + subtitle + 3. Clair de lune + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 64 + 0 + + 283 + + + 90 + + system + + + 2 + + -5 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + 3 + 1 + quarter + + 1 + + + + F + 5 + + 3 + 1 + quarter + + down + 1 + + + 4 + 5 + + + + + + + A + -1 + 5 + + 3 + 1 + quarter + + down + 1 + + + + D + -1 + 5 + + 3 + + 1 + quarter + + down + 1 + + + + + + + + F + 5 + + 3 + + 1 + quarter + + down + 1 + + + + + + 9 + + + + D + -1 + 2 + + 1 + 4 + eighth + up + 2 + begin + + + + + + + + A + -1 + 2 + + 1 + 4 + eighth + up + 2 + + + + F + 3 + + 1 + 4 + eighth + down + 1 + continue + + + + + A + -1 + 3 + + 1 + 4 + eighth + down + 1 + + + + G + 2 + + + + + F + 4 + + 1 + + 4 + eighth + up + 2 + end + + + + + + + + A + -1 + 4 + + 1 + + 4 + eighth + up + 2 + + + + + + + F + 4 + + 6 + + 4 + half + + up + 2 + + + + + + + + + A + -1 + 4 + + 6 + + 4 + half + + up + 2 + + + + + + + + + + F + 4 + + + + + D + -1 + 5 + + 1 + + 1 + eighth + up + 1 + begin + + + + + + + + + F + 5 + + 1 + + 1 + eighth + up + 1 + + + + + + + E + -1 + 5 + + 1 + 1 + eighth + up + 1 + continue + + + + F + 5 + + 1 + 1 + eighth + up + 1 + end + + + 5 + + + + + + E + -1 + 5 + + 6 + 1 + half + + up + 1 + + + + 4 + + + + + 9 + + + + E + 4 + + 1 + 2 + eighth + 1 + + + + G + -1 + 4 + + 2 + + 2 + quarter + down + 1 + + + + + + + + B + -1 + 4 + + 2 + + 2 + quarter + down + 1 + + + + + + + G + -1 + 4 + + 6 + + 2 + half + + down + 1 + + + + + + + + B + -1 + 4 + + 6 + + 2 + half + + down + 1 + + + + + + 9 + + + + B + 3 + + 1 + 3 + eighth + 2 + + + + D + -1 + 3 + + 2 + + 3 + quarter + up + 2 + + + + + + + + G + -1 + 3 + + 2 + + 3 + quarter + up + 2 + + + + + + + + B + -1 + 3 + + 2 + + 3 + quarter + up + 2 + + + + + + + + D + -1 + 4 + + 2 + + 3 + quarter + up + 2 + + + + + + + D + -1 + 3 + + 6 + + 3 + half + + up + 2 + + + + + + + + G + -1 + 3 + + 6 + + 3 + half + + up + 2 + + + + + + + + B + -1 + 3 + + 6 + + 3 + half + + up + 2 + + + + + + + + D + -1 + 4 + + 6 + + 3 + half + + up + 2 + + + + + + 9 + + + + G + -1 + 2 + + 6 + 4 + half + + down + 2 + + + + + D + -1 + 3 + + 6 + 4 + half + + down + 2 + + + 3 + 4 + 2 + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index ab6d6c964..92fab0189 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -200,6 +200,7 @@ bool xmlpart2guido::checkMeasureRange() { fCurrentVoicePosition += r; fCurrentVoicePosition.rationalise(); } + //cerr<<"moveMeasureTime v:"<";fCurrentMeasurePosition.print(cerr);cerr<<" ("<< moveVoiceToo<<") fCurrentVoicePosition->";fCurrentVoicePosition.print(cerr);cerr<find(k_clef, iter); continue; } - + // Make sure we are at the right position before adding clef + checkVoiceTime (fCurrentMeasurePosition, fCurrentVoicePosition); + Sguidoelement tag = guidotag::create("clef"); checkStaff (staffnum); tag->add (guidoparam::create(param)); From 8c5c749ced4c15634fe5d970d4272e4ffd7162a8 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Sun, 16 Aug 2020 12:20:41 +0200 Subject: [PATCH 075/164] xml2guido: Conform to MusicXML counting of staff (starting from 1) and make better use of kUndefinedStaff! --- src/visitors/notevisitor.h | 2 +- src/visitors/partsummary.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/visitors/notevisitor.h b/src/visitors/notevisitor.h index b63ddf99e..ea534890a 100644 --- a/src/visitors/notevisitor.h +++ b/src/visitors/notevisitor.h @@ -125,7 +125,7 @@ class EXP notevisitor : type getType() const { return fType; } int getTie() const { return fTie; } - int getStaff() const { return fStaff; } + int getStaff() const { return (fStaff == kUndefinedStaff ? 1: fStaff); } int getVoice() const { return fVoice; } S_note getSnote() const { return fThisSNote; } float getNoteHeadDy(string fCurClef) const; diff --git a/src/visitors/partsummary.cpp b/src/visitors/partsummary.cpp index 533ee0adb..1135f7458 100644 --- a/src/visitors/partsummary.cpp +++ b/src/visitors/partsummary.cpp @@ -138,6 +138,9 @@ int partsummary::getStaffNotes (int id) const //________________________________________________________________________ int partsummary::getMainStaff (int voiceid) const { + if (fStavesCount == 1) { + return 1; + } smartlist::ptr v = getStaves (voiceid); int staffid = 0; int maxnotes = 0; From eeaf2f0e72835acec9d50532fbef0150c66224f4 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 20 Aug 2020 12:36:22 +0200 Subject: [PATCH 076/164] xml2guido: Fixed positionings for multi-part scores --- src/guido/xmlpart2guido.cpp | 25 ++++++++++++++++++++----- src/guido/xmlpart2guido.h | 1 + 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 92fab0189..234599a8c 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -302,7 +302,7 @@ bool xmlpart2guido::checkMeasureRange() { } // Add last clef - std::string lastClef = getClef(fCurrentStaffIndex , fCurrentVoicePosition, fMeasNum); + std::string lastClef = getClef(fTargetStaff , fCurrentVoicePosition, fMeasNum); if (!lastClef.empty()) { Sguidoelement tag = guidotag::create("clef"); tag->add (guidoparam::create(lastClef)); @@ -1228,6 +1228,7 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) // staffClefMap: multimap containing std::pair positionClef = std::pair(fCurrentVoicePosition ,param); staffClefMap.insert(std::pair > >(staffnum, std::pair< int, std::pair< rational, std::string > >(fMeasNum, positionClef) ) ); + //cerr<<"\t\t<<< staffClefMap adding "<0) { auto staffRange = staffClefMap.equal_range(staffIndex); @@ -3020,7 +3029,10 @@ bool xmlpart2guido::findNextNote(ctree::iterator& elt, ctree // to get clef, division, staves, time and const rational& getTimeSign () const { return fCurrentTimeSign; } bool hasLyrics() const {return fHasLyrics;} + /// Map for staffNum, measureNum, voice-Position and Clef std::multimap > > staffClefMap; /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) std::map< int, std::map< rational, std::vector > > timePositions; From 690e4560ffd943dc044ef468bb0d2602ff7b691c Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 20 Aug 2020 16:09:22 +0200 Subject: [PATCH 077/164] xml2guido: Fix xml default staff value during retrieval --- src/guido/xmlpart2guido.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 234599a8c..372ea49d3 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -237,7 +237,7 @@ bool xmlpart2guido::checkMeasureRange() { void xmlpart2guido::visitStart ( S_forward& elt ) { bool scanElement = (elt->getIntValue(k_voice, 0) == fTargetVoice) - && (elt->getIntValue(k_staff, 0) == fTargetStaff); + && (elt->getIntValue(k_staff, 1) == fTargetStaff); int duration = elt->getIntValue(k_duration, 0); moveMeasureTime(duration, scanElement); if (!scanElement) return; @@ -434,7 +434,7 @@ bool xmlpart2guido::checkMeasureRange() { void xmlpart2guido::visitStart ( S_direction& elt ) { // Parse Staff and Offset first - if (fNotesOnly || (elt->getIntValue(k_staff, 0) != fTargetStaff)) { + if (fNotesOnly || (elt->getIntValue(k_staff, 1) != fTargetStaff)) { fSkipDirection = true; } else { From 1c997e2534cc74b2e68901c91208ec2138539188 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 26 Aug 2020 17:12:18 +0200 Subject: [PATCH 078/164] xml2guido: Optimized Slur End Search on same voice (faster!) --- src/guido/xmlpart2guido.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 372ea49d3..ca0c3e4a4 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -64,7 +64,6 @@ namespace MusicXML2 fCurrentDivision = 1; fCurrentOffset = 0; fPendingPops = 0; - fMeasNum = 0; fLyricsManualSpacing = false; fTextTagOpen = 0; fIgnoreWedgeWithOffset = false; @@ -1506,12 +1505,26 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { //cerr<< "\tSearching Slur Closing for line:"<getInputLineNumber() <<" with number "<::iterator nextnote = find(fCurrentPart->begin(), fCurrentPart->end(), elt); if (nextnote != fCurrentPart->end()) { - nextnote++; // advance one step + nextnote.forward_up(); // advance one step } - // The first occurence of a slur STOP with the same NUMBER attribute should be considered as the target. Do not go beyond. + // Stop Conditions: (1) The first occurence of a slur STOP with the same NUMBER attribute should be considered as the target. + // (2) If the measureNumber goes beyond current measure + 10 (this will greatly enhance speed!!). We can assume that slurs do not go beyond 10 measures in regular scores! + // Do not go beyond. + + int seachMeasureNum = fMeasNum; - while (nextnote != fCurrentPart->end()) { + while ((nextnote != fCurrentPart->end()) && (seachMeasureNum <= fMeasNum + 10)) { + // Check measure + if (nextnote->getType() == k_measure) { + std::string measNum = nextnote->getAttributeValue("number"); + try { + seachMeasureNum = std::stoi(measNum); + } catch(...) { + seachMeasureNum++; + } + } + // looking for the next note on the target voice if ((nextnote->getType() == k_note)) { int thisNoteVoice = nextnote->getIntValue(k_voice,0); @@ -1534,7 +1547,7 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { (iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber) ) { if (thisNoteVoice == fTargetVoice) { - //cerr<< "\t\t FOUND Slur stop line:"<< iterSlur->getInputLineNumber()<< " voice:"<getAttributeIntValue("number", 0)<getInputLineNumber()<< " voice:"<getAttributeIntValue("number", 0)< Date: Mon, 5 Oct 2020 16:01:24 +0200 Subject: [PATCH 079/164] WIP: Preparing CMake for static framwork on OSX --- build/CMakeLists.txt | 65 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 8ac28ae98..607a0bdd0 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -64,11 +64,12 @@ if(APPLE) if ( IOS ) message (STATUS "Generates project for iOS - Use -DIOS=no to change.") set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "iPhoneOS") - set (CMAKE_OSX_ARCHITECTURES "arm64") # unsupported on iOS 11.4.0: armv7 armv7s + set (CMAKE_OSX_ARCHITECTURES "arm64 x86_64") # unsupported on iOS 11.4.0: armv7 armv7s set (CMAKE_OSX_SYSROOT "iphoneos") - set (CMAKE_OSX_DEPLOYMENT_TARGET "12.3") - set (libtype STATIC) - set (FMWK "false") + set(IOS_DEPLOYMENT_TARGET 13.0) + #set (libtype STATIC) + set (FMWK "true") + set (CMAKE_MACOSX_RPATH 1) elseif( UNIVERSAL ) message (STATUS "Generates universal binaries - Use -DUNIVERSAL=no to change. .") set (CMAKE_OSX_ARCHITECTURES "x86_64") @@ -114,6 +115,11 @@ endif() file (GLOB CORESRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC}) file (GLOB COREH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${HEADERS}) +#"${SRCDIR}/elements/*H" "${SRCDIR}/visitors/visitable.h" "${SRCDIR}/visitors/basevisitor.h" "${SRCDIR}/files/*H" "${SRCDIR}/parser/reader.h" "${SRCDIR}/lib/*H" "${SRCDIR}/guido/xml2guidovisitor.h" +#file (GLOB PRIVATEH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SRCDIR}/*H") +#file (GLOB PRIVATEH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SRCDIR}/elements/*H" "${SRCDIR}/visitors/visitable.h" "${SRCDIR}/visitors/basevisitor.h" "${SRCDIR}/files/*H" "${SRCDIR}/parser/reader.h" "${SRCDIR}/lib/*H" "${SRCDIR}/guido/xml2guidovisitor.h") + + foreach(folder ${SRCFOLDERS}) set(INCL ${INCL} "${SRCDIR}/${folder}") # add include folders endforeach(folder) @@ -133,12 +139,12 @@ else() set(LIBCONTENT ${CORESRC} ${COREH}) endif() -set(target musicxml2) +set(target libmusicxml) set(staticlib musicxml2static) if (NOT IOS) -add_library(${target} SHARED ${LIBCONTENT}) -set_target_properties (${target} PROPERTIES + add_library(${target} SHARED ${LIBCONTENT}) + set_target_properties (${target} PROPERTIES VERSION ${VERSION} SOVERSION ${SOVERS} ARCHIVE_OUTPUT_DIRECTORY ${LIBDIR} @@ -146,12 +152,41 @@ set_target_properties (${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${LIBDIR} LIBRARY_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} PUBLIC_HEADER "${COREH}" + PRIVATE_HEADER "${PRIVATEH}" DEFINE_SYMBOL LIBMUSICXML_EXPORTS XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" ) +elseif(IOS) + add_library(${target} SHARED ${LIBCONTENT}) + set_target_properties (${target} PROPERTIES + VERSION ${VERSION} + SOVERSION ${SOVERS} + FRAMEWORK ${FMWK} + FRAMEWORK_VERSION C + OUTPUT_NAME libmusicxml + RUNTIME_OUTPUT_DIRECTORY ${LIBDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} + ARCHIVE_OUTPUT_DIRECTORY ${LIBDIR} + ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} + LIBRARY_OUTPUT_DIRECTORY ${LIBDIR} + LIBRARY_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} + XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${IOS_DEPLOYMENT_TARGET} + PUBLIC_HEADER "${COREH}" + PRIVATE_HEADER "${PRIVATEH}" + MACOSX_FRAMEWORK_IDENTIFIER "com.grame.libmusicxml" + MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${STRVERS} + MACOSX_FRAMEWORK_BUNDLE_VERSION ${VERSION} + INSTALL_NAME_DIR "$(LOCAL_LIBRARY_DIR)/Frameworks" + BUILD_WITH_INSTALL_NAME_DIR YES + #XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks" + XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH YES + DEFINE_SYMBOL LIBMUSICXML_EXPORTS + XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" + XCODE_ATTRIBUTE_DEFINES_MODULE YES + ) endif() -if (NOT WIN32) +if (NOT WIN32) #AND NOT IOS add_library(${staticlib} STATIC ${LIBCONTENT}) set_target_properties (${staticlib} PROPERTIES VERSION ${VERSION} @@ -171,7 +206,9 @@ if (FMWK AND APPLE AND NOT IOS) set_target_properties (${target} PROPERTIES OUTPUT_NAME libmusicxml2 FRAMEWORK ${FMWK} - FRAMEWORK_VERSION ${VERSION} + FRAMEWORK_VERSION C + MACOSX_FRAMEWORK_IDENTIFIER "com.grame.libmusicxml" + XCODE_ATTRIBUTE_DEFINES_MODULE YES MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${STRVERS} MACOSX_FRAMEWORK_BUNDLE_VERSION ${SSTRVERS} MACOSX_FRAMEWORK_IDENTIFIER ${target} @@ -229,6 +266,16 @@ else () set (BINDEST bin) endif () +if (IOS) + install ( TARGETS ${INSTALLED} + RUNTIME DESTINATION ${BINDEST} + LIBRARY DESTINATION ${LIBDEST} + ARCHIVE DESTINATION ${LIBDEST} + FRAMEWORK DESTINATION lib CONFIGURATIONS Release + PUBLIC_HEADER DESTINATION include/libmusicxml +# PRIVATE_HEADER DESTINATION PrivateHeaders + ) +endif() if (NOT IOS) message (STATUS "Install location is ${CMAKE_INSTALL_PREFIX}") From f1ec36c73dd46577246454bd307ce92bf57e349b Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 5 Oct 2020 16:17:11 +0200 Subject: [PATCH 080/164] xml2guido: Do not infer font-family from xml as they are platform specific --- src/guido/xmlpart2guido.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index ca0c3e4a4..ba30a3c67 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -596,12 +596,14 @@ bool xmlpart2guido::checkMeasureRange() { std::stringstream wordParameters; std::stringstream parameters; - string font_family = element->getAttributeValue("font-family"); +// string font_family = element->getAttributeValue("font-family"); +// if (font_family.size()) +// parameters << ",font=\""+font_family+"\""; + string font_size = element->getAttributeValue("font-size"); string font_weight = element->getAttributeValue("font-weight"); string font_style = element->getAttributeValue("font-style"); - if (font_family.size()) - parameters << ",font=\""+font_family+"\""; + if (font_size.size()) parameters << ",fsize="+font_size+"pt"; From ddfa0a9acb285d50fdc103e340ef099f1058b18f Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 5 Oct 2020 18:22:37 +0200 Subject: [PATCH 081/164] xml2guido: Support for nested wedge with unit test --- files/xml2guido/GUID-183-NestedWedge.xml | 567 +++++++++++++++++++++++ src/guido/xmlpart2guido.cpp | 28 +- src/guido/xmlpart2guido.h | 4 +- 3 files changed, 591 insertions(+), 8 deletions(-) create mode 100644 files/xml2guido/GUID-183-NestedWedge.xml diff --git a/files/xml2guido/GUID-183-NestedWedge.xml b/files/xml2guido/GUID-183-NestedWedge.xml new file mode 100644 index 000000000..88e30d815 --- /dev/null +++ b/files/xml2guido/GUID-183-NestedWedge.xml @@ -0,0 +1,567 @@ + + + + Nocturne + + Frédéric Chopin + Jean-Yves Malmasson + www.antescofo.com + + Finale v25 for Mac + 2020-10-05 + + + + + + + + + + 6.35 + 40 + + + 1871 + 1323 + + 94 + 94 + 94 + 94 + + + + + 0 + 0 + + 149 + 98 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Nocturne + + + composer + Frédéric Chopin + + + subtitle + No.20, Op. posth. + + + + Violin + Vln. + + SmartMusic SoftSynth 1 + strings.violin + + + + 1 + 15489 + 41 + 80 + -63 + + + + + + + + + + 67 + 0 + + 182 + + system + + + 8 + + 4 + minor + + + + G + 2 + + + + + + + + + + + E + 5 + + 16 + 1 + half + down + + + + + + + + + + + + + + F + 1 + 5 + + 8 + 1 + quarter + down + + + + + + + C + 1 + 5 + + 8 + 1 + quarter + down + + + + 1 + + + + + + + + + + + + + + + C + 1 + 5 + + 1 + 16th + up + begin + begin + + + + + + + + D + 1 + 5 + + 1 + 16th + up + continue + continue + + + + + E + 5 + + 1 + 16th + up + end + end + + + + + + + + + D + 1 + 5 + + 24 + + 1 + half + + down + + + + + + + + + + + + + + -8 + + + + D + 1 + 5 + + 4 + + 1 + eighth + down + begin + + + + + + + C + 1 + 5 + + 4 + 1 + eighth + down + end + + + + + + + + + + + + + + + D + 1 + 5 + + 16 + 1 + half + down + + + + + + + + + 8 + 1 + quarter + + + + +

      + + + + + + + G + 1 + 4 + + 8 + 1 + quarter + up + + + + + 1 + + + + + + + + + 117 + + + + + G + 1 + 5 + + 16 + 1 + half + down + + + + 3 + + + + + + + E + 5 + + 1 + 16th + up + begin + begin + + + + + + + + F + 1 + 5 + + 1 + 16th + up + continue + continue + + + + + G + 1 + 5 + + 1 + 16th + up + end + end + + + + + + + + + F + 1 + 5 + + 16 + 1 + half + down + + + + + + + + + + + + E + 5 + + 1 + 16th + up + begin + begin + + + + + F + 1 + 5 + + 1 + 16th + up + continue + continue + + + + + G + 1 + 5 + + 1 + 16th + up + continue + continue + + + + + A + 5 + + 1 + 16th + up + end + end + + + + + + + + + + + + + + + + + + + + G + 1 + 5 + + 16 + 1 + half + down + + + + + + + + + + + + + + + + + C + 1 + 5 + + 8 + 1 + quarter + down + + + + 1 + + + + + + C + 1 + 5 + + 8 + 1 + quarter + down + + + + + + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index ba30a3c67..5da962991 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -59,7 +59,8 @@ namespace MusicXML2 guidonotestatus::resetall(); fMeasNum = 0; fInCue = fInGrace = fInhibitNextBar = fPendingBar = fDoubleBar - = fBeamOpened = fBeamGrouping = fCrescPending = fSkipDirection = fWavyTrillOpened = fSingleScopeTrill = fNonStandardNoteHead = false; + = fBeamOpened = fBeamGrouping = fSkipDirection = fWavyTrillOpened = fSingleScopeTrill = fNonStandardNoteHead = false; + fCrescPending = fDiminPending = 0; fCurrentStemDirection = kStemUndefined; fCurrentDivision = 1; fCurrentOffset = 0; @@ -476,6 +477,11 @@ bool xmlpart2guido::checkMeasureRange() { stringstream s; s << "dx=" << markDx ; tag->add (guidoparam::create(s.str(), false)); + }else { + // Add a default -6 as rehearsal marks usually occur in the beginning of measure! + stringstream s; + s << "dx=" << -6.0 ; + tag->add (guidoparam::create(s.str(), false)); } xml2guidovisitor::addPosY(elt, tag, -4, 1); @@ -847,22 +853,30 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) if (fSkipDirection) return; string type = elt->getAttributeValue("type"); + int number = elt->getAttributeIntValue("number", 1); Sguidoelement tag; if (type == "crescendo") { tag = guidotag::create("crescBegin"); - fCrescPending = true; + fCrescPending = number; } else if (type == "diminuendo") { tag = guidotag::create("dimBegin"); - fCrescPending = false; + fDiminPending = number; } else if (type == "stop") { if (fIgnoreWedgeWithOffset) { fIgnoreWedgeWithOffset = false; return; // FIXME: Ignore Offset Wedge à la Verovio } - - tag = guidotag::create(fCrescPending ? "crescEnd" : "dimEnd"); + + if (fCrescPending == number) { + tag = guidotag::create("crescEnd"); + fCrescPending = 0; + }else + if (fDiminPending == number) { + tag = guidotag::create("dimEnd"); + fDiminPending = 0; + } } if (tag) { @@ -3007,8 +3021,8 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur auto timePos4measure = timePositions.find(fMeasNum); float xpos = default_x + relative_x; - - if ((xpos!=0)&&(timePos4measure != timePositions.end())) { + + if ((xpos!=0.0)&&(timePos4measure != timePositions.end())) { auto voiceInTimePosition = timePos4measure->second.find(fCurrentVoicePosition); if (voiceInTimePosition != timePos4measure->second.end()) { auto minXPos = std::min_element(voiceInTimePosition->second.begin(),voiceInTimePosition->second.end() ); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 0321181f7..8d40fe9e6 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -77,7 +77,9 @@ public visitor // to get clef, division, staves, time and bool fGenerateComments, fGenerateBars, fGeneratePositions, fGenerateAutoMeasureNum, fLyricsManualSpacing; // internal parsing state - bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fCrescPending,fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress, fShouldStopOctava; + bool fInCue, fInGrace, fInhibitNextBar, fPendingBar, fBeamOpened, fBeamGrouping, fMeasureEmpty, fWavyTrillOpened, fSingleScopeTrill, fNonStandardNoteHead, fDoubleBar, fTremoloInProgress, fShouldStopOctava; + + int fCrescPending, fDiminPending; // XML Number of Crescendo or Diminuedo that have been opened (0 if none) int fTextTagOpen; int fTupletOpen; // Number of opened Tuplets From 2b778631f2dbd4e98d8a9414b9322ad9a9da26b1 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 5 Oct 2020 21:04:32 +0200 Subject: [PATCH 082/164] Working FAT Framework with support for iOS and Catalyst --- build/CMakeLists.txt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 607a0bdd0..3bb77ea79 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -113,12 +113,7 @@ if (NOT LILY) set (SRCFOLDERS ${SRCFOLDERS} interface) endif() file (GLOB CORESRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC}) -file (GLOB COREH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${HEADERS}) - -#"${SRCDIR}/elements/*H" "${SRCDIR}/visitors/visitable.h" "${SRCDIR}/visitors/basevisitor.h" "${SRCDIR}/files/*H" "${SRCDIR}/parser/reader.h" "${SRCDIR}/lib/*H" "${SRCDIR}/guido/xml2guidovisitor.h" -#file (GLOB PRIVATEH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SRCDIR}/*H") -#file (GLOB PRIVATEH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SRCDIR}/elements/*H" "${SRCDIR}/visitors/visitable.h" "${SRCDIR}/visitors/basevisitor.h" "${SRCDIR}/files/*H" "${SRCDIR}/parser/reader.h" "${SRCDIR}/lib/*H" "${SRCDIR}/guido/xml2guidovisitor.h") - +file (GLOB COREH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${HEADERS} "${SRCDIR}/elements/*H" "${SRCDIR}/visitors/*H" "${SRCDIR}/files/*H" "${SRCDIR}/parser/reader.h" "${SRCDIR}/lib/*H" "${SRCDIR}/guido/*H") foreach(folder ${SRCFOLDERS}) set(INCL ${INCL} "${SRCDIR}/${folder}") # add include folders @@ -152,7 +147,6 @@ if (NOT IOS) LIBRARY_OUTPUT_DIRECTORY ${LIBDIR} LIBRARY_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} PUBLIC_HEADER "${COREH}" - PRIVATE_HEADER "${PRIVATEH}" DEFINE_SYMBOL LIBMUSICXML_EXPORTS XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" ) @@ -172,7 +166,6 @@ elseif(IOS) LIBRARY_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${IOS_DEPLOYMENT_TARGET} PUBLIC_HEADER "${COREH}" - PRIVATE_HEADER "${PRIVATEH}" MACOSX_FRAMEWORK_IDENTIFIER "com.grame.libmusicxml" MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${STRVERS} MACOSX_FRAMEWORK_BUNDLE_VERSION ${VERSION} From 1531099043e74248cdceec4896493d4a29935ec9 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 6 Oct 2020 18:12:26 +0200 Subject: [PATCH 083/164] CMAKE: Set iOS Arch to defaults --- build/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 3bb77ea79..7dba09fcd 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -64,7 +64,7 @@ if(APPLE) if ( IOS ) message (STATUS "Generates project for iOS - Use -DIOS=no to change.") set (CMAKE_XCODE_EFFECTIVE_PLATFORMS "iPhoneOS") - set (CMAKE_OSX_ARCHITECTURES "arm64 x86_64") # unsupported on iOS 11.4.0: armv7 armv7s + #set (CMAKE_OSX_ARCHITECTURES "arm64 x86_64") # unsupported on iOS 11.4.0: armv7 armv7s set (CMAKE_OSX_SYSROOT "iphoneos") set(IOS_DEPLOYMENT_TARGET 13.0) #set (libtype STATIC) From df0aa6878682c79b7a20bba54dc1f8bfbd710925 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 7 Oct 2020 11:12:04 +0200 Subject: [PATCH 084/164] Resolve potential name clash with GuidoLib using namespace --- src/parser/xmlparse.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/parser/xmlparse.cpp b/src/parser/xmlparse.cpp index d1dad54a3..179e1a854 100644 --- a/src/parser/xmlparse.cpp +++ b/src/parser/xmlparse.cpp @@ -181,8 +181,14 @@ char doctypeStart[MAXLEN]; char doctypePub[MAXLEN]; char doctypeSys[MAXLEN]; +namespace MusicXML2 +{ reader * gReader; +} // namespace MUSICXML2 + +using namespace MusicXML2; + static void init (reader * r) { gReader = r; xmlStandalone = -1; From b6d4e3a7d9a494df5cda29018bd010d53f54b44b Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 11 Dec 2020 11:49:51 +0100 Subject: [PATCH 085/164] xml2guido: Fixed Slur Stop Search --- src/guido/xmlpart2guido.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 5da962991..20355114b 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1489,8 +1489,7 @@ void xmlpart2guido::parseTime(ctree::iterator &iter) { // Skip Slur creation, if the CLOSING Slur is not on the same voice/staff (Guido limitation) if (isSlurClosing(*i)==false) { - cerr<< "XML Slur at line:"<< (*i)->getInputLineNumber()<<" measure:"<getInputLineNumber()<<" measure:"<end()) && (seachMeasureNum <= fMeasNum + 10)) { + while ((nextnote != fCurrentPart->end()) && (searchMeasureNum <= fMeasNum + 10)) { // Check measure if (nextnote->getType() == k_measure) { std::string measNum = nextnote->getAttributeValue("number"); try { - seachMeasureNum = std::stoi(measNum); + searchMeasureNum = std::stoi(measNum); } catch(...) { - seachMeasureNum++; + searchMeasureNum++; } + // Move to the first sub-element + nextnote.forward(); } // looking for the next note on the target voice @@ -1553,11 +1554,11 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { if (iterSlur != iter->end()) { - if ((iterSlur->getAttributeValue("type")=="start") && - ((iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber)) && - (thisNoteVoice == fTargetVoice)) { - return false; - } +// if ((iterSlur->getAttributeValue("type")=="start") && +// ((iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber)) && +// (thisNoteVoice == fTargetVoice)) { +// return false; +// } if ((iterSlur->getAttributeValue("type")=="stop") && (iterSlur->getAttributeIntValue("number", 0) == internalXMLSlurNumber) @@ -1566,8 +1567,6 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { //cerr<< "\t\t\t FOUND Slur stop line:"<< iterSlur->getInputLineNumber()<< " voice:"<getAttributeIntValue("number", 0)< Date: Mon, 4 Jan 2021 17:00:26 +0100 Subject: [PATCH 086/164] fix incorrect instrument handling in note element --- src/visitors/notevisitor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/visitors/notevisitor.h b/src/visitors/notevisitor.h index b63ddf99e..bbb165d42 100644 --- a/src/visitors/notevisitor.h +++ b/src/visitors/notevisitor.h @@ -192,7 +192,7 @@ class EXP notevisitor : virtual void visitStart( S_duration& elt ) { if (fInNote) fDuration = (int)(*elt); } virtual void visitStart( S_fermata& elt ) { fFermata = elt; } virtual void visitStart( S_grace& elt ) { fGrace = true; } - virtual void visitStart( S_instrument& elt ) { if (fInNote) fInstrument = elt->getValue(); } + virtual void visitStart( S_instrument& elt ) { if (fInNote) fInstrument = elt->getAttributeValue("id"); } virtual void visitStart( S_note& elt ); virtual void visitStart( S_octave& elt ) { if (fInNote) fOctave = (int)(*elt); } virtual void visitStart( S_pitch& elt ) { fType = kPitched; } From 0e7472b2d3c1ba80b082ecaa6bd151573a26afb1 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Tue, 2 Feb 2021 09:17:47 +0100 Subject: [PATCH 087/164] fix build tools --- build/CMakeLists.txt | 2 ++ build/Makefile | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 76c2b6bb2..bdc7b9343 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -139,6 +139,8 @@ add_library(${target} SHARED ${LIBCONTENT}) set_target_properties (${target} PROPERTIES VERSION ${VERSION} SOVERSION ${SOVERS} + RUNTIME_OUTPUT_DIRECTORY ${LIBDIR} + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} ARCHIVE_OUTPUT_DIRECTORY ${LIBDIR} ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${LIBDIR} LIBRARY_OUTPUT_DIRECTORY ${LIBDIR} diff --git a/build/Makefile b/build/Makefile index 70dceda95..ca577abb6 100644 --- a/build/Makefile +++ b/build/Makefile @@ -80,7 +80,7 @@ help : @echo " PREFIX the install location prefix. Currently $(PREFIX)'" @echo @echo "CMake options:" - @echo " FMWK [MacOS only] Generates a framework on MacOS. Default is on" + @echo " FMWK [MacOS only] Generates a framework on MacOS. Default is off" @echo " UNIVERSAL [MacOS only] Generates universal binaries. Default is off" @echo " GDB Activates ggdb3 option. Default is off" @echo " LILY Include lilypond part. Default is on" @@ -97,6 +97,10 @@ $(PDIR) : js: make -C ../javascript +#=============================================================== +# building the library on Mac OS X +#=============================================================== + #=============================================================== # building the library on Mac OS X #=============================================================== From 962920f39a7507df40212bae4e1b6d65f1871aa6 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Wed, 3 Feb 2021 10:16:13 +0100 Subject: [PATCH 088/164] add MAKE and CMAKE variables --- build/Makefile | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/build/Makefile b/build/Makefile index ca577abb6..873df2f85 100644 --- a/build/Makefile +++ b/build/Makefile @@ -4,6 +4,8 @@ .PHONY : msys win32 win64 linux android +MAKE ?= make +CMAKE ?= cmake PDIR ?= libdir VERSION = 3.20 @@ -43,7 +45,7 @@ CMAKEOPT ?= TOOLS := xml2midi xmlread xml2guido xml2ly xmlversion all : - make $(TARGET) + $(MAKE) $(TARGET) undefined: $(error System is undefined, not target available) @@ -95,7 +97,7 @@ $(PDIR) : # building the javascript library #=============================================================== js: - make -C ../javascript + $(MAKE) -C ../javascript #=============================================================== # building the library on Mac OS X @@ -105,28 +107,28 @@ js: # building the library on Mac OS X #=============================================================== macos : $(PDIR)/libmusicxml2.xcodeproj - cmake --build $(PDIR) --config Release -- -jobs $(JOBS) + $(CMAKE) --build $(PDIR) --config Release -- -jobs $(JOBS) -cd lib && [ -d libmusicxml2.framework ] && tar czf libmusicxml2.tgz libmusicxml2.framework || echo "no framework" $(PDIR)/libmusicxml2.xcodeproj : $(PDIR) CMakeLists.txt - cd $(PDIR) && cmake .. -G Xcode $(CMAKEOPT) -Wno-dev + cd $(PDIR) && $(CMAKE) .. -G Xcode $(CMAKEOPT) -Wno-dev universal: $(PDIR) - cd $(PDIR) && cmake .. -DUNIVERSAL=on -Wno-dev + cd $(PDIR) && $(CMAKE) .. -DUNIVERSAL=on -Wno-dev native: $(PDIR) - cd $(PDIR) && cmake .. -DUNIVERSAL=off -Wno-dev + cd $(PDIR) && $(CMAKE) .. -DUNIVERSAL=off -Wno-dev #=============================================================== # building the library for iOS #=============================================================== ios : $(IOS)/libmusicxml2.xcodeproj - cmake --build $(IOS) --config Release -- -jobs $(JOBS) + $(CMAKE) --build $(IOS) --config Release -- -jobs $(JOBS) $(IOS)/libmusicxml2.xcodeproj : CMakeLists.txt [ -d $(IOS) ] || mkdir $(IOS) - cd $(IOS) && cmake .. -G Xcode -DIOS=yes -Wno-dev $(CMAKEOPT) + cd $(IOS) && $(CMAKE) .. -G Xcode -DIOS=yes -Wno-dev $(CMAKEOPT) #=============================================================== @@ -137,41 +139,41 @@ $(IOS)/libmusicxml2.xcodeproj : CMakeLists.txt # using msys msys : GENERATOR ?= MSYS Makefiles msys : $(PDIR)/Makefile - make -C $(PDIR) + $(MAKE) -C $(PDIR) #=============================================================== # using visual studio windows : - make win32 - make win64 + $(MAKE) win32 + $(MAKE) win64 win32 : win32/libmusicxml2.sln - cmake --build win32 --config Release -- /maxcpucount:4 + $(CMAKE) --build win32 --config Release -- /maxcpucount:4 win32/libmusicxml2.sln : CMakeLists.txt [ -d win32 ] || mkdir win32 - cd win32 && cmake .. -G "$(MSVC)" $(CMAKEOPT) + cd win32 && $(CMAKE) .. -G "$(MSVC)" $(CMAKEOPT) win64 : win64/libmusicxml2.sln - cmake --build win64 --config Release -- /maxcpucount:4 + $(CMAKE) --build win64 --config Release -- /maxcpucount:4 win64/libmusicxml2.sln : CMakeLists.txt [ -d win64 ] || mkdir win64 - cd win64 && cmake .. -G "$(MSVC64)" $(CMAKEOPT) + cd win64 && $(CMAKE) .. -G "$(MSVC64)" $(CMAKEOPT) #=============================================================== # building the library on linux #=============================================================== linux : $(PDIR)/Makefile - make -C $(PDIR) + $(MAKE) -C $(PDIR) $(PDIR)/Makefile : $(PDIR) CMakeLists.txt - cd $(PDIR) && cmake .. -G "$(GENERATOR)" $(CMAKEOPT) + cd $(PDIR) && $(CMAKE) .. -G "$(GENERATOR)" $(CMAKEOPT) #=============================================================== cmake : $(PDIR) - cd $(PDIR) && cmake .. -G "$(GENERATOR)" -Wno-dev $(CMAKEOPT) + cd $(PDIR) && $(CMAKE) .. -G "$(GENERATOR)" -Wno-dev $(CMAKEOPT) #=============================================================== # building the library for Android @@ -194,8 +196,8 @@ format : #=============================================================== installLog := $(PDIR)/install_manifest.txt install: - cd $(PDIR) && cmake .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) - cmake --build $(PDIR) --config Release --target install + cd $(PDIR) && $(CMAKE) .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) + $(CMAKE) --build $(PDIR) --config Release --target install uninstall: installedfiles = $(shell cat $(installLog)) uninstall: $(installLog) From c4fae4c79dd85d7f3b24820e3e3fc228a0bd4f45 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Fri, 5 Feb 2021 10:22:11 +0100 Subject: [PATCH 089/164] update build system --- build/CMakeLists.txt | 41 +++++++----- build/Makefile | 152 +++++++++++-------------------------------- 2 files changed, 61 insertions(+), 132 deletions(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index bdc7b9343..ff5996453 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -2,7 +2,7 @@ # CMAKE libmusicxml2 ####################################### project(libmusicxml2) -cmake_minimum_required(VERSION 2.4) +cmake_minimum_required(VERSION 3.4.0) if(CMAKE_CONFIGURATION_TYPES) set(CMAKE_CONFIGURATION_TYPES Debug Release) endif() @@ -27,17 +27,25 @@ get_filename_component(ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) ####################################### -option ( FMWK "Generates a framework on MacOS by default" off ) -option ( UNIVERSAL "Generates universal binaries" off ) -option ( GDB "Activates ggdb3 option" off ) -option ( LILY "Include lilypond part" on ) -option ( BRL "Include braille part" off ) +option ( FMWK "Generates a framework on MacOS by default" off ) +option ( GDB "Activates ggdb3 option" off ) +option ( LILY "Include lilypond part" on ) +option ( BRL "Include braille part" off ) +option ( GENTOOLS "Generates tools" on ) +option ( GENSTATIC "Generates the static library" on ) + +if (GENTOOLS) + message (STATUS "Generate tools (force required static library generation)") + set (GENSTATIC on) +endif() ####################################### get_filename_component(ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) set (DOCDIR ${ROOT}/doc) -set (DOC ${DOCDIR}/presentation/libmusicxml2.pdf ${DOCDIR}/userSGuideToXml2ly/userSGuideToXml2ly.pdf ${DOCDIR}/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.pdf) -set (SCHEMA ${ROOT}/dtds/${XMLVERSION}) +set (DOC ${DOCDIR}/presentation/libmusicxml2.pdf + ${DOCDIR}/userSGuideToXml2ly/userSGuideToXml2ly.pdf + ${DOCDIR}/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.pdf) +set (SCHEMA ${ROOT}/dtds/${XMLVERSION}) set (BINDIR ${CMAKE_CURRENT_SOURCE_DIR}/bin) set (LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/lib) @@ -67,10 +75,6 @@ if(APPLE) set (CMAKE_CXX_FLAGS "-miphoneos-version-min=11.2") set (libtype STATIC) set (FMWK "false") - elseif( UNIVERSAL ) - message (STATUS "Generates universal binaries - Use -DUNIVERSAL=no to change. .") - set (CMAKE_OSX_ARCHITECTURES "x86_64") - set (CMAKE_OSX_DEPLOYMENT_TARGET 10.10) endif() # to debug: #add_definitions(-O0 -g) # JMI @@ -151,7 +155,7 @@ set_target_properties (${target} PROPERTIES ) endif() -if (NOT WIN32) +if (NOT WIN32 AND GENSTATIC) add_library(${staticlib} STATIC ${LIBCONTENT}) set_target_properties (${staticlib} PROPERTIES VERSION ${VERSION} @@ -198,7 +202,7 @@ else() endif() -if(NOT IOS ) +if(NOT IOS AND GENTOOLS) foreach(sample ${SAMPLES}) add_executable( ${sample} ${SAMPLEDIR}/${sample}.cpp ) target_link_libraries( ${sample} ${LINKTO}) @@ -232,10 +236,9 @@ endif () if (NOT IOS) message (STATUS "Install location is ${CMAKE_INSTALL_PREFIX}") -if (WIN32) - set (INSTALLED ${target}) -else() - set (INSTALLED ${target} ${staticlib}) +set (INSTALLED ${target}) +if (GENSTATIC) + set (INSTALLED ${INSTALLED} ${staticlib}) endif() install ( TARGETS ${INSTALLED} RUNTIME DESTINATION ${BINDEST} @@ -245,11 +248,13 @@ install ( TARGETS ${INSTALLED} PUBLIC_HEADER DESTINATION include/libmusicxml ) +if (GENTOOLS) install ( TARGETS ${TOOLS} RUNTIME DESTINATION ${BINDEST} LIBRARY DESTINATION ${LIBDEST} ARCHIVE DESTINATION ${LIBDEST} ) +endif() #################################### # install misc files diff --git a/build/Makefile b/build/Makefile index 873df2f85..96e45276d 100644 --- a/build/Makefile +++ b/build/Makefile @@ -6,68 +6,45 @@ MAKE ?= make CMAKE ?= cmake -PDIR ?= libdir +LIBDIR ?= libdir +IOSDIR ?= iosdir + VERSION = 3.20 system := $(shell uname -s) system := $(shell echo $(system) | grep MINGW > /dev/null && echo MINGW || echo $(system)) ifeq ($(system), Darwin) - TARGET ?= macos - OUTDIR = $(PDIR)/Release - GENERATOR ?= Xcode PREFIX ?= /usr/local - NATIVEPACK = macpack -else -ifeq ($(system), MINGW) - TARGET ?= windows - PDIR ?= win64 - NATIVEPACK = winpack -else -ifeq ($(system), Linux) - TARGET ?= linux - OUTDIR = $(PDIR) - GENERATOR ?= Unix Makefiles - PREFIX ?= /usr/local - NATIVEPACK = linuxpack -else - TARGET = undefined - NATIVEPACK = undefined + GENERATOR ?= -G Xcode + MAKEFILE = libmusicxml2.xcodeproj endif +ifeq ($(system), MINGW) + GENERATOR ?= "" + MAKEFILE = Makefile endif + +ifeq ($(system), Linux) + GENERATOR ?= "" + MAKEFILE = Makefile endif -IOS := iosdir -MSVC ?= Visual Studio 14 2015 -MSVC64 := $(MSVC) Win64 -JOBS ?= 6 CMAKEOPT ?= TOOLS := xml2midi xmlread xml2guido xml2ly xmlversion all : - $(MAKE) $(TARGET) - -undefined: - $(error System is undefined, not target available) + $(MAKE) libmusicxml help : - @echo libmusicxml makefile - Targets are : + @echo "libmusicxml makefile - Available targets:" @echo " all (default): build the libmusicxml library for the current platform," @echo " build the libmusicxml tools," - @echo - @echo "Platform targets to build the libmusicxml library are:" - @echo " macos build the library for macos" - @echo " windows build 32 and 64 bits library for windows" - @echo " linux build the library for linux" @echo " android build a static library for Android" @echo " ios build a static library for iOS" - @echo " msys build on Windows using MSys" - @echo " js build a javascript library" - @echo "the platform targets is automatically evaluated by the default target." + @echo " wasm build the wasm library" + @echo " minimal build the library with only guido support (no tools and no static library)" @echo @echo "Misc:" - @echo " universal switch to universal binaries (MacOS)" - @echo " native switch universal binaries off (MacOS)" @echo " cmake re-generates the cmake project" @echo " format source code formatting using clang-format" @echo " install install library, tools and headers" @@ -77,103 +54,50 @@ help : @echo "Options:" @echo " CMAKEOPT cmake options passed to cmake by the 'cmake' target" @echo " GENERATOR the cmake generator. Currently '$(GENERATOR)'" - @echo " PDIR the generation folder. Currently '$(PDIR)'" + @echo " LIBDIR the generation folder. Currently '$(LIBDIR)'" @echo " MSVC [Windows only] the windows generator. Currently '$(MSVC)'" @echo " PREFIX the install location prefix. Currently $(PREFIX)'" @echo @echo "CMake options:" @echo " FMWK [MacOS only] Generates a framework on MacOS. Default is off" - @echo " UNIVERSAL [MacOS only] Generates universal binaries. Default is off" @echo " GDB Activates ggdb3 option. Default is off" @echo " LILY Include lilypond part. Default is on" @echo "NOTE: CMake options can be passed using CMAKEOPT, e.g." @echo " 'make cmake CMAKEOPT=-DLILY=off'" -$(PDIR) : - mkdir $(PDIR) - -#=============================================================== -# building the javascript library -#=============================================================== -js: - $(MAKE) -C ../javascript - -#=============================================================== -# building the library on Mac OS X -#=============================================================== - -#=============================================================== -# building the library on Mac OS X -#=============================================================== -macos : $(PDIR)/libmusicxml2.xcodeproj - $(CMAKE) --build $(PDIR) --config Release -- -jobs $(JOBS) - -cd lib && [ -d libmusicxml2.framework ] && tar czf libmusicxml2.tgz libmusicxml2.framework || echo "no framework" - -$(PDIR)/libmusicxml2.xcodeproj : $(PDIR) CMakeLists.txt - cd $(PDIR) && $(CMAKE) .. -G Xcode $(CMAKEOPT) -Wno-dev - -universal: $(PDIR) - cd $(PDIR) && $(CMAKE) .. -DUNIVERSAL=on -Wno-dev - -native: $(PDIR) - cd $(PDIR) && $(CMAKE) .. -DUNIVERSAL=off -Wno-dev - - #=============================================================== -# building the library for iOS +# building inscore and inscoreviewer #=============================================================== -ios : $(IOS)/libmusicxml2.xcodeproj - $(CMAKE) --build $(IOS) --config Release -- -jobs $(JOBS) +libmusicxml: $(LIBDIR) $(LIBDIR)/$(MAKEFILE) + $(CMAKE) --build $(LIBDIR) --config Release -$(IOS)/libmusicxml2.xcodeproj : CMakeLists.txt - [ -d $(IOS) ] || mkdir $(IOS) - cd $(IOS) && $(CMAKE) .. -G Xcode -DIOS=yes -Wno-dev $(CMAKEOPT) +$(LIBDIR): + mkdir $(LIBDIR) +$(LIBDIR)/$(MAKEFILE) : CMakelists.txt + cd $(LIBDIR) && $(CMAKE) .. $(CMAKEOPTS) $(GENERATOR) #=============================================================== -# building the library on windows -#=============================================================== - +# building the javascript library #=============================================================== -# using msys -msys : GENERATOR ?= MSYS Makefiles -msys : $(PDIR)/Makefile - $(MAKE) -C $(PDIR) +wasm: + $(MAKE) -C ../javascript #=============================================================== -# using visual studio -windows : - $(MAKE) win32 - $(MAKE) win64 - -win32 : win32/libmusicxml2.sln - $(CMAKE) --build win32 --config Release -- /maxcpucount:4 - -win32/libmusicxml2.sln : CMakeLists.txt - [ -d win32 ] || mkdir win32 - cd win32 && $(CMAKE) .. -G "$(MSVC)" $(CMAKEOPT) - -win64 : win64/libmusicxml2.sln - $(CMAKE) --build win64 --config Release -- /maxcpucount:4 - -win64/libmusicxml2.sln : CMakeLists.txt - [ -d win64 ] || mkdir win64 - cd win64 && $(CMAKE) .. -G "$(MSVC64)" $(CMAKEOPT) +minimal: + $(MAKE) cmake CMAKEOPT="-DGENTOOLS=off -DLILY=off -DGENSTATIC=off" + $(CMAKE) --build $(LIBDIR) --config Release #=============================================================== -# building the library on linux +# building the library for iOS #=============================================================== -linux : $(PDIR)/Makefile - $(MAKE) -C $(PDIR) - -$(PDIR)/Makefile : $(PDIR) CMakeLists.txt - cd $(PDIR) && $(CMAKE) .. -G "$(GENERATOR)" $(CMAKEOPT) - +ios : + $(MAKE) libmusicxml LIBDIR=$(IOSDIR) CMAKEOPTS="-DIOS=on" #=============================================================== -cmake : $(PDIR) - cd $(PDIR) && $(CMAKE) .. -G "$(GENERATOR)" -Wno-dev $(CMAKEOPT) +cmake : $(LIBDIR) + cd $(LIBDIR) && $(CMAKE) .. $(CMAKEOPT) #=============================================================== # building the library for Android @@ -194,10 +118,10 @@ format : #=============================================================== # install #=============================================================== -installLog := $(PDIR)/install_manifest.txt +installLog := $(LIBDIR)/install_manifest.txt install: - cd $(PDIR) && $(CMAKE) .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) - $(CMAKE) --build $(PDIR) --config Release --target install + cd $(LIBDIR) && $(CMAKE) .. -DCMAKE_INSTALL_PREFIX=$(PREFIX) + $(CMAKE) --build $(LIBDIR) --config Release --target install uninstall: installedfiles = $(shell cat $(installLog)) uninstall: $(installLog) From a6a40e173a9b2fd9ee5ac9b542ac94038ba905e2 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Fri, 5 Feb 2021 11:19:47 +0100 Subject: [PATCH 090/164] fix incorrect installed libs (win32) --- build/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index ff5996453..f2608af5e 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -237,9 +237,11 @@ endif () if (NOT IOS) message (STATUS "Install location is ${CMAKE_INSTALL_PREFIX}") set (INSTALLED ${target}) +if (NOT WIN32) if (GENSTATIC) set (INSTALLED ${INSTALLED} ${staticlib}) endif() +endif() install ( TARGETS ${INSTALLED} RUNTIME DESTINATION ${BINDEST} LIBRARY DESTINATION ${LIBDEST} From 4a6e0a35a85401a245a0f448c16afd601bb30cba Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Fri, 5 Feb 2021 11:28:14 +0100 Subject: [PATCH 091/164] fix incorrect file name --- build/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Makefile b/build/Makefile index 96e45276d..ca6fa0b81 100644 --- a/build/Makefile +++ b/build/Makefile @@ -75,7 +75,7 @@ libmusicxml: $(LIBDIR) $(LIBDIR)/$(MAKEFILE) $(LIBDIR): mkdir $(LIBDIR) -$(LIBDIR)/$(MAKEFILE) : CMakelists.txt +$(LIBDIR)/$(MAKEFILE) : CMakeLists.txt cd $(LIBDIR) && $(CMAKE) .. $(CMAKEOPTS) $(GENERATOR) #=============================================================== From e113b6cea27a1172f9a892356148d506bbd3586a Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Fri, 5 Feb 2021 11:44:37 +0100 Subject: [PATCH 092/164] fix incorrect GENERATOR --- build/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/build/Makefile b/build/Makefile index ca6fa0b81..054c096ed 100644 --- a/build/Makefile +++ b/build/Makefile @@ -19,12 +19,10 @@ ifeq ($(system), Darwin) MAKEFILE = libmusicxml2.xcodeproj endif ifeq ($(system), MINGW) - GENERATOR ?= "" MAKEFILE = Makefile endif ifeq ($(system), Linux) - GENERATOR ?= "" MAKEFILE = Makefile endif From 0b29fa0365bd3118922f10df77431a3e80bc09be Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Mon, 5 Apr 2021 07:36:11 +0200 Subject: [PATCH 093/164] remove lilypond stuff (moved to musicformats) --- build/CMakeLists.txt | 29 +- build/Makefile | 2 +- samples/xmlversion.cpp | 1 - .../bsr2BrailleTranslatorInterface.cpp | 93 - .../bsr2BrailleTranslatorInterface.h | 52 - src/interface/bsr2BsrFinalizerInterface.cpp | 133 - src/interface/bsr2BsrFinalizerInterface.h | 58 - src/interface/libmusicxml.cpp | 4 - src/interface/libmusicxml.h | 22 - src/interface/lpsr2LilypondInterface.cpp | 88 - src/interface/lpsr2LilypondInterface.h | 54 - src/interface/msr2BsrInterface.cpp | 140 - src/interface/msr2BsrInterface.h | 57 - src/interface/msr2LpsrInterface.cpp | 139 - src/interface/msr2LpsrInterface.h | 64 - src/interface/msrVoice2MasterInterface.cpp | 141 - src/interface/msrVoice2MasterInterface.h | 62 - src/interface/musicXML2MxmlTreeInterface.cpp | 763 - src/interface/musicXML2MxmlTreeInterface.h | 74 - .../mxmlTree2MsrSkeletonBuilderInterface.cpp | 201 - .../mxmlTree2MsrSkeletonBuilderInterface.h | 61 - .../mxmlTree2MsrTranslatorInterface.cpp | 241 - .../mxmlTree2MsrTranslatorInterface.h | 62 - src/lilypond/basicOah2ManPageGenerator.cpp | 1017 - src/lilypond/basicOah2ManPageGenerator.h | 176 - src/lilypond/brailleOah.cpp | 1510 -- src/lilypond/brailleOah.h | 401 - src/lilypond/brailleOah2ManPageGenerator.cpp | 177 - src/lilypond/brailleOah2ManPageGenerator.h | 60 - src/lilypond/bsr.cpp | 29 - src/lilypond/bsr.h | 33 - src/lilypond/bsr2BrailleTranslator.cpp | 766 - src/lilypond/bsr2BrailleTranslator.h | 150 - src/lilypond/bsr2BsrFinalizer.cpp | 681 - src/lilypond/bsr2BsrFinalizer.h | 181 - src/lilypond/bsrBarlines.cpp | 237 - src/lilypond/bsrBarlines_MUT_DEP.h | 101 - src/lilypond/bsrBasicTypes.cpp | 672 - src/lilypond/bsrBasicTypes.h | 994 - src/lilypond/bsrBrailleCodeGenerators.cpp | 676 - src/lilypond/bsrBrailleCodeGenerators.h | 346 - src/lilypond/bsrCellsLists.cpp | 383 - src/lilypond/bsrCellsLists.h | 188 - src/lilypond/bsrClefs.cpp | 304 - src/lilypond/bsrClefs_MUT_DEP.h | 104 - src/lilypond/bsrDynamics.cpp | 320 - src/lilypond/bsrDynamics_MUT_DEP.h | 91 - src/lilypond/bsrElements.cpp | 122 - src/lilypond/bsrElements.h | 113 - src/lilypond/bsrFootNotes.cpp | 284 - src/lilypond/bsrFootNotes_MUT_DEP.h | 144 - src/lilypond/bsrKeys.cpp | 299 - src/lilypond/bsrKeys_MUT_DEP.h | 105 - src/lilypond/bsrLineElements.cpp | 140 - src/lilypond/bsrLineElements_MUT_DEP.h | 89 - src/lilypond/bsrLines.cpp | 846 - src/lilypond/bsrLines_MUT_DEP.h | 228 - src/lilypond/bsrMeasures.cpp | 383 - src/lilypond/bsrMeasures_MUT_DEP.h | 108 - src/lilypond/bsrMusicHeadings.cpp | 303 - src/lilypond/bsrMusicHeadings_MUT_DEP.h | 95 - src/lilypond/bsrMutualDependencies.h | 105 - src/lilypond/bsrNotes.cpp | 1169 - src/lilypond/bsrNotes_MUT_DEP.h | 281 - src/lilypond/bsrNumbers.cpp | 279 - src/lilypond/bsrNumbers_MUT_DEP.h | 115 - src/lilypond/bsrOah.cpp | 1171 - src/lilypond/bsrOah.h | 378 - src/lilypond/bsrOah2ManPageGenerator.cpp | 134 - src/lilypond/bsrOah2ManPageGenerator.h | 55 - src/lilypond/bsrPageElements.cpp | 143 - src/lilypond/bsrPageElements_MUT_DEP.h | 91 - src/lilypond/bsrPageHeadings.cpp | 255 - src/lilypond/bsrPageHeadings_MUT_DEP.h | 93 - src/lilypond/bsrPages.cpp | 255 - src/lilypond/bsrPages_MUT_DEP.h | 103 - src/lilypond/bsrPaginations.cpp | 205 - src/lilypond/bsrPaginations_MUT_DEP.h | 85 - src/lilypond/bsrParallels.cpp | 200 - src/lilypond/bsrParallels.h | 109 - src/lilypond/bsrScores.cpp | 229 - src/lilypond/bsrScores.h | 133 - src/lilypond/bsrSpaces.cpp | 165 - src/lilypond/bsrSpaces_MUT_DEP.h | 79 - src/lilypond/bsrTempos.cpp | 457 - src/lilypond/bsrTempos_MUT_DEP.h | 95 - src/lilypond/bsrTimes.cpp | 843 - src/lilypond/bsrTimes_MUT_DEP.h | 188 - src/lilypond/bsrTranscriptionNotes.cpp | 292 - src/lilypond/bsrTranscriptionNotes.h | 170 - src/lilypond/bsrWords.cpp | 324 - src/lilypond/bsrWords_MUT_DEP.h | 85 - src/lilypond/extraOah.cpp | 1491 - src/lilypond/extraOah.h | 467 - src/lilypond/extraOah2ManPageGenerator.cpp | 224 - src/lilypond/extraOah2ManPageGenerator.h | 65 - src/lilypond/generalOah.cpp | 410 - src/lilypond/generalOah.h | 148 - src/lilypond/lilypondOah.cpp | 4974 ---- src/lilypond/lilypondOah.h | 1169 - src/lilypond/lilypondOah2ManPageGenerator.cpp | 400 - src/lilypond/lilypondOah2ManPageGenerator.h | 85 - src/lilypond/lpsr.cpp | 29 - src/lilypond/lpsr.h | 53 - src/lilypond/lpsr2LilypondTranslator.cpp | 16009 ----------- src/lilypond/lpsr2LilypondTranslator.h | 1015 - src/lilypond/lpsrBarNumbers.cpp | 202 - src/lilypond/lpsrBarNumbers.h | 140 - src/lilypond/lpsrBasicTypes.cpp | 1416 - src/lilypond/lpsrBasicTypes.h | 177 - src/lilypond/lpsrBookBlockElements.cpp | 854 - src/lilypond/lpsrBookBlockElements.h | 348 - src/lilypond/lpsrComments.cpp | 133 - src/lilypond/lpsrComments.h | 104 - src/lilypond/lpsrContexts.cpp | 507 - src/lilypond/lpsrContexts.h | 270 - src/lilypond/lpsrElements.cpp | 98 - src/lilypond/lpsrElements.h | 101 - src/lilypond/lpsrHeaders.cpp | 1391 - src/lilypond/lpsrHeaders.h | 415 - src/lilypond/lpsrLayouts.cpp | 160 - src/lilypond/lpsrLayouts.h | 113 - src/lilypond/lpsrLyrics.cpp | 121 - src/lilypond/lpsrLyrics.h | 94 - src/lilypond/lpsrOah.cpp | 2543 -- src/lilypond/lpsrOah.h | 633 - src/lilypond/lpsrOah2ManPageGenerator.cpp | 224 - src/lilypond/lpsrOah2ManPageGenerator.h | 65 - src/lilypond/lpsrPapers.cpp | 365 - src/lilypond/lpsrPapers.h | 199 - src/lilypond/lpsrParallelMusic.cpp | 172 - src/lilypond/lpsrParallelMusic.h | 142 - src/lilypond/lpsrPartGroups.cpp | 161 - src/lilypond/lpsrPartGroups.h | 102 - src/lilypond/lpsrParts.cpp | 536 - src/lilypond/lpsrParts.h | 149 - src/lilypond/lpsrScheme.cpp | 328 - src/lilypond/lpsrScheme.h | 214 - src/lilypond/lpsrScores.cpp | 2210 -- src/lilypond/lpsrScores.h | 443 - src/lilypond/lpsrStaves.cpp | 497 - src/lilypond/lpsrStaves.h | 305 - src/lilypond/lpsrVarValAssocs.cpp | 620 - src/lilypond/lpsrVarValAssocs.h | 358 - src/lilypond/lpsrVariables.cpp | 116 - src/lilypond/lpsrVariables.h | 88 - src/lilypond/lpsrVoices.cpp | 120 - src/lilypond/lpsrVoices.h | 92 - src/lilypond/messagesHandling.cpp | 313 - src/lilypond/messagesHandling.h | 118 - src/lilypond/msr.cpp | 30 - src/lilypond/msr.h | 97 - src/lilypond/msr2BsrTranslator.cpp | 6693 ----- src/lilypond/msr2BsrTranslator.h | 857 - src/lilypond/msr2LpsrTranslator.cpp | 6535 ----- src/lilypond/msr2LpsrTranslator.h | 693 - src/lilypond/msr2Names.cpp | 454 - src/lilypond/msr2Names.h | 118 - src/lilypond/msr2Summary.cpp | 1182 - src/lilypond/msr2Summary.h | 254 - src/lilypond/msrAfterGraceNotes.cpp | 435 - src/lilypond/msrAfterGraceNotes_MUT_DEP.h | 186 - src/lilypond/msrArpeggiatos.cpp | 27 - src/lilypond/msrArpeggiatos.h | 28 - src/lilypond/msrArticulations.cpp | 583 - src/lilypond/msrArticulations.h | 359 - src/lilypond/msrBars.cpp | 833 - src/lilypond/msrBars.h | 412 - src/lilypond/msrBasicTypes.cpp | 19285 ------------- src/lilypond/msrBasicTypes.h | 1570 -- src/lilypond/msrBeams.cpp | 170 - src/lilypond/msrBeams.h | 108 - src/lilypond/msrBeatsRepeats.cpp | 1191 - src/lilypond/msrBeatsRepeats_MUT_DEP.h | 342 - src/lilypond/msrBreaks.cpp | 231 - src/lilypond/msrBreaks.h | 147 - src/lilypond/msrChords.cpp | 1606 -- src/lilypond/msrChords_MUT_DEP.h | 467 - src/lilypond/msrClefs.cpp | 292 - src/lilypond/msrClefs.h | 130 - src/lilypond/msrCredits.cpp | 347 - src/lilypond/msrCredits.h | 218 - src/lilypond/msrDivisions.cpp | 589 - src/lilypond/msrDivisions.h | 155 - src/lilypond/msrDoubleTremolos.cpp | 731 - src/lilypond/msrDoubleTremolos_MUT_DEP.h | 223 - src/lilypond/msrDynamics.cpp | 491 - src/lilypond/msrDynamics.h | 286 - src/lilypond/msrElements.cpp | 110 - src/lilypond/msrElements.h | 120 - src/lilypond/msrFiguredBasses.cpp | 736 - src/lilypond/msrFiguredBasses_MUT_DEP.h | 276 - src/lilypond/msrGlissandos.cpp | 216 - src/lilypond/msrGlissandos_MUT_DEP.h | 114 - src/lilypond/msrGraceNotes.cpp | 555 - src/lilypond/msrGraceNotes_MUT_DEP.h | 164 - src/lilypond/msrHarmonies.cpp | 858 - src/lilypond/msrHarmonies_MUT_DEP.h | 341 - src/lilypond/msrIdentification.cpp | 609 - src/lilypond/msrIdentification.h | 204 - src/lilypond/msrInstruments.cpp | 905 - src/lilypond/msrInstruments.h | 546 - src/lilypond/msrKeys.cpp | 606 - src/lilypond/msrKeys.h | 267 - src/lilypond/msrLayouts.cpp | 202 - src/lilypond/msrLayouts.h | 552 - src/lilypond/msrLigatures.cpp | 226 - src/lilypond/msrLigatures.h | 157 - src/lilypond/msrMeasureElements.cpp | 187 - src/lilypond/msrMeasureElements.h | 122 - src/lilypond/msrMeasures.cpp | 5514 ---- src/lilypond/msrMeasuresRepeats.cpp | 1189 - src/lilypond/msrMeasuresRepeats_MUT_DEP.h | 453 - src/lilypond/msrMeasures_MUT_DEP.h | 710 - src/lilypond/msrMidi.cpp | 148 - src/lilypond/msrMidi.h | 104 - src/lilypond/msrMutualDependencies.h | 223 - src/lilypond/msrNotes.cpp | 5220 ---- src/lilypond/msrNotes_MUT_DEP.h | 1122 - src/lilypond/msrOah.cpp | 3432 --- src/lilypond/msrOah.h | 766 - src/lilypond/msrOah2ManPageGenerator.cpp | 268 - src/lilypond/msrOah2ManPageGenerator.h | 70 - src/lilypond/msrOrnaments.cpp | 234 - src/lilypond/msrOrnaments_MUT_DEP.h | 122 - src/lilypond/msrOtherElements.cpp | 283 - src/lilypond/msrOtherElements.h | 214 - src/lilypond/msrPartGroupElements.cpp | 107 - src/lilypond/msrPartGroupElements.h | 110 - src/lilypond/msrPartGroups.cpp | 1088 - src/lilypond/msrPartGroups.h | 333 - src/lilypond/msrPartNamesDisplays.cpp | 218 - src/lilypond/msrPartNamesDisplays.h | 154 - src/lilypond/msrParts.cpp | 2109 -- src/lilypond/msrParts_MUT_DEP.h | 546 - src/lilypond/msrRehearsals.cpp | 157 - src/lilypond/msrRehearsals.h | 114 - src/lilypond/msrRepeatCodas.cpp | 238 - src/lilypond/msrRepeatCodas_MUT_DEP.h | 87 - src/lilypond/msrRepeats.cpp | 2261 -- src/lilypond/msrRepeats_MUT_DEP.h | 650 - src/lilypond/msrRestMeasures.cpp | 660 - src/lilypond/msrRestMeasures_MUT_DEP.h | 240 - src/lilypond/msrScaling.cpp | 260 - src/lilypond/msrScaling.h | 115 - src/lilypond/msrScores.cpp | 806 - src/lilypond/msrScores.h | 291 - src/lilypond/msrSegments.cpp | 2331 -- src/lilypond/msrSegments_MUT_DEP.h | 365 - src/lilypond/msrSingleTremolos.cpp | 134 - src/lilypond/msrSingleTremolos.h | 122 - src/lilypond/msrSlashes.cpp | 165 - src/lilypond/msrSlashes.h | 103 - src/lilypond/msrSlides.cpp | 216 - src/lilypond/msrSlides_MUT_DEP.h | 114 - src/lilypond/msrSlurs.cpp | 165 - src/lilypond/msrSlurs.h | 122 - src/lilypond/msrSpanners.cpp | 241 - src/lilypond/msrSpanners_MUT_DEP.h | 133 - src/lilypond/msrStanzas.cpp | 627 - src/lilypond/msrStanzas_MUT_DEP.h | 192 - src/lilypond/msrStaves.cpp | 2876 -- src/lilypond/msrStavesDetails.cpp | 445 - src/lilypond/msrStavesDetails.h | 240 - src/lilypond/msrStaves_MUT_DEP.h | 515 - src/lilypond/msrStems.cpp | 146 - src/lilypond/msrStems.h | 101 - src/lilypond/msrSyllables.cpp | 710 - src/lilypond/msrSyllables_MUT_DEP.h | 197 - src/lilypond/msrTablatures.cpp | 526 - src/lilypond/msrTablatures.h | 268 - src/lilypond/msrTechnicals.cpp | 696 - src/lilypond/msrTechnicals.h | 477 - src/lilypond/msrTempos.cpp | 1428 - src/lilypond/msrTempos.h | 537 - src/lilypond/msrTies.cpp | 147 - src/lilypond/msrTies.h | 103 - src/lilypond/msrTimes.cpp | 698 - src/lilypond/msrTimes.h | 234 - src/lilypond/msrTranspositions.cpp | 330 - src/lilypond/msrTranspositions.h | 197 - src/lilypond/msrTupletElements.cpp | 107 - src/lilypond/msrTupletElements.h | 110 - src/lilypond/msrTuplets.cpp | 1142 - src/lilypond/msrTuplets_MUT_DEP.h | 240 - src/lilypond/msrVarValAssocs.cpp | 367 - src/lilypond/msrVarValAssocs.h | 214 - src/lilypond/msrVoice2MasterVoiceCreator.cpp | 2009 -- src/lilypond/msrVoice2MasterVoiceCreator.h | 290 - src/lilypond/msrVoiceElements.cpp | 107 - src/lilypond/msrVoiceElements.h | 107 - src/lilypond/msrVoices.cpp | 9713 ------- src/lilypond/msrVoices_MUT_DEP.h | 1148 - src/lilypond/msrWords.cpp | 247 - src/lilypond/msrWords.h | 176 - src/lilypond/musicXMLOah.cpp | 967 - src/lilypond/musicXMLOah.h | 207 - src/lilypond/mxmlTree2MsrSkeletonBuilder.cpp | 4319 --- src/lilypond/mxmlTree2MsrSkeletonBuilder.h | 714 - src/lilypond/mxmlTree2MsrTranslator.cpp | 22536 ---------------- src/lilypond/mxmlTree2MsrTranslator.h | 1991 -- src/lilypond/oah2ManPageGenerators.cpp | 50 - src/lilypond/oah2ManPageGenerators.h | 49 - src/lilypond/oahBasicTypes.cpp | 11585 -------- src/lilypond/oahBasicTypes.h | 3309 --- src/lilypond/oahElements.cpp | 380 - src/lilypond/oahElements.h | 307 - src/lilypond/oahOah.cpp | 729 - src/lilypond/oahOah.h | 257 - src/lilypond/oahOah2ManPageGenerator.cpp | 92 - src/lilypond/oahOah2ManPageGenerator.h | 50 - src/lilypond/oahREADME.txt | 87 - src/lilypond/oahVisitor.cpp | 28 - src/lilypond/oahVisitor.h | 49 - src/lilypond/setExtraOahIfDesired.h | 21 - src/lilypond/setTraceOahIfDesired.h | 22 - src/lilypond/traceOah.cpp | 3774 --- src/lilypond/traceOah.h | 450 - src/lilypond/utilities.cpp | 1961 -- src/lilypond/utilities.h | 490 - src/lilypond/version.cpp | 101 - src/lilypond/version.h | 60 - src/lilypond/xml2brlManPageOah.cpp | 475 - src/lilypond/xml2brlManPageOah.h | 218 - src/lilypond/xml2brlOah.cpp | 869 - src/lilypond/xml2brlOah.h | 185 - src/lilypond/xml2brlOah2ManPageGenerator.cpp | 245 - src/lilypond/xml2brlOah2ManPageGenerator.h | 102 - src/lilypond/xml2brlOahTypes.cpp | 542 - src/lilypond/xml2brlOahTypes.h | 236 - src/lilypond/xml2ly.1 | 1075 - src/lilypond/xml2lyManPageOah.cpp | 475 - src/lilypond/xml2lyManPageOah.h | 219 - src/lilypond/xml2lyOah.cpp | 751 - src/lilypond/xml2lyOah.h | 177 - src/lilypond/xml2lyOah2ManPageGenerator.cpp | 246 - src/lilypond/xml2lyOah2ManPageGenerator.h | 102 - src/lilypond/xml2lyOahTypes.cpp | 536 - src/lilypond/xml2lyOahTypes.h | 230 - validation/Makefile | 219 +- 340 files changed, 7 insertions(+), 248381 deletions(-) delete mode 100644 src/interface/bsr2BrailleTranslatorInterface.cpp delete mode 100644 src/interface/bsr2BrailleTranslatorInterface.h delete mode 100644 src/interface/bsr2BsrFinalizerInterface.cpp delete mode 100644 src/interface/bsr2BsrFinalizerInterface.h delete mode 100644 src/interface/lpsr2LilypondInterface.cpp delete mode 100644 src/interface/lpsr2LilypondInterface.h delete mode 100644 src/interface/msr2BsrInterface.cpp delete mode 100644 src/interface/msr2BsrInterface.h delete mode 100644 src/interface/msr2LpsrInterface.cpp delete mode 100644 src/interface/msr2LpsrInterface.h delete mode 100644 src/interface/msrVoice2MasterInterface.cpp delete mode 100644 src/interface/msrVoice2MasterInterface.h delete mode 100644 src/interface/musicXML2MxmlTreeInterface.cpp delete mode 100644 src/interface/musicXML2MxmlTreeInterface.h delete mode 100644 src/interface/mxmlTree2MsrSkeletonBuilderInterface.cpp delete mode 100644 src/interface/mxmlTree2MsrSkeletonBuilderInterface.h delete mode 100644 src/interface/mxmlTree2MsrTranslatorInterface.cpp delete mode 100644 src/interface/mxmlTree2MsrTranslatorInterface.h delete mode 100644 src/lilypond/basicOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/basicOah2ManPageGenerator.h delete mode 100644 src/lilypond/brailleOah.cpp delete mode 100644 src/lilypond/brailleOah.h delete mode 100644 src/lilypond/brailleOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/brailleOah2ManPageGenerator.h delete mode 100644 src/lilypond/bsr.cpp delete mode 100644 src/lilypond/bsr.h delete mode 100644 src/lilypond/bsr2BrailleTranslator.cpp delete mode 100644 src/lilypond/bsr2BrailleTranslator.h delete mode 100644 src/lilypond/bsr2BsrFinalizer.cpp delete mode 100644 src/lilypond/bsr2BsrFinalizer.h delete mode 100644 src/lilypond/bsrBarlines.cpp delete mode 100644 src/lilypond/bsrBarlines_MUT_DEP.h delete mode 100644 src/lilypond/bsrBasicTypes.cpp delete mode 100644 src/lilypond/bsrBasicTypes.h delete mode 100644 src/lilypond/bsrBrailleCodeGenerators.cpp delete mode 100644 src/lilypond/bsrBrailleCodeGenerators.h delete mode 100644 src/lilypond/bsrCellsLists.cpp delete mode 100644 src/lilypond/bsrCellsLists.h delete mode 100644 src/lilypond/bsrClefs.cpp delete mode 100644 src/lilypond/bsrClefs_MUT_DEP.h delete mode 100644 src/lilypond/bsrDynamics.cpp delete mode 100644 src/lilypond/bsrDynamics_MUT_DEP.h delete mode 100644 src/lilypond/bsrElements.cpp delete mode 100644 src/lilypond/bsrElements.h delete mode 100644 src/lilypond/bsrFootNotes.cpp delete mode 100644 src/lilypond/bsrFootNotes_MUT_DEP.h delete mode 100644 src/lilypond/bsrKeys.cpp delete mode 100644 src/lilypond/bsrKeys_MUT_DEP.h delete mode 100644 src/lilypond/bsrLineElements.cpp delete mode 100644 src/lilypond/bsrLineElements_MUT_DEP.h delete mode 100644 src/lilypond/bsrLines.cpp delete mode 100644 src/lilypond/bsrLines_MUT_DEP.h delete mode 100644 src/lilypond/bsrMeasures.cpp delete mode 100644 src/lilypond/bsrMeasures_MUT_DEP.h delete mode 100644 src/lilypond/bsrMusicHeadings.cpp delete mode 100644 src/lilypond/bsrMusicHeadings_MUT_DEP.h delete mode 100644 src/lilypond/bsrMutualDependencies.h delete mode 100644 src/lilypond/bsrNotes.cpp delete mode 100644 src/lilypond/bsrNotes_MUT_DEP.h delete mode 100644 src/lilypond/bsrNumbers.cpp delete mode 100644 src/lilypond/bsrNumbers_MUT_DEP.h delete mode 100644 src/lilypond/bsrOah.cpp delete mode 100644 src/lilypond/bsrOah.h delete mode 100644 src/lilypond/bsrOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/bsrOah2ManPageGenerator.h delete mode 100644 src/lilypond/bsrPageElements.cpp delete mode 100644 src/lilypond/bsrPageElements_MUT_DEP.h delete mode 100644 src/lilypond/bsrPageHeadings.cpp delete mode 100644 src/lilypond/bsrPageHeadings_MUT_DEP.h delete mode 100644 src/lilypond/bsrPages.cpp delete mode 100644 src/lilypond/bsrPages_MUT_DEP.h delete mode 100644 src/lilypond/bsrPaginations.cpp delete mode 100644 src/lilypond/bsrPaginations_MUT_DEP.h delete mode 100644 src/lilypond/bsrParallels.cpp delete mode 100644 src/lilypond/bsrParallels.h delete mode 100644 src/lilypond/bsrScores.cpp delete mode 100644 src/lilypond/bsrScores.h delete mode 100644 src/lilypond/bsrSpaces.cpp delete mode 100644 src/lilypond/bsrSpaces_MUT_DEP.h delete mode 100644 src/lilypond/bsrTempos.cpp delete mode 100644 src/lilypond/bsrTempos_MUT_DEP.h delete mode 100644 src/lilypond/bsrTimes.cpp delete mode 100644 src/lilypond/bsrTimes_MUT_DEP.h delete mode 100644 src/lilypond/bsrTranscriptionNotes.cpp delete mode 100644 src/lilypond/bsrTranscriptionNotes.h delete mode 100644 src/lilypond/bsrWords.cpp delete mode 100644 src/lilypond/bsrWords_MUT_DEP.h delete mode 100644 src/lilypond/extraOah.cpp delete mode 100644 src/lilypond/extraOah.h delete mode 100644 src/lilypond/extraOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/extraOah2ManPageGenerator.h delete mode 100644 src/lilypond/generalOah.cpp delete mode 100644 src/lilypond/generalOah.h delete mode 100644 src/lilypond/lilypondOah.cpp delete mode 100644 src/lilypond/lilypondOah.h delete mode 100644 src/lilypond/lilypondOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/lilypondOah2ManPageGenerator.h delete mode 100644 src/lilypond/lpsr.cpp delete mode 100644 src/lilypond/lpsr.h delete mode 100644 src/lilypond/lpsr2LilypondTranslator.cpp delete mode 100644 src/lilypond/lpsr2LilypondTranslator.h delete mode 100644 src/lilypond/lpsrBarNumbers.cpp delete mode 100644 src/lilypond/lpsrBarNumbers.h delete mode 100644 src/lilypond/lpsrBasicTypes.cpp delete mode 100644 src/lilypond/lpsrBasicTypes.h delete mode 100644 src/lilypond/lpsrBookBlockElements.cpp delete mode 100644 src/lilypond/lpsrBookBlockElements.h delete mode 100644 src/lilypond/lpsrComments.cpp delete mode 100644 src/lilypond/lpsrComments.h delete mode 100644 src/lilypond/lpsrContexts.cpp delete mode 100644 src/lilypond/lpsrContexts.h delete mode 100644 src/lilypond/lpsrElements.cpp delete mode 100644 src/lilypond/lpsrElements.h delete mode 100644 src/lilypond/lpsrHeaders.cpp delete mode 100644 src/lilypond/lpsrHeaders.h delete mode 100644 src/lilypond/lpsrLayouts.cpp delete mode 100644 src/lilypond/lpsrLayouts.h delete mode 100644 src/lilypond/lpsrLyrics.cpp delete mode 100644 src/lilypond/lpsrLyrics.h delete mode 100644 src/lilypond/lpsrOah.cpp delete mode 100644 src/lilypond/lpsrOah.h delete mode 100644 src/lilypond/lpsrOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/lpsrOah2ManPageGenerator.h delete mode 100644 src/lilypond/lpsrPapers.cpp delete mode 100644 src/lilypond/lpsrPapers.h delete mode 100644 src/lilypond/lpsrParallelMusic.cpp delete mode 100644 src/lilypond/lpsrParallelMusic.h delete mode 100644 src/lilypond/lpsrPartGroups.cpp delete mode 100644 src/lilypond/lpsrPartGroups.h delete mode 100644 src/lilypond/lpsrParts.cpp delete mode 100644 src/lilypond/lpsrParts.h delete mode 100644 src/lilypond/lpsrScheme.cpp delete mode 100644 src/lilypond/lpsrScheme.h delete mode 100644 src/lilypond/lpsrScores.cpp delete mode 100644 src/lilypond/lpsrScores.h delete mode 100644 src/lilypond/lpsrStaves.cpp delete mode 100644 src/lilypond/lpsrStaves.h delete mode 100644 src/lilypond/lpsrVarValAssocs.cpp delete mode 100644 src/lilypond/lpsrVarValAssocs.h delete mode 100644 src/lilypond/lpsrVariables.cpp delete mode 100644 src/lilypond/lpsrVariables.h delete mode 100644 src/lilypond/lpsrVoices.cpp delete mode 100644 src/lilypond/lpsrVoices.h delete mode 100644 src/lilypond/messagesHandling.cpp delete mode 100644 src/lilypond/messagesHandling.h delete mode 100644 src/lilypond/msr.cpp delete mode 100644 src/lilypond/msr.h delete mode 100644 src/lilypond/msr2BsrTranslator.cpp delete mode 100644 src/lilypond/msr2BsrTranslator.h delete mode 100644 src/lilypond/msr2LpsrTranslator.cpp delete mode 100644 src/lilypond/msr2LpsrTranslator.h delete mode 100644 src/lilypond/msr2Names.cpp delete mode 100644 src/lilypond/msr2Names.h delete mode 100644 src/lilypond/msr2Summary.cpp delete mode 100644 src/lilypond/msr2Summary.h delete mode 100644 src/lilypond/msrAfterGraceNotes.cpp delete mode 100644 src/lilypond/msrAfterGraceNotes_MUT_DEP.h delete mode 100644 src/lilypond/msrArpeggiatos.cpp delete mode 100644 src/lilypond/msrArpeggiatos.h delete mode 100644 src/lilypond/msrArticulations.cpp delete mode 100644 src/lilypond/msrArticulations.h delete mode 100644 src/lilypond/msrBars.cpp delete mode 100644 src/lilypond/msrBars.h delete mode 100644 src/lilypond/msrBasicTypes.cpp delete mode 100644 src/lilypond/msrBasicTypes.h delete mode 100644 src/lilypond/msrBeams.cpp delete mode 100644 src/lilypond/msrBeams.h delete mode 100644 src/lilypond/msrBeatsRepeats.cpp delete mode 100644 src/lilypond/msrBeatsRepeats_MUT_DEP.h delete mode 100644 src/lilypond/msrBreaks.cpp delete mode 100644 src/lilypond/msrBreaks.h delete mode 100644 src/lilypond/msrChords.cpp delete mode 100644 src/lilypond/msrChords_MUT_DEP.h delete mode 100644 src/lilypond/msrClefs.cpp delete mode 100644 src/lilypond/msrClefs.h delete mode 100644 src/lilypond/msrCredits.cpp delete mode 100644 src/lilypond/msrCredits.h delete mode 100644 src/lilypond/msrDivisions.cpp delete mode 100644 src/lilypond/msrDivisions.h delete mode 100644 src/lilypond/msrDoubleTremolos.cpp delete mode 100644 src/lilypond/msrDoubleTremolos_MUT_DEP.h delete mode 100644 src/lilypond/msrDynamics.cpp delete mode 100644 src/lilypond/msrDynamics.h delete mode 100644 src/lilypond/msrElements.cpp delete mode 100644 src/lilypond/msrElements.h delete mode 100644 src/lilypond/msrFiguredBasses.cpp delete mode 100644 src/lilypond/msrFiguredBasses_MUT_DEP.h delete mode 100644 src/lilypond/msrGlissandos.cpp delete mode 100644 src/lilypond/msrGlissandos_MUT_DEP.h delete mode 100644 src/lilypond/msrGraceNotes.cpp delete mode 100644 src/lilypond/msrGraceNotes_MUT_DEP.h delete mode 100644 src/lilypond/msrHarmonies.cpp delete mode 100644 src/lilypond/msrHarmonies_MUT_DEP.h delete mode 100644 src/lilypond/msrIdentification.cpp delete mode 100644 src/lilypond/msrIdentification.h delete mode 100644 src/lilypond/msrInstruments.cpp delete mode 100644 src/lilypond/msrInstruments.h delete mode 100644 src/lilypond/msrKeys.cpp delete mode 100644 src/lilypond/msrKeys.h delete mode 100644 src/lilypond/msrLayouts.cpp delete mode 100644 src/lilypond/msrLayouts.h delete mode 100644 src/lilypond/msrLigatures.cpp delete mode 100644 src/lilypond/msrLigatures.h delete mode 100644 src/lilypond/msrMeasureElements.cpp delete mode 100644 src/lilypond/msrMeasureElements.h delete mode 100644 src/lilypond/msrMeasures.cpp delete mode 100644 src/lilypond/msrMeasuresRepeats.cpp delete mode 100644 src/lilypond/msrMeasuresRepeats_MUT_DEP.h delete mode 100644 src/lilypond/msrMeasures_MUT_DEP.h delete mode 100644 src/lilypond/msrMidi.cpp delete mode 100644 src/lilypond/msrMidi.h delete mode 100644 src/lilypond/msrMutualDependencies.h delete mode 100644 src/lilypond/msrNotes.cpp delete mode 100644 src/lilypond/msrNotes_MUT_DEP.h delete mode 100644 src/lilypond/msrOah.cpp delete mode 100644 src/lilypond/msrOah.h delete mode 100644 src/lilypond/msrOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/msrOah2ManPageGenerator.h delete mode 100644 src/lilypond/msrOrnaments.cpp delete mode 100644 src/lilypond/msrOrnaments_MUT_DEP.h delete mode 100644 src/lilypond/msrOtherElements.cpp delete mode 100644 src/lilypond/msrOtherElements.h delete mode 100644 src/lilypond/msrPartGroupElements.cpp delete mode 100644 src/lilypond/msrPartGroupElements.h delete mode 100644 src/lilypond/msrPartGroups.cpp delete mode 100644 src/lilypond/msrPartGroups.h delete mode 100644 src/lilypond/msrPartNamesDisplays.cpp delete mode 100644 src/lilypond/msrPartNamesDisplays.h delete mode 100644 src/lilypond/msrParts.cpp delete mode 100644 src/lilypond/msrParts_MUT_DEP.h delete mode 100644 src/lilypond/msrRehearsals.cpp delete mode 100644 src/lilypond/msrRehearsals.h delete mode 100644 src/lilypond/msrRepeatCodas.cpp delete mode 100644 src/lilypond/msrRepeatCodas_MUT_DEP.h delete mode 100644 src/lilypond/msrRepeats.cpp delete mode 100644 src/lilypond/msrRepeats_MUT_DEP.h delete mode 100644 src/lilypond/msrRestMeasures.cpp delete mode 100644 src/lilypond/msrRestMeasures_MUT_DEP.h delete mode 100644 src/lilypond/msrScaling.cpp delete mode 100644 src/lilypond/msrScaling.h delete mode 100644 src/lilypond/msrScores.cpp delete mode 100644 src/lilypond/msrScores.h delete mode 100644 src/lilypond/msrSegments.cpp delete mode 100644 src/lilypond/msrSegments_MUT_DEP.h delete mode 100644 src/lilypond/msrSingleTremolos.cpp delete mode 100644 src/lilypond/msrSingleTremolos.h delete mode 100644 src/lilypond/msrSlashes.cpp delete mode 100644 src/lilypond/msrSlashes.h delete mode 100644 src/lilypond/msrSlides.cpp delete mode 100644 src/lilypond/msrSlides_MUT_DEP.h delete mode 100644 src/lilypond/msrSlurs.cpp delete mode 100644 src/lilypond/msrSlurs.h delete mode 100644 src/lilypond/msrSpanners.cpp delete mode 100644 src/lilypond/msrSpanners_MUT_DEP.h delete mode 100644 src/lilypond/msrStanzas.cpp delete mode 100644 src/lilypond/msrStanzas_MUT_DEP.h delete mode 100644 src/lilypond/msrStaves.cpp delete mode 100644 src/lilypond/msrStavesDetails.cpp delete mode 100644 src/lilypond/msrStavesDetails.h delete mode 100644 src/lilypond/msrStaves_MUT_DEP.h delete mode 100644 src/lilypond/msrStems.cpp delete mode 100644 src/lilypond/msrStems.h delete mode 100644 src/lilypond/msrSyllables.cpp delete mode 100644 src/lilypond/msrSyllables_MUT_DEP.h delete mode 100644 src/lilypond/msrTablatures.cpp delete mode 100644 src/lilypond/msrTablatures.h delete mode 100644 src/lilypond/msrTechnicals.cpp delete mode 100644 src/lilypond/msrTechnicals.h delete mode 100644 src/lilypond/msrTempos.cpp delete mode 100644 src/lilypond/msrTempos.h delete mode 100644 src/lilypond/msrTies.cpp delete mode 100644 src/lilypond/msrTies.h delete mode 100644 src/lilypond/msrTimes.cpp delete mode 100644 src/lilypond/msrTimes.h delete mode 100644 src/lilypond/msrTranspositions.cpp delete mode 100644 src/lilypond/msrTranspositions.h delete mode 100644 src/lilypond/msrTupletElements.cpp delete mode 100644 src/lilypond/msrTupletElements.h delete mode 100644 src/lilypond/msrTuplets.cpp delete mode 100644 src/lilypond/msrTuplets_MUT_DEP.h delete mode 100644 src/lilypond/msrVarValAssocs.cpp delete mode 100644 src/lilypond/msrVarValAssocs.h delete mode 100644 src/lilypond/msrVoice2MasterVoiceCreator.cpp delete mode 100644 src/lilypond/msrVoice2MasterVoiceCreator.h delete mode 100644 src/lilypond/msrVoiceElements.cpp delete mode 100644 src/lilypond/msrVoiceElements.h delete mode 100644 src/lilypond/msrVoices.cpp delete mode 100644 src/lilypond/msrVoices_MUT_DEP.h delete mode 100644 src/lilypond/msrWords.cpp delete mode 100644 src/lilypond/msrWords.h delete mode 100644 src/lilypond/musicXMLOah.cpp delete mode 100644 src/lilypond/musicXMLOah.h delete mode 100644 src/lilypond/mxmlTree2MsrSkeletonBuilder.cpp delete mode 100644 src/lilypond/mxmlTree2MsrSkeletonBuilder.h delete mode 100644 src/lilypond/mxmlTree2MsrTranslator.cpp delete mode 100644 src/lilypond/mxmlTree2MsrTranslator.h delete mode 100644 src/lilypond/oah2ManPageGenerators.cpp delete mode 100644 src/lilypond/oah2ManPageGenerators.h delete mode 100644 src/lilypond/oahBasicTypes.cpp delete mode 100644 src/lilypond/oahBasicTypes.h delete mode 100644 src/lilypond/oahElements.cpp delete mode 100644 src/lilypond/oahElements.h delete mode 100644 src/lilypond/oahOah.cpp delete mode 100644 src/lilypond/oahOah.h delete mode 100644 src/lilypond/oahOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/oahOah2ManPageGenerator.h delete mode 100644 src/lilypond/oahREADME.txt delete mode 100644 src/lilypond/oahVisitor.cpp delete mode 100644 src/lilypond/oahVisitor.h delete mode 100644 src/lilypond/setExtraOahIfDesired.h delete mode 100644 src/lilypond/setTraceOahIfDesired.h delete mode 100644 src/lilypond/traceOah.cpp delete mode 100644 src/lilypond/traceOah.h delete mode 100644 src/lilypond/utilities.cpp delete mode 100644 src/lilypond/utilities.h delete mode 100644 src/lilypond/version.cpp delete mode 100644 src/lilypond/version.h delete mode 100644 src/lilypond/xml2brlManPageOah.cpp delete mode 100644 src/lilypond/xml2brlManPageOah.h delete mode 100644 src/lilypond/xml2brlOah.cpp delete mode 100644 src/lilypond/xml2brlOah.h delete mode 100644 src/lilypond/xml2brlOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/xml2brlOah2ManPageGenerator.h delete mode 100644 src/lilypond/xml2brlOahTypes.cpp delete mode 100644 src/lilypond/xml2brlOahTypes.h delete mode 100644 src/lilypond/xml2ly.1 delete mode 100644 src/lilypond/xml2lyManPageOah.cpp delete mode 100644 src/lilypond/xml2lyManPageOah.h delete mode 100644 src/lilypond/xml2lyOah.cpp delete mode 100644 src/lilypond/xml2lyOah.h delete mode 100644 src/lilypond/xml2lyOah2ManPageGenerator.cpp delete mode 100644 src/lilypond/xml2lyOah2ManPageGenerator.h delete mode 100644 src/lilypond/xml2lyOahTypes.cpp delete mode 100644 src/lilypond/xml2lyOahTypes.h diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index f2608af5e..a007508b0 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -28,9 +28,6 @@ get_filename_component(ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) ####################################### option ( FMWK "Generates a framework on MacOS by default" off ) -option ( GDB "Activates ggdb3 option" off ) -option ( LILY "Include lilypond part" on ) -option ( BRL "Include braille part" off ) option ( GENTOOLS "Generates tools" on ) option ( GENSTATIC "Generates the static library" on ) @@ -55,11 +52,7 @@ set (LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/lib) set (CMAKE_CXX_STANDARD 11) if(UNIX) - if (GDB) - add_definitions(-Wall -DGCC -ggdb3 -Wno-overloaded-virtual) - else() - add_definitions(-Wall -DGCC -O3 -Wno-overloaded-virtual) - endif() + add_definitions(-Wall -DGCC -O3 -Wno-overloaded-virtual) endif() @@ -95,9 +88,6 @@ endif() set (SRCDIR ${ROOT}/src) set (SAMPLEDIR ${ROOT}/samples) set (SRCFOLDERS factory files elements guido lib operations parser visitors) -if (LILY) - set (SRCFOLDERS ${SRCFOLDERS} interface lilypond) -endif() foreach(folder ${SRCFOLDERS}) set(SRC ${SRC} "${SRCDIR}/${folder}/*.cpp") # add source files @@ -107,12 +97,9 @@ foreach(folder ${SRCFOLDERS}) set(HEADERS ${HEADERS} "${SRCDIR}/${folder}/*.h") # add header files endforeach() -if (NOT LILY) - message (STATUS "Lilypond part is not included, use -DLILY=yes to change") - set(SRC ${SRC} "${SRCDIR}/interface/libmusicxml.cpp" "${SRCDIR}/interface/musicxml2guido.cpp") - set(HEADERS $HEADERS "${SRCDIR}/interface/libmusicxml.h" "${SRCDIR}/interface/musicxml2guido.h") - set (SRCFOLDERS ${SRCFOLDERS} interface) -endif() +set(SRC ${SRC} "${SRCDIR}/interface/libmusicxml.cpp" "${SRCDIR}/interface/musicxml2guido.cpp") +set(HEADERS $HEADERS "${SRCDIR}/interface/libmusicxml.h" "${SRCDIR}/interface/musicxml2guido.h") +set (SRCFOLDERS ${SRCFOLDERS} interface) file (GLOB CORESRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SRC}) file (GLOB COREH RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${HEADERS}) @@ -186,14 +173,6 @@ endif() # set sample targets set (SAMPLES xmlversion RandomMusic RandomChords xmlfactory partsummary xml2guido xmliter countnotes readunrolled xml2midi xmlread xmltranspose xmlclone) set (TOOLS xml2guido xmlread xmltranspose xmlversion) -if (LILY) - set (SAMPLES ${SAMPLES} xml2ly) - set (TOOLS ${TOOLS} xml2ly) -endif() -if (BRL) - set (SAMPLES ${SAMPLES} xml2brl) - set (TOOLS ${TOOLS} xml2brl) -endif() if (APPLE) set (LINKTO ${staticlib}) diff --git a/build/Makefile b/build/Makefile index 054c096ed..037aa28df 100644 --- a/build/Makefile +++ b/build/Makefile @@ -28,7 +28,7 @@ endif CMAKEOPT ?= -TOOLS := xml2midi xmlread xml2guido xml2ly xmlversion +TOOLS := xml2midi xmlread xml2guido xmlversion all : $(MAKE) libmusicxml diff --git a/samples/xmlversion.cpp b/samples/xmlversion.cpp index 0b983e9c9..e00efd12c 100644 --- a/samples/xmlversion.cpp +++ b/samples/xmlversion.cpp @@ -25,6 +25,5 @@ int main(int argc, char *argv[]) { cout << "libmusicxml version " << musicxmllibVersionStr() << endl; cout << "musicxml to guido converter version " << musicxml2guidoVersionStr() << endl; - cout << "musicxml to lilypond converter version " << musicxml2lilypondVersionStr() << endl; return 0; } diff --git a/src/interface/bsr2BrailleTranslatorInterface.cpp b/src/interface/bsr2BrailleTranslatorInterface.cpp deleted file mode 100644 index 03cd707f9..000000000 --- a/src/interface/bsr2BrailleTranslatorInterface.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "messagesHandling.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsr2BrailleTranslator.h" - -#include "bsr2BrailleTranslatorInterface.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -void generateBrailleCodeFromBsrScore ( - const S_bsrScore bScore, - S_bsrOah bsrOpts, - indentedOstream& logOstream, - ostream& brailleCodeOutputStream) -{ - // sanity check - msrAssert ( - bScore != 0, - "bScore is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - logOstream << - endl << - separator << - endl << - gTab << - "Pass 4: writing the BSR as Braille code" << - endl << - separator << - endl; - } -#endif - - // create an bsr2BrailleTranslator - bsr2BrailleTranslator - translator ( - bScore, - bsrOpts, - logOstream, - brailleCodeOutputStream); - -/* - const S_bsrScore bScore, - S_bsrOah bsrOpts, - indentedOstream& logOstream, - ostream& brailleCodeOutputStream); -*/ - - // build the Braille score - translator.generateBrailleCodeFromBsrScore (); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 4", - "translate BSR to Braille", - timingItem::kMandatory, - startClock, - endClock); -} - - -} diff --git a/src/interface/bsr2BrailleTranslatorInterface.h b/src/interface/bsr2BrailleTranslatorInterface.h deleted file mode 100644 index 5bfa080e7..000000000 --- a/src/interface/bsr2BrailleTranslatorInterface.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __bsr2BrailleTranslatorInterface__ -#define __bsr2BrailleTranslatorInterface__ - - -#include "bsr.h" -#include "exports.h" - -#include "msrOah.h" -#include "bsrOah.h" - - -namespace MusicXML2 -{ - -/*! -\addtogroup Converting MSR to BSR format - -The library includes a high level API to convert - from the MusicXML format to the BSR - (Braille Score Representation) format. -@{ -*/ - -//______________________________________________________________________________ -EXP void generateBrailleCodeFromBsrScore ( - const S_bsrScore bScore, - S_bsrOah bsrOpts, - indentedOstream& logOstream, - ostream& brailleCodeOutputStream); - -/*! @} */ - -//#ifdef __cplusplus -//} -//#endif - -} // namespace MusicXML2 - - -#endif diff --git a/src/interface/bsr2BsrFinalizerInterface.cpp b/src/interface/bsr2BsrFinalizerInterface.cpp deleted file mode 100644 index d135f4b9b..000000000 --- a/src/interface/bsr2BsrFinalizerInterface.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "messagesHandling.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsr2BsrFinalizer.h" - -#include "bsr2BsrFinalizerInterface.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_bsrScore generateFinalizedBsrScoreFromBsrScore ( - const S_bsrScore bScore, - S_bsrOah bsrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - bScore != 0, - "bScore is null"); - - S_bsrScore result; - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - logOstream << - endl << - separator << - endl << - gTab << - "Pass 3b: finalizing the BSR as a new BSR" << - endl << - separator << - endl; - } -#endif - - // create an bsr2BsrFinalizer - bsr2BsrFinalizer - translator ( - bsrOpts, - logOstream, - bScore); - - // build the finalized BSR score - translator.generateFinalizedBsrScoreFromBsrScore (); - logOstream << endl; - - // get the result - result = translator.getBsrScore (); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 3b", - "finalize BSR as a new BSR", - timingItem::kMandatory, - startClock, - endClock); - - return result; -} - -//_______________________________________________________________________________ -void displayFinalizedBsrScore ( - const S_bsrScore bScore, - S_msrOah msrOpts, - S_bsrOah bsrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - bScore != 0, - "bScore is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - - logOstream << - separator << - endl << - gTab << - "Optional pass: displaying the finalized BSR as text" << - endl << - separator << - endl << - bScore << - separator << - endl << - endl; - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display the finalized BSR", - timingItem::kOptional, - startClock, - endClock); -} - - -} diff --git a/src/interface/bsr2BsrFinalizerInterface.h b/src/interface/bsr2BsrFinalizerInterface.h deleted file mode 100644 index 02acb774d..000000000 --- a/src/interface/bsr2BsrFinalizerInterface.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __bsr2BsrFinalizerInterface__ -#define __bsr2BsrFinalizerInterface__ - - -#include "bsr.h" -#include "exports.h" - -#include "msrOah.h" -#include "bsrOah.h" - - -namespace MusicXML2 -{ - -/*! -\addtogroup Converting MSR to BSR format - -The library includes a high level API to convert - from the MusicXML format to the BSR - (Braille Score Representation) format. -@{ -*/ - -//______________________________________________________________________________ -EXP S_bsrScore generateFinalizedBsrScoreFromBsrScore ( - const S_bsrScore bScore, - S_bsrOah bsrOpts, - indentedOstream& logOstream); - -//_______________________________________________________________________________ -EXP void displayFinalizedBsrScore ( - const S_bsrScore bScore, - S_msrOah msrOpts, - S_bsrOah bsrOpts, - indentedOstream& logOstream); - -/*! @} */ - -//#ifdef __cplusplus -//} -//#endif - -} // namespace MusicXML2 - - -#endif diff --git a/src/interface/libmusicxml.cpp b/src/interface/libmusicxml.cpp index 6befd6aeb..bc5aeb280 100644 --- a/src/interface/libmusicxml.cpp +++ b/src/interface/libmusicxml.cpp @@ -24,10 +24,6 @@ EXP float musicxmllibVersion() { return versions::libVersion(); } EXP const char* musicxmllibVersionStr() { return versions::libVersionStr(); } EXP float musicxml2guidoVersion() { return versions::xml2guidoVersion(); } EXP const char* musicxml2guidoVersionStr() { return versions::xml2guidoVersionStr(); } -EXP float musicxml2lilypondVersion() { return versions::xml2lilypondVersion(); } -EXP const char* musicxml2lilypondVersionStr() { return versions::xml2lilypondVersionStr(); } -EXP float musicxml2brailleVersion() { return versions::xml2brailleVersion(); } -EXP const char* musicxml2brailleVersionStr() { return versions::xml2brailleVersionStr(); } //EXP int musicxml2antescofoVersion() { return versions::xml2antescofoVersion(); } //EXP const char* musicxml2antescofoVersionStr() { return versions::xml2antescofoVersionStr(); } diff --git a/src/interface/libmusicxml.h b/src/interface/libmusicxml.h index 667876716..adc3b656f 100644 --- a/src/interface/libmusicxml.h +++ b/src/interface/libmusicxml.h @@ -72,28 +72,6 @@ EXP float musicxml2guidoVersion(); */ EXP const char* musicxml2guidoVersionStr(); -/*! - \brief Gives the LilyPond converter version number. - \return a version number as a float value -*/ -EXP float musicxml2lilypondVersion(); -/*! - \brief Gives the LilyPond converter version as a string. - \return a string -*/ -EXP const char* musicxml2lilypondVersionStr(); - -/*! - \brief Gives the Braille converter version number. - \return a version number as a float value -*/ -EXP float musicxml2brailleVersion(); -/*! - \brief Gives the LilyPond converter version as a string. - \return a string -*/ -EXP const char* musicxml2brailleVersionStr(); - /*! \brief Converts a MusicXML representation to the Guido format. \param file a file name diff --git a/src/interface/lpsr2LilypondInterface.cpp b/src/interface/lpsr2LilypondInterface.cpp deleted file mode 100644 index 200227662..000000000 --- a/src/interface/lpsr2LilypondInterface.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "messagesHandling.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "lpsr2LilypondTranslator.h" - -#include "lpsr2LilypondInterface.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -void generateLilypondCodeFromLpsrScore ( - const S_lpsrScore lpScore, - S_msrOah msrOpts, - S_lpsrOah lpsrOpts, - indentedOstream& logOstream, - indentedOstream& lilypondCodeOstream) -{ - // sanity check - msrAssert ( - lpScore != 0, - "lpScore is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - logOstream << - endl << - separator << - endl << - gTab << - "Pass 4: writing the LPSR as LilyPond code" << - endl << - separator << - endl; - } -#endif - - // create an lpsr2LilypondTranslator - lpsr2LilypondTranslator - translator ( - lpScore, - msrOpts, - lpsrOpts, - logOstream, - lilypondCodeOstream); - - // build the LilyPond score - translator.generateLilypondCodeFromLpsrScore (); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 4", - "translate LPSR to LilyPond", - timingItem::kMandatory, - startClock, - endClock); -} - - -} diff --git a/src/interface/lpsr2LilypondInterface.h b/src/interface/lpsr2LilypondInterface.h deleted file mode 100644 index 4abcba542..000000000 --- a/src/interface/lpsr2LilypondInterface.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __lpsr2LilypondInterfact__ -#define __lpsr2LilypondInterfact__ - - -#include "lpsr.h" -#include "exports.h" - - -namespace MusicXML2 -{ - -//#ifdef __cplusplus -//extern "C" { -//#endif - -/*! -\addtogroup Converting MSR to LPSR format - -The library includes a high level API to convert - from the MusicXML format to the MSR - (Music Score Representation) format. -@{ -*/ - -//______________________________________________________________________________ -EXP void generateLilypondCodeFromLpsrScore ( - const S_lpsrScore lpScore, - S_msrOah msrOpts, - S_lpsrOah lpsrOpts, - indentedOstream& logOstream, - indentedOstream& lilypondCodeOstream); - -/*! @} */ - -//#ifdef __cplusplus -//} -//#endif - -} // namespace MusicXML2 - - -#endif diff --git a/src/interface/msr2BsrInterface.cpp b/src/interface/msr2BsrInterface.cpp deleted file mode 100644 index 5930f7522..000000000 --- a/src/interface/msr2BsrInterface.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include - -#include "xml.h" -#include "xmlfile.h" -#include "xmlreader.h" - -#include "versions.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msr2BsrInterface.h" - -#include "msr2BsrTranslator.h" - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_bsrScore buildBsrScoreFromMsrScore ( - const S_msrScore mScore, - S_msrOah msrOpts, - S_bsrOah bsrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mScore != 0, - "mScore is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 3a: translating the MSR into a BSR" << - endl << - separator << - endl; - } -#endif - - // create an msr2BsrTranslator - msr2BsrTranslator - translator ( - logOstream, - mScore); - - // build the BSR score - translator.buildBsrScoreFromMsrScore (); - logOstream << endl; - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 3a", - "translate MSR to BSR", - timingItem::kMandatory, - startClock, - endClock); - - // get the BSR score - S_bsrScore - bScore = - translator.getBsrScore (); - - // return it - return bScore; -} - -//_______________________________________________________________________________ -void displayFirstBsrScore ( - const S_bsrScore bScore, - S_msrOah msrOpts, - S_bsrOah bsrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - bScore != 0, - "bScore is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - - logOstream << - separator << - endl << - gTab << - "Optional pass: displaying the first BSR as text" << - endl << - separator << - endl << - endl << - bScore << - separator << - endl << - endl; - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display the first BSR", - timingItem::kOptional, - startClock, - endClock); -} - - -} diff --git a/src/interface/msr2BsrInterface.h b/src/interface/msr2BsrInterface.h deleted file mode 100644 index cc3ff686e..000000000 --- a/src/interface/msr2BsrInterface.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __msr2BsrInterface__ -#define __msr2BsrInterface__ - - -#include "bsr.h" -#include "exports.h" - -#include "generalOah.h" -#include "msrOah.h" -#include "bsrOah.h" - - -namespace MusicXML2 -{ - -/*! -\addtogroup Converting MSR to BSR format - -The library includes a high level API to convert - from the MusicXML format to the MSR - (Music Score Representation) format. -@{ -*/ - -//______________________________________________________________________________ -EXP S_bsrScore buildBsrScoreFromMsrScore ( - const S_msrScore mScore, - S_msrOah msrOpts, - S_bsrOah bsrOpts, - indentedOstream& logOstream); - -//_______________________________________________________________________________ -EXP void displayFirstBsrScore ( - const S_bsrScore bScore, - S_msrOah msrOpts, - S_bsrOah bsrOpts, - indentedOstream& logOstream); - -/*! @} */ - - -} // namespace MusicXML2 - - -#endif diff --git a/src/interface/msr2LpsrInterface.cpp b/src/interface/msr2LpsrInterface.cpp deleted file mode 100644 index dcd548dfb..000000000 --- a/src/interface/msr2LpsrInterface.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include - -#include "xml.h" -#include "xmlfile.h" -#include "xmlreader.h" - -#include "versions.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msr2LpsrInterface.h" - -#include "msr2LpsrTranslator.h" - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_lpsrScore buildLpsrScoreFromMsrScore ( - const S_msrScore mScore, - S_msrOah msrOpts, - S_lpsrOah lpsrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mScore != 0, - "mScore is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 3: translating the MSR into a LPSR" << - endl << - separator << - endl; - } -#endif - - // create an msr2LpsrTranslator - msr2LpsrTranslator - translator ( - logOstream, - mScore); - - // build the LPSR score - translator.buildLpsrScoreFromMsrScore (); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 3", - "translate MSR to LPSR", - timingItem::kMandatory, - startClock, - endClock); - - // get the LPSR score - S_lpsrScore - lpScore = - translator.getLpsrScore (); - - // return it - return lpScore; -} - -//_______________________________________________________________________________ -void displayLpsrScore ( - const S_lpsrScore lpScore, - S_msrOah msrOpts, - S_lpsrOah lpsrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - lpScore != 0, - "lpScore is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - - logOstream << - separator << - endl << - gTab << - "Optional pass: displaying the LPSR as text" << - endl << - separator << - endl << - endl << - lpScore << - separator << - endl << - endl; - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display the LPSR", - timingItem::kOptional, - startClock, - endClock); -} - - -} diff --git a/src/interface/msr2LpsrInterface.h b/src/interface/msr2LpsrInterface.h deleted file mode 100644 index c9f8b9774..000000000 --- a/src/interface/msr2LpsrInterface.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __msr2LpsrInterface__ -#define __msr2LpsrInterface__ - - -#include "generalOah.h" -#include "msrOah.h" -#include "lpsrOah.h" - -#include "lpsr.h" -#include "exports.h" - - -namespace MusicXML2 -{ - -//#ifdef __cplusplus -//extern "C" { -//#endif - -/*! -\addtogroup Converting MSR to LPSR format - -The library includes a high level API to convert - from the MusicXML format to the MSR - (Music Score Representation) format. -@{ -*/ - -//______________________________________________________________________________ -EXP S_lpsrScore buildLpsrScoreFromMsrScore ( - const S_msrScore mScore, - S_msrOah msrOpts, - S_lpsrOah lpsrOpts, - indentedOstream& logOstream); - -//_______________________________________________________________________________ -EXP void displayLpsrScore ( - const S_lpsrScore lpScore, - S_msrOah msrOpts, - S_lpsrOah lpsrOpts, - indentedOstream& logOstream); - -/*! @} */ - -//#ifdef __cplusplus -//} -//#endif - -} // namespace MusicXML2 - - -#endif diff --git a/src/interface/msrVoice2MasterInterface.cpp b/src/interface/msrVoice2MasterInterface.cpp deleted file mode 100644 index f4013a1ca..000000000 --- a/src/interface/msrVoice2MasterInterface.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include - -#include "xml.h" -#include "xmlfile.h" -#include "xmlreader.h" - -#include "versions.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msr2LpsrInterface.h" - -#include "msrVoice2MasterVoiceCreator.h" - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_msrVoice buildMsrMasterFromMsrVoice ( - const S_msrVoice mVoice, - S_msrOah msrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mVoice != 0, - "mVoice is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 2c: creating a master voice from voice \"" << - mVoice->asShortString () << - "\"" << - endl << - separator << - endl; - } -#endif - - // create an msrVoice2Master - msrVoice2MasterVoiceCreator - creator ( - logOstream, - mVoice); - - // build the LPSR score - creator.buildMsrMasterFromMsrVoice (); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 2c", - "create master voice", - timingItem::kOptional, - startClock, - endClock); - - // get the master score - S_msrVoice - masterVoice = - creator.getMasterVoice (); - - // return it - return masterVoice; -} - -//_______________________________________________________________________________ -void displayMsrMasterVoice ( - const S_msrVoice masterVoice, - S_msrOah msrOpts, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - masterVoice != 0, - "masterVoice is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - - logOstream << - separator << - endl << - gTab << - "Optional pass: displaying master voice \"" << - masterVoice->asShortString () << - "\" as text" << - endl << - separator << - endl << - endl << - masterVoice << - separator << - endl << - endl; - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display the master voice", - timingItem::kOptional, - startClock, - endClock); -} - - -} diff --git a/src/interface/msrVoice2MasterInterface.h b/src/interface/msrVoice2MasterInterface.h deleted file mode 100644 index 568d80c7a..000000000 --- a/src/interface/msrVoice2MasterInterface.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __msr2LpsrInterface__ -#define __msr2LpsrInterface__ - - -#include "generalOah.h" -#include "msrOah.h" -#include "lpsrOah.h" - -#include "lpsr.h" -#include "exports.h" - - -namespace MusicXML2 -{ - -//#ifdef __cplusplus -//extern "C" { -//#endif - -/*! -\addtogroup Converting MSR to LPSR format - -The library includes a high level API to convert - from the MusicXML format to the MSR - (Music Score Representation) format. -@{ -*/ - -//______________________________________________________________________________ -EXP S_msrVoice buildMsrMasterFromMsrVoice ( - const S_msrVoice mVoice, - S_msrOah msrOpts, - indentedOstream& logOstream); - -//_______________________________________________________________________________ -EXP void displayMsrMasterVoice ( - const S_msrVoice masterVoice, - S_msrOah msrOpts, - indentedOstream& logOstream); - -/*! @} */ - -//#ifdef __cplusplus -//} -//#endif - -} // namespace MusicXML2 - - -#endif diff --git a/src/interface/musicXML2MxmlTreeInterface.cpp b/src/interface/musicXML2MxmlTreeInterface.cpp deleted file mode 100644 index 5942e93ab..000000000 --- a/src/interface/musicXML2MxmlTreeInterface.cpp +++ /dev/null @@ -1,763 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // for strlen() -#include - -#include // for setw() - -#include "xml.h" -#include "xmlfile.h" -#include "xmlreader.h" - -#include "messagesHandling.h" - -#include "musicXML2MxmlTreeInterface.h" - -#include "oahOah.h" -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -void displayXMLDeclaration ( - TXMLDecl* xmlDeclaration, - indentedOstream& logOstream) -{ - string xmlVersion = xmlDeclaration->getVersion (); - string xmlEncoding = xmlDeclaration->getEncoding (); - int xmlStandalone = xmlDeclaration->getStandalone (); - - const int fieldWidth = 14; - - logOstream << - "XML Declaration:" << - endl; - - gIndenter++; - - logOstream << left << - setw (fieldWidth) << - "xmlVersion" << " = \"" << xmlVersion << "\"" << - endl << - setw (fieldWidth) << - "xmlEncoding" << " = \"" << xmlEncoding << "\"" << - endl << - setw (fieldWidth) << - "xmlStandalone" << " = \"" << xmlStandalone << "\"" << - endl << - endl; - - gIndenter--; -} - -//_______________________________________________________________________________ -void displayDocumentType ( - TDocType* documentType, - indentedOstream& logOstream) -{ - const int fieldWidth = 16; - - logOstream << - "Document Type:" << - endl; - - gIndenter++; - - std::string xmlStartElement = documentType->getStartElement (); - bool xmlPublic = documentType->getPublic (); - std::string xmlPubLitteral = documentType->getPubLitteral (); - std::string xmlSysLitteral = documentType->getSysLitteral (); - - logOstream << left << - setw (fieldWidth) << - "xmlStartElement" << " = \"" << xmlStartElement << "\"" << - endl << - setw (fieldWidth) << - "xmlPublic" << " = \"" << xmlPublic << "\"" << - endl << - setw (fieldWidth) << - "xmlPubLitteral" << " = \"" << xmlPubLitteral << "\"" << - endl << - setw (fieldWidth) << - "xmlSysLitteral" << " = \"" << xmlSysLitteral << "\"" << - endl << - endl; - - gIndenter--; -} - -//_______________________________________________________________________________ -string uncompressMXLFile ( - string mxlFileName, - indentedOstream& logOstream) -{ - string fileBaseName = baseName (mxlFileName); - - logOstream << - "The compressed file name is '" << - mxlFileName << - "'" << - endl << - endl; - - string uncompressedFileName; - -#ifdef WIN32 - // JMI -#else - { - // build shell command to list the contents of the uncompress file - stringstream s1; - - s1 << - "unzip -l " << - mxlFileName; - - string listContentsShellCommand = s1.str (); - - if (true) { - logOstream << - "Listing the contents of the compressed file '" << - mxlFileName << - "' with command:" << - endl; - - gIndenter++; - - logOstream << - listContentsShellCommand << - endl << - endl; - - gIndenter--; - } - - // create a stream to receive the result of listContentsShellCommand - FILE* inputStream = - popen ( - listContentsShellCommand.c_str (), - "r"); - - if (inputStream == nullptr) { - stringstream s; - - s << - "Cannot list the contents of compressed file '" << - mxlFileName << - "' with 'popen ()'"; - - msrInternalError ( - gOahOah->fInputSourceName, - 0, // inputLineNumber - __FILE__, __LINE__, - s.str ()); - } - - else { - string contentsList; - - // read the list from inputStream - char tampon [1024]; - - while ( - ! feof (inputStream) - && - ! ferror (inputStream) - && - fgets (tampon, sizeof (tampon), inputStream) != NULL - ) { - // append the contents of tampon to contentsList - contentsList += tampon; - } // while - // terminate the string in tampon - tampon [strlen (tampon) -1] = '\0'; - - // close the stream - if (pclose (inputStream) < 0) { - msrInternalError ( - gOahOah->fInputSourceName, - 0, // inputLineNumber - __FILE__, __LINE__, - "Cannot close the input stream after 'popen ()'"); - } - - logOstream << - "The contents of the compressed file '" << - mxlFileName << - "' is:" << - endl; - - gIndenter++; - - logOstream << - contentsList << - endl; - - gIndenter--; - - // analyze the contents list - list linesList; - - istringstream inputStream (contentsList); - string currentLine; - - while (getline (inputStream, currentLine)) { - - if (inputStream.eof ()) break; - -#ifdef TRACE_OAH - { - logOstream << - "*** currentLine:" << - endl; - - gIndenter++; - - logOstream << - currentLine << - endl; - - gIndenter--; - } -#endif - - /* - user@lilydev: ~/libmusicxml-git/files/samples/musicxml > unzip -l UnofficialTestSuite/90a-Compressed-MusicXML.mxl - Archive: UnofficialTestSuite/90a-Compressed-MusicXML.mxl - Length Date Time Name - --------- ---------- ----- ---- - 0 2007-11-14 16:04 META-INF/ - 246 2007-11-14 16:02 META-INF/container.xml - 2494 2008-11-14 23:03 20a-Compressed-MusicXML.xml - 30903 2007-11-14 15:51 20a-Compressed-MusicXML.pdf - --------- ------- - 33643 4 files - */ - - string regularExpression ( - "[[:space:]]*" - ".*" // length - "[[:space:]]+" - ".*" // date - "[[:space:]]+" - ".*" // time - "[[:space:]]+" - "(.*)" // name - ); - - regex e (regularExpression); - smatch sm; - - regex_match (currentLine, sm, e); - - if (sm.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { // JMI ??? - logOstream << - "There are " << sm.size () - 1 << " match(es) " << - "with regex '" << regularExpression << - "':" << - endl; - - for (unsigned i = 1; i < sm.size (); ++i) { - logOstream << - "[" << sm [i] << "] " << - endl; - } // for - - logOstream << - endl << - endl; - } -#endif - - string stringFromLine = sm [1]; - - // has stringFromLine a ".xml" suffix? - size_t - posInString = - stringFromLine.rfind (".xml"); - - // JMI if (posInString == stringFromLine.size () - 4) { - if (posInString != stringFromLine.npos) { // JMI STRANGISSIMO!!! - // if (posInString != stringFromLine.npos && stringFromLine != "files") { // JMI STRANGISSIMO!!! - // yes, this is a MusicXML file - - // is this file part of META-INF? - size_t - posInString = - stringFromLine.find ("META-INF"); - - if (posInString == stringFromLine.npos) { - // no, this is an actual MusicXML file - - if (uncompressedFileName.size ()) { - stringstream s; - - s << - "Compressed file '" << mxlFileName << - "' contains multiple MusicMXL files" << - ", found '" << uncompressedFileName << - "' and then '" << stringFromLine << "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - 0, // inputLineNumber - __FILE__, __LINE__, - s.str ()); - } - - else { - // we've got the uncompressed file name - uncompressedFileName = stringFromLine; - - logOstream << - "The uncompressed file name is '" << - uncompressedFileName << - "'" << - endl << - endl; - } - } - } - } - } // while - } - } - - { - // build shell command to uncompress the file - stringstream s2; - - s2 << - "unzip -u -d /tmp " << - mxlFileName; - - string uncompressShellCommand = s2.str (); - - if (true) { - logOstream << - "Uncompressing '" << - mxlFileName << - "' into '/tmp/" << - uncompressedFileName << - "' with command:" << - endl; - - gIndenter++; - - logOstream << - uncompressShellCommand << - endl << - endl; - - gIndenter--; - } - - // create a stream to receive the result of uncompressShellCommand - FILE* inputStream = - popen ( - uncompressShellCommand.c_str (), - "r"); - - if (inputStream == nullptr) { - stringstream s; - - s << - "Cannot uncompress the file '" << - mxlFileName << - "' with 'popen ()'"; - - msrInternalError ( - gOahOah->fInputSourceName, - 0, // inputLineNumber - __FILE__, __LINE__, - s.str ()); - } - } -#endif - - return uncompressedFileName; -} - -//_______________________________________________________________________________ -EXP Sxmlelement musicXMLFile2mxmlTree ( - const char* fileName, - S_musicXMLOah mxmlOpts, - indentedOstream& logOstream) -{ - clock_t startClock = clock (); - - string fileNameAsString = fileName; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 1: building the xmlelement tree from \"" << fileNameAsString << "\"" << - endl << - separator << - endl << - endl; - } -#endif - - // has the input file name a ".mxl" suffix? - size_t - posInString = - fileNameAsString.rfind (".mxl"); - - if (posInString == fileNameAsString.size () - 4) { - // JMI if (posInString != fileNameAsString.npos) { - // yes, this is a compressed file - - /* JMI OS dependent - string uncompressedFileName = - uncompressMXLFile ( - fileNameAsString, - logOstream); - - // the incompressed file in /tmp will be handled - // instead of the compressed one - fileName = uncompressedFileName.c_str (); - */ - - stringstream s; - - s << - "you should uncompress this file prior to running xml2ly"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - 1, // inputLineNumber, - __FILE__, __LINE__, - s.str ()); - - exit (38); - } - - // read the input MusicXML data from the file - xmlreader r; - - SXMLFile xmlFile = r.read (fileName); - - // has there been a problem? - if (! xmlFile) { - return Sxmlelement (0); - } - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceEncoding) { - logOstream << - endl << - "!!!!! xmlFile contents from file:" << - endl << - endl; - - xmlFile->print (logOstream); - - logOstream << - endl << - endl; - } -#endif - - // get the xmlDecl - TXMLDecl * xmlDecl = xmlFile->getXMLDecl (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceEncoding) { - logOstream << - endl << - "!!!!! xmlDecl contents from file:" << - endl << - endl; - xmlDecl->print (logOstream); - - displayXMLDeclaration ( - xmlDecl, - logOstream); - } -#endif - -#ifdef TRACE_OAH - // get the docType - TDocType * docType = xmlFile->getDocType (); - - if (gMusicXMLOah->fTraceEncoding) { - logOstream << - endl << - "!!!!! docType from file:" << - endl << - endl; - docType->print (logOstream); - - displayDocumentType ( - docType, - logOstream); - } -#endif - - // get the encoding type - string encoding = xmlDecl->getEncoding (); - - // build the xmlelement tree - Sxmlelement mxmlTree; - - // should the encoding be converted to UTF-8? - string desiredEncoding = "UTF-8"; - - if (encoding == desiredEncoding) { -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - logOstream << - "% MusicXML data uses \"" << - desiredEncoding << - "\" encoding" << - endl; - } -#endif - } - - else if (encoding.size () == 0) { - stringstream s; - - s << - "MusicXML data in this file" << - " doesn't contain any encoding specification; assuming it is UTF-8"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - 1, // inputLineNumber, - s.str ()); - } - - else { - stringstream s; - - s << - "you should convert this file to " << - desiredEncoding << - "\" encoding prior to running xml2ly" << - ", for example with iconv or using a text editor - handling it as is"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - 1, // inputLineNumber, - s.str ()); - } - - mxmlTree = xmlFile->elements (); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 1", - "build xmlelement tree from file", - timingItem::kMandatory, - startClock, - endClock); - - return mxmlTree; -} - -//_______________________________________________________________________________ -EXP Sxmlelement musicXMLFd2mxmlTree ( - FILE* fd, - S_musicXMLOah mxmlOpts, - indentedOstream& logOstream) -{ - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 1: building the xmlelement tree from standard input" << - endl << - separator << - endl; - } -#endif - - // read the input MusicXML data - xmlreader r; - - SXMLFile xmlFile = r.read (fd); - - // has there been a problem? - if (! xmlFile) { - return Sxmlelement (0); - } - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceEncoding) { - logOstream << - "!!!!! xmlFile contents from stream:" << - endl; - xmlFile->print (logOstream); - logOstream << endl; - } -#endif - - // get the xmlDecl - TXMLDecl *xmlDecl = xmlFile->getXMLDecl (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceEncoding) { - logOstream << - endl << - "xmlDecl contents:" << - endl << - endl; - xmlDecl->print (logOstream); - - displayXMLDeclaration ( - xmlDecl, - logOstream); - } -#endif - -#ifdef TRACE_OAH - // get the docType - TDocType * docType = xmlFile->getDocType (); - - if (gMusicXMLOah->fTraceEncoding) { - logOstream << - endl << - "!!!!! docType from stream:" << - endl << - endl; - docType->print (logOstream); - - displayDocumentType ( - docType, - logOstream); - } -#endif - - // get the encoding type - string encoding = xmlDecl->getEncoding (); - - // should the encoding be converted to UTF-8? - string desiredEncoding = "UTF-8"; - - logOstream << - "% MusicXML data uses \"" << - desiredEncoding << - "\" encoding" << - ", desired encoding is \"" << desiredEncoding << "\"" << - endl; - - if (encoding != desiredEncoding) { - stringstream s; - - s << - "you should convert this stream to " << - desiredEncoding << - "\" encoding prior to running xml2ly" << - ", for example with iconv or using a text editor - handling it as is"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - 1, // inputLineNumber, - s.str ()); - } - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 1", - "build xmlelement tree from standard input", - timingItem::kMandatory, - startClock, - endClock); - - // fetch mxmlTree - Sxmlelement mxmlTree = xmlFile->elements (); - - return mxmlTree; -} - -//_______________________________________________________________________________ -EXP Sxmlelement musicXMLString2mxmlTree ( - const char* buffer, - S_musicXMLOah mxmlOpts, - indentedOstream& logOstream) -{ - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 1: building the xmlelement tree from a buffer" << - endl << - separator << - endl; - } -#endif - - xmlreader r; - - SXMLFile xmlFile = r.readbuff (buffer); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 1", - "build xmlelement tree from buffer", - timingItem::kMandatory, - startClock, - endClock); - - // fetch mxmlTree - Sxmlelement mxmlTree = xmlFile->elements(); - - return mxmlTree; -} - - -} // namespace diff --git a/src/interface/musicXML2MxmlTreeInterface.h b/src/interface/musicXML2MxmlTreeInterface.h deleted file mode 100644 index da695f6c5..000000000 --- a/src/interface/musicXML2MxmlTreeInterface.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __musicXML2mxmlTreeInterface__ -#define __musicXML2mxmlTreeInterface__ - -#include "typedefs.h" - -#include "musicXMLOah.h" - - -namespace MusicXML2 -{ - -/*! -\addtogroup mxmltree2Msr -@{ -*/ - -//______________________________________________________________________________ -/*! - \brief Converts a MusicXML representation to an MSR. - \param file a file name - \param msrOpts the MSR options to be used - \param out the output stream - \return an error code (\c kNoErr when success) -*/ -EXP Sxmlelement musicXMLFile2mxmlTree ( - const char* fileName, - S_musicXMLOah mxmlOpts, - indentedOstream& logOstream); - -//______________________________________________________________________________ -/*! - \brief Converts a MusicXML representation to an MSR. - \param fd a file descriptor - \param msrOpts the MSR options to be used - \param out the output stream - \return an error code (\c kNoErr when success) -*/ - -EXP Sxmlelement musicXMLFd2mxmlTree ( - FILE* fd, - S_musicXMLOah mxmlOpts, - indentedOstream& logOstream); - -//______________________________________________________________________________ -/*! - \brief Converts a MusicXML representation to an MSR. - \param buff a string containing MusicXML code - \param msrOpts the MSR options to be used - \param out the output stream - \return an error code (\c kNoErr when success) -*/ -EXP Sxmlelement musicXMLString2mxmlTree ( - const char* buffer, - S_musicXMLOah mxmlOpts, - indentedOstream& logOstream); - - -/*! @} */ - -} - -#endif diff --git a/src/interface/mxmlTree2MsrSkeletonBuilderInterface.cpp b/src/interface/mxmlTree2MsrSkeletonBuilderInterface.cpp deleted file mode 100644 index 991b7792f..000000000 --- a/src/interface/mxmlTree2MsrSkeletonBuilderInterface.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include - -#include "xml.h" -#include "xmlfile.h" -#include "xmlreader.h" - -#include "versions.h" - -#include "messagesHandling.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "mxmlTree2MsrSkeletonBuilderInterface.h" - -#include "mxmlTree2MsrSkeletonBuilder.h" - -#include "msr2Summary.h" - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_msrScore buildMsrSkeletonFromElementsTree ( - S_msrOah& msrOpts, - Sxmlelement mxmlTree, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mxmlTree != 0, - "mxmlTree is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 2a: translating the xmlelement tree into an MSR skeleton" << - endl; - - logOstream << - separator << - endl; - } -#endif - - // create an mxmlTree2MsrSkeletonBuilder - mxmlTree2MsrSkeletonBuilder - skeletonBuilder ( - logOstream); - - // build the MSR score - skeletonBuilder.browseMxmlTree ( - mxmlTree); - - // fetch the score skeleton - S_msrScore - scoreSkeleton = - skeletonBuilder.getMsrScore (); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 2a", - "build the MSR skeleton", - timingItem::kMandatory, - startClock, - endClock); - - - if (msrOpts->fDisplayMsr) { - // display the MSR skeleton - displayMsrSkeleton ( - msrOpts, - scoreSkeleton, - logOstream); - } - - return scoreSkeleton; -} - -//_______________________________________________________________________________ -void displayMsrSkeleton ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mScore != 0, - "mScore is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Optional pass: displaying the MSR skeleton as text" << - endl << - separator << - endl << - endl << - mScore; - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display the MSR skeleton", - timingItem::kOptional, - startClock, - endClock); -} - -/* JMI -//_______________________________________________________________________________ -void displayMsrSkeletonSummary ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mScore != 0, - "mScore is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Optional pass: outputting a summary of the MSR" << - endl << - separator << - endl; - } -#endif - - // create an msr2SummaryVisitor visitor - msr2SummaryVisitor - summaryVisitor ( - msrOpts, - logOstream); - - summaryVisitor.printSummaryFromMsrScore ( - mScore); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display MSR skeleton summary", - timingItem::kOptional, - startClock, - endClock); -} -*/ - - -} diff --git a/src/interface/mxmlTree2MsrSkeletonBuilderInterface.h b/src/interface/mxmlTree2MsrSkeletonBuilderInterface.h deleted file mode 100644 index cd7ca54e1..000000000 --- a/src/interface/mxmlTree2MsrSkeletonBuilderInterface.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __mxmlTree2MsrSkeletonBuilderInterface__ -#define __mxmlTree2MsrSkeletonBuilderInterface__ - - -#include "msr.h" - -#include "msrOah.h" - - -namespace MusicXML2 -{ - -/*! -\addtogroup Converting MusicXML to MSR format - -The library includes a high level API to convert - from the MusicXML format to the MSR - (Music Score Representation) format. -@{ -*/ - -//_____________________________________________@__________________________________ -EXP S_msrScore buildMsrSkeletonFromElementsTree ( - S_msrOah& msrOpts, - Sxmlelement mxmlTree, - indentedOstream& logOstream); - -//_______________________________________________________________________________ -EXP void displayMsrSkeleton ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream); - -//_______________________________________________________________________________ -/* JMI -EXP void displayMsrSkeletonSummary ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream); -*/ - - -/*! @} */ - - -} // namespace MusicXML2 - - -#endif diff --git a/src/interface/mxmlTree2MsrTranslatorInterface.cpp b/src/interface/mxmlTree2MsrTranslatorInterface.cpp deleted file mode 100644 index 8dac3ed54..000000000 --- a/src/interface/mxmlTree2MsrTranslatorInterface.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include - -#include "xml.h" -#include "xmlfile.h" -#include "xmlreader.h" - -#include "versions.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "mxmlTree2MsrTranslatorInterface.h" - -#include "mxmlTree2MsrTranslator.h" - -#include "msr2Summary.h" -#include "msr2Names.h" - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -void populateMsrSkeletonFromMxmlTree ( - S_msrOah& msrOpts, - Sxmlelement mxmlTree, - S_msrScore scoreSkeleton, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mxmlTree != 0, - "mxmlTree is null"); - - // sanity check - msrAssert ( - scoreSkeleton != 0, - "scoreSkeleton is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Pass 2b: translating the xmlelement tree into a MSR" << - endl; - - logOstream << - separator << - endl; - } -#endif - - // create an mxmlTree2MsrTranslator - mxmlTree2MsrTranslator - translator ( - scoreSkeleton, - logOstream); - - // browse the mxmlTree - translator.browseMxmlTree ( - mxmlTree); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "Pass 2b", - "build the MSR", - timingItem::kMandatory, - startClock, - endClock); -} - -//_______________________________________________________________________________ -void displayMSRPopulatedScore ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mScore != 0, - "mScore is null"); - - clock_t startClock = clock (); - - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Optional pass: displaying the MSR as text" << - endl << - separator << - endl << - endl << - mScore; - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display the MSR", - timingItem::kOptional, - startClock, - endClock); -} - -//_______________________________________________________________________________ -void displayMSRPopulatedScoreSummary ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mScore != 0, - "mScore is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Optional pass: outputting a summary of the MSR" << - endl << - separator << - endl << - endl; - } -#endif - - // create an msr2SummaryVisitor visitor - msr2SummaryVisitor - summaryVisitor ( - msrOpts, - logOstream); - - summaryVisitor.printSummaryFromMsrScore ( - mScore); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display MSR summary", - timingItem::kOptional, - startClock, - endClock); -} - -//_______________________________________________________________________________ -void displayMSRPopulatedScoreNames ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream) -{ - // sanity check - msrAssert ( - mScore != 0, - "mScore is null"); - - clock_t startClock = clock (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - string separator = - "%--------------------------------------------------------------"; - - logOstream << - endl << - separator << - endl << - gTab << - "Optional pass: outputting the names in the MSR" << - endl << - separator << - endl << - endl; - } -#endif - - // create an msr2NamesVisitor visitor - msr2NamesVisitor - namesVisitor ( - msrOpts, - logOstream); - - namesVisitor.printNamesFromMsrScore ( - mScore); - - clock_t endClock = clock (); - - // register time spent - timing::gTiming.appendTimingItem ( - "", - "display MSR names", - timingItem::kOptional, - startClock, - endClock); -} - - -} diff --git a/src/interface/mxmlTree2MsrTranslatorInterface.h b/src/interface/mxmlTree2MsrTranslatorInterface.h deleted file mode 100644 index ca826a7e8..000000000 --- a/src/interface/mxmlTree2MsrTranslatorInterface.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __mxml2MsrTranslatorInterface__ -#define __mxml2MsrTranslatorInterface__ - - -#include - -#include "exports.h" - -#include "utilities.h" - -#include "messagesHandling.h" - -#include "msr.h" - -#include "msrOah.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -EXP void populateMsrSkeletonFromMxmlTree ( - S_msrOah& msrOpts, - Sxmlelement mxmlTree, - S_msrScore scoreSkeleton, - indentedOstream& logOstream); - -//______________________________________________________________________________ -EXP void displayMSRPopulatedScore ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream); - -//______________________________________________________________________________ -EXP void displayMSRPopulatedScoreSummary ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream); - -//______________________________________________________________________________ -EXP void displayMSRPopulatedScoreNames ( - S_msrOah& msrOpts, - S_msrScore mScore, - indentedOstream& logOstream); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/basicOah2ManPageGenerator.cpp b/src/lilypond/basicOah2ManPageGenerator.cpp deleted file mode 100644 index a3faf8113..000000000 --- a/src/lilypond/basicOah2ManPageGenerator.cpp +++ /dev/null @@ -1,1017 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "basicOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "generalOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -basicOah2ManPageGenerator::basicOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -basicOah2ManPageGenerator::~basicOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahHandler& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahHandler" << - " \"" << elt->getHandlerHeader () << "\"" << - endl; - } -#endif - - // initial comment - fOah2ManPageOutputStream << - ".\\\" DO NOT MODIFY THIS MAN PAGE DATA FILE! It was generated by " << - gOahOah->fHandlerExecutableName << - currentVersionNumber () << - " on " << - gGeneralOah->fTranslationDate << - endl; - - // the man page header - fOah2ManPageOutputStream << - ".TH " << - gOahOah->fHandlerExecutableName << - " \"" << - "1" << // JMI section ??? - "\" \"" << - gGeneralOah->fTranslationDate << - "\" " << - gOahOah->fHandlerExecutableName << - " \"" << - "User Commands" << - "\"" << - endl << - - ".SH NAME" << - endl << - ".NM " << - gOahOah->fHandlerExecutableName << - endl << - ".ND " << - "manual page for " << - gOahOah->fHandlerExecutableName << - endl << - - ".SH DESCRIPTION" << - endl << - ".IP" << - endl << - elt->getHandlerPreamble () << - endl << - - ".SH \"USAGE\"" << - endl << - ".IP" << - endl << - elt->getHandlerUsage () << - endl; -} - -void basicOah2ManPageGenerator::visitEnd (S_oahHandler& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahHandler" << - " \"" << elt->getHandlerHeader () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahPrefix& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahPrefix" << - " \"" << elt->getPrefixName () << "\"" << - endl; - } -#endif - - fOah2ManPageOutputStream << - ".IT FL " << - // endl << - elt->getPrefixErsatz () << - " " << - elt->getPrefixDescription () << - endl; -} - -void basicOah2ManPageGenerator::visitEnd (S_oahPrefix& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahPrefix" << - " \"" << elt->getPrefixName () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahGroup& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahGroup" << - " \"" << elt->getGroupHeader () << "\"" << - endl; - } -#endif - - fOah2ManPageOutputStream << - ".SH " << - elt->getGroupHeader () << - endl << - "(\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR): " << - endl; -} - -void basicOah2ManPageGenerator::visitEnd (S_oahGroup& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahGroup" << - " \"" << elt->getGroupHeader () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahSubGroup& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahSubGroup" << - " \"" << elt->getSubGroupHeader () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".TP" << - endl << - elt->getSubGroupHeader () << - endl << - ".BL -tag -width indent" << - endl << - "(\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR): " << - endl; -*/ -} - -void basicOah2ManPageGenerator::visitEnd (S_oahSubGroup& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahSubGroup" << - " \"" << elt->getSubGroupHeader () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting S_oahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting S_oahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahAtomWithVariableName& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahAtomWithVariableName" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - -} - -void basicOah2ManPageGenerator::visitEnd (S_oahAtomWithVariableName& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahAtomWithVariableName" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahAtomSynonym& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahAtomSynonym" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - -} - -void basicOah2ManPageGenerator::visitEnd (S_oahAtomSynonym& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahAtomSynonym" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahOptionsUsageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahOptionsUsageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - -} - -void basicOah2ManPageGenerator::visitEnd (S_oahOptionsUsageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahOptionsUsageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahOptionsSummaryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahOptionsSummaryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - -} - -void basicOah2ManPageGenerator::visitEnd (S_oahOptionsSummaryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahOptionsSummaryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahOptionNameHelpAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahOptionNameHelpAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahOptionNameHelpAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahOptionNameHelpAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahBooleanAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahBooleanAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void basicOah2ManPageGenerator::visitEnd (S_oahBooleanAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahBooleanAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahTwoBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahTwoBooleansAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void basicOah2ManPageGenerator::visitEnd (S_oahTwoBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahTwoBooleansAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahThreeBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahThreeBooleansAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void basicOah2ManPageGenerator::visitEnd (S_oahThreeBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahThreeBooleansAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahCombinedBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahCombinedBooleansAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahCombinedBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahCombinedBooleansAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahMultiplexBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahMultiplexBooleansAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahMultiplexBooleansAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahMultiplexBooleansAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahValuedAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahValuedAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahValuedAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahValuedAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahIntegerAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahIntegerAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahIntegerAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahIntegerAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahTwoIntegersAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahTwoIntegersAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahTwoIntegersAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahTwoIntegersAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahFloatAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahFloatAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahFloatAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahFloatAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahStringAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahStringAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahStringAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahStringAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahRationalAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahRationalAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahRationalAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahRationalAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahMonoplexStringAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahMonoplexStringAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahMonoplexStringAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahMonoplexStringAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahStringWithDefaultValueAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahStringWithDefaultValueAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahStringWithDefaultValueAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahStringWithDefaultValueAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahNaturalNumbersSetAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahNaturalNumbersSetAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahNaturalNumbersSetAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahNaturalNumbersSetAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -/* JMI -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahStringsSetElementAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahStringsSetElementAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahStringsSetElementAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahStringsSetElementAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} -*/ - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahStringSetAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahStringSetAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahStringSetAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahStringSetAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahRGBColorAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahRGBColorAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahRGBColorAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahRGBColorAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahStringAndIntegerAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahStringAndIntegerAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahStringAndIntegerAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahStringAndIntegerAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void basicOah2ManPageGenerator::visitStart (S_oahStringAndTwoIntegersAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahStringAndTwoIntegersAtom '" << - elt->asString () << - "'" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -void basicOah2ManPageGenerator::visitEnd (S_oahStringAndTwoIntegersAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahStringAndTwoIntegersAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/basicOah2ManPageGenerator.h b/src/lilypond/basicOah2ManPageGenerator.h deleted file mode 100644 index 937d54110..000000000 --- a/src/lilypond/basicOah2ManPageGenerator.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___basicOah2ManPageGenerator___ -#define ___basicOah2ManPageGenerator___ - -#include "oahBasicTypes.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class basicOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor - -{ - public: - - basicOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~basicOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_oahHandler& elt); - virtual void visitEnd (S_oahHandler& elt); - - virtual void visitStart (S_oahGroup& elt); - virtual void visitEnd (S_oahGroup& elt); - - virtual void visitStart (S_oahPrefix& elt); - virtual void visitEnd (S_oahPrefix& elt); - - virtual void visitStart (S_oahSubGroup& elt); - virtual void visitEnd (S_oahSubGroup& elt); - - virtual void visitStart (S_oahAtom& elt); - virtual void visitEnd (S_oahAtom& elt); - - virtual void visitStart (S_oahAtomSynonym& elt); - virtual void visitEnd (S_oahAtomSynonym& elt); - - virtual void visitStart (S_oahOptionsUsageAtom& elt); - virtual void visitEnd (S_oahOptionsUsageAtom& elt); - - virtual void visitStart (S_oahOptionsSummaryAtom& elt); - virtual void visitEnd (S_oahOptionsSummaryAtom& elt); - - virtual void visitStart (S_oahAtomWithVariableName& elt); - virtual void visitEnd (S_oahAtomWithVariableName& elt); - - virtual void visitStart (S_oahOptionNameHelpAtom& elt); - virtual void visitEnd (S_oahOptionNameHelpAtom& elt); - - virtual void visitStart (S_oahBooleanAtom& elt); - virtual void visitEnd (S_oahBooleanAtom& elt); - virtual void visitStart (S_oahTwoBooleansAtom& elt); - virtual void visitEnd (S_oahTwoBooleansAtom& elt); - virtual void visitStart (S_oahThreeBooleansAtom& elt); - virtual void visitEnd (S_oahThreeBooleansAtom& elt); - - virtual void visitStart (S_oahCombinedBooleansAtom& elt); - virtual void visitEnd (S_oahCombinedBooleansAtom& elt); - - virtual void visitStart (S_oahMultiplexBooleansAtom& elt); - virtual void visitEnd (S_oahMultiplexBooleansAtom& elt); - - virtual void visitStart (S_oahValuedAtom& elt); - virtual void visitEnd (S_oahValuedAtom& elt); - - virtual void visitStart (S_oahIntegerAtom& elt); - virtual void visitEnd (S_oahIntegerAtom& elt); - virtual void visitStart (S_oahTwoIntegersAtom& elt); - virtual void visitEnd (S_oahTwoIntegersAtom& elt); - - virtual void visitStart (S_oahFloatAtom& elt); - virtual void visitEnd (S_oahFloatAtom& elt); - - virtual void visitStart (S_oahStringAtom& elt); - virtual void visitEnd (S_oahStringAtom& elt); - - virtual void visitStart (S_oahRationalAtom& elt); - virtual void visitEnd (S_oahRationalAtom& elt); - - virtual void visitStart (S_oahMonoplexStringAtom& elt); - virtual void visitEnd (S_oahMonoplexStringAtom& elt); - - virtual void visitStart (S_oahStringWithDefaultValueAtom& elt); - virtual void visitEnd (S_oahStringWithDefaultValueAtom& elt); - - virtual void visitStart (S_oahNaturalNumbersSetAtom& elt); - virtual void visitEnd (S_oahNaturalNumbersSetAtom& elt); - - virtual void visitStart (S_oahStringSetAtom& elt); - virtual void visitEnd (S_oahStringSetAtom& elt); - - virtual void visitStart (S_oahRGBColorAtom& elt); - virtual void visitEnd (S_oahRGBColorAtom& elt); - - virtual void visitStart (S_oahStringAndIntegerAtom& elt); - virtual void visitEnd (S_oahStringAndIntegerAtom& elt); - - virtual void visitStart (S_oahStringAndTwoIntegersAtom& elt); - virtual void visitEnd (S_oahStringAndTwoIntegersAtom& elt); -}; -typedef SMARTP S_basicOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/brailleOah.cpp b/src/lilypond/brailleOah.cpp deleted file mode 100644 index 48fbafd92..000000000 --- a/src/lilypond/brailleOah.cpp +++ /dev/null @@ -1,1510 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX -#include // setw, setprecision, ... - -#include - -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_brailleOutputKindAtom brailleOutputKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrBrailleOutputKind& brailleOutputKindVariable) -{ - brailleOutputKindAtom* o = new - brailleOutputKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - brailleOutputKindVariable); - assert(o!=0); - return o; -} - -brailleOutputKindAtom::brailleOutputKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrBrailleOutputKind& brailleOutputKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fBrailleOutputKindVariable ( - brailleOutputKindVariable) -{} - -brailleOutputKindAtom::~brailleOutputKindAtom () -{} - -S_oahValuedAtom brailleOutputKindAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a brailleOutputKindAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void brailleOutputKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'brailleOutputKindAtom'" << - endl; - } -#endif - - // theString contains the output kind name: - // is it in the output kinds map? - - map::const_iterator - it = - gBsrBrailleOutputKindsMap.find ( - theString); - - if (it == gBsrBrailleOutputKindsMap.end ()) { - // no, optional values style kind is unknown in the map - stringstream s; - - s << - "braille ouptput kind '" << theString << - "' is unknown" << - endl << - "The " << - gBsrBrailleOutputKindsMap.size () - 1 << - " known braille ouptput kind are:" << - endl; - - gIndenter++; - - s << - existingBsrBrailleOutputKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - fBrailleOutputKindVariable = - (*it).second; -} - -void brailleOutputKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleOutputKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleOutputKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleOutputKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void brailleOutputKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleOutputKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleOutputKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleOutputKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void brailleOutputKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleOutputKindAtom::browseData ()" << - endl; - } -#endif -} - -string brailleOutputKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - bsrBrailleOutputKindAsString (fBrailleOutputKindVariable); - - return s.str (); -} - -string brailleOutputKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - bsrBrailleOutputKindAsString (fBrailleOutputKindVariable); - - return s.str (); -} - -void brailleOutputKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsUTFKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "brailleUTFKindVariable" << " : \"" << - bsrBrailleOutputKindAsString ( - fBrailleOutputKindVariable) << - "\"" << - endl; -} - -void brailleOutputKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - bsrBrailleOutputKindAsString ( - fBrailleOutputKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_brailleOutputKindAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_brailleUTFKindAtom brailleUTFKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrUTFKind& brailleUTFKindVariable) -{ - brailleUTFKindAtom* o = new - brailleUTFKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - brailleUTFKindVariable); - assert(o!=0); - return o; -} - -brailleUTFKindAtom::brailleUTFKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrUTFKind& brailleUTFKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fBsrUTFKindVariable ( - brailleUTFKindVariable) -{} - -brailleUTFKindAtom::~brailleUTFKindAtom () -{} - -void brailleUTFKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'brailleUTFKindAtom'" << - endl; - } -#endif - - bsrUTFKind UTFKind = kUTF8; // default value - - if (theString == "8") { - UTFKind = kUTF8; - } - else if (theString == "16") { - UTFKind = kUTF16; - } - else { - // no, theString is unknown - stringstream s; - - s << - "UTF kind '" << theString << - "' is unknown" << - endl << - "The possible values are 8 and 16" << - endl; - - oahError (s.str ()); - } - - fBsrUTFKindVariable = UTFKind; -} - -void brailleUTFKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleUTFKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleUTFKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleUTFKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void brailleUTFKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleUTFKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleUTFKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleUTFKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void brailleUTFKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleUTFKindAtom::browseData ()" << - endl; - } -#endif -} - -string brailleUTFKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - bsrUTFKindAsString (fBsrUTFKindVariable); - - return s.str (); -} - -string brailleUTFKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - bsrUTFKindAsString (fBsrUTFKindVariable); - - return s.str (); -} - -void brailleUTFKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsUTFKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "brailleUTFKindVariable" << " : \"" << - bsrUTFKindAsString ( - fBsrUTFKindVariable) << - "\"" << - endl; -} - -void brailleUTFKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - bsrUTFKindAsString ( - fBsrUTFKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_brailleUTFKindAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_brailleByteOrderingKindAtom brailleByteOrderingKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrByteOrderingKind& brailleByteOrderingKindVariable) -{ - brailleByteOrderingKindAtom* o = new - brailleByteOrderingKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - brailleByteOrderingKindVariable); - assert(o!=0); - return o; -} - -brailleByteOrderingKindAtom::brailleByteOrderingKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrByteOrderingKind& brailleByteOrderingKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fBsrByteOrderingKindVariable ( - brailleByteOrderingKindVariable) -{} - -brailleByteOrderingKindAtom::~brailleByteOrderingKindAtom () -{} - -void brailleByteOrderingKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'brailleByteOrderingKindAtom'" << - endl; - } -#endif - - bsrByteOrderingKind byteOrderingKind = kByteOrderingNone; // default value - - if (theString == "big") { - byteOrderingKind = kByteOrderingBigEndian; - } - else if (theString == "small") { - byteOrderingKind = kByteOrderingSmallEndian; - } - else { - // no, theString is unknown - stringstream s; - - s << - "byte ordering '" << theString << - "' is unknown" << - endl << - "The possible values are big and small" << - endl; - - oahError (s.str ()); - } - - fBsrByteOrderingKindVariable = byteOrderingKind; -} - -void brailleByteOrderingKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleByteOrderingKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleByteOrderingKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleByteOrderingKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void brailleByteOrderingKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleByteOrderingKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleByteOrderingKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleByteOrderingKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void brailleByteOrderingKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleByteOrderingKindAtom::browseData ()" << - endl; - } -#endif -} - -string brailleByteOrderingKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - bsrByteOrderingKindAsString (fBsrByteOrderingKindVariable); - - return s.str (); -} - -string brailleByteOrderingKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - bsrByteOrderingKindAsString (fBsrByteOrderingKindVariable); - - return s.str (); -} - -void brailleByteOrderingKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsByteOrderingKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "brailleByteOrderingKindVariable" << " : \"" << - bsrByteOrderingKindAsString ( - fBsrByteOrderingKindVariable) << - "\"" << - endl; -} - -void brailleByteOrderingKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - bsrByteOrderingKindAsString ( - fBsrByteOrderingKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_brailleByteOrderingKindAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_brailleOah gBrailleOah; -S_brailleOah gBrailleOahUserChoices; -S_brailleOah gBrailleOahWithDetailedTrace; - -S_brailleOah brailleOah::create ( - S_oahHandler handlerUpLink) -{ - brailleOah* o = new brailleOah ( - handlerUpLink); - assert(o!=0); - return o; -} - -brailleOah::brailleOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "Braille", - "hbrl", "help-braille", -R"(These options control how the Braille code is generated.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this braille group to the braille handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeBrailleOah (false); -} - -brailleOah::~brailleOah () -{} - -void brailleOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void brailleOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_brailleOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching brailleOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void brailleOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> brailleOah::browseData ()" << - endl; - } -#endif -} - -void brailleOah::initializeBrailleEncodingOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Braille encoding", - "hbe", "help-braille-encoding", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - const bsrBrailleOutputKind - bsrBrailleOutputKindDefaultValue = - kBrailleOutputAscii; // default value - - subGroup-> - appendAtomToSubGroup ( - brailleOutputKindAtom::create ( - "bok", "braille-output-kind", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(Use OUTPUT_KIND to write the generated braille music to the output. -The NUMBER output kinds available are: -BRAILLE_OUTPUT_KINDS. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gBsrBrailleOutputKindsMap.size ())), - "BRAILLE_OUTPUT_KINDS", - existingBsrBrailleOutputKinds (K_NAMES_LIST_MAX_LENGTH)), - "DEFAULT_VALUE", - bsrBrailleOutputKindAsString ( - bsrBrailleOutputKindDefaultValue)), - "OUTPUT_KIND", - "brailleOutputKind", - fBrailleOutputKind)); - -/* JMI - // UTF encoding - - fUTFKind = kUTF8; // default value - - subGroup-> - appendAtomToSubGroup ( - brailleUTFKindAtom::create ( - "utf", "utf-encoding", -R"(Generate Braille code using UTF ENCODING_SIZE encoding, -which can be one of 8 or 16. Default value is 8.)", - "ENCODING_SIZE", - "UTFKind", - fUTFKind)); - */ -} - -void brailleOah::initializeBrailleByteOrderingOptions ( - bool boolOptionsInitialValue) -{ -/* JMI - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Byte ordering", - "hlpbo", "help-byte-ordering", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // byte ordering - - fByteOrderingKind = kByteOrderingNone; // default value - - subGroup-> - appendAtomToSubGroup ( - brailleByteOrderingKindAtom::create ( - "bom", "byte-ordering-mark", -R"(Generate an initial BOM_ENDIAN byte ordering mark (BOM) -ahead of the Braille nusic code, -which can be one of 'big' or 'small'. -By default, a BOM is generated.)", - "BOM_ENDIAN", - "byteOrderingKind", - fByteOrderingKind)); - */ -} - -void brailleOah::initializeBrailleMusicFileNameOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Braille music file name", - "hlpbmfn", "help-braille-music-file-name", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // encoding in file name - - fDontUseEncodingInFileName = false; // default value - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ueifn", "use-encoding-in-file-name", -R"(Don't append a description of the encoding used -and the presence of a BOM if any to the file name.)", - "dontUseEncodingInFileName", - fDontUseEncodingInFileName)); -} - -void brailleOah::initializeBraillePageParametersOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Page parameters", - "hlpbpp", "help-braille-pages-parameters", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // cells per line - - fCellsPerLine = 30; - subGroup-> - appendAtomToSubGroup ( - oahIntegerAtom::create ( - "cpl", "cells-per-line", -R"(Set the number of Braille cells per line to N. Default is 30 for A4 paper.)", - "N", - "cellsPerLine", - fCellsPerLine)); - - // measures per line - - fMeasuresPerLine = 7; - - subGroup-> - appendAtomToSubGroup ( - oahIntegerAtom::create ( - "mpl", "measures-per-line", -R"(Set the number of Braille measures per line to N. Default is 7.)", - "N", - "measuresPerLine", - fMeasuresPerLine)); - - // lines per page - - fLinesPerPage = 27; - - subGroup-> - appendAtomToSubGroup ( - oahIntegerAtom::create ( - "lpp", "lines-per-page", -R"(Set the number of Braille lines per page to N. Default is 27 for A4 paper.)", - "N", - "linesPerPage", - fLinesPerPage)); -} - -void brailleOah::initializeBrailleCodeGenerationOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Code generation", - "hlpcg", "help-braille-code-generation", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // xml2brl infos - - fXml2brlInfos = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "xi", "xml2brl-infos", -R"(Generate initial comments showing the compilation date and braille.)", - "xml2brlInfos", - fXml2brlInfos)); - - // braille code - - fNoBrailleCode = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nolpc", "no-braille-code", -R"(Don't generate any Braille code. -That can be useful if only a summary of the score is needed.)", - "noBrailleCode", - fNoBrailleCode)); -} - -void brailleOah::initializeBrailleOah ( - bool boolOptionsInitialValue) -{ - // UTF encoding - // -------------------------------------- - initializeBrailleEncodingOptions ( - boolOptionsInitialValue); - - // byte ordering - // -------------------------------------- - initializeBrailleByteOrderingOptions ( - boolOptionsInitialValue); - - // braille music file name - // -------------------------------------- - initializeBrailleMusicFileNameOptions ( - boolOptionsInitialValue); - - // page parameters - // -------------------------------------- - initializeBraillePageParametersOptions ( - boolOptionsInitialValue); - - // code generation - // -------------------------------------- - initializeBrailleCodeGenerationOptions ( - boolOptionsInitialValue); -} - -S_brailleOah brailleOah::createCloneWithDetailedTrace () -{ - S_brailleOah - clone = - brailleOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the braille handler upLink - clone->fHandlerUpLink = - fHandlerUpLink;; - - // code generation JMI ??? - // -------------------------------------- - - clone->fXml2brlInfos = - fXml2brlInfos; - - clone->fNoBrailleCode = - fNoBrailleCode; - - return clone; -} - -//______________________________________________________________________________ -void brailleOah::enforceQuietness () -{} - -//______________________________________________________________________________ -void brailleOah::checkOptionsConsistency () -{ - // JMI -} - -void brailleOah::printBrailleOahValues (int fieldWidth) -{ - gLogOstream << - "The Braille braille are:" << - endl; - - gIndenter++; - - - // code generation - // -------------------------------------- - - gLogOstream << - "Braille code generation:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "UTFKind" << " : " << - bsrUTFKindAsString (fUTFKind) << - endl << - - setw (fieldWidth) << "byteOrderingKind" << " : " << - bsrByteOrderingKindAsString (fByteOrderingKind) << - endl << - - setw (fieldWidth) << "dontUseEncodingInFileName" << " : " << - booleanAsString (fDontUseEncodingInFileName) << - endl << - - setw (fieldWidth) << "cellsPerLine" << " : " << - fCellsPerLine << - endl << - setw (fieldWidth) << "measuresPerLine" << " : " << - fMeasuresPerLine << - endl << - setw (fieldWidth) << "linesPerPage" << " : " << - fLinesPerPage << - endl << - - setw (fieldWidth) << "xml2brlInfos" << " : " << - booleanAsString (fXml2brlInfos) << - endl << - - setw (fieldWidth) << "noBrailleCode" << " : " << - booleanAsString (fNoBrailleCode) << - endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_brailleOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeBrailleOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing Braille braille handling" << - endl; - } -#endif - - // create the braille variables - // ------------------------------------------------------ - - gBrailleOahUserChoices = brailleOah::create ( - handler); - assert(gBrailleOahUserChoices != 0); - - gBrailleOah = - gBrailleOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ - -/* JMI - gBrailleOahWithDetailedTrace = - gBrailleOah-> - createCloneWithDetailedTrace (); - */ -} - - -} - - - /* - // identification - // -------------------------------------- - - { - // variables - - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Identification", - "hlpi", "help-braille-identification", -R"(These braille can be used to enforce values in the generated Braille code, -thus overriding the ones that may be present in the MSR data. -)", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // MusicXML informations - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "rights", "", -R"(Set the 'rights' to STRING in the Braille code.)", - "STRING", - "rights", - fRights)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "composer", "", -R"(Set the 'composer' to STRING in the Braille code.)", - "STRING", - "composer", - fComposer)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "arranger", "", -R"(Set the 'arranger' to STRING in the Braille code.)", - "STRING", - "arranger", - fArranger)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "poet", "", -R"(Set the 'poet' to STRING in the Braille code.)", - "STRING", - "poet", - fPoet)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "lyricist", "", -R"(Set the 'lyricist' to STRING in the Braille code.)", - "STRING", - "lyricist", - fLyricist)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "software", "", -R"(Set the 'software' to STRING in the Braille code.)", - "STRING", - "software", - fSoftware)); - - // Braille informations - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "dedication", "", -R"(Set 'dedication' to STRING in the \header.)", - "STRING", - "dedication", - fDedication)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "piece", "", -R"(Set 'piece' to STRING in the \header.)", - "STRING", - "piece", - fPiece)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "opus", "", -R"(Set 'opus' to STRING in the \header.)", - "STRING", - "opus", - fOpus)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "title", "", -R"(Set 'title' to STRING in the \header.)", - "STRING", - "title", - fTitle)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "stitle", "subtitle", -R"(Set 'subtitle' to STRING in the \header.)", - "STRING", - "subTitle", - fSubTitle)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "sstitle", "subsubtitle", -R"(Set 'subsubtitle' to STRING in the \header.)", - "STRING", - "subSubTitle", - fSubSubTitle)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "instrument", "", -R"(Set 'instrument' to STRING in the \header.)", - "STRING", - "instrument", - fInstrument)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "meter", "", -R"(Set 'meter' to STRING in the \header.)", - "STRING", - "meter", - fMeter)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "tagline", "", -R"(Set 'tagline' to STRING in the \header.)", - "STRING", - "tagline", - fTagline)); - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "copyright", "", -R"(Set 'copyright' to STRING in the \header.)", - "STRING", - "copyright", - fCopyright)); - } - - - // notes - // -------------------------------------- - - { - // variables - - fAbsoluteOctaves = boolOptionsInitialValue; - - fAllDurations = boolOptionsInitialValue; - - fRomanStringNumbers = boolOptionsInitialValue; - fAvoidOpenStrings = boolOptionsInitialValue; - - fCompressMultiMeasureRests = boolOptionsInitialValue; - - fInputLineNumbers = boolOptionsInitialValue; - - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Notes", - "hlpn", "help-braille-notes", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "abs", "absolute", -R"(Generate Braille absolute note octaves. -By default, relative octaves are generated.)", - "absoluteOctaves", - fAbsoluteOctaves)); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "alldurs", "all-durations", -R"(Generate all Braille durations. -By default, a duration equal to preceding one found in the current voice -is omitted for code conciseness.)", - "allDurations", - fAllDurations)); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "rsn", "roman-string-numbers", -R"(Generate '\romanStringNumbers' in each voice -for Braille to generate roman instead of arabic string numbers.)", - "romanStringNumbers", - fRomanStringNumbers)); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "aos", "avoid-open-strings", -R"(Generate '\set TabStaff.restrainOpenStrings = ##t' in each voice -to prevent Braille from using open strings.)", - "avoidOpenStrings", - fAvoidOpenStrings)); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "niln", "note-input-line-numbers", - replaceSubstringInString ( -R"(Generate after each note and barline a comment containing -its MusicXML input line number. -This is useful when debugging EXECUTABLE.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "noteInputLineNumbers", - fInputLineNumbers)); - } - - - // bars - // -------------------------------------- - - { - // variables - - fShowAllBarNumbers = boolOptionsInitialValue; - - // braille - - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Bars", - "hlpb", "help-braille-bars", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "abn", "all-bar-numbers", -R"(Generate Braille code to show all bar numbers.)", - "showAllBarNumbers", - fShowAllBarNumbers)); - } - - - // line breaks - // -------------------------------------- - - { - // variables - - fIgnoreLineBreaks = boolOptionsInitialValue; - - fBreakLinesAtIncompleteRightMeasures = boolOptionsInitialValue; - - // braille - - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Line breaks", - "hlplb", "help-braille-line-breaks", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ilb", "ignore-line-breaks", -R"(Ignore the line breaks from the MusicXML input -and let Braille decide about them.)", - "ignoreLineBreaks", - fIgnoreLineBreaks)); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "blairm", "break-lines-at-incomplete-right-measures", -R"(Generate a '\break' command at the end of incomplete right measures -which is handy in popular folk dances and tunes.)", - "breakLinesAtIncompleteRightMeasures", - fBreakLinesAtIncompleteRightMeasures)); - } - - - // page breaks - // -------------------------------------- - - { - // variables - - fIgnorePageBreaks = boolOptionsInitialValue; - - // braille - - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Page breaks", - "hlppb", "help-braille-page-breaks", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ipb", "ignore-page-breaks", -R"(Ignore the page breaks from the MusicXML input -and let Braille decide about them.)", - "ignorePageBreaks", - fIgnorePageBreaks)); - } - */ diff --git a/src/lilypond/brailleOah.h b/src/lilypond/brailleOah.h deleted file mode 100644 index af1c17a51..000000000 --- a/src/lilypond/brailleOah.h +++ /dev/null @@ -1,401 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___brailleOah___ -#define ___brailleOah___ - -#include - -#include "oahBasicTypes.h" - -#include "bsrBrailleCodeGenerators.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class brailleOutputKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrBrailleOutputKind& brailleOutputKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - brailleOutputKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrBrailleOutputKind& brailleOutputKindVariable); - - virtual ~brailleOutputKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrBrailleOutputKind& fBrailleOutputKindVariable; -}; -typedef SMARTP S_brailleOutputKindAtom; -EXP ostream& operator<< (ostream& os, const S_brailleOutputKindAtom& elt); - -//______________________________________________________________________________ -class brailleUTFKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrUTFKind& brailleUTFKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - brailleUTFKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrUTFKind& brailleUTFKindVariable); - - virtual ~brailleUTFKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrUTFKind& fBsrUTFKindVariable; -}; -typedef SMARTP S_brailleUTFKindAtom; -EXP ostream& operator<< (ostream& os, const S_brailleUTFKindAtom& elt); - -//______________________________________________________________________________ -class brailleByteOrderingKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrByteOrderingKind& brailleByteOrderingKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - brailleByteOrderingKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrByteOrderingKind& brailleByteOrderingKindVariable); - - virtual ~brailleByteOrderingKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrByteOrderingKind& fBsrByteOrderingKindVariable; -}; -typedef SMARTP S_brailleByteOrderingKindAtom; -EXP ostream& operator<< (ostream& os, const S_brailleByteOrderingKindAtom& elt); - -//______________________________________________________________________________ -class brailleOah : public oahGroup -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithDetailedTrace (); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeBrailleOah ( - bool boolOptionsInitialValue); - - void printBrailleOahHelp (); - - void printBrailleOahValues (int fieldWidth); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - brailleOah ( - S_oahHandler handlerUpLink); - - virtual ~brailleOah (); - - // set and get - // ------------------------------------------------------ - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - private: - - // private services - // ------------------------------------------------------ - - void initializeBrailleEncodingOptions ( - bool boolOptionsInitialValue); - - void initializeBrailleByteOrderingOptions ( - bool boolOptionsInitialValue); - - void initializeBrailleMusicFileNameOptions ( - bool boolOptionsInitialValue); - - void initializeBraillePageParametersOptions ( - bool boolOptionsInitialValue); - - void initializeBrailleCodeGenerationOptions ( - bool boolOptionsInitialValue); - - public: - - // braille output kind - // -------------------------------------- - - bsrBrailleOutputKind fBrailleOutputKind; - - // UTF encoding - // -------------------------------------- - - bsrUTFKind fUTFKind; - - // byte ordering - // -------------------------------------- - - bsrByteOrderingKind fByteOrderingKind; - - // braille music file name - // -------------------------------------- - - bool fDontUseEncodingInFileName; - - // page parameters - // -------------------------------------- - - int fCellsPerLine; - int fMeasuresPerLine; - int fLinesPerPage; - - // code generation - // -------------------------------------- - - bool fXml2brlInfos; - - bool fNoBrailleCode; -}; -typedef SMARTP S_brailleOah; -EXP ostream& operator<< (ostream& os, const S_brailleOah& elt); - -EXP extern S_brailleOah gBrailleOah; -EXP extern S_brailleOah gBrailleOahUserChoices; -EXP extern S_brailleOah gBrailleOahWithDetailedTrace; - -//______________________________________________________________________________ -void initializeBrailleOahHandling ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/brailleOah2ManPageGenerator.cpp b/src/lilypond/brailleOah2ManPageGenerator.cpp deleted file mode 100644 index a86f4a962..000000000 --- a/src/lilypond/brailleOah2ManPageGenerator.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "brailleOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -brailleOah2ManPageGenerator::brailleOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -brailleOah2ManPageGenerator::~brailleOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void brailleOah2ManPageGenerator::visitStart (S_brailleOutputKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting brailleOutputKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; -} - -void brailleOah2ManPageGenerator::visitEnd (S_brailleOutputKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting brailleOutputKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void brailleOah2ManPageGenerator::visitStart (S_brailleUTFKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting brailleUTFKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; -} - -void brailleOah2ManPageGenerator::visitEnd (S_brailleUTFKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting brailleUTFKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void brailleOah2ManPageGenerator::visitStart (S_brailleByteOrderingKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting brailleByteOrderingKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; -} - -void brailleOah2ManPageGenerator::visitEnd (S_brailleByteOrderingKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting brailleByteOrderingKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/brailleOah2ManPageGenerator.h b/src/lilypond/brailleOah2ManPageGenerator.h deleted file mode 100644 index a1fe5167b..000000000 --- a/src/lilypond/brailleOah2ManPageGenerator.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___brailleOah2ManPageGenerator___ -#define ___brailleOah2ManPageGenerator___ - -#include "brailleOah.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class brailleOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor, - - public visitor, - - public visitor - -{ - public: - - brailleOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~brailleOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_brailleOutputKindAtom& elt); - virtual void visitEnd (S_brailleOutputKindAtom& elt); - - virtual void visitStart (S_brailleUTFKindAtom& elt); - virtual void visitEnd (S_brailleUTFKindAtom& elt); - - virtual void visitStart (S_brailleByteOrderingKindAtom& elt); - virtual void visitEnd (S_brailleByteOrderingKindAtom& elt); -}; -typedef SMARTP S_brailleOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/bsr.cpp b/src/lilypond/bsr.cpp deleted file mode 100644 index c3fa88ae3..000000000 --- a/src/lilypond/bsr.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - - -#include "bsr.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -void initializeBSR () -{ - initializeBSRBasicTypes (); -} - - -} diff --git a/src/lilypond/bsr.h b/src/lilypond/bsr.h deleted file mode 100644 index 1abb3873a..000000000 --- a/src/lilypond/bsr.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsr___ -#define ___bsr___ - -#include "bsrMutualDependencies.h" - -#include "bsrScores.h" - -#include "bsrTranscriptionNotes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -EXP void initializeBSR (); - - -} - - -#endif diff --git a/src/lilypond/bsr2BrailleTranslator.cpp b/src/lilypond/bsr2BrailleTranslator.cpp deleted file mode 100644 index d6c2bfa73..000000000 --- a/src/lilypond/bsr2BrailleTranslator.cpp +++ /dev/null @@ -1,766 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "bsr2BrailleTranslator.h" - -#include "musicXMLOah.h" -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -bsr2BrailleTranslator::bsr2BrailleTranslator ( - S_bsrScore bsrScore, - S_bsrOah& bsrOpts, - indentedOstream& logOstream, - ostream& brailleCodeOutputStream) - : fLogOutputStream ( - logOstream) -{ - fBsrOah = bsrOpts; - - // the BSR score we're visiting - fVisitedBsrScore = bsrScore; - - switch (gBrailleOah->fBrailleOutputKind) { - case kBrailleOutputAscii: - fBrailleGenerator = - bsrAsciiBrailleGenerator::create ( - brailleCodeOutputStream); - break; - - case kBrailleOutputUTF8: - fBrailleGenerator = - bsrUTF8BrailleGenerator::create ( - gBrailleOah->fByteOrderingKind, - brailleCodeOutputStream); - break; - - case kBrailleOutputUTF16: - switch (gBrailleOah->fByteOrderingKind) { - case kByteOrderingNone: - // JMI ??? - break; - - case kByteOrderingBigEndian: - fBrailleGenerator = - bsrUTF16BigEndianBrailleGenerator::create ( - gBrailleOah->fByteOrderingKind, - brailleCodeOutputStream); - break; - - case kByteOrderingSmallEndian: - break; - fBrailleGenerator = - bsrUTF16SmallEndianBrailleGenerator::create ( - gBrailleOah->fByteOrderingKind, - brailleCodeOutputStream); - } // switch - break; - } // switch - -/* JMI - switch (gBrailleOah->fUTFKind) { - case kUTF8: - fBrailleGenerator = - bsrUTF8BrailleGenerator::create ( - gBrailleOah->fByteOrderingKind, - brailleCodeOutputStream); - break; - - case kUTF16: - switch (gBrailleOah->fByteOrderingKind) { - case kByteOrderingNone: - break; - - case kByteOrderingBigEndian: - fBrailleGenerator = - bsrUTF16BigEndianBrailleGenerator::create ( - gBrailleOah->fByteOrderingKind, - brailleCodeOutputStream); - break; - - case kByteOrderingSmallEndian: - break; - fBrailleGenerator = - bsrUTF16SmallEndianBrailleGenerator::create ( - gBrailleOah->fByteOrderingKind, - brailleCodeOutputStream); - } // switch - break; - } // switch - */ -} - -bsr2BrailleTranslator::~bsr2BrailleTranslator () -{} - -//________________________________________________________________________ -void bsr2BrailleTranslator::generateBrailleCodeFromBsrScore () -{ - if (fVisitedBsrScore) { - // browse the visited bsrScore - bsrBrowser browser (this); - browser.browse (*fVisitedBsrScore); - } -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrScore& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void bsr2BrailleTranslator::visitEnd (S_bsrScore& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrSpaces& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrSpaces" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - fLogOutputStream << - "% --> bsrSpaces" << - ", numberOfSpaces: " << elt->getNumberOfSpaces () << - ", spacesCellsList: " << elt->fetchCellsList () << - ", line " << elt->getInputLineNumber () << - endl; -*/ - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrSpaces& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrSpaces" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrBarline& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrBarline" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrTranscriptionNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting S_bsrTranscriptionNotes" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void bsr2BrailleTranslator::visitEnd (S_bsrTranscriptionNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting S_bsrTranscriptionNotes" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrTranscriptionNotesElement& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrTranscriptionNotesElement" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrTranscriptionNotesElement& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrTranscriptionNotesElement" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrPage& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrPage '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void bsr2BrailleTranslator::visitEnd (S_bsrPage& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrPage '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForBrailleCell ( - kCellEOP); -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrPagination& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrPagination '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrPagination& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrPagination '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrPageHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrPageHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrPageHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrPageHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrMusicHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrMusicHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); - */ - -/* - for (int i = 0; i < 6; i++) { // JMI ??? - if (true) { - fLogOutputStream << - "Generating a space before S_bsrMusicHeading" << - endl; - } - - fBrailleGenerator->generateCodeForBrailleCell ( - kCellSpace); -// kCellA); - } // for - */ -} - -void bsr2BrailleTranslator::visitEnd (S_bsrMusicHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrMusicHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (false) { // JMI - fLogOutputStream << - "Generating an EOL after S_bsrMusicHeading" << - endl; - } -#endif - - fBrailleGenerator->generateCodeForBrailleCell ( - kCellEOL); -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrFootNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrFootNotes '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); - */ -} - -void bsr2BrailleTranslator::visitEnd (S_bsrFootNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrFootNotes '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrLine& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrLine '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrLine& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrLine '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrLineContents& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrLineContents '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void bsr2BrailleTranslator::visitEnd (S_bsrLineContents& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrLineContents '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (false) { // JMI - fLogOutputStream << - "Generating an EOL after S_bsrLineContents" << - endl; - } -#endif - - fBrailleGenerator->generateCodeForBrailleCell ( - kCellEOL); -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrMeasure& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrMeasure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void bsr2BrailleTranslator::visitEnd (S_bsrMeasure& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrMeasure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrNumber& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrNumber '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrNumber& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrNumber '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrWords& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrWords '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrWords& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrWords '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrClef& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrClef '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrClef& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrClef '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrKey& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrKey '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrKey& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrKey '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrTime& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrTime " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrTime& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrTime " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrTempo& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrTempo " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrTempo& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrTempo " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BrailleTranslator::visitStart (S_bsrNote& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrNote " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBrailleGenerator->generateCodeForCellsList ( - elt->fetchCellsList ()); -} - -void bsr2BrailleTranslator::visitEnd (S_bsrNote& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrNote " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/bsr2BrailleTranslator.h b/src/lilypond/bsr2BrailleTranslator.h deleted file mode 100644 index 36ffb38ef..000000000 --- a/src/lilypond/bsr2BrailleTranslator.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsr2BrailleTranslator___ -#define ___bsr2BrailleTranslator___ - -#include "bsr.h" - -#include "bsrOah.h" - -#include "bsrBrailleCodeGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class bsr2BrailleTranslator : - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor - -{ - public: - - bsr2BrailleTranslator ( - S_bsrScore bsrScore, - S_bsrOah& bsrOpts, - indentedOstream& logOstream, - ostream& brailleCodeOutputStream); - - virtual ~bsr2BrailleTranslator (); - - void generateBrailleCodeFromBsrScore (); - - protected: - - virtual void visitStart (S_bsrScore& elt); - virtual void visitEnd (S_bsrScore& elt); - - virtual void visitStart (S_bsrSpaces& elt); - virtual void visitEnd (S_bsrSpaces& elt); - - virtual void visitStart (S_bsrBarline& elt); - - virtual void visitStart (S_bsrTranscriptionNotes& elt); - virtual void visitEnd (S_bsrTranscriptionNotes& elt); - - virtual void visitStart (S_bsrTranscriptionNotesElement& elt); - virtual void visitEnd (S_bsrTranscriptionNotesElement& elt); - - virtual void visitStart (S_bsrPage& elt); - virtual void visitEnd (S_bsrPage& elt); - - virtual void visitStart (S_bsrPagination& elt); - virtual void visitEnd (S_bsrPagination& elt); - - virtual void visitStart (S_bsrPageHeading& elt); - virtual void visitEnd (S_bsrPageHeading& elt); - virtual void visitStart (S_bsrMusicHeading& elt); - virtual void visitEnd (S_bsrMusicHeading& elt); - - virtual void visitStart (S_bsrFootNotes& elt); - virtual void visitEnd (S_bsrFootNotes& elt); - - virtual void visitStart (S_bsrLine& elt); - virtual void visitEnd (S_bsrLine& elt); - virtual void visitStart (S_bsrLineContents& elt); - virtual void visitEnd (S_bsrLineContents& elt); - - virtual void visitStart (S_bsrMeasure& elt); - virtual void visitEnd (S_bsrMeasure& elt); - - virtual void visitStart (S_bsrNumber& elt); - virtual void visitEnd (S_bsrNumber& elt); - - virtual void visitStart (S_bsrWords& elt); - virtual void visitEnd (S_bsrWords& elt); - - virtual void visitStart (S_bsrClef& elt); - virtual void visitEnd (S_bsrClef& elt); - - virtual void visitStart (S_bsrKey& elt); - virtual void visitEnd (S_bsrKey& elt); - - virtual void visitStart (S_bsrTime& elt); - virtual void visitEnd (S_bsrTime& elt); - - virtual void visitStart (S_bsrTempo& elt); - virtual void visitEnd (S_bsrTempo& elt); - - virtual void visitStart (S_bsrNote& elt); - virtual void visitEnd (S_bsrNote& elt); - - private: - - S_bsrScore fVisitedBsrScore; - - S_bsrOah fBsrOah; - - indentedOstream& fLogOutputStream; - - S_bsrBrailleGenerator fBrailleGenerator; -}; - - -} - - -#endif diff --git a/src/lilypond/bsr2BsrFinalizer.cpp b/src/lilypond/bsr2BsrFinalizer.cpp deleted file mode 100644 index 2421970cf..000000000 --- a/src/lilypond/bsr2BsrFinalizer.cpp +++ /dev/null @@ -1,681 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "bsr2BsrFinalizer.h" - -#include "musicXMLOah.h" -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -bsr2BsrFinalizer::bsr2BsrFinalizer ( - S_bsrOah& bsrOpts, - indentedOstream& logOstream, - S_bsrScore bScore) - : fLogOutputStream ( - logOstream) -{ - fBsrOah = bsrOpts; - - // the MSR score we're relying on - fBaseMsrScore = bScore->getMsrScore (); - - // the BSR score we're visiting - fVisitedBsrScore = bScore; -}; - -bsr2BsrFinalizer::~bsr2BsrFinalizer () -{} - -//________________________________________________________________________ -void bsr2BsrFinalizer::generateFinalizedBsrScoreFromBsrScore () -{ - if (fVisitedBsrScore) { - // browse a bsrScore browser - bsrBrowser browser (this); - browser.browse (*fVisitedBsrScore); - } -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrScore& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the BSR score - fBsrScore = - bsrScore::create ( - K_NO_INPUT_LINE_NUMBER, - fBaseMsrScore); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrScore& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrSpaces& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrSpaces" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -/* JMI - fCurrentLine-> - appendSpacesToLine (elt); - */ -} - -void bsr2BsrFinalizer::visitEnd (S_bsrSpaces& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrSpaces" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrBarline& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrBarline" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMeasure-> - appendBarlineToMeasure (elt); -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrTranscriptionNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrTranscriptionNotes" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void bsr2BsrFinalizer::visitEnd (S_bsrTranscriptionNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrTranscriptionNotes" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrTranscriptionNotesElement& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrTranscriptionNotesElement" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // JMI create the BSR score - fBsrScore-> - appendTranscriptionNotesElementToScore ( - elt); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrTranscriptionNotesElement& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrTranscriptionNotesElement" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrPage& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrPage '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentPage = elt->createPageNewbornClone (); - - fBsrScore-> - appendPageToScore (fCurrentPage); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrPage& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrPage '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrPageHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrPageHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // JMI fCurrentPageHeading = elt->createPageHeadingNewbornClone (); - - fCurrentPageHeading = elt; - - fCurrentPage-> - appendPageHeadingToPage (fCurrentPageHeading); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrPageHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrPageHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentPageHeading = nullptr; -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrMusicHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrMusicHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // JMI fCurrentPageHeading = elt->createPageHeadingNewbornClone (); - - fCurrentMusicHeading = elt; - - fCurrentPage-> - appendMusicHeadingToPage (fCurrentMusicHeading); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrMusicHeading& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrMusicHeading '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMusicHeading = nullptr; -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrFootNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrFootNotes '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // JMI fCurrentPageHeading = elt->createPageHeadingNewbornClone (); - - fCurrentFootNotes = elt; - - fCurrentPage-> - appendFootNotesToPage (fCurrentFootNotes); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrFootNotes& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrFootNotes '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFootNotes = nullptr; -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrLine& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrLine '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentLine = elt->createLineNewbornClone (); - - fCurrentPage-> - appendLineToPage (fCurrentLine); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrLine& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrLine '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrLineContents& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrLineContents '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI ??? - fCurrentLine = elt->createLineNewbornClone (); - - fCurrentPage-> - appendLineToPage (fCurrentLine); - */ -} - -void bsr2BsrFinalizer::visitEnd (S_bsrLineContents& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrLineContents '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrMeasure& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrMeasure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMeasure = - elt->createMeasureNewbornClone (); - - fCurrentLine-> - appendMeasureToLine (fCurrentMeasure); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrMeasure& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrMeasure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrNumber& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrNumber '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMeasure-> - appendNumberToMeasure (elt); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrNumber& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrNumber '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrWords& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrWords '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMeasure-> - appendWordsToMeasure (elt); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrWords& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrWords '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrClef& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrClef '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMeasure-> - appendClefToMeasure (elt); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrClef& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrClef '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrKey& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrKey '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fCurrentMusicHeading) { - fCurrentMusicHeading-> - setMusicHeadingKey (elt); - } - else { - fCurrentLine-> - appendKeyToLine (elt); - } -} - -void bsr2BsrFinalizer::visitEnd (S_bsrKey& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrKey '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrTime& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrTime " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fCurrentMusicHeading) { - fCurrentMusicHeading-> - setMusicHeadingTime (elt); - } - else { - fCurrentLine-> - appendTimeToLine (elt); - } -} - -void bsr2BsrFinalizer::visitEnd (S_bsrTime& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrTime " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrTempo& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrTempo " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI ??? - if (fCurrentMusicHeading) { - fCurrentMusicHeading-> - setMusicHeadingTempo (elt); - } - else { - */ - fCurrentLine-> - appendTempoToLine (elt); - // } -} - -void bsr2BsrFinalizer::visitEnd (S_bsrTempo& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrTempo " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsr2BsrFinalizer::visitStart (S_bsrNote& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> Start visiting bsrNote " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMeasure-> - appendNoteToMeasure (elt); -} - -void bsr2BsrFinalizer::visitEnd (S_bsrNote& elt) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - fLogOutputStream << - "% --> End visiting bsrNote " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/bsr2BsrFinalizer.h b/src/lilypond/bsr2BsrFinalizer.h deleted file mode 100644 index 2fe19aa8d..000000000 --- a/src/lilypond/bsr2BsrFinalizer.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsr2BsrFinalizer___ -#define ___bsr2BsrFinalizer___ - -#include "bsr.h" - -#include "bsrOah.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class bsr2BsrFinalizer : - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor - -{ - public: - - bsr2BsrFinalizer ( - S_bsrOah& bsrOpts, - indentedOstream& logOstream, - S_bsrScore bScore); - - virtual ~bsr2BsrFinalizer (); - - void generateFinalizedBsrScoreFromBsrScore (); - - S_bsrScore getBsrScore () const - { return fBsrScore; } - - protected: - - virtual void visitStart (S_bsrScore& elt); - virtual void visitEnd (S_bsrScore& elt); - - virtual void visitStart (S_bsrSpaces& elt); - virtual void visitEnd (S_bsrSpaces& elt); - - virtual void visitStart (S_bsrBarline& elt); - - virtual void visitStart (S_bsrTranscriptionNotes& elt); - virtual void visitEnd (S_bsrTranscriptionNotes& elt); - - virtual void visitStart (S_bsrTranscriptionNotesElement& elt); - virtual void visitEnd (S_bsrTranscriptionNotesElement& elt); - - virtual void visitStart (S_bsrPage& elt); - virtual void visitEnd (S_bsrPage& elt); - - virtual void visitStart (S_bsrPageHeading& elt); - virtual void visitEnd (S_bsrPageHeading& elt); - virtual void visitStart (S_bsrMusicHeading& elt); - virtual void visitEnd (S_bsrMusicHeading& elt); - - virtual void visitStart (S_bsrFootNotes& elt); - virtual void visitEnd (S_bsrFootNotes& elt); - - virtual void visitStart (S_bsrLine& elt); - virtual void visitEnd (S_bsrLine& elt); - virtual void visitStart (S_bsrLineContents& elt); - virtual void visitEnd (S_bsrLineContents& elt); - - virtual void visitStart (S_bsrMeasure& elt); - virtual void visitEnd (S_bsrMeasure& elt); - - virtual void visitStart (S_bsrNumber& elt); - virtual void visitEnd (S_bsrNumber& elt); - - virtual void visitStart (S_bsrWords& elt); - virtual void visitEnd (S_bsrWords& elt); - - virtual void visitStart (S_bsrClef& elt); - virtual void visitEnd (S_bsrClef& elt); - - virtual void visitStart (S_bsrKey& elt); - virtual void visitEnd (S_bsrKey& elt); - - virtual void visitStart (S_bsrTime& elt); - virtual void visitEnd (S_bsrTime& elt); - - virtual void visitStart (S_bsrTempo& elt); - virtual void visitEnd (S_bsrTempo& elt); - - virtual void visitStart (S_bsrNote& elt); - virtual void visitEnd (S_bsrNote& elt); - - private: - - // the MSR score we're relying on - // ------------------------------------------------------ - S_msrScore fBaseMsrScore; - - // the BSR score we're visiting - // ------------------------------------------------------ - S_bsrScore fVisitedBsrScore; - - // the BSR score we're building - // ------------------------------------------------------ - S_bsrScore fBsrScore; - - // pages & lines - // ------------------------------------------------------ - - S_bsrPage fCurrentPage; - S_bsrLine fCurrentLine; - - // headings - // ------------------------------------------------------ - - S_bsrPageHeading fCurrentPageHeading; - S_bsrMusicHeading fCurrentMusicHeading; - - // foot notes - // ------------------------------------------------------ - - S_bsrFootNotes fCurrentFootNotes; - - // measures - // ------------------------------------------------------ - - S_bsrMeasure fCurrentMeasure; - - // options - // ------------------------------------------------------ - - S_bsrOah fBsrOah; - - // log output stream - // ------------------------------------------------------ - - indentedOstream& fLogOutputStream; -}; - - -} - - -#endif diff --git a/src/lilypond/bsrBarlines.cpp b/src/lilypond/bsrBarlines.cpp deleted file mode 100644 index fc5bbc515..000000000 --- a/src/lilypond/bsrBarlines.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrBarline bsrBarline::create ( - int inputLineNumber, - bsrBarlineKind barlineKind) -{ - bsrBarline* o = - new bsrBarline ( - inputLineNumber, barlineKind); - assert (o!=0); - - return o; -} - -bsrBarline::bsrBarline ( - int inputLineNumber, - bsrBarlineKind barlineKind) - : bsrLineElement (inputLineNumber) -{ - fBarlineKind = barlineKind; - - fBarlineCellsList = buildCellsList (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - gLogOstream << - "Creating bsrBarline '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -bsrBarline::~bsrBarline () -{} - -S_bsrCellsList bsrBarline::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create ( - fInputLineNumber); - - switch (fBarlineKind) { - case bsrBarline::kBarlineKindNone: - break; - case bsrBarline::kBarlineKindSpecial: - result-> - appendCellKindToCellsList ( - kDots13); - break; - case bsrBarline::kBarlineKindUnusual: - result-> - appendCellKindToCellsList ( - kDots123); - break; - case bsrBarline::kBarlineKindFinalDouble: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, - kDots126, kDots13)); - break; - case bsrBarline::kBarlineKindSectionalDouble: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, - kDots126, kDots13, kDots3)); - break; - } // switch - - return result; -} - -int bsrBarline::fetchCellsNumber() const -{ - return fBarlineCellsList->fetchCellsNumber(); -} - -void bsrBarline::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrBarline::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrBarline elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrBarline::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrBarline::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrBarline::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrBarline elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrBarline::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrBarline::browseData (basevisitor* v) -{} - -string bsrBarline::barlineKindAsString ( - bsrBarlineKind barlineKind) -{ - string result; - - switch (barlineKind) { - case bsrBarline::kBarlineKindNone: - result = "barlineKindNone"; - break; - case bsrBarline::kBarlineKindSpecial: - result = "barlineKindSpecial"; - break; - case bsrBarline::kBarlineKindUnusual: - result = "barlineKindUnusual"; - break; - case bsrBarline::kBarlineKindFinalDouble: - result = "barlineKindFinalDouble"; - break; - case bsrBarline::kBarlineKindSectionalDouble: - result = "barlineKindSectionalDouble"; - break; - } // switch - - return result; -} - -string bsrBarline::asString () const -{ - stringstream s; - - s << - "Barline" << - ", " << barlineKindAsString (fBarlineKind) << - ", barlineCellsList: " << fBarlineCellsList->asShortString () << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrBarline::print (ostream& os) const -{ - os << - "Barline" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 17; - - os << - setw (fieldWidth) << - "barlineKind" << " : " << barlineKindAsString (fBarlineKind) << - endl << - setw (fieldWidth) << - "barlineCellsList" << " : " << fBarlineCellsList->asShortString () << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrBarline& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrBarlines_MUT_DEP.h b/src/lilypond/bsrBarlines_MUT_DEP.h deleted file mode 100644 index 2f3c6e412..000000000 --- a/src/lilypond/bsrBarlines_MUT_DEP.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrBarline; -typedef SMARTP S_bsrBarline; - -class bsrBarline : public bsrLineElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrBarlineKind { - kBarlineKindNone, - kBarlineKindSpecial, // for dotted or dashed barlines - kBarlineKindUnusual, // irregular spacing, ... - kBarlineKindFinalDouble, kBarlineKindSectionalDouble }; - - static string barlineKindAsString ( - bsrBarlineKind barlineKind); - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - bsrBarlineKind barlineKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrBarline ( - int inputLineNumber, - bsrBarlineKind barlineKin); - - virtual ~bsrBarline (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrBarlineKind getBarlineKind () const - { return fBarlineKind; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fBarlineCellsList; } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList barlineKindAsCellsList (); - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrBarlineKind fBarlineKind; - - S_bsrCellsList fBarlineCellsList; -}; -typedef SMARTP S_bsrBarline; -EXP ostream& operator<< (ostream& os, const S_bsrBarline& elt); - diff --git a/src/lilypond/bsrBasicTypes.cpp b/src/lilypond/bsrBasicTypes.cpp deleted file mode 100644 index 9996f7ed5..000000000 --- a/src/lilypond/bsrBasicTypes.cpp +++ /dev/null @@ -1,672 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include // INT_MIN, INT_MAX - -#include "utilities.h" - -#include "bsrBasicTypes.h" - -#include "messagesHandling.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" -#include "brailleOah.h" - - -//using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -string bsrCellKindAsShortString (bsrCellKind cellKind) -{ - string result; - - switch (cellKind) { - case kCellUnknown : result = "***cellUnknown***"; break; - - // non 6dots values - case kCellEOL : result = "EOL"; break; - case kCellEOP : result = "EOP"; break; - - // 6dots values for Braille music - case kDotsNone : result = ".Space"; break; - - case kDots1 : result = ".1"; break; - case kDots2 : result = ".2"; break; - case kDots12 : result = ".12"; break; - case kDots3 : result = ".3"; break; - case kDots13 : result = ".13"; break; - case kDots23 : result = ".23"; break; - case kDots123 : result = ".123"; break; - case kDots4 : result = ".4"; break; - case kDots14 : result = ".14"; break; - case kDots24 : result = ".24"; break; - case kDots124 : result = ".124"; break; - case kDots34 : result = ".34"; break; - case kDots134 : result = ".134"; break; - case kDots234 : result = ".234"; break; - case kDots1234 : result = ".1234"; break; - - case kDots5 : result = ".5"; break; - case kDots15 : result = ".15"; break; - case kDots25 : result = ".25"; break; - case kDots125 : result = ".125"; break; - case kDots35 : result = ".35"; break; - case kDots135 : result = ".135"; break; - case kDots235 : result = ".235"; break; - case kDots1235 : result = ".1235"; break; - case kDots45 : result = ".45"; break; - case kDots145 : result = ".145"; break; - case kDots245 : result = ".245"; break; - case kDots1245 : result = ".1245"; break; - case kDots345 : result = ".345"; break; - case kDots1345 : result = ".1345"; break; - case kDots2345 : result = ".2345"; break; - case kDots12345 : result = ".12345"; break; - - case kDots6 : result = ".6"; break; - case kDots16 : result = ".16"; break; - case kDots26 : result = ".26"; break; - case kDots126 : result = ".126"; break; - case kDots36 : result = ".36"; break; - case kDots136 : result = ".136"; break; - case kDots236 : result = ".236"; break; - case kDots1236 : result = ".1236"; break; - case kDots46 : result = ".46"; break; - case kDots146 : result = ".146"; break; - case kDots246 : result = ".246"; break; - case kDots1246 : result = ".1246"; break; - case kDots346 : result = ".346"; break; - case kDots1346 : result = ".1346"; break; - case kDots2346 : result = ".2346"; break; - case kDots12346 : result = ".12346"; break; - - case kDots56 : result = ".56"; break; - case kDots156 : result = ".156"; break; - case kDots256 : result = ".256"; break; - case kDots1256 : result = ".1256"; break; - case kDots356 : result = ".356"; break; - case kDots1356 : result = ".1356"; break; - case kDots2356 : result = ".2356"; break; - case kDots12356 : result = ".12356"; break; - case kDots456 : result = ".456"; break; - case kDots1456 : result = ".1456"; break; - case kDots2456 : result = ".2456"; break; - case kDots12456 : result = ".12456"; break; - case kDots3456 : result = ".3456"; break; - case kDots13456 : result = ".13456"; break; - case kDots23456 : result = ".23456"; break; - case kDots123456 : result = ".123456"; break; - } // switch - - return result; -} - -//______________________________________________________________________________ -string bsrCellKindAsString (bsrCellKind cellKind) -{ - string result; - - switch (cellKind) { - // non 6dots values - case kCellEOL : result = "CellEOL"; break; - case kCellEOP : result = "CellEOP"; break; - - // 6dots values for Braille music - case kDotsNone : result = "Space"; break; - - case kDots1 : result = "Dots1"; break; - case kDots2 : result = "Dots2"; break; - case kDots12 : result = "Dots12"; break; - case kDots3 : result = "Dots3"; break; - case kDots13 : result = "Dots13"; break; - case kDots23 : result = "Dots23"; break; - case kDots123 : result = "Dots123"; break; - case kDots4 : result = "Dots4"; break; - case kDots14 : result = "Dots14"; break; - case kDots24 : result = "Dots24"; break; - case kDots124 : result = "Dots124"; break; - case kDots34 : result = "Dots34"; break; - case kDots134 : result = "Dots134"; break; - case kDots234 : result = "Dots234"; break; - case kDots1234 : result = "Dots1234"; break; - - case kDots5 : result = "Dots5"; break; - case kDots15 : result = "Dots15"; break; - case kDots25 : result = "Dots25"; break; - case kDots125 : result = "Dots125"; break; - case kDots35 : result = "Dots35"; break; - case kDots135 : result = "Dots135"; break; - case kDots235 : result = "Dots235"; break; - case kDots1235 : result = "Dots1235"; break; - case kDots45 : result = "Dots45"; break; - case kDots145 : result = "Dots145"; break; - case kDots245 : result = "Dots245"; break; - case kDots1245 : result = "Dots1245"; break; - case kDots345 : result = "Dots345"; break; - case kDots1345 : result = "Dots1345"; break; - case kDots12345 : result = "Dots12345"; break; - - case kDots6 : result = "Dots6"; break; - case kDots16 : result = "Dots16"; break; - case kDots26 : result = "Dots26"; break; - case kDots126 : result = "Dots126"; break; - case kDots36 : result = "Dots36"; break; - case kDots136 : result = "Dots136"; break; - case kDots236 : result = "Dots236"; break; - case kDots1236 : result = "Dots1236"; break; - case kDots46 : result = "Dots46"; break; - case kDots146 : result = "Dots146"; break; - case kDots246 : result = "Dots246"; break; - case kDots1246 : result = "Dots1246"; break; - case kDots346 : result = "Dots346"; break; - case kDots1346 : result = "Dots1346"; break; - case kDots2346 : result = "Dots2346"; break; - case kDots12346 : result = "Dots12346"; break; - - case kDots56 : result = "Dots56"; break; - case kDots156 : result = "Dots156"; break; - case kDots256 : result = "Dots256"; break; - case kDots1256 : result = "Dots1256"; break; - case kDots356 : result = "Dots356"; break; - case kDots1356 : result = "Dots1356"; break; - case kDots2356 : result = "Dots2356"; break; - case kDots12356 : result = "Dots12356"; break; - case kDots456 : result = "Dots456"; break; - case kDots1456 : result = "Dots1456"; break; - case kDots2456 : result = "Dots2456"; break; - case kDots12456 : result = "Dots12456"; break; - case kDots3456 : result = "Dots3456"; break; - case kDots13456 : result = "Dots13456"; break; - case kDots23456 : result = "Dots23456"; break; - case kDots123456 : result = "Dots123456"; break; - - default: result = "Dot6???"; - } // switch - - return result; -} - -// braille output kinds -//______________________________________________________________________________ -map - gBsrBrailleOutputKindsMap; - -void initializeBsrBrailleOutputKindsMap () -{ - gBsrBrailleOutputKindsMap ["ascii"] = kBrailleOutputAscii; // default - gBsrBrailleOutputKindsMap ["utf8"] = kBrailleOutputUTF8; - gBsrBrailleOutputKindsMap ["utf16"] = kBrailleOutputUTF16; -} - -string bsrBrailleOutputKindAsString ( - bsrBrailleOutputKind brailleOutputKind) -{ - string result; - - // no CamelCase here, these strings are used in the command line options - switch (brailleOutputKind) { - case kBrailleOutputAscii: - result = "ascii"; - break; - case kBrailleOutputUTF8: - result = "utf8"; - break; - case kBrailleOutputUTF16: - result = "utf16"; - break; - } // switch - - return result; -} - -string existingBsrBrailleOutputKinds (int namesListMaxLength) -{ - stringstream s; - - if (gBsrBrailleOutputKindsMap.size ()) { - map::const_iterator - iBegin = gBsrBrailleOutputKindsMap.begin (), - iEnd = gBsrBrailleOutputKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -// chords languages -//______________________________________________________________________________ - -map - gBsrTextsLanguageKindsMap; - -void initializeBsrTextsLanguageKindsMap () -{ - gBsrTextsLanguageKindsMap ["english"] = kTextsEnglish; // default - gBsrTextsLanguageKindsMap ["german"] = kTextsGerman; - gBsrTextsLanguageKindsMap ["italian"] = kTextsItalian; - gBsrTextsLanguageKindsMap ["french"] = kTextsFrench; -} - -string bsrTextsLanguageKindAsString ( - bsrTextsLanguageKind languageKind) -{ - string result; - - switch (languageKind) { - case kTextsEnglish: // default value - result = "english"; - break; - case kTextsGerman: - result = "german"; - break; - case kTextsItalian: - result = "italian"; - break; - case kTextsFrench: - result = "french"; - break; - } // switch - - return result; -} - -string existingBsrTextsLanguageKinds (int namesListMaxLength) -{ - stringstream s; - - if (gBsrTextsLanguageKindsMap.size ()) { - map::const_iterator - iBegin = gBsrTextsLanguageKindsMap.begin (), - iEnd = gBsrTextsLanguageKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -/* -//______________________________________________________________________________ -void write_wchar_t ( wchar_t cell ) -{ - union Conversion { - wchar_t cellar; - unsigned char chars [2]; - } conversion; - - conversion.cellar = cell; - - // write in reverse order! - cout << conversion.chars [0] << conversion.chars [1]; -} - -void write_wstring (ostream& os, wstring wstr ) -{ - for (unsigned int i = 0; i < wstr.size (); i++) { - wchar_t cell = wstr [i]; - write_wchar_t (os, cell); - } // for -} - -ostream& operator<< (ostream& os, const wstring& wstr) -{ - for (unsigned int i = 0; i < wstr.size (); i++) { - wchar_t cell = wstr [i]; - - union Conversion { - wchar_t cellar; - unsigned char chars [2]; - } conversion; - - conversion.cellar = cell; - - // write in reverse order! - os << conversion.chars [0] << conversion.chars [1]; - } // for - - return os; -} -*/ - -//______________________________________________________________________________ -void bsrMusicXMLWarning ( - string inputSourceName, - int inputLineNumber, - string message) -{ - msrWarning ( - "BSR", - inputSourceName, - inputLineNumber, - message); -} - -//______________________________________________________________________________ -void bsrInternalError ( - string inputSourceName, - int inputLineNumber, - string sourceCodeFileName, - int sourceCodeLineNumber, - string message) -{ - msrError ( - "BSR INTERNAL", - inputSourceName, - inputLineNumber, - sourceCodeFileName, - sourceCodeLineNumber, - message); - - abort (); -} - -//______________________________________________________________________________ -void initializeBSRBasicTypes () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing BSR basic types handling" << - endl; - } -#endif - - // BSR braille output kinds handling - // ------------------------------------------------------ - - initializeBsrBrailleOutputKindsMap (); - - // BSR texts languages handling - // ------------------------------------------------------ - - initializeBsrTextsLanguageKindsMap (); -} - - -} - - - /* JMI KEEP JUST IN CASE - switch (cell) { - case kBOMBigEndian = L'\ufeff'; break; - case kBOMSmallEndian = L'\ufeff'; break; - - case kBrailleEOL = L'\u000a'; break; - case kBrailleEOP = L'\u000c'; break; - - case kDotsNone = L'\u2800'; break; - case kDots1 = L'\u2801'; break; - case kDots2 = L'\u2802'; break; - case kDots12 = L'\u2803'; break; - case kDots3 = L'\u2804'; break; - case kDots13 = L'\u2805'; break; - case kDots23 = L'\u2806'; break; - case kDots123 = L'\u2807'; break; - case kDots4 = L'\u2808'; break; - case kDots14 = L'\u2809'; break; - case kDots24 = L'\u280a'; break; - case kDots124 = L'\u280b'; break; - case kDots34 = L'\u280c'; break; - case kDots134 = L'\u280d'; break; - case kDots234 = L'\u280e'; break; - case kDots1234 = L'\u280f'; break; - - case kDots5 = L'\u2810'; break; - case kDots15 = L'\u2811'; break; - case kDots25 = L'\u2812'; break; - case kDots125 = L'\u2813'; break; - case kDots35 = L'\u2814'; break; - case kDots135 = L'\u2815'; break; - case kDots235 = L'\u2816'; break; - case kDots1235 = L'\u2817'; break; - case kDots45 = L'\u2818'; break; - case kDots145 = L'\u2819'; break; - case kDots245 = L'\u281a'; break; - case kDots1245 = L'\u281b'; break; - case kDots345 = L'\u281c'; break; - case kDots1345 = L'\u281d'; break; - case kDots2345 = L'\u281e'; break; - case kDots12345 = L'\u281f'; break; - - case kDots6 = L'\u2820'; break; - case kDots16 = L'\u2821'; break; - case kDots26 = L'\u2822'; break; - case kDots126 = L'\u2823'; break; - case kDots36 = L'\u2824'; break; - case kDots136 = L'\u2825'; break; - case kDots236 = L'\u2826'; break; - case kDots1236 = L'\u2827'; break; - case kDots46 = L'\u2828'; break; - case kDots146 = L'\u2829'; break; - case kDots246 = L'\u282a'; break; - case kDots1246 = L'\u282b'; break; - case kDots346 = L'\u282c'; break; - case kDots1346 = L'\u282d'; break; - case kDots2346 = L'\u282e'; break; - case kDots12346 = L'\u282f'; break; - - case kDots56 = L'\u2830'; break; - case kDots156 = L'\u2831'; break; - case kDots256 = L'\u2832'; break; - case kDots1256 = L'\u2833'; break; - case kDots356 = L'\u2834'; break; - case kDots1356 = L'\u2835'; break; - case kDots2356 = L'\u2836'; break; - case kDots12356 = L'\u2837'; break; - case kDots456 = L'\u2838'; break; - case kDots1456 = L'\u2839'; break; - case kDots2456 = L'\u283a'; break; - case kDots12456 = L'\u283b'; break; - case kDots3456 = L'\u283c'; break; - case kDots13456 = L'\u283d'; break; - case kDots23456 = L'\u283e'; break; - case kDots123456 = L'\u283f'; break; - - default: result = "Dot6???"; - } // switch - */ - -//______________________________________________________________________________ -/* -string bsrCellKindAsShortString (bsrCellKind cellKind) -{ - string result; - - switch (cellKind) { - - // lower case letters - case kCellA: result = "kCellA"; break; // kDots1, - case kCellB: result = "kCellB"; break; // kDots12, - case kCellC: result = "kCellC"; break; // kDots14, - case kCellD: result = "kCellD"; break; // kDots145, - case kCellE: result = "kCellE"; break; // kDots15, - case kCellF: result = "kCellF"; break; // kDots124, - case kCellG: result = "kCellG"; break; // kDots1245, - case kCellH: result = "kCellH"; break; // kDots125, - case kCellI: result = "kCellI"; break; // kDots24, - case kCellJ: result = "kCellJ"; break; // kDots245, - - case kCellK: result = "kCellK"; break; // kDots13, - case kCellL: result = "kCellL"; break; // kDots123, - case kCellM: result = "kCellM"; break; // kDots134, - case kCellN: result = "kCellN"; break; // kDots1345, - case kCellO: result = "kCellO"; break; // kDots135, - case kCellP: result = "kCellP"; break; // kDots1234, - case kCellQ: result = "kCellQ"; break; // kDots12345, - case kCellR: result = "kCellR"; break; // kDots1235, - case kCellS: result = "kCellS"; break; // kDots234, - case kCellT: result = "kCellT"; break; // kDots2345, - - case kCellU: result = "kCellU"; break; // kDots136, - case kCellV: result = "kCellV"; break; // kDots1236, - case kCellW: result = "kCellW"; break; // kDots2456, - case kCellX: result = "kCellX"; break; // kDots1346, - case kCellY: result = "kCellY"; break; // kDots13456, - case kCellZ: result = "kCellZ"; break; // kDots1356; - - // lower decimal digits - case kCellLower1: result = "kCellLower1"; break; // kDots2, - case kCellLower2: result = "kCellLower2"; break; // kDots23, - case kCellLower3: result = "kCellLower3"; break; // kDots25, - case kCellLower4: result = "kCellLower4"; break; // kDots256, - case kCellLower5: result = "kCellLower5"; break; // kDots26, - case kCellLower6: result = "kCellLower6"; break; // kDots235, - case kCellLower7: result = "kCellLower7"; break; // kDots2356, - case kCellLower8: result = "kCellLower8"; break; // kDots236, - case kCellLower9: result = "kCellLower9"; break; // kDots35, - case kCellLower0: result = "kCellLower0"; break; // kDots356; - - // arithmetic operators - case kCell_ac_plus : result = "FOO"; break; // kDots235, - case kCell_ac_minus : result = "FOO"; break; // kDots36, - case kCell_ac_times : result = "FOO"; break; // kDots35, - case kCell_ac_dividedBy: result = "FOO"; break; // kDots25, - case kCell_ac_equals : result = "FOO"; break; // kDots2356; - - // punctuation - case kCellDot : result = "FOO"; break; // kDots256, - case kCellComma : result = "FOO"; break; // kDots2, - case kCellQuestionMark : result = "FOO"; break; // kDots26, - case kCellSemicolon : result = "FOO"; break; // kDots23, - case kCellColon : result = "FOO"; break; // kDots25, - case kCellExclamationMark : result = "FOO"; break; // kDots235, - case kCellLeftParenthesis : result = "FOO"; break; // kDots236, - case kCellRightParenthesis: result = "FOO"; break; // kDots356, - case kCellDoubleQuote : result = "FOO"; break; // kDots2356, - case kCellDash : result = "FOO"; break; // kDots36, - case kCellQuote : result = "FOO"; break; // kDots3; - - // other symbols - case kCellSlash : result = "FOO"; break; // kDots34, - case kCellVerseEnd: result = "FOO"; break; // kDots345, - case kCellItalics : result = "FOO"; break; // kDots456, - case kCellAsterisk: result = "FOO"; break; // kDots35, - case kCellExponent: result = "FOO"; break; // kDots4; - - // intervals - case kCellSecond : result = "kCellSecond"; break; // kDots34, - case kCellThird : result = "kCellThird"; break; // kDots346, - case kCellFourth : result = "kCellFourth"; break; // kDots3456, - case kCellFifth : result = "kCellFifth"; break; // kDots35, - case kCellSixth : result = "kCellSixth"; break; // kDots356, - case kCellSeventh: result = "kCellSeventh"; break; // kDots25, - case kCellEighth : result = "kCellEighth"; break; // kDots36; - - // triplets - case kCellTriplet : result = "kCellTriplet"; break; // kDots23; - - // hyphens - case kCellMusicHyphen: result = "kCellMusicHyphen"; break; // kDots5; - - // keyboard hands - case kCellRightHand: result = "FOO"; break; // { kDots46, kDots345 }, - case kCellLeftHand: result = "FOO"; break; // { kDots456, kDots345 }; - - // bars - case kCellFinalDoubleBar : result = "kCellFinalDoubleBar"; break; // { kDots126, kDots13 }, - case kCellSectionalDoubleBar: result = "kCellSectionalDoubleBar"; break; // { kDots126, kDots13, kDots3 }; - - // measure divisions - case kCellMeasureDivisionSign: result = "FOO"; break; // { kDots46, kDots13 }; - - // words - case kCellWordSign : result = "kCellWordSign"; break; // kDots345, - case kCellWordApostrophe: result = "kCellWordApostrophe"; break; // kDots6; - - // pages - case kCellPagination: result = "kCellPagination"; break; // { kDots5, kDots25 }; - - // parentheses - case kCellLiteraryLeftParenthesis : result = "kCellLiteraryLeftParenthesis"; break; //{ kDots5, kDots126 }, - case kCellLiteraryRightParenthesis : result = "kCellLiteraryRightParenthesis"; break; //{ kDots5, kDots345 }, - case kCellMusicParentheses : result = "kCellMusicParentheses"; break; //{ kDots6, kDots3 }, - case kCellSpecialParentheses : result = "kCellSpecialParentheses"; break; //{ kDots2356, kDots2356 }; - - case kCellParagraph : result = "FOO"; break; //{ kDots5, kDots1234 }, - case kCellAmpersand : result = "FOO"; break; //{ kDots5, kDots123456 }, - case kCellUpsilon : result = "FOO"; break; //{ kDots45, kDots13456 }: result = "FOO"; break; // better name JMI ??? - case kCellEuro : result = "FOO"; break; //{ kDots45, kDots15 }, - case kCellDollar : result = "FOO"; break; //{ kDots45, kDots234 }, - case kCellPound : result = "FOO"; break; //{ kDots45, kDots123 }, - case kCellCopyright : result = "FOO"; break; //{ kDots5, kDots14 }, - case kCellRegisteredTradeMark : result = "FOO"; break; //{ kDots5, kDots1235 }, - case kCellTradeMark : result = "FOO"; break; //{ kDots5, kDots2345 }, - case kCellPercent : result = "FOO"; break; //{ kDots5, kDots346 }, - case kCellPerthousand : result = "FOO"; break; //{ kDots5, kDots346, kDots346 }, - case kCellPertenthousand : result = "FOO"; break; //{ kDots5, kDots346, kDots346, kDots346 }; - - // fermatas - case kCellFermataOnANote : result = "FOO"; break; //{ kDots146, kDots126, kDots123 }, - case kCellFermataBetweenNotes : result = "FOO"; break; //{ kDots5, kDots126, kDots123 }, - case kCellFermataOverABarline : result = "FOO"; break; //{ kDots456, kDots126, kDots123 }; - } // switch - - return result; -} - - -string bsrCellKindAsString (bsrCellKind cellKind) -{ - return bsrCellKindAsShortString (cellKind); -} -*/ - diff --git a/src/lilypond/bsrBasicTypes.h b/src/lilypond/bsrBasicTypes.h deleted file mode 100644 index d2ea67f30..000000000 --- a/src/lilypond/bsrBasicTypes.h +++ /dev/null @@ -1,994 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrBasicTypes___ -#define ___bsrBasicTypes___ - -#include -#include - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -// cell kinds -//______________________________________________________________________________ -enum bsrCellKind { - kCellUnknown, - - // non 6dots values - kCellEOL , // L'\u000a' - kCellEOP , // L'\u000c' - - // 6dots values for Braille music - kDotsNone , // L'\u2800' - kDots1 , // L'\u2801' - kDots2 , // L'\u2802' - kDots12 , // L'\u2803' - kDots3 , // L'\u2804' - kDots13 , // L'\u2805' - kDots23 , // L'\u2806' - kDots123 , // L'\u2807' - kDots4 , // L'\u2808' - kDots14 , // L'\u2809' - kDots24 , // L'\u280a' - kDots124 , // L'\u280b' - kDots34 , // L'\u280c' - kDots134 , // L'\u280d' - kDots234 , // L'\u280e' - kDots1234 , // L'\u280f' - - kDots5 , // L'\u2810' - kDots15 , // L'\u2811' - kDots25 , // L'\u2812' - kDots125 , // L'\u2813' - kDots35 , // L'\u2814' - kDots135 , // L'\u2815' - kDots235 , // L'\u2816' - kDots1235 , // L'\u2817' - kDots45 , // L'\u2818' - kDots145 , // L'\u2819' - kDots245 , // L'\u281a' - kDots1245 , // L'\u281b' - kDots345 , // L'\u281c' - kDots1345 , // L'\u281d' - kDots2345 , // L'\u281e' - kDots12345 , // L'\u281f' - - kDots6 , // L'\u2820' - kDots16 , // L'\u2821' - kDots26 , // L'\u2822' - kDots126 , // L'\u2823' - kDots36 , // L'\u2824' - kDots136 , // L'\u2825' - kDots236 , // L'\u2826' - kDots1236 , // L'\u2827' - kDots46 , // L'\u2828' - kDots146 , // L'\u2829' - kDots246 , // L'\u282a' - kDots1246 , // L'\u282b' - kDots346 , // L'\u282c' - kDots1346 , // L'\u282d' - kDots2346 , // L'\u282e' - kDots12346 , // L'\u282f' - - kDots56 , // L'\u2830' - kDots156 , // L'\u2831' - kDots256 , // L'\u2832' - kDots1256 , // L'\u2833' - kDots356 , // L'\u2834' - kDots1356 , // L'\u2835' - kDots2356 , // L'\u2836' - kDots12356 , // L'\u2837' - kDots456 , // L'\u2838' - kDots1456 , // L'\u2839' - kDots2456 , // L'\u283a' - kDots12456 , // L'\u283b' - kDots3456 , // L'\u283c' - kDots13456 , // L'\u283d' - kDots23456 , // L'\u283e' - kDots123456 // L'\u283f' -}; - -//______________________________________________________________________________ -string bsrCellKindAsShortString (bsrCellKind cellKind); - -string bsrCellKindAsString (bsrCellKind cellKind); - -// lower case letters -//______________________________________________________________________________ -const bsrCellKind - kCellA = kDots1, - kCellB = kDots12, - kCellC = kDots14, - kCellD = kDots145, - kCellE = kDots15, - kCellF = kDots124, - kCellG = kDots1245, - kCellH = kDots125, - kCellI = kDots24, - kCellJ = kDots245, - - kCellK = kDots13, - kCellL = kDots123, - kCellM = kDots134, - kCellN = kDots1345, - kCellO = kDots135, - kCellP = kDots1234, - kCellQ = kDots12345, - kCellR = kDots1235, - kCellS = kDots234, - kCellT = kDots2345, - - kCellU = kDots136, - kCellV = kDots1236, - kCellW = kDots2456, - kCellX = kDots1346, - kCellY = kDots13456, - kCellZ = kDots1356; - -// capitals -//______________________________________________________________________________ -const bsrCellKind - kCellCapitalsSign = kDots46; -// kCellCapitalsSequenceSign, // { kCellCapitalsSign, kCellCapitalsSign }; - -// decimal digits -//______________________________________________________________________________ -const bsrCellKind - kCellNumberSign = kDots3456, - kCell1 = kCellA, - kCell2 = kCellB, - kCell3 = kCellC, - kCell4 = kCellD, - kCell5 = kCellE, - kCell6 = kCellF, - kCell7 = kCellG, - kCell8 = kCellH, - kCell9 = kCellI, - kCell0 = kCellJ; - -// lower decimal digits -//______________________________________________________________________________ -const bsrCellKind - kCellLower1 = kDots2, - kCellLower2 = kDots23, - kCellLower3 = kDots25, - kCellLower4 = kDots256, - kCellLower5 = kDots26, - kCellLower6 = kDots235, - kCellLower7 = kDots2356, - kCellLower8 = kDots236, - kCellLower9 = kDots35, - kCellLower0 = kDots356; - -// alterations -//______________________________________________________________________________ -const bsrCellKind - kCellFlat = kDots126, - kCellNatural = kDots16, - kCellSharp = kDots146; - -// augmentation dots -//______________________________________________________________________________ -const bsrCellKind - kCellAugmentationDot = kDots3; - -// arithmetic operators -//______________________________________________________________________________ -const bsrCellKind - kCell_ac_plus = kDots235, - kCell_ac_minus = kDots36, - kCell_ac_times = kDots35, - kCell_ac_dividedBy = kDots25, - kCell_ac_equals = kDots2356; - -// words -//______________________________________________________________________________ -const bsrCellKind - kCellWordSign = kDots345, - - kCellWordApostrophe = kDots6, - - kCellParenthesis = kDots2356, - kCellQuestionMark = kDots26; - -// braille cells -//______________________________________________________________________________ -void brailleCellKindAsUTF8 (bsrCellKind cellKind, ostream& os); -void brailleCellKindAsUTF16 (bsrCellKind cellKind, ostream& os); - -void brailleCellKind (bsrCellKind cellKind, ostream& os); - -// braille output kinds -//______________________________________________________________________________ -enum bsrBrailleOutputKind { - kBrailleOutputAscii, // default value - kBrailleOutputUTF8, kBrailleOutputUTF16 }; - -string bsrBrailleOutputKindAsString ( - bsrBrailleOutputKind brailleOutputKind); - -extern map - gBsrBrailleOutputKindsMap; - -string existingBsrBrailleOutputKinds (int namesListMaxLength); - -void initializeBsrBrailleOutputKindsMap (); - -// chords languages -//______________________________________________________________________________ -enum bsrTextsLanguageKind { - kTextsEnglish, // BANA's default - kTextsGerman, kTextsItalian, kTextsFrench }; - -string bsrTextsLanguageKindAsString ( - bsrTextsLanguageKind languageKind); - -extern map - gBsrTextsLanguageKindsMap; - -string existingBsrTextsLanguageKinds (int namesListMaxLength); - -void initializeBsrTextsLanguageKindsMap (); - - -/* -//______________________________________________________________________________ -// brailling numbers -wstring braille (int n); - -//______________________________________________________________________________ -// brailling characters and strings -bsrDot6Cell braille (char ch); - -wstring braille (string str); - -//______________________________________________________________________________ -// writing UTF-16 to ostreams -void write_bsrDot6Cell (ostream& os, bsrDot6Cell cell); - -void write_bsrDot6Cell ( bsrDot6Cell cell ); - -EXP ostream& operator<< (ostream& os, const bsrDot6Cell cell); - -void write_wstring (ostream& os, wstring wstr ); - -EXP ostream& operator<< (ostream& os, const wstring& wstr); -*/ - -// warnings and errors -//______________________________________________________________________________ -EXP void bsrMusicXMLWarning ( - std::string inputSourceName, - int inputLineNumber, - std::string message); - -EXP void bsrInternalError ( - std::string inputSourceName, - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -// initialization -//______________________________________________________________________________ -void initializeBSRBasicTypes (); - - -} // namespace MusicXML2 - - -#endif - - -/* -from https://brltty.app/pipermail/brltty/2012-October/009556.html : - -[BRLTTY] Braille Code - -Dave Mielke dave at mielke.cc -Wed Oct 10 14:15:08 EDT 2012 -Previous message: [BRLTTY] Braille Code -Next message: [BRLTTY] Braille Code -Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] -[quoted lines by Dave Mielke on 2012/10/10 at 14:13 -0400] - ->Each language has its own mapping. That being said, the NABCC (North American ->Braille Computer Code) is probably as good a place to start as any. You can ->find a table for that mapping within the file Tables/en-nabcc.ttb in brltty's ->source tree. I've attached it to this message, as well. - -I forgot to attach the table. Here it is. - --- -Dave Mielke | 2213 Fox Crescent | The Bible is the very Word of God. -Phone: 1-613-726-0014 | Ottawa, Ontario | 2011 May 21 is the End of Salvation. -EMail: dave at mielke.cc | Canada K2A 1H7 | http://Mielke.cc/now.html -http://FamilyRadio.com/ | http://Mielke.cc/bible/ --------------- next part -------------- -############################################################################### -# BRLTTY - A background process providing access to the console screen (when in -# text mode) for a blind person using a refreshable braille display. -# -# Copyright (C) 1995-2012 by The BRLTTY Developers. -# -# BRLTTY comes with ABSOLUTELY NO WARRANTY. -# -# This is free software, placed under the terms of the -# GNU Lesser General Public License, as published by the Free Software -# Foundation; either version 2.1 of the License, or (at your option) any -# later version. Please see the file LICENSE-LGPL for details. -# -# Web Page: http://mielke.cc/brltty/ -# -# This software is maintained by Dave Mielke . -############################################################################### - -# BRLTTY Text Table - English (North American Braille Computer Code) - -# This is a description of the default text table used by BRLTTY. -# It's based on the North American Braille Computer Code, but defines the full -# Latin1 (ISO-8859-1) character set. - -# The 95 printable characters of the standard 7-bit US-ASCII character set -# (32-126) are identical to their representations within the North American -# Braille Computer Code (these are the only characters which the NABCC actually -# defines). Characters from literary braille, symbols from The Nemeth Braille -# Code for Mathematics and Science Notation, and a bit of human imagination -# have all been combined to create an easy-to-remember, one-to-one mapping -# between each character and its braille counterpart. All possible combinations -# involving only the original 6 braille dots are used, but that only allows for -# 64 out of the required 95 character representations. The presence or absence -# of dot 7 is used to differentiate between pairs of characters which either -# are very closely related in meaning or, in a few cases where a more intuitive -# reason couldn't be found, have a very close logical relationship within the -# US-ASCII code. Dot 8 isn't used at all. - -# The space and the 26 lowercase letters (a-z) are the same as in literary -# braille: - - #Hex Dots Dec Char Description -char \X20 ( ) # 32 space -char \X61 (1 ) # 97 a latin small letter a -char \X62 (12 ) # 98 b latin small letter b -char \X63 (1 4 ) # 99 c latin small letter c -char \X64 (1 45 ) # 100 d latin small letter d -char \X65 (1 5 ) # 101 e latin small letter e -char \X66 (12 4 ) # 102 f latin small letter f -char \X67 (12 45 ) # 103 g latin small letter g -char \X68 (12 5 ) # 104 h latin small letter h -char \X69 ( 2 4 ) # 105 i latin small letter i -char \X6A ( 2 45 ) # 106 j latin small letter j -char \X6B (1 3 ) # 107 k latin small letter k -char \X6C (123 ) # 108 l latin small letter l -char \X6D (1 34 ) # 109 m latin small letter m -char \X6E (1 345 ) # 110 n latin small letter n -char \X6F (1 3 5 ) # 111 o latin small letter o -char \X70 (1234 ) # 112 p latin small letter p -char \X71 (12345 ) # 113 q latin small letter q -char \X72 (123 5 ) # 114 r latin small letter r -char \X73 ( 234 ) # 115 s latin small letter s -char \X74 ( 2345 ) # 116 t latin small letter t -char \X75 (1 3 6 ) # 117 u latin small letter u -char \X76 (123 6 ) # 118 v latin small letter v -char \X77 ( 2 456 ) # 119 w latin small letter w -char \X78 (1 34 6 ) # 120 x latin small letter x -char \X79 (1 3456 ) # 121 y latin small letter y -char \X7A (1 3 56 ) # 122 z latin small letter z - -# The 26 uppercase letters (A-Z) are the same as their lowercase counterparts -# except that dot 7 is added: - - #Hex Dots Dec Char Description -char \X41 (1 7 ) # 65 A latin capital letter a -char \X42 (12 7 ) # 66 B latin capital letter b -char \X43 (1 4 7 ) # 67 C latin capital letter c -char \X44 (1 45 7 ) # 68 D latin capital letter d -char \X45 (1 5 7 ) # 69 E latin capital letter e -char \X46 (12 4 7 ) # 70 F latin capital letter f -char \X47 (12 45 7 ) # 71 G latin capital letter g -char \X48 (12 5 7 ) # 72 H latin capital letter h -char \X49 ( 2 4 7 ) # 73 I latin capital letter i -char \X4A ( 2 45 7 ) # 74 J latin capital letter j -char \X4B (1 3 7 ) # 75 K latin capital letter k -char \X4C (123 7 ) # 76 L latin capital letter l -char \X4D (1 34 7 ) # 77 M latin capital letter m -char \X4E (1 345 7 ) # 78 N latin capital letter n -char \X4F (1 3 5 7 ) # 79 O latin capital letter o -char \X50 (1234 7 ) # 80 P latin capital letter p -char \X51 (12345 7 ) # 81 Q latin capital letter q -char \X52 (123 5 7 ) # 82 R latin capital letter r -char \X53 ( 234 7 ) # 83 S latin capital letter s -char \X54 ( 2345 7 ) # 84 T latin capital letter t -char \X55 (1 3 67 ) # 85 U latin capital letter u -char \X56 (123 67 ) # 86 V latin capital letter v -char \X57 ( 2 4567 ) # 87 W latin capital letter w -char \X58 (1 34 67 ) # 88 X latin capital letter x -char \X59 (1 34567 ) # 89 Y latin capital letter y -char \X5A (1 3 567 ) # 90 Z latin capital letter z - -# The 10 decimal digits (0-9) are the same as in the Nemeth Code: - - #Hex Dots Dec Char Description -char \X30 ( 3 56 ) # 48 0 digit zero -char \X31 ( 2 ) # 49 1 digit one -char \X32 ( 23 ) # 50 2 digit two -char \X33 ( 2 5 ) # 51 3 digit three -char \X34 ( 2 56 ) # 52 4 digit four -char \X35 ( 2 6 ) # 53 5 digit five -char \X36 ( 23 5 ) # 54 6 digit six -char \X37 ( 23 56 ) # 55 7 digit seven -char \X38 ( 23 6 ) # 56 8 digit eight -char \X39 ( 3 5 ) # 57 9 digit nine - -# Common symbols used within mathematical expressions by popular computer -# programming languages are the same as in the Nemeth Code: - - #Hex Dots Dec Char Description -char \X2E ( 4 6 ) # 46 . full stop -char \X2B ( 34 6 ) # 43 + plus sign -char \X2D ( 3 6 ) # 45 - hyphen-minus -char \X2A (1 6 ) # 42 * asterisk -char \X2F ( 34 ) # 47 / solidus -char \X28 (123 56 ) # 40 ( left parenthesis -char \X29 ( 23456 ) # 41 ) right parenthesis - -# With all of these major considerations having been taken into account, -# convenient representations were still available, and are used, for some of -# the remaining characters: - - #Hex Dots Dec Char Description -char \X26 (1234 6 ) # 38 & ampersand -char \X23 ( 3456 ) # 35 # number sign - -# The remaining characters are what they are. Dot 7 isn't used either within -# the number block (32-63) or, with the exception of the DEL control character -# (127), within the lowercase block (96-127). With the exception of the -# underscore (95), dot 7 is used for every character within the uppercase block -# (64-95). Adding dot 7 to any character within the lowercase block (96-127) -# yields its corresponding character within the uppercase block (64-95) except -# that removing dot 7 from the DEL control character yields the underscore. - - #Hex Dots Dec Char Description -char \X2C ( 6 ) # 44 , comma -char \X3B ( 56 ) # 59 ; semicolon -char \X3A (1 56 ) # 58 : colon -char \X21 ( 234 6 ) # 33 ! exclamation mark -char \X3F (1 456 ) # 63 ? question mark -char \X22 ( 5 ) # 34 " quotation mark -char \X27 ( 3 ) # 39 ' apostrophe -char \X60 ( 4 ) # 96 ` grave accent -char \X5E ( 45 7 ) # 94 ^ circumflex accent -char \X7E ( 45 ) # 126 ~ tilde -char \X5B ( 2 4 67 ) # 91 [ left square bracket -char \X5D (12 4567 ) # 93 ] right square bracket -char \X7B ( 2 4 6 ) # 123 { left curly bracket -char \X7D (12 456 ) # 125 } right curly bracket -char \X3D (123456 ) # 61 = equals sign -char \X3C (12 6 ) # 60 < less-than sign -char \X3E ( 345 ) # 62 > greater-than sign -char \X24 (12 4 6 ) # 36 $ dollar sign -char \X25 (1 4 6 ) # 37 % percent sign -char \X40 ( 4 7 ) # 64 @ commercial at -char \X7C (12 56 ) # 124 | vertical line -char \X5C (12 567 ) # 92 \ reverse solidus -char \X5F ( 456 ) # 95 _ low line - -# Each of the characters within the basic control character block (0-31) is the -# same as its corresponding character within both the uppercase block (64-95) -# and the lowercase block (96-127) except that dots 7 and 8 are both used. - - #Hex Dots Dec Char Description -char \X00 ( 4 78) # 0 ^@ null -char \X01 (1 78) # 1 ^A start of heading -char \X02 (12 78) # 2 ^B start of text -char \X03 (1 4 78) # 3 ^C end of text -char \X04 (1 45 78) # 4 ^D end of transmission -char \X05 (1 5 78) # 5 ^E enquiry -char \X06 (12 4 78) # 6 ^F acknowledge -char \X07 (12 45 78) # 7 ^G bell -char \X08 (12 5 78) # 8 ^H backspace -char \X09 ( 2 4 78) # 9 ^I horizontal tabulation -char \X0A ( 2 45 78) # 10 ^J line feed -char \X0B (1 3 78) # 11 ^K vertical tabulation -char \X0C (123 78) # 12 ^L form feed -char \X0D (1 34 78) # 13 ^M carriage return -char \X0E (1 345 78) # 14 ^N shift out -char \X0F (1 3 5 78) # 15 ^O shift in -char \X10 (1234 78) # 16 ^P data link escape -char \X11 (12345 78) # 17 ^Q device control one -char \X12 (123 5 78) # 18 ^R device control two -char \X13 ( 234 78) # 19 ^S device control three -char \X14 ( 2345 78) # 20 ^T device control four -char \X15 (1 3 678) # 21 ^U negative acknowledge -char \X16 (123 678) # 22 ^V synchronous idle -char \X17 ( 2 45678) # 23 ^W end of transmission block -char \X18 (1 34 678) # 24 ^X cancel -char \X19 (1 345678) # 25 ^Y end of medium -char \X1A (1 3 5678) # 26 ^Z substitute -char \X1B ( 2 4 678) # 27 ^[ escape -char \X1C (12 5678) # 28 ^\ file separator -char \X1D (12 45678) # 29 ^] group separator -char \X1E ( 45 78) # 30 ^^ record separator -char \X1F ( 45678) # 31 ^_ unit separator - -# Each of the characters within the extended control character block (128-159) -# is the same as its corresponding character within the basic control character -# block (0-31) except that only dot 8 is used. - - #Hex Dots Dec Char Description -char \X80 ( 4 8) # 128 ~@ -char \X81 (1 8) # 129 ~A -char \X82 (12 8) # 130 ~B break permitted here -char \X83 (1 4 8) # 131 ~C no break here -char \X84 (1 45 8) # 132 ~D -char \X85 (1 5 8) # 133 ~E next line -char \X86 (12 4 8) # 134 ~F start of selected area -char \X87 (12 45 8) # 135 ~G end of selected area -char \X88 (12 5 8) # 136 ~H character tabulation set -char \X89 ( 2 4 8) # 137 ~I character tabulation with justification -char \X8A ( 2 45 8) # 138 ~J line tabulation set -char \X8B (1 3 8) # 139 ~K partial line down -char \X8C (123 8) # 140 ~L partial line up -char \X8D (1 34 8) # 141 ~M reverse line feed -char \X8E (1 345 8) # 142 ~N single shift two -char \X8F (1 3 5 8) # 143 ~O single shift three -char \X90 (1234 8) # 144 ~P device control string -char \X91 (12345 8) # 145 ~Q private use one -char \X92 (123 5 8) # 146 ~R private use two -char \X93 ( 234 8) # 147 ~S set transmit state -char \X94 ( 2345 8) # 148 ~T cancel character -char \X95 (1 3 6 8) # 149 ~U message waiting -char \X96 (123 6 8) # 150 ~V start of guarded area -char \X97 ( 2 456 8) # 151 ~W end of guarded area -char \X98 (1 34 6 8) # 152 ~X start of string -char \X99 (1 3456 8) # 153 ~Y -char \X9A (1 3 56 8) # 154 ~Z single character introducer -char \X9B ( 2 4 6 8) # 155 ~[ control sequence introducer -char \X9C (12 56 8) # 156 ~\ string terminator -char \X9D (12 456 8) # 157 ~] operating system command -char \X9E ( 45 8) # 158 ~^ privacy message -char \X9F ( 456 8) # 159 ~_ application program command - -# Representations for the uppercase accented letters are drawn from the -# remaining combinations which use both dots 7 and 8. The representation for a -# lowercase accented letter is the same as its uppercase counterpart except -# that dot 7 isn't used. This scheme retains the use of dot 7 as the modifier -# for a capitalized letter. The only exception to these rules is that, due to -# the nature of the Latin1 character set, the German lowercase double-s is -# treated as though it were an uppercase y-dieresis (neither has an uppercase -# definition). These representations have been gathered, as much as possible, -# into logical groupings. - -# The 5 letters with a circumflex accent (^) use the [1-5] dot combinations: - - #Hex Dots Dec Char Description -char \XC2 ( 2 78) # 194 ? latin capital letter a with circumflex -char \XCA ( 23 78) # 202 ? latin capital letter e with circumflex -char \XCE ( 2 5 78) # 206 ? latin capital letter i with circumflex -char \XD4 ( 2 5678) # 212 ? latin capital letter o with circumflex -char \XDB ( 2 678) # 219 ? latin capital letter u with circumflex -char \XE2 ( 2 8) # 226 ? latin small letter a with circumflex -char \XEA ( 23 8) # 234 ? latin small letter e with circumflex -char \XEE ( 2 5 8) # 238 ? latin small letter i with circumflex -char \XF4 ( 2 56 8) # 244 ? latin small letter o with circumflex -char \XFB ( 2 6 8) # 251 ? latin small letter u with circumflex - -# The 5 letters with a grave accent (`) use the [6-0] dot combinations: - - #Hex Dots Dec Char Description -char \XC0 ( 23 5 78) # 192 ? latin capital letter a with grave -char \XC8 ( 23 5678) # 200 ? latin capital letter e with grave -char \XCC ( 23 678) # 204 ? latin capital letter i with grave -char \XD2 ( 3 5 78) # 210 ? latin capital letter o with grave -char \XD9 ( 3 5678) # 217 ? latin capital letter u with grave -char \XE0 ( 23 5 8) # 224 ? latin small letter a with grave -char \XE8 ( 23 56 8) # 232 ? latin small letter e with grave -char \XEC ( 23 6 8) # 236 ? latin small letter i with grave -char \XF2 ( 3 5 8) # 242 ? latin small letter o with grave -char \XF9 ( 3 56 8) # 249 ? latin small letter u with grave - -# The 6 letters with an acute accent (') use the [a-f] dot combinations with -# dots 3 and 6 added: - - #Hex Dots Dec Char Description -char \XC1 (1 678) # 193 ? latin capital letter a with acute -char \XC9 (12 678) # 201 ? latin capital letter e with acute -char \XCD (1 4 678) # 205 ? latin capital letter i with acute -char \XD3 (1 45678) # 211 ? latin capital letter o with acute -char \XDA (1 5678) # 218 ? latin capital letter u with acute -char \XDD (12 4 678) # 221 ? latin capital letter y with acute -char \XE1 (1 6 8) # 225 ? latin small letter a with acute -char \XE9 (12 6 8) # 233 ? latin small letter e with acute -char \XED (1 4 6 8) # 237 ? latin small letter i with acute -char \XF3 (1 456 8) # 243 ? latin small letter o with acute -char \XFA (1 56 8) # 250 ? latin small letter u with acute -char \XFD (12 4 6 8) # 253 ? latin small letter y with acute - -# The 6 letters with a dieresis accent (") use the [f-j] dot combinations with -# dots 3 and 6 added, and the number sign (because it fits the sequence -# reasonably well): - - #Hex Dots Dec Char Description -char \XC4 (1234 678) # 196 ? latin capital letter a with diaeresis -char \XCB (12345678) # 203 ? latin capital letter e with diaeresis -char \XCF (123 5678) # 207 ? latin capital letter i with diaeresis -char \XD6 ( 234 678) # 214 ? latin capital letter o with diaeresis -char \XDC ( 2345678) # 220 ? latin capital letter u with diaeresis -char \XE4 (1234 6 8) # 228 ? latin small letter a with diaeresis -char \XEB (123456 8) # 235 ? latin small letter e with diaeresis -char \XEF (123 56 8) # 239 ? latin small letter i with diaeresis -char \XF6 ( 234 6 8) # 246 ? latin small letter o with diaeresis -char \XFC ( 23456 8) # 252 ? latin small letter u with diaeresis -char \XFF ( 3456 8) # 255 ? latin small letter y with diaeresis - -# There is no uppercase y-dieresis in the Latin1 character set. The German -# lowercase double-s, which also doesn't have an uppercase counterpart in the -# Latin1 character set, uses its representation: - - #Hex Dots Dec Char Description -char \XDF ( 345678) # 223 ? latin small letter sharp s - -# The remaining accented letters are: - - #Hex Dots Dec Char Description -char \XC3 ( 5 78) # 195 ? latin capital letter a with tilde -char \XD1 ( 4 678) # 209 ? latin capital letter n with tilde -char \XD5 ( 5678) # 213 ? latin capital letter o with tilde -char \XC5 ( 345 78) # 197 ? latin capital letter a with ring above -char \XC7 ( 34 678) # 199 ? latin capital letter c with cedilla -char \XD8 ( 34 78) # 216 ? latin capital letter o with stroke -char \XC6 ( 3 78) # 198 ? latin capital letter ae -char \XD0 ( 678) # 208 ? latin capital letter eth -char \XDE ( 3 678) # 222 ? latin capital letter thorn -char \XE3 ( 5 8) # 227 ? latin small letter a with tilde -char \XF1 ( 4 6 8) # 241 ? latin small letter n with tilde -char \XF5 ( 56 8) # 245 ? latin small letter o with tilde -char \XE5 ( 345 8) # 229 ? latin small letter a with ring above -char \XE7 ( 34 6 8) # 231 ? latin small letter c with cedilla -char \XF8 ( 34 8) # 248 ? latin small letter o with stroke -char \XE6 ( 3 8) # 230 ? latin small letter ae -char \XF0 ( 6 8) # 240 ? latin small letter eth -char \XFE ( 3 6 8) # 254 ? latin small letter thorn - -# Some characters are the same as other characters which they resemble but with -# dot 7 added: - - #Hex Dots Dec Char Description -char \XAD ( 3 67 ) # 173 ? soft hyphen -char \XAB (12 67 ) # 171 ? left-pointing double angle quotation mark -char \XBB ( 345 7 ) # 187 ? right-pointing double angle quotation mark -char \XA6 (1 567 ) # 166 ? broken bar -char \XB9 ( 2 7 ) # 185 ? superscript one -char \XB2 ( 23 7 ) # 178 ? superscript two -char \XB3 ( 2 5 7 ) # 179 ? superscript three -char \XB1 ( 34 67 ) # 177 ? plus-minus sign -char \XD7 (1 67 ) # 215 ? multiplication sign -char \XF7 ( 34 7 ) # 247 ? division sign -char \XB7 ( 4 67 ) # 183 ? middle dot -char \XA1 ( 234 67 ) # 161 ? inverted exclamation mark -char \XBF (1 4567 ) # 191 ? inverted question mark -char \XA2 (12 4 67 ) # 162 ? cent sign -char \XA3 ( 34567 ) # 163 ? pound sign - -# A few more characters follow this same convention but their relationships -# to their base characters is a bit obscure: - - #Hex Dots Dec Char Description -char \XA4 (1 4 67 ) # 164 ? currency sign -char \XA5 (1234 67 ) # 165 ? yen sign - -# Some characters are represented by the first letters of their names lowered -# by one row of dots: - - #Hex Dots Dec Char Description -char \XAC ( 2 567 ) # 172 ? not sign -char \XB6 ( 23 5 7 ) # 182 ? pilcrow sign -char \XA9 ( 23 567 ) # 169 ? copyright sign -char \XAE ( 23 67 ) # 174 ? registered sign -char \XA7 ( 3 5 7 ) # 167 ? section sign -char \XB0 ( 3 567 ) # 176 ? degree sign - -# The three fraction characters use combinations of dots 1 and 4 (which -# progress from left to right as the value of the fraction increases) together -# with dots 2,3,5,6,7: - - #Hex Dots Dec Char Description -char \XBC (123 567 ) # 188 ? vulgar fraction one quarter -char \XBD (1234567 ) # 189 ? vulgar fraction one half -char \XBE ( 234567 ) # 190 ? vulgar fraction three quarters - -# Each of the three extended accent characters is the same as its conventional -# compose character but with dot 7 added: - - #Hex Dots Dec Char Description -char \XB4 ( 3 7 ) # 180 ? acute accent -char \XB8 ( 67 ) # 184 ? cedilla -char \XA8 ( 5 7 ) # 168 ? diaeresis - -# The two gender symbols are: - - #Hex Dots Dec Char Description -char \XBA ( 7 ) # 186 ? masculine ordinal indicator -char \XAA ( 8) # 170 ? feminine ordinal indicator - -# The three remaining characters are: - - #Hex Dots Dec Char Description -char \XAF ( 2 67 ) # 175 ? macron -char \XB5 ( 567 ) # 181 ? micro sign -char \XA0 ( 78) # 160 ~ no-break space - -# The nonbreaking space is dots 7 and 8 because this presents a sequence of -# nonbreaking spaces as a smooth low line segment. - - #Hex Dots Dec Char Description -char \X7F ( 4567 ) # 127 ^? delete - -*/ - - -//______________________________________________________________________________ -/* -enum bsrCellKind2 { - // lower decimal digits - kCellLower1, // kDots2, - kCellLower2, // kDots23, - kCellLower3, // kDots25, - kCellLower4, // kDots256, - kCellLower5, // kDots26, - kCellLower6, // kDots235, - kCellLower7, // kDots2356, - kCellLower8, // kDots236, - kCellLower9, // kDots35, - kCellLower0, // kDots356; - - - // punctuation - kCellDot , // kDots256, - kCellComma , // kDots2, - kCellQuestionMark , // kDots26, - kCellSemicolon , // kDots23, - kCellColon , // kDots25, - kCellExclamationMark , // kDots235, - kCellLeftParenthesis , // kDots236, - kCellRightParenthesis, // kDots356, - kCellDoubleQuote , // kDots2356, - kCellDash , // kDots36, - kCellQuote , // kDots3; - - // other symbols - kCellSlash , // kDots34, - kCellVerseEnd, // kDots345, - kCellItalics , // kDots456, - kCellAsterisk, // kDots35, - kCellExponent, // kDots4; - - // intervals - kCellSecond , // kDots34, - kCellThird , // kDots346, - kCellFourth , // kDots3456, - kCellFifth , // kDots35, - kCellSixth , // kDots356, - kCellSeventh, // kDots25, - kCellEighth , // kDots36; - - // triplets - kCellTriplet , // kDots23; - - // keyboard hands - kCellRightHand, // { kDots46, kDots345 }, - kCellLeftHand, // { kDots456, kDots345 }; - - // bars - kCellFinalDoubleBar , // { kDots126, kDots13 }, - kCellSectionalDoubleBar, // { kDots126, kDots13, kDots3 }; - - // measure divisions - kCellMeasureDivisionSign, // { kDots46, kDots13 }; - - // words - kCellWordSign , // kDots345, - kCellWordApostrophe, // kDots6; - - // capitals - kCellCapitalsSign, //, // kDots46; - kCellCapitalsSequenceSign, // { kCellCapitalsSign, kCellCapitalsSign }; - - // parentheses - kCellLiteraryLeftParenthesis , //{ kDots5, kDots126 }, - kCellLiteraryRightParenthesis , //{ kDots5, kDots345 }, - kCellMusicParentheses , //{ kDots6, kDots3 }, - kCellSpecialParentheses , //{ kDots2356, kDots2356 }; - - // other symbols - kCellParagraph , //{ kDots5, kDots1234 }, - kCellAmpersand , //{ kDots5, kDots123456 }, - kCellUpsilon , //{ kDots45, kDots13456 }, // better name JMI ??? - kCellEuro , //{ kDots45, kDots15 }, - kCellDollar , //{ kDots45, kDots234 }, - kCellPound , //{ kDots45, kDots123 }, - kCellCopyright , //{ kDots5, kDots14 }, - kCellRegisteredTradeMark , //{ kDots5, kDots1235 }, - kCellTradeMark , //{ kDots5, kDots2345 }, - kCellPercent , //{ kDots5, kDots346 }, - kCellPerthousand , //{ kDots5, kDots346, kDots346 }, - kCellPertenthousand , //{ kDots5, kDots346, kDots346, kDots346 }; - - // fermatas - kCellFermataOnANote , //{ kDots146, kDots126, kDots123 }, - kCellFermataBetweenNotes , //{ kDots5, kDots126, kDots123 }, - kCellFermataOverABarline , //{ kDots456, kDots126, kDots123 }; -}; -*/ - -/* -U+2800 ⠀ e2 a0 80 BRAILLE PATTERN BLANK -U+2801 ⠁ e2 a0 81 BRAILLE PATTERN DOTS-1 -U+2802 ⠂ e2 a0 82 BRAILLE PATTERN DOTS-2 -U+2803 ⠃ e2 a0 83 BRAILLE PATTERN DOTS-12 -U+2804 ⠄ e2 a0 84 BRAILLE PATTERN DOTS-3 -U+2805 ⠅ e2 a0 85 BRAILLE PATTERN DOTS-13 -U+2806 ⠆ e2 a0 86 BRAILLE PATTERN DOTS-23 -U+2807 ⠇ e2 a0 87 BRAILLE PATTERN DOTS-123 -U+2808 ⠈ e2 a0 88 BRAILLE PATTERN DOTS-4 -U+2809 ⠉ e2 a0 89 BRAILLE PATTERN DOTS-14 -U+280A ⠊ e2 a0 8a BRAILLE PATTERN DOTS-24 -U+280B ⠋ e2 a0 8b BRAILLE PATTERN DOTS-124 -U+280C ⠌ e2 a0 8c BRAILLE PATTERN DOTS-34 -U+280D ⠍ e2 a0 8d BRAILLE PATTERN DOTS-134 -U+280E ⠎ e2 a0 8e BRAILLE PATTERN DOTS-234 -U+280F ⠏ e2 a0 8f BRAILLE PATTERN DOTS-1234 -U+2810 ⠐ e2 a0 90 BRAILLE PATTERN DOTS-5 -U+2811 ⠑ e2 a0 91 BRAILLE PATTERN DOTS-15 -U+2812 ⠒ e2 a0 92 BRAILLE PATTERN DOTS-25 -U+2813 ⠓ e2 a0 93 BRAILLE PATTERN DOTS-125 -U+2814 ⠔ e2 a0 94 BRAILLE PATTERN DOTS-35 -U+2815 ⠕ e2 a0 95 BRAILLE PATTERN DOTS-135 -U+2816 ⠖ e2 a0 96 BRAILLE PATTERN DOTS-235 -U+2817 ⠗ e2 a0 97 BRAILLE PATTERN DOTS-1235 -U+2818 ⠘ e2 a0 98 BRAILLE PATTERN DOTS-45 -U+2819 ⠙ e2 a0 99 BRAILLE PATTERN DOTS-145 -U+281A ⠚ e2 a0 9a BRAILLE PATTERN DOTS-245 -U+281B ⠛ e2 a0 9b BRAILLE PATTERN DOTS-1245 -U+281C ⠜ e2 a0 9c BRAILLE PATTERN DOTS-345 -U+281D ⠝ e2 a0 9d BRAILLE PATTERN DOTS-1345 -U+281E ⠞ e2 a0 9e BRAILLE PATTERN DOTS-2345 -U+281F ⠟ e2 a0 9f BRAILLE PATTERN DOTS-12345 -U+2820 ⠠ e2 a0 a0 BRAILLE PATTERN DOTS-6 -U+2821 ⠡ e2 a0 a1 BRAILLE PATTERN DOTS-16 -U+2822 ⠢ e2 a0 a2 BRAILLE PATTERN DOTS-26 -U+2823 ⠣ e2 a0 a3 BRAILLE PATTERN DOTS-126 -U+2824 ⠤ e2 a0 a4 BRAILLE PATTERN DOTS-36 -U+2825 ⠥ e2 a0 a5 BRAILLE PATTERN DOTS-136 -U+2826 ⠦ e2 a0 a6 BRAILLE PATTERN DOTS-236 -U+2827 ⠧ e2 a0 a7 BRAILLE PATTERN DOTS-1236 -U+2828 ⠨ e2 a0 a8 BRAILLE PATTERN DOTS-46 -U+2829 ⠩ e2 a0 a9 BRAILLE PATTERN DOTS-146 -U+282A ⠪ e2 a0 aa BRAILLE PATTERN DOTS-246 -U+282B ⠫ e2 a0 ab BRAILLE PATTERN DOTS-1246 -U+282C ⠬ e2 a0 ac BRAILLE PATTERN DOTS-346 -U+282D ⠭ e2 a0 ad BRAILLE PATTERN DOTS-1346 -U+282E ⠮ e2 a0 ae BRAILLE PATTERN DOTS-2346 -U+282F ⠯ e2 a0 af BRAILLE PATTERN DOTS-12346 -U+2830 ⠰ e2 a0 b0 BRAILLE PATTERN DOTS-56 -U+2831 ⠱ e2 a0 b1 BRAILLE PATTERN DOTS-156 -U+2832 ⠲ e2 a0 b2 BRAILLE PATTERN DOTS-256 -U+2833 ⠳ e2 a0 b3 BRAILLE PATTERN DOTS-1256 -U+2834 ⠴ e2 a0 b4 BRAILLE PATTERN DOTS-356 -U+2835 ⠵ e2 a0 b5 BRAILLE PATTERN DOTS-1356 -U+2836 ⠶ e2 a0 b6 BRAILLE PATTERN DOTS-2356 -U+2837 ⠷ e2 a0 b7 BRAILLE PATTERN DOTS-12356 -U+2838 ⠸ e2 a0 b8 BRAILLE PATTERN DOTS-456 -U+2839 ⠹ e2 a0 b9 BRAILLE PATTERN DOTS-1456 -U+283A ⠺ e2 a0 ba BRAILLE PATTERN DOTS-2456 -U+283B ⠻ e2 a0 bb BRAILLE PATTERN DOTS-12456 -U+283C ⠼ e2 a0 bc BRAILLE PATTERN DOTS-3456 -U+283D ⠽ e2 a0 bd BRAILLE PATTERN DOTS-13456 -U+283E ⠾ e2 a0 be BRAILLE PATTERN DOTS-23456 -U+283F ⠿ e2 a0 bf BRAILLE PATTERN DOTS-123456 - - -FROM http://unicode.org/faq/utf_bom.html#BOM : - - -Q: How do I write a UTF converter? - -A: The freely available open source project International Components for Unicode (ICU) has UTF conversion built into it. The latest version may be downloaded from the ICU Project web site. -* -http://site.icu-project.org - - -Bytes Encoding Form -00 00 FE FF UTF-32, big-endian -FF FE 00 00 UTF-32, little-endian -FE FF UTF-16, big-endian -FF FE UTF-16, little-endian -EF BB BF UTF-8 - - -Q: Is there a standard method to package a Unicode character so it fits an 8-Bit ASCII stream? - -A: There are three or four options for making Unicode fit into an 8-bit format. - -a) Use UTF-8. This preserves ASCII, but not Latin-1, because the characters >127 are different from Latin-1. UTF-8 uses the bytes in the ASCII only for ASCII characters. Therefore, it works well in any environment where ASCII characters have a significance as syntax characters, e.g. file name syntaxes, markup languages, etc., but where the all other characters may use arbitrary bytes. -Example: “Latin Small Letter s with Acute” (015B) would be encoded as two bytes: C5 9B. - -b) Use Java or C style escapes, of the form \uXXXXX or \xXXXXX. This format is not standard for text files, but well defined in the framework of the languages in question, primarily for source files. -Example: The Polish word “wyjście” with character “Latin Small Letter s with Acute” (015B) in the middle (ś is one character) would look like: “wyj\u015Bcie". - -c) Use the &#xXXXX; or &#DDDDD; numeric character escapes as in HTML or XML. Again, these are not standard for plain text files, but well defined within the framework of these markup languages. -Example: “wyjście” would look like “wyjście" - -d) Use SCSU. This format compresses Unicode into 8-bit format, preserving most of ASCII, but using some of the control codes as commands for the decoder. However, while ASCII text will look like ASCII text after being encoded in SCSU, other characters may occasionally be encoded with the same byte values, making SCSU unsuitable for 8-bit channels that blindly interpret any of the bytes as ASCII characters. -Example: “ wyjÛcie” where indicates the byte 0x12 and “Û” corresponds to byte 0xDB. [AF] - - -A: The following table summarizes some of the properties of each of the UTFs. - -Name UTF-8 UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE -Smallest code point 0000 0000 0000 0000 0000 0000 0000 -Largest code point 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF -Code unit size 8 bits 16 bits 16 bits 16 bits 32 bits 32 bits 32 bits -Byte order N/A big-endian little-endian big-endian little-endian -Fewest bytes per character 1 2 2 2 4 4 4 -Most bytes per character 4 4 4 4 4 4 4 - - - -Q: What’s the algorithm to convert from UTF-16 to character codes? - -A: The Unicode Standard used to contain a short algorithm, now there is just a bit distribution table. Here are three short code snippets that translate the information from the bit distribution table into C code that will convert to and from UTF-16. - -Using the following type definitions - -typedef unsigned int16 UTF16; -typedef unsigned int32 UTF32; -the first snippet calculates the high (or leading) surrogate from a character code C. - -const UTF16 HI_SURROGATE_START, // 0xD800 -UTF16 X, // (UTF16) C; -UTF32 U, // (C >> 16) & ((1 << 5) - 1); -UTF16 W, // (UTF16) U - 1; -UTF16 HiSurrogate, // HI_SURROGATE_START | (W << 6) | X >> 10; -where X, U and W correspond to the labels used in Table 3-5 UTF-16 Bit Distribution. The next snippet does the same for the low surrogate. - -const UTF16 LO_SURROGATE_START, // 0xDC00 -UTF16 X, // (UTF16) C; -UTF16 LoSurrogate, // (UTF16) (LO_SURROGATE_START | X & ((1 << 10) - 1)); -Finally, the reverse, where hi and lo are the high and low surrogate, and C the resulting character - -UTF32 X, // (hi & ((1 << 6) -1)) << 10 | lo & ((1 << 10) -1); -UTF32 W, // (hi >> 6) & ((1 << 5) - 1); -UTF32 U, // W + 1; -UTF32 C, // U << 16 | X; -A caller would need to ensure that C, hi, and lo are in the appropriate ranges. [AF] - -Q: Isn’t there a simpler way to do this? - -A: There is a much simpler computation that does not try to follow the bit distribution table. - -// constants -const UTF32 LEAD_OFFSET, // 0xD800 - (0x10000 >> 10); -const UTF32 SURROGATE_OFFSET, // 0x10000 - (0xD800 << 10) - 0xDC00; - -// computations -UTF16 lead, // LEAD_OFFSET + (codepoint >> 10); -UTF16 trail, // 0xDC00 + (codepoint & 0x3FF); - -UTF32 codepoint, // (lead << 10) + trail + SURROGATE_OFFSET; - - -*/ diff --git a/src/lilypond/bsrBrailleCodeGenerators.cpp b/src/lilypond/bsrBrailleCodeGenerators.cpp deleted file mode 100644 index bab48be88..000000000 --- a/src/lilypond/bsrBrailleCodeGenerators.cpp +++ /dev/null @@ -1,676 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrBrailleCodeGenerators.h" - -//#include "bsrBasicTypes.h" - -#include "messagesHandling.h" - -#include "oahOah.h" -#include "generalOah.h" -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -string bsrUTFKindAsString ( - bsrUTFKind UTFKind) -{ - string result; - - switch (UTFKind) { - case kUTF8: - result = "UTF8"; - break; - case kUTF16: - result = "UTF16"; - break; - } // switch - - return result; -} - -string bsrByteOrderingKindAsString ( - bsrByteOrderingKind byteOrderingKind) -{ - string result; - - switch (byteOrderingKind) { - case kByteOrderingNone: - result = "byteOrderingNone"; - break; - case kByteOrderingBigEndian: - result = "byteOrderingBigEndian"; - break; - case kByteOrderingSmallEndian: - result = "byteOrderingSmallEndian"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -// writing UTF-16 to ostreams -void write_wchar_t (ostream& os, wchar_t cell) -{ - union Conversion { - wchar_t cellar; - unsigned char chars [2]; - } conversion; - - conversion.cellar = cell; - - // write in reverse order! - os << conversion.chars [0] << conversion.chars [1]; -} - -ostream& operator<< (ostream& os, const bsrCellKind cell) -{ - union Conversion { - wchar_t cellar; - unsigned char chars [2]; - } conversion; - - conversion.cellar = cell; - - // write in reverse order! - os << conversion.chars [0] << conversion.chars [1]; - - return os; -} - -//______________________________________________________________________________ -/* JMI -S_bsrBrailleGenerator bsrBrailleGenerator::create ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream) -{ - bsrBrailleGenerator* o = - new bsrBrailleGenerator ( - byteOrderingKind, - brailleOutputStream); - assert (o!=0); - return o; -} -*/ - -bsrBrailleGenerator::bsrBrailleGenerator ( - ostream& brailleOutputStream) - : fBrailleOutputStream (brailleOutputStream) -{} - -bsrBrailleGenerator::~bsrBrailleGenerator () -{} - -void bsrBrailleGenerator::generateCodeForCellsList ( - S_bsrCellsList cellsList) -{ - const list& - cellsListElements = - cellsList->getCellsListElements (); - - if (cellsListElements.size ()) { - list::const_iterator - iBegin = cellsListElements.begin (), - iEnd = cellsListElements.end (), - i = iBegin; - for ( ; ; ) { - generateCodeForBrailleCell ((*i)); - if (++i == iEnd) break; - // JMI s << " "; - } // for - } -} - -string bsrBrailleGenerator::asString () const -{ - stringstream s; - - s << - "BrailleGenerator"; - - return s.str (); -} - -void bsrBrailleGenerator::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrBrailleGenerator& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrAsciiBrailleGenerator bsrAsciiBrailleGenerator::create ( - ostream& brailleOutputStream) -{ - bsrAsciiBrailleGenerator* o = - new bsrAsciiBrailleGenerator ( - brailleOutputStream); - assert (o!=0); - return o; -} - -bsrAsciiBrailleGenerator::bsrAsciiBrailleGenerator ( - ostream& brailleOutputStream) - : bsrBrailleGenerator ( - brailleOutputStream) -{ - // JMI writeTestData (brailleOutputStream); -} - -bsrAsciiBrailleGenerator::~bsrAsciiBrailleGenerator () -{} - -void bsrAsciiBrailleGenerator::generateCodeForBrailleCell ( - bsrCellKind cellKind) -{ - string stringForCell; - - switch (cellKind) { - case kCellUnknown: - { - stringstream s; - - s << - "cannot generate code for braille cell '" << - bsrCellKindAsString (cellKind) << - "'"; - msrInternalError ( - gOahOah->fInputSourceName, - -999, // TICINO inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case kCellEOL: stringForCell = "\x0a"; break; - case kCellEOP: stringForCell = "\x0c"; break; - - case kDotsNone: stringForCell = "\x20"; break; - - case kDots1: stringForCell = "\x41"; break; - case kDots2: stringForCell = "\x31"; break; - case kDots12: stringForCell = "\x42"; break; - case kDots3: stringForCell = "\x27"; break; - case kDots13: stringForCell = "\x4b"; break; - case kDots23: stringForCell = "\x32"; break; - case kDots123: stringForCell = "\x4c"; break; - case kDots4: stringForCell = "\x40"; break; - case kDots14: stringForCell = "\x43"; break; - case kDots24: stringForCell = "\x49"; break; - case kDots124: stringForCell = "\x46"; break; - case kDots34: stringForCell = "\x2f"; break; - case kDots134: stringForCell = "\x4d"; break; - case kDots234: stringForCell = "\x53"; break; - case kDots1234: stringForCell = "\x50"; break; - - case kDots5: stringForCell = "\x22"; break; - case kDots15: stringForCell = "\x45"; break; - case kDots25: stringForCell = "\x33"; break; - case kDots125: stringForCell = "\x48"; break; - case kDots35: stringForCell = "\x39"; break; - case kDots135: stringForCell = "\x4f"; break; - case kDots235: stringForCell = "\x37"; break; - case kDots1235: stringForCell = "\x52"; break; - case kDots45: stringForCell = "\x5e"; break; - case kDots145: stringForCell = "\x44"; break; - case kDots245: stringForCell = "\x4a"; break; - case kDots1245: stringForCell = "\x47"; break; - case kDots345: stringForCell = "\x3e"; break; - case kDots1345: stringForCell = "\x4e"; break; - case kDots2345: stringForCell = "\x54"; break; - case kDots12345: stringForCell = "\x51"; break; - - case kDots6: stringForCell = "\x2c"; break; - case kDots16: stringForCell = "\x2a"; break; - case kDots26: stringForCell = "\x35"; break; - case kDots126: stringForCell = "\x3c"; break; - case kDots36: stringForCell = "\x2d"; break; - case kDots136: stringForCell = "\x55"; break; - case kDots236: stringForCell = "\x38"; break; - case kDots1236: stringForCell = "\x56"; break; - case kDots46: stringForCell = "\x2e"; break; - case kDots146: stringForCell = "\x25"; break; - case kDots246: stringForCell = "\x5b"; break; - case kDots1246: stringForCell = "\x24"; break; - case kDots346: stringForCell = "\x2b"; break; - case kDots1346: stringForCell = "\x58"; break; - case kDots2346: stringForCell = "\x21"; break; - case kDots12346: stringForCell = "\x26"; break; - - case kDots56: stringForCell = "\x3b"; break; - case kDots156: stringForCell = "\x3a"; break; - case kDots256: stringForCell = "\x34"; break; - case kDots1256: stringForCell = "\x5c"; break; - case kDots356: stringForCell = "\x30"; break; - case kDots1356: stringForCell = "\x5a"; break; - case kDots2356: stringForCell = "\x37"; break; - case kDots12356: stringForCell = "\x28"; break; - case kDots456: stringForCell = "\x5f"; break; - case kDots1456: stringForCell = "\x3f"; break; - case kDots2456: stringForCell = "\x57"; break; - case kDots12456: stringForCell = "\x5d"; break; - case kDots3456: stringForCell = "\x23"; break; - case kDots13456: stringForCell = "\x59"; break; - case kDots23456: stringForCell = "\x29"; break; - case kDots123456: stringForCell = "\x3d"; break; - } // switch - - fBrailleOutputStream << - stringForCell; -} - -void bsrAsciiBrailleGenerator::writeTestData (ostream& os) -{ - // generate the table of all Dots 6 cells -/* - " A1B'K2L@CIF/MSP\"E3H9O6R^DJG>NTQ,*5<-U8V.%[$+X!&;:4\\0Z7(_?W]#Y)=" - - produces: - - "⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿" -*/ - os << - " A1B'K2L@CIF/MSP\"E3H9O6R^DJG>NTQ,*5<-U8V.%[$+X!&;:4\\0Z7(_?W]#Y)=" << - // "\x0a"; // \n - endl; // \n -} - -string bsrAsciiBrailleGenerator::asString () const -{ - stringstream s; - - s << - "AsciiBrailleGenerator"; - - return s.str (); -} - -void bsrAsciiBrailleGenerator::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrAsciiBrailleGenerator& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrUTF8BrailleGenerator bsrUTF8BrailleGenerator::create ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream) -{ - bsrUTF8BrailleGenerator* o = - new bsrUTF8BrailleGenerator ( - byteOrderingKind, - brailleOutputStream); - assert (o!=0); - return o; -} - -bsrUTF8BrailleGenerator::bsrUTF8BrailleGenerator ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream) - : bsrBrailleGenerator ( - brailleOutputStream) -{ - fByteOrderingKind = byteOrderingKind; - - // generate a BOM if requested - switch (fByteOrderingKind) { - case kByteOrderingNone: - break; - case kByteOrderingBigEndian: - fBrailleOutputStream << - kBOM_UTF_8; - break; - case kByteOrderingSmallEndian: - // should not occur JMI - break; - } // switch -} - -bsrUTF8BrailleGenerator::~bsrUTF8BrailleGenerator () -{} - -void bsrUTF8BrailleGenerator::generateCodeForBrailleCell ( - bsrCellKind cellKind) -{ - string stringForCell; - - switch (cellKind) { - case kCellUnknown: - { - stringstream s; - - s << - "cannot generate code for braille cell '" << - bsrCellKindAsString (cellKind) << - "'"; - msrInternalError ( - gOahOah->fInputSourceName, - -999, // TICINO inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case kCellEOL: stringForCell = "\x0a"; break; // U+000A - case kCellEOP: stringForCell = "\x0c"; break; // U+000C - - case kDotsNone: stringForCell = "\xe2\xa0\x80"; break; // U+2800 ⠀ e2 a0 80 BLANK - - case kDots1: stringForCell = "\xe2\xa0\x81"; break; // U+2801 ⠀ e2 a0 81 DOTS-1 - case kDots2: stringForCell = "\xe2\xa0\x82"; break; // U+2802 ⠀ e2 a0 82 DOTS-2 - case kDots12: stringForCell = "\xe2\xa0\x83"; break; // U+2803 ⠀ e2 a0 83 DOTS-12 - case kDots3: stringForCell = "\xe2\xa0\x84"; break; // U+2804 ⠄ e2 a0 84 DOTS-3 - case kDots13: stringForCell = "\xe2\xa0\x85"; break; // U+2805 ⠅ e2 a0 85 DOTS-13 - case kDots23: stringForCell = "\xe2\xa0\x86"; break; // U+2806 ⠆ e2 a0 86 DOTS-23 - case kDots123: stringForCell = "\xe2\xa0\x87"; break; // U+2807 ⠇ e2 a0 87 DOTS-123 - case kDots4: stringForCell = "\xe2\xa0\x88"; break; // U+2808 ⠈ e2 a0 88 DOTS-4 - case kDots14: stringForCell = "\xe2\xa0\x89"; break; // U+2809 ⠉ e2 a0 89 DOTS-14 - case kDots24: stringForCell = "\xe2\xa0\x8a"; break; // U+280A ⠊ e2 a0 8a DOTS-24 - case kDots124: stringForCell = "\xe2\xa0\x8b"; break; // U+280B ⠋ e2 a0 8b DOTS-124 - case kDots34: stringForCell = "\xe2\xa0\x8c"; break; // U+280C ⠌ e2 a0 8c DOTS-34 - case kDots134: stringForCell = "\xe2\xa0\x8d"; break; // U+280D ⠍ e2 a0 8d DOTS-134 - case kDots234: stringForCell = "\xe2\xa0\x8e"; break; // U+280E ⠎ e2 a0 8e DOTS-234 - case kDots1234: stringForCell = "\xe2\xa0\x8f"; break; // U+280F ⠏ e2 a0 8f DOTS-1234 - - case kDots5: stringForCell = "\xe2\xa0\x90"; break; // U+2810 ⠐ e2 a0 90 DOTS-5 - case kDots15: stringForCell = "\xe2\xa0\x91"; break; // U+2811 ⠑ e2 a0 91 DOTS-15 - case kDots25: stringForCell = "\xe2\xa0\x92"; break; // U+2812 ⠒ e2 a0 92 DOTS-25 - case kDots125: stringForCell = "\xe2\xa0\x93"; break; // U+2813 ⠓ e2 a0 93 DOTS-125 - case kDots35: stringForCell = "\xe2\xa0\x94"; break; // U+2814 ⠔ e2 a0 94 DOTS-35 - case kDots135: stringForCell = "\xe2\xa0\x95"; break; // U+2815 ⠕ e2 a0 95 DOTS-135 - case kDots235: stringForCell = "\xe2\xa0\x96"; break; // U+2816 ⠖ e2 a0 96 DOTS-235 - case kDots1235: stringForCell = "\xe2\xa0\x97"; break; // U+2817 ⠗ e2 a0 97 DOTS-1235 - case kDots45: stringForCell = "\xe2\xa0\x98"; break; // U+2818 ⠘ e2 a0 98 DOTS-45 - case kDots145: stringForCell = "\xe2\xa0\x99"; break; // U+2819 ⠙ e2 a0 99 DOTS-145 - case kDots245: stringForCell = "\xe2\xa0\x9a"; break; // U+281A ⠚ e2 a0 9a DOTS-245 - case kDots1245: stringForCell = "\xe2\xa0\x9b"; break; // U+281B ⠛ e2 a0 9b DOTS-1245 - case kDots345: stringForCell = "\xe2\xa0\x9c"; break; // U+281C ⠜ e2 a0 9c DOTS-345 - case kDots1345: stringForCell = "\xe2\xa0\x9d"; break; // U+281D ⠝ e2 a0 9d DOTS-1345 - case kDots2345: stringForCell = "\xe2\xa0\x9e"; break; // U+281E ⠞ e2 a0 9e DOTS-2345 - case kDots12345: stringForCell = "\xe2\xa0\x9f"; break; // U+281F ⠟ e2 a0 9f DOTS-12345 - - case kDots6: stringForCell = "\xe2\xa0\xa0"; break; // U+2820 ⠠ e2 a0 a0 DOTS-6 - case kDots16: stringForCell = "\xe2\xa0\xa1"; break; // U+2821 ⠡ e2 a0 a1 DOTS-16 - case kDots26: stringForCell = "\xe2\xa0\xa2"; break; // U+2822 ⠢ e2 a0 a2 DOTS-26 - case kDots126: stringForCell = "\xe2\xa0\xa3"; break; // U+2823 ⠣ e2 a0 a3 DOTS-126 - case kDots36: stringForCell = "\xe2\xa0\xa4"; break; // U+2824 ⠤ e2 a0 a4 DOTS-36 - case kDots136: stringForCell = "\xe2\xa0\xa5"; break; // U+2825 ⠥ e2 a0 a5 DOTS-136 - case kDots236: stringForCell = "\xe2\xa0\xa6"; break; // U+2826 ⠦ e2 a0 a6 DOTS-236 - case kDots1236: stringForCell = "\xe2\xa0\xa7"; break; // U+2827 ⠧ e2 a0 a7 DOTS-1236 - case kDots46: stringForCell = "\xe2\xa0\xa8"; break; // U+2828 ⠨ e2 a0 a8 DOTS-46 - case kDots146: stringForCell = "\xe2\xa0\xa9"; break; // U+2829 ⠩ e2 a0 a9 DOTS-146 - case kDots246: stringForCell = "\xe2\xa0\xaa"; break; // U+282A ⠪ e2 a0 aa DOTS-246 - case kDots1246: stringForCell = "\xe2\xa0\xab"; break; // U+282B ⠫ e2 a0 ab DOTS-1246 - case kDots346: stringForCell = "\xe2\xa0\xac"; break; // U+282C ⠬ e2 a0 ac DOTS-346 - case kDots1346: stringForCell = "\xe2\xa0\xad"; break; // U+282D ⠭ e2 a0 ad DOTS-1346 - case kDots2346: stringForCell = "\xe2\xa0\xae"; break; // U+282E ⠮ e2 a0 ae DOTS-2346 - case kDots12346: stringForCell = "\xe2\xa0\xaf"; break; // U+282F ⠯ e2 a0 af DOTS-12346 - - case kDots56: stringForCell = "\xe2\xa0\xb0"; break; // U+2830 ⠰ e2 a0 b0 DOTS-56 - case kDots156: stringForCell = "\xe2\xa0\xb1"; break; // U+2831 ⠱ e2 a0 b1 DOTS-156 - case kDots256: stringForCell = "\xe2\xa0\xb2"; break; // U+2832 ⠲ e2 a0 b2 DOTS-256 - case kDots1256: stringForCell = "\xe2\xa0\xb3"; break; // U+2833 ⠳ e2 a0 b3 DOTS-1256 - case kDots356: stringForCell = "\xe2\xa0\xb4"; break; // U+2834 ⠴ e2 a0 b4 DOTS-356 - case kDots1356: stringForCell = "\xe2\xa0\xb5"; break; // U+2835 ⠵ e2 a0 b5 DOTS-1356 - case kDots2356: stringForCell = "\xe2\xa0\xb6"; break; // U+2836 ⠶ e2 a0 b6 DOTS-2356 - case kDots12356: stringForCell = "\xe2\xa0\xb7"; break; // U+2837 ⠷ e2 a0 b7 DOTS-12356 - case kDots456: stringForCell = "\xe2\xa0\xb8"; break; // U+2838 ⠸ e2 a0 b8 DOTS-456 - case kDots1456: stringForCell = "\xe2\xa0\xb9"; break; // U+2839 ⠹ e2 a0 b9 DOTS-1456 - case kDots2456: stringForCell = "\xe2\xa0\xba"; break; // U+283A ⠺ e2 a0 ba DOTS-2456 - case kDots12456: stringForCell = "\xe2\xa0\xbb"; break; // U+283B ⠻ e2 a0 bb DOTS-12456 - case kDots3456: stringForCell = "\xe2\xa0\xbc"; break; // U+283C ⠼ e2 a0 bc DOTS-3456 - case kDots13456: stringForCell = "\xe2\xa0\xbd"; break; // U+283D ⠽ e2 a0 bd DOTS-13456 - case kDots23456: stringForCell = "\xe2\xa0\xbe"; break; // U+283E ⠾ e2 a0 be DOTS-23456 - case kDots123456: stringForCell = "\xe2\xa0\xbf"; break; // U+283F ⠿ e2 a0 bf DOTS-123456 - } // switch - - fBrailleOutputStream << - stringForCell; -} - -void bsrUTF8BrailleGenerator::writeTestData (ostream& os) -{ - // generate the table of all Dots 6 cells - for (wchar_t wch = L'\u2800'; wch <= L'\u280f'; wch++) { - os << wch; - } // for - os << kCellEOL; - for (wchar_t wch = L'\u2810'; wch <= L'\u281f'; wch++) { - os << wch; - } // for - os << kCellEOL; - os << kCellEOP; - - for (wchar_t wch = L'\u2820'; wch <= L'\u282f'; wch++) { - os << wch; - } // for - os << kCellEOL; - for (wchar_t wch = L'\u2830'; wch <= L'\u283f'; wch++) { - os << wch; - } // for - os << kCellEOL; - os << kCellEOP; -} - -string bsrUTF8BrailleGenerator::asString () const -{ - stringstream s; - - s << - "UTF8BrailleGenerator" << - ", byteOrderingKind: " << - bsrByteOrderingKindAsString ( - fByteOrderingKind); - - return s.str (); -} - -void bsrUTF8BrailleGenerator::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrUTF8BrailleGenerator& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrUTF16BigEndianBrailleGenerator bsrUTF16BigEndianBrailleGenerator::create ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream) -{ - bsrUTF16BigEndianBrailleGenerator* o = - new bsrUTF16BigEndianBrailleGenerator ( - byteOrderingKind, - brailleOutputStream); - assert (o!=0); - return o; -} - -bsrUTF16BigEndianBrailleGenerator::bsrUTF16BigEndianBrailleGenerator ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream) - : bsrBrailleGenerator ( - brailleOutputStream) -{ - fByteOrderingKind = byteOrderingKind; -} - -bsrUTF16BigEndianBrailleGenerator::~bsrUTF16BigEndianBrailleGenerator () -{} - -void bsrUTF16BigEndianBrailleGenerator::generateCodeForBrailleCell ( - bsrCellKind cellKind) -{ - // JMI -} - -void bsrUTF16BigEndianBrailleGenerator::writeTestData (ostream& os) -{ - // generate the table of all Dots 6 cells - for (wchar_t wch = L'\u2800'; wch <= L'\u280f'; wch++) { - os << wch; - } // for - os << kCellEOL; - for (wchar_t wch = L'\u2810'; wch <= L'\u281f'; wch++) { - os << wch; - } // for - os << kCellEOL; - os << kCellEOP; - - for (wchar_t wch = L'\u2820'; wch <= L'\u282f'; wch++) { - os << wch; - } // for - os << kCellEOL; - for (wchar_t wch = L'\u2830'; wch <= L'\u283f'; wch++) { - os << wch; - } // for - os << kCellEOL; - os << kCellEOP; -} - -string bsrUTF16BigEndianBrailleGenerator::asString () const -{ - stringstream s; - - s << - "UTF16BigEndianBrailleGenerator" << - ", byteOrderingKind: " << - bsrByteOrderingKindAsString ( - fByteOrderingKind); - - return s.str (); -} - -void bsrUTF16BigEndianBrailleGenerator::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrUTF16BigEndianBrailleGenerator& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrUTF16SmallEndianBrailleGenerator bsrUTF16SmallEndianBrailleGenerator::create ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream) -{ - bsrUTF16SmallEndianBrailleGenerator* o = - new bsrUTF16SmallEndianBrailleGenerator ( - byteOrderingKind, - brailleOutputStream); - assert (o!=0); - return o; -} - -bsrUTF16SmallEndianBrailleGenerator::bsrUTF16SmallEndianBrailleGenerator ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream) - : bsrBrailleGenerator ( - brailleOutputStream) -{ - fByteOrderingKind = byteOrderingKind; -} - -bsrUTF16SmallEndianBrailleGenerator::~bsrUTF16SmallEndianBrailleGenerator () -{} - -void bsrUTF16SmallEndianBrailleGenerator::generateCodeForBrailleCell ( - bsrCellKind cellKind) -{ - // JMI -} - -void bsrUTF16SmallEndianBrailleGenerator::writeTestData (ostream& os) -{ - // generate the table of all Dots 6 cells - for (wchar_t wch = L'\u2800'; wch <= L'\u280f'; wch++) { - os << wch; - } // for - os << kCellEOL; - for (wchar_t wch = L'\u2810'; wch <= L'\u281f'; wch++) { - os << wch; - } // for - os << kCellEOL; - os << kCellEOP; - - for (wchar_t wch = L'\u2820'; wch <= L'\u282f'; wch++) { - os << wch; - } // for - os << kCellEOL; - for (wchar_t wch = L'\u2830'; wch <= L'\u283f'; wch++) { - os << wch; - } // for - os << kCellEOL; - os << kCellEOP; -} - -string bsrUTF16SmallEndianBrailleGenerator::asString () const -{ - stringstream s; - - s << - "UTF16SmallEndianBrailleGenerator" << - ", byteOrderingKind: " << - bsrByteOrderingKindAsString ( - fByteOrderingKind); - - return s.str (); -} - -void bsrUTF16SmallEndianBrailleGenerator::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrUTF16SmallEndianBrailleGenerator& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrBrailleCodeGenerators.h b/src/lilypond/bsrBrailleCodeGenerators.h deleted file mode 100644 index 3ab54f9f1..000000000 --- a/src/lilypond/bsrBrailleCodeGenerators.h +++ /dev/null @@ -1,346 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrBrailleGenerators___ -#define ___bsrBrailleGenerators___ - -#include "bsrCellsLists.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -enum bsrUTFKind { - kUTF8, kUTF16 }; - -string bsrUTFKindAsString ( - bsrUTFKind UTFKind); - -enum bsrByteOrderingKind { - kByteOrderingNone, - kByteOrderingBigEndian, kByteOrderingSmallEndian }; - -string bsrByteOrderingKindAsString ( - bsrByteOrderingKind byteOrderingKind); - -//______________________________________________________________________________ -// Bytes Encoding Marks (BOM) -const string - kBOM_UTF_32_BigEndian = - "\x00\x00\xFE\xFF", // UTF-32, big-endian - kBOM_UTF_32_LittleEndian = - "\xFF\xFE\x00\x00", // UTF-32, little-endian - kBOM_UTF_16_BigEndian = - "\xFE\xFF", // UTF-16, big-endian - kBOM_UTF_16_LittleEndian = - "\xFF\xFE", // UTF-16, little-endian - kBOM_UTF_8 = - "\xEF\xBB\xBF"; // UTF-8 - -//______________________________________________________________________________ -class bsrBrailleGenerator : public smartable -{ - public: - - // creation - // ------------------------------------------------------ - -/* JMI - static SMARTP create ( - byteOrderingKind, - ostream& brailleOutputStream); -*/ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrBrailleGenerator ( - ostream& brailleOutputStream); - - virtual ~bsrBrailleGenerator (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - virtual void generateCodeForBrailleCell ( - bsrCellKind cellKind) = 0; - - void generateCodeForCellsList ( - S_bsrCellsList cellsList); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - ostream& fBrailleOutputStream; -}; -typedef SMARTP S_bsrBrailleGenerator; -EXP ostream& operator<< (ostream& os, const S_bsrBrailleGenerator& elt); - -//______________________________________________________________________________ -class bsrAsciiBrailleGenerator : public bsrBrailleGenerator -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - ostream& brailleOutputStream); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrAsciiBrailleGenerator ( - ostream& brailleOutputStream); - - virtual ~bsrAsciiBrailleGenerator (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - virtual void generateCodeForBrailleCell ( - bsrCellKind cellKind); - - static void writeTestData (ostream& os); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_bsrAsciiBrailleGenerator; -EXP ostream& operator<< (ostream& os, const S_bsrAsciiBrailleGenerator& elt); - -//______________________________________________________________________________ -class bsrUTF8BrailleGenerator : public bsrBrailleGenerator -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrUTF8BrailleGenerator ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream); - - virtual ~bsrUTF8BrailleGenerator (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrByteOrderingKind getByteOrderingKind () const - { return fByteOrderingKind; } - - public: - - // services - // ------------------------------------------------------ - - virtual void generateCodeForBrailleCell ( - bsrCellKind cellKind); - - static void writeTestData (ostream& os); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrByteOrderingKind fByteOrderingKind; -}; -typedef SMARTP S_bsrUTF8BrailleGenerator; -EXP ostream& operator<< (ostream& os, const S_bsrUTF8BrailleGenerator& elt); - -//______________________________________________________________________________ -class bsrUTF16BigEndianBrailleGenerator : public bsrBrailleGenerator -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrUTF16BigEndianBrailleGenerator ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream); - - virtual ~bsrUTF16BigEndianBrailleGenerator (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrByteOrderingKind getByteOrderingKind () const - { return fByteOrderingKind; } - - public: - - // services - // ------------------------------------------------------ - - virtual void generateCodeForBrailleCell ( - bsrCellKind cellKind); - - static void writeTestData (ostream& os); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrByteOrderingKind fByteOrderingKind; -}; -typedef SMARTP S_bsrUTF16BigEndianBrailleGenerator; -EXP ostream& operator<< (ostream& os, const S_bsrUTF16BigEndianBrailleGenerator& elt); - -//______________________________________________________________________________ -class bsrUTF16SmallEndianBrailleGenerator : public bsrBrailleGenerator -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrUTF16SmallEndianBrailleGenerator ( - bsrByteOrderingKind byteOrderingKind, - ostream& brailleOutputStream); - - virtual ~bsrUTF16SmallEndianBrailleGenerator (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrByteOrderingKind getByteOrderingKind () const - { return fByteOrderingKind; } - - public: - - // services - // ------------------------------------------------------ - - virtual void generateCodeForBrailleCell ( - bsrCellKind cellKind); - - static void writeTestData (ostream& os); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrByteOrderingKind fByteOrderingKind; -}; -typedef SMARTP S_bsrUTF16SmallEndianBrailleGenerator; -EXP ostream& operator<< (ostream& os, const S_bsrUTF16SmallEndianBrailleGenerator& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/bsrCellsLists.cpp b/src/lilypond/bsrCellsLists.cpp deleted file mode 100644 index c985846e3..000000000 --- a/src/lilypond/bsrCellsLists.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrCellsLists.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_bsrCellsList bsrCellsList::create ( - int inputLineNumber) -{ - bsrCellsList* o = - new bsrCellsList ( - inputLineNumber); - assert(o!=0); - return o; -} - -S_bsrCellsList bsrCellsList::create ( - int inputLineNumber, - bsrCellKind cellKind1) -{ - bsrCellsList* o = - new bsrCellsList ( - inputLineNumber, - cellKind1); - assert(o!=0); - return o; -} - -S_bsrCellsList bsrCellsList::create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2) -{ - bsrCellsList* o = - new bsrCellsList ( - inputLineNumber, - cellKind1, cellKind2); - assert(o!=0); - return o; -} - -S_bsrCellsList bsrCellsList::create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3) -{ - bsrCellsList* o = - new bsrCellsList ( - inputLineNumber, - cellKind1, cellKind2, cellKind3); - assert(o!=0); - return o; -} - -S_bsrCellsList bsrCellsList::create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4) -{ - bsrCellsList* o = - new bsrCellsList ( - inputLineNumber, - cellKind1, cellKind2, cellKind3, cellKind4); - assert(o!=0); - return o; -} - -S_bsrCellsList bsrCellsList::create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5) -{ - bsrCellsList* o = - new bsrCellsList ( - inputLineNumber, - cellKind1, cellKind2, cellKind3, cellKind4, cellKind5); - assert(o!=0); - return o; -} - -S_bsrCellsList bsrCellsList::create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5, - bsrCellKind cellKind6) -{ - bsrCellsList* o = - new bsrCellsList ( - inputLineNumber, - cellKind1, cellKind2, cellKind3, cellKind4, cellKind5, cellKind6); - assert(o!=0); - return o; -} - -bsrCellsList::bsrCellsList ( - int inputLineNumber) - // : bsrElement (inputLineNumber) -{} - -bsrCellsList::bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1) - // : bsrElement (inputLineNumber) -{ - fCellsListElements.push_back (cellKind1); -} - -bsrCellsList::bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2) - // : bsrElement (inputLineNumber) -{ - fCellsListElements.push_back (cellKind1); - fCellsListElements.push_back (cellKind2); -} - -bsrCellsList::bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3) - // : bsrElement (inputLineNumber) -{ - fCellsListElements.push_back (cellKind1); - fCellsListElements.push_back (cellKind2); - fCellsListElements.push_back (cellKind3); -} - -bsrCellsList::bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4) - // : bsrElement (inputLineNumber) -{ - fCellsListElements.push_back (cellKind1); - fCellsListElements.push_back (cellKind2); - fCellsListElements.push_back (cellKind3); - fCellsListElements.push_back (cellKind4); -} - -bsrCellsList::bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5) - // : bsrElement (inputLineNumber) -{ - fCellsListElements.push_back (cellKind1); - fCellsListElements.push_back (cellKind2); - fCellsListElements.push_back (cellKind3); - fCellsListElements.push_back (cellKind4); - fCellsListElements.push_back (cellKind5); -} - -bsrCellsList::bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5, - bsrCellKind cellKind6) - // : bsrElement (inputLineNumber) -{ - fCellsListElements.push_back (cellKind1); - fCellsListElements.push_back (cellKind2); - fCellsListElements.push_back (cellKind3); - fCellsListElements.push_back (cellKind4); - fCellsListElements.push_back (cellKind5); - fCellsListElements.push_back (cellKind6); -} - -bsrCellsList::~bsrCellsList () -{} - -void bsrCellsList::appendCellsListToCellsList ( - S_bsrCellsList otherCellsList) -{ - if (otherCellsList) { - if (otherCellsList->fCellsListElements.size ()) { - list::const_iterator - iBegin = otherCellsList->fCellsListElements.begin (), - iEnd = otherCellsList->fCellsListElements.end (), - i = iBegin; - for ( ; ; ) { - fCellsListElements.push_back ((*i)); - if (++i == iEnd) break; - // JMI os << " "; - } // for - } - } -} - -void bsrCellsList::prependCellsListToCellsList ( - S_bsrCellsList otherCellsList) -{ - if (otherCellsList) { - if (otherCellsList->fCellsListElements.size ()) { - list::const_reverse_iterator - iBegin = otherCellsList->fCellsListElements.rbegin (), - iEnd = otherCellsList->fCellsListElements.rend (), - i = iBegin; - for ( ; ; ) { - fCellsListElements.push_front ((*i)); - if (++i == iEnd) break; - // JMI os << " "; - } // for - } - } -} - -void bsrCellsList::generateBrailleCode (ostream& os) -{ - if (fCellsListElements.size ()) { - list::const_iterator - iBegin = fCellsListElements.begin (), - iEnd = fCellsListElements.end (), - i = iBegin; - for ( ; ; ) { - os << - bsrCellKindAsShortString ((*i)); - if (++i == iEnd) break; - os << " "; - } // for - } -} - -void bsrCellsList::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrCellsList::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrCellsList elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrCellsList::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrCellsList::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrCellsList::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrCellsList elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrCellsList::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrCellsList::browseData (basevisitor* v) -{} - - -string bsrCellsList::asString () const -{ - stringstream s; - - s << - "cellsListElements ["; - - if (fCellsListElements.size ()) { - list::const_iterator - iBegin = fCellsListElements.begin (), - iEnd = fCellsListElements.end (), - i = iBegin; - for ( ; ; ) { - s << - bsrCellKindAsShortString ((*i)); - if (++i == iEnd) break; - s << " "; - } // for - } - - s << - "]"; - - return s.str (); -} - -string bsrCellsList::asShortString () const -{ - return asString (); -} - -void bsrCellsList::print (ostream& os) const -{ - os << - "cellsListElements ["; - - if (fCellsListElements.size ()) { - list::const_iterator - iBegin = fCellsListElements.begin (), - iEnd = fCellsListElements.end (), - i = iBegin; - for ( ; ; ) { - os << - bsrCellKindAsShortString ((*i)); - if (++i == iEnd) break; - os << " "; - } // for - } - - os << - "]"; -} - -ostream& operator<< (ostream& os, const S_bsrCellsList& elt) -{ - elt->print (os); - return os; -} - -bsrCellsList& operator<< (bsrCellsList& cellsList, const bsrCellKind cellKind) -{ - cellsList.appendCellKindToCellsList (cellKind); - return cellsList; -} - - -} diff --git a/src/lilypond/bsrCellsLists.h b/src/lilypond/bsrCellsLists.h deleted file mode 100644 index 0ddf4266c..000000000 --- a/src/lilypond/bsrCellsLists.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrCellsLists___ -#define ___bsrCellsLists___ - -#include "bsrElements.h" - -#include "bsrBasicTypes.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class bsrCellsList; -typedef SMARTP S_bsrCellsList; - -class bsrCellsList : public smartable -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - static SMARTP create ( - int inputLineNumber, - bsrCellKind cellKind1); - - static SMARTP create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2); - - static SMARTP create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3); - - static SMARTP create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4); - - static SMARTP create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5); - - static SMARTP create ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5, - bsrCellKind cellKind6); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrCellsList ( - int inputLineNumber); - - bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1); - - bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2); - - bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3); - - bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4); - - bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5); - - bsrCellsList ( - int inputLineNumber, - bsrCellKind cellKind1, - bsrCellKind cellKind2, - bsrCellKind cellKind3, - bsrCellKind cellKind4, - bsrCellKind cellKind5, - bsrCellKind cellKind6); - - virtual ~bsrCellsList (); - - public: - - // set and get - // ------------------------------------------------------ - - const list& - getCellsListElements () const - { return fCellsListElements; } - - // services - // ------------------------------------------------------ - - void appendCellKindToCellsList (bsrCellKind cellKind) - { fCellsListElements.push_back (cellKind); } - - void appendCellsListToCellsList ( - S_bsrCellsList otherCellsList); - - void prependCellsListToCellsList ( - S_bsrCellsList otherCellsList); - - int fetchCellsNumber () const - { return fCellsListElements.size (); } - - void generateBrailleCode (ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asString () const; - - virtual std::string asShortString () const; - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - list fCellsListElements; -}; -EXP ostream& operator<< (ostream& os, const S_bsrCellsList& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/bsrClefs.cpp b/src/lilypond/bsrClefs.cpp deleted file mode 100644 index 840cd6eb9..000000000 --- a/src/lilypond/bsrClefs.cpp +++ /dev/null @@ -1,304 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrClef bsrClef::create ( - int inputLineNumber, - bsrClefKind clefKind) -{ - bsrClef* o = - new bsrClef ( - inputLineNumber, clefKind); - assert (o!=0); - return o; -} - -bsrClef::bsrClef ( - int inputLineNumber, - bsrClefKind clefKind) - : bsrLineElement (inputLineNumber) -{ - fClefKind = clefKind; - - fClefCellsList = buildCellsList (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Creating bsrClef '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -bsrClef::~bsrClef () -{} - -S_bsrCellsList bsrClef::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create ( - fInputLineNumber); - - switch (fClefKind) { - case kClefKindNone: - result = - bsrCellsList::create ( - fInputLineNumber); - break; - - case kClefKindGTreble: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots34, kDots123); - break; - case kClefKindFBass: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots3456, kDots123); - break; - case kClefKindCAlto: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots346, kDots123); - break; - - case kClefKindGSoprano: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots34, kDots4, kDots123); - break; - case kClefKindFBaritone: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots3456, kDots456, kDots123); - break; - case kClefKindCTenor: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots346, kDots5, kDots123); - break; - - case kClefKindGOttavaAlta: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots34, kDots123, kDots3456, kDots125); - break; - case kClefKindGOttavaBassa: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots34, kDots123, kDots3456, kDots236); - break; - - case kClefKindModifiedBassForRightHandPart: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots3456, kDots13); - break; - case kClefKindModifiedTrebleForLeftHandPart: - result = - bsrCellsList::create ( - fInputLineNumber, - kDots345, kDots34, kDots13); - break; - } // switch - - return result; -} - -int bsrClef::fetchCellsNumber() const -{ - return fClefCellsList->fetchCellsNumber(); -} - -void bsrClef::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrClef::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrClef elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrClef::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrClef::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrClef::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrClef elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrClef::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrClef::browseData (basevisitor* v) -{} - - -string bsrClef::clefKindAsString ( - bsrClefKind clefKind) -{ - string result; - - switch (clefKind) { - case bsrClef::kClefKindNone: - result = "***clefNone***"; - break; - case bsrClef::kClefKindGTreble: - result = "clefGTreble"; - break; - case bsrClef::kClefKindFBass: - result = "clefFBass"; - break; - case bsrClef::kClefKindCAlto: - result = "clefCAlto"; - break; - case bsrClef::kClefKindGSoprano: - result = "clefGSoprano"; - break; - case bsrClef::kClefKindFBaritone: - result = "clefFBaritone"; - break; - case bsrClef::kClefKindCTenor: - result = "clefCTenor"; - break; - case bsrClef::kClefKindGOttavaAlta: - result = "clefGOttavaAlta"; - break; - case bsrClef::kClefKindGOttavaBassa: - result = "clefGOttavaBassa"; - break; - case bsrClef::kClefKindModifiedBassForRightHandPart: - result = "clefModifiedBassForRightHandPart"; - break; - case bsrClef::kClefKindModifiedTrebleForLeftHandPart: - result = "clefModifiedTrebleForLeftHandPart"; - break; - } // switch - - return result; -} - -string bsrClef::asString () const -{ - stringstream s; - - s << - "Clef" << - ", clefKind: " << - clefKindAsString (fClefKind) << - "clefCellsList: " << fClefCellsList << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrClef::print (ostream& os) const -{ - os << - "Clef" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - os << - setw (fieldWidth) << - "clefKind" << " : " << - clefKindAsString (fClefKind) << - endl << - setw (fieldWidth) << - "clefCellsList" << " : " << fClefCellsList << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrClef& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrClefs_MUT_DEP.h b/src/lilypond/bsrClefs_MUT_DEP.h deleted file mode 100644 index c5e2e8a66..000000000 --- a/src/lilypond/bsrClefs_MUT_DEP.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrClef : public bsrLineElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrClefKind { - kClefKindNone, - - kClefKindGTreble, - kClefKindFBass, - kClefKindCAlto, - kClefKindGSoprano, // first line, french violin - kClefKindFBaritone, - kClefKindCTenor, - kClefKindGOttavaAlta, - kClefKindGOttavaBassa, - kClefKindModifiedBassForRightHandPart, - kClefKindModifiedTrebleForLeftHandPart }; - - static string clefKindAsString ( - bsrClefKind clefKind); - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - bsrClefKind clefKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrClef ( - int inputLineNumber, - bsrClefKind clefKind); - - virtual ~bsrClef (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrClefKind getClefKind () const - { return fClefKind; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fClefCellsList; } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrClefKind fClefKind; - - S_bsrCellsList fClefCellsList; -}; -typedef SMARTP S_bsrClef; -EXP ostream& operator<< (ostream& os, const S_bsrClef& elt); - diff --git a/src/lilypond/bsrDynamics.cpp b/src/lilypond/bsrDynamics.cpp deleted file mode 100644 index d2034df59..000000000 --- a/src/lilypond/bsrDynamics.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrDynamics bsrDynamics::create ( - int inputLineNumber, - msrDynamics::msrDynamicsKind dynamicsKind) -{ - bsrDynamics* o = - new bsrDynamics ( - inputLineNumber, dynamicsKind); - assert (o!=0); - return o; -} - -bsrDynamics::bsrDynamics ( - int inputLineNumber, - msrDynamics::msrDynamicsKind dynamicsKind) - : bsrLineElement (inputLineNumber) -{ - fDynamicsKind = dynamicsKind; - - fDynamicsCellsList = buildCellsList (); -} - -bsrDynamics::~bsrDynamics () -{} - -S_bsrCellsList bsrDynamics::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create ( - fInputLineNumber, kCellWordSign); - - switch (fDynamicsKind) { - case msrDynamics::kF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellF)); - break; - case msrDynamics::kFF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellF, kCellF)); - break; - case msrDynamics::kFFF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellF, kCellF, kCellF)); - break; - case msrDynamics::kFFFF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellF, kCellF, kCellF, kCellF)); - break; - case msrDynamics::kFFFFF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellF, kCellF, kCellF, kCellF, kCellF)); - break; - case msrDynamics::kFFFFFF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellF, kCellF, kCellF, kCellF, kCellF, kCellF)); - break; - - case msrDynamics::kP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellP)); - break; - case msrDynamics::kPP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellP, kCellP)); - break; - case msrDynamics::kPPP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellP, kCellP, kCellP)); - break; - case msrDynamics::kPPPP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellP, kCellP, kCellP, kCellP)); - break; - case msrDynamics::kPPPPP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellP, kCellP, kCellP, kCellP, kCellP)); - break; - case msrDynamics::kPPPPPP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellP, kCellP, kCellP, kCellP, kCellP, kCellP)); - break; - - case msrDynamics::kMF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellM, kCellF)); - break; - case msrDynamics::kMP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellM, kCellP)); - break; - case msrDynamics::kFP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellM, kCellF)); - break; - case msrDynamics::kFZ: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellF, kCellZ)); - break; - case msrDynamics::kRF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellR, kCellF)); - break; - case msrDynamics::kSF: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellS, kCellF)); - break; - - case msrDynamics::kRFZ: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellR, kCellF, kCellZ)); - break; - case msrDynamics::kSFZ: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellS, kCellF, kCellZ)); - break; - case msrDynamics::kSFP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellS, kCellF, kCellP)); - break; - case msrDynamics::kSFPP: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellS, kCellF, kCellP, kCellP)); - break; - case msrDynamics::kSFFZ: - result-> - appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, kCellS, kCellF, kCellF, kCellZ)); - break; - case msrDynamics::k_NoDynamics: - result = - bsrCellsList::create (fInputLineNumber); - } // switch - - return result; -} - -int bsrDynamics::fetchCellsNumber() const -{ - return fDynamicsCellsList->fetchCellsNumber(); -} - -void bsrDynamics::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrDynamics::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrDynamics elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrDynamics::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrDynamics::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrDynamics::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrDynamics elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrDynamics::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrDynamics::browseData (basevisitor* v) -{} - -string bsrDynamics::asString () const -{ - stringstream s; - - s << - "Dynamics" << - ", dynamicsKind: " << - msrDynamics::dynamicsKindAsString (fDynamicsKind) << - ", dynamicsCellsList: " << - fDynamicsCellsList->asShortString () << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrDynamics::print (ostream& os) const -{ - os << - "Dynamics" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 23; - - os << - setw (fieldWidth) << - "dynamicsKind" << " : " << - msrDynamics::dynamicsKindAsString (fDynamicsKind) << - endl << - setw (fieldWidth) << - "noteCellsList" << " : " << - fDynamicsCellsList->asShortString () << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrDynamics& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrDynamics_MUT_DEP.h b/src/lilypond/bsrDynamics_MUT_DEP.h deleted file mode 100644 index 643ee87bb..000000000 --- a/src/lilypond/bsrDynamics_MUT_DEP.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrDynamics : public bsrLineElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrDynamics::msrDynamicsKind dynamicsKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrDynamics ( - int inputLineNumber, - msrDynamics::msrDynamicsKind dynamicsKind); - - virtual ~bsrDynamics (); - - public: - - // set and get - // ------------------------------------------------------ - - msrDynamics::msrDynamicsKind - getDynamicsKind () const - { return fDynamicsKind; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fDynamicsCellsList; } - - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList noteValueKindAsCellsList () const; - - S_bsrCellsList noteOctaveKindAsCellsList () const; - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrDynamics::msrDynamicsKind - fDynamicsKind; - - S_bsrCellsList fDynamicsCellsList; -}; -typedef SMARTP S_bsrDynamics; -EXP ostream& operator<< (ostream& os, const S_bsrDynamics& elt); - diff --git a/src/lilypond/bsrElements.cpp b/src/lilypond/bsrElements.cpp deleted file mode 100644 index a0ae17993..000000000 --- a/src/lilypond/bsrElements.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "bsrElements.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_bsrElement bsrElement::create ( - int inputLineNumber) -{ - bsrElement* o = - new bsrElement ( - inputLineNumber); - assert(o!=0); - return o; -} - -bsrElement::bsrElement ( - int inputLineNumber) - : msrElement (inputLineNumber) -{} - -bsrElement::~bsrElement () -{} - -void bsrElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrElement::browseData (basevisitor* v) -{} - - -string bsrElement::asString () const -{ - // this is overriden all in actual elements - return "??? bsrElement::asString () ???"; -} - -string bsrElement::asShortString () const -{ - // this can be overriden in actual elements - return asString (); -} - -void bsrElement::print (ostream& os) const -{ - os << asString () << endl; -} - -ostream& operator<< (ostream& os, const S_bsrElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrElements.h b/src/lilypond/bsrElements.h deleted file mode 100644 index 865aa8c60..000000000 --- a/src/lilypond/bsrElements.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrElements___ -#define ___bsrElements___ - -#include "msrElements.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class bsrElement : public msrElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrElement ( - int inputLineNumber); - - virtual ~bsrElement (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asString () const; - - virtual std::string asShortString () const; - - virtual void print (ostream& os) const; - -}; -typedef SMARTP S_bsrElement; -EXP ostream& operator<< (ostream& os, const S_bsrElement& elt); - -//______________________________________________________________________________ -template class bsrBrowser : public browser -{ - protected: - - basevisitor* fVisitor; - - virtual void enter (T& t) { t.acceptIn (fVisitor); } - virtual void leave (T& t) { t.acceptOut (fVisitor); } - - public: - - bsrBrowser (basevisitor* v) : fVisitor (v) - {} - - virtual ~bsrBrowser () - {} - - virtual void set (basevisitor* v) - { fVisitor = v; } - - virtual void browse (T& t) - { - enter (t); - - t.browseData (fVisitor); - - leave (t); - } -}; - - -} - - -#endif diff --git a/src/lilypond/bsrFootNotes.cpp b/src/lilypond/bsrFootNotes.cpp deleted file mode 100644 index cad064684..000000000 --- a/src/lilypond/bsrFootNotes.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // for 'setw()' - -#include "bsrMutualDependencies.h" - -#include "utilities.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrFootNotesElement bsrFootNotesElement::create ( - int inputLineNumber, - string footNoteText) -{ - bsrFootNotesElement* o = - new bsrFootNotesElement ( - inputLineNumber, footNoteText); - assert(o!=0); - return o; -} - -bsrFootNotesElement::bsrFootNotesElement ( - int inputLineNumber, - string footNoteText) - : bsrElement (inputLineNumber) -{ - fFootNoteText = footNoteText; - - fFootNotesElementCellsList = - bsrCellsList::create (inputLineNumber); -} - -bsrFootNotesElement::~bsrFootNotesElement () -{} - -void bsrFootNotesElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrFootNotesElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrFootNotesElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrFootNotesElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrFootNotesElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrFootNotesElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrFootNotesElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrFootNotesElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrFootNotesElement::browseData (basevisitor* v) -{ -} - -string bsrFootNotesElement::asString () const -{ - stringstream s; - - s << - "FootNotesElement" << - // JMI ", fFootNoteText: " << - ", \"" << fFootNoteText << "\"" << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrFootNotesElement::print (ostream& os) const -{ - os << - "FootNotesElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << - "footNoteText " << " : \"" << fFootNoteText << "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrFootNotesElement& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrFootNotes bsrFootNotes::create ( - int inputLineNumber) -{ - bsrFootNotes* o = - new bsrFootNotes ( - inputLineNumber); - assert(o!=0); - return o; -} - -bsrFootNotes::bsrFootNotes ( - int inputLineNumber) - : bsrLine ( - inputLineNumber, - 0, // JMI ??? - gBrailleOah->fCellsPerLine) -{} - -bsrFootNotes::~bsrFootNotes () -{} - -void bsrFootNotes::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrFootNotes::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrFootNotes elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrFootNotes::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrFootNotes::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrFootNotes::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrFootNotes elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrFootNotes::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrFootNotes::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = - fFootNotesElementsList.begin (); - i != fFootNotesElementsList.end (); - i++ ) { - // browse the element - bsrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -void bsrFootNotes::print (ostream& os) const -{ - os << - "FootNotes" << - endl; - - gIndenter++; - - // print the notes if any - const int fieldWidth = 19; - - int footNotesElementsListSize = fFootNotesElementsList.size (); - - if (footNotesElementsListSize || gBsrOah->fDisplayBsrDetails) { - os << - setw (fieldWidth) << - "footNotesElementsList" << " : " << - endl; - - if (footNotesElementsListSize) { - gIndenter++; - - list::const_iterator - iBegin = fFootNotesElementsList.begin (), - iEnd = fFootNotesElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrFootNotes& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrFootNotes_MUT_DEP.h b/src/lilypond/bsrFootNotes_MUT_DEP.h deleted file mode 100644 index 7feb37cf5..000000000 --- a/src/lilypond/bsrFootNotes_MUT_DEP.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrFootNotesElement : public bsrElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string footNoteText); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrFootNotesElement ( - int inputLineNumber, - string footNoteText); - - virtual ~bsrFootNotesElement (); - - public: - - // set and get - // ------------------------------------------------------ - - string getFootNoteText () const - { return fFootNoteText; } - - S_bsrCellsList getFootNotesElementCellsList () const - { return fFootNotesElementCellsList ;} - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fFootNoteText; - - S_bsrCellsList fFootNotesElementCellsList; -}; -typedef SMARTP S_bsrFootNotesElement; -EXP ostream& operator<< (ostream& os, const S_bsrFootNotesElement& elt); - -//______________________________________________________________________________ -class bsrFootNotes : public bsrLine -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrFootNotes ( - int inputLineNumber); - - virtual ~bsrFootNotes (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - void appendElementToFootNotes ( - S_bsrFootNotesElement footNotesElement) - { - fFootNotesElementsList.push_back ( - footNotesElement); - } - - int fetchLineContentsNumber () const - { return fLineContentsList.size (); } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - list - fFootNotesElementsList; -}; -typedef SMARTP S_bsrFootNotes; -EXP ostream& operator<< (ostream& os, const S_bsrFootNotes& elt); - diff --git a/src/lilypond/bsrKeys.cpp b/src/lilypond/bsrKeys.cpp deleted file mode 100644 index af09a6b13..000000000 --- a/src/lilypond/bsrKeys.cpp +++ /dev/null @@ -1,299 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "oahOah.h" -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrKey bsrKey::create ( - int inputLineNumber, - bsrKeyKind keyKind, - int numberOfAlterations) -{ - bsrKey* o = - new bsrKey ( - inputLineNumber, keyKind, numberOfAlterations); - assert (o!=0); - - return o; -} - -bsrKey::bsrKey ( - int inputLineNumber, - bsrKeyKind keyKind, - int numberOfAlterations) - : bsrLineElement (inputLineNumber) -{ - fKeyKind = keyKind; - fNumberOfAlterations = numberOfAlterations; - - // consistency check - if (fKeyKind == kKeyKindNaturals && fNumberOfAlterations != 0) { - stringstream s; - - s << - "BSR key inconsistency:" << - "keyKind: " << keyKindAsString (fKeyKind) << - "numberOfAlterations: " << fNumberOfAlterations; - - bsrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fKeyCellsList = buildCellsList (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Creating bsrKey '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -bsrKey::~bsrKey () -{} - - -S_bsrCellsList bsrKey::keyKindAsCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - switch (fKeyKind) { - case bsrKey::kKeyKindNone: - break; - case bsrKey::kKeyKindFlats: - result-> - appendCellKindToCellsList ( - kCellFlat); - break; - case bsrKey::kKeyKindNaturals: - result-> - appendCellKindToCellsList ( - kCellNatural); - break; - case bsrKey::kKeyKindSharps: - result-> - appendCellKindToCellsList ( - kCellSharp); - break; - } // switch - - return result; -} - -S_bsrCellsList bsrKey::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create ( - fInputLineNumber); - - switch (fNumberOfAlterations) { - case 0: - break; - - case 1: - case 2: - case 3: - // create as many flat or sharp signs as needed - for (int i = 1; i <= fNumberOfAlterations; i++) { - result->appendCellsListToCellsList ( - keyKindAsCellsList ()); - } // for - break; - - default: - { - // create the number of alterations - S_bsrNumber - number = - bsrNumber::create ( - fInputLineNumber, - fNumberOfAlterations, - bsrNumber::kNumberSignIsNeededYes); - - // append it to result - result->appendCellsListToCellsList ( - number->fetchCellsList ()); - - // append the flat or sharp sign to result - result->appendCellsListToCellsList ( - keyKindAsCellsList ()); - } - } // switch - - return result; -} - -int bsrKey::fetchCellsNumber() const -{ - return fKeyCellsList->fetchCellsNumber(); -} - -void bsrKey::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrKey::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrKey elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrKey::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrKey::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrKey::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrKey elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrKey::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrKey::browseData (basevisitor* v) -{} - -string bsrKey::keyKindAsString ( - bsrKeyKind keyKind) -{ - string result; - - switch (keyKind) { - case bsrKey::kKeyKindNone: - result = "***keyKindNone***"; - break; - case bsrKey::kKeyKindFlats: - result = "keyFlats"; - break; - case bsrKey::kKeyKindNaturals: - result = "keyNaturals"; - break; - case bsrKey::kKeyKindSharps: - result = "keySharps"; - break; - } // switch - - return result; -} - -string bsrKey::asString () const -{ - stringstream s; - - s << - "Key" << - ", " << keyKindAsString (fKeyKind) << - ", numberOfAlterations: " << fNumberOfAlterations << - ", keyCellsList: " << fKeyCellsList->asShortString () << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrKey::print (ostream& os) const -{ - os << - "Key" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 20; - - os << - setw (fieldWidth) << - "keyKind" << " : " << keyKindAsString (fKeyKind) << - endl << - setw (fieldWidth) << - "numberOfAlterations" << " : " << fNumberOfAlterations << - endl << - setw (fieldWidth) << - "keyCellsList" << " : " << fKeyCellsList->asShortString () << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrKey& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrKeys_MUT_DEP.h b/src/lilypond/bsrKeys_MUT_DEP.h deleted file mode 100644 index fc80df4f2..000000000 --- a/src/lilypond/bsrKeys_MUT_DEP.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrKey; -typedef SMARTP S_bsrKey; - -class bsrKey : public bsrLineElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrKeyKind { - kKeyKindNone, - kKeyKindFlats, kKeyKindNaturals, kKeyKindSharps }; - - static string keyKindAsString ( - bsrKeyKind keyKind); - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - bsrKeyKind keyKind, - int numberOfAlterations); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrKey ( - int inputLineNumber, - bsrKeyKind keyKind, - int numberOfAlterations); - - virtual ~bsrKey (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrKeyKind getKeyKind () const - { return fKeyKind; } - - int getNumberOfAlterations () const - { return fNumberOfAlterations; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fKeyCellsList; } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList keyKindAsCellsList () const; - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrKeyKind fKeyKind; - int fNumberOfAlterations; - - S_bsrCellsList fKeyCellsList; -}; -typedef SMARTP S_bsrKey; -EXP ostream& operator<< (ostream& os, const S_bsrKey& elt); - diff --git a/src/lilypond/bsrLineElements.cpp b/src/lilypond/bsrLineElements.cpp deleted file mode 100644 index 4190ee7f7..000000000 --- a/src/lilypond/bsrLineElements.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrMutualDependencies.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -/* -S_bsrLineElement bsrLineElement::create ( - int inputLineNumber) -{ - bsrLineElement* o = - new bsrLineElement ( - inputLineNumber); - assert(o!=0); - return o; -} -*/ - -bsrLineElement::bsrLineElement ( - int inputLineNumber) - : bsrElement (inputLineNumber) -{ - fSpacesBefore = 0; -} - -bsrLineElement::~bsrLineElement () -{} - -void bsrLineElement::setBsrLineUpLink ( -S_bsrLine bsrLineUpLink) -{ - fBsrLineUpLink = bsrLineUpLink; -} - -S_bsrLine bsrLineElement::getBsrLineUpLink () const -{ - return fBsrLineUpLink; -} - -void bsrLineElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrLineElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrLineElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrLineElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrLineElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrLineElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrLineElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrLineElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrLineElement::browseData (basevisitor* v) -{} - - -string bsrLineElement::asString () const -{ - // this is overriden all in actual elements - return "??? bsrLineElement::asString () ???"; -} - -string bsrLineElement::asShortString () const -{ - // this can be overriden in actual elements - return asString (); -} - -void bsrLineElement::print (ostream& os) const -{ - os << asString () << endl; -} - -ostream& operator<< (ostream& os, const S_bsrLineElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrLineElements_MUT_DEP.h b/src/lilypond/bsrLineElements_MUT_DEP.h deleted file mode 100644 index bb3d94cfc..000000000 --- a/src/lilypond/bsrLineElements_MUT_DEP.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrLineElement : public bsrElement -{ - public: - - // creation - // ------------------------------------------------------ - -/* - static SMARTP create ( - int inputLineNumber); -*/ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrLineElement ( - int inputLineNumber); - - virtual ~bsrLineElement (); - - public: - - // set and get - // ------------------------------------------------------ - - void setBsrLineUpLink ( - S_bsrLine bsrLineUpLink); - - S_bsrLine getBsrLineUpLink () const; - - - void setSpacesBefore (int value) - { fSpacesBefore = value; } - - int getSpacesBefore () const - { return fSpacesBefore; } - - public: - - // services - // ------------------------------------------------------ - - - virtual S_bsrCellsList - fetchCellsList () const = 0; - - virtual int fetchCellsNumber () const = 0; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asString () const; - - virtual std::string asShortString () const; - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - S_bsrLine fBsrLineUpLink; - - int fSpacesBefore; -}; -typedef SMARTP S_bsrLineElement; -EXP ostream& operator<< (ostream& os, const S_bsrLineElement& elt); - diff --git a/src/lilypond/bsrLines.cpp b/src/lilypond/bsrLines.cpp deleted file mode 100644 index 5038e3232..000000000 --- a/src/lilypond/bsrLines.cpp +++ /dev/null @@ -1,846 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrMutualDependencies.h" - -#include "oahOah.h" -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ - -S_bsrLineContents bsrLineContents::create ( - int inputLineNumber, - bsrLineContentsKind lineContentsKind) -{ - bsrLineContents* o = - new bsrLineContents ( - inputLineNumber, - lineContentsKind); - assert(o!=0); - return o; -} - -bsrLineContents::bsrLineContents ( - int inputLineNumber, - bsrLineContentsKind lineContentsKind) - : bsrElement (inputLineNumber) -{ - fLineContentsKind = lineContentsKind; -} - -bsrLineContents::~bsrLineContents () -{} - -S_bsrLineContents bsrLineContents::createLineNewbornClone () -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceLines) { - gLogOstream << - "Creating a newborn clone of line " << - asString () << - endl; - } -#endif - - S_bsrLineContents - newbornClone = - bsrLineContents::create ( - fInputLineNumber, - fLineContentsKind); - - return newbornClone; -} - -/* -void bsrLineContents::setBsrLineUpLink ( -S_bsrLine bsrLineUpLink) -{ - fBsrLineUpLink = bsrLineUpLink; -} - -S_bsrLine bsrLineContents::getBsrLineUpLink () const -{ - return fBsrLineUpLink; -} -*/ - -void bsrLineContents::appendLineElementToLineContents ( - S_bsrLineElement lineElement) -{ - fLineContentsElementsList.push_back (lineElement); -} - -void bsrLineContents::insertLineElementBeforeLastElementOfLineContents ( - S_bsrLineElement lineElement) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes || gTraceOah->fTraceMeasures) { - gLogOstream << - "Inserting line element '" << - lineElement->asShortString () << - "' before the last element of line contents '" << - asString () << - "'" << - endl; - } -#endif - - int - lineContentsElementsListSize = - fLineContentsElementsList.size (); - - if (lineContentsElementsListSize > 0) { - list::iterator it = fLineContentsElementsList.begin(); - - std::advance (it, lineContentsElementsListSize - 1); - - fLineContentsElementsList.insert (it, lineElement); - } - else { - stringstream s; - - s << - "line contents elementslist is empty, cannot insert '" << - lineElement->asShortString () << - "' before its last element"; - - bsrInternalError ( - gOahOah->fInputSourceName, - lineElement->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -int bsrLineContents::fetchCellsNumber () const -{ - int result = 0; - - for ( - list::const_iterator i = fLineContentsElementsList.begin (); - i != fLineContentsElementsList.end (); - i++ - ) { - S_bsrLineElement lineElement = (*i); - - result += lineElement->fetchCellsNumber (); - } // for - - return result; -} - -void bsrLineContents::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrLineContents::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrLineContents elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrLineContents::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrLineContents::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrLineContents::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrLineContents elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrLineContents::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrLineContents::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fLineContentsElementsList.begin (); - i != fLineContentsElementsList.end (); - i++ ) { - // browse the element - bsrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string bsrLineContents::lineContentsKindAsString ( - bsrLineContentsKind lineContentsKind) -{ - string result; - - switch (lineContentsKind) { - case bsrLineContents::kLineContentsRegular: - result = "lineContentsRegular"; - break; - case bsrLineContents::kLineContentsContinuation: - result = "lineContentsContinuation"; - break; - } // switch - - return result; -} - -string bsrLineContents::asShortString () const -{ - /* JMI - // this is overriden all in actual elements - return "??? bsrLineContents::asString () ???"; - */ - - stringstream s; - - s << - "LineContents" << - ", lineContentsKind: " << - lineContentsKindAsString (fLineContentsKind) << - ", " << - singularOrPlural ( - fLineContentsElementsList.size (), "lineElement", "lineElements"); - - return s.str (); -} - -string bsrLineContents::asString () const -{ - // this can be overriden in actual elements - return asShortString (); -} - -void bsrLineContents::print (ostream& os) const -{ - int lineElementsListSize = fLineContentsElementsList.size (); - - os << - "LineContents" << - ", lineContentsKind: " << - lineContentsKindAsString (fLineContentsKind) << - ", " << - singularOrPlural ( - lineElementsListSize, "lineElement", "lineElements") << - endl; - - gIndenter++; - - // print the line numbers - const int fieldWidth = 17; - - os << left << - setw (fieldWidth) << - "cellsNumber" << " : " << fetchCellsNumber () << - endl; - os << endl; - - // print the line elements if any - if (lineElementsListSize || gBsrOah->fDisplayBsrDetails) { - os << -// setw (fieldWidth) << - "LineElementsList" << - ", " << - singularOrPlural ( - lineElementsListSize, "lineElement", "lineElements"); - if (lineElementsListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fLineContentsElementsList.begin (), - iEnd = fLineContentsElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrLineContents& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrLine bsrLine::create ( - int inputLineNumber, - int printLineNumber, - int cellsPerLine) -{ - bsrLine* o = - new bsrLine ( - inputLineNumber, printLineNumber, cellsPerLine); - assert(o!=0); - return o; -} - -bsrLine::bsrLine ( - int inputLineNumber, - int printLineNumber, - int cellsPerLine) - : bsrPageElement (inputLineNumber) -{ - fPrintLineNumber = printLineNumber; - fBrailleLineNumber = fPrintLineNumber; // will be set by BSR finalizer - - fCellsPerLine = cellsPerLine; - - fLineNumberCellsList = buildLineNumberCellsList (); - - fASpaceIsNeededInLine = true; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceLines) { - gLogOstream << - "Creating bsrLine '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -bsrLine::~bsrLine () -{} - -S_bsrLine bsrLine::createLineNewbornClone () -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceLines) { - gLogOstream << - "Creating a newborn clone of line " << - asString () << - endl; - } -#endif - - S_bsrLine - newbornClone = - bsrLine::create ( - fInputLineNumber, - fPrintLineNumber, - fCellsPerLine); - - // braille line number - newbornClone->fBrailleLineNumber = - fBrailleLineNumber; - - return newbornClone; -} - -void bsrLine::appendLineElementToLine (S_bsrLineElement lineElement) -{ - S_bsrLineContents - lineContentsToAppendTo; - - if (! fLineContentsList.size ()) { - // first insertion in this line: create the first, regular line contents - lineContentsToAppendTo = - bsrLineContents::create ( - lineElement->getInputLineNumber (), - bsrLineContents::kLineContentsRegular); - - // set lineElement's spacesAfter value if needed - switch (lineContentsToAppendTo->getLineContentsKind ()) { - case bsrLineContents::kLineContentsRegular: - // leave it as 0 - break; - case bsrLineContents::kLineContentsContinuation: - // JMI lineElement->setSpacesBefore (2); - break; - } // switch - - // append it to the line contents list - fLineContentsList.push_back (lineContentsToAppendTo); - } - else { - lineContentsToAppendTo = fLineContentsList.back (); - - // set lineElement's spacesAfter value - // JMI lineElement->setSpacesBefore (1); - } - - if (fASpaceIsNeededInLine) { - // append a space to the line elements list // JMI appendSpacesToLine ??? - lineContentsToAppendTo-> - appendLineElementToLineContents ( - bsrSpaces::create ( - fInputLineNumber, 1)); - - fASpaceIsNeededInLine = false; - } - - lineContentsToAppendTo-> - appendLineElementToLineContents (lineElement); -} - -void bsrLine::insertElementBeforeLastElementOfLine ( - S_bsrLineElement lineElement) -{ - S_bsrLineContents - lineContentsToAppendTo; - - if (! fLineContentsList.size ()) { - // first insertion in this line: create the first, regular line contents - lineContentsToAppendTo = - bsrLineContents::create ( - lineElement->getInputLineNumber (), - bsrLineContents::kLineContentsRegular); - - // append it to the line contents list - fLineContentsList.push_back (lineContentsToAppendTo); - } - else { - lineContentsToAppendTo = fLineContentsList.back (); - } - - lineContentsToAppendTo-> - insertLineElementBeforeLastElementOfLineContents (lineElement); -} - -void bsrLine::appendSpacesToLine (S_bsrSpaces spaces) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceSpaces || gBsrOah->fTraceLines) { - gLogOstream << - "Appending spaces '" << - spaces->asShortString () << - "' to line '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToLine (spaces); -} - -void bsrLine::appendKeyToLine (S_bsrKey key) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending key '" << - key->asShortString () << - "' to line '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToLine (key); - fASpaceIsNeededInLine = true; -} - -void bsrLine::appendTimeToLine (S_bsrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending time '" << - time->asShortString () << - "' to line '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToLine (time); - fASpaceIsNeededInLine = true; -} - -void bsrLine::insertTimeBeforeLastElementOfLine (S_bsrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes || gTraceOah->fTraceMeasures) { - gLogOstream << - "Inserting time '" << - time->asShortString () << - "' before the last element of line '" << - asString () << - "'" << - endl; - } -#endif - - insertElementBeforeLastElementOfLine (time); - fASpaceIsNeededInLine = true; -} - -void bsrLine::appendTempoToLine (S_bsrTempo tempo) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending tempo '" << - tempo->asShortString () << - "' to line '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToLine (tempo); - fASpaceIsNeededInLine = true; -} - -void bsrLine::appendMeasureToLine (S_bsrMeasure measure) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gBsrOah->fTraceLines) { - gLogOstream << - "Appending line '" << - measure->asShortString () << - "' to line '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToLine (measure); - fASpaceIsNeededInLine = true; -} - -void bsrLine::appendLineElementToLastMeasureOfLine ( - S_bsrLineElement lineElement) -{ - S_bsrLineContents - lineContentsToAppendTo; - - if (! fLineContentsList.size ()) { - // first insertion in this line: create the first, regular line contents - lineContentsToAppendTo = - bsrLineContents::create ( - lineElement->getInputLineNumber (), - bsrLineContents::kLineContentsRegular); - - // set lineElement's spacesAfter value if needed - switch (lineContentsToAppendTo->getLineContentsKind ()) { - case bsrLineContents::kLineContentsRegular: - // leave it as 0 - break; - case bsrLineContents::kLineContentsContinuation: - // JMI lineElement->setSpacesBefore (2); - break; - } // switch - - // append it to the line contents list - fLineContentsList.push_back (lineContentsToAppendTo); - } - else { - lineContentsToAppendTo = fLineContentsList.back (); - - // set lineElement's spacesAfter value - // JMI lineElement->setSpacesBefore (1); - } - - if (fASpaceIsNeededInLine) { - // append a space to the line elements list // JMI appendSpacesToLine ??? - lineContentsToAppendTo-> - appendLineElementToLineContents ( - bsrSpaces::create ( - fInputLineNumber, 1)); - - fASpaceIsNeededInLine = false; - } - - lineContentsToAppendTo-> - appendLineElementToLineContents (lineElement); -} - -void bsrLine::appendNoteToLine (S_bsrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending note '" << - note->asShortString () << - "' to line '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToLastMeasureOfLine (note); // last measure? JMI -} - -S_bsrCellsList bsrLine::buildLineNumberCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - if (! gBsrOah->fNoLineNumbers) { - // create the print line number - S_bsrNumber - printLineNumber = - bsrNumber::create ( - fInputLineNumber, - fPrintLineNumber, - bsrNumber::kNumberSignIsNeededYes); - - // append it to result - result->appendCellsListToCellsList ( - printLineNumber->fetchCellsList ()); - - if (fBrailleLineNumber != fPrintLineNumber) { // JMI - // create the braille line number - S_bsrNumber - brailleLineNumber = - bsrNumber::create ( - fInputLineNumber, - fBrailleLineNumber, - bsrNumber::kNumberSignIsNeededYes); - - // append it to result - result->appendCellsListToCellsList ( - brailleLineNumber->fetchCellsList ()); - } - } - - return result; -} - -int bsrLine::fetchCellsNumber () const -{ - int result = 0; - - for ( - list::const_iterator i = fLineContentsList.begin (); - i != fLineContentsList.end (); - i++ ) { - result += (*i)->fetchCellsNumber (); - } // for - - return result; -} - -void bsrLine::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrLine::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrLine elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrLine::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrLine::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrLine::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrLine elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrLine::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrLine::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fLineContentsList.begin (); - i != fLineContentsList.end (); - i++ ) { - // browse the element - bsrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string bsrLine::asString () const -{ - stringstream s; - - s << - "Line" << - ", printLineNumber" << " : " << fPrintLineNumber << - ", brailleLineNumber" << " : " << fBrailleLineNumber << - ", cellsPerLine" << " : " << fCellsPerLine << - ", lineContents: " << fLineContentsList.size () << - ", cellsNumber" << " : " << fetchCellsNumber () << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrLine::print (ostream& os) const -{ - int lineContentsListSize = fLineContentsList.size (); - - os << - "Line" << - ", printLineNumber: " << fPrintLineNumber << - ", " << - singularOrPlural ( - lineContentsListSize, "lineContent", "lineContents") << - endl; - - gIndenter++; - - // print the line numbers - const int fieldWidth = 20; - - os << left << - /* JMI - setw (fieldWidth) << - "printLineNumber" << " : " << fPrintLineNumber << - endl << - */ - setw (fieldWidth) << - "brailleLineNumber" << " : " << fBrailleLineNumber << - endl << - setw (fieldWidth) << - "cellsPerLine" << " : " << fCellsPerLine << - endl << - setw (fieldWidth) << - "lineNumberCellsList" << " : " << buildLineNumberCellsList () << - endl << - setw (fieldWidth) << - "cellsNumber" << " : " << fetchCellsNumber () << - endl; - os << endl; - - // print the line contents if any - if (lineContentsListSize || gBsrOah->fDisplayBsrDetails) { - os << -// setw (fieldWidth) << - "LineContentsList" << - ", " << - singularOrPlural ( - lineContentsListSize, "lineContent", "lineContents"); - if (lineContentsListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fLineContentsList.begin (), - iEnd = fLineContentsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrLine& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrLines_MUT_DEP.h b/src/lilypond/bsrLines_MUT_DEP.h deleted file mode 100644 index 1b23d182e..000000000 --- a/src/lilypond/bsrLines_MUT_DEP.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrLineContents : public bsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrLineContentsKind { - kLineContentsRegular, - kLineContentsContinuation }; - - static string lineContentsKindAsString ( - bsrLineContentsKind lineContentsKind); - - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - bsrLineContentsKind lineContentsKind); - - SMARTP createLineNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrLineContents ( - int inputLineNumber, - bsrLineContentsKind lineContentsKind); - - virtual ~bsrLineContents (); - - public: - - // set and get - // ------------------------------------------------------ - - void setBsrLineUpLink ( - S_bsrLine bsrLineUpLink); - - S_bsrLine getBsrLineUpLink () const; - - bsrLineContentsKind getLineContentsKind () const - { return fLineContentsKind; } - - const list& - getLineContentsElementsList () const - { return fLineContentsElementsList; } - - public: - - // services - // ------------------------------------------------------ - - void appendLineElementToLineContents ( - S_bsrLineElement lineElement); - - void insertLineElementBeforeLastElementOfLineContents ( - S_bsrLineElement lineElement); - - int fetchCellsNumber () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asString () const; - - virtual std::string asShortString () const; - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - S_bsrLine fBsrLineUpLink; - - bsrLineContentsKind fLineContentsKind; - - list - fLineContentsElementsList; -}; -typedef SMARTP S_bsrLineContents; -EXP ostream& operator<< (ostream& os, const S_bsrLineContents& elt); - -//______________________________________________________________________________ -class bsrLine : public bsrPageElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int printLineNumber, - int cellsPerLine); - - SMARTP createLineNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrLine ( - int inputLineNumber, - int printLineNumber, - int cellsPerLine); - - virtual ~bsrLine (); - - public: - - // set and get - // ------------------------------------------------------ - - int getPrintLineNumber () const - { return fPrintLineNumber; } - - int getBrailleLineNumber () const - { return fBrailleLineNumber; } - - int getCellsPerLine () const - { return fCellsPerLine; } - - public: - - // public services - // ------------------------------------------------------ - - void appendSpacesToLine (S_bsrSpaces spaces); - - void appendMeasureToLine (S_bsrMeasure measure); - - void appendKeyToLine (S_bsrKey key); - - void appendTimeToLine (S_bsrTime time); - - void insertTimeBeforeLastElementOfLine (S_bsrTime time); - - void appendTempoToLine (S_bsrTempo tempo); - - void appendNoteToLine (S_bsrNote note); - - int fetchLineContentsNumber () const - { return fLineContentsList.size (); } - - S_bsrCellsList fetchCellsList () const - { return buildLineNumberCellsList (); } // JMI ??? - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList buildLineNumberCellsList () const; - - void appendLineElementToLine ( - S_bsrLineElement lineElement); - - void insertElementBeforeLastElementOfLine ( - S_bsrLineElement lineElement); - - void appendLineElementToLastMeasureOfLine ( - S_bsrLineElement lineElement); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asString () const; - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - int fPrintLineNumber; - int fBrailleLineNumber; - - int fCellsPerLine; - - S_bsrCellsList fLineNumberCellsList; - list - fLineContentsList; - bool fASpaceIsNeededInLine; -}; -typedef SMARTP S_bsrLine; -EXP ostream& operator<< (ostream& os, const S_bsrLine& elt); diff --git a/src/lilypond/bsrMeasures.cpp b/src/lilypond/bsrMeasures.cpp deleted file mode 100644 index 0bfa86fce..000000000 --- a/src/lilypond/bsrMeasures.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrMeasure bsrMeasure::create ( - int inputLineNumber, - string printMeasureNumber) -{ - bsrMeasure* o = - new bsrMeasure ( - inputLineNumber, printMeasureNumber); - assert(o!=0); - return o; -} - -bsrMeasure::bsrMeasure ( - int inputLineNumber, - string printMeasureNumber) - : bsrLineElement (inputLineNumber) -{ - fPrintMeasureNumber = printMeasureNumber; - - // initially, fBrailleMeasureNumber is the same as fPrintMeasureNumber - fBrailleMeasureNumber = fPrintMeasureNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating bsrMeasure '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -bsrMeasure::~bsrMeasure () -{} - -S_bsrMeasure bsrMeasure::createMeasureNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating a newborn clone of measure " << - asString () << - endl; - } -#endif - - S_bsrMeasure - newbornClone = - bsrMeasure::create ( - fInputLineNumber, - fPrintMeasureNumber); - - // braille measure number - newbornClone->fBrailleMeasureNumber = - fBrailleMeasureNumber; - - return newbornClone; -} - -void bsrMeasure::appendLineElementToMeasure ( - S_bsrLineElement lineElement) -{ - fMeasureLineElementsList.push_back (lineElement); -} - -void bsrMeasure::appendClefToMeasure (S_bsrClef clef) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending clef '" << - clef->asShortString () << - "' to measure '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToMeasure (clef); -} - -void bsrMeasure::appendBarlineToMeasure (S_bsrBarline barline) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending barline " << - barline->asShortString () << - " to measure '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToMeasure (barline); -} - -void bsrMeasure::appendNumberToMeasure (S_bsrNumber number) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceNumbers || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending number '" << - number->asShortString () << - "' to measure '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToMeasure (number); -} - -void bsrMeasure::appendWordsToMeasure (S_bsrWords words) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceNumbers || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending words '" << - words->asShortString () << - "' to measure '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToMeasure (words); -} - -void bsrMeasure::appendNoteToMeasure (S_bsrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending note '" << - note->asShortString () << - "' to measure '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToMeasure (note); -} - -void bsrMeasure::appendDynamicsToMeasure (S_bsrDynamics dynamics) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceDynamics || gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending dynamics '" << - dynamics->asShortString () << - "' to measure '" << - asString () << - "'" << - endl; - } -#endif - - appendLineElementToMeasure (dynamics); -} - -S_bsrCellsList bsrMeasure::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - for ( - list::const_iterator i = fMeasureLineElementsList.begin (); - i != fMeasureLineElementsList.end (); - i++ ) { - // append the braille for the element - result-> - appendCellsListToCellsList ( - (*i)->fetchCellsList ()); - } // for - - return result; -} - -int bsrMeasure::fetchCellsNumber () const -{ - return buildCellsList ()->fetchCellsNumber (); -} - -void bsrMeasure::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrMeasure::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrMeasure elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrMeasure::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrMeasure::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrMeasure::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrMeasure elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrMeasure::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrMeasure::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fMeasureLineElementsList.begin (); - i != fMeasureLineElementsList.end (); - i++ ) { - // browse the element - bsrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string bsrMeasure::asString () const -{ - stringstream s; - - s << - "Spaces" << - ", printMeasureNumber: " << fPrintMeasureNumber << - ", printMeasureNumber: " << fPrintMeasureNumber << - ", brailleMeasureNumber: " << fBrailleMeasureNumber << - ", measureElementsList.size (): " << fMeasureLineElementsList.size () << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrMeasure::print (ostream& os) const -{ - os << - "Measure" << - ", printMeasureNumber " << fPrintMeasureNumber << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 21; - - // print the measure numbers - os << left << - setw (fieldWidth) << - "printMeasureNumber" << " : " << fPrintMeasureNumber << - endl << - setw (fieldWidth) << - "brailleMeasureNumber" << " : " << fBrailleMeasureNumber << - endl; - - // print the number of cells - os << left << - setw (fieldWidth) << - "cellsNumber" << " : " << fetchCellsNumber () << - endl; - - // print spaces needs - os << left << - setw (fieldWidth) << - "spacesBefore" << " : " << - fSpacesBefore << - endl; - - os << endl; - - // print the measure elements if any - int measureElementsListSize = fMeasureLineElementsList.size (); - - if (measureElementsListSize || gBsrOah->fDisplayBsrDetails) { - os << -// setw (fieldWidth) << - "MeasureElementsList" << - ", " << - singularOrPlural ( - measureElementsListSize, "element", "elements"); - if (measureElementsListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fMeasureLineElementsList.begin (), - iEnd = fMeasureLineElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrMeasure& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrMeasures_MUT_DEP.h b/src/lilypond/bsrMeasures_MUT_DEP.h deleted file mode 100644 index 171792303..000000000 --- a/src/lilypond/bsrMeasures_MUT_DEP.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrMeasure : public bsrLineElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string printMeasureNumber); - - SMARTP createMeasureNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrMeasure ( - int inputLineNumber, - string printMeasureNumber); - - virtual ~bsrMeasure (); - - public: - - // set and get - // ------------------------------------------------------ - - string getPrintMeasureNumber () const - { return fPrintMeasureNumber; } - - string getBrailleMeasureNumber () const - { return fBrailleMeasureNumber; } - - public: - - // public services - // ------------------------------------------------------ - - void appendClefToMeasure (S_bsrClef clef); - - void appendBarlineToMeasure (S_bsrBarline barline); - - void appendNumberToMeasure (S_bsrNumber number); - - void appendWordsToMeasure (S_bsrWords str); - - void appendNoteToMeasure (S_bsrNote note); - - void appendPaddingNoteToMeasure (S_bsrNote note); - - void appendDynamicsToMeasure (S_bsrDynamics dynamics); - - S_bsrCellsList fetchCellsList () const - { return buildCellsList (); } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - void appendLineElementToMeasure ( - S_bsrLineElement lineElement); - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fPrintMeasureNumber; - string fBrailleMeasureNumber; - - list - fMeasureLineElementsList; -}; -typedef SMARTP S_bsrMeasure; -EXP ostream& operator<< (ostream& os, const S_bsrMeasure& elt); - diff --git a/src/lilypond/bsrMusicHeadings.cpp b/src/lilypond/bsrMusicHeadings.cpp deleted file mode 100644 index 206325885..000000000 --- a/src/lilypond/bsrMusicHeadings.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrMutualDependencies.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrMusicHeading bsrMusicHeading::create ( - int inputLineNumber) -{ - bsrMusicHeading* o = - new bsrMusicHeading ( - inputLineNumber); - assert(o!=0); - return o; -} - -bsrMusicHeading::bsrMusicHeading ( - int inputLineNumber) - : bsrLine ( - inputLineNumber, - 0, // JMI ??? - gBrailleOah->fCellsPerLine) -{} - -bsrMusicHeading::~bsrMusicHeading () -{} - -S_bsrCellsList bsrMusicHeading::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - // append the tempo to result - if (fMusicHeadingTempo) { - result->appendCellsListToCellsList ( - fMusicHeadingTempo->fetchCellsList ()); - } - - // append 1 space to result if needed - if (fMusicHeadingTempo) { - result->appendCellsListToCellsList ( - bsrSpaces::create ( - fInputLineNumber, 1)-> - fetchCellsList ()); - } - - // append the key to result if any - if (fMusicHeadingKey) { - result->appendCellsListToCellsList ( - fMusicHeadingKey->fetchCellsList ()); - } - - // append the time to result if any - if (fMusicHeadingTime) { - result->appendCellsListToCellsList ( - fMusicHeadingTime->fetchCellsList ()); - } - - return result; -} - -void bsrMusicHeading::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrMusicHeading::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrMusicHeading elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrMusicHeading::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrMusicHeading::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrMusicHeading::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrMusicHeading elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrMusicHeading::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrMusicHeading::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrScore::browseData ()" << - endl; - } -#endif - - if (fMusicHeadingTempo) { - // browse the tempo - msrBrowser browser (v); - browser.browse (*fMusicHeadingTempo); - } - - if (fMusicHeadingKey) { - // browse the key - msrBrowser browser (v); - browser.browse (*fMusicHeadingKey); - } - - if (fMusicHeadingTime) { - // browse the time - msrBrowser browser (v); - browser.browse (*fMusicHeadingTime); - } - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% <== bsrScore::browseData ()" << - endl; - } -#endif -} - -string bsrMusicHeading::asString () const -{ - stringstream s; - - s << - "MusicHeading" << - ", musicHeadingTempo: "; - - if (fMusicHeadingTempo) { - s << - fMusicHeadingTempo->asShortString (); - } - else { - s << - "none"; - } - - s << - ", musicHeadingTempo: "; - - if (fMusicHeadingTempo) { - s << - fMusicHeadingTempo->asShortString (); - } - else { - s << - "none"; - } - - s << - ", musicHeadingTime: "; - - if (fMusicHeadingTime) { - s << - fMusicHeadingTime->asShortString (); - } - else { - s << - "none"; - } - - s << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrMusicHeading::print (ostream& os) const -{ - os << - "MusicHeading" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - -// JMI const int fieldWidth = 22; - - os << - "musicHeadingTempo: "; - if (fMusicHeadingTempo) { - os << endl; - - gIndenter++; - - os << - fMusicHeadingTempo; - - gIndenter--; - } - else { - os << - "none" << - endl; - } - - os << - "musicHeadingKey: "; - if (fMusicHeadingKey) { - os << endl; - - gIndenter++; - - os << - fMusicHeadingKey; - - gIndenter--; - } - else { - os << - "none" << - endl; - } - - os << - "musicHeadingTime: "; - if (fMusicHeadingTime) { - os << endl; - - gIndenter++; - - os << - fMusicHeadingTime; - - gIndenter--; - } - else { - os << - "none" << - endl; - } - - os << - "musicHeadingCellsList: " << - endl; - gIndenter++; - os << - buildCellsList () << - endl; - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrMusicHeading& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrMusicHeadings_MUT_DEP.h b/src/lilypond/bsrMusicHeadings_MUT_DEP.h deleted file mode 100644 index 076fb44a5..000000000 --- a/src/lilypond/bsrMusicHeadings_MUT_DEP.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrMusicHeading : public bsrLine -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrMusicHeading ( - int inputLineNumber); - - virtual ~bsrMusicHeading (); - - public: - - // set and get - // ------------------------------------------------------ - - void setMusicHeadingTempo (S_bsrTempo tempo) - { fMusicHeadingTempo = tempo; } - - S_bsrTempo getMusicHeadingTempo () const - { return fMusicHeadingTempo; } - - S_bsrKey getMusicHeadingKey () const - { return fMusicHeadingKey; } - - void setMusicHeadingKey (S_bsrKey key) - { fMusicHeadingKey = key; } - - S_bsrTime getMusicHeadingTime () const - { return fMusicHeadingTime; } - - void setMusicHeadingTime (S_bsrTime time) - { fMusicHeadingTime = time; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return buildCellsList (); } - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_bsrTempo fMusicHeadingTempo; - S_bsrKey fMusicHeadingKey; - S_bsrTime fMusicHeadingTime; -}; -typedef SMARTP S_bsrMusicHeading; -EXP ostream& operator<< (ostream& os, const S_bsrMusicHeading& elt); - diff --git a/src/lilypond/bsrMutualDependencies.h b/src/lilypond/bsrMutualDependencies.h deleted file mode 100644 index 251b0c83a..000000000 --- a/src/lilypond/bsrMutualDependencies.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrMutualDependencies___ -#define ___bsrMutualDependencies___ - -#include "bsrElements.h" - -#include "bsrCellsLists.h" - -#include "msrTempos.h" -#include "msrDynamics.h" - - -namespace MusicXML2 -{ - -/* - This file declares classes that cannot be placed in 'individual' headers - due to mutual dependencies, which C++ requires to be in one and the same file. - - It includes the corresponding bsr*_MUT_DEP.h files, - which are meant to be included only in this one. -*/ - -//______________________________________________________________________________ -// PRE-declarations for class mutual dependencies - -class bsrLine; -typedef SMARTP S_bsrLine; - -class bsrSpaces; -typedef SMARTP S_bsrSpaces; - -class bsrPage; -typedef SMARTP S_bsrPage; - -class bsrMeasure; -typedef SMARTP S_bsrMeasure; - -class bsrKey; -typedef SMARTP S_bsrKey; - -class bsrTime; -typedef SMARTP S_bsrTime; - -class bsrTempo; -typedef SMARTP S_bsrTempo; - -class bsrNote; -typedef SMARTP S_bsrNote; - - -//______________________________________________________________________________ - -#include "bsrLineElements_MUT_DEP.h" - -#include "bsrPageElements_MUT_DEP.h" - -#include "bsrLines_MUT_DEP.h" - -#include "bsrSpaces_MUT_DEP.h" - -#include "bsrPaginations_MUT_DEP.h" - -#include "bsrClefs_MUT_DEP.h" - -#include "bsrKeys_MUT_DEP.h" - -#include "bsrTimes_MUT_DEP.h" - -#include "bsrBarlines_MUT_DEP.h" - -#include "bsrNumbers_MUT_DEP.h" - -#include "bsrWords_MUT_DEP.h" - -#include "bsrNotes_MUT_DEP.h" - -#include "bsrDynamics_MUT_DEP.h" - -#include "bsrMeasures_MUT_DEP.h" - -#include "bsrTempos_MUT_DEP.h" - -#include "bsrPageHeadings_MUT_DEP.h" - -#include "bsrMusicHeadings_MUT_DEP.h" - -#include "bsrFootNotes_MUT_DEP.h" - -#include "bsrPages_MUT_DEP.h" - -} - -#endif diff --git a/src/lilypond/bsrNotes.cpp b/src/lilypond/bsrNotes.cpp deleted file mode 100644 index 8b5fe5860..000000000 --- a/src/lilypond/bsrNotes.cpp +++ /dev/null @@ -1,1169 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrNote bsrNote::create ( - int inputLineNumber, - bsrNoteValueKind noteValueKind, - int noteDotsNumber, - bsrNoteOctaveKind noteOctaveKind, - bsrNoteOctaveIsNeeded noteOctaveIsNeeded, - bsrNoteAccidentalKind noteAccidentalKind) -{ - bsrNote* o = - new bsrNote ( - inputLineNumber, - noteValueKind, - noteDotsNumber, - noteOctaveKind, - noteOctaveIsNeeded, - noteAccidentalKind); - assert (o!=0); - return o; -} - -bsrNote::bsrNote ( - int inputLineNumber, - bsrNoteValueKind noteValueKind, - int noteDotsNumber, - bsrNoteOctaveKind noteOctaveKind, - bsrNoteOctaveIsNeeded noteOctaveIsNeeded, - bsrNoteAccidentalKind noteAccidentalKind) - : bsrLineElement (inputLineNumber) -{ - fNoteValueKind = noteValueKind; - fNoteDotsNumber = noteDotsNumber; - - fNoteValueSizeIsNeeded = false; - - fNoteOctaveKind = noteOctaveKind; - fNoteOctaveIsNeeded = noteOctaveIsNeeded; - - fNoteAccidentalKind = noteAccidentalKind; -} - -bsrNote::~bsrNote () -{} - -S_bsrCellsList bsrNote::noteValueKindAsCellsList ( - int inputLineNumber, - bsrNoteValueKind noteValueKind) -{ - S_bsrCellsList - result = - bsrCellsList::create (inputLineNumber); - - switch (noteValueKind) { - case kNoteValueNone: - break; - - case kNoteValueRestBreve: - result->appendCellKindToCellsList (kDots134); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueRestWhole: - result->appendCellKindToCellsList (kDots134); - break; - case kNoteValueRestHalf: - result->appendCellKindToCellsList (kDots136); - break; - case kNoteValueRestQuarter: - result->appendCellKindToCellsList (kDots1236); - break; - case kNoteValueRest8th: - result->appendCellKindToCellsList (kDots1346); - break; - case kNoteValueRest16th: - result->appendCellKindToCellsList (kDots134); - break; - case kNoteValueRest32nd: - result->appendCellKindToCellsList (kDots136); - break; - case kNoteValueRest64th: - result->appendCellKindToCellsList (kDots1236); - break; - case kNoteValueRest128th: - result->appendCellKindToCellsList (kDots1346); - break; - case kNoteValueRest256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots134); - break; - - case kNoteValueCBreve: - result->appendCellKindToCellsList (kDots13456); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueCWhole: - result->appendCellKindToCellsList (kDots13456); - break; - case kNoteValueCHalf: - result->appendCellKindToCellsList (kDots1345); - break; - case kNoteValueCQuarter: - result->appendCellKindToCellsList (kDots1456); - break; - case kNoteValueC8th: - result->appendCellKindToCellsList (kDots145); - break; - case kNoteValueC16th: - result->appendCellKindToCellsList (kDots13456); - break; - case kNoteValueC32nd: - result->appendCellKindToCellsList (kDots1345); - break; - case kNoteValueC64th: - result->appendCellKindToCellsList (kDots1456); - break; - case kNoteValueC128th: - result->appendCellKindToCellsList (kDots145); - break; - case kNoteValueC256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots13456); - break; - - case kNoteValueDBreve: - result->appendCellKindToCellsList (kDots1356); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueDWhole: - result->appendCellKindToCellsList (kDots1356); - break; - case kNoteValueDHalf: - result->appendCellKindToCellsList (kDots135); - break; - case kNoteValueDQuarter: - result->appendCellKindToCellsList (kDots156); - break; - case kNoteValueD8th: - result->appendCellKindToCellsList (kDots15); - break; - case kNoteValueD16th: - result->appendCellKindToCellsList (kDots1356); - break; - case kNoteValueD32nd: - result->appendCellKindToCellsList (kDots135); - break; - case kNoteValueD64th: - result->appendCellKindToCellsList (kDots156); - break; - case kNoteValueD128th: - result->appendCellKindToCellsList (kDots15); - break; - case kNoteValueD256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots1356); - break; - - case kNoteValueEBreve: - result->appendCellKindToCellsList (kDots12346); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueEWhole: - result->appendCellKindToCellsList (kDots12346); - break; - case kNoteValueEHalf: - result->appendCellKindToCellsList (kDots1234); - break; - case kNoteValueEQuarter: - result->appendCellKindToCellsList (kDots1246); - break; - case kNoteValueE8th: - result->appendCellKindToCellsList (kDots124); - break; - case kNoteValueE16th: - result->appendCellKindToCellsList (kDots12346); - break; - case kNoteValueE32nd: - result->appendCellKindToCellsList (kDots1234); - break; - case kNoteValueE64th: - result->appendCellKindToCellsList (kDots1246); - break; - case kNoteValueE128th: - result->appendCellKindToCellsList (kDots124); - break; - case kNoteValueE256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots12346); - break; - - case kNoteValueFBreve: - result->appendCellKindToCellsList (kDots123456); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueFWhole: - result->appendCellKindToCellsList (kDots123456); - break; - case kNoteValueFHalf: - result->appendCellKindToCellsList (kDots12345); - break; - case kNoteValueFQuarter: - result->appendCellKindToCellsList (kDots12456); - break; - case kNoteValueF8th: - result->appendCellKindToCellsList (kDots1245); - break; - case kNoteValueF16th: - result->appendCellKindToCellsList (kDots123456); - break; - case kNoteValueF32nd: - result->appendCellKindToCellsList (kDots12345); - break; - case kNoteValueF64th: - result->appendCellKindToCellsList (kDots12456); - break; - case kNoteValueF128th: - result->appendCellKindToCellsList (kDots1245); - break; - case kNoteValueF256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots123456); - break; - - case kNoteValueGBreve: - result->appendCellKindToCellsList (kDots12356); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueGWhole: - result->appendCellKindToCellsList (kDots12356); - break; - case kNoteValueGHalf: - result->appendCellKindToCellsList (kDots1235); - break; - case kNoteValueGQuarter: - result->appendCellKindToCellsList (kDots1256); - break; - case kNoteValueG8th: - result->appendCellKindToCellsList (kDots125); - break; - case kNoteValueG16th: - result->appendCellKindToCellsList (kDots12356); - break; - case kNoteValueG32nd: - result->appendCellKindToCellsList (kDots1235); - break; - case kNoteValueG64th: - result->appendCellKindToCellsList (kDots1256); - break; - case kNoteValueG128th: - result->appendCellKindToCellsList (kDots125); - break; - case kNoteValueG256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots12356); - break; - - case kNoteValueABreve: - result->appendCellKindToCellsList (kDots2346); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueAWhole: - result->appendCellKindToCellsList (kDots2346); - break; - case kNoteValueAHalf: - result->appendCellKindToCellsList (kDots234); - break; - case kNoteValueAQuarter: - result->appendCellKindToCellsList (kDots246); - break; - case kNoteValueA8th: - result->appendCellKindToCellsList (kDots24); - break; - case kNoteValueA16th: - result->appendCellKindToCellsList (kDots2346); - break; - case kNoteValueA32nd: - result->appendCellKindToCellsList (kDots234); - break; - case kNoteValueA64th: - result->appendCellKindToCellsList (kDots246); - break; - case kNoteValueA128th: - result->appendCellKindToCellsList (kDots24); - break; - case kNoteValueA256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots2346); - break; - - case kNoteValueBBreve: - result->appendCellKindToCellsList (kDots23456); - result->appendCellKindToCellsList (kDots13); - break; - case kNoteValueBWhole: - result->appendCellKindToCellsList (kDots23456); - break; - case kNoteValueBHalf: - result->appendCellKindToCellsList (kDots2345); - break; - case kNoteValueBQuarter: - result->appendCellKindToCellsList (kDots2456); - break; - case kNoteValueB8th: - result->appendCellKindToCellsList (kDots245); - break; - case kNoteValueB16th: - result->appendCellKindToCellsList (kDots23456); - break; - case kNoteValueB32nd: - result->appendCellKindToCellsList (kDots2345); - break; - case kNoteValueB64th: - result->appendCellKindToCellsList (kDots2456); - break; - case kNoteValueB128th: - result->appendCellKindToCellsList (kDots245); - break; - case kNoteValueB256th: - result->appendCellKindToCellsList (kDots56); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - result->appendCellKindToCellsList (kDots23456); - break; - } // switch - - return result; -} - -S_bsrCellsList bsrNote::noteValueKindAsCellsList () const -{ - return - noteValueKindAsCellsList ( - fInputLineNumber, - fNoteValueKind); -} - -S_bsrCellsList bsrNote::noteValueSizeKindAsCellsList () const -{ - return - noteValueSizeKindAsCellsList ( - fInputLineNumber, - noteValueSizeKindFromNoteValueKind ( - fNoteValueKind)); -} - -S_bsrCellsList bsrNote::noteOctaveKindAsCellsList ( - int inputLineNumber, - bsrNoteOctaveKind noteOctaveKind) -{ - S_bsrCellsList - result = - bsrCellsList::create (inputLineNumber); - - switch (noteOctaveKind) { - case kNoteOctaveNone: - break; - case kNoteOctaveBelow1: - result->appendCellKindToCellsList (kDots4); - result->appendCellKindToCellsList (kDots4); - break; - case kNoteOctave1: - result->appendCellKindToCellsList (kDots4); - break; - case kNoteOctave2: - result->appendCellKindToCellsList (kDots45); - break; - case kNoteOctave3: - result->appendCellKindToCellsList (kDots456); - break; - case kNoteOctave4: - result->appendCellKindToCellsList (kDots5); - break; - case kNoteOctave5: - result->appendCellKindToCellsList (kDots46); - break; - case kNoteOctave6: - result->appendCellKindToCellsList (kDots56); - break; - case kNoteOctave7: - result->appendCellKindToCellsList (kDots6); - break; - case kNoteOctaveAbove7: - result->appendCellKindToCellsList (kDots6); - result->appendCellKindToCellsList (kDots6); - break; - } // switch - - return result; -} - -bsrNote::bsrNoteValueSizeKind bsrNote::noteValueSizeKindFromNoteValueKind ( - bsrNoteValueKind noteValueKind) -{ - bsrNoteValueSizeKind - result = bsrNote::kNoteValueSizeNone; - - switch (noteValueKind) { - case kNoteValueNone: - break; - - case kNoteValueRestBreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueRestWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueRestHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueRestQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueRest8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueRest16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueRest32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueRest64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueRest128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueRest256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - - case kNoteValueCBreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueCWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueCHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueCQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueC8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueC16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueC32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueC64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueC128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueC256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - - case kNoteValueDBreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueDWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueDHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueDQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueD8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueD16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueD32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueD64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueD128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueD256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - - case kNoteValueEBreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueEWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueEHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueEQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueE8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueE16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueE32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueE64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueE128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueE256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - - case kNoteValueFBreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueFWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueFHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueFQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueF8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueF16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueF32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueF64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueF128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueF256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - - case kNoteValueGBreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueGWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueGHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueGQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueG8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueG16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueG32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueG64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueG128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueG256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - - case kNoteValueABreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueAWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueAHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueAQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueA8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueA16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueA32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueA64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueA128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueA256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - - case kNoteValueBBreve: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueBWhole: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueBHalf: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueBQuarter: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueB8th: - result = bsrNote::kNoteValueSizeLarger; - break; - case kNoteValueB16th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueB32nd: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueB64th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueB128th: - result = bsrNote::kNoteValueSizeSmaller; - break; - case kNoteValueB256th: - result = bsrNote::kNoteValueSizeSmaller; - break; - } // switch - - return result; -} - -S_bsrCellsList bsrNote::noteValueSizeKindAsCellsList ( - int inputLineNumber, - bsrNoteValueSizeKind noteValueSizeKind) -{ - S_bsrCellsList - result = - bsrCellsList::create (inputLineNumber); - - switch (noteValueSizeKind) { - case bsrNote::kNoteValueSizeNone: - break; - case bsrNote::kNoteValueSizeLarger: - result->appendCellKindToCellsList (kDots45); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - break; - case bsrNote::kNoteValueSizeSmaller: - result->appendCellKindToCellsList (kDots6); - result->appendCellKindToCellsList (kDots126); - result->appendCellKindToCellsList (kDots2); - break; - } // switch - - return result; -} - -S_bsrCellsList bsrNote::noteOctaveKindAsCellsList () const -{ - return - noteOctaveKindAsCellsList ( - fInputLineNumber, - fNoteOctaveKind); -} - -S_bsrCellsList bsrNote::noteAccidentalKindAsCellsList ( - int inputLineNumber, - bsrNoteAccidentalKind noteAccidentalKind) -{ - S_bsrCellsList - result = - bsrCellsList::create (inputLineNumber); - - switch (noteAccidentalKind) { - case bsrNote::kNoteAccidentalNone: - break; - - case bsrNote::kNoteAccidentalSharp: - result->appendCellKindToCellsList (kCellSharp); - break; - case bsrNote::kNoteAccidentalNatural: - result->appendCellKindToCellsList (kCellNatural); - break; - case bsrNote::kNoteAccidentalFlat: - result->appendCellKindToCellsList (kCellFlat); - break; - - case bsrNote::kNoteAccidentalDoubleFlat: - result->appendCellKindToCellsList (kCellFlat); - result->appendCellKindToCellsList (kCellFlat); - break; - case bsrNote::kNoteAccidentalDoubleSharp: - result->appendCellKindToCellsList (kCellSharp); - result->appendCellKindToCellsList (kCellSharp); - break; - - case bsrNote::kNoteAccidentalQuarterSharp: - result->appendCellKindToCellsList (kDots4); - result->appendCellKindToCellsList (kCellSharp); - break; - case bsrNote::kNoteAccidentalQuarterFlat: - result->appendCellKindToCellsList (kDots4); - result->appendCellKindToCellsList (kCellFlat); - break; - - case bsrNote::kNoteAccidentalThreeQuarterSharp: - result->appendCellKindToCellsList (kDots456); - result->appendCellKindToCellsList (kCellSharp); - break; - - case bsrNote::kNoteAccidentalThreeQuarterFlat: - result->appendCellKindToCellsList (kDots456); - result->appendCellKindToCellsList (kCellFlat); - break; - } // switch - - return result; -} - -S_bsrCellsList bsrNote::noteAccidentalKindAsCellsList () const -{ - return - noteAccidentalKindAsCellsList ( - fInputLineNumber, - fNoteAccidentalKind); -} - -S_bsrCellsList bsrNote::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - // append the note value sign if needed - if (fNoteValueSizeIsNeeded) { - result->appendCellsListToCellsList ( - noteValueSizeKindAsCellsList ()); - } - - // append note accidental if any - result->appendCellsListToCellsList ( - noteAccidentalKindAsCellsList ()); - - // append note octave if needed - switch (fNoteOctaveIsNeeded) { - case bsrNote::kNoteOctaveIsNeededYes: - result->appendCellsListToCellsList ( - noteOctaveKindAsCellsList ()); - break; - case bsrNote::kNoteOctaveIsNeededNo: - break; - } // switch - - // append note value - result->appendCellsListToCellsList ( - noteValueKindAsCellsList ()); - - // append dots if any - for (int i = 0; i < fNoteDotsNumber; i++) { - result->appendCellKindToCellsList ( - kCellAugmentationDot); - } // for - - return result; -} - -int bsrNote::fetchCellsNumber() const -{ - return buildCellsList ()->fetchCellsNumber(); -} - -void bsrNote::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrNote::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrNote elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrNote::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrNote::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrNote::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrNote elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrNote::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrNote::browseData (basevisitor* v) -{} - -string bsrNote::noteValueKindAsString ( - bsrNoteValueKind noteValueKind) -{ - string result; - - switch (noteValueKind) { - case kNoteValueNone: result = "None"; break; - - case kNoteValueRestBreve: result = "RestBreve"; break; - case kNoteValueRestWhole: result = "RestWhole"; break; - case kNoteValueRestHalf: result = "RestHalf"; break; - case kNoteValueRestQuarter: result = "RestQuarter"; break; - case kNoteValueRest8th: result = "Rest8th"; break; - case kNoteValueRest16th: result = "Rest16th"; break; - case kNoteValueRest32nd: result = "Rest32nd"; break; - case kNoteValueRest64th: result = "Rest64th"; break; - case kNoteValueRest128th: result = "Rest128th"; break; - case kNoteValueRest256th: result = "Rest256th"; break; - - case kNoteValueCBreve: result = "CBreve"; break; - case kNoteValueCWhole: result = "CWhole"; break; - case kNoteValueCHalf: result = "CHalf"; break; - case kNoteValueCQuarter: result = "CQuarter"; break; - case kNoteValueC8th: result = "C8th"; break; - case kNoteValueC16th: result = "C16th"; break; - case kNoteValueC32nd: result = "C32nd"; break; - case kNoteValueC64th: result = "C64th"; break; - case kNoteValueC128th: result = "C128th"; break; - case kNoteValueC256th: result = "C256th"; break; - - case kNoteValueDBreve: result = "DBreve"; break; - case kNoteValueDWhole: result = "DWhole"; break; - case kNoteValueDHalf: result = "DHalf"; break; - case kNoteValueDQuarter: result = "DQuarter"; break; - case kNoteValueD8th: result = "D8th"; break; - case kNoteValueD16th: result = "D16th"; break; - case kNoteValueD32nd: result = "D32nd"; break; - case kNoteValueD64th: result = "D64th"; break; - case kNoteValueD128th: result = "D128th"; break; - case kNoteValueD256th: result = "D256th"; break; - - case kNoteValueEBreve: result = "EBreve"; break; - case kNoteValueEWhole: result = "EWhole"; break; - case kNoteValueEHalf: result = "EHalf"; break; - case kNoteValueEQuarter: result = "EQuarter"; break; - case kNoteValueE8th: result = "E8th"; break; - case kNoteValueE16th: result = "E16th"; break; - case kNoteValueE32nd: result = "E32nd"; break; - case kNoteValueE64th: result = "E64th"; break; - case kNoteValueE128th: result = "E128th"; break; - case kNoteValueE256th: result = "E256th"; break; - - case kNoteValueFBreve: result = "FBreve"; break; - case kNoteValueFWhole: result = "FWhole"; break; - case kNoteValueFHalf: result = "FHalf"; break; - case kNoteValueFQuarter: result = "FQuarter"; break; - case kNoteValueF8th: result = "F8th"; break; - case kNoteValueF16th: result = "F16th"; break; - case kNoteValueF32nd: result = "F32nd"; break; - case kNoteValueF64th: result = "F64th"; break; - case kNoteValueF128th: result = "F128th"; break; - case kNoteValueF256th: result = "F256th"; break; - - case kNoteValueGBreve: result = "GBreve"; break; - case kNoteValueGWhole: result = "GWhole"; break; - case kNoteValueGHalf: result = "GHalf"; break; - case kNoteValueGQuarter: result = "GQuarter"; break; - case kNoteValueG8th: result = "G8th"; break; - case kNoteValueG16th: result = "G16th"; break; - case kNoteValueG32nd: result = "G32nd"; break; - case kNoteValueG64th: result = "G64th"; break; - case kNoteValueG128th: result = "G128th"; break; - case kNoteValueG256th: result = "G256th"; break; - - case kNoteValueABreve: result = "ABreve"; break; - case kNoteValueAWhole: result = "AWhole"; break; - case kNoteValueAHalf: result = "AHalf"; break; - case kNoteValueAQuarter: result = "AQuarter"; break; - case kNoteValueA8th: result = "A8th"; break; - case kNoteValueA16th: result = "A16th"; break; - case kNoteValueA32nd: result = "A32nd"; break; - case kNoteValueA64th: result = "A64th"; break; - case kNoteValueA128th: result = "A128th"; break; - case kNoteValueA256th: result = "A256th"; break; - - case kNoteValueBBreve: result = "BBreve"; break; - case kNoteValueBWhole: result = "BWhole"; break; - case kNoteValueBHalf: result = "BHalf"; break; - case kNoteValueBQuarter: result = "BQuarter"; break; - case kNoteValueB8th: result = "B8th"; break; - case kNoteValueB16th: result = "B16th"; break; - case kNoteValueB32nd: result = "B32nd"; break; - case kNoteValueB64th: result = "B64th"; break; - case kNoteValueB128th: result = "B128th"; break; - case kNoteValueB256th: result = "B256th"; break; - } // switch - - return result; -} - -string bsrNote::noteValueSizeKindAsString ( - bsrNoteValueSizeKind noteValueSizeKind) -{ - string result; - - switch (noteValueSizeKind) { - case bsrNote::kNoteValueSizeNone: - result = "None"; - break; - case bsrNote::kNoteValueSizeLarger: - result = "noteValueSizeLarger"; - break; - case bsrNote::kNoteValueSizeSmaller: - result = "noteValueSizeSmaller"; - break; - } // switch - - return result; -} - -string bsrNote::noteOctaveKindAsString ( - bsrNoteOctaveKind noteOctaveKind) -{ - string result; - - switch (noteOctaveKind) { - case kNoteOctaveNone: result = "octaveNone"; break; - case kNoteOctaveBelow1: result = "octaveBelow1"; break; - case kNoteOctave1: result = "octave1"; break; - case kNoteOctave2: result = "octave2"; break; - case kNoteOctave3: result = "octave3"; break; - case kNoteOctave4: result = "octave4"; break; - case kNoteOctave5: result = "octave5"; break; - case kNoteOctave6: result = "octave6"; break; - case kNoteOctave7: result = "octave7"; break; - case kNoteOctaveAbove7: result = "octaveAbove7"; break; - } // switch - - return result; -} - -string bsrNote::noteOctaveIsNeededAsString ( - bsrNoteOctaveIsNeeded noteOctaveIsNeeded) -{ - string result; - - switch (noteOctaveIsNeeded) { - case bsrNote::kNoteOctaveIsNeededYes: - result = "noteOctaveIsNeededYes"; - break; - case bsrNote::kNoteOctaveIsNeededNo: - result = "noteOctaveIsNeededNo"; - break; - } // switch - - return result; -} - -string bsrNote::noteAccidentalKindAsString ( - bsrNoteAccidentalKind noteAccidentalKind) -{ - string result; - - switch (noteAccidentalKind) { - case bsrNote::kNoteAccidentalNone: - result = "noteAccidentalNone"; - break; - - case bsrNote::kNoteAccidentalSharp: - result = "noteAccidentalSharp"; - break; - case bsrNote::kNoteAccidentalNatural: - result = "noteAccidentalNatural"; - break; - case bsrNote::kNoteAccidentalFlat: - result = "noteAccidentalFlat"; - break; - - case bsrNote::kNoteAccidentalDoubleFlat: - result = "noteAccidentalDoubleFlat"; - break; - case bsrNote::kNoteAccidentalDoubleSharp: - result = "noteAccidentalDoubleSharp"; - break; - - case bsrNote::kNoteAccidentalQuarterSharp: - result = "noteAccidentalQuarterSharp"; - break; - case bsrNote::kNoteAccidentalQuarterFlat: - result = "noteAccidentalQuarterFlat"; - break; - - case bsrNote::kNoteAccidentalThreeQuarterSharp: - result = "noteAccidentalThreeQuarterSharp"; - break; - - case bsrNote::kNoteAccidentalThreeQuarterFlat: - result = "noteAccidentalThreeQuarterFlat"; - break; - } // switch - - return result; -} - -string bsrNote::asString () const -{ - stringstream s; - - s << - "Note" << - ", noteValue: " << - noteValueKindAsString (fNoteValueKind) << - ", noteDotsNumber: " << fNoteDotsNumber << - ", noteOctaveKind: " << - noteOctaveKindAsString (fNoteOctaveKind) << - ", noteValueSizeIsNeeded: " << - booleanAsString (fNoteValueSizeIsNeeded) << - ", noteOctaveIsNeeded: " << - noteOctaveIsNeededAsString (fNoteOctaveIsNeeded) << - ", noteAccidentalKindAsString: " << - noteAccidentalKindAsString (fNoteAccidentalKind) << - ", cellsList (): " << - buildCellsList ()->asShortString () << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrNote::print (ostream& os) const -{ - os << - "Note" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 23; - - os << - setw (fieldWidth) << - "noteValue" << " : " << - noteValueKindAsString (fNoteValueKind) << - endl << - setw (fieldWidth) << - "noteDotsNumber" << " : " << fNoteDotsNumber << - endl << - setw (fieldWidth) << - "noteOctaveKind" << " : " << - noteOctaveKindAsString (fNoteOctaveKind) << - endl << - setw (fieldWidth) << - "noteValueSizeIsNeeded" << " : " << - booleanAsString (fNoteValueSizeIsNeeded) << - endl << - setw (fieldWidth) << - "noteOctaveIsNeeded" << " : " << - noteOctaveIsNeededAsString (fNoteOctaveIsNeeded) << - endl << - setw (fieldWidth) << - "noteAccidentalKind" << " : " << - noteAccidentalKindAsString (fNoteAccidentalKind) << - endl << - setw (fieldWidth) << - "cellsList" << " : " << - buildCellsList ()->asShortString () << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrNote& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrNotes_MUT_DEP.h b/src/lilypond/bsrNotes_MUT_DEP.h deleted file mode 100644 index 315a5e727..000000000 --- a/src/lilypond/bsrNotes_MUT_DEP.h +++ /dev/null @@ -1,281 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrNote : public bsrLineElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrNoteValueKind { - kNoteValueNone, - - kNoteValueRestBreve, - kNoteValueRestWhole, - kNoteValueRestHalf, - kNoteValueRestQuarter, - kNoteValueRest8th, - kNoteValueRest16th, - kNoteValueRest32nd, - kNoteValueRest64th, - kNoteValueRest128th, - kNoteValueRest256th, - - kNoteValueCBreve, - kNoteValueCWhole, - kNoteValueCHalf, - kNoteValueCQuarter, - kNoteValueC8th, - kNoteValueC16th, - kNoteValueC32nd, - kNoteValueC64th, - kNoteValueC128th, - kNoteValueC256th, - - kNoteValueDBreve, - kNoteValueDWhole, - kNoteValueDHalf, - kNoteValueDQuarter, - kNoteValueD8th, - kNoteValueD16th, - kNoteValueD32nd, - kNoteValueD64th, - kNoteValueD128th, - kNoteValueD256th, - - kNoteValueEBreve, - kNoteValueEWhole, - kNoteValueEHalf, - kNoteValueEQuarter, - kNoteValueE8th, - kNoteValueE16th, - kNoteValueE32nd, - kNoteValueE64th, - kNoteValueE128th, - kNoteValueE256th, - - kNoteValueFBreve, - kNoteValueFWhole, - kNoteValueFHalf, - kNoteValueFQuarter, - kNoteValueF8th, - kNoteValueF16th, - kNoteValueF32nd, - kNoteValueF64th, - kNoteValueF128th, - kNoteValueF256th, - - kNoteValueGBreve, - kNoteValueGWhole, - kNoteValueGHalf, - kNoteValueGQuarter, - kNoteValueG8th, - kNoteValueG16th, - kNoteValueG32nd, - kNoteValueG64th, - kNoteValueG128th, - kNoteValueG256th, - - kNoteValueABreve, - kNoteValueAWhole, - kNoteValueAHalf, - kNoteValueAQuarter, - kNoteValueA8th, - kNoteValueA16th, - kNoteValueA32nd, - kNoteValueA64th, - kNoteValueA128th, - kNoteValueA256th, - - kNoteValueBBreve, - kNoteValueBWhole, - kNoteValueBHalf, - kNoteValueBQuarter, - kNoteValueB8th, - kNoteValueB16th, - kNoteValueB32nd, - kNoteValueB64th, - kNoteValueB128th, - kNoteValueB256th }; - - static string noteValueKindAsString ( - bsrNoteValueKind noteValueKind); - - static S_bsrCellsList noteValueKindAsCellsList ( - int inputLineNumber, - bsrNoteValueKind noteValueKind); - - enum bsrNoteValueSizeKind { - kNoteValueSizeNone, - kNoteValueSizeLarger, - kNoteValueSizeSmaller }; - - static string noteValueSizeKindAsString ( - bsrNoteValueSizeKind noteValueSizeKind); - - static bsrNoteValueSizeKind noteValueSizeKindFromNoteValueKind ( - bsrNoteValueKind noteValueKind); - - static S_bsrCellsList noteValueSizeKindAsCellsList ( - int inputLineNumber, - bsrNoteValueSizeKind noteValueSizeKind); - - enum bsrNoteOctaveKind { - kNoteOctaveNone, - kNoteOctaveBelow1, - kNoteOctave1, - kNoteOctave2, - kNoteOctave3, - kNoteOctave4, - kNoteOctave5, - kNoteOctave6, - kNoteOctave7, - kNoteOctaveAbove7 }; - - static string noteOctaveKindAsString ( - bsrNoteOctaveKind noteOctaveKind); - - static S_bsrCellsList noteOctaveKindAsCellsList ( - int inputLineNumber, - bsrNoteOctaveKind noteOctaveKind); - - enum bsrNoteOctaveIsNeeded { - kNoteOctaveIsNeededYes, kNoteOctaveIsNeededNo}; - - static string noteOctaveIsNeededAsString ( - bsrNoteOctaveIsNeeded noteOctaveIsNeeded); - - enum bsrNoteAccidentalKind { - kNoteAccidentalNone, - kNoteAccidentalSharp, kNoteAccidentalNatural, kNoteAccidentalFlat, - kNoteAccidentalDoubleFlat, kNoteAccidentalDoubleSharp, - kNoteAccidentalQuarterSharp, kNoteAccidentalQuarterFlat, - kNoteAccidentalThreeQuarterSharp, kNoteAccidentalThreeQuarterFlat }; - - static string noteAccidentalKindAsString ( - bsrNoteAccidentalKind noteAccidentalKind); - - static S_bsrCellsList noteAccidentalKindAsCellsList ( - int inputLineNumber, - bsrNoteAccidentalKind noteAccidentalKind); - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - bsrNoteValueKind noteValueKind, - int noteDotsNumber, - bsrNoteOctaveKind noteOctaveKind, - bsrNoteOctaveIsNeeded noteOctaveIsNeeded, - bsrNoteAccidentalKind noteAccidentalKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrNote ( - int inputLineNumber, - bsrNoteValueKind noteValueKind, - int noteDotsNumber, - bsrNoteOctaveKind noteOctaveKind, - bsrNoteOctaveIsNeeded noteOctaveIsNeeded, - bsrNoteAccidentalKind noteAccidentalKind); - - virtual ~bsrNote (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrNoteValueKind getNoteValueKind () const - { return fNoteValueKind; } - - int getNoteDotsNumber () const - { return fNoteDotsNumber; } - - void setNoteValueSizeIsNeeded () - { fNoteValueSizeIsNeeded = true; } - - bool getNoteValueSizeIsNeeded () const - { return fNoteValueSizeIsNeeded; } - - void setNoteOctaveIsNeeded ( - bsrNoteOctaveIsNeeded value) - { fNoteOctaveIsNeeded = value; } - - bsrNoteOctaveIsNeeded getNoteOctaveIsNeeded () const - { return fNoteOctaveIsNeeded; } - - bsrNoteAccidentalKind getNoteAccidentalKind () const - { return fNoteAccidentalKind; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return buildCellsList (); } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList noteValueKindAsCellsList () const; - - S_bsrCellsList noteValueSizeKindAsCellsList () const; - - S_bsrCellsList noteOctaveKindAsCellsList () const; - - S_bsrCellsList noteAccidentalKindAsCellsList () const; - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - - bsrNoteValueKind fNoteValueKind; - int fNoteDotsNumber; - - bool fNoteValueSizeIsNeeded; - - bsrNoteOctaveKind fNoteOctaveKind; - bsrNoteOctaveIsNeeded fNoteOctaveIsNeeded; - - bsrNoteAccidentalKind fNoteAccidentalKind; -}; -typedef SMARTP S_bsrNote; -EXP ostream& operator<< (ostream& os, const S_bsrNote& elt); - diff --git a/src/lilypond/bsrNumbers.cpp b/src/lilypond/bsrNumbers.cpp deleted file mode 100644 index 06a3236b4..000000000 --- a/src/lilypond/bsrNumbers.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrNumber bsrNumber::create ( - int inputLineNumber, - int numberValue, - bsrNumberSignIsNeededKind - numberSignIsNeededKind) -{ - bsrNumber* o = - new bsrNumber ( - inputLineNumber, numberValue, numberSignIsNeededKind); - assert (o!=0); - return o; -} - -bsrNumber::bsrNumber ( - int inputLineNumber, - int numberValue, - bsrNumberSignIsNeededKind - numberSignIsNeededKind) - : bsrLineElement (inputLineNumber) -{ - fNumberValue = numberValue; - - fNumberSignIsNeededKind = numberSignIsNeededKind; - - fNumberCellsList = buildCellsList (); -} - -bsrNumber::~bsrNumber () -{} - -S_bsrCellsList bsrNumber::numberValueAsCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - int n = fNumberValue; - - bool numberValueIsNegative = false; - - if (n < 0) { - numberValueIsNegative = true; - n = -n; - } - - while (n > 0) { - int div = n / 10; - int mod = n % 10; - -/* JMI - gLogOstream << // JMI - "% ==> numberValueAsCellsList ()" << - ", n = " << n << - ", div = " << div << - ", mod = " << mod << - endl; -*/ - - bsrCellKind cellKind = kCellUnknown; // SEE TICINO - - switch (mod) { - case 1: cellKind = kCell1; break; - case 2: cellKind = kCell2; break; - case 3: cellKind = kCell3; break; - case 4: cellKind = kCell4; break; - case 5: cellKind = kCell5; break; - case 6: cellKind = kCell6; break; - case 7: cellKind = kCell7; break; - case 8: cellKind = kCell8; break; - case 9: cellKind = kCell9; break; - case 0: cellKind = kCell0; break; - default: - ; - } // switch - - result->prependCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, - cellKind)); - - n = div; - } // while - - if (numberValueIsNegative) { - result->prependCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, - kCell_ac_plus)); // JMI ??? other plus sign? - } - - return result; -} - -S_bsrCellsList bsrNumber::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - // append number sign if needed - switch (fNumberSignIsNeededKind) { - case bsrNumber::kNumberSignIsNeededYes: - result->appendCellsListToCellsList ( - bsrCellsList::create ( - fInputLineNumber, - kCellNumberSign)); - break; - case bsrNumber::kNumberSignIsNeededNo: - break; - } // switch - - // append number value - result->appendCellsListToCellsList ( - numberValueAsCellsList ()); - - return result; -} - -int bsrNumber::fetchCellsNumber() const -{ - return fNumberCellsList->fetchCellsNumber(); -} - -void bsrNumber::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrNumber::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrNumber elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrNumber::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrNumber::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrNumber::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrNumber elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrNumber::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrNumber::browseData (basevisitor* v) -{} - -string bsrNumber::numberSignIsNeededKindAsString ( - bsrNumberSignIsNeededKind numberSignIsNeededKind) -{ - string result; - - switch (numberSignIsNeededKind) { - case bsrNumber::kNumberSignIsNeededYes: - result = "numberSignIsNeededYes"; - break; - case bsrNumber::kNumberSignIsNeededNo: - result = "numberSignIsNeededNo"; - break; - } // switch - - return result; -} - -string bsrNumber::asString () const -{ - stringstream s; - - s << - "Number" << - ", numberValue: " << fNumberValue << - ", numberSignIsNeeded: " << - numberSignIsNeededKindAsString ( - fNumberSignIsNeededKind) << - ", numberCellsList: " << - fNumberCellsList->asShortString () << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrNumber::print (ostream& os) const -{ - os << - "Number" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 21; - - os << - setw (fieldWidth) << - ", numberValue" << " : " << fNumberValue << - endl << - setw (fieldWidth) << - ", numberSignIsNeeded" << " : " << - numberSignIsNeededKindAsString ( - fNumberSignIsNeededKind) << - setw (fieldWidth) << - ", numberCellsList" << " : " << - fNumberCellsList->asShortString () << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrNumber& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrNumbers_MUT_DEP.h b/src/lilypond/bsrNumbers_MUT_DEP.h deleted file mode 100644 index 83957fa08..000000000 --- a/src/lilypond/bsrNumbers_MUT_DEP.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrNumber : public bsrLineElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrNumberSignIsNeededKind { - kNumberSignIsNeededYes, kNumberSignIsNeededNo}; - - static string numberSignIsNeededKindAsString ( - bsrNumberSignIsNeededKind numberSignIsNeededKind); - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int numberValue, - bsrNumberSignIsNeededKind - numberSignIsNeededKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrNumber ( - int inputLineNumber, - int numberValue, - bsrNumberSignIsNeededKind - numberSignIsNeededKind); - - virtual ~bsrNumber (); - - public: - - // set and get - // ------------------------------------------------------ - - int getNumberValue () const - { return fNumberValue; } - - void setNumberSignIsNeededKind ( - bsrNumberSignIsNeededKind - numberSignIsNeededKindvalue) - { - fNumberSignIsNeededKind = - numberSignIsNeededKindvalue; - } - - bsrNumberSignIsNeededKind - getNumberSignIsNeededKind () const - { return fNumberSignIsNeededKind; } - - S_bsrCellsList getNumberCellsList () const - { return fNumberCellsList; } - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fNumberCellsList; } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList numberValueAsCellsList () const; - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fNumberValue; - - bsrNumberSignIsNeededKind - fNumberSignIsNeededKind; - - S_bsrCellsList fNumberCellsList; -}; -typedef SMARTP S_bsrNumber; -EXP ostream& operator<< (ostream& os, const S_bsrNumber& elt); - diff --git a/src/lilypond/bsrOah.cpp b/src/lilypond/bsrOah.cpp deleted file mode 100644 index 237e85c04..000000000 --- a/src/lilypond/bsrOah.cpp +++ /dev/null @@ -1,1171 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // setw, setprecision, ... - -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -string bsrFacSimileKindAsString ( - bsrFacSimileKind facSimileKind) -{ - string result; - - switch (facSimileKind) { - case kFacSimileYes: - result = "facSimileYes"; - break; - case kFacSimileNo: - result = "facSimileNo"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -S_bsrFacSimileKindAtom bsrFacSimileKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrFacSimileKind bsrFacSimileKindVariable) -{ - bsrFacSimileKindAtom* o = new - bsrFacSimileKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - bsrFacSimileKindVariable); - assert(o!=0); - return o; -} - -bsrFacSimileKindAtom::bsrFacSimileKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrFacSimileKind bsrFacSimileKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fBsrFacSimileKindVariable ( - bsrFacSimileKindVariable) -{} - -bsrFacSimileKindAtom::~bsrFacSimileKindAtom () -{} - -void bsrFacSimileKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'bsrFacSimileKindAtom'" << - endl; - } -#endif - -} - -void bsrFacSimileKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrFacSimileKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrFacSimileKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching bsrFacSimileKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrFacSimileKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrFacSimileKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrFacSimileKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching bsrFacSimileKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrFacSimileKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrFacSimileKindAtom::browseData ()" << - endl; - } -#endif -} - -string bsrFacSimileKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - bsrFacSimileKindAsString (fBsrFacSimileKindVariable); - - return s.str (); -} - -string bsrFacSimileKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - bsrFacSimileKindAsString (fBsrFacSimileKindVariable); - - return s.str (); -} - -void bsrFacSimileKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsFacSimileKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "bsrFacSimileKindVariable" << " : \"" << - bsrFacSimileKindAsString ( - fBsrFacSimileKindVariable) << - "\"" << - endl; -} - -void bsrFacSimileKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - bsrFacSimileKindAsString ( - fBsrFacSimileKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrFacSimileKindAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrTextsLanguageAtom bsrTextsLanguageAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrTextsLanguageKind& - bsrTextsLanguageKindVariable) -{ - bsrTextsLanguageAtom* o = new - bsrTextsLanguageAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - bsrTextsLanguageKindVariable); - assert(o!=0); - return o; -} - -bsrTextsLanguageAtom::bsrTextsLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrTextsLanguageKind& - bsrTextsLanguageKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fBsrTextsLanguageKindVariable ( - bsrTextsLanguageKindVariable) -{} - -bsrTextsLanguageAtom::~bsrTextsLanguageAtom () -{} - -void bsrTextsLanguageAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'bsrTextsLanguageAtom'" << - endl; - } -#endif - -} - -void bsrTextsLanguageAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrTextsLanguageAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTextsLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching bsrTextsLanguageAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrTextsLanguageAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrTextsLanguageAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTextsLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching bsrTextsLanguageAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrTextsLanguageAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrTextsLanguageAtom::browseData ()" << - endl; - } -#endif -} - -string bsrTextsLanguageAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - bsrTextsLanguageKindAsString (fBsrTextsLanguageKindVariable); - - return s.str (); -} - -string bsrTextsLanguageAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - bsrTextsLanguageKindAsString (fBsrTextsLanguageKindVariable); - - return s.str (); -} - -void bsrTextsLanguageAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsBsrTextsLanguageAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fBsrTextsLanguageKindVariable" << " : \"" << - bsrTextsLanguageKindAsString ( - fBsrTextsLanguageKindVariable) << - "\"" << - endl; -} - -void bsrTextsLanguageAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - bsrTextsLanguageKindAsString ( - fBsrTextsLanguageKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrTextsLanguageAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_bsrOah gBsrOah; -S_bsrOah gBsrOahUserChoices; -S_bsrOah gBsrOahWithDetailedTrace; - -S_bsrOah bsrOah::create ( - S_oahHandler handlerUpLink) -{ - bsrOah* o = new bsrOah ( - handlerUpLink); - assert(o!=0); - return o; -} - -bsrOah::bsrOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "BSR", - "hbsr", "help-bsr", -R"(These bsr control the way BSR data is handled.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this bsr group to the bsr handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeBsrOah (false); -} - -bsrOah::~bsrOah () -{} - -void bsrOah::initializeBsrDisplayOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Display", - "hbsrd", "help-bsr-display", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // BSR - - fDisplayBsr = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dbsr", "display-bsr", -R"(Write the contents of the BSR data to standard error.)", - "displayBsr", - fDisplayBsr)); - - // BSR details - - fDisplayBsrDetails = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahTwoBooleansAtom::create ( - "dbsrd", "display-bsr-details", -R"(Write the contents of the BSR data with more details to standard error.)", - "displayBsrDetails", - fDisplayBsrDetails, - fDisplayBsr)); -} - -void bsrOah::initializeBsrLanguagesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Languages", - "hbsrl", "help-bsr-languages", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // texts language - - if (! setBsrTextsLanguage ("english")) { - stringstream s; - - s << - "INTERNAL INITIALIZATION ERROR: " - "BSR texts language 'english' is unknown" << - endl << - "The " << - gBsrTextsLanguageKindsMap.size () << - " known BSR texts languages are:" << - endl; - - gIndenter++; - - s << - existingBsrTextsLanguageKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - const bsrTextsLanguageKind - bsrTextsLanguageKindDefaultValue = - fBsrTextsLanguageKind; - - subGroup-> - appendAtomToSubGroup ( - bsrTextsLanguageAtom::create ( - "btl", "bsr-texts-language", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(Use LANGUAGE to transcribe texts in the BSR logs and views, -as well as in the generated braille music. -The NUMBER texts languages available are: -TEXT_LANGUAGES. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gBsrTextsLanguageKindsMap.size ())), - "TEXT_LANGUAGES", - existingBsrTextsLanguageKinds (K_NAMES_LIST_MAX_LENGTH)), - "DEFAULT_VALUE", - bsrTextsLanguageKindAsString ( - bsrTextsLanguageKindDefaultValue)), - "LANGUAGE", - "bsr-texts-language", - fBsrTextsLanguageKind)); -} - -void bsrOah::initializeBsrMiscellaneousOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Miscellaneous", - "hlpm", "help-miscellaneous", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // braille music headings - - fNoBrailleMusicHeadings = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nmh", "no-music-headings", -R"(Don't generate any music headings in the Braille code.)", - "noBrailleMusicHeadings", - fNoBrailleMusicHeadings)); - - // braille tempos - - fNoTempos = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nt", "no-tempos", -R"(Don't generate any tempos in the Braille code.)", - "noTempos", - fNoTempos)); - - // braille page numbers - - fNoPageNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "npn", "no-page-numbers", -R"(Don't generate any page numbers in the Braille code.)", - "noBraillePageNumbers", - fNoPageNumbers)); - - // braille line numbers - - fNoLineNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nln", "no-line-numbers", -R"(Don't generate any line numbers in the Braille code.)", - "noBrailleLineNumbers", - fNoLineNumbers)); - - // braille measure numbers - - fNoMeasureNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nmn", "no-measure-numbers", -R"(Don't generate any measure numbers in the Braille code.)", - "noMeasureNumbers", - fNoMeasureNumbers)); - - // braille lyrics - - fNoBrailleLyrics = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nl", "no-lyrics", -R"(Don't generate any lyrics in the Braille code.)", - "noBrailleLyrics", - fNoBrailleLyrics)); - - // braille compile date - - fBrailleCompileDate = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "lpcd", "braille-compile-date", -R"(Generate code to include the compilation date -when Braille creates the score.)", - "brailleCompileDate", - fBrailleCompileDate)); - - // facsimile - - fFacSimileKind = kFacSimileNo; - - subGroup-> - appendAtomToSubGroup ( - bsrFacSimileKindAtom::create ( - "fs", "facsimile", -R"(Generate facsimile Braille nusic code. -By default, non-facsimile code is generated.)", - "YES_OR_NO", - "facSimileKind", - fFacSimileKind)); - - // clefs - - fIncludeClefs = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "clefs", "", -R"(Include clefs in BSR. By default, they are not.)", - "includeClefs", - fIncludeClefs)); -} - -void bsrOah::initializeBsrExitAfterSomePassesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Exit after some passes", - "hbexit", "help-bsr-exit", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // '-exit-3a' is hidden... - - fExit3a = boolOptionsInitialValue; - - S_oahBooleanAtom - exit2aOahBooleanAtom = - oahBooleanAtom::create ( - "e3a", "exit-3a", -R"(Exit after pass 3a, i.e. after conversion -of the MSR to the first BSR score.)", - "exit3a", - fExit3a); - - subGroup-> - appendAtomToSubGroup ( - exit2aOahBooleanAtom); - - fExit3b = boolOptionsInitialValue; - - S_oahBooleanAtom - exit2bOahBooleanAtom = - oahBooleanAtom::create ( - "e3b", "exit-3b", -R"(Exit after pass 3b, i.e. after conversion -of the first BSR to the second BSR.)", - "exit3b", - fExit3b); - - subGroup-> - appendAtomToSubGroup ( - exit2bOahBooleanAtom); -} - -#ifdef TRACE_OAH -void bsrOah::initializeBsrTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Trace", - "hbst", "help-bsr-trace", -R"( Note: the options in this subgroup imply '-tbsr, -trace-bsr'.)", -// JMI kElementVisibilityHiddenByDefault, - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // BSR - - fTraceBsr = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tbsr", "trace-bsr", -R"(Write a trace of the BSR graphs visiting activity to standard error.)", - "traceBsr", - fTraceBsr)); - - // pages - - fTracePages = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahTwoBooleansAtom::create ( - "tpages", "trace-pages", -R"()", - "tracePages", - fTracePages, - gTraceOah->fTracePasses)); - - // lines - - fTraceLines = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tlines", "trace-lines", -R"()", - "traceLines", - fTraceLines)); - - // spaces - - fTraceSpaces = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tspaces", "trace-spaces", -R"(Write a trace of the BSR spaces activity to standard error.)", - "traceSpaces", - fTraceSpaces)); - - // numbers - - fTraceNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tnums", "trace-numbers", -R"(Write a trace of the BSR numbers activity to standard error.)", - "traceNumbers", - fTraceNumbers)); - - // parallels - - fTraceParallels = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahTwoBooleansAtom::create ( - "tpars", "trace-parallels", -R"()", - "traceParallels", - fTraceParallels, - gTraceOah->fTracePasses)); - - // BSR visitors - - fTraceBsrVisitors = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tbsrv", "trace-bsr-visitors", -R"(Write a trace of the BSR tree visiting activity to standard error.)", - "traceBsrVisitors", - fTraceBsrVisitors)); -} -#endif - -void bsrOah::initializeBsrOah ( - bool boolOptionsInitialValue) -{ - // display - // -------------------------------------- - initializeBsrDisplayOptions ( - boolOptionsInitialValue); - - // languages - // -------------------------------------- - initializeBsrLanguagesOptions ( - boolOptionsInitialValue); - - // miscellaneous - // -------------------------------------- - initializeBsrMiscellaneousOptions ( - boolOptionsInitialValue); - - // exit after some passes - // -------------------------------------- - initializeBsrExitAfterSomePassesOptions ( - boolOptionsInitialValue); - -#ifdef TRACE_OAH - // trace - // -------------------------------------- - initializeBsrTraceOah ( - boolOptionsInitialValue); -#endif -} - -S_bsrOah bsrOah::createCloneWithDetailedTrace () -{ - S_bsrOah - clone = - bsrOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the bsr handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - - // display - // -------------------------------------- - - clone->fDisplayBsr = - true; - clone->fDisplayBsrDetails = - true; - - - // miscellaneous - // -------------------------------------- - - - // exit after some passes - // -------------------------------------- - - - return clone; -} - -//______________________________________________________________________________ -bool bsrOah::setBsrTextsLanguage (string language) -{ - // is language in the chords languages map? - map::const_iterator - it = - gBsrTextsLanguageKindsMap.find (language); - - if (it == gBsrTextsLanguageKindsMap.end ()) { - // no, language is unknown in the map - return false; - } - - fBsrTextsLanguageKind = (*it).second; - - return true; -} - -//______________________________________________________________________________ -void bsrOah::enforceQuietness () -{ - fDisplayBsr = false; - fDisplayBsrDetails = false; -} - -//______________________________________________________________________________ -void bsrOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void bsrOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching bsrOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching bsrOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> bsrOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void bsrOah::printBsrOahValues (int fieldWidth) -{ - gLogOstream << - "The BSR bsr are:" << - endl; - - gIndenter++; - - // display - // -------------------------------------- - gLogOstream << - "Display:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "displayBsr" << " : " << - booleanAsString (fDisplayBsr) << - endl << - - setw (fieldWidth) << "displayBsrDetails" << " : " << - booleanAsString (fDisplayBsrDetails) << - endl; - - gIndenter--; - - // exit after some passes - // -------------------------------------- - - gLogOstream << - "Exit after some passes:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "exit3a" << " : " << - booleanAsString (fExit3a) << - endl << - setw (fieldWidth) << "exit3b" << " : " << - booleanAsString (fExit3b) << - endl; - - gIndenter--; - - // miscellaneous - // -------------------------------------- - - gLogOstream << - "Miscellaneous:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "noBrailleMusicHeadings" << " : " << - booleanAsString (fNoBrailleMusicHeadings) << - endl << - - setw (fieldWidth) << "noTempos" << " : " << - booleanAsString (fNoTempos) << - endl << - - setw (fieldWidth) << "noBraillePageNumbers" << " : " << - booleanAsString (fNoPageNumbers) << - endl << - setw (fieldWidth) << "noBrailleLineNumbers" << " : " << - booleanAsString (fNoLineNumbers) << - endl << - setw (fieldWidth) << "noMeasureNumbers" << " : " << - booleanAsString (fNoMeasureNumbers) << - endl << - - setw (fieldWidth) << "noBrailleLyrics" << " : " << - booleanAsString (fNoBrailleLyrics) << - endl << - - setw (fieldWidth) << "brailleCompileDate" << " : " << - booleanAsString (fBrailleCompileDate) << - endl << - - setw (fieldWidth) << "facSimileKind" << " : " << - booleanAsString (fFacSimileKind) << - endl << - - setw (fieldWidth) << "includeClefs" << " : " << - booleanAsString (fIncludeClefs) << - endl; - - gIndenter--; - - // trace - // -------------------------------------- - -#ifdef TRACE_OAH - gLogOstream << - "Trace:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "traceBsr" << " : " << - booleanAsString (fTraceBsr) << - endl << - setw (fieldWidth) << "tracePages" << " : " << - booleanAsString (fTracePages) << - endl << - setw (fieldWidth) << "traceLines" << " : " << - booleanAsString (fTraceLines) << - endl << - setw (fieldWidth) << "traceSpaces" << " : " << - booleanAsString (fTraceSpaces) << - endl << - setw (fieldWidth) << "traceNumbers" << " : " << - booleanAsString (fTraceNumbers) << - endl << - setw (fieldWidth) << "traceParallels" << " : " << - booleanAsString (fTraceParallels) << - endl << - setw (fieldWidth) << "traceBsrVisitors" << " : " << - booleanAsString (fTraceBsrVisitors) << - endl; - - gIndenter--; -#endif - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeBsrOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing BSR bsr handling" << - endl; - } -#endif - - // create the bsr variables - // ------------------------------------------------------ - - gBsrOahUserChoices = bsrOah::create ( - handler); - assert(gBsrOahUserChoices != 0); - - gBsrOah = - gBsrOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ -/* JMI - gBsrOahWithDetailedTrace = - gBsrOah-> - createCloneWithDetailedTrace (); - */ -} - - -} diff --git a/src/lilypond/bsrOah.h b/src/lilypond/bsrOah.h deleted file mode 100644 index 4a0e8db4c..000000000 --- a/src/lilypond/bsrOah.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrOah___ -#define ___bsrOah___ - -#include "exports.h" - -#include "bsrBasicTypes.h" - -#include "oahBasicTypes.h" - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -enum bsrFacSimileKind { - kFacSimileYes, kFacSimileNo }; - -string bsrFacSimileKindAsString ( - bsrFacSimileKind facSimileKind); - -//______________________________________________________________________________ -class bsrFacSimileKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrFacSimileKind bsrFacSimileKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrFacSimileKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrFacSimileKind bsrFacSimileKindVariable); - - virtual ~bsrFacSimileKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setOptionsFacSimileKindVariable ( - bsrFacSimileKind value) - { fBsrFacSimileKindVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrFacSimileKind fBsrFacSimileKindVariable; -}; -typedef SMARTP S_bsrFacSimileKindAtom; -EXP ostream& operator<< (ostream& os, const S_bsrFacSimileKindAtom& elt); - -//______________________________________________________________________________ -class bsrTextsLanguageAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrTextsLanguageKind& - bsrTextsLanguageKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrTextsLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - bsrTextsLanguageKind& - bsrTextsLanguageKindVariable); - - virtual ~bsrTextsLanguageAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setBsrTextsLanguageKindVariable ( - bsrTextsLanguageKind value) - { - fBsrTextsLanguageKindVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrTextsLanguageKind& fBsrTextsLanguageKindVariable; -}; -typedef SMARTP S_bsrTextsLanguageAtom; -EXP ostream& operator<< (ostream& os, const S_bsrTextsLanguageAtom& elt); - -//______________________________________________________________________________ -class bsrOah : public oahGroup -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithDetailedTrace (); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeBsrOah ( - bool boolOptionsInitialValue); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - bsrOah ( - S_oahHandler handlerUpLink); - - virtual ~bsrOah (); - - public: - - // set and get - // ------------------------------------------------------ - - bool setBsrTextsLanguage ( - string language); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - void initializeBsrDisplayOptions ( - bool boolOptionsInitialValue); - - void initializeBsrLanguagesOptions ( - bool boolOptionsInitialValue); - - - void initializeBsrMiscellaneousOptions ( - bool boolOptionsInitialValue); - - - void initializeBsrExitAfterSomePassesOptions ( - bool boolOptionsInitialValue); - -#ifdef TRACE_OAH - void initializeBsrTraceOah ( - bool boolOptionsInitialValue); -#endif - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printBsrOahHelp (); - - void printBsrOahValues (int fieldWidth); - - public: - - // display - // -------------------------------------- - - bool fDisplayBsr; - bool fDisplayBsrDetails; - - // languages - // -------------------------------------- - - bsrTextsLanguageKind fBsrTextsLanguageKind; - - // miscellaneous - // -------------------------------------- - - bool fNoBrailleMusicHeadings; - - bool fNoTempos; - - bool fNoPageNumbers; - bool fNoLineNumbers; - bool fNoMeasureNumbers; - - bool fNoBrailleLyrics; - - bool fBrailleCompileDate; - - bsrFacSimileKind fFacSimileKind; - - bool fIncludeClefs; - - // exit after some passes - // -------------------------------------- - - bool fExit3a; - bool fExit3b; - - // trace - // -------------------------------------- - -#ifdef TRACE_OAH - // BSR - bool fTraceBsr; - - // pages & lines - bool fTracePages; - - bool fTraceLines; - - bool fTraceSpaces; - bool fTraceNumbers; - - // parallels - bool fTraceParallels; - - // visitors - bool fTraceBsrVisitors; -#endif -}; -typedef SMARTP S_bsrOah; -EXP ostream& operator<< (ostream& os, const S_bsrOah& elt); - -EXP extern S_bsrOah gBsrOah; -EXP extern S_bsrOah gBsrOahUserChoices; -EXP extern S_bsrOah gBsrOahWithDetailedTrace; - -//______________________________________________________________________________ -EXP void initializeBsrOahHandling ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/bsrOah2ManPageGenerator.cpp b/src/lilypond/bsrOah2ManPageGenerator.cpp deleted file mode 100644 index e9053293f..000000000 --- a/src/lilypond/bsrOah2ManPageGenerator.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "bsrOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -bsrOah2ManPageGenerator::bsrOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -bsrOah2ManPageGenerator::~bsrOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void bsrOah2ManPageGenerator::visitStart (S_bsrFacSimileKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting bsrFacSimileKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; -} - -void bsrOah2ManPageGenerator::visitEnd (S_bsrFacSimileKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting bsrFacSimileKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void bsrOah2ManPageGenerator::visitStart (S_bsrTextsLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting bsrTextsLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif - - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; -} - -void bsrOah2ManPageGenerator::visitEnd (S_bsrTextsLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting bsrTextsLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/bsrOah2ManPageGenerator.h b/src/lilypond/bsrOah2ManPageGenerator.h deleted file mode 100644 index 268425338..000000000 --- a/src/lilypond/bsrOah2ManPageGenerator.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrOah2ManPageGenerator___ -#define ___bsrOah2ManPageGenerator___ - -#include "bsrOah.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class bsrOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor, - - public visitor - -{ - public: - - bsrOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~bsrOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_bsrFacSimileKindAtom& elt); - virtual void visitEnd (S_bsrFacSimileKindAtom& elt); - - virtual void visitStart (S_bsrTextsLanguageAtom& elt); - virtual void visitEnd (S_bsrTextsLanguageAtom& elt); -}; -typedef SMARTP S_bsrOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/bsrPageElements.cpp b/src/lilypond/bsrPageElements.cpp deleted file mode 100644 index 70807e7ea..000000000 --- a/src/lilypond/bsrPageElements.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrMutualDependencies.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -/* -S_bsrPageElement bsrPageElement::create ( - int inputLineNumber) -{ - bsrPageElement* o = - new bsrPageElement ( - inputLineNumber); - assert(o!=0); - return o; -} -*/ - -bsrPageElement::bsrPageElement ( - int inputLineNumber) - : bsrElement (inputLineNumber) -{ - fSpacesBefore = 0; -// fSpacesAfter = 0; -} - -bsrPageElement::~bsrPageElement () -{} - -/* -void bsrPageElement::setBsrLineUpLink ( -S_bsrLine bsrLineUpLink) -{ - fBsrLineUpLink = bsrLineUpLink; -} - -S_bsrLine bsrPageElement::getBsrLineUpLink () const -{ - return fBsrLineUpLink; -} -*/ - -void bsrPageElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPageElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPageElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPageElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrPageElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPageElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPageElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPageElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrPageElement::browseData (basevisitor* v) -{} - - -string bsrPageElement::asString () const -{ - // this is overriden all in actual elements - return "??? bsrPageElement::asString () ???"; -} - -string bsrPageElement::asShortString () const -{ - // this can be overriden in actual elements - return asString (); -} - -void bsrPageElement::print (ostream& os) const -{ - os << asString () << endl; -} - -ostream& operator<< (ostream& os, const S_bsrPageElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrPageElements_MUT_DEP.h b/src/lilypond/bsrPageElements_MUT_DEP.h deleted file mode 100644 index fc533e2b3..000000000 --- a/src/lilypond/bsrPageElements_MUT_DEP.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrPageElement : public bsrElement -{ - public: - - // creation - // ------------------------------------------------------ - -/* - static SMARTP create ( - int inputLineNumber); -*/ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrPageElement ( - int inputLineNumber); - - virtual ~bsrPageElement (); - - public: - - // set and get - // ------------------------------------------------------ - - void setBsrPageUpLink ( - S_bsrPage bsrPageUpLink); - - S_bsrPage getBsrPageUpLink () const; - - void setSpacesBefore (int value) - { fSpacesBefore = value; } - - int getSpacesBefore () const - { return fSpacesBefore; } - -/* - int getSpacesAfter () const - { return fSpacesAfter; } -*/ - - public: - - // services - // ------------------------------------------------------ - - virtual int fetchLineContentsNumber () const // JMI ??? - { return 0; } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asString () const; - - virtual std::string asShortString () const; - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - S_bsrPage fBsrPageUpLink; - - int fSpacesBefore; - // JMI int fSpacesAfter; -}; -typedef SMARTP S_bsrPageElement; -EXP ostream& operator<< (ostream& os, const S_bsrPageElement& elt); - diff --git a/src/lilypond/bsrPageHeadings.cpp b/src/lilypond/bsrPageHeadings.cpp deleted file mode 100644 index 2a5c374af..000000000 --- a/src/lilypond/bsrPageHeadings.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrMutualDependencies.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrPageHeading bsrPageHeading::create ( - int inputLineNumber, - string pageHeadingTitle, - S_bsrPagination pageHeadingPagination, - int pageHeadingNumber) -{ - bsrPageHeading* o = - new bsrPageHeading ( - inputLineNumber, - pageHeadingTitle, pageHeadingPagination, pageHeadingNumber); - assert(o!=0); - return o; -} - -bsrPageHeading::bsrPageHeading ( - int inputLineNumber, - string pageHeadingTitle, - S_bsrPagination pageHeadingPagination, - int pageHeadingNumber) - : bsrLine ( - inputLineNumber, - 0, // JMI ??? - gBrailleOah->fCellsPerLine) -{ - fPageHeadingTitle = pageHeadingTitle; - - fPageHeadingPagination = pageHeadingPagination; - fPageHeadingNumber = pageHeadingNumber; -} - -bsrPageHeading::~bsrPageHeading () -{} - -S_bsrCellsList bsrPageHeading::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - // append the pagination to result - result->appendCellsListToCellsList ( - fPageHeadingPagination->fetchCellsList ()); - - // append 3 spaces to result - result->appendCellsListToCellsList ( - bsrSpaces::create ( - fInputLineNumber, 3)-> - fetchCellsList ()); - - // append the title to result - result->appendCellsListToCellsList ( - bsrWords::create ( - fInputLineNumber, fPageHeadingTitle)-> - fetchCellsList ()); - - // append 3 spaces to result - result->appendCellsListToCellsList ( - bsrSpaces::create ( - fInputLineNumber, 3)-> - fetchCellsList ()); - - // append the number to result - result->appendCellsListToCellsList ( - bsrNumber::create ( - fInputLineNumber, - fPageHeadingNumber, - bsrNumber::kNumberSignIsNeededYes)-> - fetchCellsList ()); - - // append 1 space to result - result->appendCellsListToCellsList ( - bsrSpaces::create ( - fInputLineNumber, 1)-> - fetchCellsList ()); - - return result; -} - -void bsrPageHeading::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPageHeading::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPageHeading elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPageHeading::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrPageHeading::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPageHeading::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPageHeading elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPageHeading::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrPageHeading::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrScore::browseData ()" << - endl; - } -#endif - - if (fPageHeadingPagination) { - // browse the pagination - msrBrowser browser (v); - browser.browse (*fPageHeadingPagination); - } - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% <== bsrScore::browseData ()" << - endl; - } -#endif -} - -string bsrPageHeading::asString () const -{ - stringstream s; - - s << - "PageHeading" << - ", pageHeadingTitle: \"" << fPageHeadingTitle << "\"" << - ", pageHeadingPagination: "; - - if (fPageHeadingPagination) { - s << - fPageHeadingPagination->asShortString (); - } - else { - s << - "none"; - } - - s << - ", pageHeadingNumber: " << fPageHeadingNumber << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrPageHeading::print (ostream& os) const -{ - os << - "PageHeading" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - setw (fieldWidth) << - "pageHeadingTitle" << " : \"" << fPageHeadingTitle << "\"" << - endl << - setw (fieldWidth) << - "pageHeadingPagination" << - endl; - - if (fPageHeadingPagination) { - gIndenter++; - - os << - fPageHeadingPagination; - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - - os << left << - setw (fieldWidth) << - "pageHeadingNumber" << " : " << fPageHeadingNumber << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrPageHeading& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrPageHeadings_MUT_DEP.h b/src/lilypond/bsrPageHeadings_MUT_DEP.h deleted file mode 100644 index 7e8b2563b..000000000 --- a/src/lilypond/bsrPageHeadings_MUT_DEP.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrPageHeading : public bsrLine -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string pageHeadingTitle, - S_bsrPagination pageHeadingPagination, - int pageHeadingNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrPageHeading ( - int inputLineNumber, - string pageHeadingTitle, - S_bsrPagination pageHeadingPagination, - int pageHeadingNumber); - - virtual ~bsrPageHeading (); - - public: - - // set and get - // ------------------------------------------------------ - - string getPageHeadingTitle () const - { return fPageHeadingTitle; } - - S_bsrPagination getPageHeadingPagination () const - { return fPageHeadingPagination; } - - int getPageHeadingNumber () const - { return fPageHeadingNumber; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return buildCellsList (); } - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fPageHeadingTitle; - - S_bsrPagination fPageHeadingPagination; // before title - int fPageHeadingNumber; // after title ??? JMI -}; -typedef SMARTP S_bsrPageHeading; -EXP ostream& operator<< (ostream& os, const S_bsrPageHeading& elt); - diff --git a/src/lilypond/bsrPages.cpp b/src/lilypond/bsrPages.cpp deleted file mode 100644 index 00b97e350..000000000 --- a/src/lilypond/bsrPages.cpp +++ /dev/null @@ -1,255 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrMutualDependencies.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrPage bsrPage::create ( - int inputLineNumber, - int printPageNumber, - int linesPerPage) -{ - bsrPage* o = - new bsrPage ( - inputLineNumber, printPageNumber, linesPerPage); - assert(o!=0); - return o; -} - -bsrPage::bsrPage ( - int inputLineNumber, - int printPageNumber, - int linesPerPage) - : bsrElement (inputLineNumber) -{ - fPrintPageNumber = printPageNumber; - fBraillePageNumber = fPrintPageNumber; // this will be set by BSR finalizer - - fLinesPerPage = linesPerPage; - -#ifdef TRACE_OAH - if (gBsrOah->fTracePages) { - gLogOstream << - "Creating bsrPage '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -bsrPage::~bsrPage () -{} - -S_bsrPage bsrPage::createPageNewbornClone () -{ -#ifdef TRACE_OAH - if (gBsrOah->fTracePages) { - gLogOstream << - "Creating a newborn clone of page " << - asString () << - endl; - } -#endif - - S_bsrPage - newbornClone = - bsrPage::create ( - fInputLineNumber, - fPrintPageNumber, - fLinesPerPage); - - // braille line number - newbornClone->fBraillePageNumber = - fBraillePageNumber; - - return newbornClone; -} - -int bsrPage::fetchLineContentsNumber () const -{ - int result = 0; - - for ( - list::const_iterator i = fPageElementsList.begin (); - i != fPageElementsList.end (); - i++ - ) { - result += (*i)->fetchLineContentsNumber (); - } // for - - return result; -} - -void bsrPage::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPage::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPage elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPage::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrPage::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPage::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPage elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPage::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrPage::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fPageElementsList.begin (); - i != fPageElementsList.end (); - i++ ) { - // browse the element - bsrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string bsrPage::asString () const -{ - stringstream s; - - s << - "Page" << - ", printPageNumber" << " : " << fPrintPageNumber << - ", braillePageNumber" << " : " << fBraillePageNumber << - ", linesPerPage" << " : " << fLinesPerPage << - ", elements: " << fPageElementsList.size () << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrPage::print (ostream& os) const -{ - os << - "Page" << - ", printPageNumber: " << fPrintPageNumber << - ", lineContentsNumber: " << fetchLineContentsNumber () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - // print the page numbers - const int fieldWidth = 18; - - os << left << - /* JMI - setw (fieldWidth) << - "printPageNumber" << " : " << fPrintPageNumber << - endl << - */ - setw (fieldWidth) << - "braillePageNumber" << " : " << fBraillePageNumber << - endl << - setw (fieldWidth) << - "linesPerPage" << " : " << fLinesPerPage << - endl; - os << endl; - - // print the page elements if any - int pageElementsListSize = fPageElementsList.size (); - - if (pageElementsListSize || gBsrOah->fDisplayBsrDetails) { - os << -// setw (fieldWidth) << - "PageElementsList" << - ", " << - singularOrPlural ( - pageElementsListSize, "pageElement", "pageElements"); - if (pageElementsListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fPageElementsList.begin (), - iEnd = fPageElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrPage& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrPages_MUT_DEP.h b/src/lilypond/bsrPages_MUT_DEP.h deleted file mode 100644 index 815062462..000000000 --- a/src/lilypond/bsrPages_MUT_DEP.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrPage : public bsrElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int printPageNumber, - int linesPerPage); - - SMARTP createPageNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrPage ( - int inputLineNumber, - int printPageNumber, - int linesPerPage); - - virtual ~bsrPage (); - - public: - - // set and get - // ------------------------------------------------------ - - int getPrintPageNumber () const - { return fPrintPageNumber; } - - int getBraillePageNumber () const - { return fBraillePageNumber; } - - int getLinesPerPage () const - { return fLinesPerPage; } - - public: - - // public services - // ------------------------------------------------------ - - void appendPageHeadingToPage (S_bsrPageHeading pageHeading) - { fPageElementsList.push_back (pageHeading); } - - void appendMusicHeadingToPage (S_bsrMusicHeading musicHeading) - { fPageElementsList.push_back (musicHeading); } - - void appendFootNotesToPage (S_bsrFootNotes footNotes) - { fPageElementsList.push_back (footNotes); } - - void appendLineToPage (S_bsrLine line) - { fPageElementsList.push_back (line); } - - int fetchLineContentsNumber () const; - - public: - - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fPrintPageNumber; - int fBraillePageNumber; - - int fLinesPerPage; - - list - fPageElementsList; -}; -typedef SMARTP S_bsrPage; -EXP ostream& operator<< (ostream& os, const S_bsrPage& elt); - diff --git a/src/lilypond/bsrPaginations.cpp b/src/lilypond/bsrPaginations.cpp deleted file mode 100644 index d50e15dbb..000000000 --- a/src/lilypond/bsrPaginations.cpp +++ /dev/null @@ -1,205 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrPagination bsrPagination::create ( - int inputLineNumber, - int printPageNumber, - int braillePageNumber) -{ - bsrPagination* o = - new bsrPagination ( - inputLineNumber, printPageNumber, braillePageNumber); - assert (o!=0); - return o; -} - -bsrPagination::bsrPagination ( - int inputLineNumber, - int printPageNumber, - int braillePageNumber) - : bsrLineElement (inputLineNumber) -{ - fPrintPageNumber = printPageNumber; - fBraillePageNumber = braillePageNumber; - - fPaginationCellsList = buildCellsList (); -} - -bsrPagination::~bsrPagination () -{} - -S_bsrCellsList bsrPagination::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - // create the pagination sign - S_bsrCellsList - paginationSign = - bsrCellsList::create ( - fInputLineNumber, - kDots5, kDots25 ); - - // append it to result - result->appendCellsListToCellsList ( - paginationSign); - - // create the print page number - S_bsrNumber - printPageNumber = - bsrNumber::create ( - fInputLineNumber, - fPrintPageNumber, - bsrNumber::kNumberSignIsNeededYes); - - // append it to result - result->appendCellsListToCellsList ( - printPageNumber->fetchCellsList ()); - - // create the braille page number - S_bsrNumber - braillePageNumber = - bsrNumber::create ( - fInputLineNumber, - fPrintPageNumber, - bsrNumber::kNumberSignIsNeededYes); - - // append it to result - result->appendCellsListToCellsList ( - braillePageNumber->fetchCellsList ()); - return result; -} - -int bsrPagination::fetchCellsNumber () const -{ - return fPaginationCellsList->fetchCellsNumber (); -} - -void bsrPagination::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPagination::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPagination elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPagination::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrPagination::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrPagination::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrPagination elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrPagination::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrPagination::browseData (basevisitor* v) -{} - -string bsrPagination::asString () const -{ - stringstream s; - - s << - "Pagination" << - ", printPageNumber: " << fPrintPageNumber << - ", braillePageNumber: " << fBraillePageNumber << - ", spacesCellsList: " << fPaginationCellsList << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrPagination::print (ostream& os) const -{ - os << - "Pagination" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 18; - - os << - setw (fieldWidth) << - "printPageNumber" << " : " << fPrintPageNumber << - endl << - setw (fieldWidth) << - "braillePageNumber" << " : " << fBraillePageNumber << - endl << - setw (fieldWidth) << - "paginationCellsList" << " : " << fPaginationCellsList << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrPagination& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrPaginations_MUT_DEP.h b/src/lilypond/bsrPaginations_MUT_DEP.h deleted file mode 100644 index 8bbddfa69..000000000 --- a/src/lilypond/bsrPaginations_MUT_DEP.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrPagination : public bsrLineElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int printPageNumber, - int braillePageNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrPagination ( - int inputLineNumber, - int printPageNumber, - int braillePageNumber); - - virtual ~bsrPagination (); - - public: - - // set and get - // ------------------------------------------------------ - - int getPrintPageNumber () const - { return fPrintPageNumber; } - - int getBraillePageNumber () const - { return fBraillePageNumber; } - - S_bsrCellsList fetchCellsList () const - { return fPaginationCellsList; } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fPrintPageNumber; - int fBraillePageNumber; - - S_bsrCellsList fPaginationCellsList; -}; -typedef SMARTP S_bsrPagination; -EXP ostream& operator<< (ostream& os, const S_bsrPagination& elt); - diff --git a/src/lilypond/bsrParallels.cpp b/src/lilypond/bsrParallels.cpp deleted file mode 100644 index 9d27feeb7..000000000 --- a/src/lilypond/bsrParallels.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "bsrParallels.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrParallel bsrParallel::create ( - int inputLineNumber) -{ - bsrParallel* o = - new bsrParallel ( - inputLineNumber); - assert(o!=0); - return o; -} - -bsrParallel::bsrParallel ( - int inputLineNumber) - : bsrElement (inputLineNumber) -{ -} - -bsrParallel::~bsrParallel () -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceParallels) { - gLogOstream << - "Creating bsrParallel '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -void bsrParallel::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrParallel::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrParallel elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrParallel::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrParallel::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrParallel::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrParallel elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrParallel::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrParallel::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fParallelElementsList.begin (); - i != fParallelElementsList.end (); - i++ ) { - // browse the element - bsrBrowser browser (v); - browser.browse (*(*i)); - } // for - -} - -string bsrParallel::parallelLayoutKindAsString ( - bsrParallelLayoutKind parallelLayoutKind) -{ - string result; - - switch (parallelLayoutKind) { - case bsrParallel::kParallelLayoutBarOverBarKind: - result = "parallelLayoutBarOverBarKind"; - break; - case bsrParallel::kParallelLayoutLineOverLineKind: - result = "parallelLayoutLineOverLineKind"; - break; - } // switch - - return result; -} - -void bsrParallel::print (ostream& os) const -{ - os << - "Parallel" << - endl; - - gIndenter++; - - // print the parallel numbers - const int fieldWidth = 18; - - os << left << - setw (fieldWidth) << - "printParallelNumber" << " : " << fPrintParallelNumber << - endl << - setw (fieldWidth) << - "brailleParallelNumber" << " : " << fBrailleParallelNumber << - endl; - - // print the parallel elements if any - int parallelElementsListSize = fParallelElementsList.size (); - - if (parallelElementsListSize || gBsrOah->fDisplayBsrDetails) { - os << - setw (fieldWidth) << - "fParallelElementsList"; - if (parallelElementsListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fParallelElementsList.begin (), - iEnd = fParallelElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - os << endl; - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrParallel& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrParallels.h b/src/lilypond/bsrParallels.h deleted file mode 100644 index 36d482b45..000000000 --- a/src/lilypond/bsrParallels.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrParallels___ -#define ___bsrParallels___ - -#include "bsrMutualDependencies.h" - -#include "bsrOah.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class bsrParallel : public bsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrParallelLayoutKind { - kParallelLayoutBarOverBarKind, - kParallelLayoutLineOverLineKind }; - - static string parallelLayoutKindAsString ( - bsrParallelLayoutKind parallelLayoutKind); - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrParallel ( - int inputLineNumber); - - virtual ~bsrParallel (); - - public: - - // set and get - // ------------------------------------------------------ - - int getPrintParallelNumber () const - { return fPrintParallelNumber; } - - int getBrailleParallelNumber () const - { return fBrailleParallelNumber; } - - public: - - // public services - // ------------------------------------------------------ - - void appendLineToParallel (S_bsrLine line) - { fParallelElementsList.push_back (line); } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fPrintParallelNumber; - int fBrailleParallelNumber; - - list - fParallelElementsList; -}; -typedef SMARTP S_bsrParallel; -EXP ostream& operator<< (ostream& os, const S_bsrParallel& elt); - - -} - - -#endif diff --git a/src/lilypond/bsrScores.cpp b/src/lilypond/bsrScores.cpp deleted file mode 100644 index c5c5b787c..000000000 --- a/src/lilypond/bsrScores.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX -#include // for 'setw()' - -#include "bsrMutualDependencies.h" - -#include "bsrScores.h" - -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrScore bsrScore::create ( - int inputLineNumber, - S_msrScore mScore) -{ - bsrScore* o = new bsrScore ( - inputLineNumber, mScore); - assert(o!=0); - return o; -} - -bsrScore::bsrScore ( - int inputLineNumber, - S_msrScore mScore) - : bsrElement (inputLineNumber) -{ - fMsrScore = mScore; - - // create a transcription note - fTranscriptionNotes = - bsrTranscriptionNotes::create ( - inputLineNumber); - - fBrailleLineLength = gBrailleOah->fCellsPerLine; - fBraillePageLength = gBrailleOah->fLinesPerPage; -} - -bsrScore::~bsrScore () -{} - -void bsrScore::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrScore::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrScore elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrScore::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrScore::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrScore::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrScore elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrScore::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrScore::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrScore::browseData ()" << - endl; - } -#endif - - if (fTranscriptionNotes) { - // browse the transcription notes - msrBrowser browser (v); - browser.browse (*fTranscriptionNotes); - } - - for ( - list::const_iterator i = - fScorePagesList.begin (); - i != fScorePagesList.end (); - i++ - ) { - // browse the page - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% <== bsrScore::browseData ()" << - endl; - } -#endif -} - -void bsrScore::print (ostream& os) const -{ - os << - "BSR Score" << - endl << - endl; - - gIndenter++; - - // print the MSR structure (without the voices) - fMsrScore-> - printSummary (os); - os << endl; - - // print the transcription notes if any - const int fieldWidth = 19; - - if (fTranscriptionNotes || gBsrOah->fDisplayBsrDetails) { - if (fTranscriptionNotes) { - os << - fTranscriptionNotes; - } - else { - os << - "TranscriptionNotes: none" << - endl; - } - } - -/* - // print the lines and pages maximum lengthes JMI - os << - setw (fieldWidth) << - "BrailleLineLength" << " : " << fBrailleLineLength << - endl << - setw (fieldWidth) << - "BraillePageLength" << " : " << fBraillePageLength << - endl; - os << endl; - */ - - // print the score pages if any - int scorePagesListSize = fScorePagesList.size (); - - if (scorePagesListSize || gBsrOah->fDisplayBsrDetails) { - os << - setw (fieldWidth) << - "ScorePagesList"; - - if (scorePagesListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fScorePagesList.begin (), - iEnd = fScorePagesList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - else { - os << - " : " << - "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrScore& score) -{ - score->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrScores.h b/src/lilypond/bsrScores.h deleted file mode 100644 index 480b84510..000000000 --- a/src/lilypond/bsrScores.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrScores___ -#define ___bsrScores___ - -#include -#include -#include - -#include "msrScores.h" - -#include "bsrTranscriptionNotes.h" - -#include "bsrOah.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class bsrScore : public bsrElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrScore mScore); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrScore ( - int inputLineNumber, - S_msrScore mScore); - - virtual ~bsrScore (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrScore getMsrScore () const - { return fMsrScore; } - - S_bsrTranscriptionNotes - getTranscriptionNotes () const - { return fTranscriptionNotes; } - - int getBrailleLineLength () const - { return fBrailleLineLength; } - - int getBraillePageLength () const - { return fBraillePageLength; } - - public: - - // public services - // ------------------------------------------------------ - - void appendPageToScore (S_bsrPage page) - { fScorePagesList.push_back (page); } - - void appendTranscriptionNotesElementToScore ( // JMI - S_bsrTranscriptionNotesElement - transcriptionNotesElement) - { - fTranscriptionNotes-> - appendElementToTranscriptionNotes ( - transcriptionNotesElement); - } - - private: - - // private services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // MSR data - S_msrScore fMsrScore; - - S_bsrTranscriptionNotes - fTranscriptionNotes; - - int fBrailleLineLength; // cells JMI ??? - int fBraillePageLength; - - list fScorePagesList; -}; -typedef SMARTP S_bsrScore; -EXP ostream& operator<< (ostream& os, const S_bsrScore& score); - - -} - - -#endif diff --git a/src/lilypond/bsrSpaces.cpp b/src/lilypond/bsrSpaces.cpp deleted file mode 100644 index 6e7b8ebd3..000000000 --- a/src/lilypond/bsrSpaces.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrSpaces bsrSpaces::create ( - int inputLineNumber, - int numberOfSpaces) -{ - bsrSpaces* o = - new bsrSpaces ( - inputLineNumber, numberOfSpaces); - assert (o!=0); - return o; -} - -bsrSpaces::bsrSpaces ( - int inputLineNumber, - int numberOfSpaces) - : bsrLineElement (inputLineNumber) -{ - fNumberOfSpaces = numberOfSpaces; - - fSpacesCellsList = - bsrCellsList::create (inputLineNumber); - - for (int i = 1; i <= fNumberOfSpaces; i++) { - fSpacesCellsList-> - appendCellKindToCellsList (kCellSpace); - } // for -} - -bsrSpaces::~bsrSpaces () -{} - -void bsrSpaces::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrSpaces::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrSpaces elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrSpaces::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -int bsrSpaces::fetchCellsNumber () const -{ - return fNumberOfSpaces; -} - -void bsrSpaces::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrSpaces::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrSpaces elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrSpaces::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrSpaces::browseData (basevisitor* v) -{} - -string bsrSpaces::asString () const -{ - stringstream s; - - s << - "Spaces" << - ", numberOfSpaces: " << fNumberOfSpaces << - ", spacesCellsList: " << fSpacesCellsList << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrSpaces::print (ostream& os) const -{ - os << - "Spaces" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - os << - setw (fieldWidth) << - "numberOfSpaces" << " : " << fNumberOfSpaces << - endl << - setw (fieldWidth) << - "spacesCellsList" << " : " << fSpacesCellsList << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrSpaces& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrSpaces_MUT_DEP.h b/src/lilypond/bsrSpaces_MUT_DEP.h deleted file mode 100644 index e89487133..000000000 --- a/src/lilypond/bsrSpaces_MUT_DEP.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -const bsrCellKind - kCellSpace = kDotsNone; - -//______________________________________________________________________________ -class bsrSpaces : public bsrLineElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int numberOfSpaces); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrSpaces ( - int inputLineNumber, - int numberOfSpaces); - - virtual ~bsrSpaces (); - - public: - - // set and get - // ------------------------------------------------------ - - int getNumberOfSpaces () const - { return fNumberOfSpaces; } - - // services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fSpacesCellsList; } - - int fetchCellsNumber () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fNumberOfSpaces; - - S_bsrCellsList fSpacesCellsList; -}; -typedef SMARTP S_bsrSpaces; -EXP ostream& operator<< (ostream& os, const S_bsrSpaces& elt); - diff --git a/src/lilypond/bsrTempos.cpp b/src/lilypond/bsrTempos.cpp deleted file mode 100644 index b694b909b..000000000 --- a/src/lilypond/bsrTempos.cpp +++ /dev/null @@ -1,457 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrTempo bsrTempo::create ( - int inputLineNumber, - S_msrTempo mTempo) -{ - bsrTempo* o = - new bsrTempo ( - inputLineNumber, mTempo); - assert (o!=0); - return o; -} - -bsrTempo::bsrTempo ( - int inputLineNumber, - S_msrTempo mTempo) - : bsrLineElement (inputLineNumber) -{ - fMsrTempo = mTempo; - - fTempoCellsList = buildCellsList (); -} - -bsrTempo::~bsrTempo () -{} - -S_bsrCellsList bsrTempo::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create ( - fInputLineNumber, kCellWordSign); - - if (! gBsrOah->fNoTempos) { - switch (fMsrTempo->getTempoKind ()) { - case msrTempo::k_NoTempoKind: - break; - - case msrTempo::kTempoBeatUnitsWordsOnly: - break; - - case msrTempo::kTempoBeatUnitsPerMinute: - { - // fetch MSR tempo attributes - const list& - tempoWordsList = - fMsrTempo->getTempoWordsList (); - - msrDottedDuration - tempoDottedDuration = - fMsrTempo->getTempoBeatUnit (); - - // handle tempo words - int tempoWordsListSize = tempoWordsList.size (); - - if (tempoWordsListSize) { - list::const_iterator - iBegin = tempoWordsList.begin (), - iEnd = tempoWordsList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrWords words = (*i); - - // fLilypondCodeOstream << - // "\"" << words->getWordsContents () << "\""; - - if (++i == iEnd) break; - - // fLilypondCodeOstream << - // " "; - } // for - } - - // handle tempo duration and continuation dots number - msrDurationKind - durationKind = - tempoDottedDuration.getDurationKind (); - int - dotsNumber = - tempoDottedDuration.getDotsNumber (); - - // determine the note sign - bsrNote::bsrNoteValueKind - noteValueKind = bsrNote::kNoteValueNone; - - switch (durationKind) { - case k_NoDuration: - break; - - case k1024th: // JMI - break; - case k512th: // JMI - break; - case k256th: - noteValueKind = bsrNote::kNoteValueC256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueC128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueC64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueC32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueC16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueC8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueCQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueCHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueCWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueCBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - - // create a note to represent the duration - S_bsrNote - bNote = - bsrNote::create ( - fInputLineNumber, - noteValueKind, - dotsNumber, - bsrNote::kNoteOctaveNone, - bsrNote::kNoteOctaveIsNeededNo, - bsrNote::kNoteAccidentalNone); - - // append its cells to result - result-> - appendCellsListToCellsList ( - bNote->fetchCellsList ()); - - // append an equals to result - result-> - appendCellKindToCellsList ( - kCellTempoEquals); - - // handle per minute value - string - tempoPerMinuteString = - fMsrTempo->getTempoPerMinute (); - - int - perMinuteMin = -1, - perMinuteMax = -1; // may be absent - - // decipher it to extract min and max values - string regularExpression ( - "[[:space:]]*([[:digit:]]+)[[:space:]]*" - "-" - "[[:space:]]*([[:digit:]]+)[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (tempoPerMinuteString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos && ! gGeneralOah->fQuiet) { - gLogOstream << - "There are " << smSize << " matches" << - " for rational string '" << tempoPerMinuteString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - gLogOstream << - "[" << sm [i] << "] "; - } // for - - gLogOstream << endl; - } -#endif - - if (smSize == 3) { - { - stringstream s; - s << sm [1]; - s >> perMinuteMin; - } - { - stringstream s; - s << sm [2]; - s >> perMinuteMax; - } - } - - else { - // decipher it to extract min (and only) values - string regularExpression ( - "[[:space:]]*([[:digit:]]+)[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (tempoPerMinuteString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos && ! gGeneralOah->fQuiet) { - gLogOstream << - "There are " << smSize << " matches" << - " for rational string '" << tempoPerMinuteString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - gLogOstream << - "[" << sm [i] << "] "; - } // for - - gLogOstream << endl; - } -#endif - - if (smSize == 2) { - stringstream s; - s << sm [1]; - s >> perMinuteMin; - } - - else { - stringstream s; - - s << - "tempoPerMinuteString '" << - tempoPerMinuteString << - "' is ill-formed" << - ", line " << fInputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - -/* JMI - gLogOstream << // JMI - "% ==> bsrTempo::buildCellsList ()" << - ", tempoPerMinuteString = " << tempoPerMinuteString << - ", perMinuteMin = " << perMinuteMin << - ", perMinuteMax = " << perMinuteMax << - endl; - */ - - // create a number to represent perMinuteMin - S_bsrNumber - perMinuteNumber = - bsrNumber::create ( - fInputLineNumber, - perMinuteMin, - bsrNumber::kNumberSignIsNeededYes); - - // append its cells to result - result-> - appendCellsListToCellsList ( - perMinuteNumber->getNumberCellsList ()); - - if (perMinuteMax > 0) { - // append a hyphen to result - result-> - appendCellKindToCellsList ( - kCellTempoHyphen); - - // create a number to represent perMinuteMax - S_bsrNumber - perMinuteNumber = - bsrNumber::create ( - fInputLineNumber, - perMinuteMax, - bsrNumber::kNumberSignIsNeededYes); - - // append its cells to result - result-> - appendCellsListToCellsList ( - perMinuteNumber->getNumberCellsList ()); - } - } - break; - - case msrTempo::kTempoBeatUnitsEquivalence: - break; - - case msrTempo::kTempoNotesRelationShip: - break; - } // switch - } - - return result; -} - -int bsrTempo::fetchCellsNumber() const -{ - return fTempoCellsList->fetchCellsNumber(); -} - -void bsrTempo::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTempo::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTempo elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTempo::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrTempo::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTempo::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTempo elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTempo::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrTempo::browseData (basevisitor* v) -{} - -string bsrTempo::asString () const -{ - stringstream s; - - s << - "Tempo" << - ", tempoKind: " << - msrTempo::tempoKindAsString (fMsrTempo->getTempoKind ()) << - ", tempoCellsList: " << - fTempoCellsList->asShortString () << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrTempo::print (ostream& os) const -{ - os << - "Tempo" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 23; - - os << - setw (fieldWidth) << - "tempoKind" << " : " << - msrTempo::tempoKindAsString (fMsrTempo->getTempoKind ()) << - endl << - setw (fieldWidth) << - "tempoCellsList" << " : " << - fTempoCellsList->asShortString () << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrTempo& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrTempos_MUT_DEP.h b/src/lilypond/bsrTempos_MUT_DEP.h deleted file mode 100644 index d623f8a20..000000000 --- a/src/lilypond/bsrTempos_MUT_DEP.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -const bsrCellKind - kCellTempoEquals = kDots2356, - kCellTempoHyphen = kDots36; - -class bsrTempo : public bsrLineElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrTempo mTempo); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrTempo ( - int inputLineNumber, - S_msrTempo mTempo); - - virtual ~bsrTempo (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrTempo getMsrTempo () const - { return fMsrTempo; } - - S_bsrCellsList getTempoCellsList () const - { return fTempoCellsList; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fTempoCellsList; } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList noteValueKindAsCellsList () const; - - S_bsrCellsList noteOctaveKindAsCellsList () const; - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrTempo fMsrTempo; - - S_bsrCellsList fTempoCellsList; -}; -typedef SMARTP S_bsrTempo; -EXP ostream& operator<< (ostream& os, const S_bsrTempo& elt); - diff --git a/src/lilypond/bsrTimes.cpp b/src/lilypond/bsrTimes.cpp deleted file mode 100644 index 6d2e8d78e..000000000 --- a/src/lilypond/bsrTimes.cpp +++ /dev/null @@ -1,843 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "oahOah.h" -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrTimeItem bsrTimeItem::create ( - int inputLineNumber) -{ - bsrTimeItem* o = - new bsrTimeItem ( - inputLineNumber); - assert (o!=0); - - return o; -} - -bsrTimeItem::bsrTimeItem ( - int inputLineNumber) - : bsrElement (inputLineNumber) -{ - fTimeBeatValue = -1; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Creating time item" << - ", line = " << inputLineNumber << - endl; - } -#endif -} - -bsrTimeItem::~bsrTimeItem () -{} - -bool bsrTimeItem::isEqualTo (S_bsrTimeItem otherTimeItem) const -{ - if (! otherTimeItem) { - return false; - } - - if ( - ! ( - fTimeBeatValue == otherTimeItem->fTimeBeatValue - && - fTimeBeatsNumbersVector.size () - == - otherTimeItem->fTimeBeatsNumbersVector.size () - ) - ) { - return false; - } - - for (unsigned int i = 0; i < fTimeBeatsNumbersVector.size (); i++) { - if ( - ! ( - fTimeBeatsNumbersVector [i] - == - otherTimeItem->fTimeBeatsNumbersVector [i] - ) - ) { - return false; - } - } // for - - return true; -} - -void bsrTimeItem::appendBeatsNumber (int beatsNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending beat number '" << - beatsNumber << - "' to time item '" << - asString () << - "'" << - endl; - } -#endif - - fTimeBeatsNumbersVector.insert ( - fTimeBeatsNumbersVector.end (), - beatsNumber); -} - -void bsrTimeItem::setTimeBeatValue (int timeBeatValue) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Setting beat value to '" << - timeBeatValue << - "' in time item '" << - asString () << - "'" << - endl; - } -#endif - - fTimeBeatValue = timeBeatValue; -} - -int bsrTimeItem::getTimeBeatsNumber () const -{ - int result = 0; - - for (unsigned int i = 0; i < fTimeBeatsNumbersVector.size (); i++) { - result += - fTimeBeatsNumbersVector [i]; - } // for - - return result; -} - -void bsrTimeItem::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTimeItem::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTimeItem elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTimeItem::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrTimeItem::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTimeItem::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTimeItem elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTimeItem::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrTimeItem::browseData (basevisitor* v) -{} - -string bsrTimeItem::asString () const -{ - stringstream s; - - int timeBeatsNumbersVectorSize = - fTimeBeatsNumbersVector.size (); - - s << - "TimeItem " << - ", " << - singularOrPlural ( - timeBeatsNumbersVectorSize, "timeBeatNumber", "timeBeatNumbers"); - - switch (timeBeatsNumbersVectorSize) { - case 0: - /* JMI - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "time item beats numbers vector is empty"); - */ - break; - - case 1: - s << - ", " << - fTimeBeatsNumbersVector [0] << "/" << fTimeBeatValue; - break; - - default: - s << - ", beats numbers: "; - - for (int i = 0; i < timeBeatsNumbersVectorSize; i++) { - s << - fTimeBeatsNumbersVector [i]; - - if (i != timeBeatsNumbersVectorSize - 1) { - s << - " "; - } - } // for - - s << - ", beat value: " << fTimeBeatValue; - } // switch - - s << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrTimeItem::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_bsrTimeItem& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrTime bsrTime::create ( - int inputLineNumber, - bsrTimeKind timeKind) -{ - bsrTime* o = - new bsrTime ( - inputLineNumber, - timeKind); - assert (o!=0); - return o; -} - -bsrTime::bsrTime ( - int inputLineNumber, - bsrTimeKind timeKind) - : bsrLineElement (inputLineNumber) -{ - fTimeKind = timeKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Creating bsrTimes '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif -} - -bsrTime::~bsrTime () -{} - -void bsrTime::appendTimeItem (S_bsrTimeItem timeItem) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time item '" << - timeItem->asString () << - "' to time '" << - asString () << - "', line " << - fInputLineNumber << - endl; - } -#endif - - fTimeItemsVector.push_back (timeItem); -} - -S_bsrCellsList bsrTime::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - switch (fTimeKind) { - case bsrTime::kTimeNone: - break; - - case bsrTime::kTimeCommon: - result->appendCellKindToCellsList (kCellNumberSign); - result->appendCellKindToCellsList (kCell4); - result->appendCellKindToCellsList (kCellLower4); - break; - - case bsrTime::kTimeCut: - result->appendCellKindToCellsList (kCellNumberSign); - result->appendCellKindToCellsList (kCell2); - result->appendCellKindToCellsList (kCellLower2); - break; - - case bsrTime::kTimeNumerical: // JMI ??? - case bsrTime::kTimeNote: - case bsrTime::kTimeDottedNote: - { - if (fTimeItemsVector.size ()) { - vector::const_iterator - iBegin = fTimeItemsVector.begin (), - // JMI iEnd = fTimeItemsVector.end (), - i = iBegin; - - S_bsrTimeItem bTimeItem = (*i); - - const vector& - timeBeatsNumbersVector = - bTimeItem->getTimeBeatsNumbersVector (); - - int bTimeBeatValue = - bTimeItem->getTimeBeatValue (); - - int vectorSize = - timeBeatsNumbersVector.size (); - - switch (vectorSize) { - case 0: - /* JMI - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "time item beats numbers vector is empty"); - */ - break; - - case 1: - { - // determine the beats number - int beatsNumberToBeUsed = timeBeatsNumbersVector [0]; - - switch (fTimeKind) { - case bsrTime::kTimeNote: - break; - case bsrTime::kTimeDottedNote: - beatsNumberToBeUsed /= 3; - break; - default: - ; - } // switch - - // create the beats number - S_bsrNumber - beatsNumber = - bsrNumber::create ( - fInputLineNumber, - beatsNumberToBeUsed, - bsrNumber::kNumberSignIsNeededYes); - - // append it to result - result->appendCellsListToCellsList ( - beatsNumber->fetchCellsList ()); - - // create music code indicator - S_bsrCellsList - musicCodeIndicator = - bsrCellsList::create ( - fInputLineNumber, - kDots6, kDots3); - - // append it to result - result->appendCellsListToCellsList ( - musicCodeIndicator); - - // determine the beat value to be used - int beatValueToBeUsed = bTimeBeatValue; - - switch (fTimeKind) { - case bsrTime::kTimeNote: - break; - case bsrTime::kTimeDottedNote: - beatValueToBeUsed /= 2; - break; - default: - ; - } // switch - - // append the beat value to result - switch (beatValueToBeUsed) { - case 1: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueCWhole)); - break; - case 2: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueCHalf)); - break; - case 4: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueCQuarter)); - break; - case 8: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueC8th)); - break; - case 16: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueC16th)); - break; - case 32: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueC32nd)); - break; - case 64: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueC64th)); - break; - case 128: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueC128th)); - break; - case 256: - result->appendCellsListToCellsList ( - bsrNote::noteValueKindAsCellsList ( - fInputLineNumber, - bsrNote::kNoteValueC256th)); - break; - default: - { - stringstream s; - - s << - "MSR time beat value '" << - bTimeBeatValue << - "' is not supported in Braille music"; - - bsrMusicXMLWarning ( - gOahOah->fInputSourceName, - fInputLineNumber, - s.str ()); - } - } // switch - - // append a dot to the beat number if needed - switch (fTimeKind) { - case bsrTime::kTimeNote: - break; - case bsrTime::kTimeDottedNote: - result->appendCellKindToCellsList ( - kCellAugmentationDot); - break; - default: - ; - } // switch - } - break; - - default: - ; - /* - s << - "beats numbers: "; - - for (int i = 0; i < vectorSize; i++) { - s << - timeBeatsNumbersVector [i]; - - if (i != vectorSize - 1) { - s << - " "; - } - } // for - - s << - ", beat value: " << fTimeBeatValue; - */ - } // switch - } - } - break; - - case bsrTime::kTimeSingleNumber: - { - if (fTimeItemsVector.size ()) { - vector::const_iterator - iBegin = fTimeItemsVector.begin (), - // JMI iEnd = fTimeItemsVector.end (), - i = iBegin; - - S_bsrTimeItem bTimeItem = (*i); - - const vector& - timeBeatsNumbersVector = - bTimeItem->getTimeBeatsNumbersVector (); - - int bTimeBeatValue = - bTimeItem->getTimeBeatValue (); - - int vectorSize = - timeBeatsNumbersVector.size (); - - switch (vectorSize) { - case 0: - /* JMI - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "time item beats numbers vector is empty"); - */ - break; - - case 1: - { - // create the beats number - S_bsrNumber - beatsNumber = - bsrNumber::create ( - fInputLineNumber, - timeBeatsNumbersVector [0], - bsrNumber::kNumberSignIsNeededYes); - - // append it to result - result->appendCellsListToCellsList ( - beatsNumber->fetchCellsList ()); - - // append the beat value sign to result - switch (bTimeBeatValue) { - case 1: - result->appendCellKindToCellsList ( - kCellLower1); - break; - case 2: - result->appendCellKindToCellsList ( - kCellLower2); - break; - case 4: - result->appendCellKindToCellsList ( - kCellLower4); - break; - case 8: - result->appendCellKindToCellsList ( - kCellLower8); - break; - case 16: - result->appendCellKindToCellsList ( - kCellLower1); - result->appendCellKindToCellsList ( - kCellLower6); - break; - case 32: - result->appendCellKindToCellsList ( - kCellLower3); - result->appendCellKindToCellsList ( - kCellLower2); - break; - default: - { - stringstream s; - - s << - "MSR time beat value '" << - bTimeBeatValue << - "' is not supported in Braille music"; - - bsrMusicXMLWarning ( - gOahOah->fInputSourceName, - fInputLineNumber, - s.str ()); - } - } // switch - } - break; - - default: - ; - /* - s << - "beats numbers: "; - - for (int i = 0; i < vectorSize; i++) { - s << - timeBeatsNumbersVector [i]; - - if (i != vectorSize - 1) { - s << - " "; - } - } // for - - s << - ", beat value: " << fTimeBeatValue; - */ - } // switch - } - } - break; - - case bsrTime::kTimeSenzaMisura: - break; - } // switch - - return result; -} - -int bsrTime::fetchCellsNumber() const -{ - // time items may have been appended after construction - return fetchCellsList ()->fetchCellsNumber (); -} - -void bsrTime::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTime::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTime elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTime::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrTime::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTime::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTime elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTime::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrTime::browseData (basevisitor* v) -{} - -string bsrTime::timeKindAsString ( - bsrTimeKind timeKind) -{ - string result; - - switch (timeKind) { - case bsrTime::kTimeNone: - result = "timeNone"; - break; - - case bsrTime::kTimeCommon: - result = "timeCommon"; - break; - case bsrTime::kTimeCut: - result = "timeCut"; - break; - case bsrTime::kTimeNumerical: - result = "timeNumerical"; - break; - case bsrTime::kTimeNote: - result = "timeNote"; - break; - case bsrTime::kTimeDottedNote: - result = "timeDottedNote"; - break; - case bsrTime::kTimeSingleNumber: - result = "timeSingleNumber"; - break; - case bsrTime::kTimeSenzaMisura: - result = "timeSenzaMisura"; - break; - } // switch - - return result; -} - -string bsrTime::asString () const -{ - stringstream s; - - s << - "Time" << - ", timeKind " << " : " << - timeKindAsString (fTimeKind) << - ", timeCellsList: " << fetchCellsList ()->asString () << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrTime::print (ostream& os) const -{ - int timeItemsVectorSize = fTimeItemsVector.size (); - - os << - "Time" << - ", " << - singularOrPlural ( - timeItemsVectorSize, "item", "items") << - ", line " << fInputLineNumber << - ":" << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - os << left << - setw (fieldWidth) << - "timeKind " << " : " << - timeKindAsString (fTimeKind) << - endl << - setw (fieldWidth) << - "timeItemsVector" << " : "; - - if (timeItemsVectorSize) { - os << endl; - - gIndenter++; - - vector::const_iterator - iBegin = fTimeItemsVector.begin (), - iEnd = fTimeItemsVector.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - else { - os << - " none" << - endl; - } - - os << - setw (fieldWidth) << - "timeCellsList" << " : " << fetchCellsList ()->asString () << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrTime& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrTimes_MUT_DEP.h b/src/lilypond/bsrTimes_MUT_DEP.h deleted file mode 100644 index 4a19bcb58..000000000 --- a/src/lilypond/bsrTimes_MUT_DEP.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class bsrTimeItem; -typedef SMARTP S_bsrTimeItem; - -class bsrTime; -typedef SMARTP S_bsrTime; - -//______________________________________________________________________________ -class bsrTimeItem : public bsrElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrTimeItem ( - int inputLineNumber); - - virtual ~bsrTimeItem (); - - public: - - // set and get - // ------------------------------------------------------ - - const vector& getTimeBeatsNumbersVector () - { return fTimeBeatsNumbersVector; } - - void setTimeBeatValue (int timeBeatValue); - - int getTimeBeatValue () const - { return fTimeBeatValue; } - - // services - // ------------------------------------------------------ - - bool isEqualTo (S_bsrTimeItem otherTimeItem) const; - - void appendBeatsNumber (int beatsNumber); - - int getTimeBeatsNumber () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - vector fTimeBeatsNumbersVector; // 5+3+1 is possible - int fTimeBeatValue; -}; -typedef SMARTP S_bsrTimeItem; -EXP ostream& operator<< (ostream& os, const S_bsrTimeItem& elt); - -//______________________________________________________________________________ -class bsrTime : public bsrLineElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum bsrTimeKind { - kTimeNone, - kTimeCommon, - kTimeCut, - kTimeNumerical, // JMI - kTimeNote, - kTimeDottedNote, - kTimeSingleNumber, - kTimeSenzaMisura }; - - static string timeKindAsString ( - bsrTimeKind timeKind); - - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - bsrTimeKind timeKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrTime ( - int inputLineNumber, - bsrTimeKind timeKind); - - virtual ~bsrTime (); - - public: - - // set and get - // ------------------------------------------------------ - - bsrTimeKind getTimeKind () const - { return fTimeKind; } - - const vector& - getTimeItemsVector () - { return fTimeItemsVector; } - - public: - - // public services - // ------------------------------------------------------ - - void appendTimeItem (S_bsrTimeItem timeItem); - - S_bsrCellsList fetchCellsList () const - { return buildCellsList (); } - - int fetchCellsNumber () const; - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - bsrTimeKind fTimeKind; - - vector fTimeItemsVector; -}; -typedef SMARTP S_bsrTime; -EXP ostream& operator<< (ostream& os, const S_bsrTime& elt); - diff --git a/src/lilypond/bsrTranscriptionNotes.cpp b/src/lilypond/bsrTranscriptionNotes.cpp deleted file mode 100644 index b7b3aa86c..000000000 --- a/src/lilypond/bsrTranscriptionNotes.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // for 'setw()' - -#include "bsrTranscriptionNotes.h" - -#include "utilities.h" - -#include "bsrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_bsrTranscriptionNotesElement bsrTranscriptionNotesElement::create ( - int inputLineNumber, - string transcriptionNoteText) -{ - bsrTranscriptionNotesElement* o = - new bsrTranscriptionNotesElement ( - inputLineNumber, transcriptionNoteText); - assert(o!=0); - return o; -} - -bsrTranscriptionNotesElement::bsrTranscriptionNotesElement ( - int inputLineNumber, - string transcriptionNoteText) - : bsrElement (inputLineNumber) -{ - fTranscriptionNoteText = transcriptionNoteText; -} - -bsrTranscriptionNotesElement::~bsrTranscriptionNotesElement () -{} - -S_bsrCellsList bsrTranscriptionNotesElement::buildCellsList () const -{ - S_bsrCellsList - result = - bsrCellsList::create (fInputLineNumber); - - return result; -} - -void bsrTranscriptionNotesElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTranscriptionNotesElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTranscriptionNotesElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTranscriptionNotesElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrTranscriptionNotesElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTranscriptionNotesElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTranscriptionNotesElement elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTranscriptionNotesElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrTranscriptionNotesElement::browseData (basevisitor* v) -{ -} - -string bsrTranscriptionNotesElement::asString () const -{ - stringstream s; - - s << - "TranscriptionNotesElement" << - // JMI ", fTranscriptionNoteText: " << - ", \"" << fTranscriptionNoteText << "\"" << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrTranscriptionNotesElement::print (ostream& os) const -{ - os << - "TranscriptionNotesElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << - "transcriptionNoteText " << " : \"" << fTranscriptionNoteText << "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrTranscriptionNotesElement& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_bsrTranscriptionNotes bsrTranscriptionNotes::create ( - int inputLineNumber) -{ - bsrTranscriptionNotes* o = - new bsrTranscriptionNotes ( - inputLineNumber); - assert(o!=0); - return o; -} - -bsrTranscriptionNotes::bsrTranscriptionNotes ( - int inputLineNumber) - : bsrLine ( - inputLineNumber, - 0, // JMI ??? - gBrailleOah->fCellsPerLine) -{} - -bsrTranscriptionNotes::~bsrTranscriptionNotes () -{} - -void bsrTranscriptionNotes::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTranscriptionNotes::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTranscriptionNotes elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTranscriptionNotes::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void bsrTranscriptionNotes::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrTranscriptionNotes::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrTranscriptionNotes elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrTranscriptionNotes::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrTranscriptionNotes::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = - fTranscriptionNotesElementsList.begin (); - i != fTranscriptionNotesElementsList.end (); - i++ ) { - // browse the element - bsrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -void bsrTranscriptionNotes::print (ostream& os) const -{ - os << - "TranscriptionNotes" << - endl; - - gIndenter++; - - // print the notes if any - const int fieldWidth = 19; - - int transcriptionNotesElementsListSize = fTranscriptionNotesElementsList.size (); - - if (transcriptionNotesElementsListSize || gBsrOah->fDisplayBsrDetails) { - os << - setw (fieldWidth) << - "transcriptionNotesElementsList" << " : " << - endl; - - if (transcriptionNotesElementsListSize) { - gIndenter++; - - list::const_iterator - iBegin = fTranscriptionNotesElementsList.begin (), - iEnd = fTranscriptionNotesElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - os << endl; - - gIndenter--; - } - else { - os << - "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrTranscriptionNotes& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrTranscriptionNotes.h b/src/lilypond/bsrTranscriptionNotes.h deleted file mode 100644 index 32479218b..000000000 --- a/src/lilypond/bsrTranscriptionNotes.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___bsrTranscriptionNotes___ -#define ___bsrTranscriptionNotes___ - -#include "bsrMutualDependencies.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class bsrTranscriptionNotesElement : public bsrElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string transcriptionNoteText); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrTranscriptionNotesElement ( - int inputLineNumber, - string transcriptionNoteText); - - virtual ~bsrTranscriptionNotesElement (); - - public: - - // set and get - // ------------------------------------------------------ - - string getTranscriptionNoteText () const - { return fTranscriptionNoteText; } - - public: - - // public services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return buildCellsList (); } - - private: - - // private services - // ------------------------------------------------------ - - S_bsrCellsList buildCellsList () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fTranscriptionNoteText; -}; -typedef SMARTP S_bsrTranscriptionNotesElement; -EXP ostream& operator<< (ostream& os, const S_bsrTranscriptionNotesElement& elt); - -//______________________________________________________________________________ -class bsrTranscriptionNotes : public bsrLine -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrTranscriptionNotes ( - int inputLineNumber); - - virtual ~bsrTranscriptionNotes (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - void appendElementToTranscriptionNotes ( - S_bsrTranscriptionNotesElement transcriptionNotesElement) - { - fTranscriptionNotesElementsList.push_back ( - transcriptionNotesElement); - } - - int fetchLineContentsNumber () const - { return fLineContentsList.size (); } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - list - fTranscriptionNotesElementsList; -}; -typedef SMARTP S_bsrTranscriptionNotes; -EXP ostream& operator<< (ostream& os, const S_bsrTranscriptionNotes& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/bsrWords.cpp b/src/lilypond/bsrWords.cpp deleted file mode 100644 index e9a431a36..000000000 --- a/src/lilypond/bsrWords.cpp +++ /dev/null @@ -1,324 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - - -#include - -#include "bsrMutualDependencies.h" - -#include "messagesHandling.h" - -#include "bsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -// brailling characters and words -S_bsrCellsList brailleCharacter ( - int inputLineNumber, - char ch) -{ - S_bsrCellsList - result = - bsrCellsList::create (inputLineNumber); - - switch (ch) { - case 'a': - result-> - appendCellKindToCellsList (kCellA); - break; - case 'b': - result-> - appendCellKindToCellsList (kCellB); - break; - case 'c': - result-> - appendCellKindToCellsList (kCellC); - break; - case 'd': - result-> - appendCellKindToCellsList (kCellD); - break; - case 'e': - result-> - appendCellKindToCellsList (kCellE); - break; - case 'f': - result-> - appendCellKindToCellsList (kCellF); - break; - case 'g': - result-> - appendCellKindToCellsList (kCellG); - break; - case 'h': - result-> - appendCellKindToCellsList (kCellH); - break; - case 'i': - result-> - appendCellKindToCellsList (kCellI); - break; - case 'j': - result-> - appendCellKindToCellsList (kCellJ); - break; - case 'k': - result-> - appendCellKindToCellsList (kCellK); - break; - case 'l': - result-> - appendCellKindToCellsList (kCellL); - break; - case 'm': - result-> - appendCellKindToCellsList (kCellM); - break; - case 'n': - result-> - appendCellKindToCellsList (kCellN); - break; - case 'o': - result-> - appendCellKindToCellsList (kCellO); - break; - case 'p': - result-> - appendCellKindToCellsList (kCellP); - break; - case 'q': - result-> - appendCellKindToCellsList (kCellQ); - break; - case 'r': - result-> - appendCellKindToCellsList (kCellR); - break; - case 's': - result-> - appendCellKindToCellsList (kCellS); - break; - case 't': - result-> - appendCellKindToCellsList (kCellT); - break; - case 'u': - result-> - appendCellKindToCellsList (kCellU); - break; - case 'v': - result-> - appendCellKindToCellsList (kCellV); - break; - case 'w': - result-> - appendCellKindToCellsList (kCellW); - break; - case 'x': - result-> - appendCellKindToCellsList (kCellX); - break; - case 'y': - result-> - appendCellKindToCellsList (kCellY); - break; - case 'z': - result-> - appendCellKindToCellsList (kCellZ); - break; - - case '(': // JMI literary??? - result-> - appendCellKindToCellsList (kCellParenthesis); - break; - case ')': - result-> - appendCellKindToCellsList (kCellParenthesis); - break; - - - default: - result-> - appendCellKindToCellsList (kCellQuestionMark); - } // switch - - return result; -} - -S_bsrCellsList brailleWord ( - int inputLineNumber, - string str) -{ - S_bsrCellsList - result = - bsrCellsList::create ( - inputLineNumber, kCellWordSign); - - if (str.size ()) { - string::const_iterator - iBegin = str.begin (), - iEnd = str.end (), - i = iBegin; - for ( ; ; ) { - char ch = (*i); - - result-> - appendCellsListToCellsList ( - brailleCharacter ( - inputLineNumber, ch)); - - if (++i == iEnd) break; - } // for - } - - return result; -} - -//______________________________________________________________________________ -S_bsrWords bsrWords::create ( - int inputLineNumber, - string wordContents) -{ - bsrWords* o = - new bsrWords ( - inputLineNumber, wordContents); - assert (o!=0); - return o; -} - -bsrWords::bsrWords ( - int inputLineNumber, - string wordContents) - : bsrLineElement (inputLineNumber) -{ - fWordContents = wordContents; - - fWordCellsList = - brailleWord ( - inputLineNumber, fWordContents); -} - -bsrWords::~bsrWords () -{} - -void bsrWords::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrWords::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrWords elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrWords::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -int bsrWords::fetchCellsNumber () const -{ - return fWordCellsList->fetchCellsNumber (); -} - -void bsrWords::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> bsrWords::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_bsrWords elem = this; - -#ifdef TRACE_OAH - if (gBsrOah->fTraceBsrVisitors) { - gLogOstream << - "% ==> Launching bsrWords::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void bsrWords::browseData (basevisitor* v) -{} - -string bsrWords::asWord () const -{ - stringstream s; - - s << - "Word" << - ", wordContents: " << fWordContents << - ", wordCellsList: " << fWordCellsList << - ", spacesBefore: " << fSpacesBefore << - ", line " << fInputLineNumber; - - return s.str (); -} - -void bsrWords::print (ostream& os) const -{ - os << - "Word" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - os << - setw (fieldWidth) << - "wordContents" << " : " << fWordContents << - endl << - setw (fieldWidth) << - "wordCellsList" << " : " << fWordCellsList << - endl << - setw (fieldWidth) << - "spacesBefore" << " : " << fSpacesBefore << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_bsrWords& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/bsrWords_MUT_DEP.h b/src/lilypond/bsrWords_MUT_DEP.h deleted file mode 100644 index 3c1a12a96..000000000 --- a/src/lilypond/bsrWords_MUT_DEP.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is to be included only by bsrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -// brailling characters and words -S_bsrCellsList brailleCharacter ( - int inputLineNumber, - char ch); - -S_bsrCellsList brailleWord ( - int inputLineNumber, - string str); - -//______________________________________________________________________________ -class bsrWords : public bsrLineElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string wordContents); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - bsrWords ( - int inputLineNumber, - string wordContents); - - virtual ~bsrWords (); - - public: - - // set and get - // ------------------------------------------------------ - - string getWordContents () const - { return fWordContents; } - - // services - // ------------------------------------------------------ - - S_bsrCellsList fetchCellsList () const - { return fWordCellsList; } - - int fetchCellsNumber () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asWord () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fWordContents; - - S_bsrCellsList fWordCellsList; -}; -typedef SMARTP S_bsrWords; -EXP ostream& operator<< (ostream& os, const S_bsrWords& elt); - diff --git a/src/lilypond/extraOah.cpp b/src/lilypond/extraOah.cpp deleted file mode 100644 index af9beef87..000000000 --- a/src/lilypond/extraOah.cpp +++ /dev/null @@ -1,1491 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "extraOah.h" - -#ifdef EXTRA_OAH - - -#include // setw, setprecision, ... - -#include - -#include "version.h" -#include "utilities.h" - -#include "oahOah.h" -#include "generalOah.h" - -#include "traceOah.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_extraShowAllChordsStructuresAtom extraShowAllChordsStructuresAtom::create ( - string shortName, - string longName, - string description) -{ - extraShowAllChordsStructuresAtom* o = new - extraShowAllChordsStructuresAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -extraShowAllChordsStructuresAtom::extraShowAllChordsStructuresAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -extraShowAllChordsStructuresAtom::~extraShowAllChordsStructuresAtom () -{} - -S_oahValuedAtom extraShowAllChordsStructuresAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a extraShowAllChordsStructuresAtom" << - endl; - } -#endif - - // handle it at once - printAllChordsStructures (os); - - // no option value is needed - return nullptr; -} - -void extraShowAllChordsStructuresAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowAllChordsStructuresAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowAllChordsStructuresAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowAllChordsStructuresAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void extraShowAllChordsStructuresAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowAllChordsStructuresAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowAllChordsStructuresAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowAllChordsStructuresAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void extraShowAllChordsStructuresAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowAllChordsStructuresAtom::browseData ()" << - endl; - } -#endif -} - -void extraShowAllChordsStructuresAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsShowAllChordsStructuresAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void extraShowAllChordsStructuresAtom::printAllChordsStructures (ostream& os) const -{ - msrChordStructure::printAllChordsStructures (os); -} - -void extraShowAllChordsStructuresAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_extraShowAllChordsStructuresAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_extraShowAllChordsContentsAtom extraShowAllChordsContentsAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& extraShowAllChordsContentsVariable) -{ - extraShowAllChordsContentsAtom* o = new - extraShowAllChordsContentsAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - extraShowAllChordsContentsVariable); - assert(o!=0); - return o; -} - -extraShowAllChordsContentsAtom::extraShowAllChordsContentsAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& extraShowAllChordsContentsVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringVariable ( - extraShowAllChordsContentsVariable) -{} - -extraShowAllChordsContentsAtom::~extraShowAllChordsContentsAtom () -{} - -S_oahValuedAtom extraShowAllChordsContentsAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a extraShowAllChordsContentsAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void extraShowAllChordsContentsAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'extraShowAllChordsContentsAtom'" << - endl; - } -#endif - - // theString contains the pitch name in the current language - // is it in the accidental styles map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'extraShowAllChordsContentsAtom'" << - ", theString = \"" << theString << "\"" << - endl; - } -#endif - - // fetch the semitones pitch from theString - msrSemiTonesPitchKind - semiTonesPitchKind = - semiTonesPitchKindFromString ( - theString); - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - { - stringstream s; - - s << - "'" << theString << - "' is no diatonic (semitones) pitch" << - " in pitch language '" << - msrQuarterTonesPitchesLanguageKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind) << - "'" << - endl; - - oahError (s.str ()); - } - break; - - case kA_Flat_STP: - case kA_Natural_STP: - case kA_Sharp_STP: - - case kB_Flat_STP: - case kB_Natural_STP: - case kB_Sharp_STP: - - case kC_Flat_STP: - case kC_Natural_STP: - case kC_Sharp_STP: - - case kD_Flat_STP: - case kD_Natural_STP: - case kD_Sharp_STP: - - case kE_Flat_STP: - case kE_Natural_STP: - case kE_Sharp_STP: - - case kF_Flat_STP: - case kF_Natural_STP: - case kF_Sharp_STP: - - case kG_Flat_STP: - case kG_Natural_STP: - case kG_Sharp_STP: - break; - - default: - { - stringstream s; - - s << - "'" << theString << - "' is no diatonic (semitones) pitch" << - endl; - - oahError (s.str ()); - } - } // switch - - // print all the chords notes - printAllChordsContents ( - os, - semiTonesPitchKind); - - // register 'show all chords contents' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void extraShowAllChordsContentsAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowAllChordsContentsAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowAllChordsContentsAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowAllChordsContentsAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void extraShowAllChordsContentsAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowAllChordsContentsAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowAllChordsContentsAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowAllChordsContentsAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void extraShowAllChordsContentsAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowAllChordsContentsAtom::browseData ()" << - endl; - } -#endif -} - -void extraShowAllChordsContentsAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "extraShowAllChordsContentsAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void extraShowAllChordsContentsAtom::printAllChordsContents ( - ostream& os, - msrSemiTonesPitchKind semiTonesPitchKind) const -{ - msrChordContents::printAllChordsContents ( - os, - semiTonesPitchKind); -} - -void extraShowAllChordsContentsAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_extraShowAllChordsContentsAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_extraShowChordDetailsAtom extraShowChordDetailsAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& extraShowChordDetailsVariable) -{ - extraShowChordDetailsAtom* o = new - extraShowChordDetailsAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - extraShowChordDetailsVariable); - assert(o!=0); - return o; -} - -extraShowChordDetailsAtom::extraShowChordDetailsAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& extraShowChordDetailsVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringVariable ( - extraShowChordDetailsVariable) -{} - -extraShowChordDetailsAtom::~extraShowChordDetailsAtom () -{} - -S_oahValuedAtom extraShowChordDetailsAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a extraShowChordDetailsAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void extraShowChordDetailsAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'extraShowChordDetailsAtom'" << - endl; - } -#endif - - // theString contains the pitch name in the current language - // is it in the accidental styles map? -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'extraShowChordDetailsAtom'" << - ", theString = \"" << theString << "\"" << - endl; - } -#endif - - // decipher theString with a regular expression - string regularExpression ( - "[[:space:]]*" - "([[:alnum:]]+)" - "[[:space:]]*" - "([[:alnum:]]+)" - "[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for chord details string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - smSize << " elements: "; - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - os << endl; - } -#endif - - if (smSize == 3) { // JMI ??? - } - - else { - stringstream s; - - s << - "-chord details argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string - rootName = sm [1], - harmonyName = sm [2]; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "--> rootName = \"" << rootName << "\", " << - "--> harmonyName = \"" << harmonyName << "\"" << - endl; - } -#endif - - // fetch the semitones pitch from rootName - msrSemiTonesPitchKind - semiTonesPitchKind = - semiTonesPitchKindFromString ( - rootName); - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - { - stringstream s; - - s << - "'" << rootName << - "' is no diatonic (semitones) root pitch" << - " in pitch language '" << - msrQuarterTonesPitchesLanguageKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind) << - "'" << - endl; - - oahError (s.str ()); - } - break; - - case kA_Flat_STP: - case kA_Natural_STP: - case kA_Sharp_STP: - - case kB_Flat_STP: - case kB_Natural_STP: - case kB_Sharp_STP: - - case kC_Flat_STP: - case kC_Natural_STP: - case kC_Sharp_STP: - - case kD_Flat_STP: - case kD_Natural_STP: - case kD_Sharp_STP: - - case kE_Flat_STP: - case kE_Natural_STP: - case kE_Sharp_STP: - - case kF_Flat_STP: - case kF_Natural_STP: - case kF_Sharp_STP: - - case kG_Flat_STP: - case kG_Natural_STP: - case kG_Sharp_STP: - break; - - default: - { - stringstream s; - - s << - "'" << rootName << - "' is no diatonic (semitones) pitch" << - endl; - - oahError (s.str ()); - } - } // switch - - // fetch the harmony kind from harmonyName - msrHarmonyKind - harmonyKind = - msrHarmonyKindFromString ( - harmonyName); - - // print the chord details - printChordDetails ( - os, - semiTonesPitchKind, - harmonyKind); - - // register 'show all chords contents' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void extraShowChordDetailsAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowChordDetailsAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowChordDetailsAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowChordDetailsAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void extraShowChordDetailsAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowChordDetailsAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowChordDetailsAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowChordDetailsAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void extraShowChordDetailsAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowChordDetailsAtom::browseData ()" << - endl; - } -#endif -} - -void extraShowChordDetailsAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "extraShowChordDetailsAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void extraShowChordDetailsAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -//______________________________________________________________________________ -S_extraShowChordAnalysisAtom extraShowChordAnalysisAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& extraShowChordAnalysisVariable) -{ - extraShowChordAnalysisAtom* o = new - extraShowChordAnalysisAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - extraShowChordAnalysisVariable); - assert(o!=0); - return o; -} - -extraShowChordAnalysisAtom::extraShowChordAnalysisAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& extraShowChordAnalysisVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringVariable ( - extraShowChordAnalysisVariable) -{} - -extraShowChordAnalysisAtom::~extraShowChordAnalysisAtom () -{} - -S_oahValuedAtom extraShowChordAnalysisAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a extraShowChordAnalysisAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void extraShowChordAnalysisAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'extraShowChordAnalysisAtom'" << - endl; - } -#endif - - // theString contains the pitch name in the current language - // is it in the accidental styles map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'extraShowChordAnalysisAtom'" << - ", theString = \"" << theString << "\"" << - endl; - } -#endif - - // decipher theString with a regular expression - string regularExpression ( - "[[:space:]]*" - "([[:alnum:]]+)" - "[[:space:]]+" - "([[:alnum:]]+)" - "[[:space:]]+" - "([[:digit:]]+)" - "[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for chord analysis string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - } -#endif - - if (smSize == 4) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - smSize << " elements: "; - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - os << endl; - } -#endif - } - - else { - stringstream s; - - s << - "chord analysis argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - -/* JMI ??? should work... - printSubGroupSpecificHelp ( - os, - showChordAnalysisAtom-> - getSubGroupUpLink ()); -*/ - } - - string - rootName = sm [1], - harmonyName = sm [2], - inversionAsString = sm [3]; - - int - inversion; - - stringstream s; - - s << inversionAsString; - - s >> inversion; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "--> rootName = \"" << rootName << "\", " << - "--> harmonyName = \"" << harmonyName << "\"" << - "--> inversion = " << inversion << - endl; - } -#endif - - // fetch the semitones pitch from rootName - msrSemiTonesPitchKind - semiTonesPitchKind = - semiTonesPitchKindFromString ( - rootName); - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - { - stringstream s; - - s << - "'" << rootName << - "' is no diatonic (semitones) root pitch" << - " in pitch language '" << - msrQuarterTonesPitchesLanguageKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind) << - "'" << - endl; - - oahError (s.str ()); - } - break; - - case kA_Flat_STP: - case kA_Natural_STP: - case kA_Sharp_STP: - - case kB_Flat_STP: - case kB_Natural_STP: - case kB_Sharp_STP: - - case kC_Flat_STP: - case kC_Natural_STP: - case kC_Sharp_STP: - - case kD_Flat_STP: - case kD_Natural_STP: - case kD_Sharp_STP: - - case kE_Flat_STP: - case kE_Natural_STP: - case kE_Sharp_STP: - - case kF_Flat_STP: - case kF_Natural_STP: - case kF_Sharp_STP: - - case kG_Flat_STP: - case kG_Natural_STP: - case kG_Sharp_STP: - break; - - default: - { - stringstream s; - - s << - "'" << rootName << - "' is no diatonic (semitones) pitch" << - endl; - - oahError (s.str ()); - } - } // switch - - // fetch the harmony kind from harmonyName - msrHarmonyKind - harmonyKind = - msrHarmonyKindFromString ( - harmonyName); - - if (harmonyKind == k_NoHarmony) { - stringstream s; - - s << - "'" << harmonyName << - "' is no harmony name, valid names are:" << - endl << - "maj, min,aug, dim, dom, maj7, min7, dim7, aug7, halfdim, minmaj7, maj6, min6, dom9, maj9, min9, dom11, maj11, min11, dom13, maj13, min13, sus2, sus4, neapolitan, italian, french, german, pedal, power, tristan, minmaj9, domsus4, domaug5, dommin9, domaug9dim5, domaug9aug5, domaug11 and maj7aug11" << - endl; - - oahError (s.str ()); - } - - // print the chord analysis - printChordAnalysis ( - os, - semiTonesPitchKind, - harmonyKind, - inversion); - - // register 'show all chords contents' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void extraShowChordAnalysisAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowChordAnalysisAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowChordAnalysisAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowChordAnalysisAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void extraShowChordAnalysisAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowChordAnalysisAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraShowChordAnalysisAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraShowChordAnalysisAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void extraShowChordAnalysisAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraShowChordAnalysisAtom::browseData ()" << - endl; - } -#endif -} - -void extraShowChordAnalysisAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "extraShowChordAnalysisAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void extraShowChordAnalysisAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -//_______________________________________________________________________________ - -S_extraOah gExtraOah; -S_extraOah gExtraOahUserChoices; -S_extraOah gExtraOahWithDetailedTrace; - -S_extraOah extraOah::create ( - S_oahHandler handlerUpLink) -{ - extraOah* o = new extraOah( - handlerUpLink); - assert(o!=0); - return o; -} - -extraOah::extraOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "Extra", - "he", "help-extra", -R"(These extra provide features not related to translation from MusicXML to other formats. -In the text below: - - ROOT_DIATONIC_PITCH should belong to the names available in - the selected MSR pitches language, "nederlands" by default; - - other languages can be chosen with the '-mpl, -msrPitchesLanguage' option; - - HARMONY_NAME should be one of: - MusicXML chords: - "maj", "min", "aug", "dim", "dom", - "maj7", "min7", "dim7", "aug7", "halfdim", "minmaj7", - "maj6", "min6", "dom9", "maj9", "min9", "dom11", "maj11", "min11", - "dom13", "maj13", "min13", "sus2", "sus4", - "neapolitan", "italian", "french", "german" - Jazz-specific chords: - "pedal", "power", "tristan", "minmaj9", "domsus4", "domaug5", - "dommin9", "domaug9dim5", "domaug9aug5", "domaug11", "maj7aug11" -The single or double quotes are used to allow spaces in the names -and around the '=' sign, otherwise they can be dispensed with.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this extra group to the extra handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeExtraOah (false); -} - -extraOah::~extraOah () -{} - -void extraOah::initializeExtraShowAllChordsStructuresOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Chords structures", - "hecs", "help-extra-chord-structures", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - extraShowAllChordsStructuresAtom::create ( - "scs", "show-chords-structures", -R"(Write all known chords structures to standard output.)")); -} - -void extraOah::initializeExtraShowAllChordsContentsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Chords contents", - "hecc", "help-extra-chords-contents", -// replaceSubstringInString ( -// "HARMONY_KINDS", -// existingHarmonyKindsNames () -// HARMONY_KINDS. -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - extraShowAllChordsContentsAtom::create ( - "sacc", "show-all-chords-contents", -R"(Write all chords contents for the given diatonic (semitones) PITCH, -supplied in the current language to standard output.)", - "PITCH", - "diatonic (semitones) pitch", - fChordsRootAsString)); -} - -void extraOah::initializeExtraShowChordDetailsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Chord details", - "hecd", "help-extra-chords-details", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - extraShowChordDetailsAtom::create ( - "scd", "show-chord-details", - replaceSubstringInString ( -R"(Write the details of the chord for the given diatonic (semitones) pitch -in the current language and the given harmony to standard output. -CHORD_SPEC can be: -'ROOT_DIATONIC_PITCH HARMONY_NAME' -or -"ROOT_DIATONIC_PITCH = HARMONY_NAME" -Using double quotes allows for shell variables substitutions, as in: -HARMONY="maj7" -EXECUTABLE -show-chord-details "bes ${HARMONY}")", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "CHORD_SPEC", - "diatonic (semitones) pitch", - fChordsRootAsString)); -} - -void extraOah::initializeExtraShowChordAnalysisOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Chord analysis", - "heca", "help-extra-chords-analysis", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - subGroup-> - appendAtomToSubGroup ( - extraShowChordAnalysisAtom::create ( - "sca", "show-chord-analysis", // -sca "c dommin9 0" - replaceSubstringInString ( -R"(Write an analysis of the chord for the given diatonic (semitones) pitch -in the current language and the given harmony to standard output. -CHORD_SPEC can be: -'ROOT_DIATONIC_PITCH HARMONY_NAME INVERSION' -or -"ROOT_DIATONIC_PITCH = HARMONY_NAME INVERSION" -Using double quotes allows for shell variables substitutions, as in: -HARMONY="maj7" -INVERSION=2 -EXECUTABLE -show-chord-analysis "bes ${HARMONY} ${INVERSION}")", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "CHORD_SPEC", - "diatonic (semitones) pitch", - fChordsRootAsString)); -} - -void extraOah::initializeExtraOah ( - bool boolOptionsInitialValue) -{ - // show all chords structures - // -------------------------------------- - initializeExtraShowAllChordsStructuresOptions ( - boolOptionsInitialValue); - - // show all chords contents - // -------------------------------------- - initializeExtraShowAllChordsContentsOptions ( - boolOptionsInitialValue); - - // show chord details - // -------------------------------------- - initializeExtraShowChordDetailsOptions ( - boolOptionsInitialValue); - - // show chord analysis - // -------------------------------------- - initializeExtraShowChordAnalysisOptions ( - boolOptionsInitialValue); -} - -S_extraOah extraOah::createCloneWithDetailedTrace () -{ - S_extraOah - clone = - extraOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the extra handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - - // chord intervals - // -------------------------------------- - - // chord notes - // -------------------------------------- - - return clone; -} - -//______________________________________________________________________________ -void extraOah::enforceQuietness () -{ -} - -//______________________________________________________________________________ -void extraOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void extraOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void extraOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_extraOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching extraOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void extraOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> extraOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void extraOah::printExtraOahValues (int fieldWidth) -{ - gLogOstream << - "The extra extra are:" << // JMI - endl; - - gIndenter++; - - // chord intervals - // -------------------------------------- - - // chord notes - // -------------------------------------- - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_extraOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeExtraOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing extra extra handling" << - endl; - } -#endif - - // create the extra extra - // ------------------------------------------------------ - - gExtraOahUserChoices = extraOah::create ( - handler); - assert(gExtraOahUserChoices != 0); - - gExtraOah = - gExtraOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ - -/* JMI - gExtraOahWithDetailedTrace = - gExtraOah-> - createCloneWithDetailedTrace (); - */ -} - - -} - -#endif diff --git a/src/lilypond/extraOah.h b/src/lilypond/extraOah.h deleted file mode 100644 index a93fd1b40..000000000 --- a/src/lilypond/extraOah.h +++ /dev/null @@ -1,467 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___extraOah___ -#define ___extraOah___ - - -#include "setExtraOahIfDesired.h" - -#ifdef EXTRA_OAH - - -#include "oahBasicTypes.h" - -#include "exports.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class extraShowAllChordsStructuresAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - extraShowAllChordsStructuresAtom ( - string shortName, - string longName, - string description); - - virtual ~extraShowAllChordsStructuresAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAllChordsStructures (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_extraShowAllChordsStructuresAtom; -EXP ostream& operator<< (ostream& os, const S_extraShowAllChordsStructuresAtom& elt); - -//______________________________________________________________________________ -class extraShowAllChordsContentsAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - extraShowAllChordsContentsAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - virtual ~extraShowAllChordsContentsAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringVariable ( - string value) - { fStringVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAllChordsContents ( - ostream& os, - msrSemiTonesPitchKind semiTonesPitchKind) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - string& fStringVariable; -}; -typedef SMARTP S_extraShowAllChordsContentsAtom; -EXP ostream& operator<< (ostream& os, const S_extraShowAllChordsContentsAtom& elt); - -//______________________________________________________________________________ -class extraShowChordDetailsAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - extraShowChordDetailsAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - virtual ~extraShowChordDetailsAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setShowChordDetailsVariableValue ( - string value) - { fStringVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - string& fStringVariable; -}; -typedef SMARTP S_extraShowChordDetailsAtom; -EXP ostream& operator<< (ostream& os, const S_extraShowChordDetailsAtom& elt); - -//______________________________________________________________________________ -class extraShowChordAnalysisAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - extraShowChordAnalysisAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - virtual ~extraShowChordAnalysisAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setShowChordAnalysisVariableValue ( - string value) - { fStringVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - string& fStringVariable; -}; -typedef SMARTP S_extraShowChordAnalysisAtom; -EXP ostream& operator<< (ostream& os, const S_extraShowChordAnalysisAtom& elt); - -//______________________________________________________________________________ -class extraOah : public oahGroup -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithDetailedTrace (); - - private: - - // initialisation - // ------------------------------------------------------ - - void initializeExtraOah ( - bool boolOptionsInitialValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - extraOah ( - S_oahHandler handlerUpLink); - - virtual ~extraOah (); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - void initializeExtraShowAllChordsStructuresOptions ( - bool boolOptionsInitialValue); - - void initializeExtraShowAllChordsContentsOptions ( - bool boolOptionsInitialValue); - - void initializeExtraShowChordDetailsOptions ( - bool boolOptionsInitialValue); - - void initializeExtraShowChordAnalysisOptions ( - bool boolOptionsInitialValue); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printExtraOahHelp (); - - void printExtraOahValues (int fieldWidth); - - public: - - // fields - // ------------------------------------------------------ - - string fChordsRootAsString; // JMI -}; -typedef SMARTP S_extraOah; -EXP ostream& operator<< (ostream& os, const S_extraOah& elt); - -EXP extern S_extraOah gExtraOah; -EXP extern S_extraOah gExtraOahUserChoices; -EXP extern S_extraOah gExtraOahWithDetailedTrace; - -//______________________________________________________________________________ -void initializeExtraOahHandling ( - S_oahHandler handler); - - -} - - -#endif - - -#endif diff --git a/src/lilypond/extraOah2ManPageGenerator.cpp b/src/lilypond/extraOah2ManPageGenerator.cpp deleted file mode 100644 index 4defdc2ae..000000000 --- a/src/lilypond/extraOah2ManPageGenerator.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "extraOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -extraOah2ManPageGenerator::extraOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -extraOah2ManPageGenerator::~extraOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void extraOah2ManPageGenerator::visitStart (S_extraShowAllChordsStructuresAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting extraShowAllChordsStructuresAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void extraOah2ManPageGenerator::visitEnd (S_extraShowAllChordsStructuresAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting extraShowAllChordsStructuresAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void extraOah2ManPageGenerator::visitStart (S_extraShowAllChordsContentsAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting extraShowAllChordsContentsAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; -*/ -} - -void extraOah2ManPageGenerator::visitEnd (S_extraShowAllChordsContentsAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting extraShowAllChordsContentsAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void extraOah2ManPageGenerator::visitStart (S_extraShowChordDetailsAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting extraShowChordDetailsAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void extraOah2ManPageGenerator::visitEnd (S_extraShowChordDetailsAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting extraShowChordDetailsAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void extraOah2ManPageGenerator::visitStart (S_extraShowChordAnalysisAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting extraShowChordAnalysisAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void extraOah2ManPageGenerator::visitEnd (S_extraShowChordAnalysisAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting extraShowChordAnalysisAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/extraOah2ManPageGenerator.h b/src/lilypond/extraOah2ManPageGenerator.h deleted file mode 100644 index a6b6488b8..000000000 --- a/src/lilypond/extraOah2ManPageGenerator.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___extraOah2ManPageGenerator___ -#define ___extraOah2ManPageGenerator___ - -#include "extraOah.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class extraOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor, - - public visitor, - - public visitor, - - public visitor - -{ - public: - - extraOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~extraOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_extraShowAllChordsStructuresAtom& elt); - virtual void visitEnd (S_extraShowAllChordsStructuresAtom& elt); - - virtual void visitStart (S_extraShowAllChordsContentsAtom& elt); - virtual void visitEnd (S_extraShowAllChordsContentsAtom& elt); - - virtual void visitStart (S_extraShowChordDetailsAtom& elt); - virtual void visitEnd (S_extraShowChordDetailsAtom& elt); - - virtual void visitStart (S_extraShowChordAnalysisAtom& elt); - virtual void visitEnd (S_extraShowChordAnalysisAtom& elt); -}; -typedef SMARTP S_extraOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/generalOah.cpp b/src/lilypond/generalOah.cpp deleted file mode 100644 index 80d8a2f62..000000000 --- a/src/lilypond/generalOah.cpp +++ /dev/null @@ -1,410 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_generalOah gGeneralOah; -S_generalOah gGeneralOahUserChoices; - -S_generalOah generalOah::create ( - S_oahHandler handlerUpLink) -{ - generalOah* o = new generalOah ( - handlerUpLink); - assert(o!=0); - - return o; -} - -generalOah::generalOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "General", - "hg", "help-general", -R"()", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this options group to the options handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeGeneralOah (false); -} - -generalOah::~generalOah () -{} - -void generalOah::initializeGeneralWarningAndErrorsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Warnings and errors", - "hwae", "help-warnings-and-errors", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // quiet - - fQuiet = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "q", "quiet", -R"(Don't issue any warning or error messages.)", - "quiet", - fQuiet)); - - // don't show errors - - fDontShowErrors = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dse", "dont-show-errors", -R"(Don't show errors in the log.)", - "dontShowErrors", - fDontShowErrors)); - - // do not abort on errors - - fDontAbortOnErrors = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "daoe", "dont-abort-on-errors", - replaceSubstringInString ( -R"(Do not abort execution on errors and go ahead. -This may be useful when debugging EXECUTABLE.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "dontAbortOnErrors", - fDontAbortOnErrors)); - - // display the source code position - - fDisplaySourceCodePosition = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dscp", "display-source-code-position", - replaceSubstringInString ( -R"(Display the source code file name and line number -in warning and error messages. -This is useful when debugging EXECUTABLE.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "displaySourceCodePosition", - fDisplaySourceCodePosition)); -} - -void generalOah::initializeGeneralCPUUsageOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "CPU usage", - "hgcpu", "help-general-cpu-usage", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // CPU usage - - fDisplayCPUusage = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "cpu", "display-cpu-usage", -R"(Write information about CPU usage to standard error.)", - "displayCPUusage", - fDisplayCPUusage)); -} - -void generalOah::initializeGeneralOah ( - bool boolOptionsInitialValue) -{ - // register translation date - // ------------------------------------------------------ - - { - time_t translationRawtime; - struct tm* translationTimeinfo; - char buffer [80]; - - time (&translationRawtime); - translationTimeinfo = localtime (&translationRawtime); - - strftime (buffer, 80, "%A %F @ %T %Z", translationTimeinfo); - fTranslationDate = buffer; - } - - // warning and error handling - // -------------------------------------- - initializeGeneralWarningAndErrorsOptions ( - boolOptionsInitialValue); - - // CPU usage - // -------------------------------------- - initializeGeneralCPUUsageOptions ( - boolOptionsInitialValue); -} - -S_generalOah generalOah::createCloneWithTrueValues () -{ - S_generalOah - clone = - generalOah::create ( - nullptr); - // nullptr not to have it inserted twice in the option handler - - // set the options handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - // warning and error handling - // -------------------------------------- - - clone->fQuiet = - fQuiet; - clone->fDontShowErrors = - fDontShowErrors; - clone->fDontAbortOnErrors = - fDontAbortOnErrors; - clone->fDisplaySourceCodePosition = - fDisplaySourceCodePosition; - - // CPU usage - // -------------------------------------- - - clone->fDisplayCPUusage = true; - - return clone; -} - - /* JMI -void generalOah::setAllGeneralTraceOah ( - bool boolOptionsInitialValue) -{ - // warning and error handling - // -------------------------------------- - - fQuiet = boolOptionsInitialValue; - fDontShowErrors = boolOptionsInitialValue; - fDontAbortOnErrors = boolOptionsInitialValue; - fDisplaySourceCodePosition = boolOptionsInitialValue; - - // CPU usage - // -------------------------------------- - - fDisplayCPUusage = boolOptionsInitialValue; -} - */ - -//______________________________________________________________________________ -void generalOah::enforceQuietness () -{ - fDisplayCPUusage = false; // JMI -} - -//______________________________________________________________________________ -void generalOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void generalOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> generalOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_generalOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching generalOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void generalOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> generalOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_generalOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching generalOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void generalOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> generalOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void generalOah::printGeneralOahValues (int fieldWidth) -{ - gLogOstream << - "The general options are:" << - endl; - - gIndenter++; - - // translation date - // -------------------------------------- - - gLogOstream << left << - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "translationDate" << " : " << - fTranslationDate << - endl; - - gIndenter--; - - // warning and error handling - // -------------------------------------- - - gLogOstream << left << - setw (fieldWidth) << "Warning and error handling:" << - endl; - - gIndenter++; - - gLogOstream << - setw (fieldWidth) << "quiet" << " : " << - booleanAsString (fQuiet) << - endl << - setw (fieldWidth) << "dontShowErrors" << " : " << - booleanAsString (fDontShowErrors) << - endl << - setw (fieldWidth) << "dontAbortOnErrors" << " : " << - booleanAsString (fDontAbortOnErrors) << - endl << - setw (fieldWidth) << "displaySourceCodePosition" << " : " << - booleanAsString (fDisplaySourceCodePosition) << - endl; - - gIndenter--; - - - // CPU usage - // -------------------------------------- - - gLogOstream << left << - setw (fieldWidth) << "CPU usage:" << - endl; - - gIndenter++; - - gLogOstream << - setw (fieldWidth) << "displayCPUusage" << " : " << - booleanAsString (fDisplayCPUusage) << - endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_generalOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeGeneralOahHandling ( - S_oahHandler handler) -{ - // create the options variables - // ------------------------------------------------------ - - gGeneralOahUserChoices = generalOah::create ( - handler); - assert(gGeneralOahUserChoices != 0); - - gGeneralOah = - gGeneralOahUserChoices; -} - - -} diff --git a/src/lilypond/generalOah.h b/src/lilypond/generalOah.h deleted file mode 100644 index bdff02980..000000000 --- a/src/lilypond/generalOah.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___generalOah___ -#define ___generalOah___ - -#include - -#include "exports.h" - -#include "oahOah.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class generalOah : public oahGroup -{ - public: - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithTrueValues (); // JMI - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeGeneralOah ( - bool boolOptionsInitialValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - generalOah ( - S_oahHandler handlerUpLink); - - virtual ~generalOah (); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // set and get - // ------------------------------------------------------ - -/* JMI ??? - void setAllGeneralTraceOah ( - bool boolOptionsInitialValue); - */ - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - void initializeGeneralWarningAndErrorsOptions ( - bool boolOptionsInitialValue); - - void initializeGeneralCPUUsageOptions ( - bool boolOptionsInitialValue); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printGeneralOahHelp (); - - void printGeneralOahValues (int fieldWidth); - - public: - - // translation date - // -------------------------------------- - - string fTranslationDate; - - // warning and error handling - // -------------------------------------- - - bool fQuiet; - bool fDontShowErrors; - bool fDontAbortOnErrors; - bool fDisplaySourceCodePosition; - - // CPU usage - // -------------------------------------- - - bool fDisplayCPUusage; -}; -typedef SMARTP S_generalOah; -EXP ostream& operator<< (ostream& os, const S_generalOah& elt); - -EXP extern S_generalOah gGeneralOah; -EXP extern S_generalOah gGeneralOahUserChoices; -EXP extern S_generalOah gGeneralOahWithDetailedTrace; - -//______________________________________________________________________________ -void initializeGeneralOahHandling ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/lilypondOah.cpp b/src/lilypond/lilypondOah.cpp deleted file mode 100644 index 3fa6769d2..000000000 --- a/src/lilypond/lilypondOah.cpp +++ /dev/null @@ -1,4974 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX -#include // setw, setprecision, ... - -#include - -#include "msrMidi.h" - -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" -#include "lpsrOah.h" -#include "lilypondOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lilypondScoreOutputKindAtom lilypondScoreOutputKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lilypondScoreOutputKindVariable) -{ - lilypondScoreOutputKindAtom* o = new - lilypondScoreOutputKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lilypondScoreOutputKindVariable); - assert(o!=0); - return o; -} - -lilypondScoreOutputKindAtom::lilypondScoreOutputKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lilypondScoreOutputKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLpsrScoreOutputKindVariable ( - lilypondScoreOutputKindVariable) -{} - -lilypondScoreOutputKindAtom::~lilypondScoreOutputKindAtom () -{} - -S_oahValuedAtom lilypondScoreOutputKindAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondScoreOutputKindAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lilypondScoreOutputKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondScoreOutputKindAtom'" << - endl; - } -#endif -} - -void lilypondScoreOutputKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondScoreOutputKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondScoreOutputKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondScoreOutputKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondScoreOutputKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondScoreOutputKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondScoreOutputKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondScoreOutputKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondScoreOutputKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondScoreOutputKindAtom::browseData ()" << - endl; - } -#endif -} - -string lilypondScoreOutputKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - lpsrScoreOutputKindAsString (fLpsrScoreOutputKindVariable); - - return s.str (); -} - -string lilypondScoreOutputKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - lpsrScoreOutputKindAsString (fLpsrScoreOutputKindVariable); - - return s.str (); -} - -void lilypondScoreOutputKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsScoreOutputKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fLpsrScoreOutputKindVariable" << " : \"" << - lpsrScoreOutputKindAsString ( - fLpsrScoreOutputKindVariable) << - "\"" << - endl; - - gIndenter--; -} - -void lilypondScoreOutputKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - lpsrScoreOutputKindAsString ( - fLpsrScoreOutputKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_lilypondScoreOutputKindAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lilypondAbsoluteOctaveEntryAtom lilypondAbsoluteOctaveEntryAtom::create ( - string shortName, - string longName, - string description, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable) -{ - lilypondAbsoluteOctaveEntryAtom* o = new - lilypondAbsoluteOctaveEntryAtom ( - shortName, - longName, - description, - variableName, - lpsrOctaveEntryKindVariable); - assert(o!=0); - return o; -} - -lilypondAbsoluteOctaveEntryAtom::lilypondAbsoluteOctaveEntryAtom ( - string shortName, - string longName, - string description, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable) - : oahAtomWithVariableName ( - shortName, - longName, - description, - variableName), - fLpsrOctaveEntryKindVariable ( - lpsrOctaveEntryKindVariable) -{} - -lilypondAbsoluteOctaveEntryAtom::~lilypondAbsoluteOctaveEntryAtom () -{} - -S_oahValuedAtom lilypondAbsoluteOctaveEntryAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondAbsoluteOctaveEntryAtom" << - endl; - } -#endif - - // set octave entry kind at once - fLpsrOctaveEntryKindVariable = kOctaveEntryAbsolute; - - // no option value is needed - return nullptr; -} - -void lilypondAbsoluteOctaveEntryAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondAbsoluteOctaveEntryAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondAbsoluteOctaveEntryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondAbsoluteOctaveEntryAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondAbsoluteOctaveEntryAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondAbsoluteOctaveEntryAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondAbsoluteOctaveEntryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondAbsoluteOctaveEntryAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondAbsoluteOctaveEntryAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondAbsoluteOctaveEntryAtom::browseData ()" << - endl; - } -#endif -} - -void lilypondAbsoluteOctaveEntryAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "lilypondAbsoluteOctaveEntryAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void lilypondAbsoluteOctaveEntryAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - "- no value here -" << - endl; -} - -//______________________________________________________________________________ -S_lilypondRelativeOctaveEntryAtom lilypondRelativeOctaveEntryAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondRelativeOctaveEntryVariable) -{ - lilypondRelativeOctaveEntryAtom* o = new - lilypondRelativeOctaveEntryAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lpsrOctaveEntryKindVariable, - lilypondRelativeOctaveEntryVariable); - assert(o!=0); - return o; -} - -lilypondRelativeOctaveEntryAtom::lilypondRelativeOctaveEntryAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondRelativeOctaveEntryVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLpsrOctaveEntryKindVariable ( - lpsrOctaveEntryKindVariable), - fMsrSemiTonesPitchAndOctaveVariable ( - lilypondRelativeOctaveEntryVariable) -{} - -lilypondRelativeOctaveEntryAtom::~lilypondRelativeOctaveEntryAtom () -{} - -S_oahValuedAtom lilypondRelativeOctaveEntryAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondRelativeOctaveEntryAtom" << - endl; - } -#endif - - // set octave entry kind at once - fLpsrOctaveEntryKindVariable = kOctaveEntryRelative; - - // an option value is needed - return this; -} - -void lilypondRelativeOctaveEntryAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondRelativeOctaveEntryAtom'" << - endl; - } -#endif - - // theString contains the score output kind: - // is it in the score output kinds map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondRelativeOctaveEntryAtom'" << - endl; - } -#endif - -/* JMI - map::const_iterator - it = - gLpsrOctaveEntryKindsMap.find ( - theString); - - if (it == gLpsrOctaveEntryKindsMap.end ()) { - // no, octave entry kind is unknown in the map - - printOptionsSummary (os); - - stringstream s; - - s << - "octave entry kind '" << theString << - "' is unknown" << - endl << - "The " << - gLpsrOctaveEntryKindsMap.size () << - " known octave entry kinds are:" << - endl; - - gIndenter++; - - s << - existingLpsrOctaveEntryKinds (); - - gIndenter--; - - oahError (s.str ()); - abort (); - } -*/ - - setRelativeOctaveEntryVariableValue ( - msrSemiTonesPitchAndOctave::createFromString ( - K_NO_INPUT_LINE_NUMBER, - theString)); -} - -void lilypondRelativeOctaveEntryAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondRelativeOctaveEntryAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondRelativeOctaveEntryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondRelativeOctaveEntryAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondRelativeOctaveEntryAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondRelativeOctaveEntryAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondRelativeOctaveEntryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondRelativeOctaveEntryAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondRelativeOctaveEntryAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondRelativeOctaveEntryAtom::browseData ()" << - endl; - } -#endif -} - -string lilypondRelativeOctaveEntryAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - fMsrSemiTonesPitchAndOctaveVariable->asString (); - - return s.str (); -} - -string lilypondRelativeOctaveEntryAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - fMsrSemiTonesPitchAndOctaveVariable->asString (); - - return s.str (); -} - -void lilypondRelativeOctaveEntryAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "lilypondRelativeOctaveEntryAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void lilypondRelativeOctaveEntryAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - if (fMsrSemiTonesPitchAndOctaveVariable) { - os << endl; - gIndenter++; - os << - fMsrSemiTonesPitchAndOctaveVariable; - gIndenter--; - } - else { - os << "none" << endl; - } -} - -ostream& operator<< (ostream& os, const S_lilypondRelativeOctaveEntryAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lilypondFixedOctaveEntryAtom lilypondFixedOctaveEntryAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondFixedOctaveEntryVariable) -{ - lilypondFixedOctaveEntryAtom* o = new - lilypondFixedOctaveEntryAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lpsrOctaveEntryKindVariable, - lilypondFixedOctaveEntryVariable); - assert(o!=0); - return o; -} - -lilypondFixedOctaveEntryAtom::lilypondFixedOctaveEntryAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondFixedOctaveEntryVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLpsrOctaveEntryKindVariable ( - lpsrOctaveEntryKindVariable), - fMsrSemiTonesPitchAndOctaveVariable ( - lilypondFixedOctaveEntryVariable) -{} - -lilypondFixedOctaveEntryAtom::~lilypondFixedOctaveEntryAtom () -{} - -S_oahValuedAtom lilypondFixedOctaveEntryAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondFixedOctaveEntryAtom" << - endl; - } -#endif - - // set octave entry kind at once - fLpsrOctaveEntryKindVariable = kOctaveEntryFixed; - - // an option value is needed - return this; -} - -void lilypondFixedOctaveEntryAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondFixedOctaveEntryAtom'" << - endl; - } -#endif - - // theString contains the score output kind: - // is it in the score output kinds map? - - setFixedOctaveEntryVariableValue ( - msrSemiTonesPitchAndOctave::createFromString ( - K_NO_INPUT_LINE_NUMBER, - theString)); -} - -void lilypondFixedOctaveEntryAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondFixedOctaveEntryAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondFixedOctaveEntryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondFixedOctaveEntryAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondFixedOctaveEntryAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondFixedOctaveEntryAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondFixedOctaveEntryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondFixedOctaveEntryAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondFixedOctaveEntryAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondFixedOctaveEntryAtom::browseData ()" << - endl; - } -#endif -} - -string lilypondFixedOctaveEntryAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - fMsrSemiTonesPitchAndOctaveVariable->asString (); - - return s.str (); -} - -string lilypondFixedOctaveEntryAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - fMsrSemiTonesPitchAndOctaveVariable->asString (); - - return s.str (); -} - -void lilypondFixedOctaveEntryAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "lilypondFixedOctaveEntryAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void lilypondFixedOctaveEntryAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - if (fMsrSemiTonesPitchAndOctaveVariable) { - os << endl; - gIndenter++; - os << - fMsrSemiTonesPitchAndOctaveVariable; - gIndenter--; - } - else { - os << "none" << endl; - } -} - -ostream& operator<< (ostream& os, const S_lilypondFixedOctaveEntryAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lilypondAccidentalStyleKindAtom lilypondAccidentalStyleKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrAccidentalStyleKind& - lilypondAccidentalStyleKindVariable) -{ - lilypondAccidentalStyleKindAtom* o = new - lilypondAccidentalStyleKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lilypondAccidentalStyleKindVariable); - assert(o!=0); - return o; -} - -lilypondAccidentalStyleKindAtom::lilypondAccidentalStyleKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrAccidentalStyleKind& - lilypondAccidentalStyleKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLpsrAccidentalStyleKindVariable ( - lilypondAccidentalStyleKindVariable) -{} - -lilypondAccidentalStyleKindAtom::~lilypondAccidentalStyleKindAtom () -{} - -S_oahValuedAtom lilypondAccidentalStyleKindAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondAccidentalStyleKindAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lilypondAccidentalStyleKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondAccidentalStyleKindAtom'" << - endl; - } -#endif - - // theString contains the language name: - // is it in the accidental styles map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondAccidentalStyleKindAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gLpsrAccidentalStyleKindsMap.find ( - theString); - - if (it == gLpsrAccidentalStyleKindsMap.end ()) { - // no, accidental style is unknown in the map - stringstream s; - - s << - "LPSR accidental style '" << theString << - "' is unknown" << - endl << - "The " << - gLpsrAccidentalStyleKindsMap.size () - 1 << - " known LPSR accidental styles are:" << - endl; - - gIndenter++; - - s << - existingLpsrAccidentalStyleKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setLpsrAccidentalStyleKindVariable ( - (*it).second); -} - -void lilypondAccidentalStyleKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondAccidentalStyleKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondAccidentalStyleKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondAccidentalStyleKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondAccidentalStyleKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondAccidentalStyleKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondAccidentalStyleKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondAccidentalStyleKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondAccidentalStyleKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondAccidentalStyleKindAtom::browseData ()" << - endl; - } -#endif -} - -string lilypondAccidentalStyleKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - lpsrAccidentalStyleKindAsString (fLpsrAccidentalStyleKindVariable); - - return s.str (); -} - -string lilypondAccidentalStyleKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - lpsrAccidentalStyleKindAsString (fLpsrAccidentalStyleKindVariable); - - return s.str (); -} - -void lilypondAccidentalStyleKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsAccidentalStyleKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fLpsrAccidentalStyleKindVariable" << " : \"" << - lpsrAccidentalStyleKindAsString ( - fLpsrAccidentalStyleKindVariable) << - "\"" << - endl; - - gIndenter--; -} - -void lilypondAccidentalStyleKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - lpsrAccidentalStyleKindAsString ( - fLpsrAccidentalStyleKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_lilypondAccidentalStyleKindAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lilypondChordsDisplayAtom lilypondChordsDisplayAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - list >& - lilypondChordsDisplayVariable) -{ - lilypondChordsDisplayAtom* o = new - lilypondChordsDisplayAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lilypondChordsDisplayVariable); - assert(o!=0); - return o; -} - -lilypondChordsDisplayAtom::lilypondChordsDisplayAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - list >& - lilypondChordsDisplayVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringsPairListVariable ( - lilypondChordsDisplayVariable) -{} - -lilypondChordsDisplayAtom::~lilypondChordsDisplayAtom () -{} - -S_oahValuedAtom lilypondChordsDisplayAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondChordsDisplayAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lilypondChordsDisplayAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondChordsDisplayAtom'" << - endl; - } -#endif - - /* - % Exception music is chords with markups - #(define (lower-extension pitch chbass) - "Return lowered markup for pitch note name." - #{ - \markup \raise #-1.9 \halign #0.2 - #(note-name->markup pitch chbass) - #}) - - chExceptionMusic = { - 1-\markup { \super {"-7(" {\small\raise #0.5 \flat} "5)"} } - 1-\markup { \super "7" } - 1-\markup { \super {"7(" {\small\raise #0.5 \sharp} "5)"} } - 1-\markup { \super {"7(sus4)"} } - 1-\markup { \super "6/9" } - 1-\markup { \super {"7(" {\small\raise #0.5 \flat} "9)"} } - 1-\markup { \super {"9(sus4)"} } - 1-\markup { \super "9" } - 1-\markup { \super "maj9" } - 1-\markup { \super "9+" } - 1-\markup { \super "9#11" } - 1-\markup { \super "11" } - 1-\markup { \super "13" } - 1-\markup { \super {"13(" {\small\raise #0.5 \sharp} "11)"} } - 1-\markup { \super "6(add9)" } - } - - chExceptions = #(append - (sequential-music-to-chord-exceptions chExceptionMusic #t) - ignatzekExceptions) - - -7b5: - -cd, -chord-display ' \super {"-7(" {\small\raise #0.5 \flat} "5)"}' - */ - - // theString contains a specification such as: - // ' \super {"-7(" {\small\raise #0.5 \flat} "5)"}' - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondChordsDisplayAtom'" << - endl; - } -#endif - - string regularExpression ( - "(<.+>)" - "[[:space:]]+" - "(.+)" - ); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for chords display string '" << theString << - "' with regex '" << regularExpression << - "':" << - endl; - - gIndenter++; - - for (unsigned i = 0; i < smSize; ++i) { - os << - i << ": " << "\"" << sm [i] << "\"" << - endl; - } // for - os << endl; - - gIndenter--; - } -#endif - - if (smSize != 3) { - stringstream s; - - s << - "-chords-display argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string chordContents = sm [1]; - string chordsDisplaycode = sm [2]; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "FAA chordContents = " << - chordContents << - endl << - "chordsDisplaycode = " << - chordsDisplaycode << - endl; - - setStringsPairListVariable ( - make_pair ( - chordContents, chordsDisplaycode)); - } -#endif -} - -void lilypondChordsDisplayAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondChordsDisplayAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondChordsDisplayAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondChordsDisplayAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondChordsDisplayAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondChordsDisplayAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondChordsDisplayAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondChordsDisplayAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondChordsDisplayAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondChordsDisplayAtom::browseData ()" << - endl; - } -#endif -} - -string lilypondChordsDisplayAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - list >::const_iterator - iBegin = fStringsPairListVariable.begin (), - iEnd = fStringsPairListVariable.end (), - i = iBegin; - for ( ; ; ) { - s << - (*i).first << " --> " << (*i).second << - endl; - if (++i == iEnd) break; - s << ","; // JMI - } // for - - return s.str (); -} - -string lilypondChordsDisplayAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - list >::const_iterator - iBegin = fStringsPairListVariable.begin (), - iEnd = fStringsPairListVariable.end (), - i = iBegin; - for ( ; ; ) { - s << - (*i).first << " --> " << (*i).second << - endl; - if (++i == iEnd) break; - s << ","; // JMI - } // for - - return s.str (); -} - -void lilypondChordsDisplayAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "lilypondChordsDisplayAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringsPairListVariable" << " : '" << - endl; - - gIndenter++; - - list >::const_iterator - iBegin = fStringsPairListVariable.begin (), - iEnd = fStringsPairListVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - (*i).first << " --> " << (*i).second << - endl; - if (++i == iEnd) break; -// JMI os << endl; - } // for - - gIndenter--; - - gIndenter--; -} - -void lilypondChordsDisplayAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (fStringsPairListVariable.size ()) { - os << endl; - gIndenter++; - - list >::const_iterator - iBegin = fStringsPairListVariable.begin (), - iEnd = fStringsPairListVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i).first << " --> " << (*i).second; - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - "none"; - } - os << endl; -} - -ostream& operator<< (ostream& os, const S_lilypondChordsDisplayAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lilypondLyricsDurationsKindAtom lilypondLyricsDurationsKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrLyricsDurationsKind& - lilypondLyricsDurationsKindVariable) -{ - lilypondLyricsDurationsKindAtom* o = new - lilypondLyricsDurationsKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lilypondLyricsDurationsKindVariable); - assert(o!=0); - return o; -} - -lilypondLyricsDurationsKindAtom::lilypondLyricsDurationsKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrLyricsDurationsKind& - lilypondLyricsDurationsKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLpsrLyricsDurationsKindVariable ( - lilypondLyricsDurationsKindVariable) -{} - -lilypondLyricsDurationsKindAtom::~lilypondLyricsDurationsKindAtom () -{} - -S_oahValuedAtom lilypondLyricsDurationsKindAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondLyricsDurationsKindAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lilypondLyricsDurationsKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondLyricsDurationsKindAtom'" << - endl; - } -#endif - - // theString contains the language name: - // is it in the lyrics alignment kinds map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondLyricsDurationsKindAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gLpsrLyricsDurationsKindsMap.find ( - theString); - - if (it == gLpsrLyricsDurationsKindsMap.end ()) { - // no, lyrics alignment kind is unknown in the map - stringstream s; - - s << - "LPSR lyrics alignment kind '" << theString << - "' is unknown" << - endl << - "The " << - gLpsrLyricsDurationsKindsMap.size () - 1 << - " known LPSR lyrics alignment kind are:" << - endl; - - gIndenter++; - - s << - existingLpsrLyricsDurationsKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setLpsrLyricsDurationsKindVariable ( - (*it).second); -} - -void lilypondLyricsDurationsKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondLyricsDurationsKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondLyricsDurationsKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondLyricsDurationsKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondLyricsDurationsKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondLyricsDurationsKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondLyricsDurationsKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondLyricsDurationsKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondLyricsDurationsKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondLyricsDurationsKindAtom::browseData ()" << - endl; - } -#endif -} - -string lilypondLyricsDurationsKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - lpsrLyricsDurationsKindAsString (fLpsrLyricsDurationsKindVariable); - - return s.str (); -} - -string lilypondLyricsDurationsKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - lpsrLyricsDurationsKindAsString (fLpsrLyricsDurationsKindVariable); - - return s.str (); -} - -void lilypondLyricsDurationsKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsLyricsDurationsKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fLpsrLyricsDurationsKindVariable" << " : \"" << - lpsrLyricsDurationsKindAsString ( - fLpsrLyricsDurationsKindVariable) << - "\"" << - endl; - - gIndenter--; -} - -void lilypondLyricsDurationsKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - lpsrLyricsDurationsKindAsString ( - fLpsrLyricsDurationsKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_lilypondLyricsDurationsKindAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_lilypondOah gLilypondOah; -S_lilypondOah gLilypondOahUserChoices; -S_lilypondOah gLilypondOahWithDetailedTrace; - -S_lilypondOah lilypondOah::create ( - S_oahHandler handlerUpLink) -{ - lilypondOah* o = new lilypondOah ( - handlerUpLink); - assert(o!=0); - return o; -} - -lilypondOah::lilypondOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "LilyPond", - "hlily", "help-lilypond", - R"(These lilypond control which LilyPond code is generated.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this lilypond group to the lilypond handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeLilypondOah (false); -} - -lilypondOah::~lilypondOah () -{} - -void lilypondOah::initializeIdentificationOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Identification", - "hlpi", "help-lilypond-identification", -R"(These options can be used to enforce values in the generated LilyPond code, -thus overriding the ones that may be present in the MSR data.)", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'identification' monoplex string atom - - S_oahMonoplexStringAtom - identificationMonoplexStringAtom = - oahMonoplexStringAtom::create ( - "Set variable HEADER_VARIABLE in the \\header in the generated LilyPond code.", - "HEADER_VARIABLE", - "STRING"); - - subGroup-> - appendAtomToSubGroup ( - identificationMonoplexStringAtom); - - // MusicXML informations - - S_oahStringAtom - rightsAtom = - oahStringAtom::create ( - "rights", "", -R"(Set the 'rights' to STRING in the LilyPond code \header.)", - "STRING", - "rights", - fRights); - subGroup-> - appendAtomToSubGroup ( - rightsAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - rightsAtom); - - S_oahStringAtom - composerAtom = - oahStringAtom::create ( - "composer", "", -R"(Set the 'composer' to STRING in the LilyPond code \header.)", - "STRING", - "composer", - fComposer); - subGroup-> - appendAtomToSubGroup ( - composerAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - composerAtom); - - S_oahStringAtom - arrangerAtom = - oahStringAtom::create ( - "arranger", "", -R"(Set the 'arranger' to STRING in the LilyPond code \header.)", - "STRING", - "arranger", - fArranger); - subGroup-> - appendAtomToSubGroup ( - arrangerAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - arrangerAtom); - - S_oahStringAtom - poetAtom = - oahStringAtom::create ( - "poet", "", -R"(Set the 'poet' to STRING in the LilyPond code \header.)", - "STRING", - "poet", - fPoet); - subGroup-> - appendAtomToSubGroup ( - poetAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - poetAtom); - - S_oahStringAtom - lyricistAtom = - oahStringAtom::create ( - "lyricist", "", -R"(Set the 'lyricist' to STRING in the LilyPond code \header.)", - "STRING", - "lyricist", - fLyricist); - subGroup-> - appendAtomToSubGroup ( - lyricistAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - lyricistAtom); - - S_oahStringAtom - softwareAtom = - oahStringAtom::create ( - "software", "", -R"(Set the 'software' to STRING in the LilyPond code \header.)", - "STRING", - "software", - fSoftware); - subGroup-> - appendAtomToSubGroup ( - softwareAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - softwareAtom); - - // LilyPond informations - - S_oahStringAtom - dedicationAtom = - oahStringAtom::create ( - "dedication", "", -R"(Set 'dedication' to STRING in the LilyPond code \header.)", - "STRING", - "dedication", - fDedication); - subGroup-> - appendAtomToSubGroup ( - dedicationAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - dedicationAtom); - - S_oahStringAtom - pieceAtom = - oahStringAtom::create ( - "piece", "", -R"(Set 'piece' to STRING in the LilyPond code \header.)", - "STRING", - "piece", - fPiece); - subGroup-> - appendAtomToSubGroup ( - pieceAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - pieceAtom); - - S_oahStringAtom - opusAtom = - oahStringAtom::create ( - "opus", "", -R"(Set 'opus' to STRING in the LilyPond code \header.)", - "STRING", - "opus", - fOpus); - subGroup-> - appendAtomToSubGroup ( - opusAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - opusAtom); - - S_oahStringAtom - titleAtom = - oahStringAtom::create ( - "title", "", -R"(Set 'title' to STRING in the LilyPond code \header.)", - "STRING", - "title", - fTitle); - subGroup-> - appendAtomToSubGroup ( - titleAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - titleAtom); - - S_oahStringAtom - subtitleAtom = - oahStringAtom::create ( - "subtitle", "", -R"(Set 'subtitle' to STRING in the LilyPond code \header.)", - "STRING", - "subTitle", - fSubTitle); - subGroup-> - appendAtomToSubGroup ( - subtitleAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - subtitleAtom); - - S_oahStringAtom - subsubtitleAtom = - oahStringAtom::create ( - "subsubtitle", "", -R"(Set 'subsubtitle' to STRING in the LilyPond code \header.)", - "STRING", - "subSubTitle", - fSubSubTitle); - subGroup-> - appendAtomToSubGroup ( - subsubtitleAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - subsubtitleAtom); - - S_oahStringAtom - instrumentAtom = - oahStringAtom::create ( - "instrument", "", -R"(Set 'instrument' to STRING in the LilyPond code \header.)", - "STRING", - "instrument", - fInstrument); - subGroup-> - appendAtomToSubGroup ( - instrumentAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - instrumentAtom); - - S_oahStringAtom - meterAtom = - oahStringAtom::create ( - "meter", "", -R"(Set 'meter' to STRING in the LilyPond code \header.)", - "STRING", - "meter", - fMeter); - subGroup-> - appendAtomToSubGroup ( - meterAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - meterAtom); - - S_oahStringAtom - taglineAtom = - oahStringAtom::create ( - "tagline", "", -R"(Set 'tagline' to STRING in the LilyPond code \header.)", - "STRING", - "tagline", - fTagline); - subGroup-> - appendAtomToSubGroup ( - taglineAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - taglineAtom); - - S_oahStringAtom - copyrightAtom = - oahStringAtom::create ( - "copyright", "", -R"(Set 'copyright' to STRING in the LilyPond code \header.)", - "STRING", - "copyright", - fCopyright); - subGroup-> - appendAtomToSubGroup ( - copyrightAtom); - identificationMonoplexStringAtom-> - addStringAtom ( - copyrightAtom); -} - -void lilypondOah::initializeEngraversOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Engravers", - "hlpe", "help-lilypond-engravers", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // ambitus engraver - - fAmbitusEngraver = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ambitus", "", -R"(Generate an ambitus range at the beginning of the staves/voices.)", - "ambitusEngraver", - fAmbitusEngraver)); - - // custos engraver - - fCustosEngraver = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "custos", "", -R"(Generate custos at the end of the lines.)", - "custosEngraver", - fCustosEngraver)); -} - -void lilypondOah::initializeClefsKeysTimesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Clefs, keys, times", - "hckt", "help-clefs-keys-times", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // clefs - - fCommentClefChanges = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ccc", "comment-clef-changes", -R"(Comment clef changes in the LilyPond code. -They won't show up in the score, but the information is not lost.)", - "commentClefChanges", - fCommentClefChanges)); - - // keys - - // times - - fNumericalTime = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "numt", "numerical-time", -R"(Generate numerical time signatures, such as '4/4' instead of 'C'.)", - "numericalTime", - fNumericalTime)); -} - -void lilypondOah::initializeNotesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Notes", - "hlpn", "help-lilypond-notes", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // octave entry - - lpsrOctaveEntryKind - octaveEntryKindDefaultValue = - kOctaveEntryAbsolute; // relative is LilyPond's default value - fOctaveEntryKind = octaveEntryKindDefaultValue; - - // leave fOctaveEntrySemiTonesPitchAndOctave equal to nullptr here, - // since \relative without a pitch and absolute octave entry - // can be used in LilyPond, in which case the pitch and actave is: - fSemiTonesPitchAndOctaveDefaultValue = // JMI - msrSemiTonesPitchAndOctave::create ( - // F under middle C, LilyPond default for relative octave entry - kF_Natural_STP, 3); - - subGroup-> - appendAtomToSubGroup ( - lilypondAbsoluteOctaveEntryAtom::create ( - "abs", "absolute", -R"(Use absolute octave entry in the generated LilyPond code.)", - "octaveEntryKind", - fOctaveEntryKind)); - - subGroup-> - appendAtomToSubGroup ( - lilypondRelativeOctaveEntryAtom::create ( - "rel", "relative", - replaceSubstringInString ( -R"(Use relative octave entry reference PITCH_AND_OCTAVE in the generated LilyPond code. -PITCH_AND_OCTAVE is made of a diatonic pitch and an optional sequence of commas or single quotes. -It should be placed between double quotes if it contains single quotes, such as: - -rel "c''". -The default is to use LilyPond's implicit reference 'DEFAULT_VALUE'.)", - "DEFAULT_VALUE", - msrSemiTonesPitchAndOctaveAsLilypondString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - fSemiTonesPitchAndOctaveDefaultValue)), - "PITCH_AND_OCTAVE", - "relativeOctaveEntrySemiTonesPitchAndOctave", - fOctaveEntryKind, - fRelativeOctaveEntrySemiTonesPitchAndOctave)); - - subGroup-> - appendAtomToSubGroup ( - lilypondFixedOctaveEntryAtom::create ( - "fixed", "", -R"(Use fixed octave entry reference PITCH_AND_OCTAVE in the generated LilyPond code. -PITCH_AND_OCTAVE is made of a diatonic pitch and an optional sequence of commas or single quotes. -It should be placed between double quotes if it contains single quotes, such as: - -fixed "c''")", - "PITCH_AND_OCTAVE", - "fixedOctaveEntrySemiTonesPitchAndOctave", - fOctaveEntryKind, - fFixedOctaveEntrySemiTonesPitchAndOctave)); - - // durations - - fAllDurations = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "alldurs", "all-durations", -R"(Generate all LilyPond durations. -By default, a duration equal to preceding one found in the current voice -is omitted for code conciseness.)", - "allDurations", - fAllDurations)); - - // stems - - fStems = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "stems", "", -R"(Generate \stemUp and \stemDown LilyPond commands. -By default, LilyPond will take care of that by itself.)", - "stems", - fStems)); - - // beaming - - fNoAutoBeaming = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "noab", "no-auto-beaming", -R"(Generate '\set Staff.autoBeaming = ##f' in each voice -to prevent LilyPond from handling beams automatically.)", - "noAutoBeaming", - fNoAutoBeaming)); - - fNoBeams = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nbeams", "no-beams", -R"(Don't generate beams in the LilyPond code. -This is handy when the MusicXML data contains beam in vocal voices)", - "noBeams", - fNoBeams)); - - // string numbers - - fRomanStringNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "rsn", "roman-string-numbers", -R"(Generate '\romanStringNumbers' in each voice -for LilyPond to generate roman instead of arabic string numbers.)", - "romanStringNumbers", - fRomanStringNumbers)); - - // open strings - - fAvoidOpenStrings = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "aos", "avoid-open-strings", -R"(Generate '\set TabStaff.restrainOpenStrings = ##t' in each voice -to prevent LilyPond from using open strings.)", - "avoidOpenStrings", - fAvoidOpenStrings)); - - // accidentals - - const lpsrAccidentalStyleKind - lpsrAccidentalStyleKindDefaultValue = - kDefault; // default value - - fAccidentalStyleKind = lpsrAccidentalStyleKindDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - lilypondAccidentalStyleKindAtom::create ( - "as", "accidental-style", // JMI - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(The NUMBER LilyPond accidental styles available are: -ACCIDENTAL_STYLES. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gLpsrAccidentalStyleKindsMap.size ())), - "ACCIDENTAL_STYLES", - existingLpsrAccidentalStyleKinds (K_NAMES_LIST_MAX_LENGTH)), - "DEFAULT_VALUE", - lpsrAccidentalStyleKindAsString ( - lpsrAccidentalStyleKindDefaultValue)), - "STYLE", - "accidentalStyleKind", - fAccidentalStyleKind)); - - // rest measures - - fCompressFullMeasureRests = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "cfmr", "compress-full-measure-rests", -R"(Compress full measure rests instead of generating successive empty measures.)", - "compressFullMeasureRests", - fCompressFullMeasureRests)); - - // input line numbers - - fInputLineNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "iln", "input-line-numbers", - replaceSubstringInString ( -R"(Generate after each note and barline a comment containing -its MusicXML input line number. -This is useful when debugging EXECUTABLE.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "inputLineNumbers", - fInputLineNumbers)); - - // original measure numbers - - fOriginalMeasureNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "omn", "original-measure-numbers", - replaceSubstringInString ( -R"(Generate after each end of measure a comment containing -its original MusicXML measure number. -This is useful for adding line breaks and page breaks, and when debugging EXECUTABLE.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "originalMeasureNumbers", - fOriginalMeasureNumbers)); - - // positions in the measures - - fPositionsInMeasures = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "pim", "positions-in-measures", - replaceSubstringInString ( -R"(Generate after each note and barline a comment containing -its position in the measure. -This is useful when debugging EXECUTABLE.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "positionsInMeasures", - fPositionsInMeasures)); -} - -void lilypondOah::initializeBarsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Bar numbers", - "hlpbn", "help-lilypond-bars-numbers", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // all bar numbers - - fShowAllBarNumbers = boolOptionsInitialValue; - - S_oahBooleanAtom - allBarNumbersAtom = - oahBooleanAtom::create ( - "abn", "all-bar-numbers", -R"(Generate LilyPond code to show all bar numbers.)", - "showAllBarNumbers", - fShowAllBarNumbers); - - subGroup-> - appendAtomToSubGroup (allBarNumbersAtom); - - // all measure numbers - - subGroup-> - appendAtomToSubGroup ( - oahAtomSynonym::create ( - "amn", "all-measure-numbers", -R"(Generate LilyPond code to show all measure numbers. -This option is a synonym to '-abn, -all-bar-numbers'.)", - allBarNumbersAtom)); - - // reset measure number - - subGroup-> - appendAtomToSubGroup ( - oahStringToIntMapAtom::create ( - "rmn", "reset-measure-number", -R"(Generate a '\set Score.currentBarNumber = #NEW' command -at the beginning of measure OLD in the LilyPond code. -RESET_NUMBER_SPEC can be: -'OLD = NEW' -or -"OLD = NEW" . -OLD is the MusicXML original measure number (a string), that can be generated -in the LilyPond code in '| % ...' comments with option '-omn, -original-measure-numbers'. -NEW is a LilyPond (integer) measure number. -This comes in handy when scanning several movements from a single PDF score, -in which case measure numbers are a single sequence. -There can be several occurrences of this option.)", - "RESET_NUMBER_SPEC", - "resetMeasureElementMeasureNumberMap", - fResetMeasureElementMeasureNumberMap)); - - // generate box around bar number - - S_oahIntSetAtom - generateBoxAroundBarNumber = - oahIntSetAtom::create ( - "gbabn", "generate-box-around-bar-number", -R"(Generate a box around LilyPond purist bar number BAR_NUMBER, -where BAR_NUMBER is an integer. -This implies that bar numbers are centered on the bars. -There can be several occurrences of this option.)", - "BAR_NUMBER", - "boxAroundBarNumberSet", - fBoxAroundBarNumberSet); - - subGroup-> - appendAtomToSubGroup (generateBoxAroundBarNumber); -} - -void lilypondOah::initializeLineBreaksOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Line breaks", - "hlplb", "help-lilypond-line-breaks", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // lines - - fIgnoreMusicXMLLineBreaks = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "imlb", "ignore-musicxml-line-breaks", -R"(Ignore the line breaks from the MusicXML input - let LilyPond decide about them.)", - "ignoreMusicXMLLineBreaks", - fIgnoreMusicXMLLineBreaks)); - - fBreakLinesAtIncompleteRightMeasures = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "blairm", "break-lines-at-incomplete-right-measures", -R"(Generate a '\break' command at the end of incomplete right measures -which is handy in popular folk dances and tunes.)", - "breakLinesAtIncompleteRightMeasures", - fBreakLinesAtIncompleteRightMeasures)); - - fSeparatorLineEveryNMeasures = -1; - - subGroup-> - appendAtomToSubGroup ( - oahIntegerAtom::create ( - "slenm", "separator-line-every-n-measures", -R"(Generate an additional separator line for readability every N measures, -where N is a positive integer. -Nothing special is done by default.)", - "N", - "separatorLineEveryNMeasures", - fSeparatorLineEveryNMeasures)); - -/* JMI - subGroup-> - appendAtomToSubGroup ( - oahStringsSetElementAtom::create ( - "blamn", "break-line-after-measure-number", -R"(Generate a '\break' command after measure NUMBER in the LilyPond code. -NUMBER is a MusicXML measure number (a string), to be found in the latter. -This comes in handy when scanning several movements from a single PDF score. -There can be several occurrences of this option.)", - "NUMBER", - "breakLineAfterMeasureNumberSet", - fBreakLineAfterMeasureNumberSet)); - */ -} - -void lilypondOah::initializePageBreaksOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Page breaks", - "hlppb", "help-lilypond-page-breaks", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // pages - - fIgnoreMusicXMLPageBreaks = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "impb", "ignore-musixcml-page-breaks", -R"(Ignore the page breaks from the MusicXML input - let LilyPond decide about them.)", - "ignoreMusicXMLPageBreaks", - fIgnoreMusicXMLPageBreaks)); - - // break page after measure number - -/* JMI - subGroup-> - appendAtomToSubGroup ( - oahStringsSetElementAtom::create ( - "bpamn", "break-page-after-measure-number", -R"(Generate a '\pageBreak' command after measure NUMBER in the LilyPond code. -NUMBER is a MusicXML measure number (a string), to be found in the latter. -This comes in handy when scanning several movements from a single PDF score. -There can be several occurrences of this option.)", - "NUMBER", - "breakPageAfterMeasureNumberSet", - fBreakPageAfterMeasureNumberSet)); - */ -} - -void lilypondOah::initializeStavesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Staves", - "hlps", "helpLilypondStaves", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // tabs - - fModernTab = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "mtab", "modernTab", -R"(Generate '\moderntab' instead of the default '\tab'.)", - "modernTab", - fModernTab)); - - fTabFullNotation = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tfn", "tabFullNotation", -R"(Generate '\tabFullNotation' to obtain more complete tab notation, including note stems.)", - "tabFullNotation", - fTabFullNotation)); - - // staves - - fKeepStaffSize = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "kss", "keep-staff-size", -R"(Use the staff size value found in the MusicXML data.)", - "keepStaffSize", - fKeepStaffSize)); - - // ledger lines - - fKeepStaffSize = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahRGBColorAtom::create ( - "llc", "ledger-lines-color", -R"(Use RGB_COLOR for the ledger lines. -RGB_COLOR should be of the form 'r,g,b', -with r, g and b being float numbers between 0.0 and 1.0 inclusive.)", - "RGB_COLOR", - "ledgerLinesRGBColor", - fLedgerLinesRGBColor, - fLedgerLinesRGBColorHasBeenSet)); -} - -void lilypondOah::initializeChordsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Chords", - "hlpc", "help-lilypond-chordss", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // arpeggios - - fConnectArpeggios = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "conarp", "connect-arpeggios", -R"(Connect arpeggios across piano staves.)", - "connectArpeggios", - fConnectArpeggios)); -} - -void lilypondOah::initializeTupletsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Tuplets", - "hlpt", "help-lilypond-tuplets", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // tuplets - - fIndentTuplets = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "itups", "indent-tuplets", -R"(Indent tuplets notes on a line of their own, -instead of keeping the on one and the same line.)", - "indentTuplets", - fIndentTuplets)); -} - -void lilypondOah::initializeRepeatOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Repeats", - "hlpr", "help-lilypond-repeats", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // repeats - - fKeepRepeatBarlines = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "krbs", "keep-repeat-barlines", -R"(Generate repeats start and and bar lines even though LilyPond would take care of them.)", - "keepRepeatBarlines", - fKeepRepeatBarlines)); - - fRepeatBrackets = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "rbracks", "repeat-brackets", -R"(Generate repeats with brackets instead of regular bar lines.)", - "repeatBrackets", - fRepeatBrackets)); - - fIgnoreRepeatNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "irn", "ignore-repeat-numbers", -R"(Ignore repeats numbers and let LilyPond determine them.)", - "ignoreRepeatNumbers", - fIgnoreRepeatNumbers)); -} - -void lilypondOah::initializeOrnamentsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Ornaments", - "hlporns", "help-lilypond-ornaments", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // ornaments - - fDelayedOrnamentsFraction = rational (1, 2); - - string delayedOrnamentsFractionDefaultValue = - to_string (fDelayedOrnamentsFraction.getNumerator ()) + - "/" + - to_string (fDelayedOrnamentsFraction.getDenominator ()); - - subGroup-> - appendAtomToSubGroup ( - oahRationalAtom::create ( - "dof", "delayed-ornaments-fraction", - replaceSubstringInString ( -R"(Place the delayed turn/reverseturn at the given fraction -between the ornemented note and the next one. -The default is 'DEFAULT_VALUE'.)", - "DEFAULT_VALUE", - delayedOrnamentsFractionDefaultValue), - "NUM/DENOM", - "delayedOrnamentsFraction", - fDelayedOrnamentsFraction)); -} - -void lilypondOah::initializeChordsDisplayOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Chords display", - "hchd", "help-chords-display", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // chords - - subGroup-> - appendAtomToSubGroup ( - lilypondChordsDisplayAtom::create ( - "chd", "chords-display", -/* -Including a closing parenthesis in a raw string: - choose ### as the delimiter so only )###" ends the string: - R"###( - Some Text)" - )###"; -*/ -R"###(Use SPECIFICATION to display chords using LilyPond's chordNameExceptions. -SPECIFICATION should contain a chord contents such as '', -followed by code to display it, for example: - ' \\super {"-7(" {\\small\\raise #0.5 \\flat} "5)"}'. -The LilyPond code has to escape backslashed, thus use '\\' to obtain '\'. -These two elements are passed over to LilyPond verbatim, without any check. -This option can be used any number of times.)###", - "SPECIFICATION", - "chordsDisplayList", - fChordsDisplayList)); - - fJazzChordsDisplay = boolOptionsInitialValue; - - fJazzChordsDisplayLilypondcode = -R"###( 1-\markup { \super {"-7(" {\small\raise #0.5 \flat} "5)"} } - 1-\markup { \super "7" } - 1-\markup { \super {"7(" {\small\raise #0.5 \sharp} "5)"} } - 1-\markup { \super {"7(sus4)"} } - 1-\markup { \super "6/9" } - 1-\markup { \super {"7(" {\small\raise #0.5 \flat} "9)"} } - 1-\markup { \super {"9(sus4)"} } - 1-\markup { \super "9" } - 1-\markup { \super "maj9" } - 1-\markup { \super "9+" } - 1-\markup { \super "9#11" } - 1-\markup { \super "11" } - 1-\markup { \super "13" } - 1-\markup { \super {"13(" {\small\raise #0.5 \sharp} "11)"} } - 1-\markup { \super "6(add9)" })###"; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "jchd", "jazz-chords-display", - replaceSubstringInString ( -R"(Display the chords using LilyPond's chordNameExceptions -and a set of standard specifications to display them, i.e.: -LILYPOND_CODE)", - "LILYPOND_CODE", - fJazzChordsDisplayLilypondcode), - "jazzChordsDisplay", - fJazzChordsDisplay)); -} - -void lilypondOah::initializeLyricsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Lyrics", - "hlyrics", "help-lyrics", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // lyrics alignment - - const lpsrLyricsDurationsKind - lpsrLyricsDurationsKindDefaultValue = - kLyricsDurationsExplicit; // default value - - fLyricsDurationsKind = lpsrLyricsDurationsKindDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - lilypondLyricsDurationsKindAtom::create ( - "ld", "lyrics-durations", // JMI - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(The NUMBER LilyPond lyrics durations STYLEs available are: -LYRICS_DURATIONS_KINDS. -Using 'implicit' prevents the creation of lyrics attached to rests by LilyPond, -use 'explicit' in such cases. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gLpsrLyricsDurationsKindsMap.size ())), - "LYRICS_DURATIONS_KINDS", - existingLpsrLyricsDurationsKinds (K_NAMES_LIST_MAX_LENGTH)), - "DEFAULT_VALUE", - lpsrLyricsDurationsKindAsString ( - lpsrLyricsDurationsKindDefaultValue)), - "STYLE", - "lyricsDurationsKind", - fLyricsDurationsKind)); -} - -void lilypondOah::initializeFontsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Fonts", - "hfonts", "help-fonts", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // fonts - - fJazzFonts = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "jazz", "jazz-fonts", -R"(Use the LilyJazz font for notes, braces, text and chords. -It can be downloaded from https://github.com/OpenLilyPondFonts/lilyjazz. -This font should be installed so that LilyPond can use it, see: -https://github.com/OpenLilyPondFonts/lilyjazz/blob/master/LilyPond-Fonts-Installation-And-Usage.txt.)", - "jazzFonts", - fJazzFonts)); -} - -void lilypondOah::initializeCodeGenerationOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Code generation", - "hlpcg", "help-lilypond-code-generation", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // infos - - fXml2lyInfos = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "xi", "xml2ly-infos", -R"(Generate initial comments showing the compilation date and lilypond.)", - "xml2lyInfos", - fXml2lyInfos)); - - // comments - - fComments = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "com", "comments", -R"(Generate comments showing the structure of the score -such as '% part P_POne (P1).)", - "comments", - fComments)); - - fGlobal = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "global", "", -R"(Generate a 'global' empty variable and place a use of it -at the beginning of all voices.)", - "global", - fGlobal)); - - // display music - - fDisplayMusic = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dm", "display-music", -R"(Place the contents of all voices inside a '\displayMusic' block, -for LilyPond to show its internal representation of the music.)", - "displayMusic", - fDisplayMusic)); - - // LilyPond code - - fNoLilypondCode = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nolpc", "no-lilypond-code", -R"(Don't generate any LilyPond code. -That can be useful if only a summary of the score is needed.)", - "noLilypondCode", - fNoLilypondCode)); - - // LilyPond lyrics - - fNoLilypondLyrics = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "nolpl", "no-lilypond-lyrics", -R"(Don't generate any lyrics in the LilyPond code.)", - "noLilypondLyrics", - fNoLilypondLyrics)); - - // compile date - - fLilypondCompileDate = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "lpcd", "lilypond-compile-date", -R"(Generate code to include the compilation date -when LilyPond creates the score.)", - "lilypondCompileDate", - fLilypondCompileDate)); - - // draft mode - - fDraftMode = boolOptionsInitialValue; - - S_oahBooleanAtom - draftOahBooleanAtom = - oahBooleanAtom::create ( - "draft", "draft-mode", -R"(Generate a difficult to use score -to get only an overview in the resulting PDF file.)", - "draftMode", - fDraftMode); - draftOahBooleanAtom-> - setIsHidden (); - - subGroup-> - appendAtomToSubGroup ( - draftOahBooleanAtom); - - // point and click - - fPointAndClickOff = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "paco", "point-and-clic-off", -R"(Generate \pointAndClickOff at the beginning of the LilyPond code -to reduce the size of the resulting PDF file.)", - "pointAndClickOff", - fPointAndClickOff)); - - // white note heads - - fWhiteNoteHeads = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "wnh", "white-note-heads", -R"(Generate Scheme function 'whiteNoteHeads' -at the beginning of the LilyPond code.)", - "whiteNoteHeads", - fWhiteNoteHeads)); -} - -void lilypondOah::initializeScoreNotationOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Score notation", - "hlpsn", "help-lilypond-score-notation", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // score notation - -// fScoreNotationKind = lilypondOah::kWesternNotation; - // default value - - fJianpu = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "jianpu", "", -R"(Generate the score using jianpu (numbered) notation -instead of the default western notation. -That option needs lilypond-Jianpu to be accessible to LilyPond -(https://github.com/nybbs2003/lilypond-Jianpu/jianpu10a.ly).)", - "jianpu", - fJianpu)); -} - -void lilypondOah::initializeMidiOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Midi", - "hlpm", "help-lilypond-midi", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // midiTempo - - string midiTempoDuration = "4"; - int midiTempoPerSecond = 90; - - fMidiTempo.setMidiTempoDuration (midiTempoDuration); - fMidiTempo.setMidiTempoPerSecond (midiTempoPerSecond); - - string midiTempoDefaultValue = - midiTempoDuration + " = " + to_string (midiTempoPerSecond); - - subGroup-> - appendAtomToSubGroup ( - oahMidiTempoAtom::create ( - "mtempo", "midi-tempo", - replaceSubstringInString ( - replaceSubstringInString ( -R"(Generate a '\tempo' command in the \midi block. -MIDI_TEMPO_SPEC can be: -'DURATION = PER_SECOND' -or -"DURATION = PER_SECOND" . -DURATION is a string such as '8.', and PER_SECOND is an integer. -The single or double quotes are used to allow spaces around the '=' sign, -otherwise they can be dispensed with. -Using double quotes allows for shell variables substitutions, as in: -PER_SECOND=66 -EXECUTABLE -midiTempo "8. ${PER_SECOND}" . -The default is 'DEFAULT_VALUE'.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "DEFAULT_VALUE", - midiTempoDefaultValue), - "MIDI_TEMPO_SPEC", - "midiTempo", - fMidiTempo)); - - // noMidi - - fNoMidi = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "no-midi", "", -R"(Generate the '\midi' block as a comment instead of active code.)", - "noMidi", - fNoMidi)); -} - -void lilypondOah::initializeLilypondOah ( - bool boolOptionsInitialValue) -{ - // identification - // -------------------------------------- - initializeIdentificationOptions ( - boolOptionsInitialValue); - - // engravers - // -------------------------------------- - initializeEngraversOptions ( - boolOptionsInitialValue); - - // time - // -------------------------------------- - initializeClefsKeysTimesOptions ( - boolOptionsInitialValue); - - // notes - // -------------------------------------- - initializeNotesOptions ( - boolOptionsInitialValue); - - // bars - // -------------------------------------- - initializeBarsOptions ( - boolOptionsInitialValue); - - // line breaks - // -------------------------------------- - initializeLineBreaksOptions ( - boolOptionsInitialValue); - - // page breaks - // -------------------------------------- - initializePageBreaksOptions ( - boolOptionsInitialValue); - - // staves - // -------------------------------------- - initializeStavesOptions ( - boolOptionsInitialValue); - - // chords - // -------------------------------------- - initializeChordsOptions ( - boolOptionsInitialValue); - - // tuplets - // -------------------------------------- - initializeTupletsOptions ( - boolOptionsInitialValue); - - // repeats - // -------------------------------------- - initializeRepeatOptions ( - boolOptionsInitialValue); - - // ornaments - // -------------------------------------- - initializeOrnamentsOptions ( - boolOptionsInitialValue); - - // chords display - // -------------------------------------- - initializeChordsDisplayOptions ( - boolOptionsInitialValue); - - // lyrics - // -------------------------------------- - initializeLyricsOptions ( - boolOptionsInitialValue); - - // fonts - // -------------------------------------- - initializeFontsOptions ( - boolOptionsInitialValue); - - // code generation - // -------------------------------------- - initializeCodeGenerationOptions ( - boolOptionsInitialValue); - - // score notation - // -------------------------------------- - initializeScoreNotationOptions ( - boolOptionsInitialValue); - - // midi - // -------------------------------------- - initializeMidiOptions ( - boolOptionsInitialValue); -} - -S_lilypondOah lilypondOah::createCloneWithDetailedTrace () -{ - S_lilypondOah - clone = - lilypondOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the lilypond handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - // identification - // -------------------------------------- - - // MusicXML informations - clone->fRights = - fRights; - clone->fComposer = - fComposer; - clone->fArranger = - fArranger; - clone->fPoet = - fPoet; - clone->fLyricist = - fLyricist; - clone->fSoftware = - fSoftware; - - // LilyPond informations - clone->fDedication = - fDedication; - clone->fPiece = - fPiece; - clone->fOpus = - fOpus; - clone->fTitle = - fTitle; - clone->fSubTitle = - fSubTitle; - clone->fSubSubTitle = - fSubSubTitle; - clone->fInstrument = - fInstrument; - clone->fMeter = - fMeter; - clone->fTagline = - fTagline; - clone->fCopyright = - fCopyright; - - - // engravers - // -------------------------------------- - - clone->fAmbitusEngraver = - fAmbitusEngraver; - clone->fCustosEngraver = - fCustosEngraver; - - - // clefs - // -------------------------------------- - - clone->fCommentClefChanges = - fCommentClefChanges; - - - // times - // -------------------------------------- - - clone->fNumericalTime = - fNumericalTime; - - - // notes - // -------------------------------------- - - clone->fOctaveEntryKind = - fOctaveEntryKind; - - clone->fAllDurations = - fAllDurations; - - clone->fStems = - fStems; - - clone->fNoAutoBeaming = - fNoAutoBeaming; - clone->fNoBeams = - fNoBeams; - - clone->fRomanStringNumbers = - fRomanStringNumbers; - clone->fAvoidOpenStrings = - fAvoidOpenStrings; - - clone->fAccidentalStyleKind = - fAccidentalStyleKind; - - clone->fCompressFullMeasureRests = - fCompressFullMeasureRests; - - clone->fInputLineNumbers = - true; - clone->fOriginalMeasureNumbers = - true; - clone->fPositionsInMeasures = - true; - - - // bars and measures - // -------------------------------------- - - clone->fShowAllBarNumbers = - true; - - clone->fBoxAroundBarNumberSet = - fBoxAroundBarNumberSet; - - - // line breaks - // -------------------------------------- - - clone->fIgnoreMusicXMLLineBreaks = - fIgnoreMusicXMLLineBreaks; - - clone->fBreakLinesAtIncompleteRightMeasures = - fBreakLinesAtIncompleteRightMeasures; - - clone->fSeparatorLineEveryNMeasures = - fSeparatorLineEveryNMeasures; - - - // page breaks - // -------------------------------------- - - clone->fIgnoreMusicXMLPageBreaks = - fIgnoreMusicXMLPageBreaks; - - - // staves - // -------------------------------------- - - clone->fModernTab = - fModernTab; - - clone->fTabFullNotation = - fTabFullNotation; - - - // chords - // -------------------------------------- - - clone->fConnectArpeggios = - fConnectArpeggios; - - - // tuplets - // -------------------------------------- - - clone->fIndentTuplets = - fIndentTuplets; - - - // repeats - // -------------------------------------- - - clone->fKeepRepeatBarlines = - fKeepRepeatBarlines; - clone->fRepeatBrackets = - fRepeatBrackets; - clone->fIgnoreRepeatNumbers = - fIgnoreRepeatNumbers; - - - // ornaments - // -------------------------------------- - - clone->fDelayedOrnamentsFraction = - fDelayedOrnamentsFraction; - - - // chords display - // -------------------------------------- - - clone->fJazzChordsDisplay = - fJazzChordsDisplay; - clone->fJazzChordsDisplayLilypondcode = - fJazzChordsDisplayLilypondcode; - - - // fonts - // -------------------------------------- - - clone->fJazzFonts = - fJazzFonts; - - - // code generation - // -------------------------------------- - - clone->fXml2lyInfos = - fXml2lyInfos; - - clone->fComments = - fComments; - - clone->fGlobal = - fGlobal; - - clone->fDisplayMusic = - fDisplayMusic; - - clone->fNoLilypondCode = - fNoLilypondCode; - - clone->fNoLilypondLyrics = - fNoLilypondLyrics; - - clone->fLilypondCompileDate = - fLilypondCompileDate; - - clone->fDraftMode = - fPointAndClickOff; - - clone->fPointAndClickOff = - fPointAndClickOff; - - clone->fWhiteNoteHeads = - fWhiteNoteHeads; - - - // score notation - // -------------------------------------- - - clone->fJianpu = - fJianpu; - - - // lyrics - // -------------------------------------- - - clone->fLyricsDurationsKind = - fLyricsDurationsKind; - - - // midi - // -------------------------------------- - - clone->fMidiTempo = - fMidiTempo; - - clone->fNoMidi = - fNoMidi; - -// JMI ??? - - clone->fKeepStaffSize = - fKeepStaffSize; - - return clone; -} - -/* JMI -bool lilypondOah::setAccidentalStyleKind (lpsrAccidentalStyleKind accidentalStyleKind) -{ - // is accidentalStyleKind in the accidental styles set? - map::const_iterator - it = - gLpsrAccidentalStyleKindsMap.find (accidentalStyleKind); - - if (it == gLpsrAccidentalStyleKindsMap.end ()) { - // no, accidentalStyleKind is unknown - return false; - } - - fAccidentalStyleKind = it.second; - - return true; -} -*/ - -//______________________________________________________________________________ -void lilypondOah::enforceQuietness () -{} - -//______________________________________________________________________________ -void lilypondOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void lilypondOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lilypondOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lilypondOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lilypondOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lilypondOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lilypondOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -string lilypondOah::scoreNotationKindAsString ( - scoreNotationKind notationKind) -{ - string result; - - switch (notationKind) { - case lilypondOah::kWesternNotation: - result = "western"; - break; - case lilypondOah::kJianpuNotation: - result = "jianpu"; - break; - case lilypondOah::kABCNotation: - result = "abc"; - break; - } // switch - - return result; -} - -void lilypondOah::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << - "The LilyPond lilypond are:" << - endl; - - gIndenter++; - - // identification - // -------------------------------------- - os << - "Identification:" << - endl; - - gIndenter++; - - // MusicXML informations - os << left << - setw (valueFieldWidth) << "rights" << " : " << - fRights << - endl << - - setw (valueFieldWidth) << "composer" << " : " << - fComposer << - endl << - setw (valueFieldWidth) << "arranger" << " : " << - fArranger << - endl << - setw (valueFieldWidth) << "poet" << " : " << - fPoet << - endl << - setw (valueFieldWidth) << "lyricist" << " : " << - fLyricist << - endl << - - setw (valueFieldWidth) << "software" << " : " << - fSoftware << - endl << - - // LilyPond informations - setw (valueFieldWidth) << "dedication" << " : " << - fDedication << - endl << - - setw (valueFieldWidth) << "piece" << " : " << - fPiece << - endl << - setw (valueFieldWidth) << "opus" << " : " << - fOpus << - endl << - - setw (valueFieldWidth) << "title" << " : " << - fTitle << - endl << - setw (valueFieldWidth) << "subTitle" << " : " << - fSubTitle << - endl << - setw (valueFieldWidth) << "subSubTitle" << " : " << - fSubSubTitle << - endl << - - setw (valueFieldWidth) << "instrument" << " : " << - fInstrument << - endl << - - setw (valueFieldWidth) << "meter" << " : " << - fMeter << - endl << - - setw (valueFieldWidth) << "tagline" << " : " << - fTagline << - endl << - - setw (valueFieldWidth) << "copyright" << " : " << - fCopyright << - endl; - - gIndenter--; - - - // engravers - // -------------------------------------- - os << - "Engravers:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "ambitusEngraver" << " : " << - booleanAsString (fAmbitusEngraver) << - endl << - setw (valueFieldWidth) << "custosEngraver" << " : " << - booleanAsString (fCustosEngraver) << - endl; - - gIndenter--; - - - // clefs - // -------------------------------------- - os << - "Clefs:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "commentClefChanges" << " : " << - booleanAsString (fCommentClefChanges) << - endl; - - gIndenter--; - - - // times - // -------------------------------------- - os << - "Times:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "numericalTime" << " : " << - booleanAsString (fNumericalTime) << - endl; - - gIndenter--; - - - // notes - // -------------------------------------- - os << - "Notes:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "octaveEntryKind" << " : " << - lpsrOctaveEntryKindAsString (fOctaveEntryKind) << - endl; - - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - if (fRelativeOctaveEntrySemiTonesPitchAndOctave) { - os << left << - setw (valueFieldWidth) << - "relativeOctaveEntrySemiTonesPitchAndOctave" << " : " << - fRelativeOctaveEntrySemiTonesPitchAndOctave->asString () << - endl; - } - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - if (fFixedOctaveEntrySemiTonesPitchAndOctave) { - os << left << - setw (valueFieldWidth) << - "fixedOctaveEntrySemiTonesPitchAndOctave" << " : " << - fFixedOctaveEntrySemiTonesPitchAndOctave->asString () << - endl; - } - break; - } // switch - - os << left << - setw (valueFieldWidth) << "allDurations" << " : " << - booleanAsString (fAllDurations) << - endl << - - setw (valueFieldWidth) << "stems" << " : " << - booleanAsString (fStems) << - endl << - - setw (valueFieldWidth) << "noAutoBeaming" << " : " << - booleanAsString (fNoAutoBeaming) << - endl << - setw (valueFieldWidth) << "noBeams" << " : " << - booleanAsString (fNoBeams) << - endl << - - setw (valueFieldWidth) << "romanStringNumbers" << " : " << - booleanAsString (fRomanStringNumbers) << - endl << - setw (valueFieldWidth) << "avoidOpenString" << " : " << - booleanAsString (fAvoidOpenStrings) << - endl << - - setw (valueFieldWidth) << "accidentalStyleKind" << " : " << - fAccidentalStyleKind << - endl << - - setw (valueFieldWidth) << "lyricsDurationsKind" << " : " << - lpsrLyricsDurationsKindAsString (fLyricsDurationsKind) << - endl << - - setw (valueFieldWidth) << "compressFullMeasureRests" << " : " << - booleanAsString (fCompressFullMeasureRests) << - endl << - - setw (valueFieldWidth) << "inputLineNumbers" << " : " << - booleanAsString (fInputLineNumbers) << - endl << - - setw (valueFieldWidth) << "originalMeasureNumbers" << " : " << - booleanAsString (fOriginalMeasureNumbers) << - endl << - - setw (valueFieldWidth) << "positionsInMeasures" << " : " << - booleanAsString (fPositionsInMeasures) << - endl; - - gIndenter--; - - - // bars and measures - // -------------------------------------- - os << - "Bars:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "showAllBarNumbers" << " : " << - booleanAsString (fShowAllBarNumbers) << - endl; - - os << left << - setw (valueFieldWidth) << "resetMeasureElementMeasureNumberMap" << " : "; - if (! fResetMeasureElementMeasureNumberMap.size ()) { - os << "empty"; - } - else { - map::const_iterator - iBegin = fResetMeasureElementMeasureNumberMap.begin (), - iEnd = fResetMeasureElementMeasureNumberMap.end (), - i = iBegin; - for ( ; ; ) { - os << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - os << ","; - } // for - } - os << endl; - - os << left << - setw (valueFieldWidth) << "boxAroundBarNumberSet" << " : "; - if (! fBoxAroundBarNumberSet.size ()) { - os << "empty"; - } - else { - set::const_iterator - iBegin = fBoxAroundBarNumberSet.begin (), - iEnd = fBoxAroundBarNumberSet.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << ","; - } // for - } - os << endl; - - gIndenter--; - - - // line breaks - // -------------------------------------- - os << - "Line breaks:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "ignoreMusicXMLLineBreaks" << " : " << - booleanAsString (fIgnoreMusicXMLLineBreaks) << - endl << - - setw (valueFieldWidth) << "breakLinesAtIncompleteRightMeasures" << " : " << - booleanAsString (fBreakLinesAtIncompleteRightMeasures) << - endl << - - setw (valueFieldWidth) << "separatorLineEveryNMeasures" << " : " << - booleanAsString (fSeparatorLineEveryNMeasures) << - endl; - - gIndenter--; - - - // page breaks - // -------------------------------------- - os << - "Page breaks:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "ignoreMusicXMLPageBreaks" << " : " << - booleanAsString (fIgnoreMusicXMLPageBreaks) << - endl; - - gIndenter--; - - - // staves - // -------------------------------------- - os << - "Staves:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "modernTab" << " : " << - booleanAsString (fModernTab) << - endl << - setw (valueFieldWidth) << "tabFullNotation" << " : " << - booleanAsString (fTabFullNotation) << - endl << - - setw (valueFieldWidth) << "keepStaffSize" << " : " << - booleanAsString (fKeepStaffSize) << - endl; - - gIndenter--; - - - // chords - // -------------------------------------- - - os << - "Chords:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "connectArpeggios" << " : " << - booleanAsString (fConnectArpeggios) << - endl; - - gIndenter--; - - - // tuplets - // -------------------------------------- - - os << - "Tuplets:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "indentTuplets" << " : " << - booleanAsString (fIndentTuplets) << - endl; - - gIndenter--; - - - // repeats - // -------------------------------------- - - os << - "Repeats:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "keepRepeatBarlines" << " : " << - booleanAsString (fKeepRepeatBarlines) << - endl << - setw (valueFieldWidth) << "repeatBrackets" << " : " << - booleanAsString (fRepeatBrackets) << - endl << - setw (valueFieldWidth) << "ignoreRepeatNumbers" << " : " << - booleanAsString (fIgnoreRepeatNumbers) << - endl; - - gIndenter--; - - - // ornaments - // -------------------------------------- - - os << - "Ornaments:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "fDelayedOrnamentsFraction" << " : " << - fDelayedOrnamentsFraction << - endl; - - gIndenter--; - - - // chords display - // -------------------------------------- - - os << - "Chords display:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "chordsDisplayList" << " : "; - - if (fChordsDisplayList.size ()) { - os << endl; - - gIndenter++; - - list >::const_iterator - iBegin = fChordsDisplayList.begin (), - iEnd = fChordsDisplayList.end (), - i = iBegin; - - for ( ; ; ) { - os << - gTab << - (*i).first << - " -> " << - (*i).second << - endl; - if (++i == iEnd) break; - // os << endl; - } // for - - gIndenter--; - } - else { - os << - "none"; - } - os << endl; - - os << left << - setw (valueFieldWidth) << "jazzChordsDisplay" << " : " << - booleanAsString (fJazzChordsDisplay) << - endl << - setw (valueFieldWidth) << "jazzChordsDisplayLilypondcode" << " : " << - fJazzChordsDisplayLilypondcode << - endl; - - gIndenter--; - - - // fonts - // -------------------------------------- - - os << - "Fonts:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "jazzFonts" << " : " << - booleanAsString (fJazzFonts) << - endl; - - gIndenter--; - - - // code generation - // -------------------------------------- - - os << - "LilyPond code generation:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "xml2lyInfos" << " : " << - booleanAsString (fXml2lyInfos) << - endl << - - setw (valueFieldWidth) << "comments" << " : " << - booleanAsString (fComments) << - endl << - - setw (valueFieldWidth) << "global" << " : " << - booleanAsString (fGlobal) << - endl << - - setw (valueFieldWidth) << "displayMusic" << " : " << - booleanAsString (fDisplayMusic) << - endl << - - setw (valueFieldWidth) << "noLilypondCode" << " : " << - booleanAsString (fNoLilypondCode) << - endl << - - setw (valueFieldWidth) << "noLilypondLyrics" << " : " << - booleanAsString (fNoLilypondLyrics) << - endl << - - setw (valueFieldWidth) << "lilypondCompileDate" << " : " << - booleanAsString (fLilypondCompileDate) << - endl << - - setw (valueFieldWidth) << "draftMode" << " : " << - booleanAsString (fDraftMode) << - endl << - - setw (valueFieldWidth) << "pointAndClickOff" << " : " << - booleanAsString (fPointAndClickOff) << - endl << - - setw (valueFieldWidth) << "whiteNoteHeads" << " : " << - booleanAsString (fWhiteNoteHeads) << - endl; - - gIndenter--; - - - // score notation - // -------------------------------------- - - os << - "Score notation:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "fJianpu" << " : " << - booleanAsString (fJianpu) << - endl; - - gIndenter--; - - - // midi - // -------------------------------------- - os << - "Midi:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "midiTempo" << " : " << - fMidiTempo.asString () << - endl << - - setw (valueFieldWidth) << "noMidi" << " : " << - booleanAsString (fNoMidi) << - endl; - - gIndenter--; - - gIndenter--; -} - -void lilypondOah::printLilypondOahValues (int fieldWidth) -{ - gLogOstream << - "The LilyPond lilypond are:" << - endl; - - gIndenter++; - - // identification - // -------------------------------------- - gLogOstream << - "Identification:" << - endl; - - gIndenter++; - - // MusicXML informations - gLogOstream << left << - setw (fieldWidth) << "rights" << " : " << - fRights << - endl << - - setw (fieldWidth) << "composer" << " : " << - fComposer << - endl << - setw (fieldWidth) << "arranger" << " : " << - fArranger << - endl << - setw (fieldWidth) << "poet" << " : " << - fPoet << - endl << - setw (fieldWidth) << "lyricist" << " : " << - fLyricist << - endl << - - setw (fieldWidth) << "software" << " : " << - fSoftware << - endl << - - // LilyPond informations - setw (fieldWidth) << "dedication" << " : " << - fDedication << - endl << - - setw (fieldWidth) << "piece" << " : " << - fPiece << - endl << - setw (fieldWidth) << "opus" << " : " << - fOpus << - endl << - - setw (fieldWidth) << "title" << " : " << - fTitle << - endl << - setw (fieldWidth) << "subTitle" << " : " << - fSubTitle << - endl << - setw (fieldWidth) << "subSubTitle" << " : " << - fSubSubTitle << - endl << - setw (fieldWidth) << "instrument" << " : " << - fInstrument << - endl << - setw (fieldWidth) << "meter" << " : " << - fMeter << - endl << - - setw (fieldWidth) << "tagline" << " : " << - fTagline << - endl << - - setw (fieldWidth) << "copyright" << " : " << - fCopyright << - endl; - - gIndenter--; - - - // engravers - // -------------------------------------- - gLogOstream << - "Engravers:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "ambitusEngraver" << " : " << - booleanAsString (fAmbitusEngraver) << - endl << - setw (fieldWidth) << "custosEngraver" << " : " << - booleanAsString (fCustosEngraver) << - endl; - - gIndenter--; - - - // clefs - // -------------------------------------- - gLogOstream << - "Clefs:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "commentClefChanges" << " : " << - booleanAsString (fCommentClefChanges) << - endl; - - gIndenter--; - - - // time - // -------------------------------------- - gLogOstream << - "Times:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "numericalTime" << " : " << - booleanAsString (fNumericalTime) << - endl; - - gIndenter--; - - - // notes - // -------------------------------------- - gLogOstream << - "Notes:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "octaveEntryKind" << " : " << - lpsrOctaveEntryKindAsString (fOctaveEntryKind) << - endl << - - setw (fieldWidth) << "allDurations" << " : " << - booleanAsString (fAllDurations) << - endl << - - setw (fieldWidth) << "stems" << " : " << - booleanAsString (fStems) << - endl << - - setw (fieldWidth) << "noAutoBeaming" << " : " << - booleanAsString (fNoAutoBeaming) << - endl << - setw (fieldWidth) << "noBeams" << " : " << - booleanAsString (fNoBeams) << - endl << - - setw (fieldWidth) << "romanStringNumbers" << " : " << - booleanAsString (fRomanStringNumbers) << - endl << - setw (fieldWidth) << "avoidOpenString" << " : " << - booleanAsString (fAvoidOpenStrings) << - endl << - - setw (fieldWidth) << "accidentalStyleKind" << " : " << - fAccidentalStyleKind << - endl << - - setw (fieldWidth) << "lyricsDurationsKind" << " : " << - lpsrLyricsDurationsKindAsString (fLyricsDurationsKind) << - endl << - - setw (fieldWidth) << "compressFullMeasureRests" << " : " << - booleanAsString (fCompressFullMeasureRests) << - endl << - - setw (fieldWidth) << "inputLineNumbers" << " : " << - booleanAsString (fInputLineNumbers) << - endl << - - setw (fieldWidth) << "originalMeasureNumbers" << " : " << - booleanAsString (fOriginalMeasureNumbers) << - endl << - - setw (fieldWidth) << "notesPositionsInMeasures" << " : " << - booleanAsString (fPositionsInMeasures) << - endl; - - gIndenter--; - - - // bars and measures - // -------------------------------------- - gLogOstream << - "Bars:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "showAllBarNumbers" << " : " << - booleanAsString (fShowAllBarNumbers) << - endl; - - gLogOstream << left << - setw (fieldWidth) << "resetMeasureElementMeasureNumberMap" << " : "; - if (! fResetMeasureElementMeasureNumberMap.size ()) { - gLogOstream << "empty"; - } - else { - map::const_iterator - iBegin = fResetMeasureElementMeasureNumberMap.begin (), - iEnd = fResetMeasureElementMeasureNumberMap.end (), - i = iBegin; - for ( ; ; ) { - gLogOstream << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - gLogOstream << ","; - } // for - } - gLogOstream << endl; - - gLogOstream << left << - setw (fieldWidth) << "boxAroundBarNumberSet" << " : "; - if (! fBoxAroundBarNumberSet.size ()) { - gLogOstream << "empty"; - } - else { - set::const_iterator - iBegin = fBoxAroundBarNumberSet.begin (), - iEnd = fBoxAroundBarNumberSet.end (), - i = iBegin; - for ( ; ; ) { - gLogOstream << (*i); - if (++i == iEnd) break; - gLogOstream << ","; - } // for - } - gLogOstream << endl; - - gIndenter--; - - - // line breaks - // -------------------------------------- - gLogOstream << - "Line breaks:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "ignoreMusicXMLLineBreaks" << " : " << - booleanAsString (fIgnoreMusicXMLLineBreaks) << - endl << - - setw (fieldWidth) << "breakLinesAtIncompleteRightMeasures" << " : " << - booleanAsString (fBreakLinesAtIncompleteRightMeasures) << - endl << - - setw (fieldWidth) << "separatorLineEveryNMeasures" << " : " << - booleanAsString (fSeparatorLineEveryNMeasures) << - endl; - - gIndenter--; - - - // page breaks - // -------------------------------------- - gLogOstream << - "Page breaks:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "ignoreMusicXMLPageBreaks" << " : " << - booleanAsString (fIgnoreMusicXMLPageBreaks) << - endl; - - gIndenter--; - - - // staves - // -------------------------------------- - gLogOstream << - "Staves:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "modernTab" << " : " << - booleanAsString (fModernTab) << - endl << - setw (fieldWidth) << "tabFullNotation" << " : " << - booleanAsString (fTabFullNotation) << - endl; - - gIndenter--; - - - // chords - // -------------------------------------- - - gLogOstream << - "Chords:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "connectArpeggios" << " : " << - booleanAsString (fConnectArpeggios) << - endl; - - gIndenter--; - - - // tuplets - // -------------------------------------- - - gLogOstream << - "Tuplets:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "indentTuplets" << " : " << - booleanAsString (fIndentTuplets) << - endl; - - gIndenter--; - - - // repeats - // -------------------------------------- - - gLogOstream << - "Repeats:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "keepRepeatBarlines" << " : " << - booleanAsString (fKeepRepeatBarlines) << - endl << - setw (fieldWidth) << "repeatBrackets" << " : " << - booleanAsString (fRepeatBrackets) << - endl << - setw (fieldWidth) << "ignoreRepeatNumbers" << " : " << - booleanAsString (fIgnoreRepeatNumbers) << - endl; - - gIndenter--; - - - // ornaments - // -------------------------------------- - - gLogOstream << - "Ornaments:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "fDelayedOrnamentsFraction" << " : " << - fDelayedOrnamentsFraction << - endl; - - gIndenter--; - - - // chords display - // -------------------------------------- - - gLogOstream << - "Chords display:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "jazzChordsDisplay" << " : " << - booleanAsString (fJazzChordsDisplay) << - endl << - setw (fieldWidth) << "jazzChordsDisplayLilypondcode" << " : " << - fJazzChordsDisplayLilypondcode << - endl; - - gIndenter--; - - - // fonts - // -------------------------------------- - - gLogOstream << - "Fonts:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "jazzFonts" << " : " << - booleanAsString (fJazzFonts) << - endl; - - gIndenter--; - - - // code generation - // -------------------------------------- - - gLogOstream << - "LilyPond code generation:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "xml2lyInfos" << " : " << - booleanAsString (fXml2lyInfos) << - endl << - - setw (fieldWidth) << "comments" << " : " << - booleanAsString (fComments) << - endl << - - setw (fieldWidth) << "global" << " : " << - booleanAsString (fGlobal) << - endl << - - setw (fieldWidth) << "displayMusic" << " : " << - booleanAsString (fDisplayMusic) << - endl << - - setw (fieldWidth) << "noLilypondCode" << " : " << - booleanAsString (fNoLilypondCode) << - endl << - - setw (fieldWidth) << "noLilypondLyrics" << " : " << - booleanAsString (fNoLilypondLyrics) << - endl << - - setw (fieldWidth) << "lilypondCompileDate" << " : " << - booleanAsString (fLilypondCompileDate) << - endl << - - setw (fieldWidth) << "draftMode" << " : " << - booleanAsString (fDraftMode) << - endl << - - setw (fieldWidth) << "pointAndClickOff" << " : " << - booleanAsString (fPointAndClickOff) << - endl << - - setw (fieldWidth) << "whiteNoteHeads" << " : " << - booleanAsString (fWhiteNoteHeads) << - endl; - - gIndenter--; - - - // score notation - // -------------------------------------- - - gLogOstream << - "Score notation:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "fJianpu" << " : " << - booleanAsString (fJianpu) << - endl; - - gIndenter--; - - - // midi - // -------------------------------------- - gLogOstream << - "Midi:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "fMidiTempo" << " : " << - fMidiTempo.asString () << - endl << - - setw (fieldWidth) << "noMidi" << " : " << - booleanAsString (fNoMidi) << - endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lilypondOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeLilypondOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing LilyPond lilypond handling" << - endl; - } -#endif - - // create the lilypond variables - // ------------------------------------------------------ - - gLilypondOahUserChoices = lilypondOah::create ( - handler); - assert(gLilypondOahUserChoices != 0); - - gLilypondOah = - gLilypondOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ - -/* JMI - gLilypondOahWithDetailedTrace = - gLilypondOah-> - createCloneWithDetailedTrace (); - */ -} - - -} - - -/* -//______________________________________________________________________________ -S_lilypondBreakPageAfterMeasureNumberAtom lilypondBreakPageAfterMeasureNumberAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& fStringSetVariable) -{ - lilypondBreakPageAfterMeasureNumberAtom* o = new - lilypondBreakPageAfterMeasureNumberAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - fStringSetVariable); - assert(o!=0); - return o; -} - -lilypondBreakPageAfterMeasureNumberAtom::lilypondBreakPageAfterMeasureNumberAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& fStringSetVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringSetVariable ( - fStringSetVariable) -{} - -lilypondBreakPageAfterMeasureNumberAtom::~lilypondBreakPageAfterMeasureNumberAtom () -{} - -S_oahValuedAtom lilypondBreakPageAfterMeasureNumberAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lilypondBreakPageAfterMeasureNumberAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lilypondBreakPageAfterMeasureNumberAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondBreakPageAfterMeasureNumberAtom'" << - endl; - } -#endif - - // theString contains the midi tempo specification - // decipher it to extract duration and perSecond values - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lilypondBreakPageAfterMeasureNumberAtom'" << - endl; - } -#endif - - string regularExpression ( - "[[:space:]]*" - "([[:digit:]]+\\.*)" - "[[:space:]]*" - "=" - "[[:space:]]*" - "([[:digit:]]+)" - "[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for reset measure number string '" << theString << - "' with regex '" << regularExpression << - "':" << - endl; - - gIndenter++; - - for (unsigned i = 0; i < smSize; ++i) { - os << - i << ": " << "\"" << sm [i] << "\"" << - endl; - } // for - os << endl; - - gIndenter--; - } -#endif - - if (smSize != 3) { - stringstream s; - - s << - "-breakPageAfterMeasureNumber argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string musicXMLMeasureNumber = sm [1]; - - int lilypondMeasureNumber; - { - stringstream s; - s << sm [2]; - s >> lilypondMeasureNumber; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "musicXMLMeasureNumber = " << - musicXMLMeasureNumber << - endl << - "lilypondMeasureNumber = " << - lilypondMeasureNumber << - endl; - - fStringSetVariable [musicXMLMeasureNumber] = lilypondMeasureNumber; - } -#endif -} - -void lilypondBreakPageAfterMeasureNumberAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsBreakPageAfterMeasureNumberAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringSetVariable" << " : '" << - endl; - - if (! fStringSetVariable.size ()) { - os << "none"; - } - else { - map::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i).first << " --> " << (*i).second; - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; - - gIndenter--; -} - -void lilypondBreakPageAfterMeasureNumberAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fStringSetVariable.size ()) { - os << - "none" << - endl; - } - else { - os << endl; - gIndenter++; - - map::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - "\"" << - (*i).first << - "\" --> \"" << - (*i).second << - "\"" << - endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_lilypondBreakPageAfterMeasureNumberAtom& elt) -{ - elt->print (os); - return os; -} -*/ - diff --git a/src/lilypond/lilypondOah.h b/src/lilypond/lilypondOah.h deleted file mode 100644 index e58eee079..000000000 --- a/src/lilypond/lilypondOah.h +++ /dev/null @@ -1,1169 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lilypondOah___ -#define ___lilypondOah___ - -#include "oahBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lilypondScoreOutputKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lilypondScoreOutputKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondScoreOutputKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lilypondScoreOutputKindVariable); - - virtual ~lilypondScoreOutputKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setScoreOutputKindVariableValue ( - lpsrScoreOutputKind value) - { fLpsrScoreOutputKindVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrScoreOutputKind& fLpsrScoreOutputKindVariable; -}; -typedef SMARTP S_lilypondScoreOutputKindAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondScoreOutputKindAtom& elt); - -//______________________________________________________________________________ -class lilypondAbsoluteOctaveEntryAtom : public oahAtomWithVariableName -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondAbsoluteOctaveEntryAtom ( - string shortName, - string longName, - string description, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable); - - virtual ~lilypondAbsoluteOctaveEntryAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrOctaveEntryKind& fLpsrOctaveEntryKindVariable; -}; -typedef SMARTP S_lilypondAbsoluteOctaveEntryAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondAbsoluteOctaveEntryAtom& elt); - -//______________________________________________________________________________ -class lilypondRelativeOctaveEntryAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondRelativeOctaveEntryVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondRelativeOctaveEntryAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondRelativeOctaveEntryVariable); - - virtual ~lilypondRelativeOctaveEntryAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setRelativeOctaveEntryVariableValue ( - S_msrSemiTonesPitchAndOctave value) - { - fMsrSemiTonesPitchAndOctaveVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrOctaveEntryKind& fLpsrOctaveEntryKindVariable; - - S_msrSemiTonesPitchAndOctave& - fMsrSemiTonesPitchAndOctaveVariable; -}; -typedef SMARTP S_lilypondRelativeOctaveEntryAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondRelativeOctaveEntryAtom& elt); - -//______________________________________________________________________________ -class lilypondFixedOctaveEntryAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondFixedOctaveEntryVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondFixedOctaveEntryAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrOctaveEntryKind& lpsrOctaveEntryKindVariable, - S_msrSemiTonesPitchAndOctave& lilypondFixedOctaveEntryVariable); - - virtual ~lilypondFixedOctaveEntryAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setFixedOctaveEntryVariableValue ( - S_msrSemiTonesPitchAndOctave value) - { - fMsrSemiTonesPitchAndOctaveVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrOctaveEntryKind& fLpsrOctaveEntryKindVariable; - - S_msrSemiTonesPitchAndOctave& - fMsrSemiTonesPitchAndOctaveVariable; -}; -typedef SMARTP S_lilypondFixedOctaveEntryAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondFixedOctaveEntryAtom& elt); - -//______________________________________________________________________________ -class lilypondAccidentalStyleKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrAccidentalStyleKind& - lilypondAccidentalStyleKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondAccidentalStyleKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrAccidentalStyleKind& - lilypondAccidentalStyleKindVariable); - - virtual ~lilypondAccidentalStyleKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setLpsrAccidentalStyleKindVariable ( - lpsrAccidentalStyleKind value) - { - fLpsrAccidentalStyleKindVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrAccidentalStyleKind& - fLpsrAccidentalStyleKindVariable; -}; -typedef SMARTP S_lilypondAccidentalStyleKindAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondAccidentalStyleKindAtom& elt); - -//______________________________________________________________________________ -class lilypondChordsDisplayAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - list >& - lilypondChordsDisplayVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondChordsDisplayAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - list >& - lilypondChordsDisplayVariable); - - virtual ~lilypondChordsDisplayAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringsPairListVariable ( - pair value) - { - fStringsPairListVariable.push_back (value); - } - - const list >& - getStringsPairListVariable () - { return fStringsPairListVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - list >& - fStringsPairListVariable; -}; -typedef SMARTP S_lilypondChordsDisplayAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondChordsDisplayAtom& elt); - -//______________________________________________________________________________ -class lilypondLyricsDurationsKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrLyricsDurationsKind& - lilypondLyricsDurationsKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondLyricsDurationsKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrLyricsDurationsKind& - lilypondLyricsDurationsKindVariable); - - virtual ~lilypondLyricsDurationsKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setLpsrLyricsDurationsKindVariable ( - lpsrLyricsDurationsKind value) - { - fLpsrLyricsDurationsKindVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrLyricsDurationsKind& - fLpsrLyricsDurationsKindVariable; -}; -typedef SMARTP S_lilypondLyricsDurationsKindAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondLyricsDurationsKindAtom& elt); - -//______________________________________________________________________________ -class lilypondOah : public oahGroup -{ - public: - - // data types - // ------------------------------------------------------ - - enum scoreNotationKind { - kWesternNotation, kJianpuNotation, kABCNotation }; - - static string scoreNotationKindAsString ( - scoreNotationKind notationKind); - - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithDetailedTrace (); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeLilypondOah ( - bool boolOptionsInitialValue); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondOah ( - S_oahHandler handlerUpLink); - - virtual ~lilypondOah (); - - // set and get - // ------------------------------------------------------ - - // JMI bool setAccidentalStyleKind ( - // lpsrAccidentalStyleKind accidentalStyleKind); - - bool setScoreOutputKind ( - string outputKind); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - void initializeIdentificationOptions ( - bool boolOptionsInitialValue); - - void initializeEngraversOptions ( - bool boolOptionsInitialValue); - - void initializeClefsKeysTimesOptions ( - bool boolOptionsInitialValue); - - void initializeNotesOptions ( - bool boolOptionsInitialValue); - - void initializeBarsOptions ( - bool boolOptionsInitialValue); - - void initializeLineBreaksOptions ( - bool boolOptionsInitialValue); - - void initializePageBreaksOptions ( - bool boolOptionsInitialValue); - - void initializeStavesOptions ( - bool boolOptionsInitialValue); - - void initializeChordsOptions ( - bool boolOptionsInitialValue); - - void initializeTupletsOptions ( - bool boolOptionsInitialValue); - - void initializeRepeatOptions ( - bool boolOptionsInitialValue); - - void initializeOrnamentsOptions ( - bool boolOptionsInitialValue); - - void initializeChordsDisplayOptions ( - bool boolOptionsInitialValue); - - void initializeLyricsOptions ( - bool boolOptionsInitialValue); - - void initializeFontsOptions ( - bool boolOptionsInitialValue); - - void initializeCodeGenerationOptions ( - bool boolOptionsInitialValue); - - void initializeScoreNotationOptions ( - bool boolOptionsInitialValue); - - void initializeMidiOptions ( - bool boolOptionsInitialValue); - - void setOctaveEntryKindToAbsolute () // JMI ??? - { - fOctaveEntryKind = - kOctaveEntryAbsolute; - } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printLilypondOahHelp (); - - void printLilypondOahValues (int fieldWidth); - - virtual void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - public: - - // identification - // -------------------------------------- - - // MusicXML informations - string fRights; - string fComposer; - string fArranger; - string fPoet; - string fLyricist; - string fSoftware; - - // LilyPond informations - string fDedication; - string fPiece; - string fOpus; - string fTitle; - string fSubTitle; - string fSubSubTitle; - string fInstrument; - string fMeter; - string fTagline; - string fCopyright; - - - // names - // -------------------------------------- - - - // engravers - // -------------------------------------- - - bool fAmbitusEngraver; - bool fCustosEngraver; - - - // clefs, keys, times - // -------------------------------------- - - bool fCommentClefChanges; - - bool fNumericalTime; - - // notes - // -------------------------------------- - - lpsrOctaveEntryKind fOctaveEntryKind; - - // this is relevant only for relative octave entry kinds - S_msrSemiTonesPitchAndOctave - fRelativeOctaveEntrySemiTonesPitchAndOctave; - // this is relevant only for fixed octave entry kinds - S_msrSemiTonesPitchAndOctave - fFixedOctaveEntrySemiTonesPitchAndOctave; - - S_msrSemiTonesPitchAndOctave - fSemiTonesPitchAndOctaveDefaultValue; - - - bool fAllDurations; - - bool fStems; - - bool fNoAutoBeaming; - bool fNoBeams; - - bool fRomanStringNumbers; - bool fAvoidOpenStrings; - - lpsrAccidentalStyleKind - fAccidentalStyleKind; - - bool fCompressFullMeasureRests; - - bool fInputLineNumbers; - bool fOriginalMeasureNumbers; - bool fPositionsInMeasures; - - - // bars and measures - // -------------------------------------- - - bool fShowAllBarNumbers; - - map fResetMeasureElementMeasureNumberMap; - map fAddEmptyMeasuresAfterMeasureNumberMap; - - set fBoxAroundBarNumberSet; - - - // line breaks - // -------------------------------------- - - bool fIgnoreMusicXMLLineBreaks; - - bool fBreakLinesAtIncompleteRightMeasures; - - int fSeparatorLineEveryNMeasures; - - set fBreakLineAfterMeasureNumberSet; - - // page breaks - // -------------------------------------- - - bool fIgnoreMusicXMLPageBreaks; - - set fBreakPageAfterMeasureNumberSet; - - - // staves - // -------------------------------------- - - bool fModernTab; - bool fTabFullNotation; - - bool fKeepStaffSize; - - msrRGBColor fLedgerLinesRGBColor; // #(rgb-color 1.0 0.9 0.5) - bool fLedgerLinesRGBColorHasBeenSet; - - // chords - // -------------------------------------- - - bool fConnectArpeggios; - - - // tuplets - // -------------------------------------- - - bool fIndentTuplets; - - - // repeats - // -------------------------------------- - - bool fKeepRepeatBarlines; // otherwise let LilyPond do the job - bool fRepeatBrackets; - bool fIgnoreRepeatNumbers; // and let LilyPond do the job - - - // ornaments - // -------------------------------------- - - rational fDelayedOrnamentsFraction; - - - // chords display - // -------------------------------------- - - list > - fChordsDisplayList; - bool fJazzChordsDisplay; - string fJazzChordsDisplayLilypondcode; - - - // fonts - // -------------------------------------- - - bool fJazzFonts; - - - // code generation - // -------------------------------------- - - bool fXml2lyInfos; - - bool fComments; - - bool fGlobal; - - bool fDisplayMusic; - - bool fNoLilypondCode; - - bool fNoLilypondLyrics; - - bool fLilypondCompileDate; - - bool fPointAndClickOff; - - bool fDraftMode; - - bool fWhiteNoteHeads; - - - // score notation - // -------------------------------------- - - // scoreNotationKind fScoreNotationKind; JMI ??? - bool fJianpu; - - - // lyrics alignment - // -------------------------------------- - - lpsrLyricsDurationsKind - fLyricsDurationsKind; - - // midi - // -------------------------------------- - - msrMidiTempo fMidiTempo; - - bool fNoMidi; -}; -typedef SMARTP S_lilypondOah; -EXP ostream& operator<< (ostream& os, const S_lilypondOah& elt); - -EXP extern S_lilypondOah gLilypondOah; -EXP extern S_lilypondOah gLilypondOahUserChoices; -EXP extern S_lilypondOah gLilypondOahWithDetailedTrace; - -// JMI typedef void (lilypondOah::*lilypondOahMethodPtr)(); //MyTypedef is a type! - -/* - It's worth noting that, as of C++11, you could write this expression - as a more legible using statement: - using lilypondOahMethodPtr = void (lilypondOah::*)(); -*/ - -//______________________________________________________________________________ -void initializeLilypondOahHandling ( - S_oahHandler handler); - - -} - - -#endif - - /* JMI ??? - workNumber - workTitle - movementNumber, - movementTitle, - scoreInstrument - miscellaneousField - - partGroupName - partGroupNameDisplayText - partGroupAbbrevation - partGroupInstrumentName - - partID - partMsrName - partName - partAbbrevation - partInstrumentName - partInstrumentAbbreviation - - staffInstrumentName - staffInstrumentAbbreviation - - pickDedication - pickTitle - pickSubTitle - pickSubSubTitle - - pickInstrument - - pickTagline - pickCopyright - */ - - -/* JMI -//______________________________________________________________________________ -class lilypondBreakPageAfterMeasureNumberAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& S_lilypondAbsoluteOctaveEntryAtomtringSetVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lilypondBreakPageAfterMeasureNumberAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& fStringSetVariable); - - virtual ~lilypondBreakPageAfterMeasureNumberAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - const set& getStringSetVariable () - { return fStringSetVariable; } - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - set& fStringSetVariable; -}; -typedef SMARTP S_lilypondBreakPageAfterMeasureNumberAtom; -EXP ostream& operator<< (ostream& os, const S_lilypondBreakPageAfterMeasureNumberAtom& elt); -*/ - -/* - enum { - workNumber - workTitle - movementNumber, - movementTitle, - scoreInstrument - miscellaneousField - - partGroupName - partGroupNameDisplayText - partGroupAbbrevation - partGroupInstrumentName - - partID - partMsrName - partName - partAbbrevation - partInstrumentName - partInstrumentAbbreviation - - staffInstrumentName - staffInstrumentAbbreviation - }; -*/ - diff --git a/src/lilypond/lilypondOah2ManPageGenerator.cpp b/src/lilypond/lilypondOah2ManPageGenerator.cpp deleted file mode 100644 index 645bb5b10..000000000 --- a/src/lilypond/lilypondOah2ManPageGenerator.cpp +++ /dev/null @@ -1,400 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -//#include // setw, setprecision, ... -//#include -//#include - -#include "lilypondOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -lilypondOah2ManPageGenerator::lilypondOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -lilypondOah2ManPageGenerator::~lilypondOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_lilypondScoreOutputKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lilypondScoreOutputKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_lilypondScoreOutputKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lilypondScoreOutputKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_lilypondAbsoluteOctaveEntryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lilypondAbsoluteOctaveEntryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_lilypondAbsoluteOctaveEntryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lilypondAbsoluteOctaveEntryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_lilypondRelativeOctaveEntryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lilypondRelativeOctaveEntryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_lilypondRelativeOctaveEntryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lilypondRelativeOctaveEntryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_lilypondFixedOctaveEntryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lilypondFixedOctaveEntryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_lilypondFixedOctaveEntryAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lilypondFixedOctaveEntryAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_lilypondAccidentalStyleKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lilypondAccidentalStyleKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_lilypondAccidentalStyleKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lilypondAccidentalStyleKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_lilypondChordsDisplayAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lilypondChordsDisplayAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_lilypondChordsDisplayAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lilypondChordsDisplayAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_lilypondLyricsDurationsKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lilypondLyricsDurationsKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_lilypondLyricsDurationsKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lilypondLyricsDurationsKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lilypondOah2ManPageGenerator::visitStart (S_oahMidiTempoAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahMidiTempoAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lilypondOah2ManPageGenerator::visitEnd (S_oahMidiTempoAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahMidiTempoAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/lilypondOah2ManPageGenerator.h b/src/lilypond/lilypondOah2ManPageGenerator.h deleted file mode 100644 index ee8f4de68..000000000 --- a/src/lilypond/lilypondOah2ManPageGenerator.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lilypondOah2ManPageGenerator___ -#define ___lilypondOah2ManPageGenerator___ - -#include "lilypondOah.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class lilypondOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor - -{ - public: - - lilypondOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~lilypondOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_lilypondScoreOutputKindAtom& elt); - virtual void visitEnd (S_lilypondScoreOutputKindAtom& elt); - - virtual void visitStart (S_lilypondAbsoluteOctaveEntryAtom& elt); - virtual void visitEnd (S_lilypondAbsoluteOctaveEntryAtom& elt); - - virtual void visitStart (S_lilypondRelativeOctaveEntryAtom& elt); - virtual void visitEnd (S_lilypondRelativeOctaveEntryAtom& elt); - - virtual void visitStart (S_lilypondFixedOctaveEntryAtom& elt); - virtual void visitEnd (S_lilypondFixedOctaveEntryAtom& elt); - - virtual void visitStart (S_lilypondAccidentalStyleKindAtom& elt); - virtual void visitEnd (S_lilypondAccidentalStyleKindAtom& elt); - - virtual void visitStart (S_lilypondChordsDisplayAtom& elt); - virtual void visitEnd (S_lilypondChordsDisplayAtom& elt); - - virtual void visitStart (S_lilypondLyricsDurationsKindAtom& elt); - virtual void visitEnd (S_lilypondLyricsDurationsKindAtom& elt); - - virtual void visitStart (S_oahMidiTempoAtom& elt); - virtual void visitEnd (S_oahMidiTempoAtom& elt); -}; -typedef SMARTP S_lilypondOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/lpsr.cpp b/src/lilypond/lpsr.cpp deleted file mode 100644 index 4db7da330..000000000 --- a/src/lilypond/lpsr.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - - -#include "lpsr.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -void initializeLPSR () -{ - initializeLPSRBasicTypes (); -} - - -} diff --git a/src/lilypond/lpsr.h b/src/lilypond/lpsr.h deleted file mode 100644 index ab142d860..000000000 --- a/src/lilypond/lpsr.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsr___ -#define ___lpsr___ - -#include "msr.h" - -#include "lpsrComments.h" - -#include "lpsrVarValAssocs.h" - -#include "lpsrScheme.h" - -#include "lpsrHeaders.h" -#include "lpsrPapers.h" -#include "lpsrLayouts.h" - -#include "lpsrBarNumbers.h" - -#include "lpsrContexts.h" -#include "lpsrVariables.h" - -#include "lpsrVoices.h" -#include "lpsrLyrics.h" - -#include "lpsrStaves.h" -#include "lpsrParts.h" -#include "lpsrPartGroups.h" -#include "lpsrBookBlockElements.h" -#include "lpsrScores.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -EXP void initializeLPSR (); - - -} - - -#endif diff --git a/src/lilypond/lpsr2LilypondTranslator.cpp b/src/lilypond/lpsr2LilypondTranslator.cpp deleted file mode 100644 index 59a27003f..000000000 --- a/src/lilypond/lpsr2LilypondTranslator.cpp +++ /dev/null @@ -1,16009 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "lilypondOah.h" - -#include "lpsr2LilypondTranslator.h" - - -using namespace std; - -namespace MusicXML2 -{ - -// for comments highlighting in the generated Lilypond code -const int commentFieldWidth = 30; - -//______________________________________________________________________________ -S_lpsrRepeatDescr lpsrRepeatDescr::create ( - int repeatEndingsNumber) -{ - lpsrRepeatDescr* o = new - lpsrRepeatDescr ( - repeatEndingsNumber); - assert(o!=0); - return o; -} - -lpsrRepeatDescr::lpsrRepeatDescr ( - int repeatEndingsNumber) -{ - fRepeatEndingsNumber = repeatEndingsNumber; - fRepeatEndingsCounter = 0; - - fEndOfRepeatHasBeenGenerated = false; -} - -lpsrRepeatDescr::~lpsrRepeatDescr () -{} - -string lpsrRepeatDescr::repeatDescrAsString () const -{ - stringstream s; - - s << - "fRepeatEndingsNumber = " << - fRepeatEndingsNumber << - ", fRepeatEndingsCounter = " << - fRepeatEndingsCounter << - ", fEndOfRepeatHasBeenGenerated = " << - booleanAsString ( - fEndOfRepeatHasBeenGenerated); - - return s.str (); -} - -void lpsrRepeatDescr::print (ostream& os) const -{ - const int fieldWidth = 29; - - os << left << - setw (fieldWidth) << - "fRepeatEndingsNumber" << " : " << - fRepeatEndingsNumber << - endl << - setw (fieldWidth) << - "fRepeatEndingsCounter" << " : " << - fRepeatEndingsCounter << - endl << - setw (fieldWidth) << - "fEndOfRepeatHasBeenGenerated" << " : " << - fEndOfRepeatHasBeenGenerated << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrRepeatDescr& elt) -{ - elt->print (os); - return os; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::setCurrentOctaveEntryReferenceFromTheLilypondOah () -{ - if (gLilypondOah->fRelativeOctaveEntrySemiTonesPitchAndOctave) { - // option '-rel, -relative' has been used: - fCurrentOctaveEntryReference = - msrNote::createNoteFromSemiTonesPitchAndOctave ( - K_NO_INPUT_LINE_NUMBER, - gLilypondOah->fRelativeOctaveEntrySemiTonesPitchAndOctave); - } - else { - fCurrentOctaveEntryReference = nullptr; - // the first note in the voice will become the initial reference - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - fLogOutputStream << - "setCurrentOctaveEntryReferenceFromTheLilypondOah()" << - ", octaveEntryKind is" << - lpsrOctaveEntryKindAsString (gLilypondOah->fOctaveEntryKind) << - endl << - "Initial fCurrentOctaveEntryReference is "; - - if (fCurrentOctaveEntryReference) { - fLogOutputStream << - "'" << - fCurrentOctaveEntryReference->asString () << - "'"; - } - else { - fLogOutputStream << "none"; - } - fLogOutputStream << endl; - } -#endif -} - -//________________________________________________________________________ -lpsr2LilypondTranslator::lpsr2LilypondTranslator ( - S_lpsrScore lpsrScore, - S_msrOah& msrOpts, - S_lpsrOah& lpsrOpts, - indentedOstream& logOstream, - indentedOstream& lilypondCodeOstream) - : fLogOutputStream ( - logOstream), - fLilypondCodeOstream ( - lilypondCodeOstream) -{ - fMsrOah = msrOpts; - fLpsrOah = lpsrOpts; - - // the LPSR score we're visiting - fVisitedLpsrScore = lpsrScore; - - // inhibit the browsing of measures repeats replicas, - // since Lilypond only needs the repeat measure - fVisitedLpsrScore-> - getMsrScore ()-> - setInhibitMeasuresRepeatReplicasBrowsing (); - -/* JMI - // inhibit the browsing of measures repeat replicas, - // since Lilypond only needs the measure number - fVisitedLpsrScore-> - getMsrScore ()-> - setInhibitRestMeasuresBrowsing (); -*/ - - // header handling - fOnGoingHeader = false; - - // time - fVoiceIsCurrentlySenzaMisura = false; - fOnGoingVoiceCadenza = false; - - // staves - fOnGoingStaff = false; - - // voices - fOnGoingVoice = false; - - // octaves entry - // ------------------------------------------------------ - /* initialize reference is: - mobile in relative mode - unused in absolute mode - fixed in fixed mode - */ - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - setCurrentOctaveEntryReferenceFromTheLilypondOah (); - break; - - case kOctaveEntryAbsolute: - fCurrentOctaveEntryReference = nullptr; - break; - - case kOctaveEntryFixed: - // sanity check - msrAssert ( - gLilypondOah->fFixedOctaveEntrySemiTonesPitchAndOctave != nullptr, - "gLilypondOah->fFixedOctaveEntrySemiTonesPitchAndOctave is null"); - - fCurrentOctaveEntryReference = - msrNote::createNoteFromSemiTonesPitchAndOctave ( - K_NO_INPUT_LINE_NUMBER, - gLilypondOah->fFixedOctaveEntrySemiTonesPitchAndOctave); - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - fLogOutputStream << - "lpsr2LilypondTranslator()" << - ", octaveEntryKind is" << - lpsrOctaveEntryKindAsString (gLilypondOah->fOctaveEntryKind) << - endl << - "Initial fCurrentOctaveEntryReference is "; - - if (fCurrentOctaveEntryReference) { - fLogOutputStream << - "'" << - fCurrentOctaveEntryReference->asString () << - "'"; - } - else { - fLogOutputStream << "none"; - } - fLogOutputStream << endl; - } -#endif - - // harmonies - fOnGoingHarmonyVoice = false; - fPowerChordHaveAlreadyBeenGenerated = false; - - // figured bass - fOnGoingFiguredBassVoice = false; - fCurrentFiguredBassFiguresCounter = 0; - - // repeats - - // rest measures - fRemainingRestMeasuresNumber = 0; - fOnGoingRestMeasures = false; - - // measures - fCurrentVoiceMeasuresCounter = -1; - - // durations - fLastMetWholeNotes = rational (0, 1); - - // notes - fCurrentNotePrinObjectKind = kPrintObjectYes; // default value - fOnGoingNote = false; - - // grace notes - fOnGoingGraceNotesGroup = false; - - // articulations - fCurrentArpeggioDirectionKind = kDirectionNone; - - // stems - fCurrentStemKind = msrStem::kStemNone; - - // double tremolos - - // chords - fOnGoingChord = false; - - // trills - fOnGoingTrillSpanner = false; - - // spanners - fCurrentSpannerPlacementKind = kPlacementNone; - - // stanzas - fGenerateCodeForOngoingNonEmptyStanza = false; - - // score blocks - fOnGoingScoreBlock = false; - - // part group blocks - fNumberOfPartGroupBlocks = -1; - fPartGroupBlocksCounter = 0; - - // part blocks - fNumberOfPartGroupBlockElements = -1; - fPartGroupBlockElementsCounter = 0; - - // staff blocks - fNumberOfStaffBlocksElements = -1; - fStaffBlocksCounter = 0; -}; - -lpsr2LilypondTranslator::~lpsr2LilypondTranslator () -{} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateLilypondCodeFromLpsrScore () -{ - if (fVisitedLpsrScore) { - // browse a msrScore browser - msrBrowser browser (this); - browser.browse (*fVisitedLpsrScore); - } -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::absoluteOctaveAsLilypondString ( - int absoluteOctave) -{ - string result; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLilypondCodeOstream << - endl << - "%{ absoluteOctave = " << absoluteOctave << " %} " << - endl; - } -#endif - - // generate LilyPond absolute octave - switch (absoluteOctave) { - case 0: - result = ",,,"; - break; - case 1: - result = ",,"; - break; - case 2: - result = ","; - break; - case 3: - result = ""; - break; - case 4: - result = "'"; - break; - case 5: - result = "''"; - break; - case 6: - result = "'''"; - break; - case 7: - result = "''''"; - break; - case 8: - result = "'''''"; - break; - default: - { - /* JMI - stringstream s; - - s << - "%{absolute octave " << absoluteOctave << "???%}"; - - result = s.str (); - */ - } - } // switch - - return result; -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::alterationKindAsLilypondString ( - msrAlterationKind alterationKind) -{ - string result; - - switch (alterationKind) { - case kTripleFlat: - result = "TRIPLE-FLAT"; - break; - case kDoubleFlat: - result = "DOUBLE-FLAT"; - break; - case kSesquiFlat: - result = "THREE-Q-FLAT"; - break; - case kFlat: - result = "FLAT"; - break; - case kSemiFlat: - result = "SEMI-FLAT"; - break; - case kNatural: - result = "NATURAL"; - break; - case kSemiSharp: - result = "SEMI-SHARP"; - break; - case kSharp: - result = "SHARP"; - break; - case kSesquiSharp: - result = "THREE-Q-SHARP"; - break; - case kDoubleSharp: - result = "DOUBLE-SHARP"; - break; - case kTripleSharp: - result = "TRIPLE-SHARP"; - break; - case k_NoAlteration: - result = "alteration???"; - break; - } // switch - - return result; -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::lilypondOctaveInRelativeEntryMode ( - S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - - // generate LilyPond octave relative to fCurrentOctaveEntryReference - - // in MusicXML, octave number is 4 for the octave starting with middle C - int noteAbsoluteOctave = - note->getNoteOctave (); - - msrDiatonicPitchKind - noteDiatonicPitchKind = - note-> - noteDiatonicPitchKind ( - inputLineNumber); - - msrDiatonicPitchKind - referenceDiatonicPitchKind = - fCurrentOctaveEntryReference-> - noteDiatonicPitchKind ( - inputLineNumber); - - string - referenceDiatonicPitchKindAsString = - fCurrentOctaveEntryReference-> - noteDiatonicPitchKindAsString ( - inputLineNumber); - - int - referenceAbsoluteOctave = - fCurrentOctaveEntryReference-> - getNoteOctave (); - - /* - If no octave changing mark is used on a pitch, its octave is calculated - so that the interval with the previous note is less than a fifth. - This interval is determined without considering accidentals. - */ - - int - noteAboluteDiatonicOrdinal = - noteAbsoluteOctave * 7 - + - noteDiatonicPitchKind - kC, - - referenceAboluteDiatonicOrdinal = - referenceAbsoluteOctave * 7 - + - referenceDiatonicPitchKind - kC; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - const int fieldWidth = 28; - - fLogOutputStream << left << - "lilypondOctaveInRelativeEntryMode() 1" << - endl << - - setw (fieldWidth) << - "% noteAboluteDiatonicOrdinal" << - " = " << - noteAboluteDiatonicOrdinal << - endl << - - setw (fieldWidth) << - "% referenceDiatonicPitchAsString" << - " = " << - referenceDiatonicPitchKindAsString << - endl << - setw (fieldWidth) << - "% referenceAbsoluteOctave" << - " = " << - referenceAbsoluteOctave << - endl << - setw (fieldWidth) << - "% referenceAboluteDiatonicOrdinal" << - " = " << - referenceAboluteDiatonicOrdinal << - endl << - endl; - } -#endif - - stringstream s; - - // generate the octaves as needed - if (noteAboluteDiatonicOrdinal >= referenceAboluteDiatonicOrdinal) { - noteAboluteDiatonicOrdinal -= 4; - while (noteAboluteDiatonicOrdinal >= referenceAboluteDiatonicOrdinal) { - s << "'"; - noteAboluteDiatonicOrdinal -= 7; - } // while - } - - else { - noteAboluteDiatonicOrdinal += 4; - while (noteAboluteDiatonicOrdinal <= referenceAboluteDiatonicOrdinal) { - s << ","; - noteAboluteDiatonicOrdinal += 7; - } // while - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - fLogOutputStream << - "lilypondOctaveInRelativeEntryMode() 2" << - ", result = " << s.str () << - endl << - endl; - } -#endif - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::lilypondOctaveInFixedEntryMode ( - S_msrNote note) -{ - // generate LilyPond octave relative to fCurrentOctaveEntryReference - - // in MusicXML, octave number is 4 for the octave starting with middle C - - /* - Pitches in fixed octave entry mode only need commas or quotes - when they are above or below fCurrentOctaveEntryReference, - hence when their octave is different that the latter's. - */ - - int - noteAbsoluteOctave = - note->getNoteOctave (); - - int - referenceAbsoluteOctave = - fCurrentOctaveEntryReference-> - getNoteOctave (); - - int absoluteOctavesDifference = - noteAbsoluteOctave - referenceAbsoluteOctave; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - fLogOutputStream << left << - "% noteAbsoluteOctave = " << - noteAbsoluteOctave << - ", referenceAbsoluteOctave = " << - referenceAbsoluteOctave << - ", refabsoluteOctavesDifferenceerenceAbsoluteOctave = " << - absoluteOctavesDifference << - endl; - } -#endif - - stringstream s; - - // generate the octaves as needed - switch (absoluteOctavesDifference) { - case -12: - s << ",,,,,,,,,,,,"; - break; - case -11: - s << ",,,,,,,,,,,"; - break; - case -10: - s << ",,,,,,,,,,"; - break; - case -9: - s << ",,,,,,,,,"; - break; - case -8: - s << ",,,,,,,,"; - break; - case -7: - s << ",,,,,,,"; - break; - case -6: - s << ",,,,,,"; - break; - case -5: - s << ",,,,,"; - break; - case -4: - s << ",,,,"; - break; - case -3: - s << ",,,"; - break; - case -2: - s << ",,"; - break; - case -1: - s << ","; - break; - case 0: - break; - case 1: - s << "'"; - break; - case 2: - s << "''"; - break; - case 3: - s << "'''"; - break; - case 4: - s << "''''"; - break; - case 5: - s << "'''''"; - break; - case 6: - s << "''''''"; - break; - case 7: - s << "'''''''"; - break; - case 8: - s << "''''''''"; - break; - case 9: - s << "'''''''''"; - break; - case 10: - s << "''''''''''"; - break; - case 11: - s << "'''''''''''"; - break; - case 12: - s << "''''''''''''"; - break; - default: - s << "!!!"; - } // switch - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::stringTuningAsLilypondString ( - int inputLineNumber, - S_msrStringTuning stringTuning) -{ - msrDiatonicPitchKind - stringTuningDiatonicPitchKind = - stringTuning-> - getStringTuningDiatonicPitchKind (); - - msrAlterationKind - stringTuningAlterationKind = - stringTuning-> - getStringTuningAlterationKind (); - - int - stringTuningOctave = - stringTuning-> - getStringTuningOctave (); - - // compute the quartertones pitch - msrQuarterTonesPitchKind - quarterTonesPitchKind = - quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - inputLineNumber, - stringTuningDiatonicPitchKind, - stringTuningAlterationKind); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceScordaturas) { - int - getStringTuningNumber = - stringTuning-> - getStringTuningNumber (); - - fLogOutputStream << - endl << - "%getStringTuningNumber = " << - getStringTuningNumber << - endl << - "%stringTuningDiatonicPitchKind = " << - msrDiatonicPitchKindAsString ( - stringTuningDiatonicPitchKind) << - endl << - "%stringTuningAlterationKind = " << - alterationKindAsLilypondString ( - stringTuningAlterationKind) << - endl << - "%stringTuningOctave = " << - stringTuningOctave << - endl << - "%quarterTonesPitchKind = " << - quarterTonesPitchKind << - endl << - "%quarterTonesPitchKindAsString: " << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - quarterTonesPitchKind) << - endl << - endl; - } -#endif - - stringstream s; - - s << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - quarterTonesPitchKind) << - absoluteOctaveAsLilypondString ( - stringTuningOctave); - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::notePitchAsLilypondString ( - S_msrNote note) -{ - stringstream s; - - // should an editorial accidental be generated? - switch (note->getNoteEditorialAccidentalKind ()) { - case msrNote::kNoteEditorialAccidentalYes: - s << - "\\editorialAccidental "; - break; - case msrNote::kNoteEditorialAccidentalNo: - break; - } // switch - - // get the note quarter tones pitch - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind = - note-> - getNoteQuarterTonesPitchKind (); - - // fetch the quarter tones pitch as string - string - quarterTonesPitchKindAsString = - msrQuarterTonesPitchKindAsString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesPitchKind); - - // get the note quarter tones display pitch - msrQuarterTonesPitchKind - noteQuarterTonesDisplayPitchKind = - note-> - getNoteQuarterTonesDisplayPitchKind (); - - // fetch the quarter tones display pitch as string - string - quarterTonesDisplayPitchKindAsString = - msrQuarterTonesPitchKindAsString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesDisplayPitchKind); - - // generate the pitch - s << - quarterTonesPitchKindAsString; - - // in MusicXML, octave number is 4 for the octave - // starting with middle C, LilyPond's c' - int - noteAbsoluteOctave = - note->getNoteOctave (); - - // should an absolute octave be generated? -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - int - noteAbsoluteDisplayOctave = - note->getNoteDisplayOctave (); - - const int fieldWidth = 39; - - fLogOutputStream << left << - "notePitchAsLilypondString() 1" << - endl << - - setw (fieldWidth) << - "% quarterTonesPitchKindAsString" << - " = " << - quarterTonesPitchKindAsString << - endl << - setw (fieldWidth) << - "% quarterTonesDisplayPitchKindAsString" << - " = " << - quarterTonesDisplayPitchKindAsString << - endl << - - setw (fieldWidth) << - "% noteAbsoluteOctave" << - " = " << - noteAbsoluteOctave << - endl << - setw (fieldWidth) << - "% noteAbsoluteDisplayOctave" << - " = " << - noteAbsoluteDisplayOctave << - endl << - - setw (fieldWidth) << - "% line" << - " = " << - note->getInputLineNumber () << - endl; - } -#endif - - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - if (! fCurrentOctaveEntryReference) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - fLogOutputStream << - "notePitchAsLilypondString() 2: fCurrentOctaveEntryReference is null" << - " upon note " << note->asString () << - ", line " << note->getInputLineNumber () << - endl; - } -#endif - - // generate absolute octave - s << - absoluteOctaveAsLilypondString ( - noteAbsoluteOctave); - - // fCurrentOctaveEntryReference will be set to note later - } - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - fLogOutputStream << - "notePitchAsLilypondString() 3: fCurrentOctaveEntryReference is '" << - fCurrentOctaveEntryReference->asString () << - "' upon note " << note->asString () << - ", line " << note->getInputLineNumber () << - endl; - } -#endif - - // generate octave relative to mobile fCurrentOctaveEntryReference - s << - lilypondOctaveInRelativeEntryMode (note); - } - break; - - case kOctaveEntryAbsolute: - // generate LilyPond absolute octave - s << - absoluteOctaveAsLilypondString ( - noteAbsoluteOctave); - break; - - case kOctaveEntryFixed: - // generate octave relative to fixed fCurrentOctaveEntryReference - s << - lilypondOctaveInFixedEntryMode (note); - break; - } // switch - - // should an accidental be generated? JMI this can be fine tuned with cautionary - switch (note->getNoteAccidentalKind ()) { - case msrNote::kNoteAccidentalNone: - break; - default: - s << - "!"; - break; - } // switch - - // should a cautionary accidental be generated? - switch (note->getNoteCautionaryAccidentalKind ()) { - case msrNote::kNoteCautionaryAccidentalYes: - s << - "?"; - break; - case msrNote::kNoteCautionaryAccidentalNo: - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - fLogOutputStream << endl; - } -#endif - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::durationAsLilypondString ( - int inputLineNumber, - rational wholeNotes) -{ - string result; - - bool generateExplicitDuration; - - if (wholeNotes != fLastMetWholeNotes) { - generateExplicitDuration = true; - fLastMetWholeNotes = wholeNotes; - } - else { - generateExplicitDuration = - gLilypondOah->fAllDurations; - } - - if (generateExplicitDuration) { - result = - wholeNotesAsLilypondString ( - inputLineNumber, - wholeNotes); - } - - return result; -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::pitchedRestAsLilypondString ( - S_msrNote note) -{ - stringstream s; - - // get the note quarter tones pitch - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind = - note-> - getNoteQuarterTonesPitchKind (); - - // fetch the quarter tones pitch as string - string - noteQuarterTonesPitchKindAsString = - msrQuarterTonesPitchKindAsString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesPitchKind); - - // get the note quarter tones display pitch - msrQuarterTonesPitchKind - noteQuarterTonesDisplayPitchKind = - note-> - getNoteQuarterTonesDisplayPitchKind (); - - // fetch the quarter tones display pitch as string - string - quarterTonesDisplayPitchKindAsString = - msrQuarterTonesPitchKindAsString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesDisplayPitchKind); - - // generate the display pitch - s << - note-> - noteDisplayPitchKindAsString (); -// note->notePitchAsString (); JMI -// quarterTonesDisplayPitchAsString; - - // should an absolute octave be generated? - int - noteAbsoluteDisplayOctave = - note->getNoteDisplayOctave (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - // in MusicXML, octave number is 4 for the octave starting with middle C - int noteAbsoluteOctave = - note->getNoteOctave (); - - const int fieldWidth = 28; - - fLogOutputStream << left << - "pitchedRestAsLilypondString()" << - endl << - - setw (fieldWidth) << - "% noteQuarterTonesPitchKindAsString" << - " = " << - noteQuarterTonesPitchKindAsString << - endl << - setw (fieldWidth) << - "% quarterTonesDisplayPitch" << - " = " << - quarterTonesDisplayPitchKindAsString << - endl << - - setw (fieldWidth) << - "% noteAbsoluteOctave" << - " = " << - noteAbsoluteOctave << - endl << - setw (fieldWidth) << - "% noteAbsoluteDisplayOctave" << - " = " << - noteAbsoluteDisplayOctave << - endl << - - setw (fieldWidth) << - "% line" << - " = " << - note->getInputLineNumber () << - endl; - } -#endif - - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - // generate LilyPond octave relative to fCurrentOctaveEntryReference - s << - lilypondOctaveInRelativeEntryMode (note); - break; - case kOctaveEntryAbsolute: - // generate LilyPond absolute octave - s << - absoluteOctaveAsLilypondString ( - noteAbsoluteDisplayOctave); - break; - case kOctaveEntryFixed: - // generate LilyPond octave relative to fCurrentOctaveEntryReference - s << - lilypondOctaveInFixedEntryMode (note); - break; - } // switch - - // generate the skip duration - s << - durationAsLilypondString ( - note->getInputLineNumber (), - note-> - getNoteSoundingWholeNotes ()); - - // generate the '\rest' - s << - "\\rest "; - - return s.str (); -} - -void lpsr2LilypondTranslator::generateNoteHeadColor ( - S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - - // note color, unofficial ??? JMI - msrAlphaRGBColor - noteColor = - note->getNoteColor (); - - if (! noteColor.isEmpty ()) { // JMI -// if (gLilypondOah->) { // JMI - // generate code for color RGB - string noteRGB = noteColor.getColorRGB (); - - if (noteRGB.size () == 6) { - string - noteR = noteRGB.substr (0, 2), - noteG = noteRGB.substr (2, 2), - noteB = noteRGB.substr (4, 2); - - // \once \override NoteHead.color = #(map (lambda (x) (/ x 255)) '(#X00 #X00 #XFF)) - - fLilypondCodeOstream << - "\\once \\override NoteHead.color = #(map (lambda (x) (/ x 255)) " - "'(" << - "#X" << noteRGB [0] << noteRGB [1] << - " " << - "#X" << noteRGB [2] << noteRGB [3] << - " " << - "#X" << noteRGB [4] << noteRGB [5] << - "))" << - endl; - } - else { - stringstream s; - - s << - "note RGB color '" << - noteRGB << - "' is ill-formed" << - ", line " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // ignore color alpha - } -} - -void lpsr2LilypondTranslator::generateNoteLigatures ( - S_msrNote note) -{ - list - noteLigatures = - note->getNoteLigatures (); - - if (noteLigatures.size ()) { - list::const_iterator i; - for ( - i=noteLigatures.begin (); - i!=noteLigatures.end (); - i++ - ) { - S_msrLigature ligature = (*i); - - switch (ligature->getLigatureKind ()) { - case msrLigature::kLigatureNone: - break; - - case msrLigature::kLigatureStart: - { - /* - the edge height is relative to the voice, - i.e. a positive value points down in voices 1 and 3 - and it points up in voices 2 and 4, - */ - - // fetch note's voice - S_msrVoice - noteVoice = - note-> - getNoteMeasureUpLink ()-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink (); - - // determine vertical flipping factor - int ligatureVerticalFlippingFactor = 0; - - switch (noteVoice->getRegularVoiceStaffSequentialNumber ()) { - case 1: - case 3: - ligatureVerticalFlippingFactor = 1; - break; - case 2: - case 4: - ligatureVerticalFlippingFactor = -1; - break; - default: - ; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - fLogOutputStream << - "Ligature vertical flipping factore for note '" << - note->asString () << - "' in voice \"" << - noteVoice->getVoiceName () << - "\" is " << - ligatureVerticalFlippingFactor << - ", line " << ligature->getInputLineNumber () << - endl; - } -#endif - - // compute ligature start edge height - const float edgeHeightAbsValue = 0.75; - - float ligatureStartEdgeHeight = 0.0; - - switch (ligature->getLigatureLineEndKind ()) { - case msrLigature::kLigatureLineEndUp: - ligatureStartEdgeHeight = - - ligatureVerticalFlippingFactor * edgeHeightAbsValue; - break; - - case msrLigature::kLigatureLineEndDown: - ligatureStartEdgeHeight = - ligatureVerticalFlippingFactor * edgeHeightAbsValue; - break; - - case msrLigature::kLigatureLineEndBoth: // JMI - ligatureStartEdgeHeight = - - ligatureVerticalFlippingFactor * edgeHeightAbsValue; - break; - - case msrLigature::kLigatureLineEndArrow: // JMI - fLilypondCodeOstream << - "%{ligatureLineEndArrow???%} "; - break; - - case msrLigature::kLigatureLineEndNone: - ligatureStartEdgeHeight = 0; - break; - } // switch - - // fetch ligature's other end - S_msrLigature - ligatureOtherEnd = - ligature-> - getLigatureOtherEndSideLink (); - - // compute ligature end edge height - float ligatureEndEdgeHeight = 0.0; - - switch (ligatureOtherEnd->getLigatureLineEndKind ()) { - case msrLigature::kLigatureLineEndUp: - ligatureEndEdgeHeight = - - ligatureVerticalFlippingFactor * edgeHeightAbsValue; - break; - - case msrLigature::kLigatureLineEndDown: - ligatureEndEdgeHeight = - ligatureVerticalFlippingFactor * edgeHeightAbsValue; - break; - - case msrLigature::kLigatureLineEndBoth: // JMI - ligatureEndEdgeHeight = - - ligatureVerticalFlippingFactor * edgeHeightAbsValue; - break; - - case msrLigature::kLigatureLineEndArrow: // JMI - fLilypondCodeOstream << - "%{ligatureLineEndArrow???%} "; - break; - - case msrLigature::kLigatureLineEndNone: - ligatureEndEdgeHeight = 0; - break; - } // switch - - // generate the code the the edge-height pair of values - fLilypondCodeOstream << - endl << - "\\once \\override Staff.LigatureBracket.edge-height = #'(" << - setprecision (2) << - ligatureStartEdgeHeight << - " . " << - setprecision (2) << - ligatureEndEdgeHeight << - ")" << - " %{ " << - ligature->getInputLineNumber () << - " %}" << - endl; - } - - // generate ligature line type if any - switch (ligature->getLigatureLineTypeKind ()) { - case kLineTypeSolid: - break; - case kLineTypeDashed: - fLilypondCodeOstream << - endl << - "\\once\\override LigatureBracket.style = #'dashed-line" << - endl; - break; - case kLineTypeDotted: - fLilypondCodeOstream << - endl << - "\\once\\override LigatureBracket.style = #'dotted-line" << - endl; - break; - case kLineTypeWavy: - fLilypondCodeOstream << - endl << - "\\once\\override LigatureBracket.style = #'zigzag" << - endl; - break; - } // switch - - fLilypondCodeOstream << "\\[ "; - break; - - case msrLigature::kLigatureContinue: - break; - - case msrLigature::kLigatureStop: - // JMI fLilypondCodeOstream << "\\] "; - break; - } // switch - } // for - } -} - -void lpsr2LilypondTranslator::generateNoteStem ( - S_msrNote note) -{ - S_msrStem - noteStem = - note->getNoteStem (); - - if (noteStem) { - msrStem::msrStemKind noteStemKind; - - if (noteStem) { - noteStemKind = noteStem->getStemKind (); - } - else { - noteStemKind = msrStem::kStemNone; - } - - // handle note stem before printing note itself - switch (note->getNoteKind ()) { - - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: - break; - - case msrNote::kSkipNote: - break; - - case msrNote::kUnpitchedNote: - { - // is this note in a tab staff? - S_msrStaff - noteStaff = - note-> - getNoteMeasureUpLink ()-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink ()-> - getVoiceStaffUpLink (); - - switch (noteStaff->getStaffKind ()) { - case msrStaff::kStaffTablature: - break; - case msrStaff::kStaffHarmony: - break; - case msrStaff::kStaffFiguredBass: - break; - case msrStaff::kStaffDrum: - break; - case msrStaff::kStaffRythmic: // JMI - // should the stem be omitted? - if (note->getNoteIsStemless ()) { - fLilypondCodeOstream << - endl << - "\\stemNeutral "; // JMI ""\\once\\omit Stem "; - - fCurrentStemKind = msrStem::kStemNone; - } - - // should stem direction be generated? - if (noteStemKind != fCurrentStemKind) { - switch (noteStemKind) { - case msrStem::kStemNone: - fLilypondCodeOstream << "\\stemNeutral "; - break; - case msrStem::kStemUp: - fLilypondCodeOstream << "\\stemUp "; - break; - case msrStem::kStemDown: - fLilypondCodeOstream << "\\stemDown "; - break; - case msrStem::kStemDouble: // JMI ??? - break; - } // switch - - fCurrentStemKind = noteStemKind; - } - break; - - case msrStaff::kStaffRegular: - // should the stem be omitted? - if (note->getNoteIsStemless ()) { - fLilypondCodeOstream << - endl << - "\\stemNeutral "; // JMI ""\\once\\omit Stem "; - - fCurrentStemKind = msrStem::kStemNone; - } - - // should stem direction be generated? - if (gLilypondOah->fStems) { - if (noteStemKind != fCurrentStemKind) { - switch (noteStemKind) { - case msrStem::kStemNone: - fLilypondCodeOstream << "\\stemNeutral "; - break; - case msrStem::kStemUp: - fLilypondCodeOstream << "\\stemUp "; - break; - case msrStem::kStemDown: - fLilypondCodeOstream << "\\stemDown "; - break; - case msrStem::kStemDouble: // JMI ??? - break; - } // switch - - fCurrentStemKind = noteStemKind; - } - } - break; - } // switch - } - break; - - case msrNote::kStandaloneNote: - { - // is this note in a tab staff? - S_msrStaff - noteStaff = - note-> - getNoteMeasureUpLink ()-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink ()-> - getVoiceStaffUpLink (); - - switch (noteStaff->getStaffKind ()) { - case msrStaff::kStaffTablature: - break; - case msrStaff::kStaffHarmony: - break; - case msrStaff::kStaffFiguredBass: - break; - case msrStaff::kStaffDrum: - break; - case msrStaff::kStaffRythmic: - break; - - case msrStaff::kStaffRegular: - // should the stem be omitted? - if (note->getNoteIsStemless ()) { - fLilypondCodeOstream << - endl << - "\\stemNeutral "; // JMI ""\\once\\omit Stem "; - - fCurrentStemKind = msrStem::kStemNone; - } - - // should stem direction be generated? - if (gLilypondOah->fStems) { - if (noteStemKind != fCurrentStemKind) { - switch (noteStemKind) { - case msrStem::kStemNone: - fLilypondCodeOstream << "\\stemNeutral "; - break; - case msrStem::kStemUp: - fLilypondCodeOstream << "\\stemUp "; - break; - case msrStem::kStemDown: - fLilypondCodeOstream << "\\stemDown "; - break; - case msrStem::kStemDouble: // JMI ??? - break; - } // switch - - fCurrentStemKind = noteStemKind; - } - } - break; - } // switch - } - break; - - case msrNote::kDoubleTremoloMemberNote: - { - // should the stem be omitted? - if (note->getNoteIsStemless ()) { - fLilypondCodeOstream << - endl << - "\\stemNeutral"; // JMI ""\\once\\omit Stem "; - } - - // should stem direction be generated? - if (gLilypondOah->fStems) { - if (noteStemKind != fCurrentStemKind) { - switch (noteStemKind) { - case msrStem::kStemNone: - fLilypondCodeOstream << "\\stemNeutral "; - break; - case msrStem::kStemUp: - fLilypondCodeOstream << "\\stemUp "; - break; - case msrStem::kStemDown: - fLilypondCodeOstream << "\\stemDown "; - break; - /* JMI - case msrStem::kStemNone: - break; - */ - case msrStem::kStemDouble: // JMI ??? - break; - } // switch - - fCurrentStemKind = noteStemKind; - } - } - } - break; - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - break; - - case msrNote::kChordMemberNote: - // don't omit stems for chord member note JMI - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - break; - } // switch - } -} - -void lpsr2LilypondTranslator::generateNoteHead ( - S_msrNote note) -{ - if (! note->getNoteIsARest ()) { // JMI ??? - msrNote::msrNoteHeadKind - noteHeadKind = - note->getNoteHeadKind (); - - // these tweaks should occur right before the note itself - switch (noteHeadKind) { - case msrNote::kNoteHeadSlash: - fLilypondCodeOstream << "\\tweak style #'slash "; - break; - case msrNote::kNoteHeadTriangle: - fLilypondCodeOstream << "\\tweak style #'triangle "; - break; - case msrNote::kNoteHeadDiamond: - // JMI fLilypondCodeOstream << "\\tweak style #'diamond "; - fLilypondCodeOstream << "\\harmonic "; - break; - case msrNote::kNoteHeadSquare: - fLilypondCodeOstream << "\\tweak style #'la "; - break; - case msrNote::kNoteHeadCross: - fLilypondCodeOstream << "\\tweak style #'cross "; - break; - case msrNote::kNoteHeadX: - fLilypondCodeOstream << "\\tweak style #'cross %{x%} "; - break; - case msrNote::kNoteHeadCircleX: - fLilypondCodeOstream << "\\tweak style #'xcircle "; - break; - case msrNote::kNoteHeadInvertedTriangle: - fLilypondCodeOstream << "%{kNoteHeadInvertedTriangle%} "; - break; - case msrNote::kNoteHeadArrowDown: - fLilypondCodeOstream << "%{kNoteHeadArrowDown%} "; - break; - case msrNote::kNoteHeadArrowUp: - fLilypondCodeOstream << "%{kNoteHeadArrowUp%} "; - break; - case msrNote::kNoteHeadSlashed: - fLilypondCodeOstream << "%{kNoteHeadSlashed%} "; - break; - case msrNote::kNoteHeadBackSlashed: - fLilypondCodeOstream << "%{kNoteHeadBackSlashed%} "; - break; - case msrNote::kNoteHeadNormal: - // JMI fLilypondCodeOstream << "%{kNoteHeadNormal%} "; - break; - case msrNote::kNoteHeadCluster: - fLilypondCodeOstream << "%{kNoteHeadCluster%} "; - break; - case msrNote::kNoteHeadCircleDot: - fLilypondCodeOstream << "%{kNoteHeadCircleDot%} "; - break; - case msrNote::kNoteHeadLeftTriangle: - fLilypondCodeOstream << "%{kNoteHeadLeftTriangle%} "; - break; - case msrNote::kNoteHeadRectangle: - fLilypondCodeOstream << "%{kNoteHeadRectangle%} "; - break; - case msrNote::kNoteHeadNone: - fLilypondCodeOstream << "\\once\\omit NoteHead "; - break; - case msrNote::kNoteHeadDo: - fLilypondCodeOstream << "\\tweak style #'do "; - break; - case msrNote::kNoteHeadRe: - fLilypondCodeOstream << "\\tweak style #'re "; - break; - case msrNote::kNoteHeadMi: - fLilypondCodeOstream << "\\tweak style #'mi "; - break; - case msrNote::kNoteHeadFa: - fLilypondCodeOstream << "\\tweak style #'fa "; - break; - case msrNote::kNoteHeadFaUp: - fLilypondCodeOstream << "\\tweak style #'triangle "; - break; - case msrNote::kNoteHeadSo: - fLilypondCodeOstream << "\\tweak style #'sol "; - break; - case msrNote::kNoteHeadLa: - fLilypondCodeOstream << "\\tweak style #'la "; - break; - case msrNote::kNoteHeadTi: - fLilypondCodeOstream << "\\tweak style #'ti "; - break; - } // switch - } -} - -void lpsr2LilypondTranslator::generateCodeBeforeNote ( - S_msrNote note) -{ - // print the note head color - generateNoteHeadColor (note); - - // print the note ligatures if any - list - noteLigatures = - note->getNoteLigatures (); - - if (noteLigatures.size ()) { - generateNoteLigatures (note); - } - - // print note stem kind - S_msrStem - noteStem = - note->getNoteStem (); - - if (noteStem) { - generateNoteStem (note); - } - - // handling note head - generateNoteHead (note); -} - -void lpsr2LilypondTranslator::generateCodeForNote ( - S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - - //////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////// - // print the note itself - //////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////// - - switch (note->getNoteKind ()) { - - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: - { - // get pitched rest status - bool noteIsAPitchedRest = - note->noteIsAPitchedRest (); - - if (noteIsAPitchedRest) { - // pitched rest - fLilypondCodeOstream << - pitchedRestAsLilypondString (note); - - // this note is the new relative octave reference - // (the display quarter tone pitch and octave - // have been copied to the note octave - // in the msrNote::msrNote () constructor, - // since the note octave is used in relative code generation) - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - } - - else { - // unpitched rest - // get the note sounding whole notes - rational - noteSoundingWholeNotes = - note->getNoteSoundingWholeNotes (); - - // print the rest name and duration - if (note->getNoteOccupiesAFullMeasure ()) { - fLilypondCodeOstream << - "R%{1%}" << - /* JMI - restMeasuresWholeNoteAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes); - */ - wholeNotesAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes); - } - - else { - fLilypondCodeOstream << - "r%{2%}" << - durationAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes); - -/* JMI BOF - if (fOnGoingVoiceCadenza) { // JMI - if (noteSoundingWholeNotes != rational (1, 1)) { - / * JMI - // force the generation of the duration if needed - if (! gLilypondOah->fAllDurations) { - fLilypondCodeOstream << // JMI - wholeNotesAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes); - } - * / - - // generate the multiplying factor - fLilypondCodeOstream << // JMI - "*" << - noteSoundingWholeNotes << - ""; - } - } - */ - } - - // an unpitched rest is no relative octave reference, - // the preceding one is kept - } - } - break; - - case msrNote::kSkipNote: - // print the skip name - fLilypondCodeOstream << "s%{1%}"; - - // print the skip duration - fLilypondCodeOstream << - durationAsLilypondString ( - inputLineNumber, - note-> - getNoteSoundingWholeNotes ()); - - // a rest is no relative octave reference, - // the preceding one is kept - break; - - case msrNote::kUnpitchedNote: - { - // print the note name, "e" by convention - fLilypondCodeOstream << - "e"; - - rational - noteSoundingWholeNotes = - note-> - getNoteSoundingWholeNotes (); - - // print the note duration - fLilypondCodeOstream << - durationAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes); - - // handle delayed ornaments if any - if (note->getNoteDelayedTurnOrnament ()) { - // c2*2/3 ( s2*1/3\turn) JMI - // we need the explicit duration in all cases, - // regardless of gGeneralOah->fAllDurations - fLilypondCodeOstream << - wholeNotesAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes) << - "*" << - gLilypondOah->fDelayedOrnamentsFraction; - } - -/* JMI - // print the tie if any - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - " ~ %{kUnpitchedNote%}"; // JMI spaces??? - } - } - } - */ - } - break; - - case msrNote::kStandaloneNote: - { - // print the note name - fLilypondCodeOstream << - notePitchAsLilypondString (note); - - rational - noteSoundingWholeNotes = - note-> - getNoteSoundingWholeNotes (); - - // print the note duration - fLilypondCodeOstream << - durationAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes); - - // handle delayed ornaments if any - if (note->getNoteDelayedTurnOrnament ()) { - // c2*2/3 ( s2*1/3\turn) JMI - // we need the explicit duration in all cases, - // regardless of gGeneralOah->fAllDurations - fLilypondCodeOstream << - //* JMI TOO MUCH - wholeNotesAsLilypondString ( - inputLineNumber, - noteSoundingWholeNotes) << - //*/ - "*" << - gLilypondOah->fDelayedOrnamentsFraction; - } - - // print the tie if any - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - // fLilypondCodeOstream << " ~ %{kStandaloneNote%}"; // JMI - } - } - } - - // this note is the new relative octave reference - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - } - break; - - case msrNote::kDoubleTremoloMemberNote: - // print the note name - fLilypondCodeOstream << - notePitchAsLilypondString (note); - - // print the note duration - fLilypondCodeOstream << - wholeNotesAsLilypondString ( - inputLineNumber, - note->getNoteSoundingWholeNotes ()); - - // handle delayed ornaments if any - if (note->getNoteDelayedTurnOrnament ()) { - // c2*2/3 ( s2*1/3\turn JMI - fLilypondCodeOstream << - "*" << - gLilypondOah->fDelayedOrnamentsFraction; - } - -/* JMI - // print the tie if any - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - " ~ %{kDoubleTremoloMemberNote%}"; - } - } - } -*/ - - // this note is the new relative octave reference - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - break; - - case msrNote::kGraceNote: - // print the note name - fLilypondCodeOstream << - notePitchAsLilypondString (note); - - // print the grace note's graphic duration - fLilypondCodeOstream << - msrDurationKindAsString ( - note-> - getNoteGraphicDurationKind ()); - - // print the dots if any JMI ??? - for (int i = 0; i < note->getNoteDotsNumber (); i++) { - fLilypondCodeOstream << "."; - } // for - - // don't print the tie if any, 'acciacattura takes care of it - /* - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - "~ %{kGraceNote%}"; - } - } - } - */ - - // this note is the new relative octave reference - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - break; - - case msrNote::kGraceChordMemberNote: - // print the note name - fLilypondCodeOstream << - notePitchAsLilypondString (note); - - // dont't print the grace note's graphic duration - - // print the dots if any JMI ??? - for (int i = 0; i < note->getNoteDotsNumber (); i++) { - fLilypondCodeOstream << "."; - } // for - - // don't print the tie if any, 'acciacattura takes care of it - /* - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - "~ %{kGraceChordMemberNote%}"; - } - } - } - */ - - // inside chords, a note is relative to the preceding one - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - break; - - case msrNote::kChordMemberNote: - { - // print the note name - fLilypondCodeOstream << - notePitchAsLilypondString (note); - - // don't print the note duration, - // it will be printed for the chord itself - - // don't print the string number if any, - // it should appear after the chord itself - const list& - chordMemberNoteTechnicalsWithIntegers = - note->getNoteTechnicalWithIntegers (); - - if (chordMemberNoteTechnicalsWithIntegers.size ()) { - list::const_iterator i; - for ( - i=chordMemberNoteTechnicalsWithIntegers.begin (); - i!=chordMemberNoteTechnicalsWithIntegers.end (); - i++ - ) { - S_msrTechnicalWithInteger - technicalWithInteger = (*i); - - switch (technicalWithInteger->getTechnicalWithIntegerKind ()) { - case msrTechnicalWithInteger::kFingering: - break; - case msrTechnicalWithInteger::kFret: - break; - case msrTechnicalWithInteger::kString: - if (fOnGoingChord) { - fPendingChordMemberNotesStringNumbers.push_back ( - technicalWithInteger-> - getTechnicalWithIntegerValue ()); - } - break; - } // switch - } // for - } - - // inside chords, a note is relative to the preceding one - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - } - break; - - case msrNote::kTupletMemberNote: - if (gLilypondOah->fIndentTuplets) { - fLilypondCodeOstream << endl; - } - - // print the note name - if (note->getNoteIsARest ()) { - fLilypondCodeOstream << - string ( - note->getNoteOccupiesAFullMeasure () - ? "s%{2%}" // JMI ??? "R" - : "r%{3%}"); - } - else { - fLilypondCodeOstream << - notePitchAsLilypondString (note); - } - - // print the note display duration - fLilypondCodeOstream << - durationAsLilypondString ( - inputLineNumber, - note-> - getNoteDisplayWholeNotes ()); - -/* JMI - // print the tie if any - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - "~ %{kTupletMemberNote%}"; // JMI spaces??? - } - } - } -*/ - - // a rest is no relative octave reference, - if (! note->getNoteIsARest ()) { - // this note is the new relative octave reference - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - } - break; - - case msrNote::kGraceTupletMemberNote: - if (gLilypondOah->fIndentTuplets) { - fLilypondCodeOstream << endl; - } - - // print the note name - if (note->getNoteIsARest ()) { - fLilypondCodeOstream << - string ( - note->getNoteOccupiesAFullMeasure () - ? "R%{4%}" - : "r%{5%}"); - } - else { - fLilypondCodeOstream << - notePitchAsLilypondString (note); - } - - // print the note display duration - fLilypondCodeOstream << - durationAsLilypondString ( - inputLineNumber, - note-> - getNoteDisplayWholeNotes ()); - - // print the tie if any - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - "~ %{kGraceTupletMemberNote%}"; // JMI spaces??? - } - } - } - - // this note is no new relative octave reference JMI ??? - // this note is the new relative octave reference - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = note; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - break; - - case msrNote::kTupletMemberUnpitchedNote: - if (gLilypondOah->fIndentTuplets) { - fLilypondCodeOstream << endl; - } - - // print the note name - fLilypondCodeOstream << - "e"; // by convention - - // print the note (display) duration - fLilypondCodeOstream << - durationAsLilypondString ( - inputLineNumber, - note-> - getNoteDisplayWholeNotes ()); - -/* JMI - // print the tie if any - { - S_msrTie noteTie = note->getNoteTie (); - - if (noteTie) { - if (noteTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - "~ %{kTupletMemberUnpitchedNote%}"; - } - } - } - */ - break; - } // switch - - fLilypondCodeOstream << ' '; -} - -void lpsr2LilypondTranslator::generateCodeAfterNote ( - S_msrNote note) -{ -} -//________________________________________________________________________ -/* JMI -string lpsr2LilypondTranslator::durationAsExplicitLilypondString ( - int inputLineNumber, - rational wholeNotes) -{ - string result; - - result = - wholeNotesAsLilypondString ( - inputLineNumber, - wholeNotes); - - return result; -} -*/ - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateNoteArticulation ( - S_msrArticulation articulation) -{ - // should the placement be generated? - bool doGeneratePlacement = true; - - // generate note articulation preamble if any - switch (articulation->getArticulationKind ()) { - case msrArticulation::kAccent: - break; - case msrArticulation::kBreathMark: - doGeneratePlacement = false; - break; - case msrArticulation::kCaesura: - doGeneratePlacement = false; - break; - case msrArticulation::kSpiccato: - doGeneratePlacement = false; - break; - case msrArticulation::kStaccato: - doGeneratePlacement = true; - break; - case msrArticulation::kStaccatissimo: - doGeneratePlacement = true; - break; - case msrArticulation::kStress: - doGeneratePlacement = false; - break; - case msrArticulation::kUnstress: - doGeneratePlacement = false; - break; - case msrArticulation::kDetachedLegato: - doGeneratePlacement = true; - break; - case msrArticulation::kStrongAccent: - doGeneratePlacement = true; - break; - case msrArticulation::kTenuto: - doGeneratePlacement = true; - break; - - case msrArticulation::kFermata: - doGeneratePlacement = true; - break; - - case msrArticulation::kArpeggiato: - // this is handled in chordArticulationAsLilyponString () - doGeneratePlacement = false; - break; - case msrArticulation::kNonArpeggiato: - // this is handled in chordArticulationAsLilyponString () - doGeneratePlacement = false; - break; - - case msrArticulation::kDoit: - doGeneratePlacement = true; - break; - case msrArticulation::kFalloff: - doGeneratePlacement = true; - break; - case msrArticulation::kPlop: - doGeneratePlacement = false; - break; - case msrArticulation::kScoop: - doGeneratePlacement = false; - break; - } // switch - - if (doGeneratePlacement) { - switch (articulation->getArticulationPlacementKind ()) { - case kPlacementNone: - fLilypondCodeOstream << "-"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - } - - // generate note articulation itself - switch (articulation->getArticulationKind ()) { - case msrArticulation::kAccent: - fLilypondCodeOstream << ">"; - break; - case msrArticulation::kBreathMark: - fLilypondCodeOstream << "\\breathe"; - break; - case msrArticulation::kCaesura: - /* JMI - fLilypondCodeOstream << - endl << - R"(\once\override BreathingSign.text = \markup {\musicglyph #"scripts.caesura.straight"} \breathe)" << - endl; - */ - fLilypondCodeOstream << - endl << - "\\override BreathingSign.text = \\markup {" - "\\musicglyph #\"scripts.caesura.curved\"}" << - endl << - "\\breathe" << - endl; - break; - case msrArticulation::kSpiccato: - fLilypondCodeOstream << - "%{spiccato???%}"; - break; - case msrArticulation::kStaccato: - fLilypondCodeOstream << - "."; - break; - case msrArticulation::kStaccatissimo: - fLilypondCodeOstream << - "!"; - break; - case msrArticulation::kStress: - fLilypondCodeOstream << - "%{stress???%}"; - break; - case msrArticulation::kUnstress: - fLilypondCodeOstream << - "%{unstress???%}"; - break; - case msrArticulation::kDetachedLegato: - fLilypondCodeOstream << - "_"; // portato - break; - case msrArticulation::kStrongAccent: - fLilypondCodeOstream << - "^"; // marcato - break; - case msrArticulation::kTenuto: - fLilypondCodeOstream << - "-"; - break; - - case msrArticulation::kFermata: - if ( - // fermata? - S_msrFermata - fermata = - dynamic_cast(&(*articulation)) - ) { - switch (fermata->getFermataTypeKind ()) { - case msrFermata::kFermataTypeNone: - // no placement needed - break; - case msrFermata::kFermataTypeUpright: - // no placement needed - break; - case msrFermata::kFermataTypeInverted: - fLilypondCodeOstream << "_"; - break; - } // switch - - switch (fermata->getFermataKind ()) { - case msrFermata::kNormalFermataKind: - fLilypondCodeOstream << "\\fermata "; - break; - case msrFermata::kAngledFermataKind: - fLilypondCodeOstream << "\\shortfermata "; - break; - case msrFermata::kSquareFermataKind: - fLilypondCodeOstream << "\\longfermata "; - break; - } // switch - } - else { - stringstream s; - - s << - "note articulation '" << - articulation->asString () << - "' has 'fermata' kind, but is not of type S_msrFermata" << - ", line " << articulation->getInputLineNumber (); - - msrInternalError ( - gOahOah->fInputSourceName, - articulation->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrArticulation::kArpeggiato: - // this is handled in chordArticulationAsLilyponString () - break; - case msrArticulation::kNonArpeggiato: - // this is handled in chordArticulationAsLilyponString () - break; - case msrArticulation::kDoit: - fLilypondCodeOstream << - "\\bendAfter #+4"; - break; - case msrArticulation::kFalloff: - fLilypondCodeOstream << - "\\bendAfter #-4"; - break; - case msrArticulation::kPlop: - fLilypondCodeOstream << - "%{plop???%}"; - break; - case msrArticulation::kScoop: - fLilypondCodeOstream << - "%{scoop???%}"; - break; - } // switch -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateChordArticulation ( - S_msrArticulation articulation) -{ - switch (articulation->getArticulationPlacementKind ()) { - case kPlacementNone: - fLilypondCodeOstream << "-"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - switch (articulation->getArticulationKind ()) { - case msrArticulation::kAccent: - fLilypondCodeOstream << ">"; - break; - case msrArticulation::kBreathMark: - fLilypondCodeOstream << "\\breathe"; - break; - case msrArticulation::kCaesura: - /* JMI - fLilypondCodeOstream << - endl << - R"(\once\override BreathingSign.text = \markup {\musicglyph #"scripts.caesura.straight"} \breathe)" << - endl; - */ - fLilypondCodeOstream << - endl << - "\\override BreathingSign.text = \\markup {" - "\\musicglyph #\"scripts.caesura.curved\"}" << - endl << - "\\breathe" << - endl; - break; - case msrArticulation::kSpiccato: - fLilypondCodeOstream << - "%{spiccato???%}"; - break; - case msrArticulation::kStaccato: - fLilypondCodeOstream << - "\\staccato"; // JMI "-."; - break; - case msrArticulation::kStaccatissimo: - fLilypondCodeOstream << "!"; - break; - case msrArticulation::kStress: - fLilypondCodeOstream << - "%{stress???%}"; - break; - case msrArticulation::kUnstress: - fLilypondCodeOstream << - "%{unstress%}"; - break; - case msrArticulation::kDetachedLegato: - fLilypondCodeOstream << - "_"; // portato - break; - case msrArticulation::kStrongAccent: - fLilypondCodeOstream << - "^"; // marcato - break; - case msrArticulation::kTenuto: - fLilypondCodeOstream << "-"; - break; - - case msrArticulation::kFermata: - if ( - // fermata? - S_msrFermata - fermata = - dynamic_cast(&(*articulation)) - ) { - switch (fermata->getFermataTypeKind ()) { - case msrFermata::kFermataTypeNone: - // no placement needed - break; - case msrFermata::kFermataTypeUpright: - // no placement needed - break; - case msrFermata::kFermataTypeInverted: - fLilypondCodeOstream << "_"; - break; - } // switch - - switch (fermata->getFermataKind ()) { - case msrFermata::kNormalFermataKind: - fLilypondCodeOstream << "\\fermata "; - break; - case msrFermata::kAngledFermataKind: - fLilypondCodeOstream << "\\shortfermata "; - break; - case msrFermata::kSquareFermataKind: - fLilypondCodeOstream << "\\longfermata "; - break; - } // switch - } - else { - stringstream s; - - s << - "chord articulation '" << - articulation->asString () << - "' has 'fermata' kind, but is not of type S_msrFermata" << - ", line " << articulation->getInputLineNumber (); - - msrInternalError ( - gOahOah->fInputSourceName, - articulation->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrArticulation::kArpeggiato: - fLilypondCodeOstream << - "\\arpeggio"; - break; - case msrArticulation::kNonArpeggiato: - fLilypondCodeOstream << - "\\arpeggio"; - break; - case msrArticulation::kDoit: - fLilypondCodeOstream << - "\\bendAfter #+4"; - break; - case msrArticulation::kFalloff: - fLilypondCodeOstream << - "\\bendAfter #-4"; - break; - case msrArticulation::kPlop: - fLilypondCodeOstream << - "%{plop%}"; - break; - case msrArticulation::kScoop: - fLilypondCodeOstream << - "%{scoop%}"; - break; - } // switch -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::technicalAsLilypondString ( - S_msrTechnical technical) -{ - string result; - - switch (technical->getTechnicalKind ()) { - case msrTechnical::kArrow: - result = "%{\\Arrow???%}"; - break; - case msrTechnical::kDoubleTongue: - result = "-\\tongue #2"; - break; - case msrTechnical::kDownBow: - result = "\\downbow"; - break; - case msrTechnical::kFingernails: - result = "%{\\Fingernails???%}"; - break; - case msrTechnical::kHarmonic: - result = "\\flageolet"; // JMI "\\once\\override Staff.NoteHead.style = #'harmonic-mixed"; - break; - case msrTechnical::kHeel: - result = "\\lheel"; // rheel??? JMI - break; - case msrTechnical::kHole: - result = "%{\\Hole???%}"; - break; - case msrTechnical::kOpenString: - result = "\\open"; // halfopen ??? JMI - break; - case msrTechnical::kSnapPizzicato: - result = "\\snappizzicato"; - break; - case msrTechnical::kStopped: - result = "\\stopped"; // or -+ JMI - break; - case msrTechnical::kTap: - result = "%{\\Tap???%}"; - break; - case msrTechnical::kThumbPosition: - result = "\\thumb"; - break; - case msrTechnical::kToe: - result = "\\ltoe"; // rtoe ??? JMI - break; - case msrTechnical::kTripleTongue: - result = "-\\tongue #3"; - break; - case msrTechnical::kUpBow: - result = "\\upbow"; - break; - } // switch - - return result; -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::technicalWithIntegerAsLilypondString ( - S_msrTechnicalWithInteger technicalWithInteger) -{ - stringstream s; - - switch (technicalWithInteger->getTechnicalWithIntegerKind ()) { - case msrTechnicalWithInteger::kFingering: - s << - "- " << - technicalWithInteger-> - getTechnicalWithIntegerValue (); - break; - case msrTechnicalWithInteger::kFret: - // LilyPond will take care of that JMI - break; - case msrTechnicalWithInteger::kString: - s << // no space is allowed between the backSlash and the number - "\\" << - technicalWithInteger-> - getTechnicalWithIntegerValue (); - break; - } // switch - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::technicalWithFloatAsLilypondString ( - S_msrTechnicalWithFloat technicalWithFloat) -{ - stringstream s; - - switch (technicalWithFloat->getTechnicalWithFloatKind ()) { - case msrTechnicalWithFloat::kBend: - s << - "\\bendAfter " << - technicalWithFloat-> - getTechnicalWithFloatValue (); - break; - } // switch - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::technicalWithStringAsLilypondString ( - S_msrTechnicalWithString technicalWithString) -{ - string result; - - switch (technicalWithString->getTechnicalWithStringKind ()) { - case msrTechnicalWithString::kHammerOn: - break; - case msrTechnicalWithString::kHandbell: - result = "%{\\Handbell???%}"; - break; - case msrTechnicalWithString::kOtherTechnical: - result = "%{\\OtherTechnical???%}"; - break; - case msrTechnicalWithString::kPluck: - result = "%{Pluck???%}"; - break; - case msrTechnicalWithString::kPullOff: - break; - } // switch - - string stringValue = - technicalWithString-> - getTechnicalWithStringValue (); - - if (stringValue.size ()) { - result += - string (" ") + - "-\\markup {\"" + stringValue + "\"}"; - } - - return result; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateOrnament ( - S_msrOrnament ornament) -{ - S_msrNote - ornamentNoteUpLink = - ornament-> - getOrnamentNoteUpLink (); - - string - noteUpLinkDuration = - ornamentNoteUpLink-> - noteSoundingWholeNotesAsMsrString (); - - switch (ornament->getOrnamentKind ()) { - case msrOrnament::kOrnamentTrill: - if (! ornamentNoteUpLink->getNoteWavyLineSpannerStart ()) { - fLilypondCodeOstream << - "\\trill "; - } - else { - fLilypondCodeOstream << - "\\startTrillSpan "; - } - break; - - case msrOrnament::kOrnamentDashes: - if (! ornamentNoteUpLink->getNoteWavyLineSpannerStart ()) { - fLilypondCodeOstream << - "%{\\dashes%} "; - } - break; - - case msrOrnament::kOrnamentTurn: - fLilypondCodeOstream << - "\\turn "; - break; - - case msrOrnament::kOrnamentInvertedTurn: - fLilypondCodeOstream << - "\\reverseturn "; - break; - - case msrOrnament::kOrnamentDelayedTurn: - { - // c2*2/3 s2*1/3\turn - rational - remainingFraction = - rational (1, 1) - - - gLilypondOah->fDelayedOrnamentsFraction; - - int - numerator = - remainingFraction.getNumerator (), - denominator = - remainingFraction.getDenominator (); - - fLilypondCodeOstream << - "s%{3%}" << - noteUpLinkDuration << - "*" << - denominator - - - numerator << - "/" << - denominator << - "\\turn "; - - // forget about the last found whole notes duration, - // since the latter has been multipled by fDelayedOrnamentsFraction - fLastMetWholeNotes = rational (0, 1); - } - break; - - case msrOrnament::kOrnamentDelayedInvertedTurn: - { -/* JMI - fLilypondCodeOstream << - "delayed inverted turn is not supported, replaced by inverted turn," << - endl << - "see http://lilypond.org/doc/v2.18/Documentation/snippets/expressive-marks"; - - lpsrMusicXMLWarning ( - inputLineNumber, - s.str ()); - - result = "\\reverseturn %{ " + s.str () + " %}"; -*/ - // c2*2/3 ( s2*1/3\turn - - fLilypondCodeOstream << - "s%{4%}" << - noteUpLinkDuration << - "*1/3" "\\reverseturn "; - } - break; - - case msrOrnament::kOrnamentVerticalTurn: - fLilypondCodeOstream << - "^\\markup { \\rotate #90 \\musicglyph #\"scripts.turn\" } "; - /* JMI - { - string message = - "delayed vertical turn is not supported, ignored"; - - lpsrMusicXMLWarning ( - inputLineNumber, - message); - - result = "%{ " + message + " %}"; - } - */ - break; - - case msrOrnament::kOrnamentMordent: - fLilypondCodeOstream << - "\\mordent "; - break; - - case msrOrnament::kOrnamentInvertedMordent: - fLilypondCodeOstream << - "\\prall "; - break; - \ - case msrOrnament::kOrnamentSchleifer: - fLilypondCodeOstream << - "%{\\schleifer???%} "; - break; - - case msrOrnament::kOrnamentShake: - fLilypondCodeOstream << - "%{\\shake???%} "; - break; - - case msrOrnament::kOrnamentAccidentalMark: - switch (ornament->getOrnamentPlacementKind ()) { - case kPlacementNone: - fLilypondCodeOstream << "-"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - switch (ornament->getOrnamentAccidentalMark ()) { - case kTripleFlat: - fLilypondCodeOstream << "\\markup { \\tripleflat } "; - break; - case kDoubleFlat: - fLilypondCodeOstream << "\\markup { \\doubleflat } "; - break; - case kSesquiFlat: - fLilypondCodeOstream << "\\markup { \\sesquiflat } "; - break; - case kFlat: - fLilypondCodeOstream << "\\markup { \\flat } "; - break; - case kSemiFlat: - fLilypondCodeOstream << "\\markup { \\semiflat } "; - break; - case kNatural: - fLilypondCodeOstream << "\\markup { \\natural } "; - break; - case kSemiSharp: - fLilypondCodeOstream << "\\markup { \\semisharp } "; - break; - case kSharp: - fLilypondCodeOstream << "\\markup { \\sharp } "; - break; - case kSesquiSharp: - fLilypondCodeOstream << "\\markup { \\sesquisharp } "; - break; - case kDoubleSharp: - fLilypondCodeOstream << "\\markup { \\doublesharp } "; - break; - case kTripleSharp: - fLilypondCodeOstream << "\\markup { \\triplesharp } "; - break; - case k_NoAlteration: - break; - } // switch - break; - } // switch -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateCodeForSpannerBeforeNote ( - S_msrSpanner spanner) -{ - switch (spanner->getSpannerKind ()) { - case msrSpanner::kSpannerDashes: - switch (spanner->getSpannerTypeKind ()) { - case kSpannerTypeStart: - fLilypondCodeOstream << - "\\once \\override TextSpanner.style = #'dashed-line" << - endl; - fOnGoingTrillSpanner = true; - break; - case kSpannerTypeStop: - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - break; - } // switch - break; - - case msrSpanner::kSpannerWavyLine: - switch (spanner->getSpannerTypeKind ()) { - case kSpannerTypeStart: - if (spanner->getSpannerNoteUpLink ()->getNoteTrillOrnament ()) { - // don't generate anything, the trill will display the wavy line - fOnGoingTrillSpanner = true; - } - else { - fLilypondCodeOstream << - "\\once \\override TextSpanner.style = #'trill" << - endl; - } - break; - case kSpannerTypeStop: - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - break; - } // switch - - msrPlacementKind - spannerPlacementKind = - spanner->getSpannerPlacementKind (); - - if (spannerPlacementKind != fCurrentSpannerPlacementKind) { - switch (spannerPlacementKind) { - case msrPlacementKind::kPlacementNone: - break; - case msrPlacementKind::kPlacementAbove: - fLilypondCodeOstream << - "\\textSpannerUp "; - break; - case msrPlacementKind::kPlacementBelow: - fLilypondCodeOstream << - "\\textSpannerDown "; - break; - } // switch - - fCurrentSpannerPlacementKind = spannerPlacementKind; - } - break; - } // switch -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateCodeForSpannerAfterNote ( - S_msrSpanner spanner) -{ - switch (spanner->getSpannerKind ()) { - case msrSpanner::kSpannerDashes: - switch (spanner->getSpannerTypeKind ()) { - case kSpannerTypeStart: - fLilypondCodeOstream << - "\\startTextSpan "; - fOnGoingTrillSpanner = true; - break; - case kSpannerTypeStop: - fLilypondCodeOstream << - "\\stopTextSpan "; - fOnGoingTrillSpanner = false; - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - break; - } // switch - break; - - case msrSpanner::kSpannerWavyLine: - switch (spanner->getSpannerTypeKind ()) { - case kSpannerTypeStart: - if (spanner->getSpannerNoteUpLink ()->getNoteTrillOrnament ()) { - // don't generate anything, the trill will display the wavy line - fOnGoingTrillSpanner = true; - } - else { - fLilypondCodeOstream << - "\\startTextSpan " << - endl; - } - break; - case kSpannerTypeStop: - { - // get spanner start end - S_msrSpanner - spannerStartEnd = - spanner-> - getSpannerOtherEndSideLink (); - - // sanity check - msrAssert ( - spannerStartEnd != nullptr, - "spannerStartEnd is null"); - - // has the start end a trill ornament? - if (spannerStartEnd->getSpannerNoteUpLink ()->getNoteTrillOrnament ()) { - fLilypondCodeOstream << - "\\stopTrillSpan "; - } - else { - fLilypondCodeOstream << - "\\stopTextSpan "; - } - fOnGoingTrillSpanner = false; - } - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - break; - } // switch - -/* JMI - msrPlacementKind - spannerPlacementKind = - spanner->getSpannerPlacementKind (); - - if (spannerPlacementKind != fCurrentSpannerPlacementKind) { - switch (spannerPlacementKind) { - case msrPlacementKind::kPlacementNone: - break; - case msrPlacementKind::kPlacementAbove: - fLilypondCodeOstream << - "\\textSpannerUp "; - break; - case msrPlacementKind::kPlacementBelow: - fLilypondCodeOstream << - "\\textSpannerDown "; - break; - } // switch - - fCurrentSpannerPlacementKind = spannerPlacementKind; - } - */ - - break; - } // switch -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::dynamicsAsLilypondString ( - S_msrDynamics dynamics) -{ - string result = - "\\" + dynamics->dynamicsKindAsString (); - - return result; -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::harpPedalTuningAsLilypondString ( - msrAlterationKind alterationKind) -{ - string result; - - switch (alterationKind) { - case kTripleFlat: - result = "%{ tripleFlat %} "; - break; - case kDoubleFlat: - result = "%{ doubleFlat %} "; - break; - case kSesquiFlat: - result = "%{ sesquiFlat %} "; - break; - case kFlat: - result = "^"; - break; - case kSemiFlat: - result = "?"; - break; - case kNatural: - result = "-"; - break; - case kSemiSharp: - result = "?"; - break; - case kSharp: - result = "v"; - break; - case kSesquiSharp: - result = "%{ sesquiSharp %} "; - break; - case kDoubleSharp: - result = "%{ doubleSharp %} "; - break; - case kTripleSharp: - result = "%{ tripleSharp %} "; - break; - case k_NoAlteration: - result = "alteration???"; - break; - } // switch - - return result; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::transposeDiatonicError ( - int inputLineNumber, - int transposeDiatonic, - int transposeChromatic) -{ - stringstream s; - - s << - "diatonic '" << transposeDiatonic << - "' is not consistent with " << - "chromatic '" << transposeChromatic << - "'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::singleTremoloDurationAsLilypondString ( - S_msrSingleTremolo singleTremolo) -{ - int - singleTremoloMarksNumber = - singleTremolo-> - getSingleTremoloMarksNumber (); - -/* JMI - S_msrNote - singleTremoloNoteUpLink = - singleTremolo-> - getSingleTremoloNoteUpLink (); -*/ - - msrDurationKind - singleTremoloNoteDurationKind = - singleTremolo-> - getSingleTremoloGraphicDurationKind (); - /* - singleTremoloNoteUpLink-> - getNoteGraphicDurationKind (); - */ - - /* - The same output can be obtained by adding :N after the note, - where N indicates the duration of the subdivision (it must be at least 8). - If N is 8, one beam is added to the note’s stem. - */ - - int durationToUse = - singleTremoloMarksNumber; // JMI / singleTremoloNoteSoundingWholeNotes; - - if (singleTremoloNoteDurationKind >= kEighth) { - durationToUse += - 1 + (singleTremoloNoteDurationKind - kEighth); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - fLogOutputStream << - "singleTremoloDurationAsLilypondString()" << - ", line " << singleTremolo->getInputLineNumber () << - ", " << - singularOrPlural ( - singleTremoloMarksNumber, "mark", "marks") << - ", singleTremoloNoteDurationKind : " << - singleTremoloNoteDurationKind << - ", durationToUse : " << - durationToUse << - endl; - } -#endif - - stringstream s; - - s << - ":" << - // JMI int (pow (2, durationToUse + 2)) << - int (1 << (durationToUse + 2)) << - ' '; - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::harmonyDegreeAlterationKindAsLilypondString ( - msrAlterationKind harmonyDegreeAlterationKind) -{ - string result; - - switch (harmonyDegreeAlterationKind) { - case k_NoAlteration: - result = "?"; - break; - case kTripleFlat: - result = "?"; - break; - case kDoubleFlat: - result = "?"; - break; - case kSesquiFlat: - result = "?"; - break; - case kFlat: - result = "-"; - break; - case kSemiFlat: - result = "?"; - break; - case kNatural: - result = ""; - break; - case kSemiSharp: - result = "?"; - break; - case kSharp: - result = "+"; - break; - case kSesquiSharp: - result = "?"; - break; - case kDoubleSharp: - result = "?"; - break; - case kTripleSharp: - result = "?"; - break; - } // switch - - return result; -} - -string lpsr2LilypondTranslator::harmonyAsLilypondString ( - S_msrHarmony harmony) -{ - int inputLineNumber = - harmony->getInputLineNumber (); - - stringstream s; - - // should '\powerChords' be generated? - switch (harmony->getHarmonyKind ()) { - case kPowerHarmony: - if (! fPowerChordHaveAlreadyBeenGenerated) { - s << "\\powerChords "; - fPowerChordHaveAlreadyBeenGenerated = true; - } - break; - default: - ; - } // switch - - // print harmony pitch - s << - msrQuarterTonesPitchKindAsString ( - gMsrOah-> - fMsrQuarterTonesPitchesLanguageKind, - harmony-> - getHarmonyRootQuarterTonesPitchKind ()); - - // print harmony duration - msrTupletFactor - harmonyTupletFactor = - harmony->getHarmonyTupletFactor (); - - if (harmonyTupletFactor.isEqualToOne ()) { - // use harmony sounding whole notes - s << - wholeNotesAsLilypondString ( - inputLineNumber, - harmony-> - getHarmonySoundingWholeNotes ()); - } - else { - // use harmony display whole notes and tuplet factor - s << - wholeNotesAsLilypondString ( - inputLineNumber, - harmony-> - getHarmonyDisplayWholeNotes ()) << - "*" << - rational (1, 1) / harmonyTupletFactor.asRational (); - } - - // print harmony kind - switch (harmony->getHarmonyKind ()) { - case k_NoHarmony: - s << "Harmony???"; - break; - - // MusicXML chords - - case kMajorHarmony: - s << ":5.3"; - break; - case kMinorHarmony: - s << ":m"; - break; - case kAugmentedHarmony: - s << ":aug"; - break; - case kDiminishedHarmony: - s << ":dim"; - break; - - case kDominantHarmony: - s << ":7"; - break; - case kMajorSeventhHarmony: - s << ":maj7"; - break; - case kMinorSeventhHarmony: - s << ":m7"; - break; - case kDiminishedSeventhHarmony: - s << ":dim7"; - break; - case kAugmentedSeventhHarmony: - s << ":aug7"; - break; - case kHalfDiminishedHarmony: - s << ":m7.5-"; - break; - case kMinorMajorSeventhHarmony: - s << ":m7+"; - break; - - case kMajorSixthHarmony: - s << ":6"; - break; - case kMinorSixthHarmony: - s << ":m6"; - break; - - case kDominantNinthHarmony: - s << ":9"; - break; - case kMajorNinthHarmony: - s << ":maj7.9"; - break; - case kMinorNinthHarmony: - s << ":m7.9"; - break; - - case kDominantEleventhHarmony: - s << ":11"; - break; - case kMajorEleventhHarmony: - s << ":maj7.11"; - break; - case kMinorEleventhHarmony: - s << ":m7.11"; - break; - - case kDominantThirteenthHarmony: - s << ":13"; - break; - case kMajorThirteenthHarmony: - s << ":maj7.13"; - break; - case kMinorThirteenthHarmony: - s << ":m7.13"; - break; - - case kSuspendedSecondHarmony: - s << ":sus2"; - break; - case kSuspendedFourthHarmony: - s << ":sus4"; - break; - -/* - * kNeapolitan f aes des' in: - * - * c e g c' -> f f aes des' -> d g d b -> c e g c' - -they are three different pre-dominant chords that are taught to American undergrads in a sophomore theory course. - -in E major: -Italian = C E A# -French = C E F# A# -German = C E G A# -Tristan = C D# F# A# - -in all of them, the C and A# in theory want to fan out to B (the dominant). This is, of course, in theory - Wagner’s use of the Tristan chord, which he clearly named his opera after, has the A# moving down to A, or the 7th of the dominant (I’m transposing to fit w/ the example above). Wagner obviously did not pay much attention during his sophomore music theory course… -*/ - case kNeapolitanHarmony: - s << ":3-.6-%{:Neapolitan%}"; - break; - case kItalianHarmony: - s << ":3.6+%{:Italian%}"; - break; - case kFrenchHarmony: - s << ":3.5+.6+%{:French%}"; - break; - case kGermanHarmony: - s << ":3.5.6+%{:German%}"; - break; - - case kPedalHarmony: - s << "%{:Pedal%}"; - break; - case kPowerHarmony: - s << ":5 %{power%}"; - break; - case kTristanHarmony: - s << ":2+.5+.6+%{:Tristan%}"; - break; - - // jazz-specific chords - - case kMinorMajorNinth: // -maj9, minmaj9 - s << ":m9"; - break; - - case kDominantSuspendedFourthHarmony: // 7sus4, domsus4 - s << ":7sus4"; - break; - case kDominantAugmentedFifthHarmony: // 7#5, domaug5 - s << ":7.5+"; - break; - case kDominantMinorNinthHarmony: // 7b9, dommin9 - s << ":7.9-"; - break; - case kDominantAugmentedNinthDiminishedFifthHarmony: // 7#9b5, domaug9dim5 - s << ":7.9+.5-"; - break; - case kDominantAugmentedNinthAugmentedFifthHarmony: // 7#9#5, domaug9aug5 - s << ":7.9+.5+"; - break; - case kDominantAugmentedEleventhHarmony: // 7#11, domaug11 - s << ":7.11+"; - break; - - case kMajorSeventhAugmentedEleventhHarmony: // maj7#11, maj7aug11 - s << ":maj7.11+"; - break; - - // other - - case kOtherHarmony: - s << "%{:Other%}"; - break; - - case kNoneHarmony: - s << "%{:None%}"; - break; - } // switch - - // print harmony degrees if any - list - harmonyDegreesList = - harmony->getHarmonyDegreesList (); - - if (harmonyDegreesList.size ()) { - bool thereAreDegreesToBeRemoved = false; - - // print degrees to be added if any first - for ( - list::const_iterator i = harmonyDegreesList.begin (); - i != harmonyDegreesList.end (); - i++ - ) { - S_msrHarmonyDegree harmonyDegree = (*i); - - // get harmony degree information - int - harmonyDegreeValue = - harmonyDegree->getHarmonyDegreeValue (); - - msrAlterationKind - harmonyDegreeAlterationKind = - harmonyDegree-> - getHarmonyDegreeAlterationKind (); - - msrHarmonyDegree::msrHarmonyDegreeTypeKind - harmonyDegreeTypeKind = - harmonyDegree-> - getHarmonyDegreeTypeKind (); - - // print the harmony degree - switch (harmonyDegreeTypeKind) { - case msrHarmonyDegree::kHarmonyDegreeTypeAdd: - s << - // JMI ??? "." << - harmonyDegreeValue << - harmonyDegreeAlterationKindAsLilypondString ( - harmonyDegreeAlterationKind); - break; - - case msrHarmonyDegree::kHarmonyDegreeTypeAlter: - s << - "." << - harmonyDegreeValue << - harmonyDegreeAlterationKindAsLilypondString ( - harmonyDegreeAlterationKind); - break; - - case msrHarmonyDegree::kHarmonyDegreeTypeSubstract: - thereAreDegreesToBeRemoved = true; - break; - } // switch - } // for - - // then print harmony degrees to be removed if any - if (thereAreDegreesToBeRemoved) { - s << "^"; - - int counter = 0; - - for ( - list::const_iterator i = harmonyDegreesList.begin (); - i != harmonyDegreesList.end (); - i++ - ) { - counter++; - - S_msrHarmonyDegree - harmonyDegree = (*i); - - // get harmony degree information - int - harmonyDegreeValue = - harmonyDegree->getHarmonyDegreeValue (); - - msrAlterationKind - harmonyDegreeAlterationKind = - harmonyDegree-> - getHarmonyDegreeAlterationKind (); - - msrHarmonyDegree::msrHarmonyDegreeTypeKind - harmonyDegreeTypeKind = - harmonyDegree-> - getHarmonyDegreeTypeKind (); - - // print the harmony degree - switch (harmonyDegreeTypeKind) { - case msrHarmonyDegree::kHarmonyDegreeTypeAdd: - case msrHarmonyDegree::kHarmonyDegreeTypeAlter: - break; - - case msrHarmonyDegree::kHarmonyDegreeTypeSubstract: - // JMI if (counter > 1) {} - s << - harmonyDegreeValue << - harmonyDegreeAlterationKindAsLilypondString ( - harmonyDegreeAlterationKind); - break; - } // switch - } // for - } - } - - // print the harmony bass if relevant - msrQuarterTonesPitchKind - harmonyBassQuarterTonesPitchKind = - harmony-> - getHarmonyBassQuarterTonesPitchKind (); - - if (harmonyBassQuarterTonesPitchKind != k_NoQuarterTonesPitch_QTP) { - s << - "/" << - msrQuarterTonesPitchKindAsString ( - gMsrOah-> - fMsrQuarterTonesPitchesLanguageKind, - harmonyBassQuarterTonesPitchKind); - } - - // print the harmony inversion if relevant // JMI ??? - int harmonyInversion = - harmony->getHarmonyInversion (); - - if ( harmonyInversion!= K_HARMONY_NO_INVERSION) { - s << - "%{ inversion: " << harmonyInversion << " %}"; - } - - return s.str (); -} - -string lpsr2LilypondTranslator::figureAsLilypondString ( - S_msrFigure figure) -{ - stringstream s; - - fCurrentFiguredBassFiguresCounter++; - - // is the figured bass parenthesized? - msrFiguredBass::msrFiguredBassParenthesesKind - figuredBassParenthesesKind = - fCurrentFiguredBass-> - getFiguredBassParenthesesKind (); - - // generate the figure number - switch (figuredBassParenthesesKind) { - case msrFiguredBass::kFiguredBassParenthesesYes: - s << "["; - break; - case msrFiguredBass::kFiguredBassParenthesesNo: - break; - } // switch - - s << - figure->getFigureNumber (); - - switch (figuredBassParenthesesKind) { - case msrFiguredBass::kFiguredBassParenthesesYes: - s << "]"; - break; - case msrFiguredBass::kFiguredBassParenthesesNo: - break; - } // switch - - // handle the figure prefix - switch (figure->getFigurePrefixKind ()) { - case msrFigure::k_NoFigurePrefix: - break; - case msrFigure::kDoubleFlatPrefix: - s << "--"; - break; - case msrFigure::kFlatPrefix: - s << "-"; - break; - case msrFigure::kFlatFlatPrefix: - s << "flat flat"; - break; - case msrFigure::kNaturalPrefix: - s << "!"; - break; - case msrFigure::kSharpSharpPrefix: - s << "sharp sharp"; - break; - case msrFigure::kSharpPrefix: - s << "+"; - break; - case msrFigure::kDoubleSharpPrefix: - s << "++"; - break; - } // switch - - // handle the figure suffix - switch (figure->getFigureSuffixKind ()) { - case msrFigure::k_NoFigureSuffix: - break; - case msrFigure::kDoubleFlatSuffix: - s << "double flat"; - break; - case msrFigure::kFlatSuffix: - s << "flat"; - break; - case msrFigure::kFlatFlatSuffix: - s << "flat flat"; - break; - case msrFigure::kNaturalSuffix: - s << "natural"; - break; - case msrFigure::kSharpSharpSuffix: - s << "sharp sharp"; - break; - case msrFigure::kSharpSuffix: - s << "sharp"; - break; - case msrFigure::kDoubleSharpSuffix: - s << "souble sharp"; - break; - case msrFigure::kSlashSuffix: - s << "/"; - break; - } // switch - - // generate a space if not last figure in figured bass - if ( - fCurrentFiguredBassFiguresCounter - < - fCurrentFiguredBass->getFiguredBassFiguresList ().size () - ) { - s << ' '; - } - - return s.str (); -} - -string lpsr2LilypondTranslator::figuredBassAsLilypondString ( - S_msrFiguredBass figuredBass) -{ - int inputLineNumber = - figuredBass->getInputLineNumber (); - - stringstream s; - - s << "<"; - - const list& - figuredBassFiguresList = - figuredBass->getFiguredBassFiguresList (); - - if (figuredBassFiguresList.size ()) { - list::const_iterator - iBegin = figuredBassFiguresList.begin (), - iEnd = figuredBassFiguresList.end (), - i = iBegin; - - for ( ; ; ) { - s << figureAsLilypondString ((*i)); - if (++i == iEnd) break; - s << " "; - } // for - } - - s << ">"; - - // print figured bass duration - msrTupletFactor - figuredBassTupletFactor = - figuredBass->getFiguredBassTupletFactor (); - - if (figuredBassTupletFactor.isEqualToOne ()) { - // use figured bass sounding whole notes - s << - wholeNotesAsLilypondString ( - inputLineNumber, - figuredBass-> - getFiguredBassSoundingWholeNotes ()); - } - else { - // use figured bass display whole notes and tuplet factor - s << - wholeNotesAsLilypondString ( - inputLineNumber, - figuredBass-> - getFiguredBassDisplayWholeNotes ()) << - "*" << - figuredBassTupletFactor.asRational (); - } - - s << ' '; - - return s.str (); -} - -//________________________________________________________________________ -bool compareFrameNotesByDecreasingStringNumber ( - const S_msrFrameNote& first, - const S_msrFrameNote& second) -{ - return - first->getFrameNoteStringNumber () - > - second->getFrameNoteStringNumber (); -} - -string lpsr2LilypondTranslator::frameAsLilypondString ( - S_msrFrame frame) -{ -/* JMI - int inputLineNumber = - frame->getInputLineNumber (); - */ - - stringstream s; - - list - frameFrameNotesList = - frame->getFrameFrameNotesList (); - - const list& - frameBarresList = - frame->getFrameBarresList (); - - int frameStringsNumber = - frame->getFrameStringsNumber (); - int frameFretsNumber = - frame->getFrameFretsNumber (); - - s << - "^\\markup {\\fret-diagram #\""; - - // are there fingerings? - if (frame->getFrameContainsFingerings ()) { - s << - "f:1;"; - } - - // strings number - if (frameStringsNumber != 6) { - s << - "w:" << - frameStringsNumber << - ";"; - } - - // frets number - s << - "h:" << - frameFretsNumber << - ";"; - - // frame barres - if (frameBarresList.size ()) { - list::const_iterator - iBegin = frameBarresList.begin (), - iEnd = frameBarresList.end (), - i = iBegin; - - for ( ; ; ) { - msrBarre barre = (*i); - - s << - "c:" << - barre.fBarreStartString << - "-" << - barre.fBarreStopString << - "-" << - barre.fBarreFretNumber << - ";"; - - if (++i == iEnd) break; - // JMI os << ";"; - } // for - } - - // frame notes - if (frameFrameNotesList.size ()) { - // sort the frame notes, - // necessary both for code generation - // and the detection of muted (i.e. absent) frame notes - frameFrameNotesList.sort ( - compareFrameNotesByDecreasingStringNumber); - - int currentStringNumber = frameStringsNumber; - - // generate the code - list::const_iterator - iBegin = frameFrameNotesList.begin (), - iEnd = frameFrameNotesList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrFrameNote - frameNote = (*i); - - int frameNoteStringNumber = - frameNote->getFrameNoteStringNumber (); - int frameNoteFretNumber = - frameNote->getFrameNoteFretNumber (); - int frameNoteFingering = - frameNote->getFrameNoteFingering (); - - while (currentStringNumber > frameNoteStringNumber) { - // currentStringNumber is missing, - // hence it is a muted note - s << - currentStringNumber << - "-x;"; - - currentStringNumber--; - } - - // generate code for the frame note - s << - frameNoteStringNumber << - "-"; - - if (frameNoteFretNumber == 0) { - s << - "o"; - } - else { - s << - frameNoteFretNumber; - } - - if (frameNoteFingering != -1) { - s << - "-" << - frameNoteFingering; - } - - s << - ";"; - - currentStringNumber--; - - if (++i == iEnd) break; - // JMI os << ";"; - } // for - - // handling low-numbered muted notes - while (currentStringNumber != 0) { - // currentStringNumber is missing, - // hence it is a muted note - s << - currentStringNumber << - "-x;"; - - currentStringNumber--; - } - } - - s << - "\" } "; - - return s.str (); -} - -void lpsr2LilypondTranslator::generateInputLineNumberAndOrPositionInMeasureAsAComment ( - S_msrMeasureElement measureElement) -{ - fLilypondCodeOstream << - "%{ "; - - if (gLilypondOah->fInputLineNumbers) { - // print the input line number as a comment - fLilypondCodeOstream << - "line " << measureElement->getInputLineNumber () << " "; - } - - if (gLilypondOah->fPositionsInMeasures) { - // print the position in measure as a comment - fLilypondCodeOstream << - "pim: " << - measureElement->getMeasureElementPositionInMeasure () << - " "; - } - - fLilypondCodeOstream << - "%} "; -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::generateAColumnForMarkup ( - string theString, - markupColumnKind columnKind) -{ - stringstream s; - - switch (columnKind) { - case markupColumnKindLeftAligned: - s << "\\column { "; - break; - case markupColumnKindLeftACentered: - s << "\\center-column { "; - break; - } // switch - s << endl; - - list chunksList; - - splitRegularStringAtEndOfLines ( - theString, - chunksList); - - if (chunksList.size ()) { - // generate a markup containing the chunks - list::const_iterator - iBegin = chunksList.begin (), - iEnd = chunksList.end (), - i = iBegin; - - for ( ; ; ) { - s << - "\\line { \"" << (*i) << "\" }"; - if (++i == iEnd) break; - // JMI ??? s << ' '; - s << endl; - } // for - - s << - " } "; - - if (gLilypondOah->fComments) { - s << - "% " << - singularOrPlural ( - chunksList.size (), "chunk", "chunks"); - } - - s << endl; - } - - return s.str (); -} - -//________________________________________________________________________ -string lpsr2LilypondTranslator::generateMultilineMarkup ( - string theString, - markupColumnKind columnKind) -{ - stringstream s; - - s << - "\\markup { " << - generateAColumnForMarkup ( - theString, - columnKind) << - " } " << - endl; - - return s.str (); -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrScore& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // initial empty line in LilyPond code - // to help copy/paste it -// JMI fLilypondCodeOstream << endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrScore& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // final empty line in LilyPond code - // to help copy/paste it - fLilypondCodeOstream << endl; -} - - // names - -string lpsr2LilypondTranslator::nameAsLilypondString ( - string name) -{ - string result; - - size_t endOfLineFound = name.find ("\n"); - - if (endOfLineFound != string::npos) { - result = - generateMultilineMarkup ( - name, - markupColumnKindLeftACentered); // JMI ??? - } - else { - result = "\"" + name + "\""; - } - - return result; -} - -string lpsr2LilypondTranslator::lpsrVarValAssocKindAsLilypondString ( - lpsrVarValAssoc::lpsrVarValAssocKind - lilyPondVarValAssocKind) -{ - string result; - - switch (lilyPondVarValAssocKind) { - // library - - case lpsrVarValAssoc::kLibraryVersion: - result = "version"; - break; - - // MusicXML informations - - case lpsrVarValAssoc::kMusicXMLWorkNumber: - result = "opus"; - break; - case lpsrVarValAssoc::kMusicXMLWorkTitle: - result = "title"; - break; - case lpsrVarValAssoc::kMusicXMLMovementNumber: - result = "movementNumber"; - break; - case lpsrVarValAssoc::kMusicXMLMovementTitle: - result = "subtitle"; - break; - case lpsrVarValAssoc::kMusicXMLEncodingDate: - result = "encodingDate"; - break; - case lpsrVarValAssoc::kMusicXMLScoreInstrument: - result = "scoreInstrument"; - break; - case lpsrVarValAssoc::kMusicXMLMiscellaneousField: - result = "miscellaneousField"; - break; - - // LilyPond informations - - case lpsrVarValAssoc::kLilypondDedication: - result = "dedication"; - break; - - case lpsrVarValAssoc::kLilypondPiece: - result = "piece"; - break; - case lpsrVarValAssoc::kLilypondOpus: - result = "opus"; - break; - - case lpsrVarValAssoc::kLilypondTitle: - result = "title"; - break; - case lpsrVarValAssoc::kLilypondSubTitle: - result = "subtitle"; - break; - case lpsrVarValAssoc::kLilypondSubSubTitle: - result = "subsubtitle"; - break; - - case lpsrVarValAssoc::kLilypondInstrument: - result = "instrument"; - break; - case lpsrVarValAssoc::kLilypondMeter: - result = "meter"; - break; - - case lpsrVarValAssoc::kLilypondTagline: - result = "tagline"; - break; - case lpsrVarValAssoc::kLilypondCopyright: - result = "copyright"; - break; - - case lpsrVarValAssoc::kLilypondMyBreak: - result = "myBreak"; - break; - case lpsrVarValAssoc::kLilypondMyPageBreak: - result = "myPageBreak"; - break; - case lpsrVarValAssoc::kLilypondGlobal: - result = "global"; - break; - } // switch - - return result; -} - -string lpsr2LilypondTranslator::lpsrVarValAssocAsLilypondString ( - S_lpsrVarValAssoc lpsrVarValAssoc, - int fieldNameWidth) -{ - stringstream s; - - s << left << - setw (fieldNameWidth) << - lpsrVarValAssocKindAsLilypondString ( - lpsrVarValAssoc-> - getLilyPondVarValAssocKind ()) << - " = "; - - msrFontStyleKind - varValFontStyleKind = - lpsrVarValAssoc-> - getVarValFontStyleKind (); - - bool italicIsNeeded = false; - - switch (varValFontStyleKind) { - case kFontStyleNone: - break; - case kFontStyleNormal: - break; - case KFontStyleItalic: - italicIsNeeded = true; - break; - } // switch - - msrFontWeightKind - varValFontWeightKind = - lpsrVarValAssoc-> - getVarValFontWeightKind (); - - bool boldIsNeeded = false; - - switch (varValFontWeightKind) { - case kFontWeightNone: - break; - case kFontWeightNormal: - break; - case kFontWeightBold: - boldIsNeeded = true; - break; - } // switch - - bool markupIsNeeded = italicIsNeeded || boldIsNeeded; - - if (markupIsNeeded) { - fLilypondCodeOstream << "\\markup { "; - } - - if (italicIsNeeded) { - fLilypondCodeOstream << "\\italic "; - } - if (boldIsNeeded) { - fLilypondCodeOstream << "\\bold "; - } - - s << - "\"" << - lpsrVarValAssoc-> - getVariableValue () << - "\""; - - if (markupIsNeeded) { - s << " }"; - } - - return s.str (); -} - -string lpsr2LilypondTranslator::lpsrVarValsListAssocKindAsLilypondString ( - lpsrVarValsListAssoc::lpsrVarValsListAssocKind - lilyPondVarValsListAssocKind) -{ - string result; - - switch (lilyPondVarValsListAssocKind) { - // MusicXML informations - - case lpsrVarValsListAssoc::kMusicXMLRights: - result = "rights"; - break; - case lpsrVarValsListAssoc::kMusicXMLComposer: - result = "composer"; - break; - case lpsrVarValsListAssoc::kMusicXMLArranger: - result = "arranger"; - break; - case lpsrVarValsListAssoc::kMusicXMLPoet: - result = "poet"; - break; - case lpsrVarValsListAssoc::kMusicXMLLyricist: - result = "lyricist"; - break; - case lpsrVarValsListAssoc::kMusicXMLTranslator: - result = "translator"; - break; - case lpsrVarValsListAssoc::kMusicXMLArtist: - result = "artist"; - break; - case lpsrVarValsListAssoc::kMusicXMLSoftware: - result = "software"; - break; - } // switch - - return result; -} - -void lpsr2LilypondTranslator::generateLpsrVarValsListAssocValues ( - S_lpsrVarValsListAssoc varValsListAssoc) -{ - const list& - variableValuesList = - varValsListAssoc-> - getVariableValuesList (); - - switch (variableValuesList.size ()) { - case 0: - break; - - case 1: - // generate a single string - fLilypondCodeOstream << - "\"" << - escapeDoubleQuotes (variableValuesList.front ()) << - "\""; - break; - - default: - // generate a markup containing the chunks - fLilypondCodeOstream << - endl << - "\\markup {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\column {" << - endl; - - gIndenter++; - - list::const_iterator - iBegin = variableValuesList.begin (), - iEnd = variableValuesList.end (), - i = iBegin; - - for ( ; ; ) { - fLilypondCodeOstream << - "\"" << (*i) << "\""; - if (++i == iEnd) break; - fLilypondCodeOstream << endl; - } // for - - fLilypondCodeOstream << endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - } // switch -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrVarValAssoc& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrVarValAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // generate the comment if needed - string - comment = - elt->getComment (); - - if (comment.size ()) { - fLilypondCodeOstream << - "% " << comment << - endl; - } - - // generate a comment out if needed - switch (elt->getCommentedKind ()) { - case lpsrVarValAssoc::kCommentedYes: - fLilypondCodeOstream << "%"; - break; - case lpsrVarValAssoc::kCommentedNo: - break; - } // switch - - // generate the backslash if needed - switch (elt->getBackSlashKind ()) { - case lpsrVarValAssoc::kWithBackSlashYes: - fLilypondCodeOstream << "\\"; - break; - case lpsrVarValAssoc::kWithBackSlashNo: - break; - } // switch - - lpsrVarValAssoc::lpsrVarValAssocKind - varValAssocKind = - elt->getLilyPondVarValAssocKind (); - - string - lilyPondVarValAssocKindAsLilypondString = - lpsrVarValAssocKindAsLilypondString ( - varValAssocKind); - - // the largest variable name length in a header is 18 JMI - int fieldWidth; - - if (fOnGoingHeader) { - fieldWidth = 18; - } - else { - fieldWidth = - lilyPondVarValAssocKindAsLilypondString.size (); - } - - // generate the field name - fLilypondCodeOstream << left<< - setw (fieldWidth) << - lilyPondVarValAssocKindAsLilypondString; - - switch (elt->getVarValSeparatorKind ()) { - case lpsrVarValAssoc::kVarValSeparatorSpace: - fLilypondCodeOstream << ' '; - break; - case lpsrVarValAssoc::kVarValSeparatorEqualSign: - fLilypondCodeOstream << " = "; - break; - } // switch - - msrFontStyleKind - varValFontStyleKind = - elt->getVarValFontStyleKind (); - - bool italicIsNeeded = false; - - switch (varValFontStyleKind) { - case kFontStyleNone: - break; - case kFontStyleNormal: - break; - case KFontStyleItalic: - italicIsNeeded = true; - break; - } // switch - - msrFontWeightKind - varValFontWeightKind = - elt->getVarValFontWeightKind (); - - bool boldIsNeeded = false; - - switch (varValFontWeightKind) { - case kFontWeightNone: - break; - case kFontWeightNormal: - break; - case kFontWeightBold: - boldIsNeeded = true; - break; - } // switch - - bool markupIsNeeded = italicIsNeeded || boldIsNeeded; - - if (markupIsNeeded) { - fLilypondCodeOstream << "\\markup { "; - } - - if (italicIsNeeded) { - fLilypondCodeOstream << "\\italic "; - } - if (boldIsNeeded) { - fLilypondCodeOstream << "\\bold "; - } - - // generate the quote if needed - lpsrVarValAssoc::lpsrQuotesKind - quotesKind = - elt->getQuotesKind (); - - switch (quotesKind) { - case lpsrVarValAssoc::kQuotesAroundValueYes: - fLilypondCodeOstream << "\""; - break; - case lpsrVarValAssoc::kQuotesAroundValueNo: - break; - } // switch - - // generate the value and unit if any - if (elt->getUnit ().size ()) { - fLilypondCodeOstream << - setprecision (2) << - elt->getVariableValue (); - - fLilypondCodeOstream << - "\\" << - elt->getUnit (); - } - else { - fLilypondCodeOstream << - elt->getVariableValue (); - } - - // generate the quote if needed - switch (quotesKind) { - case lpsrVarValAssoc::kQuotesAroundValueYes: - fLilypondCodeOstream << "\""; - break; - case lpsrVarValAssoc::kQuotesAroundValueNo: - break; - } // switch - - if (markupIsNeeded) { - fLilypondCodeOstream << " }"; - } - - fLilypondCodeOstream << endl; - - // generate the end line(s) if needed - switch (elt->getEndlKind ()) { - case lpsrVarValAssoc::kEndlNone: - break; - case lpsrVarValAssoc::kEndlOnce: - fLilypondCodeOstream << endl; - break; - case lpsrVarValAssoc::kEndlTwice: - fLilypondCodeOstream << - endl << - endl; - break; - } // switch -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrVarValAssoc& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrVarValAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrVarValsListAssoc& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrVarValsListAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // the largest variable name length in a header is 18 JMI - int fieldWidth; - - string - lilyPondVarValsListAssocKindAsString = - elt->lilyPondVarValsListAssocKindAsString (); - - if (fOnGoingHeader) { - fieldWidth = 18; - } - else { - fieldWidth = - lilyPondVarValsListAssocKindAsString.size (); - } - - fLilypondCodeOstream << left<< - setw (fieldWidth) << - lpsrVarValsListAssocKindAsLilypondString ( - elt->getVarValsListAssocKind ()); - - fLilypondCodeOstream << " = "; - - generateLpsrVarValsListAssocValues (elt); - - fLilypondCodeOstream << endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrVarValsListAssoc& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrVarValsListAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrSchemeVariable& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrSchemeVariable" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - string - comment = - elt->getComment (); - - if (comment.size ()) { - fLilypondCodeOstream << - "% " << comment << - endl; - } - - switch (elt->getCommentedKind ()) { - case lpsrSchemeVariable::kCommentedYes: - fLilypondCodeOstream << "% "; - break; - case lpsrSchemeVariable::kCommentedNo: - break; - } // switch - - fLilypondCodeOstream << - "#(" << - elt->getVariableName () << - ' ' << - elt->getVariableValue () << - ")"; - - switch (elt->getEndlKind ()) { - case lpsrSchemeVariable::kEndlNone: - break; - case lpsrSchemeVariable::kEndlOnce: - fLilypondCodeOstream << endl; - break; - case lpsrSchemeVariable::kEndlTwice: - fLilypondCodeOstream << - endl << - endl; - break; - } // switch -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrSchemeVariable& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrSchemeVariable" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//______________________________________________________________________________ -string lpsr2LilypondTranslator::lengthUnitAsLilypondString ( - msrLengthUnitKind lengthUnitKind) -{ - string result; - - switch (lengthUnitKind) { - case kInchUnit: - result = "\\in"; - break; - case kCentimeterUnit: - result = "\\cm"; - break; - case kMillimeterUnit: - result = "\\mm"; - break; - } // switch - - return result; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrHeader& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrHeader" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\header" << " {" << - endl; - - gIndenter++; - - // generate header elements - - int fieldNameWidth = - elt->maxLilypondVariablesNamesLength (); - - // MusicXML informations JMI ??? - - // LilyPond informations - - { - // dedication - S_lpsrVarValAssoc - lilypondDedication = - elt->getLilypondDedication (); - - if (lilypondDedication) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondDedication, - fieldNameWidth) << - endl; - } - } - - { - // piece - S_lpsrVarValAssoc - lilypondPiece = - elt->getLilypondPiece (); - - if (lilypondPiece) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondPiece, - fieldNameWidth) << - endl; - } - } - - { - // opus - S_lpsrVarValAssoc - lilypondOpus = - elt->getLilypondOpus (); - - if (lilypondOpus) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondOpus, - fieldNameWidth) << - endl; - } - } - - { - // title - if (gMusicXMLOah->fUseFilenameAsWorkTitle) { - fLilypondCodeOstream << left << - setw (fieldNameWidth) << - "title = \"" << - gOahOah->fInputSourceName << - "\"" << - endl; - } - else { - S_lpsrVarValAssoc - lilypondTitle = - elt->getLilypondTitle (); - - if (lilypondTitle) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondTitle, - fieldNameWidth) << - endl; - } - } - - /* JMI - S_msrLength - indent = - elt->getIndent (); - - if (! indent) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "indent" << " = "; - if (indent) { - fLilypondCodeOstream << - setprecision (3) << indent->getLengthValue () << - lengthUnitAsLilypondString (indent->getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; -*/ - - // subtitle - S_lpsrVarValAssoc - lilypondSubTitle = - elt->getLilypondSubTitle (); - - if (lilypondSubTitle) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondSubTitle, - fieldNameWidth) << - endl; - } - - S_lpsrVarValAssoc - lilypondSubSubTitle = - elt->getLilypondSubSubTitle (); - - if (lilypondSubSubTitle) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondSubSubTitle, - fieldNameWidth) << - endl; - } - } - - { - // instrument - S_lpsrVarValAssoc - lilypondInstrument = - elt->getLilypondInstrument (); - - if (lilypondInstrument) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondInstrument, - fieldNameWidth) << - endl; - } - - S_lpsrVarValAssoc - lilypondMeter = - elt->getLilypondMeter (); - - if (lilypondMeter) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondMeter, - fieldNameWidth) << - endl; - } - } - - { - // copyright - S_lpsrVarValAssoc - lilypondCopyright = - elt->getLilypondCopyright (); - - if (lilypondCopyright) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondCopyright, - fieldNameWidth) << - endl; - } - - S_lpsrVarValAssoc - lilypondTagline = - elt->getLilypondTagline (); - - if (lilypondTagline) { - fLilypondCodeOstream << - lpsrVarValAssocAsLilypondString ( - lilypondTagline, - fieldNameWidth) << - endl; - } - } - - fOnGoingHeader = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrHeader& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrHeader" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "}" << - endl << endl; - - fOnGoingHeader = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrPaper& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrPaper" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // get MSR page layout - S_msrPageLayout - pageLayout = - elt->getPageLayout (); - - // default length unit - const msrLengthUnitKind - defaultLengthUnit = kMillimeterUnit; // JMI - - fLilypondCodeOstream << - "\\paper" << " {" << - endl; - - gIndenter++; - - const int fieldWidth = 30; - - // page size - { - { - // paper height - msrLength - paperHeight; - - if (gLpsrOah->fPaperHeight.getLengthValue () >= 0) { // JMI BLARK - paperHeight = - gLpsrOah->fPaperHeight; - } - else { - paperHeight = - * (pageLayout->getPageHeight ()); // BLARK - } - - if (paperHeight.getLengthValue () < 0.0) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "paper-height" << " = "; - if (paperHeight.getLengthValue () >= 0.0) { - fLilypondCodeOstream << - setprecision (3) << paperHeight.getLengthValue () << - lengthUnitAsLilypondString (paperHeight.getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "297.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - } - - { - // paper width - msrLength - paperWidth; - - if (gLpsrOah->fPaperWidth.getLengthValue () >= 0) { // JMI BLARK - paperWidth = - gLpsrOah->fPaperWidth; - } - else { - paperWidth = - * (pageLayout->getPageWidth ()); // BLARK - } - - if (paperWidth.getLengthValue () < 0.0) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "paper-width" << " = "; - if (paperWidth.getLengthValue () >= 0.0) { - fLilypondCodeOstream << - setprecision (3) << paperWidth.getLengthValue () << - lengthUnitAsLilypondString (paperWidth.getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "210.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - } - } - - // separator - fLilypondCodeOstream << endl; - - // margins - { - // left margin - S_msrMargin - leftMargin = - pageLayout->getLeftMargin (); - - if (! leftMargin) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "left-margin" << " = "; - if (leftMargin) { - fLilypondCodeOstream << - setprecision (3) << leftMargin->getMarginLength ().getLengthValue () << - lengthUnitAsLilypondString (leftMargin->getMarginLength ().getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - - // right margin - S_msrMargin - rightMargin = - pageLayout->getRightMargin (); - - if (! rightMargin) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "right-margin" << " = "; - if (rightMargin) { - fLilypondCodeOstream << - setprecision (3) << rightMargin->getMarginLength ().getLengthValue () << - lengthUnitAsLilypondString (rightMargin->getMarginLength ().getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - - // top margin - S_msrMargin - topMargin = - pageLayout->getTopMargin (); - - if (! rightMargin) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "top-margin" << " = "; - if (topMargin) { - fLilypondCodeOstream << - setprecision (3) << topMargin->getMarginLength ().getLengthValue () << - lengthUnitAsLilypondString (topMargin->getMarginLength ().getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - - // bottom margin - S_msrMargin - bottomMargin = - pageLayout->getBottomMargin (); - - if (! rightMargin) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "bottom-margin" << " = "; - if (bottomMargin) { - fLilypondCodeOstream << - setprecision (3) << bottomMargin->getMarginLength ().getLengthValue () << - lengthUnitAsLilypondString (bottomMargin->getMarginLength ().getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - } - - // separator - fLilypondCodeOstream << endl; - - // indents - { - // horizontal shift - S_msrLength - horizontalShift = - elt->getHorizontalShift (); - - if (! horizontalShift) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "horizontal-shift" << " = "; - if (horizontalShift) { - fLilypondCodeOstream << - setprecision (3) << horizontalShift->getLengthValue () << - lengthUnitAsLilypondString (horizontalShift->getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - - // indent - S_msrLength - indent = - elt->getIndent (); - - if (! indent) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "indent" << " = "; - if (indent) { - fLilypondCodeOstream << - setprecision (3) << indent->getLengthValue () << - lengthUnitAsLilypondString (indent->getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - - // short indent - S_msrLength - shortIndent = - elt->getShortIndent (); - - if (! shortIndent) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "short-indent" << " = "; - if (shortIndent) { - fLilypondCodeOstream << - setprecision (3) << shortIndent->getLengthValue () << - lengthUnitAsLilypondString (shortIndent->getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - } - - // separator - fLilypondCodeOstream << endl; - - // spaces - { - // markup system spacing padding - S_msrLength - markupSystemPpacingPadding = - elt->getMarkupSystemSpacingPadding (); - - if (! markupSystemPpacingPadding) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "markup-system-spacing.padding" << " = "; - if (markupSystemPpacingPadding) { - fLilypondCodeOstream << - setprecision (3) << markupSystemPpacingPadding->getLengthValue () << - lengthUnitAsLilypondString (markupSystemPpacingPadding->getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - - // between system space - S_msrLength - betweenSystemSpace = - elt->getBetweenSystemSpace (); - - if (! betweenSystemSpace) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "between-system-space" << " = "; - if (betweenSystemSpace) { - fLilypondCodeOstream << - setprecision (3) << betweenSystemSpace->getLengthValue () << - lengthUnitAsLilypondString (betweenSystemSpace->getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - - // page top space - S_msrLength - pageTopSpace = - elt->getPageTopSpace (); - - if (! pageTopSpace) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "page-top-space" << " = "; - if (pageTopSpace) { - fLilypondCodeOstream << - setprecision (3) << pageTopSpace->getLengthValue () << - lengthUnitAsLilypondString (pageTopSpace->getLengthUnitKind ()); - } - else { - fLilypondCodeOstream << - "0.0" << - lengthUnitAsLilypondString (defaultLengthUnit); - } - fLilypondCodeOstream << endl; - } - - // separator - fLilypondCodeOstream << endl; - - // counts - { - // page count - int - pageCount = - elt->getPageCount (); - - if (pageCount < 0) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "page-count" << " = " << - pageCount << - endl; - - // system count - int - systemCount = - elt->getSystemCount (); - - if (systemCount < 0) { - fLilypondCodeOstream << "%"; - } - fLilypondCodeOstream << left << - setw (fieldWidth) << - "system-count" << " = " << - pageCount << - endl; - } - - // separator - fLilypondCodeOstream << endl; - - // headers and footers - { - string oddHeaderMarkup = - elt->getOddHeaderMarkup (); - - fLilypondCodeOstream << left << - setw (fieldWidth) << - "oddHeaderMarkup" << " = "; - if (oddHeaderMarkup.size ()) { - fLilypondCodeOstream << - oddHeaderMarkup; - } - else { - fLilypondCodeOstream << "\"\""; - } - fLilypondCodeOstream << endl; - - string evenHeaderMarkup = - elt->getEvenHeaderMarkup (); - - fLilypondCodeOstream << left << - setw (fieldWidth) << - "evenHeaderMarkup" << " = "; - if (evenHeaderMarkup.size ()) { - fLilypondCodeOstream << - evenHeaderMarkup; - } - else { - fLilypondCodeOstream << "\"\""; - } - fLilypondCodeOstream << endl; - - string oddFooterMarkup = - elt->getOddFooterMarkup (); - - fLilypondCodeOstream << left << - setw (fieldWidth) << - "oddFooterMarkup" << " = "; - if (oddFooterMarkup.size ()) { - fLilypondCodeOstream << - oddFooterMarkup; - } - else { - fLilypondCodeOstream << "\"\""; - } - fLilypondCodeOstream << endl; - - string evenFooterMarkup = - elt->getEvenFooterMarkup (); - - fLilypondCodeOstream << left << - setw (fieldWidth) << - "evenFooterMarkup" << " = "; - if (evenFooterMarkup.size ()) { - fLilypondCodeOstream << - evenFooterMarkup; - } - else { - fLilypondCodeOstream << "\"\""; - } - fLilypondCodeOstream << endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrPaper& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrPaper" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "}" << - endl << endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrLayout& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\layout {" << - endl; - - gIndenter++; - - // score context - fLilypondCodeOstream << - "\\context {" << - endl << - gTab << "\\Score" << - endl << - gTab << "autoBeaming = ##f % to display tuplets brackets" << - endl << - "}" << - endl; - - // voice context - fLilypondCodeOstream << - "\\context {" << - endl << - gTab << "\\Voice" << - endl; - - if (gLilypondOah->fAmbitusEngraver) { - fLilypondCodeOstream << - gTab << "\\consists \"Ambitus_engraver\"" << - endl; - } - - if (gLilypondOah->fCustosEngraver) { - fLilypondCodeOstream << - gTab << "\\consists \"Custos_engraver\"" << - endl; - } - - fLilypondCodeOstream << - "}" << - endl; - - // ChordNames context - if (fVisitedLpsrScore->getJazzChordsDisplayIsNeeded ()) { - fLilypondCodeOstream << - gIndenter.indentMultiLineString ( -R"(\context { - \ChordNames - chordNameExceptions = \chExceptions - slashChordSeparator = \markup { - % the \hspace commands simulate kerning - \hspace #-.7 - \fontsize #1 \lower #1.2 \rotate #-10 "/" - \hspace #-.1 - } - chordNoteNamer = #lower-extension -})") << - endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrLayout& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (gLilypondOah->fRepeatBrackets) { - fLilypondCodeOstream << - "\\context " "{" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\Score" << - endl << - "% defaultBarType = #\"!\"" << - endl << - "startRepeatType = #\"[|:\"" << - endl << - "endRepeatType = #\":|]\"" << - endl << - "doubleRepeatType = #\":|][|:\"" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - } - - if (false) { // JMI XXL - fLilypondCodeOstream << - "\\context {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\Staff" << - endl << - "\\consists \"Span_arpeggio_engraver\"" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - } - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl << - endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrBookBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrBookBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\book {" << - endl; - - gIndenter++; - -/* JMI - if (elt->getScoreBlockElements ().size ()) { - fLilypondCodeOstream << - "<<" << - endl; - - gIndenter++; - } -*/ - fOnGoingScoreBlock = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrBookBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrBookBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - if (elt->getScoreBlockElements ().size ()) { - gIndenter--; - - fLilypondCodeOstream << - ">>" << - endl << - * endl; - } -*/ - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - - fOnGoingScoreBlock = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrScoreBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrScoreBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\score {" << - endl; - - gIndenter++; - -/* JMI - if (elt->getScoreBlockElements ().size ()) { - fLilypondCodeOstream << - "<<" << - endl; - - gIndenter++; - } -*/ - fOnGoingScoreBlock = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrScoreBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrScoreBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - if (elt->getScoreBlockElements ().size ()) { - gIndenter--; - - fLilypondCodeOstream << - ">>" << - endl << - * endl; - } -*/ - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl << // JMI - endl; - - fOnGoingScoreBlock = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrBookPartBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrBookPartBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\bookpart {" << - endl; - - gIndenter++; - -/* JMI - if (elt->getScoreBlockElements ().size ()) { - fLilypondCodeOstream << - "<<" << - endl; - - gIndenter++; - } -*/ - fOnGoingScoreBlock = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrBookPartBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrBookPartBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - if (elt->getScoreBlockElements ().size ()) { - gIndenter--; - - fLilypondCodeOstream << - ">>" << - endl << - * endl; - } -*/ - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl << // JMI - endl; - - fOnGoingScoreBlock = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrParallelMusicBLock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrParallelMusicBLock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fNumberOfPartGroupBlocks = - elt-> - getParallelMusicBLockPartGroupBlocks ().size (); - - if (fNumberOfPartGroupBlocks) { - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "<<" << - "% parallel music"; - } - - else { - fLilypondCodeOstream << - "<<"; - } - - fLilypondCodeOstream << endl; - - gIndenter++; - } - - fCurrentParallelMusicBLock = elt; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrParallelMusicBLock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrParallelMusicBLock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << endl; - - if (fNumberOfPartGroupBlocks) { - gIndenter--; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - ">>" << - "% parallel music"; - } - - else { - fLilypondCodeOstream << - ">>"; - } - - fLilypondCodeOstream << - endl << - endl; - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrPartGroupBlock& elt) -{ - // fetch part group - S_msrPartGroup - partGroup = - elt->getPartGroup (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrPartGroupBlock for '" << - partGroup->asShortString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fPartGroupBlocksCounter++; - - fNumberOfPartGroupBlockElements = - elt -> getPartGroupBlockElements ().size (); - -// JMI fLilypondCodeOstream << endl << endl << partGroup << endl << endl; - - msrPartGroup::msrPartGroupImplicitKind - partGroupImplicitKind = - partGroup-> - getPartGroupImplicitKind (); - - msrPartGroup::msrPartGroupSymbolKind - partGroupSymbolKind = - partGroup-> - getPartGroupSymbolKind (); - - msrPartGroup::msrPartGroupBarlineKind - partGroupBarlineKind = - partGroup-> - getPartGroupBarlineKind (); - - string - partGroupName = - partGroup-> - getPartGroupName (), - - partGroupAbbreviation = - partGroup-> - getPartGroupAbbreviation (), - - partGroupInstrumentName = - partGroup-> - getPartGroupInstrumentName (); - - // LPNR, page 567 jMI ??? - - switch (partGroupImplicitKind) { - case msrPartGroup::kPartGroupImplicitYes: - // don't generate code for an implicit top-most part group block - break; - - case msrPartGroup::kPartGroupImplicitNo: - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth); - } - - switch (partGroupSymbolKind) { - case msrPartGroup::kPartGroupSymbolNone: - fLilypondCodeOstream << - "\\new StaffGroup"; - break; - - case msrPartGroup::kPartGroupSymbolBrace: // JMI - switch (partGroupBarlineKind) { - case msrPartGroup::kPartGroupBarlineYes: - fLilypondCodeOstream << - "\\new PianoStaff"; - break; - case msrPartGroup::kPartGroupBarlineNo: - fLilypondCodeOstream << - "\\new GrandStaff"; - break; - } // switch - break; - - case msrPartGroup::kPartGroupSymbolBracket: - switch (partGroupBarlineKind) { - case msrPartGroup::kPartGroupBarlineYes: - fLilypondCodeOstream << - "\\new StaffGroup"; - break; - case msrPartGroup::kPartGroupBarlineNo: - fLilypondCodeOstream << - "\\new ChoirStaff"; - break; - } // switch - break; - - case msrPartGroup::kPartGroupSymbolLine: - fLilypondCodeOstream << - "\\new StaffGroup"; - break; - - case msrPartGroup::kPartGroupSymbolSquare: - fLilypondCodeOstream << - "\\new StaffGroup"; - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLilypondCodeOstream << - " %{ " << - partGroup->getPartGroupCombinedName () << - ", abs number: " << - partGroup->getPartGroupAbsoluteNumber () << - " %} "; - } -#endif - - // should a '\with' block be generated? - bool doGenerateAWithBlock = false; - - // generate the '\with' block if there's - // a part group name or abbreviation to be generated - if ( - partGroupName.size () - || - partGroupAbbreviation.size () - ) { - doGenerateAWithBlock = true; - } - - // generate the '\with' block - // if the part group is not implicit - switch (partGroupImplicitKind) { - case msrPartGroup::kPartGroupImplicitYes: - break; - case msrPartGroup::kPartGroupImplicitNo: - if (partGroupName.size ()) { - doGenerateAWithBlock = true; - } - break; - } // switch - - // generate the '\with' block - // if the part group symbol is a line or square - switch (partGroupSymbolKind) { - case msrPartGroup::kPartGroupSymbolNone: - break; - - case msrPartGroup::kPartGroupSymbolBrace: // JMI - break; - - case msrPartGroup::kPartGroupSymbolBracket: - break; - - case msrPartGroup::kPartGroupSymbolLine: - doGenerateAWithBlock = true; - break; - - case msrPartGroup::kPartGroupSymbolSquare: - doGenerateAWithBlock = true; - break; - } // switch - - if (doGenerateAWithBlock) { - fLilypondCodeOstream << - endl << - "\\with {" << - endl; - } - - gIndenter++; - - if (doGenerateAWithBlock) { // JMI - if (partGroupName.size ()) { - fLilypondCodeOstream << - "instrumentName = " << - nameAsLilypondString (partGroupName) << - endl; - } - if (partGroupAbbreviation.size ()) { - fLilypondCodeOstream << - "shortInstrumentName = " << - nameAsLilypondString (partGroupAbbreviation) << - endl; - } - } - - switch (partGroupSymbolKind) { - case msrPartGroup::kPartGroupSymbolNone: - break; - - case msrPartGroup::kPartGroupSymbolBrace: // JMI - /* - * - * check whether individual part have instrument names JMI - * - if (partGroupInstrumentName.size ()) { - fLilypondCodeOstream << = "\\new PianoStaff"; - } - else { - fLilypondCodeOstream << = "\\new GrandStaff"; - } - */ - break; - - case msrPartGroup::kPartGroupSymbolBracket: - break; - - case msrPartGroup::kPartGroupSymbolLine: - fLilypondCodeOstream << - "systemStartDelimiter = #'SystemStartBar" << - endl; - break; - - case msrPartGroup::kPartGroupSymbolSquare: - fLilypondCodeOstream << - "systemStartDelimiter = #'SystemStartSquare" << - endl; - break; - } // switch - - gIndenter--; - - // generate the '\with' block ending - // if the part group is not implicit - if (doGenerateAWithBlock) { - fLilypondCodeOstream << - "}" << - endl; - } - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - " <<" << "% part group " << - partGroup->getPartGroupCombinedNameWithoutEndOfLines (); - } - else { - fLilypondCodeOstream << - " <<"; - } - - fLilypondCodeOstream << endl; - break; - } // switch - - if (partGroupInstrumentName.size ()) { // JMI - fLilypondCodeOstream << - "instrumentName = \"" << - partGroupInstrumentName << - "\"" << - endl; - } - - if (gLilypondOah->fConnectArpeggios) { - fLilypondCodeOstream << - "\\set PianoStaff.connectArpeggios = ##t" << - endl; - } - - fLilypondCodeOstream << endl; - - if (elt->getPartGroupBlockElements ().size () > 1) { - gIndenter++; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrPartGroupBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrPartGroupBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // fetch part group - S_msrPartGroup - partGroup = - elt->getPartGroup (); - - if (elt->getPartGroupBlockElements ().size () > 1) { - gIndenter--; - } - - switch (partGroup->getPartGroupImplicitKind ()) { - case msrPartGroup::kPartGroupImplicitYes: - // don't generate code for an implicit top-most part group block - break; - - case msrPartGroup::kPartGroupImplicitNo: - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << ">>" << - "% part group " << - partGroup->getPartGroupCombinedNameWithoutEndOfLines (); - } - else { - fLilypondCodeOstream << - ">>"; - } - - fLilypondCodeOstream << endl; - - if (fPartGroupBlocksCounter != fNumberOfPartGroupBlocks) { - fLilypondCodeOstream << endl; - } - break; - } // switch -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrPartBlock& elt) -{ - // fetch part block's part - S_msrPart - part = - elt->getPart (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrPartBlock for '" << - part->asShortString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fPartGroupBlockElementsCounter++; - - fNumberOfStaffBlocksElements = - elt->getPartBlockElementsList ().size (); - - if (part->getPartStavesMap ().size () > 1) { - // don't generate code for a part with only one stave - - string - partName = - part->getPartName (), - partAbbreviation = - part->getPartAbbreviation (); - /* - string - partInstrumentName = // JMI - part->getPartInstrumentName (), - partInstrumentAbbreviation = // JMI - part->getPartInstrumentAbbreviation (); - */ - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "\\new PianoStaff" << - " % part " << part->getPartCombinedName (); - } - else { - fLilypondCodeOstream << - "\\new PianoStaff"; - } - fLilypondCodeOstream << endl; - - // generate the 'with' block beginning - fLilypondCodeOstream << - "\\with {" << - endl; - - gIndenter++; - - if (partName.size ()) { - fLilypondCodeOstream << - "instrumentName = \"" << - partName << - "\"" << - endl; - } - - if (partAbbreviation.size ()) { - fLilypondCodeOstream << - "shortInstrumentName = " << - nameAsLilypondString (partAbbreviation) << - endl; - } - - if (gLilypondOah->fConnectArpeggios) { - fLilypondCodeOstream << - "connectArpeggios = ##t" << - endl; - } - - gIndenter--; - - // generate the 'with' block ending - fLilypondCodeOstream << - "}" << - endl; - - fLilypondCodeOstream << - "<<" << - endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrPartBlock& elt) -{ - // fetch current part block's part - S_msrPart - part = - elt->getPart (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrPartBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (part->getPartStavesMap ().size () > 1) { - // don't generate code for a part with only one stave - - // JMI ??? gIndenter--; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << ">>" << - "% part " << - part->getPartCombinedName (); - } - else { - fLilypondCodeOstream << - ">>"; - } - - fLilypondCodeOstream << endl; - - if (fPartGroupBlockElementsCounter != fNumberOfPartGroupBlockElements) { - fLilypondCodeOstream << endl; - } - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrStaffBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrStaffBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fStaffBlocksCounter++; - - S_msrStaff - staff = - elt->getStaff (); - - // generate the staff context - switch (staff->getStaffKind ()) { - case msrStaff::kStaffRegular: - if (gLilypondOah->fJianpu) { - fLilypondCodeOstream << "\\new JianpuStaff"; - } - else { - fLilypondCodeOstream << "\\new Staff"; - } - break; - - case msrStaff::kStaffTablature: - fLilypondCodeOstream << "\\new TabStaff"; - break; - - case msrStaff::kStaffHarmony: - fLilypondCodeOstream << "\\new kStaffHarmony???"; - break; - - case msrStaff::kStaffFiguredBass: - fLilypondCodeOstream << "\\new FiguredBassStaff???"; - break; - - case msrStaff::kStaffDrum: - fLilypondCodeOstream << "\\new DrumStaff"; - break; - - case msrStaff::kStaffRythmic: - fLilypondCodeOstream << "\\new RhythmicStaff"; - break; - } // switch - - fLilypondCodeOstream << - " = \"" << - staff->getStaffName () << - "\""; - - fLilypondCodeOstream << endl; - - // generate the 'with' block beginning - fLilypondCodeOstream << - "\\with {" << - endl; - - gIndenter++; - - // fetch part upLink - S_msrPart - staffPartUpLink = - staff->getStaffPartUpLink (); - - // don't generate instrument names in the staves - // if the containing part contains several of them - if (staffPartUpLink->getPartStavesMap ().size () == 1) { - // get the part upLink name to be used - string partName = - staffPartUpLink-> - getPartNameDisplayText (); - - if (partName.size () == 0) { - partName = - staffPartUpLink-> - getPartName (); - } - - // generate the instrument name - //* JMI BLARKBLARK - if (partName.size ()) { - fLilypondCodeOstream << - "instrumentName = "; - - // does the name contain hexadecimal end of lines? - std::size_t found = - // JMI partName.find (" "); - partName.find ("\n"); - - if (found == string::npos) { - // no, escape quotes if any and generate the result - fLilypondCodeOstream << - "\"" << - escapeDoubleQuotes (partName) << - "\"" << - endl; - } - - else { - // yes, split the name into a chunks list - // and generate a \markup{} // JMI ??? - fLilypondCodeOstream << - endl << - generateMultilineMarkup ( - partName, - markupColumnKindLeftACentered) << // JMI ??? - endl; - } - } - //*/ - - // get the part upLink abbreviation display text to be used - string partAbbreviation = - staffPartUpLink-> - getPartAbbreviationDisplayText (); - - if (partAbbreviation.size () == 0) { - partAbbreviation = - staffPartUpLink-> - getPartAbbreviation (); - } - -/* JMI ??? - if (partAbbreviation.size ()) { - fLilypondCodeOstream << - "shortInstrumentName = "; - - // does the name contain hexadecimal end of lines? - std::size_t found = - partAbbreviation.find (" "); - - if (found == string::npos) { - // no, merely generate the name - fLilypondCodeOstream << - nameAsLilypondString (partAbbreviation) << - endl; - } - - else { - // yes, split the name into a chunks list - // and generate a \markup{} // JMI ??? - fLilypondCodeOstream << - endl << - generateMultilineMarkup (partAbbreviation) << - endl; - } - } - */ - } - - gIndenter--; - - // generate the string tunings if any - S_msrStaffDetails - currentStaffDetails = - staff->getCurrentStaffStaffDetails (); - - if (currentStaffDetails) { - const list& - staffTuningsList = - currentStaffDetails->getStaffTuningsList (); - - if (staffTuningsList.size ()) { - fLilypondCodeOstream << - // JMI "restrainOpenStrings = ##t" << - // JMI endl << - "stringTunings = \\stringTuning <"; - - list::const_iterator - iBegin = staffTuningsList.begin (), - iEnd = staffTuningsList.end (), - i = iBegin; - - gIndenter++; - - for ( ; ; ) { - S_msrStaffTuning - staffTuning = (*i); - - fLilypondCodeOstream << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - staffTuning-> - getStaffTuningQuarterTonesPitchKind ()) << - absoluteOctaveAsLilypondString ( - staffTuning->getStaffTuningOctave ()); - - if (++i == iEnd) break; - - fLilypondCodeOstream << ' '; - } // for - - fLilypondCodeOstream << - ">" << - endl; - - gIndenter--; - - // should letters be used for frets? - switch (currentStaffDetails->getShowFretsKind ()) { - case msrStaffDetails::kShowFretsNumbers: - break; - case msrStaffDetails::kShowFretsLetters: - fLilypondCodeOstream << - "tablatureFormat = #fret-letter-tablature-format" << - endl; - break; - } // switch - } - } - - // generate ledger lines coloring code if needed - if (fVisitedLpsrScore->getColoredLedgerLinesIsNeeded ()) { - fLilypondCodeOstream << - gIndenter.indentMultiLineString ( -R"( \override LedgerLineSpanner.stencil = #MyLedgerLineSpannerPrint - \override LedgerLineSpanner.after-line-breaking = #grob::display-objects)") << - endl; - } - - // generate the 'with' block ending - fLilypondCodeOstream << - "}" << - endl; - - // generate the comment if relevant - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "<<" << - " % staff \"" << staff->getStaffName () << "\""; - } - else { - fLilypondCodeOstream << - "<<"; - } - - fLilypondCodeOstream << endl; - - if (gLilypondOah->fJianpu) { - fLilypondCodeOstream << - " \\jianpuMusic" << - endl; - } - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrStaffBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrStaffBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << ">>" << - "% staff " << - elt->getStaff ()->getStaffName (); - } - else { - fLilypondCodeOstream << - ">>"; - } - - fLilypondCodeOstream << endl; - - if (fStaffBlocksCounter != fNumberOfStaffBlocksElements) { - fLilypondCodeOstream << endl; - } -} - -/* -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrNewStaffgroupBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrNewStaffgroupBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\new StaffGroup" << ' ' << "{" << - endl; - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrNewStaffgroupBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrNewStaffgroupBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - fLilypondCodeOstream << - " }" << - endl << endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrNewStaffBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrNewStaffBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrNewStaffBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrNewStaffBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; -} -*/ - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrUseVoiceCommand& elt) // JMI ??? -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrUseVoiceCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - S_msrVoice - voice = elt->getVoice (); - - S_msrStaff - staff = voice-> getVoiceStaffUpLink (); - - msrStaff::msrStaffKind - staffKind = staff->getStaffKind (); - - string staffContextName; - string voiceContextName; - - switch (staffKind) { - case msrStaff::kStaffRegular: - staffContextName = "Staff"; - voiceContextName = "Voice"; - break; - - case msrStaff::kStaffTablature: - staffContextName = "TabStaff"; - voiceContextName = "TabVoice"; - break; - - case msrStaff::kStaffHarmony: - staffContextName = "ChordNames2"; // JMI - voiceContextName = "???"; // JMI - break; - - case msrStaff::kStaffFiguredBass: - staffContextName = "FiguredBass"; - voiceContextName = "???"; // JMI - break; - - case msrStaff::kStaffDrum: - staffContextName = "DrumStaff"; - voiceContextName = "DrumVoice"; - // the "DrumVoice" alias exists, let's use it - break; - - case msrStaff::kStaffRythmic: - staffContextName = "RhythmicStaff"; - voiceContextName = "Voice"; - // no "RhythmicVoice" alias exists - break; - - } // switch - - // if (voice->getStaffRelativeVoiceNumber () > 0) { JMI - fLilypondCodeOstream << - "\\context " << voiceContextName << " = " "\"" << - voice->getVoiceName () << "\"" << " <<" << - endl; - - gIndenter++; - - if (gLilypondOah->fNoAutoBeaming) { - fLilypondCodeOstream << - "\\set " << staffContextName << ".autoBeaming = ##f" << - endl; - } - - switch (staffKind) { - case msrStaff::kStaffRegular: - { - int staffRegularVoicesCounter = - staff->getStaffRegularVoicesCounter (); - - if (staffRegularVoicesCounter > 1) { - switch (voice->getRegularVoiceStaffSequentialNumber ()) { - case 1: - fLilypondCodeOstream << "\\voiceOne "; - break; - case 2: - fLilypondCodeOstream << "\\voiceTwo "; - break; - case 3: - fLilypondCodeOstream << "\\voiceThree "; - break; - case 4: - fLilypondCodeOstream << "\\voiceFour "; - break; - default: - {} - } // switch - - fLilypondCodeOstream << - "% out of " << - staffRegularVoicesCounter << - " regular voices" << - endl; - } - } - break; - - default: - ; - } // switch - - fLilypondCodeOstream << - "\\" << voice->getVoiceName () << endl; - - gIndenter--; - - fLilypondCodeOstream << - ">>" << - endl; - // } -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrUseVoiceCommand& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrUseVoiceCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrNewLyricsBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrNewLyricsBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (! gLilypondOah->fNoLilypondLyrics) { - S_msrStanza stanza = elt->getStanza (); - - fLilypondCodeOstream << - "\\new Lyrics" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\with {" << - endl; - - if (gMsrOah->fAddStanzasNumbers) { - fLilypondCodeOstream << - gTab << "stanza = \"" << - stanza->getStanzaNumber () << - ".\"" << - endl; - } - - fLilypondCodeOstream << - "}" << - endl; - - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - fLilypondCodeOstream << - "\\lyricsto \"" << elt->getVoice ()->getVoiceName () << "\" {" << - "\\" << stanza->getStanzaName () << - "}" << - endl; - break; - case kLyricsDurationsExplicit: - // no \lyricsto in that case - fLilypondCodeOstream << - "\\" << stanza->getStanzaName () << - endl; - break; - } // switch - - gIndenter--; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrNewLyricsBlock& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrNewLyricsBlock" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (! gLilypondOah->fNoLilypondLyrics) { - // JMI - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrVariableUseCommand& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrVariableUseCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrVariableUseCommand& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrVariableUseCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrChordNamesContext& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrChordNamesContext" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - string - contextTypeKindAsString = - elt->getContextTypeKindAsString (), - contextName = - elt->getContextName (); - - fLilypondCodeOstream << - "\\context " << contextTypeKindAsString << - " = \"" << contextName << "\"" << - endl; - -/* JMI - if (false) { //option JMI - fLilypondCodeOstream << - "\\with {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\override Barline.bar-extent = #'(-2 . 2)" << - endl << - "\\consists \"Bar_engraver\"" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - } - */ - - fLilypondCodeOstream << - "\\" << contextName << - endl << - endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrChordNamesContext& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrChordNamesContext" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrFiguredBassContext& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrFiguredBassContext" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - string - contextTypeKindAsString = - elt->getContextTypeKindAsString (), - contextName = - elt->getContextName (); - - fLilypondCodeOstream << - "\\context " << contextTypeKindAsString << - " = \"" << contextName << "\"" << - endl; - -/* JMI - if (false) { //option JMI - fLilypondCodeOstream << - "\\with {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\override Barline.bar-extent = #'(-2 . 2)" << - endl << - "\\consists \"Bar_engraver\"" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - } - */ - - fLilypondCodeOstream << - "\\" << contextName << - endl << - endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrFiguredBassContext& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrFiguredBassContext" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrBarCommand& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrBarCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrBarCommand& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrBarCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; -} - -//________________________________________________________________________ -/* JMI -void lpsr2LilypondTranslator::visitStart (S_lpsrMelismaCommand& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrMelismaCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (elt->getMelismaKind ()) { - case lpsrMelismaCommand::kMelismaStart: -// JMI fLilypondCodeOstream << "\\melisma "; - break; - case lpsrMelismaCommand::kMelismaEnd: -// JMI fLilypondCodeOstream << "\\melismaEnd "; - break; - } // switch -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrMelismaCommand& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrMelismaCommand" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} -*/ - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrScore& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrScore& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrScore" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrScaling& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrScaling" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrScaling& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrScaling" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrPageLayout& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrPageLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - // page size - S_msrLength fPageHeight; - S_msrLength fPageWidth; - - // margins - S_msrMargin fLeftMargin; - S_msrMargin fRightMargin; - S_msrMargin fTopMargin; - S_msrMargin fBottomMargin; - */ - - S_msrLength - pageHeight = - elt->getPageHeight (); - - if (pageHeight) { - fLilypondCodeOstream << - pageHeight->getLengthValue () << - lengthUnitAsLilypondString (pageHeight->getLengthUnitKind ()) << - endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrPageLayout& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrPageLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrCredit& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrCredit" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrCredit& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrCredit" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitStart (S_msrCreditWords& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrCreditWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrCreditWords& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrCreditWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrPartGroup& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrPartGroup" << - ", line " << elt->getInputLineNumber () << - elt->getPartGroupCombinedName () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrPartGroup& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrPartGroup" << - elt->getPartGroupCombinedName () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrPart& elt) -{ - string - partCombinedName = - elt->getPartCombinedName (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrPart" << - partCombinedName << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - fCurrentPart = elt; - - fRemainingRestMeasuresNumber = 0; // JMI - fOnGoingRestMeasures = false; // JMI -} - -void lpsr2LilypondTranslator::visitEnd (S_msrPart& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrPart" << - elt->getPartCombinedName () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentPart = nullptr; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrStaff& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrStaff \"" << - elt->getStaffName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingStaff = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrStaff& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrStaff \"" << - elt->getStaffName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingStaff = false; -} - -void lpsr2LilypondTranslator::visitStart (S_msrStaffTuning& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> Start visiting msrStaffTuning" << - endl; - } -#endif - -/* JMI - list - staffTuningsList = - staff->getStaffTuningsList (); - - if (staffTuningsList.size ()) { - // \set TabStaff.stringTunings = \stringTuning - - fLilypondCodeOstream << - "\\set TabStaff.stringTunings = \\stringTuning <"; - - list::const_iterator - iBegin = staffTuningsList.begin (), - iEnd = staffTuningsList.end (), - i = iBegin; - - for ( ; ; ) { - fLilypondCodeOstream << - msrQuarterTonesPitchAsString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguage, - // JMI elt->getInputLineNumber (), - ((*i)->getStaffTuningQuarterTonesPitch ())) << - // JMI char (tolower ((*i)->getStaffTuningStep ())) << - absoluteOctaveAsLilypondString ( - (*i)->getStaffTuningOctave ()); - if (++i == iEnd) break; - fLilypondCodeOstream << ' '; - } // for - - fLilypondCodeOstream << - ">" << - endl; - } - */ -} - -void lpsr2LilypondTranslator::visitStart (S_msrStaffDetails& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> Start visiting msrStaffDetails" << - endl; - } -#endif - - // fetch staff lines number - int - staffLinesNumber = - elt->getStaffLinesNumber (); - - fLilypondCodeOstream << - endl << - "\\stopStaff " << - endl << - "\\override Staff.StaffSymbol.line-count = " << - staffLinesNumber << - endl << - "\\startStaff" << - endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrVoice& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrVoice \"" << - elt->getVoiceName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoice = elt; - - fLilypondCodeOstream << - fCurrentVoice->getVoiceName () << - " = "; - - // generate the beginning of the voice definition - switch (fCurrentVoice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fLilypondCodeOstream << - "\\relative"; - if ( - gLilypondOah->fRelativeOctaveEntrySemiTonesPitchAndOctave -// JMI != -// gLilypondOah->fSemiTonesPitchAndOctaveDefaultValue - ) { - // option '-rel, -relative' has been used - fLilypondCodeOstream << - " " << - msrSemiTonesPitchAndOctaveAsLilypondString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - gLilypondOah->fRelativeOctaveEntrySemiTonesPitchAndOctave); - } - break; - - case kOctaveEntryAbsolute: - fLilypondCodeOstream << - "\\absolute"; - break; - - case kOctaveEntryFixed: - fLilypondCodeOstream << - "\\fixed " << - msrSemiTonesPitchAndOctaveAsLilypondString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - gLilypondOah->fFixedOctaveEntrySemiTonesPitchAndOctave); - break; - } // switch - - fLilypondCodeOstream << - " {" << - endl; - break; - - case msrVoice::kVoiceHarmony: - fLilypondCodeOstream << - "\\chordmode {" << - endl; - break; - - case msrVoice::kVoiceFiguredBass: - fLilypondCodeOstream << - "\\figuremode {" << - endl; - break; - } // switch - - gIndenter++; - - // use a 'global' macro? - if (gLilypondOah->fGlobal) { - fLilypondCodeOstream << - "\\global" << - endl << - endl; - } - - // \displayMusic? - if (gLilypondOah->fDisplayMusic) { - fLilypondCodeOstream << - "\\displayMusic {" << - endl; - - gIndenter++; - } - - // language - fLilypondCodeOstream << - "\\language \"" << - msrQuarterTonesPitchesLanguageKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind) << - "\"" << - endl; - - // chords language - if (gLpsrOah->fLpsrChordsLanguageKind != k_IgnatzekChords) { - fLilypondCodeOstream << - "\\" << - lpsrChordsLanguageKindAsString ( - gLpsrOah-> - fLpsrChordsLanguageKind) << - "Chords" << - endl; - } - - // show all bar numbers? - if (gLilypondOah->fShowAllBarNumbers) { - fLilypondCodeOstream << - "\\set Score.barNumberVisibility = #all-bar-numbers-visible" << - endl << - "\\override Score.BarNumber.break-visibility = ##(#f #t #t)" << - endl << - endl; - } - - // center bar number? - if (gLilypondOah->fBoxAroundBarNumberSet.size ()) { - // yes, center the boxed bar number -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - fLogOutputStream << - endl << - "Centering boxed LilyPond measure numbers" << - ", line " << elt->getInputLineNumber () << " ===-->" << - endl; - } -#endif - - fLilypondCodeOstream << - "\\override Score.BarNumber.self-alignment-X = #CENTER" << - endl; - } - - // compress full measure rests? - if (gLilypondOah->fCompressFullMeasureRests) { - fLilypondCodeOstream << - "\\compressFullBarRests" << - endl << - "\\set restNumberThreshold = 0" << - endl << - endl; - } - -// JMI \set Score.alternativeNumberingStyle = #'numbers-with-letters - -/* JMI - if ( - fCurrentVoice->getVoiceContainsRestMeasures () - || - gLilypondOah->fCompressFullMeasureRests - ) { - fLilypondCodeOstream << - "\\compressFullBarRests" << - endl; - - gIndenter++; - } -*/ - - if (gLilypondOah->fAccidentalStyleKind != kDefault) { - fLilypondCodeOstream << - "\\accidentalStyle Score." << - lpsrAccidentalStyleKindAsString ( - gLilypondOah->fAccidentalStyleKind) << - endl << - endl; - } - - // reset fCurrentVoiceClef - fCurrentVoiceClef = nullptr; - - // reset fCurrentOctaveEntryReference if relevant - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - // forget about the current reference: - // it should be set from the LilyPond preferences here - setCurrentOctaveEntryReferenceFromTheLilypondOah (); - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - - fVoiceIsCurrentlySenzaMisura = false; - - fOnGoingVoice = true; - - switch (fCurrentVoice->getVoiceKind ()) { // JMI - case msrVoice::kVoiceRegular: - break; - - case msrVoice::kVoiceHarmony: - fOnGoingHarmonyVoice = true; - break; - - case msrVoice::kVoiceFiguredBass: - fOnGoingFiguredBassVoice = true; - break; - } // switch - - // reset current voice measures counter - fCurrentVoiceMeasuresCounter = 0; // none have been found - - // force durations to be displayed explicitly - // at the beginning of the voice - fLastMetWholeNotes = rational (0, 1); -} - -void lpsr2LilypondTranslator::visitEnd (S_msrVoice& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrVoice \"" << - elt->getVoiceName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - /* JMI - if ( - fCurrentVoice->getVoiceContainsRestMeasures () - || - gLilypondOah->fCompressFullMeasureRests - ) { - fLilypondCodeOstream << - // JMI "}" << - endl; - - gIndenter--; - */ - - if (gLilypondOah->fDisplayMusic) { - fLilypondCodeOstream << - "}" << - endl; - - gIndenter--; - } - - // generate the end of the voice definition - switch (elt->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - fLilypondCodeOstream << - "}" << - endl << - endl; - break; - - case msrVoice::kVoiceHarmony: - fLilypondCodeOstream << - "}" << - endl << - endl; - break; - - case msrVoice::kVoiceFiguredBass: - fLilypondCodeOstream << - "}" << - endl << - endl; - break; - } // switch - - switch (elt->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - break; - - case msrVoice::kVoiceHarmony: - fOnGoingHarmonyVoice = false; - break; - - case msrVoice::kVoiceFiguredBass: - fOnGoingFiguredBassVoice = false; - break; - } // switch - - fCurrentVoice = nullptr; - fOnGoingVoice = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrVoiceStaffChange& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrVoiceStaffChange '" << - elt->asString () << "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - endl << - "\\change Staff=\"" << - elt->getStaffToChangeTo ()->getStaffName () << - "\""; - - if ( - gLilypondOah->fInputLineNumbers - || - gLilypondOah->fPositionsInMeasures - ) { - generateInputLineNumberAndOrPositionInMeasureAsAComment ( - elt); - } - - fLilypondCodeOstream << endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrHarmony& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrHarmony '" << - elt->asString () << - "'" << - ", fOnGoingNote = " << booleanAsString (fOnGoingNote) << - ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - ", fOnGoingHarmonyVoice = " << booleanAsString (fOnGoingHarmonyVoice) << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLilypondCodeOstream << - "%{ fOnGoingNote S_msrHarmony JMI " << fCurrentFiguredBass->asString () << " %}" << - endl; - } -#endif - } - - else if (fOnGoingChord) { // JMI - } - - else if (fOnGoingHarmonyVoice) { - fLilypondCodeOstream << - harmonyAsLilypondString (elt) << - ' '; - - if ( - gLilypondOah->fInputLineNumbers - || - gLilypondOah->fPositionsInMeasures - ) { - generateInputLineNumberAndOrPositionInMeasureAsAComment ( - elt); - } - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrFrame& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrHarmony '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceFrames) { - fLilypondCodeOstream << - "%{ " << elt->asString () << " %}" << - endl; - } -#endif - - fLilypondCodeOstream << - frameAsLilypondString (elt) << - endl; - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrFiguredBass& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", fOnGoingNote = " << booleanAsString (fOnGoingNote) << - ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - ", fOnGoingFiguredBassVoice = " << booleanAsString (fOnGoingFiguredBassVoice) << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFiguredBass = elt; - - if (fOnGoingNote) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - fLilypondCodeOstream << - "%{ fOnGoingNote S_msrFiguredBass JMI " << fCurrentFiguredBass->asString () << " %}" << - endl; - } -#endif - } - - else if (fOnGoingChord) { // JMI - } - - else if (fOnGoingFiguredBassVoice) { - fLilypondCodeOstream << - figuredBassAsLilypondString (elt) << - ' '; - - if ( - gLilypondOah->fInputLineNumbers - || - gLilypondOah->fPositionsInMeasures - ) { - generateInputLineNumberAndOrPositionInMeasureAsAComment ( - fCurrentFiguredBass); - } - } - - fCurrentFiguredBassFiguresCounter = 0; -} - -void lpsr2LilypondTranslator::visitStart (S_msrFigure& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrFigure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingFiguredBassVoice) { - fCurrentFiguredBassFiguresCounter++; - - // is the figured bass parenthesized? - msrFiguredBass::msrFiguredBassParenthesesKind - figuredBassParenthesesKind = - fCurrentFiguredBass-> - getFiguredBassParenthesesKind (); - - // generate the figure number - switch (figuredBassParenthesesKind) { - case msrFiguredBass::kFiguredBassParenthesesYes: - fLilypondCodeOstream << "["; - break; - case msrFiguredBass::kFiguredBassParenthesesNo: - break; - } // switch - - fLilypondCodeOstream << - elt->getFigureNumber (); - - switch (figuredBassParenthesesKind) { - case msrFiguredBass::kFiguredBassParenthesesYes: - fLilypondCodeOstream << "]"; - break; - case msrFiguredBass::kFiguredBassParenthesesNo: - break; - } // switch - - // handle the figure prefix - switch (elt->getFigurePrefixKind ()) { - case msrFigure::k_NoFigurePrefix: - break; - case msrFigure::kDoubleFlatPrefix: - fLilypondCodeOstream << "--"; - break; - case msrFigure::kFlatPrefix: - fLilypondCodeOstream << "-"; - break; - case msrFigure::kFlatFlatPrefix: - fLilypondCodeOstream << "flat flat"; - break; - case msrFigure::kNaturalPrefix: - fLilypondCodeOstream << "!"; - break; - case msrFigure::kSharpSharpPrefix: - fLilypondCodeOstream << "sharp sharp"; - break; - case msrFigure::kSharpPrefix: - fLilypondCodeOstream << "+"; - break; - case msrFigure::kDoubleSharpPrefix: - fLilypondCodeOstream << "++"; - break; - } // switch - - // handle the figure suffix - switch (elt->getFigureSuffixKind ()) { - case msrFigure::k_NoFigureSuffix: - break; - case msrFigure::kDoubleFlatSuffix: - fLilypondCodeOstream << "double flat"; - break; - case msrFigure::kFlatSuffix: - fLilypondCodeOstream << "flat"; - break; - case msrFigure::kFlatFlatSuffix: - fLilypondCodeOstream << "flat flat"; - break; - case msrFigure::kNaturalSuffix: - fLilypondCodeOstream << "natural"; - break; - case msrFigure::kSharpSharpSuffix: - fLilypondCodeOstream << "sharp sharp"; - break; - case msrFigure::kSharpSuffix: - fLilypondCodeOstream << "sharp"; - break; - case msrFigure::kDoubleSharpSuffix: - fLilypondCodeOstream << "souble sharp"; - break; - case msrFigure::kSlashSuffix: - fLilypondCodeOstream << "/"; - break; - } // switch - - // generate a space if not last figure in figured bass - if ( - fCurrentFiguredBassFiguresCounter - < - fCurrentFiguredBass->getFiguredBassFiguresList ().size () - ) { - fLilypondCodeOstream << ' '; - } - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrFiguredBass& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* JMI - if (fOnGoingFiguredBassVoice) { - fLilypondCodeOstream << - ">"; - - // print figured bass duration - msrTupletFactor - figuredBassTupletFactor = - elt->getFiguredBassTupletFactor (); - - if (figuredBassTupletFactor.isEqualToOne ()) { - // use figured bass sounding whole notes - fLilypondCodeOstream << - wholeNotesAsLilypondString ( - inputLineNumber, - elt-> - getFiguredBassSoundingWholeNotes ()); - } - else { - // use figured bass display whole notes and tuplet factor - fLilypondCodeOstream << - wholeNotesAsLilypondString ( - inputLineNumber, - elt-> - getFiguredBassDisplayWholeNotes ()) << - "*" << - figuredBassTupletFactor.asRational (); - } - - fLilypondCodeOstream << - ' '; - } - */ -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrSegment& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> Start visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - endl; - } -#endif - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% start of segment " << - elt->getSegmentAbsoluteNumber () << - ", line " << - elt->getInputLineNumber () << - endl; - - gIndenter++; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrSegment& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> End visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - endl; - } -#endif - - if (gLilypondOah->fComments) { - gIndenter--; - - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% end of segment" << - endl; - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrMeasure& elt) -{ - int - inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - - msrMeasure::msrMeasureKind - measureKind = - elt->getMeasureKind (); - - msrMeasure::msrMeasureEndRegularKind - measureEndRegularKind = - elt-> getMeasureEndRegularKind (); - - int - measurePuristNumber = - elt->getMeasurePuristNumber (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrMeasure '" << - measureNumber << - "', " << - msrMeasure::measureKindAsString (measureKind) << - ", " << - msrMeasure::measureEndRegularKindAsString ( - measureEndRegularKind) << - ", measurePuristNumber = '" << - measurePuristNumber << - "', onGoingRestMeasures = '" << - booleanAsString ( - fOnGoingRestMeasures) << - ", line " << inputLineNumber << - endl; - } -#endif - - // should we generated a box around this bar number? - { - set::const_iterator - it = - gLilypondOah-> - fBoxAroundBarNumberSet.find (measurePuristNumber); - - if (it != gLilypondOah->fBoxAroundBarNumberSet.end ()) { - // yes, generate a box around the bar number - #ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - fLogOutputStream << - endl << - "Generating a box around LilyPond measure purist number '" << - measurePuristNumber << - "', line " << inputLineNumber << " ===-->" << - endl; - } - #endif - - fLilypondCodeOstream << - "\\boxAroundNextBarNumber" << - endl; - } - } - - // should we reset the measure purist number? - { - map::const_iterator - it = - gLilypondOah-> - fResetMeasureElementMeasureNumberMap.find (measureNumber); - - if (it != gLilypondOah->fResetMeasureElementMeasureNumberMap.end ()) { - // yes, reset measure number - int lilypondMeasureNumber = (*it).second; - - if (to_string (lilypondMeasureNumber) != measureNumber) { - #ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - fLogOutputStream << - endl << - "Resetting LilyPond measure number from '" << - measureNumber << - "' to " << - lilypondMeasureNumber << - "', line " << inputLineNumber << " ===-->" << - endl; - } - #endif - - fLilypondCodeOstream << - "\\set Score.currentBarNumber = #" << - lilypondMeasureNumber << - endl; - } - else { - #ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - fLogOutputStream << - endl << - "Cannot reset measure LilyPond number from '" << - measureNumber << - "' to " << - lilypondMeasureNumber << - ": they're one and the same" << - "', line " << inputLineNumber << " ===-->" << - endl; - } - #endif - } - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - fLogOutputStream << - endl << - "% " << - endl; - } -#endif - - // generate comment if relevant - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% start of " << - msrMeasure::measureKindAsString (elt->getMeasureKind ()) << - " measure " << - measureNumber << - ", line " << inputLineNumber << - endl; - - gIndenter++; - } - - // take this measure into account for counting - switch (elt->getMeasureKind ()) { - case msrMeasure::kMeasureKindUnknown: - fCurrentVoiceMeasuresCounter++; - break; - case msrMeasure::kMeasureKindRegular: - fCurrentVoiceMeasuresCounter++; - break; - case msrMeasure::kMeasureKindAnacrusis: - // keep fCurrentVoiceMeasuresCounter at 0 - break; - case msrMeasure::kMeasureKindIncompleteStandalone: - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: - fCurrentVoiceMeasuresCounter++; - break; - case msrMeasure::kMeasureKindOvercomplete: - fCurrentVoiceMeasuresCounter++; - break; - case msrMeasure::kMeasureKindCadenza: - fCurrentVoiceMeasuresCounter++; - break; - case msrMeasure::kMeasureKindMusicallyEmpty: - fCurrentVoiceMeasuresCounter++; - break; - } // switch - - // force durations to be displayed explicitly - // for the notes at the beginning of the measure - fLastMetWholeNotes = rational (0, 1); - - // is this the end of a cadenza? - if ( - fOnGoingVoiceCadenza - && - measureKind != msrMeasure::kMeasureKindOvercomplete - ) { - /* JMI - fLilypondCodeOstream << - endl << - "\\cadenzaOff" << - // JMI " \\undo \\omit Staff.TimeSignature" << - endl << - "\\bar \"|\" "; // JMI ??? - */ - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << - " % kMeasureKindOvercomplete End"; - } - - fLilypondCodeOstream<< - endl; - - fOnGoingVoiceCadenza = false; - } - - switch (measureKind) { - case msrMeasure::kMeasureKindUnknown: - { - stringstream s; - - s << - "measure '" << measureNumber << - "' is of unknown kind"; - -if (false) // JMI - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); -else - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - break; - - case msrMeasure::kMeasureKindRegular: - break; - - case msrMeasure::kMeasureKindAnacrusis: - if (elt->getMeasureFirstInVoice ()) { - // only generate '\partial' at the beginning of a voice - - string - upbeatDuration = - wholeNotesAsLilypondString ( - inputLineNumber, - elt->getCurrentMeasureWholeNotesDuration ()); - - fLilypondCodeOstream << - "\\partial " << upbeatDuration << - endl; - } - break; - - case msrMeasure::kMeasureKindIncompleteStandalone: - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: - { - rational - currentMeasureWholeNotesDuration = - elt->getCurrentMeasureWholeNotesDuration (); - - rational - fullMeasureWholeNotesDuration = - elt->getFullMeasureWholeNotesDuration (); - - // we should set the score current measure whole notes in this case - rational - ratioToFullMeasureWholeNotesDuration = - currentMeasureWholeNotesDuration / fullMeasureWholeNotesDuration; - ratioToFullMeasureWholeNotesDuration.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - const int fieldWidth = 27; - - fLilypondCodeOstream << left << - "% Setting the current measure whole notes for measure " << - setw (fieldWidth) << - measureNumber << - ", line = " << inputLineNumber << - endl << - setw (fieldWidth) << - "% currentMeasureWholeNotesDuration" << " = " << - currentMeasureWholeNotesDuration << - endl << - setw (fieldWidth) << - "% fullMeasureWholeNotesDuration" << " = " << - fullMeasureWholeNotesDuration << - endl << - setw (fieldWidth) << - "% ratioToFullMeasureWholeNotesDuration" << " = " << - ratioToFullMeasureWholeNotesDuration << - endl << - endl; - } -#endif - - if (ratioToFullMeasureWholeNotesDuration == rational (1, 1)) { - stringstream s; - - s << - "underfull measure '" << measureNumber << - "' has actually the full measure whole notes"; - - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // JMI __FILE__, __LINE__, - s.str ()); - } - - else { - /* JMI - fLilypondCodeOstream << - "\\set Score.measureLength = #(ly:make-moment " << - currentMeasureWholeNotesDuration.toString () << - ")" << - endl; - */ - - // should we generate a line break? - if (gLilypondOah->fBreakLinesAtIncompleteRightMeasures) { - fLilypondCodeOstream << - "\\break" << - endl; - } - } - } - break; - - case msrMeasure::kMeasureKindOvercomplete: - if (! fOnGoingVoiceCadenza) { - fLilypondCodeOstream << - endl << - "\\cadenzaOn" << - " \\omit Staff.TimeSignature"; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << " % kMeasureKindOvercomplete Start"; - } - - fLilypondCodeOstream << endl; - - fOnGoingVoiceCadenza = true; - } - break; - - case msrMeasure::kMeasureKindCadenza: - if (! fOnGoingVoiceCadenza) { - fLilypondCodeOstream << - endl << - "\\cadenzaOn"; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << " % kMeasureKindCadenza Start"; - } - - fLilypondCodeOstream << endl; - - fLilypondCodeOstream << - "\\once\\omit Staff.TimeSignature" << - endl; - - fOnGoingVoiceCadenza = true; - } - break; - - case msrMeasure::kMeasureKindMusicallyEmpty: - { - // generate a skip the duration of the measure // JMI ??? - // followed by a bar check - fLilypondCodeOstream << - // JMI "s%{9%}" << - "R%{6%}" << - wholeNotesAsLilypondString ( - inputLineNumber, - elt-> - getFullMeasureWholeNotesDuration ()) << - " | " << - endl; - } - break; - } // switch -} - -void lpsr2LilypondTranslator::visitEnd (S_msrMeasure& elt) -{ - int - inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - - msrMeasure::msrMeasureKind - measureKind = - elt->getMeasureKind (); - - msrMeasure::msrMeasureEndRegularKind - measureEndRegularKind = - elt-> getMeasureEndRegularKind (); - - int - measurePuristNumber = - elt->getMeasurePuristNumber (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrMeasure '" << - measureNumber << - "', " << - msrMeasure::measureKindAsString (measureKind) << - ", " << - msrMeasure::measureEndRegularKindAsString ( - measureEndRegularKind) << - ", measurePuristNumber = '" << - measurePuristNumber << - "', onGoingRestMeasures = '" << - booleanAsString ( - fOnGoingRestMeasures) << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - fLogOutputStream << - endl << - "% " << - endl; - } -#endif - - if (! fOnGoingRestMeasures) { - // handle the measure - switch (measureKind) { - case msrMeasure::kMeasureKindUnknown: // should not occur - fLilypondCodeOstream << - "%{ measureKindUnknown, " << - measurePuristNumber + 1 << - " %}" << - endl; - break; - - case msrMeasure::kMeasureKindRegular: - { - } - break; - - case msrMeasure::kMeasureKindAnacrusis: - break; - - case msrMeasure::kMeasureKindIncompleteStandalone: - break; - - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: - break; - - case msrMeasure::kMeasureKindOvercomplete: - fLilypondCodeOstream << - endl << - "\\cadenzaOff" << - " \\undo \\omit Staff.TimeSignature |" << - endl; - - fOnGoingVoiceCadenza = false; - break; - - case msrMeasure::kMeasureKindCadenza: - fLilypondCodeOstream << - endl << - "\\cadenzaOff" << - endl << - "\\bar \"|\"" << // JMI ??? - endl; - - fOnGoingVoiceCadenza = false; - break; - - case msrMeasure::kMeasureKindMusicallyEmpty: // should not occur - fLilypondCodeOstream << - "%{ emptyMeasureKind" << - ", line " << inputLineNumber << - " %} | % " << - measurePuristNumber + 1 << - endl; - break; - } // switch - - if (gLilypondOah->fComments) { - gIndenter--; - - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% end of " << - msrMeasure::measureKindAsString (elt->getMeasureKind ()) << - " measure " << - measureNumber << - ", line " << inputLineNumber << - endl << - endl; - } - - if (gLilypondOah->fSeparatorLineEveryNMeasures > 0) { - if ( - fCurrentVoiceMeasuresCounter - % - gLilypondOah->fSeparatorLineEveryNMeasures - == - 0) - fLilypondCodeOstream << - endl << - "% ============================= " << - endl << - endl; - } - } - - // should we generate a line break? - { - set::const_iterator - it = - gLilypondOah-> - fBreakLineAfterMeasureNumberSet.find (measureNumber); - - if (it != gLilypondOah->fBreakLineAfterMeasureNumberSet.end ()) { - // yes, generate a line break command - #ifdef TRACE_OAH - if (gTraceOah->fTraceLineBreaks) { - fLogOutputStream << - endl << - "Adding a LilyPond line break after measure number '" << - measureNumber << - "', line " << inputLineNumber << " ===-->" << - endl; - } - #endif - - fLilypondCodeOstream << - "\\break" << - endl; - } - - /* JMI - else { - #ifdef TRACE_OAH - if (gTraceOah->fTraceLineBreaks) { // JMI - fLogOutputStream << - endl << - "Measure number '" << - measureNumber << - "' not found in gLilypondOah->fBreakLineAfterMeasureNumberSet" << - ", line " << inputLineNumber << - endl; - } - #endif - } - */ - } - - // should we generate a page break? - { - set::const_iterator - it = - gLilypondOah-> - fBreakPageAfterMeasureNumberSet.find (measureNumber); - - if (it != gLilypondOah->fBreakPageAfterMeasureNumberSet.end ()) { - // yes, generate a page break command - #ifdef TRACE_OAH - if (gTraceOah->fTracePageBreaks) { - fLogOutputStream << - endl << - "Adding a LilyPond page break after measure number '" << - measureNumber << - "', line " << inputLineNumber << " ===-->" << - endl; - } - #endif - - fLilypondCodeOstream << - "\\pageBreak" << - endl; - } - - /* JMI - else { - #ifdef TRACE_OAH - if (gTraceOah->fTracePageBreaks) { // JMI - fLogOutputStream << - endl << - "Measure number '" << - measureNumber << - "' not found in gLilypondOah->fBreakPageAfterMeasureNumberSet" << - ", line " << inputLineNumber << - endl; - } - #endif - } - */ - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrStanza& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrStanza \"" << - elt->getStanzaName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (! gLilypondOah->fNoLilypondLyrics) { - // don't generate code for the stanza inside the code for the voice - fGenerateCodeForOngoingNonEmptyStanza = - ! fOnGoingVoice - && - elt->getStanzaTextPresent (); - - if (fGenerateCodeForOngoingNonEmptyStanza) { - fLilypondCodeOstream << - elt->getStanzaName () << " = " << "\\lyricmode {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - // set associatedVoice so that - // both double hyphens and double underscores can be used - // to draw hyphenated lines and extenders under melismata correctly - "\\set associatedVoice = #\"" << - elt->getStanzaVoiceUpLink ()->getVoiceName () << - "\"" << - endl << - "\\set ignoreMelismata = ##t" << - endl; - } - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrStanza& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrStanza \"" << - elt->getStanzaName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (! gLilypondOah->fNoLilypondLyrics) { - if (fGenerateCodeForOngoingNonEmptyStanza) { - gIndenter--; - - fLilypondCodeOstream << - endl << - "}" << - endl << - endl; - } - - fGenerateCodeForOngoingNonEmptyStanza = false; - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrSyllable& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrSyllable '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (! gLilypondOah->fNoLilypondLyrics) { - if (fGenerateCodeForOngoingNonEmptyStanza) { - switch (elt->getSyllableKind ()) { - case msrSyllable::kSyllableNone: // JMI - break; - - case msrSyllable::kSyllableSingle: - writeTextsListAsLilypondString ( - elt->getSyllableTextsList (), - fLilypondCodeOstream); - - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // don't generate a duration for automatic lyrics durations - break; - case kLyricsDurationsExplicit: - fLilypondCodeOstream << - elt->syllableWholeNotesAsMsrString (); - break; - } // switch - - fLilypondCodeOstream << - ' '; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableSingle %} "; - } -#endif - break; - - case msrSyllable::kSyllableBegin: - writeTextsListAsLilypondString ( - elt->getSyllableTextsList (), - fLilypondCodeOstream); - - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // don't generate a duration for automatic lyrics durations - break; - case kLyricsDurationsExplicit: - fLilypondCodeOstream << - elt->syllableWholeNotesAsMsrString (); - break; - } // switch - - fLilypondCodeOstream << - " -- "; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableBegin %} "; - } -#endif - break; - - case msrSyllable::kSyllableMiddle: - writeTextsListAsLilypondString ( - elt->getSyllableTextsList (), - fLilypondCodeOstream); - - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // don't generate a duration for automatic lyrics durations - break; - case kLyricsDurationsExplicit: - fLilypondCodeOstream << - elt->syllableWholeNotesAsMsrString (); - break; - } // switch - - fLilypondCodeOstream << - " -- "; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableMiddle %} "; - } -#endif - break; - - case msrSyllable::kSyllableEnd: - writeTextsListAsLilypondString ( - elt->getSyllableTextsList (), - fLilypondCodeOstream); - - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // don't generate a duration for automatic lyrics durations - break; - case kLyricsDurationsExplicit: - fLilypondCodeOstream << - elt->syllableWholeNotesAsMsrString (); - break; - } // switch - - fLilypondCodeOstream << - ' '; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableEnd %} "; - } -#endif - break; - - case msrSyllable::kSyllableOnRestNote: - // generate the syllable in lyrics for rests with syllables - writeTextsListAsLilypondString ( - elt->getSyllableTextsList (), - fLilypondCodeOstream); - fLilypondCodeOstream << - elt->syllableWholeNotesAsMsrString () << - ' '; -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - " %{ syllableOnRestNote %} "; - } -#endif - break; - - case msrSyllable::kSyllableSkipRestNote: - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // LilyPond ignores the skip durations when \lyricsto is used -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - " %{ NOTHING for kSyllableSkipRestNote " << - elt->syllableWholeNotesAsMsrString () << - " %} "; - } -#endif - break; - case kLyricsDurationsExplicit: - fLilypondCodeOstream << - "\\skip" << - elt->syllableWholeNotesAsMsrString () << - ' '; -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - " %{ kLyricsDurationsExplicit %} "; - } -#endif - break; - } // switch - break; - - case msrSyllable::kSyllableSkipNonRestNote: - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // LilyPond ignores the skip durations when \lyricsto is used - fLilypondCodeOstream << - "\\skip" << - elt->syllableWholeNotesAsMsrString () << - ' '; -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - " %{ syllableSkipNonRestNote lyricsDurationsImplicit %} "; - } -#endif - break; - case kLyricsDurationsExplicit: - fLilypondCodeOstream << - "\\skip" << - elt->syllableWholeNotesAsMsrString () << - ' '; -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - " %{ syllableSkipNonRestNote lyricsDurationsExplicit %} "; - } -#endif - break; - } // switch - break; - - case msrSyllable::kSyllableMeasureEnd: - // JMI "| " << - if (gLilypondOah->fInputLineNumbers) { - // print the measure end line number as a comment - fLilypondCodeOstream << - "%{ syllableMeasureEnd, line " << - elt->getInputLineNumber () << - " %}"; - } - - // JMI fLilypondCodeOstream << endl; - break; - - case msrSyllable::kSyllableLineBreak: - // print the measure end line number as a comment - fLilypondCodeOstream << - "%{ syllableLineBreak, line " << - elt->getInputLineNumber () << - " %} " << - "%| % " << // JMI BLARK TO BE FIXED - elt->getSyllableNextMeasurePuristNumber () << - endl; - break; - - case msrSyllable::kSyllablePageBreak: - // print the measure end line number as a comment - fLilypondCodeOstream << - "%{ syllablePageBreak, line " << - elt->getInputLineNumber () << - " %}" << - endl; - break; - } // switch - - switch (elt->getSyllableExtendKind ()) { - case msrSyllable::kSyllableExtendNone: -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableExtendNone %} "; - } -#endif - break; - - case msrSyllable::kSyllableExtendSingle: - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // generate a lyric extender, i.e. a melisma, after this syllable - fLilypondCodeOstream << - "__ "; - break; - case kLyricsDurationsExplicit: - // generate a lyric extender, i.e. a melisma, after this syllable ??? JMI - fLilypondCodeOstream << - "__ "; - break; - } // switch -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableExtendSingle %} "; - } -#endif - break; - - case msrSyllable::kSyllableExtendStart: - switch (gLilypondOah->fLyricsDurationsKind) { - case kLyricsDurationsImplicit: - // generate a lyric extender, i.e. a melisma, after this syllable - fLilypondCodeOstream << - "__ "; - break; - case kLyricsDurationsExplicit: - // generate a lyric extender, i.e. a melisma, after this syllable ??? JMI - fLilypondCodeOstream << - "__ "; - break; - } // switch -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableExtendStart %} "; - } -#endif - break; - - case msrSyllable::kSyllableExtendContinue: -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableExtendContinue %} "; - } -#endif - break; - - case msrSyllable::kSyllableExtendStop: -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLilypondCodeOstream << - "%{ syllableExtendStop %} "; - } -#endif - break; - } // switch - - if ( - gLilypondOah->fInputLineNumbers - || - gLilypondOah->fPositionsInMeasures - ) { - generateInputLineNumberAndOrPositionInMeasureAsAComment ( - elt); - } - } - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrSyllable& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrSyllable '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrClef& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrClef '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << endl; - - // get the clef kind - msrClef::msrClefKind - clefKind = - elt->getClefKind (); - - if (gLilypondOah->fCommentClefChanges) { - /* JMI - S_msrClef - currentVoiceCurrentClef = - fCurrentVoice->getVoiceCurrentClef (); -*/ - - if ( - fCurrentVoiceClef - && - fCurrentVoiceClef->getClefKind () != clefKind - ) { - // this is a clef change, comment it - -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Commenting clef change from " << - fCurrentVoiceClef->asShortString () << - " to " << - elt->asShortString () << - endl; - } -#endif - - fLilypondCodeOstream << "% "; - } - } - - if (clefKind != msrClef::k_NoClef) { - fLilypondCodeOstream << - "\\clef "; - - switch (clefKind) { - case msrClef::k_NoClef: - break; - case msrClef::kTrebleClef: - fLilypondCodeOstream << "\"treble\""; - break; - case msrClef::kSopranoClef: - fLilypondCodeOstream << "\"soprano\""; - break; - case msrClef::kMezzoSopranoClef: - fLilypondCodeOstream << "\"mezzosoprano\""; - break; - case msrClef::kAltoClef: - fLilypondCodeOstream << "\"alto\""; - break; - case msrClef::kTenorClef: - fLilypondCodeOstream << "\"tenor\""; - break; - case msrClef::kBaritoneClef: - fLilypondCodeOstream << "\"baritone\""; - break; - case msrClef::kBassClef: - fLilypondCodeOstream << "\"bass\""; - break; - case msrClef::kTrebleLine1Clef: - fLilypondCodeOstream << "\"french\""; - break; - case msrClef::kTrebleMinus15Clef: - fLilypondCodeOstream << "\"treble_15\""; - break; - case msrClef::kTrebleMinus8Clef: - fLilypondCodeOstream << "\"treble_8\""; - break; - case msrClef::kTreblePlus8Clef: - fLilypondCodeOstream << "\"treble^8\""; - break; - case msrClef::kTreblePlus15Clef: - fLilypondCodeOstream << "\"treble^15\""; - break; - case msrClef::kBassMinus15Clef: - fLilypondCodeOstream << "\"bass_15\""; - break; - case msrClef::kBassMinus8Clef: - fLilypondCodeOstream << "\"bass_8\""; - break; - case msrClef::kBassPlus8Clef: - fLilypondCodeOstream << "\"bass^8\""; - break; - case msrClef::kBassPlus15Clef: - fLilypondCodeOstream << "\"bass^15\""; - break; - case msrClef::kVarbaritoneClef: - fLilypondCodeOstream << "\"varbaritone\""; - break; - - case msrClef::kTablature4Clef: - case msrClef::kTablature5Clef: - case msrClef::kTablature6Clef: - case msrClef::kTablature7Clef: - if (gLilypondOah->fModernTab) { - fLilypondCodeOstream << - "\"moderntab\"" << - endl; - } - else { - fLilypondCodeOstream << - "\"tab\"" << - endl; - } - if (gLilypondOah->fTabFullNotation) { - fLilypondCodeOstream << - "\\tabFullNotation" << - endl; - } - break; - - case msrClef::kPercussionClef: - fLilypondCodeOstream << "\"percussion\""; - break; - case msrClef::kJianpuClef: - fLilypondCodeOstream << "\"%{jianpuClef???%}\""; - break; - } // switch - - fLilypondCodeOstream << - endl; - } - - // register current voice clef - fCurrentVoiceClef = elt; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrClef& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrClef '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrKey& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrKey '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (fCurrentVoice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - switch (elt->getKeyKind ()) { - case msrKey::kTraditionalKind: - fLilypondCodeOstream << - "\\key " << - msrQuarterTonesPitchKindAsString ( - gLpsrOah->fLpsrQuarterTonesPitchesLanguageKind, - elt->getKeyTonicQuarterTonesPitchKind ()) << - " \\" << - msrKey::keyModeKindAsString ( - elt->getKeyModeKind ()) << - endl; - break; - - case msrKey::kHumdrumScotKind: - { - const vector& - humdrumScotKeyItemsVector = - elt->getHumdrumScotKeyItemsVector (); - - if (humdrumScotKeyItemsVector.size ()) { - fLilypondCodeOstream << - endl << - "\\set Staff.keyAlterations = #`("; - - vector::const_iterator - iBegin = humdrumScotKeyItemsVector.begin (), - iEnd = humdrumScotKeyItemsVector.end (), - i = iBegin; - - for ( ; ; ) { - S_msrHumdrumScotKeyItem item = (*i); - - if (elt->getKeyItemsOctavesAreSpecified ()) { - // JMI "((octave . step) . alter) ((octave . step) . alter) ...)"; - //\set Staff.keyAlterations = #`(((3 . 3) . 7) ((3 . 5) . 3) ((3 . 6) . 3))" \time 2/4 - - - fLilypondCodeOstream << - "(" << - "(" << - item->getKeyItemOctave () - 3 << - // in MusicXML, octave number is 4 for the octave - // starting with middle C, - // and the latter is c' in LilyPond - " . " << - item->getKeyItemDiatonicPitchKind () << - ")" << - " . ," << - alterationKindAsLilypondString ( - item->getKeyItemAlterationKind ()) << - ")"; - } - - else { - // Alternatively, for each item in the list, using the more concise format (step . alter) specifies that the same alteration should hold in all octaves. - - fLilypondCodeOstream << - "(" << - item->getKeyItemDiatonicPitchKind () << - " . ," << - alterationKindAsLilypondString ( - item->getKeyItemAlterationKind ()) << - ")"; - } - - if (++i == iEnd) break; - - fLilypondCodeOstream << ' '; - } // for - - fLilypondCodeOstream << - ")"; - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - "Humdrum/Scot key items vector is empty"); - } - } - break; - } // switch - break; - - case msrVoice::kVoiceFiguredBass: - // not \key should be generated in \figuremode - break; - } // switch -} - -void lpsr2LilypondTranslator::visitEnd (S_msrKey& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrKey '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTime& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTime " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - msrTime::msrTimeSymbolKind - timeSymbolKind = - elt->getTimeSymbolKind (); - - const vector& - timeItemsVector = - elt->getTimeItemsVector (); - -/* JMI - // is this the end of a senza misura fragment? - if ( - fVoiceIsCurrentlySenzaMisura - && - timeSymbolKind != msrTime::kTimeSymbolSenzaMisura) { - fLilypondCodeOstream << - "\\undo\\omit Staff.TimeSignature" << - endl; - - fVoiceIsCurrentlySenzaMisura = false; - } -*/ - - // handle the time - if (timeSymbolKind == msrTime::kTimeSymbolSenzaMisura) { - // senza misura time - - /* JMI - fLilypondCodeOstream << - "\\omit Staff.TimeSignature" << - endl; -*/ - - fVoiceIsCurrentlySenzaMisura = true; - } - - else { - // con misura time - - int timesItemsNumber = - timeItemsVector.size (); - - if (timesItemsNumber) { - // should there be a single number? - switch (timeSymbolKind) { - case msrTime::kTimeSymbolCommon: - break; - case msrTime::kTimeSymbolCut: - break; - case msrTime::kTimeSymbolNote: - break; - case msrTime::kTimeSymbolDottedNote: - break; - case msrTime::kTimeSymbolSingleNumber: - fLilypondCodeOstream << - "\\once\\override Staff.TimeSignature.style = #'single-digit" << - endl; - break; - case msrTime::kTimeSymbolSenzaMisura: - break; - case msrTime::kTimeSymbolNone: - break; - } // switch - - if (! elt->getTimeIsCompound ()) { - // simple time - // \time "3/4" for 3/4 - // or senza misura - - S_msrTimeItem - timeItem = - timeItemsVector [0]; // the only element; - - // fetch the time item beat numbers vector - const vector& - beatsNumbersVector = - timeItem-> - getTimeBeatsNumbersVector (); - - // should the time be numeric? - if ( - timeSymbolKind == msrTime::kTimeSymbolNone - || - gLilypondOah->fNumericalTime) { - fLilypondCodeOstream << - "\\numericTimeSignature "; - } - - fLilypondCodeOstream << - "\\time " << - beatsNumbersVector [0] << // the only element - "/" << - timeItem->getTimeBeatValue () << - endl; - } - - else { - // compound time - // \compoundMeter #'(3 2 8) for 3+2/8 - // \compoundMeter #'((3 8) (2 8) (3 4)) for 3/8+2/8+3/4 - // \compoundMeter #'((3 2 8) (3 4)) for 3+2/8+3/4 - - fLilypondCodeOstream << - "\\compoundMeter #`("; - - // handle all the time items in the vector - for (int i = 0; i < timesItemsNumber; i++) { - S_msrTimeItem - timeItem = - timeItemsVector [i]; - - // fetch the time item beat numbers vector - const vector& - beatsNumbersVector = - timeItem-> - getTimeBeatsNumbersVector (); - - int beatsNumbersNumber = - beatsNumbersVector.size (); - - // first generate the opening parenthesis - fLilypondCodeOstream << - "("; - - // then generate all beats numbers in the vector - for (int j = 0; j < beatsNumbersNumber; j++) { - fLilypondCodeOstream << - beatsNumbersVector [j] << - ' '; - } // for - - // then generate the beat type - fLilypondCodeOstream << - timeItem->getTimeBeatValue (); - - // and finally generate the closing parenthesis - fLilypondCodeOstream << - ")"; - - if (i != timesItemsNumber - 1) { - fLilypondCodeOstream << - ' '; - } - } // for - - fLilypondCodeOstream << - ")" << - endl; - } - } - - else { - // there are no time items - if (timeSymbolKind != msrTime::kTimeSymbolSenzaMisura) { - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - "time items vector is empty"); - } - } - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTime& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTime " << - elt->asString () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTranspose& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTranspose" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - int transposeDiatonic = elt->getTransposeDiatonic (); - int transposeChromatic = elt->getTransposeChromatic (); - int transposeOctaveChange = elt->getTransposeOctaveChange (); - bool transposeDouble = elt->getTransposeDouble (); - -/* - // transposition in LilyPond is relative to c', - // i.e. the C in the middle of the piano keyboard - -The diatonic element specifies the number of pitch steps needed to go from written to sounding pitch. This allows for correct spelling of enharmonic transpositions. - -The chromatic element represents the number of semitones needed to get from written to sounding pitch. This value does not include octave-change values; the values for both elements need to be added to the written pitch to get the correct sounding pitch. - -The octave-change element indicates how many octaves to add to get from written pitch to sounding pitch. - -If the double element is present, it indicates that the music is doubled one octave down from what is currently written (as is the case for mixed cello / bass parts in orchestral literature). -*/ - - // determine transposition pitch - msrQuarterTonesPitchKind - transpositionPitchKind = k_NoQuarterTonesPitch_QTP; - - switch (transposeChromatic) { - case -11: - switch (transposeDiatonic) { - case -7: - transpositionPitchKind = kC_Sharp_QTP; - break; - - case -6: - transpositionPitchKind = kD_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -10: - switch (transposeDiatonic) { - case -6: - transpositionPitchKind = kD_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -9: - switch (transposeDiatonic) { - case -6: - transpositionPitchKind = kD_Sharp_QTP; - break; - - case -5: - transpositionPitchKind = kE_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -8: - switch (transposeDiatonic) { - case -5: - transpositionPitchKind = kE_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -7: - switch (transposeDiatonic) { - case -4: - transpositionPitchKind = kF_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -6: - switch (transposeDiatonic) { - case -4: - transpositionPitchKind = kF_Sharp_QTP; - break; - - case -3: - transpositionPitchKind = kG_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -5: - switch (transposeDiatonic) { - case -3: - transpositionPitchKind = kG_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -4: - switch (transposeDiatonic) { - case -3: - transpositionPitchKind = kG_Sharp_QTP; - break; - - case -2: - transpositionPitchKind = kA_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -3: - switch (transposeDiatonic) { - case -2: - transpositionPitchKind = kA_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -2: - switch (transposeDiatonic) { - case -2: - transpositionPitchKind = kA_Sharp_QTP; - break; - - case -1: - transpositionPitchKind = kB_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case -1: - switch (transposeDiatonic) { - case -1: - transpositionPitchKind = kB_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 0: - switch (transposeDiatonic) { - case 0: - transpositionPitchKind = kC_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 1: - switch (transposeDiatonic) { - case 0: - transpositionPitchKind = kC_Sharp_QTP; - break; - - case 1: - transpositionPitchKind = kD_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 2: - switch (transposeDiatonic) { - case 1: - transpositionPitchKind = kD_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 3: - switch (transposeDiatonic) { - case 1: - transpositionPitchKind = kD_Sharp_QTP; - break; - - case 2: - transpositionPitchKind = kE_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 4: - switch (transposeDiatonic) { - case 2: - transpositionPitchKind = kE_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 5: - switch (transposeDiatonic) { - case 3: - transpositionPitchKind = kF_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 6: - switch (transposeDiatonic) { - case 3: - transpositionPitchKind = kF_Sharp_QTP; - break; - - case 4: - transpositionPitchKind = kG_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 7: - switch (transposeDiatonic) { - case 4: - transpositionPitchKind = kG_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 8: - switch (transposeDiatonic) { - case 4: - transpositionPitchKind = kG_Sharp_QTP; - break; - - case 5: - transpositionPitchKind = kA_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 9: - switch (transposeDiatonic) { - case 5: - transpositionPitchKind = kA_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 10: - switch (transposeDiatonic) { - case 5: - transpositionPitchKind = kA_Sharp_QTP; - break; - - case 6: - transpositionPitchKind = kB_Flat_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - case 11: - switch (transposeDiatonic) { - case 6: - transpositionPitchKind = kB_Natural_QTP; - break; - - default: - transposeDiatonicError ( - inputLineNumber, - transposeDiatonic, - transposeChromatic); - } // switch - break; - - default: - { - stringstream s; - - s << - "transpose chromatic '" << transposeChromatic << - "' is not between -12 and 12, ignored"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - } // switch - - // 4 is the octave starting with middle C - int transpositionOctave; - - if (transposeChromatic < 0) { - transpositionOctave = 3; - } - else { - transpositionOctave = 4; - } - - // take the transpose octave change into account - transpositionOctave += transposeOctaveChange; - - // take the transpose double if any into account - if (transposeDouble) { - transpositionOctave--; - } - - string - transpositionPitchKindAsString = - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - transpositionPitchKind); - - string - transpositionOctaveAsString = - absoluteOctaveAsLilypondString ( - transpositionOctave); - -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - fLilypondCodeOstream << // JMI - "Handlling transpose '" << - elt->transposeAsString () << - "' ignored because it is already present in voice \"" << - fCurrentVoice->getVoiceName () << - "\"" << - / * JMI - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - * / - endl << - ", transpositionPitch: " << - transpositionPitchAsString << - ", transpositionOctave: " << - transpositionOctaveAsString << - "(" << transpositionOctave << ")" << - endl; - } -#endif -*/ - - // now we can generate the transpostion command - fLilypondCodeOstream << - "\\transposition " << - transpositionPitchKindAsString << - transpositionOctaveAsString << - ' ' << - endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTranspose& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTranspose" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrPartNameDisplay& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrPartNameDisplay" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - string partNameDisplayValue = - elt->getPartNameDisplayValue (); - - fLilypondCodeOstream << - "\\set Staff.instrumentName = \"" << - partNameDisplayValue << - "\"" << - endl << - // JMI ??? "\\tweak break-visibility #end-of-line-visible" << - // endl << - "\\tweak RehearsalMark.self-alignment-X #LEFT" << - endl << - "\\mark\\markup{\"" << - partNameDisplayValue << - "\"}" << - endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrPartAbbreviationDisplay& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrPartAbbreviationDisplay" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - string partAbbreviationDisplayValue = - elt->getPartAbbreviationDisplayValue (); - - fLilypondCodeOstream << - "\\set Staff.shortInstrumentName = " << - nameAsLilypondString (partAbbreviationDisplayValue) << - endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTempo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - const list& - tempoWordsList = - elt->getTempoWordsList (); - - int tempoWordsListSize = tempoWordsList.size (); - - msrDottedDuration tempoBeatUnit = elt->getTempoBeatUnit (); - string tempoPerMinute = elt->getTempoPerMinute (); - - msrTempo::msrTempoParenthesizedKind - tempoParenthesizedKind = - elt->getTempoParenthesizedKind (); - - switch (elt->getTempoPlacementKind ()) { - case msrPlacementKind::kPlacementNone: - break; - case msrPlacementKind::kPlacementAbove: - break; - case msrPlacementKind::kPlacementBelow: - fLilypondCodeOstream << - "\\once\\override Score.MetronomeMark.direction = #DOWN"; - break; - } // switch - - switch (elt->getTempoKind ()) { - case msrTempo::k_NoTempoKind: - break; - - case msrTempo::kTempoBeatUnitsWordsOnly: - fLilypondCodeOstream << - "\\tempo "; - - if (tempoWordsListSize) { - list::const_iterator - iBegin = tempoWordsList.begin (), - iEnd = tempoWordsList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrWords words = (*i); - - fLilypondCodeOstream << - "\"" << words->getWordsContents () << "\""; - - if (++i == iEnd) break; - - fLilypondCodeOstream << - ' '; - } // for - - fLilypondCodeOstream << - endl; - } - break; - - case msrTempo::kTempoBeatUnitsPerMinute: - switch (tempoParenthesizedKind) { - case msrTempo::kTempoParenthesizedYes: - fLilypondCodeOstream << - "\\tempo " << - "\\markup {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\concat {" << - endl; - - gIndenter++; - - gIndenter++; - - if (tempoWordsListSize) { - list::const_iterator - iBegin = tempoWordsList.begin (), - iEnd = tempoWordsList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrWords words = (*i); - - fLilypondCodeOstream << - "\"" << words->getWordsContents () << "\""; - - if (++i == iEnd) break; - - fLilypondCodeOstream << - ' '; - } // for - } - - fLilypondCodeOstream << - "("; - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - " \\smaller \\general-align #Y #DOWN \\note {"; - } - else { - fLilypondCodeOstream << - "\\smaller \\general-align #Y #DOWN \\note #\""; - } - - fLilypondCodeOstream << - dottedDurationAsLilypondStringWithoutBackSlash ( - inputLineNumber, - tempoBeatUnit); - - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - "} #UP"; - } - else { - fLilypondCodeOstream << - "\" #UP"; - } - - fLilypondCodeOstream << - endl << - "\" = \"" << - endl << - tempoPerMinute << - ")" << - endl; - - gIndenter--; - - fLilypondCodeOstream << endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - break; - - case msrTempo::kTempoParenthesizedNo: - fLilypondCodeOstream << - "\\tempo " << - "\\markup {" << - endl; - - gIndenter++; - - if (tempoWordsListSize) { - list::const_iterator - iBegin = tempoWordsList.begin (), - iEnd = tempoWordsList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrWords words = (*i); - - fLilypondCodeOstream << - "\"" << words->getWordsContents () << "\""; - - if (++i == iEnd) break; - - fLilypondCodeOstream << - ' '; - } // for - } - - fLilypondCodeOstream << - "\\concat {" << - endl; - - gIndenter++; - - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - " \\smaller \\general-align #Y #DOWN \\note {"; - } - else { - fLilypondCodeOstream << - " \\smaller \\general-align #Y #DOWN \\note #\""; - } - - fLilypondCodeOstream << - dottedDurationAsLilypondStringWithoutBackSlash ( - inputLineNumber, - tempoBeatUnit); - - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - "} #UP"; - } - else { - fLilypondCodeOstream << - "\" #UP"; - } - - fLilypondCodeOstream << - endl << - "\" = \"" << - endl << - tempoPerMinute << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - } // switch - break; - - case msrTempo::kTempoBeatUnitsEquivalence: - fLilypondCodeOstream << - "\\tempo "; - - if (tempoWordsListSize) { - list::const_iterator - iBegin = tempoWordsList.begin (), - iEnd = tempoWordsList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrWords words = (*i); - - fLilypondCodeOstream << - "\"" << words->getWordsContents () << "\""; - - if (++i == iEnd) break; - - fLilypondCodeOstream << - ' '; - } // for - } - - fLilypondCodeOstream << - ' ' << - "\\markup {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\concat {" << - endl; - - gIndenter++; - - switch (tempoParenthesizedKind) { - case msrTempo::kTempoParenthesizedYes: - fLilypondCodeOstream << - "(" << - endl; - break; - case msrTempo::kTempoParenthesizedNo: - break; - } // switch - - gIndenter++; - - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - " \\smaller \\general-align #Y #DOWN \\note {"; - } - else { - fLilypondCodeOstream << - " \\smaller \\general-align #Y #DOWN \\note #\""; - } - - fLilypondCodeOstream << - dottedDurationAsLilypondStringWithoutBackSlash ( - inputLineNumber, - tempoBeatUnit); - - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - "} #UP"; - } - else { - fLilypondCodeOstream << - "\" #UP"; - } - - fLilypondCodeOstream << - endl << - "\" = \"" << - endl; - - fLilypondCodeOstream << - "("; - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - " \\smaller \\general-align #Y #DOWN \\note {"; - } - else { - fLilypondCodeOstream << - " \\smaller \\general-align #Y #DOWN \\note #\""; - } - - fLilypondCodeOstream << - dottedDurationAsLilypondStringWithoutBackSlash ( - inputLineNumber, - elt->getTempoEquivalentBeatUnit ()); - - if (gLpsrOah->versionNumberGreaterThanOrEqualTo ("2.20")) { - fLilypondCodeOstream << - "} #UP"; - } - else { - fLilypondCodeOstream << - "\" #UP"; - } - - fLilypondCodeOstream << endl; - - gIndenter--; - - switch (tempoParenthesizedKind) { - case msrTempo::kTempoParenthesizedYes: - fLilypondCodeOstream << - ")" << - endl; - break; - case msrTempo::kTempoParenthesizedNo: - break; - } // switch - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - break; - - case msrTempo::kTempoNotesRelationShip: - fLilypondCodeOstream << - "\\tempoRelationship #\""; - - if (tempoWordsListSize) { - list::const_iterator - iBegin = tempoWordsList.begin (), - iEnd = tempoWordsList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrWords words = (*i); - - fLilypondCodeOstream << - // JMI "\"" << - words->getWordsContents (); // JMI << - // JMI "\""; - - if (++i == iEnd) break; - - fLilypondCodeOstream << - ' '; - } // for - } - - fLilypondCodeOstream << - "\""; - - switch (tempoParenthesizedKind) { - case msrTempo::kTempoParenthesizedYes: - fLilypondCodeOstream << - " ##t"; - break; - case msrTempo::kTempoParenthesizedNo: - fLilypondCodeOstream << - " ##f"; - break; - } // switch - - fLilypondCodeOstream << endl; - break; - } // switch -} - -void lpsr2LilypondTranslator::visitStart (S_msrTempoRelationshipElements& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTempoRelationshipElements" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\fixed b' {" << - endl; - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTempoRelationshipElements& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTempoRelationshipElements" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - fLilypondCodeOstream << - endl << - "}" << - endl; -} - -void lpsr2LilypondTranslator::visitStart (S_msrTempoNote& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTempoNote" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "b" << - wholeNotesAsLilypondString ( - elt->getInputLineNumber (), - elt->getTempoNoteWholeNotes ()) << - ' '; -} - -void lpsr2LilypondTranslator::visitStart (S_msrTempoTuplet& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTempoTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\tuplet " << - elt->getTempoTupletActualNotes () << - "/" << - elt->getTempoTupletNormalNotes () << " { "; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTempoTuplet& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTempoTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "}"; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTempo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrArticulation& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrArticulation" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the articulation here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrArticulation& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrArticulation" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrFermata& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrFermata" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* -Articulations can be attached to rests as well as notes but they cannot be attached to multi-measure rests. A special predefined command, \fermataMarkup, is available for at- taching a fermata to a multi-measure rest (and only a multi-measure rest). This creates a MultiMeasureRestText object. -*/ - -/* JMI - switch (elt->getArticulationPlacement ()) { - case kPlacementNone: - // nothing needed - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - // don't generate fermatas for chord member notes - if (false && fOnGoingNote) { // JMI - switch (elt->getFermataTypeKind ()) { - case msrFermata::kFermataTypeNone: - // no placement needed - break; - case msrFermata::kFermataTypeUpright: - // no placement needed - break; - case msrFermata::kFermataTypeInverted: - fLilypondCodeOstream << "_"; - break; - } // switch - - switch (elt->getFermataKind ()) { - case msrFermata::kNormalFermataKind: - fLilypondCodeOstream << "\\fermata "; - break; - case msrFermata::kAngledFermataKind: - fLilypondCodeOstream << "\\shortfermata "; - break; - case msrFermata::kSquareFermataKind: - fLilypondCodeOstream << "\\longfermata "; - break; - } // switch - } -*/ -} - -void lpsr2LilypondTranslator::visitEnd (S_msrFermata& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrFermata" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* VIRER JMI - */ -} - -void lpsr2LilypondTranslator::visitEnd (S_msrArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrNonArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrNonArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* VIRER JMI - */ -} - -void lpsr2LilypondTranslator::visitEnd (S_msrNonArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrNonArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTechnical& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTechnical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the technical here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTechnical& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTechnical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTechnicalWithInteger& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTechnicalWithInteger" << - ", fOnGoingChord = " << - booleanAsString (fOnGoingChord) << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the technicalWithInteger here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTechnicalWithInteger& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTechnicalWithInteger" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTechnicalWithFloat& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTechnicalWithFloat" << - ", fOnGoingChord = " << - booleanAsString (fOnGoingChord) << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the technicalWithFloat here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTechnicalWithFloat& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTechnicalWithFloat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTechnicalWithString& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTechnicalWithString" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the technicalWithString here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTechnicalWithString& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTechnicalWithString" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrOrnament& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrOrnament" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the ornament here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrOrnament& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrOrnament" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrGlissando& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrGlissando" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the glissando here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrGlissando& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrGlissando" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrSlide& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrSlide" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the slide here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrSlide& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrSlide" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrSingleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't generate the singleTremolo here, - // the note or chord will do it in its visitEnd () method -} - -void lpsr2LilypondTranslator::visitEnd (S_msrSingleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrDoubleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrDoubleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // get double tremolo number of repeats - int numberOfRepeats = - elt->getDoubleTremoloNumberOfRepeats (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - fLilypondCodeOstream << - "% visitStart (S_msrDoubleTremolo&)" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "% doubleTremoloSoundingWholeNotes = " << - elt->getDoubleTremoloSoundingWholeNotes () << - endl << - - "% gdoubleTremoloElementsDuration = " << - elt->getDoubleTremoloElementsDuration () << - endl << - - "% doubleTremoloMarksNumber = " << - elt->getDoubleTremoloMarksNumber () << - endl << - - "% numberOfRepeats = " << - numberOfRepeats << - endl; - - gIndenter++; - } -#endif - - fLilypondCodeOstream << - "\\repeat tremolo " << numberOfRepeats << " {"; - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrDoubleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrDoubleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrDynamics& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrDynamics& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrOtherDynamics& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrOtherDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrOtherDynamics& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrOtherDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrWords& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrWords& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrSlur& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrSlur" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrSlur& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrSlur" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrLigature& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrLigature" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrLigature& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrLigature" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrWedge& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrWedge" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrWedge& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrWedge" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateNoteBeams (S_msrNote note) -{ - const list& - noteBeams = - note->getNoteBeams (); - - if (noteBeams.size ()) { - list::const_iterator i; - for ( - i=noteBeams.begin (); - i!=noteBeams.end (); - i++ - ) { - S_msrBeam beam = (*i); - - // LilyPond will take care of multiple beams automatically, - // so we need only generate code for the first number (level) - switch (beam->getBeamKind ()) { - - case msrBeam::kBeginBeam: - if (beam->getBeamNumber () == 1) - if (! gLilypondOah->fNoBeams) { - fLilypondCodeOstream << "[ "; - } - break; - - case msrBeam::kContinueBeam: - break; - - case msrBeam::kEndBeam: - if (beam->getBeamNumber () == 1) - if (! gLilypondOah->fNoBeams) { - fLilypondCodeOstream << "] "; - } - break; - - case msrBeam::kForwardHookBeam: - break; - - case msrBeam::kBackwardHookBeam: - break; - - case msrBeam::k_NoBeam: - break; - } // switch - } // for - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateNoteSlurs (S_msrNote note) -{ - const list& - noteSlurs = - note->getNoteSlurs (); - - if (noteSlurs.size ()) { - list::const_iterator i; - for ( - i=noteSlurs.begin (); - i!=noteSlurs.end (); - i++ - ) { - S_msrSlur slur = (*i); - - /* JMI ??? - \slurDashed, \slurDotted, \slurHalfDashed, - \slurHalfSolid, \slurDashPattern, \slurSolid - */ - - switch (slur->getSlurTypeKind ()) { - case msrSlur::k_NoSlur: - break; - case msrSlur::kRegularSlurStart: - fLilypondCodeOstream << "( "; - break; - case msrSlur::kPhrasingSlurStart: - fLilypondCodeOstream << "\\( "; - break; - case msrSlur::kSlurContinue: - break; - case msrSlur::kRegularSlurStop: - fLilypondCodeOstream << ") "; - break; - case msrSlur::kPhrasingSlurStop: - fLilypondCodeOstream << "\\) "; - break; - } // switch - } // for - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateGraceNotesGroup ( - S_msrGraceNotesGroup graceNotesGroup) -{ - /* - 1. no slash, no slur: \grace - 2. slash and slur: \acciaccatura, LilyPond will slur it JMI - 3. slash but no slur: \slashedGrace - 4. no slash but slur: \appoggiatura, LilyPond will slur it JMI - */ - - bool doGenerateASlurIfPresent = true; - - switch (graceNotesGroup->getGraceNotesGroupKind ()) { - case msrGraceNotesGroup::kGraceNotesGroupBefore: - if (graceNotesGroup->getGraceNotesGroupIsSlashed ()) { - if (graceNotesGroup->getGraceNotesGroupIsTied ()) { - fLilypondCodeOstream << - "\\acciaccatura"; - doGenerateASlurIfPresent = false; - } - else { - fLilypondCodeOstream << - "\\slashedGrace"; - } - } - - else { - if (graceNotesGroup->getGraceNotesGroupIsTied ()) { - fLilypondCodeOstream << - "\\appoggiatura"; - doGenerateASlurIfPresent = false; - } - else { - fLilypondCodeOstream << - "\\grace"; - } - } - break; - - case msrGraceNotesGroup::kGraceNotesGroupAfter: - // don't generate anything here - break; - } // switch - - fLilypondCodeOstream << - " { "; - - // force durations to be displayed explicitly - // at the beginning of the grace notes - fLastMetWholeNotes = rational (0, 1); - - // generate teh notes in the grace notes group - list& - graceNotesGroupElementsList = - graceNotesGroup-> - getGraceNotesGroupElementsList (); - - if (graceNotesGroupElementsList.size ()) { - list::const_iterator - iBegin = graceNotesGroupElementsList.begin (), - iEnd = graceNotesGroupElementsList.end (), - i = iBegin; - - for ( ; ; ) { - S_msrElement element = (*i); - - if ( - // note? - S_msrNote - note = - dynamic_cast(&(*element)) - ) { - // print things before the note - generateCodeBeforeNote (note); - - // print the note itself - generateCodeForNote (note); - - // print things after the note - generateCodeAfterNote (note); - - // print the note beams if any, - // unless the note is chord member - if (! note->getNoteBelongsToAChord ()) { - generateNoteBeams (note); - } - - // print the note slurs if any, - // unless the note is chord member - // or LilyPond will take care of that - if ( - ! note->getNoteBelongsToAChord () - && - doGenerateASlurIfPresent - ) { - generateNoteSlurs (note); - } - } - - else if ( - // chord? - S_msrChord - chord = - dynamic_cast(&(*element)) - ) { - generateChordInGraceNotesGroup (chord); - } - - else { - stringstream s; - - fLilypondCodeOstream << - "grace notes group elements list in '" << - graceNotesGroup->asString () << - "' is empty" << - ", line " << graceNotesGroup->getInputLineNumber (); - - msrInternalError ( - gOahOah->fInputSourceName, - graceNotesGroup->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - if (++i == iEnd) break; - fLilypondCodeOstream << - ' '; - } // for - - fLilypondCodeOstream << "} "; - } - - else { - stringstream s; - - fLilypondCodeOstream << - "grace notes group elements list in '" << - graceNotesGroup->asString () << - "' is empty" << - ", line " << graceNotesGroup->getInputLineNumber (); - - msrInternalError ( - gOahOah->fInputSourceName, - graceNotesGroup->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - // force durations to be displayed explicitly - // at the end of the grace notes - fLastMetWholeNotes = rational (0, 1); -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrGraceNotesGroup& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrGraceNotesGroup" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingGraceNotesGroup = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrGraceNotesGroup& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrGraceNotesGroup" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingGraceNotesGroup = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrAfterGraceNotesGroup& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrAfterGraceNotesGroup" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // JMI exists? if (elt->getGraceNotesGroupIsSlashed ()) {} - fLilypondCodeOstream << - "\\afterGrace { "; -} - -void lpsr2LilypondTranslator::visitStart (S_msrAfterGraceNotesGroupContents& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrAfterGraceNotesGroupContents" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // write a first closing right bracket right now - fLilypondCodeOstream << - "} { "; - - // force durations to be displayed explicitly - // at the beginning of the after grace notes contents - fLastMetWholeNotes = rational (0, 1); -} - -void lpsr2LilypondTranslator::visitEnd (S_msrAfterGraceNotesGroupContents& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrAfterGraceNotesGroupContents" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "} "; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrAfterGraceNotesGroup& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrAfterGraceNotesGroup" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrNote& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting " << - msrNote::noteKindAsString (elt->getNoteKind ()) << - " note" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // is this a rest measures to be ignored? - switch (elt->getNoteKind ()) { - case msrNote::kRestNote: - // don't handle rest measuress, that's done in visitEnd (S_msrRestMeasures&) - if (fOnGoingRestMeasures) { - /* - if (elt->getNoteOccupiesAFullMeasure ()) { - bool inhibitRestMeasuresBrowsing = - fVisitedLpsrScore-> - getMsrScore ()-> - getInhibitRestMeasuresBrowsing (); - - if (inhibitRestMeasuresBrowsing) { - if ( - gMsrOah->fTraceMsrVisitors - || - gTraceOah->ffTraceRestMeasures) { - gLogOstream << - "% ==> visiting rest measures is ignored" << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - gLogOstream << - "% ==> returning from visitStart (S_msrNote&)" << - endl; - } -#endif - - return; - } - } - */ - -#ifdef TRACE_OAH - if ( - gMsrOah->fTraceMsrVisitors - || - gTraceOah->fTraceRestMeasures - ) { - gLogOstream << - "% ==> start visiting rest measures is ignored" << - endl; - } -#endif - - return; - } - break; - - case msrNote::kSkipNote: - if (elt->getNoteGraceNotesGroupUpLink ()) { -#ifdef TRACE_OAH - if ( - gMsrOah->fTraceMsrVisitors - || - gTraceOah->fTraceNotes - ) { - gLogOstream << - "% ==> start visiting skip notes is ignored" << - endl; - } -#endif - - return; - } - break; - - case msrNote::kGraceNote: -#ifdef TRACE_OAH - if ( - gMsrOah->fTraceMsrVisitors - || - gTraceOah->fTraceGraceNotes - ) { - gLogOstream << - "% ==> start visiting grace notes is ignored" << - endl; - } -#endif - - return; - break; - - case msrNote::kGraceChordMemberNote: -#ifdef TRACE_OAH - if ( - gMsrOah->fTraceMsrVisitors - || - gTraceOah->fTraceGraceNotes - ) { - gLogOstream << - "% ==> start visiting chord grace notes is ignored" << - endl; - } -#endif - - return; - break; - - default: - ; - } // switch - - // get the note's grace notes after - S_msrGraceNotesGroup - noteGraceNotesGroupAfter = - elt->getNoteGraceNotesGroupAfter (); - - // print the note's grace notes group after opener if any - if (noteGraceNotesGroupAfter) { - fLilypondCodeOstream << - "\\afterGrace { "; - } - - // print the note's grace notes before if any, - // but not ??? JMI - S_msrGraceNotesGroup - noteGraceNotesGroupBefore = - elt->getNoteGraceNotesGroupBefore (); - - if (noteGraceNotesGroupBefore) { - generateGraceNotesGroup ( - noteGraceNotesGroupBefore); - } - - // print the note scordaturas if any - const list& - noteScordaturas = - elt->getNoteScordaturas (); - - if (noteScordaturas.size ()) { - fLilypondCodeOstream << - "<<" << - endl; - - gIndenter++; - - list::const_iterator - iBegin = noteScordaturas.begin (), - iEnd = noteScordaturas.end (), - i = iBegin; - for ( ; ; ) { - S_msrScordatura - scordatura = (*i); - - const list& - scordaturaStringTuningsList = - scordatura-> - getScordaturaStringTuningsList (); - - gIndenter++; - - fLilypondCodeOstream << - "\\new Staff \\with { alignAboveContext = \"" << - elt->getNoteMeasureUpLink ()-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink ()-> - getVoiceStaffUpLink ()-> - getStaffName () << - "\" } {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\hide Staff.Stem" << - endl << - "\\hide Staff.TimeSignature" << - endl << - "\\small" << - endl << - "\\once \\override Score.RehearsalMark.self-alignment-X = #LEFT" << - endl << - "\\mark\\markup {\\small\\bold \"Scordatura\"}" << - endl << - "<"; - - if (scordaturaStringTuningsList.size ()) { - list::const_iterator - iBegin = scordaturaStringTuningsList.begin (), - iEnd = scordaturaStringTuningsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrStringTuning - stringTuning = (*i); - - fLilypondCodeOstream << - stringTuningAsLilypondString ( - elt->getInputLineNumber (), - stringTuning); - - if (++i == iEnd) break; - - fLilypondCodeOstream << ' '; - } // for - } - - fLilypondCodeOstream << - ">4" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "{" << - endl; - - gIndenter++; - - if (++i == iEnd) break; - } // for - } - - // should the note actually be printed? - msrPrintObjectKind - notePrintObjectKind = - elt->getNotePrintObjectKind (); - - if (notePrintObjectKind != fCurrentNotePrinObjectKind) { - switch (notePrintObjectKind) { - case kPrintObjectNone: - // JMI - break; - case kPrintObjectYes: - /* JMI ??? - fLilypondCodeOstream << - endl << - "\\revert NoteHead.color" << - endl; - */ - break; - case kPrintObjectNo: - fLilypondCodeOstream << - endl << - "\\temporary\\override NoteHead.color = #(rgb-color 0.5 0.5 0.5)" << - endl; - break; - } // switch - - fCurrentNotePrinObjectKind = notePrintObjectKind; - } - - // print the note slashes if any - const list& - noteSlashes = - elt->getNoteSlashes (); - - if (noteSlashes.size ()) { - list::const_iterator i; - for ( - i=noteSlashes.begin (); - i!=noteSlashes.end (); - i++ - ) { - S_msrSlash - slash = - (*i); - - switch (slash->getSlashTypeKind ()) { - case k_NoSlashType: - break; - - case kSlashTypeStart: - fLilypondCodeOstream << - endl << - "\\override Staff.NoteHead.style = #'slash " << - endl; - break; - - case kSlashTypeStop: - fLilypondCodeOstream << - endl << - "\\revert Staff.NoteHead.style " << - endl; - break; - } // switch - - switch (slash->getUseDotsKind ()) { - case k_NoUseDots: - break; - - case kUseDotsYes: - fLilypondCodeOstream << - endl << - "\\override Staff.NoteHead.style = #'slash " << - endl; - break; - - case kUseDotsNo: - fLilypondCodeOstream << - endl << - "\\revert Staff.NoteHead.style " << - endl; - break; - } // switch - - switch (slash->getSlashUseStemsKind ()) { - case k_NoSlashUseStems: - break; - - case kSlashUseStemsYes: - fLilypondCodeOstream << - endl << - "\\undo \\hide Staff.Stem " << - endl; - break; - - case kSlashUseStemsNo: - fLilypondCodeOstream << - endl << - "\\hide Staff.Stem " << - endl; - break; - } // switch - } // for - } - - // print the note wedges circled tips if any - const list& - noteWedges = - elt->getNoteWedges (); - - if (noteWedges.size ()) { - list::const_iterator i; - for ( - i=noteWedges.begin (); - i!=noteWedges.end (); - i++ - ) { - S_msrWedge wedge = (*i); - - switch (wedge->getWedgeKind ()) { - case msrWedge::kWedgeKindNone: - break; - - case msrWedge::kWedgeCrescendo: - switch (wedge->getWedgeNienteKind ()) { - case msrWedge::kWedgeNienteYes: - fLilypondCodeOstream << - endl << - "\\once\\override Hairpin.circled-tip = ##t " << - endl; - break; - case msrWedge::kWedgeNienteNo: - break; - } // switch - break; - - case msrWedge::kWedgeDecrescendo: - switch (wedge->getWedgeNienteKind ()) { - case msrWedge::kWedgeNienteYes: - fLilypondCodeOstream << - endl << - "\\once\\override Hairpin.circled-tip = ##t " << - endl; - break; - case msrWedge::kWedgeNienteNo: - break; - } // switch - break; - - case msrWedge::kWedgeStop: - /* JMI - fLilypondCodeOstream << - "\\! "; - */ - break; - } // switch - } // for - } - - // print the note slurs line types if any, - // unless the note is chord member - if (! elt->getNoteBelongsToAChord ()) { - const list& - noteSlurs = - elt->getNoteSlurs (); - - if (noteSlurs.size ()) { - list::const_iterator i; - for ( - i=noteSlurs.begin (); - i!=noteSlurs.end (); - i++ - ) { - S_msrSlur slur = (*i); - - /* - \slurDashed, \slurDotted, \slurHalfDashed, - \slurHalfSolid, \slurDashPattern, \slurSolid - */ - - switch (slur->getSlurTypeKind ()) { - case msrSlur::kRegularSlurStart: - case msrSlur::kPhrasingSlurStart: - switch (slur->getSlurLineTypeKind ()) { - case kLineTypeSolid: - /* JMI ??? - fLilypondCodeOstream << - "\\once\\slurSolid "; - */ - break; - case kLineTypeDashed: - fLilypondCodeOstream << - "\\once\\slurDashed "; - break; - case kLineTypeDotted: - fLilypondCodeOstream << - "\\once\\slurDotted "; - break; - case kLineTypeWavy: - fLilypondCodeOstream << - "\\once\\slurWavy "; // JMI - break; - } // switch - break; - default: - ; - } // switch - } // for - } - } - - // print the note glissandos styles if any - const list& - noteGlissandos = - elt->getNoteGlissandos (); - - if (noteGlissandos.size ()) { - list::const_iterator i; - for ( - i=noteGlissandos.begin (); - i!=noteGlissandos.end (); - i++ - ) { - S_msrGlissando glissando = (*i); - - switch (glissando->getGlissandoTypeKind ()) { - case msrGlissando::kGlissandoTypeNone: - break; - - case msrGlissando::kGlissandoTypeStart: - // generate the glissando style - switch (glissando->getGlissandoLineTypeKind ()) { - case kLineTypeSolid: - break; - case kLineTypeDashed: - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.style = #'dashed-line" << - endl; - break; - case kLineTypeDotted: - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.style = #'dotted-line" << - endl; - break; - case kLineTypeWavy: - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.style = #'zigzag" << - endl; - break; - } // switch - break; - - case msrGlissando::kGlissandoTypeStop: - break; - } // switch - } // for - } - - // print the note slides styles if any, implemented as glissandos - const list& - noteSlides = - elt->getNoteSlides (); - - if (noteSlides.size ()) { - list::const_iterator i; - for ( - i=noteSlides.begin (); - i!=noteSlides.end (); - i++ - ) { - S_msrSlide slide = (*i); - - switch (slide->getSlideTypeKind ()) { - case msrSlide::kSlideTypeNone: - break; - - case msrSlide::kSlideTypeStart: - // generate the glissando style - switch (slide->getSlideLineTypeKind ()) { - case kLineTypeSolid: - break; - case kLineTypeDashed: - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.style = #'dashed-line" << - endl; - break; - case kLineTypeDotted: - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.style = #'dotted-line" << - endl; - break; - case kLineTypeWavy: - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.style = #'zigzag" << - endl; - break; - } // switch - break; - - case msrSlide::kSlideTypeStop: - break; - } // switch - } // for - } - - // print the note glissandos with text if any - if (noteGlissandos.size ()) { - list::const_iterator i; - for ( - i=noteGlissandos.begin (); - i!=noteGlissandos.end (); - i++ - ) { - S_msrGlissando glissando = (*i); - - switch (glissando->getGlissandoTypeKind ()) { - case msrGlissando::kGlissandoTypeNone: - break; - - case msrGlissando::kGlissandoTypeStart: - { - string - glissandoTextValue = - glissando->getGlissandoTextValue (); - - if (glissandoTextValue.size ()) { - // generate the glissando text on itself - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.details.glissando-text = \"" << - glissandoTextValue << - "\"" << - endl << - "\\glissandoTextOn" << - endl; - } - } - break; - - case msrGlissando::kGlissandoTypeStop: - break; - } // switch - } // for - } - - // print the note slides with text if any - if (noteSlides.size ()) { - list::const_iterator i; - for ( - i=noteSlides.begin (); - i!=noteSlides.end (); - i++ - ) { - S_msrSlide slide = (*i); - - switch (slide->getSlideTypeKind ()) { - case msrSlide::kSlideTypeNone: - break; - - case msrSlide::kSlideTypeStart: - { - string - slideTextValue = - slide->getSlideTextValue (); - - if (slideTextValue.size ()) { - // generate the slide text on itself - fLilypondCodeOstream << - endl << - "\\once\\override Glissando.details.glissando-text = \"" << - slideTextValue << - "\"" << - endl << - "\\glissandoTextOn" << - endl; - } - } - break; - - case msrSlide::kSlideTypeStop: - break; - } // switch - } // for - } - - // print the note spanners if any - const list& - noteSpanners = - elt->getNoteSpanners (); - - if (noteSpanners.size ()) { - list::const_iterator i; - for ( - i=noteSpanners.begin (); - i!=noteSpanners.end (); - i++ - ) { - S_msrSpanner - spanner = (*i); - - bool doGenerateSpannerCode = true; - - switch (spanner->getSpannerKind ()) { - case msrSpanner::kSpannerDashes: - break; - case msrSpanner::kSpannerWavyLine: - if (spanner->getSpannerNoteUpLink ()->getNoteTrillOrnament ()) { - // don't generate anything, the trill will display the wavy line - doGenerateSpannerCode = false; - } - break; - } // switch - - if (doGenerateSpannerCode) { - switch (spanner->getSpannerKind ()) { - case msrSpanner::kSpannerDashes: - case msrSpanner::kSpannerWavyLine: - break; - } // switch - - generateCodeForSpannerBeforeNote (spanner); - } - } // for - } - - // should the note be parenthesized? - msrNote::msrNoteHeadParenthesesKind - noteHeadParenthesesKind = - elt->getNoteHeadParenthesesKind (); - - switch (noteHeadParenthesesKind) { - case msrNote::kNoteHeadParenthesesYes: - fLilypondCodeOstream << "\\parenthesize "; - break; - case msrNote::kNoteHeadParenthesesNo: - break; - } // switch - - // print the note technicals with string if any - const list& - noteTechnicalWithStrings = - elt->getNoteTechnicalWithStrings (); - - if (noteTechnicalWithStrings.size ()) { - list::const_iterator i; - for ( - i=noteTechnicalWithStrings.begin (); - i!=noteTechnicalWithStrings.end (); - i++ - ) { - S_msrTechnicalWithString technicalWithString = (*i); - - switch (technicalWithString->getTechnicalWithStringKind ()) { - case msrTechnicalWithString::kHammerOn: - switch (technicalWithString->getTechnicalWithStringTypeKind ()) { - case kTechnicalTypeStart: - { - rational - noteSoundingWholeNotes = - elt->getNoteSoundingWholeNotes (); - - rational - halfWholeNotes = - noteSoundingWholeNotes /2; - - fLilypondCodeOstream << - "\\after " << - wholeNotesAsLilypondString ( - elt->getInputLineNumber (), - halfWholeNotes) << - " ^\"H\" "; - } - break; - case kTechnicalTypeStop: - break; - case k_NoTechnicalType: - break; - } // switch - break; - case msrTechnicalWithString::kHandbell: // JMI - break; - case msrTechnicalWithString::kOtherTechnical: // JMI - break; - case msrTechnicalWithString::kPluck: // JMI - break; - case msrTechnicalWithString::kPullOff: - switch (technicalWithString->getTechnicalWithStringTypeKind ()) { - case kTechnicalTypeStart: - { - rational - noteSoundingWholeNotes = - elt->getNoteSoundingWholeNotes (); - - rational - halfWholeNotes = - noteSoundingWholeNotes /2; - - fLilypondCodeOstream << - "\\after " << - wholeNotesAsLilypondString ( - elt->getInputLineNumber (), - halfWholeNotes) << - " ^\"P\" "; - } - break; - case kTechnicalTypeStop: - break; - case k_NoTechnicalType: - break; - } // switch - break; - } // switch - } // for - } - - // is the note a cue note? - if (elt->getNoteIsACueNote ()) { - fLilypondCodeOstream << - "\\once \\override NoteHead.font-size = -3 "; - } - - // has the note an octave shift up or down? - if (! fOnGoingChord) { - // the octave shift for the chords has already been generated - S_msrOctaveShift - noteOctaveShift = - elt-> - getNoteOctaveShift (); - - if (noteOctaveShift) { - generateCodeForOctaveShift ( - noteOctaveShift); - } - } - - // print things before the note - generateCodeBeforeNote (elt); - - //////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////// - // print the note itself as a LilyPond string - //////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////// - - // print the note itself - generateCodeForNote (elt); - - // print things after the note - generateCodeAfterNote (elt); - - if ( - gLilypondOah->fInputLineNumbers - || - gLilypondOah->fPositionsInMeasures - ) { - generateInputLineNumberAndOrPositionInMeasureAsAComment ( - elt); - } - - fOnGoingNote = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrNote& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting " << - msrNote::noteKindAsString (elt->getNoteKind ()) << - " note" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // is this a rest measures to be ignored? - switch (elt->getNoteKind ()) { - case msrNote::kRestNote: - // don't handle rest measuress, that's done in visitEnd (S_msrRestMeasures&) - if (fOnGoingRestMeasures) { - if (elt->getNoteOccupiesAFullMeasure ()) { - bool inhibitRestMeasuresBrowsing = - fVisitedLpsrScore-> - getMsrScore ()-> - getInhibitRestMeasuresBrowsing (); - - if (inhibitRestMeasuresBrowsing) { -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceNotes - || - gTraceOah->fTraceRestMeasures - ) { - gLogOstream << - "% ==> end visiting rest measures is ignored" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - gLogOstream << - "% ==> returning from visitEnd (S_msrNote&)" << - endl; - } -#endif - - return; - } - } - } - break; - - case msrNote::kSkipNote: - if (elt->getNoteGraceNotesGroupUpLink ()) { -#ifdef TRACE_OAH - if ( - gMsrOah->fTraceMsrVisitors - || - gTraceOah->fTraceNotes - ) { - gLogOstream << - "% ==> end visiting skip notes is ignored" << - endl; - } -#endif - - return; - } - break; - - case msrNote::kGraceNote: -#ifdef TRACE_OAH - if ( - gMsrOah->fTraceMsrVisitors - || - gTraceOah->fTraceGraceNotes) { - gLogOstream << - "% ==> end visiting grace notes is ignored" << - endl; - } -#endif - - return; - break; - - default: - ; - } // switch - - // fetch the note single tremolo - S_msrSingleTremolo - noteSingleTremolo = - elt->getNoteSingleTremolo (); - - if (noteSingleTremolo) { - // generate code for the single tremolo only - // if note doesn't belong to a chord, - // otherwise it will be generated for the chord itself - if (! elt->getNoteBelongsToAChord ()) { - fLilypondCodeOstream << - singleTremoloDurationAsLilypondString ( - noteSingleTremolo); - } - } - - // print the note words if any, - // which should precede the articulations in LilyPond - // generate code for the words only - // if note doesn't belong to a chord, - // otherwise it will be generated for the chord itself - if (! elt->getNoteBelongsToAChord ()) { - const list& - noteWords = - elt->getNoteWords (); - - if (noteWords.size ()) { - list::const_iterator i; - for ( - i=noteWords.begin (); - i!=noteWords.end (); - i++ - ) { - msrPlacementKind - wordsPlacementKind = - (*i)->getWordsPlacementKind (); - - string wordsContents = - (*i)->getWordsContents (); - - msrFontStyleKind - wordsFontStyleKind = - (*i)->getWordsFontStyleKind (); - - S_msrFontSize - wordsFontSize = - (*i)->getWordsFontSize (); - - msrFontWeightKind - wordsFontWeightKind = - (*i)->getWordsFontWeightKind (); - - string markup; - - { - // create markup apart to have its length available - stringstream s; - - switch (wordsPlacementKind) { - case kPlacementNone: - s << "^"; - break; - case kPlacementAbove: - s << "^"; - break; - case kPlacementBelow: - s << "_"; - break; - } // switch - - s << - "\\markup" << " { "; - - switch (wordsFontStyleKind) { - case kFontStyleNone: - break; - case kFontStyleNormal: - // LilyPond produces 'normal style' text by default - break; - case KFontStyleItalic: - s << - "\\italic "; - break; - } // switch - - switch (wordsFontWeightKind) { - case kFontWeightNone: - break; - case kFontWeightNormal: - // LilyPond produces 'normal weight' text by default - break; - case kFontWeightBold: - s << - "\\bold "; - break; - } // switch - - switch (wordsFontSize->getFontSizeKind ()) { - case msrFontSize::kFontSizeNone: - break; - case msrFontSize::kFontSizeXXSmall: - s << - "\\tiny "; - break; - case msrFontSize::kFontSizeXSmall: - s << - "\\smaller "; - break; - case msrFontSize::kFontSizeSmall: - s << - "\\small "; - break; - case msrFontSize::kFontSizeMedium: - s << - "\\normalsize "; - break; - case msrFontSize::kFontSizeLarge: - s << - "\\large "; - break; - case msrFontSize::kFontSizeXLarge: - s << - "\\larger "; - break; - case msrFontSize::kFontSizeXXLarge: - s << - "\\huge "; - break; - case msrFontSize::kFontSizeNumeric: - /* JMI - s << - "%{ " << - wordsFontSize->getFontNumericSize () << - " points %} "; - */ - break; - } // switch - - // does wordsContents contains end of lines? - size_t endOfLineFound = wordsContents.find ("\n"); - - if (endOfLineFound == string::npos) { - s << - // JMI doubleQuoteStringIfNonAlpha (wordsContents) << - "\"" << wordsContents << "\""; - } - else { - s << - gIndenter.indentMultiLineString ( - generateAColumnForMarkup ( - wordsContents, - markupColumnKindLeftAligned)); - } - - s << - " } "; - - markup = s.str (); - } - - fLilypondCodeOstream << - markup; - } // for - } - } - -/* TOO EARLY FOR ALL OF THEM??? JMI - // print the note articulations if any - if (! fOnGoingChord) { - const list& - noteArticulations = - elt->getNoteArticulations (); - - if (noteArticulations.size ()) { - list::const_iterator i; - for ( - i=noteArticulations.begin (); - i!=noteArticulations.end (); - i++ - ) { - S_msrArticulation articulation = (*i); - switch (articulation->getArticulationKind ()) { - case msrArticulation::kFermata: // handle this better JMI - if ( - // fermata? - S_msrFermata - fermata = - dynamic_cast(&(*articulation)) - ) { - switch (fermata->getFermataTypeKind ()) { - case msrFermata::kFermataTypeNone: - // no placement needed - break; - case msrFermata::kFermataTypeUpright: - // no placement needed - break; - case msrFermata::kFermataTypeInverted: - fLilypondCodeOstream << "_"; - break; - } // switch - - switch (fermata->getFermataKind ()) { - case msrFermata::kNormalFermataKind: - fLilypondCodeOstream << "\\fermata "; - break; - case msrFermata::kAngledFermataKind: - fLilypondCodeOstream << "\\shortfermata "; - break; - case msrFermata::kSquareFermataKind: - fLilypondCodeOstream << "\\longfermata "; - break; - } // switch - } - else { - stringstream s; - - s << - "note articulation '" << - articulation->asString () << - "' has 'fermata' kind, but is not of type S_msrFermata" << - ", line " << articulation->getInputLineNumber (); - - msrInternalError ( - gOahOah->fInputSourceName, - articulation->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - break; - - default: - generateNoteArticulation ((*i)); - fLilypondCodeOstream << - ' '; - } // switch - } // for - } - } - */ - - // print the note technicals if any - const list& - noteTechnicals = - elt->getNoteTechnicals (); - - if (noteTechnicals.size ()) { - list::const_iterator i; - for ( - i=noteTechnicals.begin (); - i!=noteTechnicals.end (); - i++ - ) { - - fLilypondCodeOstream << - technicalAsLilypondString ((*i)); - - switch ((*i)->getTechnicalPlacementKind ()) { - case kPlacementNone: - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - fLilypondCodeOstream << ' '; - } // for - } - - // print the note technicals with integer if any, - // but not for chord member notes strings: - // they should appear after the chord itself - switch (elt->getNoteKind ()) { - case msrNote::kChordMemberNote: - break; - - default: - { - const list& - noteTechnicalWithIntegers = - elt->getNoteTechnicalWithIntegers (); - - if (noteTechnicalWithIntegers.size ()) { - list::const_iterator i; - for ( - i=noteTechnicalWithIntegers.begin (); - i!=noteTechnicalWithIntegers.end (); - i++ - ) { - - S_msrTechnicalWithInteger - technicalWithInteger = (*i); - - fLilypondCodeOstream << - technicalWithIntegerAsLilypondString ( - technicalWithInteger); - - switch (technicalWithInteger->getTechnicalWithIntegerPlacementKind ()) { - case kPlacementNone: - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - fLilypondCodeOstream << ' '; - } // for - } - } - } // switch - - // print the note technicals with float if any, - // but not for chord member notes strings: - // they should appear after the chord itself - switch (elt->getNoteKind ()) { - case msrNote::kChordMemberNote: - break; - - default: - { - const list& - noteTechnicalWithFloats = - elt->getNoteTechnicalWithFloats (); - - if (noteTechnicalWithFloats.size ()) { - list::const_iterator i; - for ( - i=noteTechnicalWithFloats.begin (); - i!=noteTechnicalWithFloats.end (); - i++ - ) { - - S_msrTechnicalWithFloat - technicalWithFloat = (*i); - - fLilypondCodeOstream << - technicalWithFloatAsLilypondString ( - technicalWithFloat); - - switch (technicalWithFloat->getTechnicalWithFloatPlacementKind ()) { - case kPlacementNone: - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - fLilypondCodeOstream << ' '; - } // for - } - } - } // switch - - // print the note technicals with string if any - const list& - noteTechnicalWithStrings = - elt->getNoteTechnicalWithStrings (); - - if (noteTechnicalWithStrings.size ()) { - list::const_iterator i; - for ( - i=noteTechnicalWithStrings.begin (); - i!=noteTechnicalWithStrings.end (); - i++ - ) { - - fLilypondCodeOstream << - technicalWithStringAsLilypondString ((*i)); - - switch ((*i)->getTechnicalWithStringPlacementKind ()) { - case kPlacementNone: - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - fLilypondCodeOstream << ' '; - } // for - } - - // print the note ornaments if any - list - noteOrnaments = - elt->getNoteOrnaments (); - - if (noteOrnaments.size ()) { - list::const_iterator i; - for ( - i=noteOrnaments.begin (); - i!=noteOrnaments.end (); - i++ - ) { - S_msrOrnament - ornament = (*i); - - generateOrnament (ornament); // some ornaments are not yet supported - } // for - } - - // print the note dynamics if any - if (! fOnGoingChord) { - const list& - noteDynamics = - elt->getNoteDynamics (); - - if (noteDynamics.size ()) { - list::const_iterator i; - for ( - i=noteDynamics.begin (); - i!=noteDynamics.end (); - i++ - ) { - S_msrDynamics - dynamics = (*i); - - switch (dynamics->getDynamicsPlacementKind ()) { - case kPlacementNone: - // JMI fLilypondCodeOstream << "-3"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - // this is done by LilyPond by default - break; - } // switch - - fLilypondCodeOstream << - dynamicsAsLilypondString (dynamics) << ' '; - } // for - } - } - - // print the note other dynamics if any - if (! fOnGoingChord) { - const list& - noteOtherDynamics = - elt->getNoteOtherDynamics (); - - if (noteOtherDynamics.size ()) { - list::const_iterator i; - for ( - i=noteOtherDynamics.begin (); - i!=noteOtherDynamics.end (); - i++ - ) { - S_msrOtherDynamics - otherDynamics = (*i); - - switch (otherDynamics->getOtherDynamicsPlacementKind ()) { - case kPlacementNone: - fLilypondCodeOstream << "-"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - // this is done by LilyPond by default - break; - } // switch - - fLilypondCodeOstream << - "\\otherDynamic \"" << - otherDynamics->getOtherDynamicsString () << - "\" "; - } // for - } - } - - // print the note beams if any, - // unless the note is chord member - if (! elt->getNoteBelongsToAChord ()) { - generateNoteBeams (elt); - } - - // print the note slurs if any, - // unless the note is chord member - if (! elt->getNoteBelongsToAChord ()) { - generateNoteSlurs (elt); - } - - // print the note ligatures if any - const list& - noteLigatures = - elt->getNoteLigatures (); - - if (noteLigatures.size ()) { - list::const_iterator i; - for ( - i=noteLigatures.begin (); - i!=noteLigatures.end (); - i++ - ) { - - switch ((*i)->getLigatureKind ()) { - case msrLigature::kLigatureNone: - break; - case msrLigature::kLigatureStart: - // JMI fLilypondCodeOstream << "\\[ "; - break; - case msrLigature::kLigatureContinue: - break; - case msrLigature::kLigatureStop: - fLilypondCodeOstream << "\\] "; - break; - } // switch - } // for - } - - // print the note wedges if any - const list& - noteWedges = - elt->getNoteWedges (); - - if (noteWedges.size ()) { - list::const_iterator i; - for ( - i=noteWedges.begin (); - i!=noteWedges.end (); - i++ - ) { - S_msrWedge wedge = (*i); - - switch (wedge->getWedgeKind ()) { - case msrWedge::kWedgeKindNone: - break; - - case msrWedge::kWedgeCrescendo: - switch (wedge->getWedgePlacementKind ()) { - case kPlacementNone: - break; - case kPlacementAbove: - fLilypondCodeOstream << - "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << - "_"; - break; - } // switch - fLilypondCodeOstream << - "\\< "; - break; - - case msrWedge::kWedgeDecrescendo: - switch (wedge->getWedgePlacementKind ()) { - case kPlacementNone: - break; - case kPlacementAbove: - fLilypondCodeOstream << - "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << - "_"; - break; - } // switch - fLilypondCodeOstream << - "\\> "; - break; - - case msrWedge::kWedgeStop: - fLilypondCodeOstream << - "\\! "; - break; - } // switch - } // for - } - - // print the note articulations if any, - // which should follo the dynamics and wedges in LilyPond - if (! fOnGoingChord) { - const list& - noteArticulations = - elt->getNoteArticulations (); - - if (noteArticulations.size ()) { - list::const_iterator i; - for ( - i=noteArticulations.begin (); - i!=noteArticulations.end (); - i++ - ) { - S_msrArticulation articulation = (*i); - - switch (articulation->getArticulationKind ()) { - case msrArticulation::kFermata: // handle this better JMI - if ( - // fermata? - S_msrFermata - fermata = - dynamic_cast(&(*articulation)) - ) { - switch (fermata->getFermataTypeKind ()) { - case msrFermata::kFermataTypeNone: - // no placement needed - break; - case msrFermata::kFermataTypeUpright: - // no placement needed - break; - case msrFermata::kFermataTypeInverted: - fLilypondCodeOstream << "_"; - break; - } // switch - - switch (fermata->getFermataKind ()) { - case msrFermata::kNormalFermataKind: - if ( - elt->getNoteOccupiesAFullMeasure () - && - elt->getNoteIsARest () - ) { - fLilypondCodeOstream << "\\fermataMarkup "; - } - else { - fLilypondCodeOstream << "\\fermata "; - } - break; - case msrFermata::kAngledFermataKind: - fLilypondCodeOstream << "\\shortfermata "; - break; - case msrFermata::kSquareFermataKind: - fLilypondCodeOstream << "\\longfermata "; - break; - } // switch - } - else { - stringstream s; - - s << - "note articulation '" << - articulation->asString () << - "' has 'fermata' kind, but is not of type S_msrFermata" << - ", line " << articulation->getInputLineNumber (); - - msrInternalError ( - gOahOah->fInputSourceName, - articulation->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - break; - - default: - generateNoteArticulation ((*i)); - fLilypondCodeOstream << - " "; - } // switch - } // for - } - } - - // print the note glissandos if any - const list& - noteGlissandos = - elt->getNoteGlissandos (); - - if (noteGlissandos.size ()) { - list::const_iterator i; - for ( - i=noteGlissandos.begin (); - i!=noteGlissandos.end (); - i++ - ) { - S_msrGlissando glissando = (*i); - - switch (glissando->getGlissandoTypeKind ()) { - case msrGlissando::kGlissandoTypeNone: - break; - - case msrGlissando::kGlissandoTypeStart: - // generate the glissando itself - fLilypondCodeOstream << - "\\glissando " << - "\\glissandoTextOff "; - break; - - case msrGlissando::kGlissandoTypeStop: - break; - } // switch - } // for - } - - // print the note slides if any, implemented as glissandos - const list& - noteSlides = - elt->getNoteSlides (); - - if (noteSlides.size ()) { - list::const_iterator i; - for ( - i=noteSlides.begin (); - i!=noteSlides.end (); - i++ - ) { - S_msrSlide slide = (*i); - - switch (slide->getSlideTypeKind ()) { - case msrSlide::kSlideTypeNone: - break; - - case msrSlide::kSlideTypeStart: - // generate the glissando itself - fLilypondCodeOstream << - "\\glissando " << - "\\glissandoTextOff "; - break; - - case msrSlide::kSlideTypeStop: - break; - } // switch - } // for - } - - // print the note spanners if any - const list& - noteSpanners = - elt->getNoteSpanners (); - - if (noteSpanners.size ()) { - list::const_iterator i; - for ( - i=noteSpanners.begin (); - i!=noteSpanners.end (); - i++ - ) { - S_msrSpanner - spanner = (*i); - - bool doGenerateSpannerCode = true; - - switch (spanner->getSpannerKind ()) { - case msrSpanner::kSpannerDashes: - break; - case msrSpanner::kSpannerWavyLine: - if (spanner->getSpannerNoteUpLink ()->getNoteTrillOrnament ()) { - // don't generate anything, the trill will display the wavy line - doGenerateSpannerCode = false; - } - break; - } // switch - - if (doGenerateSpannerCode) { - switch (spanner->getSpannerPlacementKind ()) { - case kPlacementNone: - // JMI fLilypondCodeOstream << "-3"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - // this is done by LilyPond by default - break; - } // switch - - generateCodeForSpannerAfterNote (spanner); - } - } // for - } - - // are there note scordaturas? - const list& - noteScordaturas = - elt->getNoteScordaturas (); - - if (noteScordaturas.size ()) { - gIndenter--; - - fLilypondCodeOstream << - endl << - "}" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - ">>" << - endl; - } - - if (elt->getNoteIsFollowedByGraceNotesGroup ()) { // JMI - if (! elt->getNoteIsARest ()) { - fLilypondCodeOstream << - " % NoteIsFollowedByGraceNotesGroup" << - endl; // JMI ??? - } - } - - // get the note's grace notes after - S_msrGraceNotesGroup - noteGraceNotesGroupAfter = - elt->getNoteGraceNotesGroupAfter (); - - // print the note's grace notes after group closer if any - if (noteGraceNotesGroupAfter) { - fLilypondCodeOstream << - "} "; - generateGraceNotesGroup ( - noteGraceNotesGroupAfter); - } - - fOnGoingNote = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrOctaveShift& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrOctaveShift" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrOctaveShift& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrOctaveShift" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrAccordionRegistration& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrAccordionRegistration" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int highDotsNumber = - elt->getHighDotsNumber (); - int middleDotsNumber = - elt->getMiddleDotsNumber (); - int lowDotsNumber = - elt->getLowDotsNumber (); - - string numbersToBeUsed; - bool nonZeroNumberHasBeenIssued = false; - - // the numbers should be written in the order 'high, middle, low' - // and 0 ahead of the specification is forbidden - - if (highDotsNumber > 0) { - numbersToBeUsed += - to_string (highDotsNumber); - nonZeroNumberHasBeenIssued = true; - } - - if (middleDotsNumber > 0) { - numbersToBeUsed += - to_string (middleDotsNumber); - nonZeroNumberHasBeenIssued = true; - } - else { - if (nonZeroNumberHasBeenIssued) { - numbersToBeUsed += - to_string (middleDotsNumber); - } - } - - numbersToBeUsed += - to_string (lowDotsNumber); - - fLilypondCodeOstream << - "\\discant \"" << - numbersToBeUsed << - "\" "; -} - -void lpsr2LilypondTranslator::visitStart (S_msrHarpPedalsTuning& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrHarpPedalsTuning" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - map - harpPedalsAlterationKindsMap = - elt->getHarpPedalsAlterationKindsMap (); - - if (harpPedalsAlterationKindsMap.size ()) { - gIndenter++; - - fLilypondCodeOstream << - "_\\markup { \\harp-pedal #\"" << - harpPedalTuningAsLilypondString ( - harpPedalsAlterationKindsMap [kD]) << - harpPedalTuningAsLilypondString ( - harpPedalsAlterationKindsMap [kC]) << - harpPedalTuningAsLilypondString ( - harpPedalsAlterationKindsMap [kB]) << - "|" << - harpPedalTuningAsLilypondString ( - harpPedalsAlterationKindsMap [kE]) << - harpPedalTuningAsLilypondString ( - harpPedalsAlterationKindsMap [kF]) << - harpPedalTuningAsLilypondString ( - harpPedalsAlterationKindsMap [kG]) << - harpPedalTuningAsLilypondString ( - harpPedalsAlterationKindsMap [kA]) << - "\" } " << - endl; - } - else { - fLilypondCodeOstream << - "%{empty harp pedals tuning???%} "; // JMI - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrStem& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrStem" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrStem& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrStem" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrBeam& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrBeam" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrBeam& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrBeam" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateCodeForOctaveShift ( - S_msrOctaveShift octaveShift) -{ - msrOctaveShift::msrOctaveShiftKind - octaveShiftKind = - octaveShift-> - getOctaveShiftKind (); - - int - octaveShiftSize = - octaveShift-> - getOctaveShiftSize (); - - switch (octaveShiftKind) { - case msrOctaveShift::kOctaveShiftNone: - break; - case msrOctaveShift::kOctaveShiftUp: - fLilypondCodeOstream << - "\\ottava #" << - "-" << (octaveShiftSize - 1) / 7 << // 1 or 2 - ' '; - break; - case msrOctaveShift::kOctaveShiftDown: - fLilypondCodeOstream << - "\\ottava #" << - (octaveShiftSize - 1) / 7 << // 1 or 2 - ' '; - break; - case msrOctaveShift::kOctaveShiftStop: - fLilypondCodeOstream << - "\\ottava #0 "; - break; - case msrOctaveShift::kOctaveShiftContinue: - break; - } // switch -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::generateCodeBeforeChordContents (S_msrChord chord) -{ - // print the chord's grace notes before if any, - // but not ??? JMI - S_msrGraceNotesGroup - chordGraceNotesGroupBefore = - chord->getChordGraceNotesGroupBefore (); - -/* JMI - gLogOstream << - "% chordGraceNotesGroupBefore = "; - if (chordGraceNotesGroupBefore) { - gLogOstream << - chordGraceNotesGroupBefore; - } - else { - gLogOstream << - "nullptr"; - } - gLogOstream << endl; -*/ - - if (chordGraceNotesGroupBefore) { - generateGraceNotesGroup ( - chordGraceNotesGroupBefore); - } - - // get the chord glissandos - const list& - chordGlissandos = - chord->getChordGlissandos (); - - // print the chord glissandos styles if any - if (chordGlissandos.size ()) { - list::const_iterator i; - for ( - i=chordGlissandos.begin (); - i!=chordGlissandos.end (); - i++ - ) { - S_msrGlissando glissando = (*i); - - switch (glissando->getGlissandoTypeKind ()) { - case msrGlissando::kGlissandoTypeNone: - break; - - case msrGlissando::kGlissandoTypeStart: - // generate the glissando style - switch (glissando->getGlissandoLineTypeKind ()) { - case kLineTypeSolid: - break; - case kLineTypeDashed: - fLilypondCodeOstream << - "\\once\\override Glissando.style = #'dashed-line "; - break; - case kLineTypeDotted: - fLilypondCodeOstream << - "\\once\\override Glissando.style = #'dotted-line "; - break; - case kLineTypeWavy: - fLilypondCodeOstream << - "\\once\\override Glissando.style = #'zigzag "; - break; - } // switch - break; - - case msrGlissando::kGlissandoTypeStop: - break; - } // switch - } // for - } - - // get the chord slides - const list& - chordSlides = - chord->getChordSlides (); - - // print the chord slides styles if any, implemented as glissandos - if (chordSlides.size ()) { - list::const_iterator i; - for ( - i=chordSlides.begin (); - i!=chordSlides.end (); - i++ - ) { - S_msrSlide slide = (*i); - - switch (slide->getSlideTypeKind ()) { - case msrSlide::kSlideTypeNone: - break; - - case msrSlide::kSlideTypeStart: - // generate the glissando style - switch (slide->getSlideLineTypeKind ()) { - case kLineTypeSolid: - break; - case kLineTypeDashed: - fLilypondCodeOstream << - "\\once\\override Glissando.style = #'dashed-line "; - break; - case kLineTypeDotted: - fLilypondCodeOstream << - "\\once\\override Glissando.style = #'dotted-line "; - break; - case kLineTypeWavy: - fLilypondCodeOstream << - "\\once\\override Glissando.style = #'zigzag "; - break; - } // switch - break; - - case msrSlide::kSlideTypeStop: - break; - } // switch - } // for - } - - // get the chord ligatures - list - chordLigatures = - chord->getChordLigatures (); - - // print the chord ligatures if any - if (chordLigatures.size ()) { - list::const_iterator i; - for ( - i=chordLigatures.begin (); - i!=chordLigatures.end (); - i++ - ) { - - switch ((*i)->getLigatureKind ()) { - case msrLigature::kLigatureNone: - break; - case msrLigature::kLigatureStart: - fLilypondCodeOstream << "\\[ "; - break; - case msrLigature::kLigatureContinue: - break; - case msrLigature::kLigatureStop: - // JMI fLilypondCodeOstream << "\\] "; - break; - } // switch - } // for - } - - // don't take the chord into account for line breaking ??? JMI - - // get the chord articulations - list - chordArticulations = - chord->getChordArticulations (); - - // print the chord arpeggios directions if any - if (chordArticulations.size ()) { - list::const_iterator i; - for ( - i=chordArticulations.begin (); - i!=chordArticulations.end (); - i++ - ) { - S_msrArticulation articulation = (*i); - - if ( - // arpeggiato? - S_msrArpeggiato - arpeggiato = - dynamic_cast(&(*articulation)) - ) { - msrDirectionKind - directionKind = - arpeggiato->getArpeggiatoDirectionKind (); - - switch (directionKind) { - case kDirectionNone: - fLilypondCodeOstream << - endl << - "\\arpeggioNormal"; - break; - case kDirectionUp: - fLilypondCodeOstream << - endl << - "\\arpeggioArrowUp"; - break; - case kDirectionDown: - fLilypondCodeOstream << - endl << - "\\arpeggioArrowDown"; - break; - } // switch - - fLilypondCodeOstream << ' '; - - fCurrentArpeggioDirectionKind = directionKind; - } - - else if ( - // non arpeggiato? - S_msrNonArpeggiato - nonArpeggiato = - dynamic_cast(&(*articulation)) - ) { - fLilypondCodeOstream << - endl << - "\\arpeggioBracket"; - - switch (nonArpeggiato->getNonArpeggiatoTypeKind ()) { - case msrNonArpeggiato::kNonArpeggiatoTypeNone: - fLilypondCodeOstream << " %{\\kNonArpeggiatoTypeNone???%}"; - break; - case msrNonArpeggiato::kNonArpeggiatoTypeTop: - fLilypondCodeOstream << " %{\\kNonArpeggiatoTypeTop???%}"; - break; - case msrNonArpeggiato::kNonArpeggiatoTypeBottom: - fLilypondCodeOstream << " %{\\kNonArpeggiatoTypeBottom???%}"; - break; - } // switch - - fLilypondCodeOstream << endl; - } - } // for - } - - // should stem direction be generated? - const list& - chordStems = - chord->getChordStems (); - - if (chordStems.size ()) { - list::const_iterator - iBegin = chordStems.begin (), - iEnd = chordStems.end (), - i = iBegin; - - for ( ; ; ) { - S_msrStem stem = (*i); - - switch (stem->getStemKind ()) { - case msrStem::kStemNone: - fLilypondCodeOstream << "\\stemNeutral "; - break; - case msrStem::kStemUp: - fLilypondCodeOstream << "\\stemUp "; - break; - case msrStem::kStemDown: - fLilypondCodeOstream << "\\stemDown "; - break; - case msrStem::kStemDouble: // JMI ??? - break; - } // switch - - if (++i == iEnd) break; - fLilypondCodeOstream << - ' '; - } // for - - fLilypondCodeOstream << - ' '; - } - - // should an octave shift be generated? - S_msrOctaveShift - chordOctaveShift = - chord->getChordOctaveShift (); - - if (chordOctaveShift) { - generateCodeForOctaveShift ( - chordOctaveShift); - } - - // generate the start of the chord - fLilypondCodeOstream << - "<"; - - fOnGoingChord = true; -} - -void lpsr2LilypondTranslator::generateCodeForChordContents (S_msrChord chord) -{ - // get the chord notes vector - const vector& - chordNotesVector = - chord->getChordNotesVector (); - - // generate the chord notes KOF JMI - if (chordNotesVector.size ()) { - vector::const_iterator - iBegin = chordNotesVector.begin (), - iEnd = chordNotesVector.end (), - i = iBegin; - for ( ; ; ) { - S_msrNote - note = (*i); - - // print things before the note - generateCodeBeforeNote (note); - - // print the note itself - generateCodeForNote (note); - - // print things after the note - generateCodeAfterNote (note); - - if (++i == iEnd) break; - fLilypondCodeOstream << - ' '; - } // for - } -} - -void lpsr2LilypondTranslator::generateCodeAfterChordContents (S_msrChord chord) -{ - // generate the end of the chord - fLilypondCodeOstream << - ">"; - - // get the chord notes vector - const vector& - chordNotesVector = - chord->getChordNotesVector (); - - // if the preceding item is a chord, the first note of the chord - // is used as the reference point for the octave placement - // of a following note or chord - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = - chordNotesVector [0]; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - - // generate the chord duration if relevant - if ( - chord->getChordIsFirstChordInADoubleTremolo () - || - chord->getChordIsSecondChordInADoubleTremolo ()) { - // print chord duration - fLilypondCodeOstream << - chord->getChordSoundingWholeNotes (); - } - - else { - int chordInputLineNumber = - chord->getInputLineNumber (); - - // print the chord duration - fLilypondCodeOstream << - durationAsLilypondString ( - chordInputLineNumber, - chord-> - getChordDisplayWholeNotes ()); // JMI test wether chord is in a tuplet? - } - - // are there pending chord member notes string numbers? - if (fPendingChordMemberNotesStringNumbers.size ()) { - list::const_iterator - iBegin = fPendingChordMemberNotesStringNumbers.begin (), - iEnd = fPendingChordMemberNotesStringNumbers.end (), - i = iBegin; - - for ( ; ; ) { - int stringNumber = (*i); - - fLilypondCodeOstream << - "\\" << - stringNumber; - - if (++i == iEnd) break; - fLilypondCodeOstream << - ' '; - } // for - fLilypondCodeOstream << - ' '; - - // forget about the pending string numbers - fPendingChordMemberNotesStringNumbers.clear (); - } - - // fetch the chord single tremolo - S_msrSingleTremolo - chordSingleTremolo = - chord->getChordSingleTremolo (); - - if (chordSingleTremolo) { - // generate code for the chord single tremolo - fLilypondCodeOstream << - singleTremoloDurationAsLilypondString ( - chordSingleTremolo); - } - - fLilypondCodeOstream << - ' '; - - // get the chord articulations - list - chordArticulations = - chord->getChordArticulations (); - - // print the chord articulations if any - if (chordArticulations.size ()) { - list::const_iterator i; - for ( - i=chordArticulations.begin (); - i!=chordArticulations.end (); - i++ - ) { - generateChordArticulation ((*i)); - - fLilypondCodeOstream << - ' '; - } // for - } - - // print the chord technicals if any - list - chordTechnicals = - chord->getChordTechnicals (); - - if (chordTechnicals.size ()) { - list::const_iterator i; - for ( - i=chordTechnicals.begin (); - i!=chordTechnicals.end (); - i++ - ) { - fLilypondCodeOstream << - technicalAsLilypondString ((*i)) << - ' '; // JMI - } // for - } - - // print the chord technicals with integer if any - list - chordTechnicalWithIntegers = - chord->getChordTechnicalWithIntegers (); - - if (chordTechnicalWithIntegers.size ()) { - list::const_iterator i; - for ( - i=chordTechnicalWithIntegers.begin (); - i!=chordTechnicalWithIntegers.end (); - i++ - ) { - fLilypondCodeOstream << - technicalWithIntegerAsLilypondString ((*i)) << - ' '; // JMI - } // for - } - - // print the chord technicals with float if any - list - chordTechnicalWithFloats = - chord->getChordTechnicalWithFloats (); - - if (chordTechnicalWithFloats.size ()) { - list::const_iterator i; - for ( - i=chordTechnicalWithFloats.begin (); - i!=chordTechnicalWithFloats.end (); - i++ - ) { - fLilypondCodeOstream << - technicalWithFloatAsLilypondString ((*i)) << - ' '; // JMI - } // for - } - - // print the chord technicals with string if any - list - chordTechnicalWithStrings = - chord->getChordTechnicalWithStrings (); - - if (chordTechnicalWithStrings.size ()) { - list::const_iterator i; - for ( - i=chordTechnicalWithStrings.begin (); - i!=chordTechnicalWithStrings.end (); - i++ - ) { - fLilypondCodeOstream << - technicalWithStringAsLilypondString ((*i)) << - ' '; // JMI - } // for - } - - // print the chord ornaments if any - list - chordOrnaments = - chord->getChordOrnaments (); - - if (chordOrnaments.size ()) { - list::const_iterator i; - for ( - i=chordOrnaments.begin (); - i!=chordOrnaments.end (); - i++ - ) { - S_msrOrnament - ornament = (*i); - - switch (ornament->getOrnamentPlacementKind ()) { - case kPlacementNone: - fLilypondCodeOstream << "-"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "-"; - break; - } // switch - - generateOrnament (ornament); // some ornaments are not yet supported - } // for - } - - // print the chord dynamics if any - list - chordDynamics = - chord->getChordDynamics (); - - if (chordDynamics.size ()) { - list::const_iterator i; - for ( - i=chordDynamics.begin (); - i!=chordDynamics.end (); - i++ - ) { - S_msrDynamics - dynamics = (*i); - - switch (dynamics->getDynamicsPlacementKind ()) { - case kPlacementNone: - fLilypondCodeOstream << "-"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - // this is done by LilyPond by default - break; - } // switch - - fLilypondCodeOstream << - dynamicsAsLilypondString (dynamics) << ' '; - } // for - } - - // print the chord other dynamics if any - list - chordOtherDynamics = - chord->getChordOtherDynamics (); - - if (chordOtherDynamics.size ()) { - list::const_iterator i; - for ( - i=chordOtherDynamics.begin (); - i!=chordOtherDynamics.end (); - i++ - ) { - S_msrOtherDynamics - otherDynamics = (*i); - - switch (otherDynamics->getOtherDynamicsPlacementKind ()) { - case kPlacementNone: - fLilypondCodeOstream << "-"; - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - // this is done by LilyPond by default - break; - } // switch - - fLilypondCodeOstream << - "\\otherDynamic \"" << - otherDynamics->getOtherDynamicsString () << - "\" "; - } // for - } - - // print the chord words if any - list - chordWords = - chord->getChordWords (); - - if (chordWords.size ()) { - list::const_iterator i; - for ( - i=chordWords.begin (); - i!=chordWords.end (); - i++ - ) { - - msrPlacementKind - wordsPlacementKind = - (*i)->getWordsPlacementKind (); - - string wordsContents = - (*i)->getWordsContents (); - - switch (wordsPlacementKind) { - case kPlacementNone: - // should not occur - break; - case kPlacementAbove: - fLilypondCodeOstream << "^"; - break; - case kPlacementBelow: - fLilypondCodeOstream << "_"; - break; - } // switch - - fLilypondCodeOstream << - "\\markup" << " { " << - doubleQuoteStringIfNonAlpha (wordsContents) << - " } "; - } // for - } - - // print the chord beams if any - list - chordBeams = - chord->getChordBeams (); - - if (chordBeams.size ()) { - list::const_iterator i; - for ( - i=chordBeams.begin (); - i!=chordBeams.end (); - i++ - ) { - - S_msrBeam beam = (*i); - - // LilyPond will take care of multiple beams automatically, - // so we need only generate code for the first number (level) - switch (beam->getBeamKind ()) { - - case msrBeam::kBeginBeam: - if (beam->getBeamNumber () == 1) - fLilypondCodeOstream << "[ "; - break; - - case msrBeam::kContinueBeam: - break; - - case msrBeam::kEndBeam: - if (beam->getBeamNumber () == 1) - fLilypondCodeOstream << "] "; - break; - - case msrBeam::kForwardHookBeam: - break; - - case msrBeam::kBackwardHookBeam: - break; - - case msrBeam::k_NoBeam: - break; - } // switch - } // for - } - - // print the chord slurs if any - list - chordSlurs = - chord->getChordSlurs (); - - if (chordSlurs.size ()) { - list::const_iterator i; - for ( - i=chordSlurs.begin (); - i!=chordSlurs.end (); - i++ - ) { - - switch ((*i)->getSlurTypeKind ()) { - case msrSlur::k_NoSlur: - break; - case msrSlur::kRegularSlurStart: - fLilypondCodeOstream << "( "; - break; - case msrSlur::kPhrasingSlurStart: - fLilypondCodeOstream << "\\( "; - break; - case msrSlur::kSlurContinue: - break; - case msrSlur::kRegularSlurStop: - fLilypondCodeOstream << ") "; - break; - case msrSlur::kPhrasingSlurStop: - fLilypondCodeOstream << "\\) "; - break; - } // switch - } // for - } - -/* Don't print the chord ties, rely only on its notes's ties // JMI - // thus using LilyPond's partially tied chords // JMI - // print the chord ties if any - list - chordTies = - chord->getChordTies (); - - if (chordTies.size ()) { - list::const_iterator i; - for ( - i=chordTies.begin (); - i!=chordTies.end (); - i++ - ) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - "~ %{S_msrChord}"; // JMI spaces??? - } // for - } -*/ - -/* JMI - // print the tie if any - { - S_msrTie chordTie = chord->getChordTie (); - - if (chordTie) { - if (chordTie->getTieKind () == msrTie::kTieStart) { - fLilypondCodeOstream << - "%{line " << inputLineNumber << "%}" << - "~ "; - } - } - } -*/ - - // get the chord ligatures - list - chordLigatures = - chord->getChordLigatures (); - - // print the chord ligatures if any - if (chordLigatures.size ()) { - list::const_iterator i; - for ( - i=chordLigatures.begin (); - i!=chordLigatures.end (); - i++ - ) { - switch ((*i)->getLigatureKind ()) { - case msrLigature::kLigatureNone: - break; - case msrLigature::kLigatureStart: - fLilypondCodeOstream << "\\[ "; - break; - case msrLigature::kLigatureContinue: - break; - case msrLigature::kLigatureStop: - fLilypondCodeOstream << "\\] "; - break; - } // switch - } // for - } - - // print the chord wedges if any - list - chordWedges = - chord->getChordWedges (); - - if (chordWedges.size ()) { - list::const_iterator i; - for ( - i=chordWedges.begin (); - i!=chordWedges.end (); - i++ - ) { - switch ((*i)->getWedgeKind ()) { - case msrWedge::kWedgeKindNone: - break; - case msrWedge::kWedgeCrescendo: - fLilypondCodeOstream << "\\< "; - break; - case msrWedge::kWedgeDecrescendo: - fLilypondCodeOstream << "\\> "; - break; - case msrWedge::kWedgeStop: - fLilypondCodeOstream << "\\! "; - break; - } // switch - } // for - } - - // get the chord glissandos - const list& - chordGlissandos = - chord->getChordGlissandos (); - - // print the chord glissandos if any - if (chordGlissandos.size ()) { - list::const_iterator i; - for ( - i=chordGlissandos.begin (); - i!=chordGlissandos.end (); - i++ - ) { - S_msrGlissando glissando = (*i); - - switch (glissando->getGlissandoTypeKind ()) { - case msrGlissando::kGlissandoTypeNone: - break; - - case msrGlissando::kGlissandoTypeStart: - // generate the glissando itself - fLilypondCodeOstream << - "\\glissando "; - break; - - case msrGlissando::kGlissandoTypeStop: - break; - } // switch - } // for - } - - // get the chord slides - const list& - chordSlides = - chord->getChordSlides (); - - // print the chord slides if any, implemented as glissandos - if (chordSlides.size ()) { - list::const_iterator i; - for ( - i=chordSlides.begin (); - i!=chordSlides.end (); - i++ - ) { - S_msrSlide slide = (*i); - - switch (slide->getSlideTypeKind ()) { - case msrSlide::kSlideTypeNone: - break; - - case msrSlide::kSlideTypeStart: - // generate the glissando itself - fLilypondCodeOstream << - "\\glissando "; - break; - - case msrSlide::kSlideTypeStop: - break; - } // switch - } // for - } - - fOnGoingChord = false; -} - -void lpsr2LilypondTranslator::generateChordInGraceNotesGroup (S_msrChord chord) -{ - generateCodeBeforeChordContents (chord); - - generateCodeForChordContents (chord); - - generateCodeAfterChordContents (chord); -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrChord& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrChord" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (fOnGoingGraceNotesGroup) { - int chordInputLineNumber = - elt->getInputLineNumber (); - - msrInternalWarning ( - gOahOah->fInputSourceName, - chordInputLineNumber, - "% ==> Start visiting grace chords is ignored"); - - return; - } -#endif - - generateCodeBeforeChordContents (elt); -} - -void lpsr2LilypondTranslator::visitEnd (S_msrChord& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrChord" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (fOnGoingGraceNotesGroup) { - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "% ==> End visiting grace chords is ignored"); - - return; - } -#endif - - generateCodeAfterChordContents (elt); - - // if the preceding item is a chord, the first note of the chord - // is used as the reference point for the octave placement - // of a following note or chord - switch (gLilypondOah->fOctaveEntryKind) { - case kOctaveEntryRelative: - fCurrentOctaveEntryReference = - elt->getChordNotesVector () [0]; - break; - case kOctaveEntryAbsolute: - break; - case kOctaveEntryFixed: - break; - } // switch - - fOnGoingChord = false; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - if (fTupletsStack.size ()) { - // elt is a nested tuplet - - S_msrTuplet - containingTuplet = - fTupletsStack.top (); - - // unapply containing tuplet factor, - // i.e 3/2 inside 5/4 becomes 15/8 in MusicXML... - elt-> - unapplySoundingFactorToTupletMembers ( - containingTuplet-> - getTupletFactor ()); - } - - if (gLilypondOah->fIndentTuplets) { - fLilypondCodeOstream << endl; - } - - // get bracket kind - msrTuplet::msrTupletBracketKind - tupletBracketKind = - elt->getTupletBracketKind (); - - switch (tupletBracketKind) { - case msrTuplet::kTupletBracketYes: - /* JMI - fLilypondCodeOstream << - "%{kTupletBracketYes%}" << - endl; - */ - break; - case msrTuplet::kTupletBracketNo: - fLilypondCodeOstream << - "\\once \\omit TupletBracket" << - endl; - break; - } // switch - - // get line shape kind - msrTuplet::msrTupletLineShapeKind - tupletLineShapeKind = - elt->getTupletLineShapeKind (); - - switch (tupletLineShapeKind) { - case msrTuplet::kTupletLineShapeStraight: - break; - case msrTuplet::kTupletLineShapeCurved: - fLilypondCodeOstream << - "\\temporary \\tupletsCurvedBrackets" << - endl; - break; - } // switch - - // get show number kind - msrTuplet::msrTupletShowNumberKind - tupletShowNumberKind = - elt->getTupletShowNumberKind (); - - switch (tupletShowNumberKind) { - case msrTuplet::kTupletShowNumberActual: - /* JMI - fLilypondCodeOstream << - "%{tupletShowNumberActual%}" << - endl; - */ - break; - case msrTuplet::kTupletShowNumberBoth: - fLilypondCodeOstream << - "\\once \\override TupletNumber.text = #tuplet-number::calc-fraction-text" << - endl; - break; - case msrTuplet::kTupletShowNumberNone: - fLilypondCodeOstream << - "\\once \\omit TupletNumber" << - endl; - break; - } // switch - - // get show type kind - msrTuplet::msrTupletShowTypeKind - tupletShowTypeKind = - elt->getTupletShowTypeKind (); - - rational - memberNoteDisplayWholeNotes = - elt->getMemberNotesDisplayWholeNotes (); - - switch (tupletShowTypeKind) { - case msrTuplet::kTupletShowTypeActual: - fLilypondCodeOstream << - // JMI ??? "\\once \\override TupletNumber.text = #(tuplet-number::append-note-wrapper tuplet-number::calc-fraction-text \"" << - "\\once \\override TupletNumber.text = #(tuplet-number::append-note-wrapper tuplet-number::calc-denominator-text \"" << - wholeNotesAsLilypondString ( - inputLineNumber, - memberNoteDisplayWholeNotes) << - "\")" << - endl; - break; - case msrTuplet::kTupletShowTypeBoth: - fLilypondCodeOstream << - "\\once \\override TupletNumber.text = #(tuplet-number::fraction-with-notes" << - " #{ " << - wholeNotesAsLilypondString ( - inputLineNumber, - memberNoteDisplayWholeNotes) << - " #} #{ " << - wholeNotesAsLilypondString ( - inputLineNumber, - memberNoteDisplayWholeNotes) << - " #})" << - endl; - break; - case msrTuplet::kTupletShowTypeNone: - /* JMI - fLilypondCodeOstream << - "%{tupletShowTypeNone%}" << - endl; - */ - break; - } // switch - - fLilypondCodeOstream << - "\\tuplet " << - elt->getTupletFactor ().asRational () << - " {" << - endl; - - fTupletsStack.push (elt); - - gIndenter++; - - // force durations to be displayed explicitly - // at the beginning of the tuplet - fLastMetWholeNotes = rational (0, 1); -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - if (gLilypondOah->fIndentTuplets) { - fLilypondCodeOstream << endl; - } - - fLilypondCodeOstream << - "}" << - endl; - - // get line shape kind - msrTuplet::msrTupletLineShapeKind - tupletLineShapeKind = - elt->getTupletLineShapeKind (); - - switch (tupletLineShapeKind) { - case msrTuplet::kTupletLineShapeStraight: - break; - case msrTuplet::kTupletLineShapeCurved: - fLilypondCodeOstream << - "\\undo \\tupletsCurvedBrackets" << - endl; - break; - } // switch - - fTupletsStack.pop (); - -/* JMI - ?????? fCurrentOctaveEntryReference = nullptr; - // the first note after the tuplet will become the new reference - */ -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrTie& elt) -{ -int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrTie" << - ", line " << inputLineNumber << - endl; - } -#endif - - switch (elt->getTieKind ()) { - case msrTie::kTieNone: - break; - case msrTie::kTieStart: - if (fOnGoingNote) { - // this precludes generating for the chords' ties, - // since the last of its notes sets fOnGoingNote to false - // after code has been generated for it - fLilypondCodeOstream << - // JMI "%{line " << inputLineNumber << "%}" << - " ~ "; - } - break; - case msrTie::kTieContinue: - break; - case msrTie::kTieStop: - break; - } // switch -} - -void lpsr2LilypondTranslator::visitEnd (S_msrTie& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrTie" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrSegno& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrSegno" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\mark \\markup { \\musicglyph #\"scripts.segno\" }" << - endl; -} - -void lpsr2LilypondTranslator::visitStart (S_msrCoda& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrCoda" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\mark \\markup { \\musicglyph #\"scripts.coda\" }" << - endl; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrEyeGlasses& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting eyeGlasses" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "^\\markup {\\eyeglasses} "; -} - -void lpsr2LilypondTranslator::visitStart (S_msrScordatura& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting scordatura" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - const list& - scordaturaStringTuningsList = - elt->getScordaturaStringTuningsList (); - - gIndenter++; - - fLilypondCodeOstream << - "\\new Staff {" << - endl; - - gIndenter++; - - fLilypondCodeOstream << - "\\hide Staff.Stem" << - endl << - "\\hide Staff.TimeSignature" << - endl << - "\\small" << - endl << - "<"; - - if (scordaturaStringTuningsList.size ()) { - list::const_iterator - iBegin = scordaturaStringTuningsList.begin (), - iEnd = scordaturaStringTuningsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrStringTuning - stringTuning = (*i); - - fLilypondCodeOstream << - stringTuningAsLilypondString ( - elt->getInputLineNumber (), - stringTuning); - - if (++i == iEnd) break; - - fLilypondCodeOstream << ' '; - } // for - } - - fLilypondCodeOstream << - ">4" << - endl << - "}" << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "{ c'4 }" << - endl << - - gIndenter--; - */ -} - -void lpsr2LilypondTranslator::visitStart (S_msrPedal& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting pedal" << - ", line " << inputLineNumber << - endl; - } -#endif - - fLilypondCodeOstream << endl; - - switch (elt->getPedalTypeKind ()) { - case msrPedal::kPedalStart: - fLilypondCodeOstream << - "\\sustainOn"; - break; - case msrPedal::kPedalContinue: - fLilypondCodeOstream << - "\\sustainOff\\sustainOn"; // JMI - break; - case msrPedal::kPedalChange: - fLilypondCodeOstream << - "\\sustainOff\\sustainOn"; - break; - case msrPedal::kPedalStop: - fLilypondCodeOstream << - "\\sustainOff"; - break; - case msrPedal::k_NoPedalType: - { - // should not occur - - stringstream s; - - s << - "msrPedal '" << - elt->asShortString () << - "' has no pedal type"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - - fLilypondCodeOstream << endl; -} - -void lpsr2LilypondTranslator::visitStart (S_msrDamp& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting damp" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "^\\markup {\\damp} "; -} - -void lpsr2LilypondTranslator::visitStart (S_msrDampAll& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting dampAll" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "^\\markup {\\dampAll} "; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrBarline& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - endl << - "% --> Start visiting msrBarline" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - switch (elt->getBarlineCategory ()) { - - case msrBarline::kBarlineCategoryStandalone: - switch (elt->getBarlineStyleKind ()) { - case msrBarline::kBarlineStyleNone: - break; - case msrBarline::kBarlineStyleRegular: - fLilypondCodeOstream << "\\bar \"|\" "; - break; - case msrBarline::kBarlineStyleDotted: - fLilypondCodeOstream << "\\bar \";\" "; - break; - case msrBarline::kBarlineStyleDashed: - fLilypondCodeOstream << "\\bar \"!\" "; - break; - case msrBarline::kBarlineStyleHeavy: - fLilypondCodeOstream << "\\bar \".\" "; - break; - case msrBarline::kBarlineStyleLightLight: - fLilypondCodeOstream << "\\bar \"||\" "; - break; - case msrBarline::kBarlineStyleLightHeavy: - fLilypondCodeOstream << - endl << - "\\bar \"|.\" "; - break; - case msrBarline::kBarlineStyleHeavyLight: - fLilypondCodeOstream << "\\bar \".|\" "; - break; - case msrBarline::kBarlineStyleHeavyHeavy: - fLilypondCodeOstream << "\\bar \"..\" "; - break; - case msrBarline::kBarlineStyleTick: - fLilypondCodeOstream << "\\bar \"'\" "; - break; - case msrBarline::kBarlineStyleShort: - // \bar "/" is the custom short barline - fLilypondCodeOstream << "\\bar \"/\" "; - break; - /* JMI - case msrBarline::kBarlineStyleNone: - fLilypondCodeOstream << "\\bar \"\" "; - break; - */ - } // switch - - if (gLilypondOah->fInputLineNumbers) { - // print the barline line number as a comment - fLilypondCodeOstream << - "%{ " << inputLineNumber << " %} "; - } - - fLilypondCodeOstream << endl; - - switch (elt->getBarlineHasSegnoKind ()) { - case msrBarline::kBarlineHasSegnoYes: - fLilypondCodeOstream << - "\\mark \\markup { \\musicglyph #\"scripts.segno\" } "; - break; - case msrBarline::kBarlineHasSegnoNo: - break; - } // switch - - switch (elt->getBarlineHasCodaKind ()) { - case msrBarline::kBarlineHasCodaYes: - fLilypondCodeOstream << - "\\mark \\markup { \\musicglyph #\"scripts.coda\" } "; - break; - case msrBarline::kBarlineHasCodaNo: - break; - } // switch - break; - - case msrBarline::kBarlineCategoryRepeatStart: - if (gLilypondOah->fKeepRepeatBarlines) { - fLilypondCodeOstream << "\\bar \".|:\" "; - } - break; - case msrBarline::kBarlineCategoryRepeatEnd: - if (gLilypondOah->fKeepRepeatBarlines) { - // JMI fLilypondCodeOstream << "\\bar \":|.|:\" "; - fLilypondCodeOstream << "FOOLISH \\bar \":|.|:\" "; - } - break; - - case msrBarline::kBarlineCategoryHookedEndingStart: - case msrBarline::kBarlineCategoryHookedEndingEnd: - case msrBarline::kBarlineCategoryHooklessEndingStart: - case msrBarline::kBarlineCategoryHooklessEndingEnd: - // should not occur, since - // LilyPond will take care of displaying the repeat - break; - - case msrBarline::k_NoBarlineCategory: - { - stringstream s; - - s << - "barline category has not been set" << - ", line " << elt->getInputLineNumber (); - - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // JMI __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - - if (gLilypondOah->fInputLineNumbers) { - fLilypondCodeOstream << - " %{ " << inputLineNumber << " %}"; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrBarline& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - endl << - "% --> End visiting msrBarline" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - int inputLineNumber = - elt->getInputLineNumber (); - - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrBarCheck" << - ", nextBarNumber: " << - elt->getNextBarPuristNumber () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int nextBarPuristNumber = - elt->getNextBarPuristNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLilypondCodeOstream << - "% nextBarPuristNumber = " << - nextBarPuristNumber << - ", fOnGoingRestMeasures = " << - "fOnGoingVoiceCadenza = " << - booleanAsString (fOnGoingVoiceCadenza) << - ", nextBarPuristNumber = " << - booleanAsString (fOnGoingRestMeasures) << - ", line " << inputLineNumber << - endl; - } -#endif - - if ( - ! fOnGoingVoiceCadenza - // should be tested in msr2LpsrTranslator.cpp JMI visitEnd (S_msrMeasure&) - // MusicXML bar numbers cannot be relied upon for a LilyPond bar number check - && - ! fOnGoingRestMeasures - ) { - // don't generate a bar check before the end of measure 1 // JMI ??? - fLilypondCodeOstream << - "| % " << nextBarPuristNumber; - - if (gLilypondOah->fOriginalMeasureNumbers) { - // print the original MusicXML measure number as a comment - fLilypondCodeOstream << - " (omn: " << elt->getNextBarOriginalNumber () << ")"; - } - - fLilypondCodeOstream << - endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrBarCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - int inputLineNumber = - elt->getInputLineNumber (); - - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrBarNumberCheck" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLilypondCodeOstream << - "% fOnGoingVoiceCadenza = " << - booleanAsString (fOnGoingVoiceCadenza) << - ", fOnGoingRestMeasures = " << - booleanAsString (fOnGoingRestMeasures) << - ", line " << inputLineNumber << - endl; - } -#endif - - if ( - ! fOnGoingVoiceCadenza - // should be tested in msr2LpsrTranslator.cpp JMI visitEnd (S_msrMeasure&) - // MusicXML bar numbers cannot be relied upon for a LilyPond bar number check - && - ! fOnGoingRestMeasures - ) { - int nextBarPuristNumber = - elt->getNextBarPuristNumber (); - - fLilypondCodeOstream << - "\\barNumberCheck #" << - nextBarPuristNumber; - - if (gLilypondOah->fOriginalMeasureNumbers) { - fLilypondCodeOstream << - " %{omn: " << - elt->getNextBarOriginalNumber () << - "%}"; - } - - fLilypondCodeOstream << - endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrBarNumberCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrLineBreak& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrLineBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\myBreak | % " << elt->getNextBarNumber (); - - if (gLilypondOah->fOriginalMeasureNumbers) { - // print the original MusicXML measure number as a comment - fLilypondCodeOstream << - " (omn: " << elt->getNextBarNumber () << ")"; - } - - fLilypondCodeOstream << - endl << - endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrLineBreak& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrLineBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrPageBreak& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrPageBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "\\myPageBreak " << - endl << - endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrPageBreak& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrPageBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrRepeat& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrRepeat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int repeatEndingsNumber = - elt->getRepeatEndings ().size (); - - if (repeatEndingsNumber == 0) - repeatEndingsNumber = 2; // implicitly JMI ??? - - fRepeatDescrsStack.push_back ( - lpsrRepeatDescr::create ( - repeatEndingsNumber)); - - int - repeatTimes = - elt->getRepeatTimes (); - - stringstream s; - - fLilypondCodeOstream << endl; - - s << - "\\repeat volta " << - repeatTimes << -// JMI fRepeatDescrsStack.back ()->getRepeatEndingsNumber () << - " {"; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - s.str () << "% start of repeat"; - } - else { - fLilypondCodeOstream << - s.str (); - } - - fLilypondCodeOstream << endl; - - gIndenter++; - - if (repeatTimes > 2) { - fLilypondCodeOstream << - "<>^\"" << repeatTimes << " times\"" << // JMI - endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrRepeat& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrRepeat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - /* - CAUTION: - the end of the repeat has to be generated - before the endings are handled - */ - - if (! fRepeatDescrsStack.back ()->getEndOfRepeatHasBeenGenerated ()) { - // the end of the repeat has not been generated yet - - gIndenter--; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "}" << "% end of repeat" << - endl; - } - else { - fLilypondCodeOstream << - endl << - "}" << - endl << - endl; - } - } - - fRepeatDescrsStack.pop_back (); -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrRepeatCommonPart& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrRepeatCommonPart" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void lpsr2LilypondTranslator::visitEnd (S_msrRepeatCommonPart& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrRepeatCommonPart" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrRepeatEnding& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrRepeatEnding" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fRepeatDescrsStack.back ()-> - incrementRepeatEndingsCounter (); - - int - repeatEndingInternalNumber = - elt->getRepeatEndingInternalNumber (); - - if (repeatEndingInternalNumber == 1) { - - gIndenter--; - - // first repeat ending is in charge of - // outputting the end of the repeat - if (gLilypondOah->fComments) { - fLilypondCodeOstream << - setw (commentFieldWidth) << left << - "}" << "% end of repeat" << - endl; - } - else { - fLilypondCodeOstream << - endl << - "}" << - endl; - } - fRepeatDescrsStack.back ()-> - setEndOfRepeatHasBeenGenerated (); - - // first repeat ending is in charge of - // outputting the start of the alternative - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - endl << - setw (commentFieldWidth) << - "\\alternative {" << - "% start of alternative" << - endl; - } - else { - fLilypondCodeOstream << - endl << - "\\alternative {" << - endl; - } - - gIndenter++; - } - - // output the start of the ending - switch (elt->getRepeatEndingKind ()) { - case msrRepeatEnding::kHookedEnding: - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "{" << "% start of repeat hooked ending" << - endl; - } - else { - fLilypondCodeOstream << - "{" << - endl; - } - break; - - case msrRepeatEnding::kHooklessEnding: - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "{" << "% start of repeat hookless ending" << - endl; - } - else { - fLilypondCodeOstream << - "{" << - endl; - } - break; - } // switch - - gIndenter++; - - // generate the repeat ending number if any - string - repeatEndingNumber = - elt->getRepeatEndingNumber (); - - if (repeatEndingNumber.size ()) { - /* only if numbers differ JMI ??? - if (repeatEndingInternalNumber == 1) { - fLilypondCodeOstream << - "\\set Score.repeatCommands = #'((volta \"" << - repeatEndingNumber << - "\"))" << - endl; - } - else { - fLilypondCodeOstream << - "\\set Score.repeatCommands = #'(end-repeat (volta \"" << - repeatEndingNumber << - "\"))" << - endl; - } - */ - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrRepeatEnding& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrRepeatEnding" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - // output the end of the ending - fLilypondCodeOstream << endl; - - switch (elt->getRepeatEndingKind ()) { - case msrRepeatEnding::kHookedEnding: - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "}" << "% end of repeat hooked ending" << - endl; - } - else { - fLilypondCodeOstream << - "}" << - endl; - } - break; - - case msrRepeatEnding::kHooklessEnding: - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "}" << "% end of repeat hookless ending" << - endl; - } - else { - fLilypondCodeOstream << - "}" << - endl; - } - break; - } // switch - -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLilypondCodeOstream << - "% ===**** fRepeatDescrsStack.back () = '" << - fRepeatDescrsStack.back ()->repeatDescrAsString () << - "'" << - endl; - } -#endif -*/ - - if ( - fRepeatDescrsStack.back ()->getRepeatEndingsCounter () - == - fRepeatDescrsStack.back ()->getRepeatEndingsNumber ()) { - - gIndenter--; - - // last repeat ending is in charge of - // outputting the end of the alternative - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "}" << "% end of alternative" << - endl; - } - else { - fLilypondCodeOstream << - "}" << - endl << - endl; - } - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrComment& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrComment" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - "% " << elt->getContents () << - endl; - - if (elt->getCommentGapKind () == lpsrComment::kGapAfterwards) - fLilypondCodeOstream << endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrComment& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrComment" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_lpsrSchemeFunction& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting lpsrSchemeFunction" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << - endl << - "% Scheme function(s): \"" << elt->getFunctionName () << "\"" << - // endl is in the decription - elt->getFunctionDescription () << - // endl is in the decription - elt->getFunctionCode () << - endl << - endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_lpsrSchemeFunction& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting lpsrSchemeFunction" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fLilypondCodeOstream << endl; - - switch (elt->getRehearsalPlacementKind ()) { - case msrPlacementKind::kPlacementNone: - break; - case msrPlacementKind::kPlacementAbove: - break; - case msrPlacementKind::kPlacementBelow: - fLilypondCodeOstream << - "\\once\\override Score.RehearsalMark.direction = #DOWN"; - break; - } // switch - - fLilypondCodeOstream << - endl << - "\\mark\\markup { "; - - switch (elt->getRehearsalKind ()) { - case msrRehearsal::kNone: - fLilypondCodeOstream << - "\\box"; // default value - break; - case msrRehearsal::kRectangle: - fLilypondCodeOstream << - "\\box"; - break; - case msrRehearsal::kOval: - fLilypondCodeOstream << - "\\oval"; - break; - case msrRehearsal::kCircle: - fLilypondCodeOstream << - "\\circle"; - break; - case msrRehearsal::kBracket: - fLilypondCodeOstream << - "\\bracket"; - break; - case msrRehearsal::kTriangle: - fLilypondCodeOstream << - "%{\\triangle???%}"; - break; - case msrRehearsal::kDiamond: - fLilypondCodeOstream << - "%{\\diamond???"; - break; - } // switch - - fLilypondCodeOstream << - " { \""<< - elt->getRehearsalText () << - "\"" "}}" << - endl; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrMeasuresRepeat& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrMeasuresRepeat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - int repeatReplicasMeasuresNumber = - elt->fetchMeasuresRepeatReplicasMeasuresNumber (); -#endif - - int replicasNumber = - elt->fetchMeasuresRepeatReplicasNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - int repeatPatternMeasuresNumber = - elt->fetchMeasuresRepeatPatternMeasuresNumber (); - - fLilypondCodeOstream << - "% measures repeat, line " << elt->getInputLineNumber () << ":" << - endl; - - const int fieldWidth = 24; - - fLilypondCodeOstream << left << - setw (fieldWidth) << - "% repeatPatternMeasuresNumber" << " = " << repeatPatternMeasuresNumber << - endl << - setw (fieldWidth) << - "% repeatReplicasMeasuresNumber" << " = " << repeatReplicasMeasuresNumber << - endl << - setw (fieldWidth) << - "% replicasNumber" << " = " << replicasNumber << - endl; - } -#endif - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% start of measures repeat" << - singularOrPlural ( - elt->fetchMeasuresRepeatReplicasNumber (), - "replica", - "replicas") << - ", line " << elt->getInputLineNumber () << - endl; - } - - fLilypondCodeOstream << - endl << - endl << - "\\repeat percent " << - replicasNumber + 1 << - " { " << - endl; - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrMeasuresRepeat& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrMeasuresRepeat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - fLilypondCodeOstream << - endl << - endl << - " }" << - endl; - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << - setw (commentFieldWidth) << left << - "% end of measures repeat" << - singularOrPlural ( - elt->fetchMeasuresRepeatReplicasNumber (), - "replica", - "replicas") << - ", line " << elt->getInputLineNumber () << - endl << - endl; - } -} - -void lpsr2LilypondTranslator::visitStart (S_msrMeasuresRepeatPattern& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> Start visiting msrMeasuresRepeatPattern" << - endl; - } -#endif - - gIndenter++; - - // JMI -} - -void lpsr2LilypondTranslator::visitEnd (S_msrMeasuresRepeatPattern& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> End visiting msrMeasuresRepeatPattern" << - endl; - } -#endif - - gIndenter--; -} - -void lpsr2LilypondTranslator::visitStart (S_msrMeasuresRepeatReplicas& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> Start visiting msrMeasuresRepeatReplicas" << - endl; - } -#endif - - // output the start of the ending - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "{" << "% start of measures repeat replicas" << - endl; - } - else { - fLilypondCodeOstream << - endl << - "{" << - endl; - } - - gIndenter++; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrMeasuresRepeatReplicas& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> End visiting msrMeasuresRepeatReplicas" << - endl; - } -#endif - - gIndenter--; -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrRestMeasures& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrRestMeasures" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - int restMeasuresNumber = - elt->getRestMeasuresNumber (); - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% start of rest measures" << - singularOrPlural ( - restMeasuresNumber, - "measure", - "measures") << - ", line " << inputLineNumber << - endl << - endl; - - gIndenter++; - } - - fOnGoingRestMeasures = true; -} - -void lpsr2LilypondTranslator::visitEnd (S_msrRestMeasures& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrRestMeasures" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - int restMeasuresNumber = - elt->getRestMeasuresNumber (); - - // start counting measures - fRemainingRestMeasuresNumber = - elt->getRestMeasuresNumber (); - - // get rest measures sounding notes - rational - restMeasuresMeasureSoundingNotes = - elt->getRestMeasuresMeasureSoundingNotes (); - - // generate rest measures compression if relevant - // right befoe Ri*n, because if affects only the next music element - if ( - fCurrentVoice->getVoiceContainsRestMeasures () - || - gLilypondOah->fCompressFullMeasureRests - ) { - fLilypondCodeOstream << - "\\compressFullBarRests" << // JMI - endl; - } - - // generate rest measures only now, in case there are - // clef, keys or times before them in the first measure - fLilypondCodeOstream << - "R%{7%}" << - restMeasuresWholeNoteAsLilypondString ( - inputLineNumber, - restMeasuresMeasureSoundingNotes); - - if (restMeasuresNumber > 1) { - fLilypondCodeOstream << - "*" << - restMeasuresNumber; - } - - if (gLilypondOah->fInputLineNumbers) { - // print the rest measures line number as a comment - fLilypondCodeOstream << - " %{ " << inputLineNumber << " %} "; - } - - // wait until all measures have be visited - // before the bar check is generated // JMI ??? - - // now we can generate the bar check - fLilypondCodeOstream << - " | % " << - elt->getRestMeasuresLastMeasurePuristMeasureNumber () + 1; - -/* TO BE FINALIZED JMI - if (gLilypondOah->fOriginalMeasureNumbers) { - // print the original MusicXML measure number as a comment - fLilypondCodeOstream << - " (mxml3: " << measureElement->getInputLineNumber () << ")"; - } -*/ - - fLilypondCodeOstream << - endl; - - if (gLilypondOah->fComments) { - gIndenter--; - - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% end of rest measures" << - singularOrPlural ( - restMeasuresNumber, - "measure", - "measures") << - ", line " << inputLineNumber << - endl << - endl; - } - - fOnGoingRestMeasures = false; -} - -void lpsr2LilypondTranslator::visitStart (S_msrRestMeasuresContents& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> Start visiting msrRestMeasuresContents" << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% start of rest measures contents " << - /* JMI - singularOrPlural ( - restMeasuresNumber, - "measure", - "measures") << - */ - ", line " << inputLineNumber << - endl << - endl; - - gIndenter++; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrRestMeasuresContents& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "%--> End visiting msrRestMeasuresContents" << - endl; - } -#endif - - int inputLineNumber = - elt->getInputLineNumber (); - - if (gLilypondOah->fComments) { - fLilypondCodeOstream << left << - setw (commentFieldWidth) << - "% end of rest measures contents " << - /* JMI - singularOrPlural ( - restMeasuresNumber, - "measure", - "measures") << - */ - ", line " << inputLineNumber << - endl << - endl; - - gIndenter--; - } -} - -//________________________________________________________________________ -void lpsr2LilypondTranslator::visitStart (S_msrMidiTempo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> Start visiting msrMidiTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (gLilypondOah->fNoMidi) { - fLilypondCodeOstream << - "%{" << - endl; - - gIndenter++; - } - - fLilypondCodeOstream << - "\\midi" << " {" << - endl; - - gIndenter++; - - if (gLilypondOah->fNoMidi) { - fLilypondCodeOstream << - "% "; - } - - fLilypondCodeOstream << - "\\tempo " << - elt->getMidiTempoDuration () << // BLARK - " = " << - elt->getMidiTempoPerSecond () << - endl; - - gIndenter--; - - fLilypondCodeOstream << - "}" << - endl; - - if (gLilypondOah->fNoMidi) { - gIndenter--; - - fLilypondCodeOstream << - "%}" << - endl; - } -} - -void lpsr2LilypondTranslator::visitEnd (S_msrMidiTempo& elt) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - fLilypondCodeOstream << - "% --> End visiting msrMidiTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - - -} // namespace - - - /* dotted-note: JMI - \relative { - \override Staff.TimeSignature.stencil = #(lambda (grob) - (grob-interpret-markup grob #{ - \markup\override #'(baseline-skip . 0.5) { - \column { \number 2 \tiny\note #"4." #-1 } - \vcenter "=" - \column { \number 6 \tiny\note #"8" #-1 } - \vcenter "=" - \column\number { 6 8 } - } - #})) - * - * ou plus simle - * #(define-public (format-time-sig-note grob) - (let* ((frac (ly:grob-property grob 'fraction)) - (num (if (pair? frac) (car frac) 4)) - (den (if (pair? frac) (cdr frac) 4)) - (m (markup #:override '(baseline-skip . 0.5) - #:center-column (#:number (number->string num) - #'" " - #:override '(style . default) - #:note (number->string den) DOWN)))) - (grob-interpret-markup grob m))) - - */ diff --git a/src/lilypond/lpsr2LilypondTranslator.h b/src/lilypond/lpsr2LilypondTranslator.h deleted file mode 100644 index a37d73442..000000000 --- a/src/lilypond/lpsr2LilypondTranslator.h +++ /dev/null @@ -1,1015 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsr2LilypondTranslator___ -#define ___lpsr2LilypondTranslator___ - -#include "msrOah.h" -#include "lpsrOah.h" - -#include "lpsr.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -struct lpsrRepeatDescr : public smartable -{ -/* - * positions represent the order in which the parts appear in -*/ - - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int repeatEndingsNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrRepeatDescr ( - int repeatEndingsNumber); - - virtual ~lpsrRepeatDescr (); - - public: - - // set and get - // ------------------------------------------------------ - - int getRepeatEndingsNumber () const - { return fRepeatEndingsNumber; } - - void incrementRepeatEndingsCounter () - { fRepeatEndingsCounter ++; } - - int getRepeatEndingsCounter () const - { return fRepeatEndingsCounter; } - - void setEndOfRepeatHasBeenGenerated () - { fEndOfRepeatHasBeenGenerated = true; } - - bool getEndOfRepeatHasBeenGenerated () const - { return fEndOfRepeatHasBeenGenerated; } - - // services - // ------------------------------------------------------ - - string repeatDescrAsString () const; - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fRepeatEndingsNumber; - int fRepeatEndingsCounter; - - bool fEndOfRepeatHasBeenGenerated; -}; -typedef SMARTP S_lpsrRepeatDescr; -EXP ostream& operator<< (ostream& os, const S_lpsrRepeatDescr& elt); - -//________________________________________________________________________ -class lpsr2LilypondTranslator : - - // LPSR - - public visitor, - - // variable-value associations - - public visitor, - public visitor, - public visitor, - - // MSR scaling - - public visitor, - - // header - - public visitor, - - // paper - - public visitor, - - // layout - - public visitor, - - // score blocks - - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - -// public visitor, JMI - public visitor, - public visitor, - - public visitor, - - // JMI public visitor, - - public visitor, - - public visitor, - - // MSR score - - public visitor, - - // MSR page layout - - public visitor, - - // rights - - public visitor, - public visitor, - - // parts & part groups - - public visitor, - - public visitor, - - // staff details - - public visitor, - public visitor, - - // staves and voices - - public visitor, - - public visitor, - - public visitor, - - // harmonies - - public visitor, - - // frames - - public visitor, - - // figured bass - - public visitor, - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - - // clefs - - public visitor, - - // keys - - public visitor, - - // times - - public visitor, - - // transpose - - public visitor, - - // print - - public visitor, - public visitor, - - // words - - public visitor, - - // tempo - - public visitor, - public visitor, - public visitor, - public visitor, - - // articulations - - public visitor, - - public visitor, - - public visitor, - public visitor, - - // technicals - - public visitor, - public visitor, - public visitor, - public visitor, - - // ornaments - - public visitor, - - // glissandos - - public visitor, - - // slides - - public visitor, - - // tremolos - - public visitor, - - public visitor, - - // dynamics - - public visitor, - - public visitor, - - public visitor, - - // grace notes - - public visitor, - - public visitor, - public visitor, - - // notes - - public visitor, - public visitor, - - // accordion registration - - public visitor, - - // harp pedals tuning - - public visitor, - - public visitor, - public visitor, - - // chords - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - // ? - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - // repeats - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - - // rehearsal - - public visitor, - - // midi - - public visitor - -{ - public: - - lpsr2LilypondTranslator ( - S_lpsrScore lpsrScore, - S_msrOah& msrOpts, - S_lpsrOah& lpsrOpts, - indentedOstream& logOstream, - indentedOstream& lilypondCodeOstream); - - virtual ~lpsr2LilypondTranslator (); - - void generateLilypondCodeFromLpsrScore (); - - protected: - - // LPSR - - virtual void visitStart (S_lpsrScore& elt); - virtual void visitEnd (S_lpsrScore& elt); - - virtual void visitStart (S_lpsrVarValAssoc& elt); - virtual void visitEnd (S_lpsrVarValAssoc& elt); - - virtual void visitStart (S_lpsrVarValsListAssoc& elt); - virtual void visitEnd (S_lpsrVarValsListAssoc& elt); - - virtual void visitStart (S_lpsrSchemeVariable& elt); - virtual void visitEnd (S_lpsrSchemeVariable& elt); - - virtual void visitStart (S_lpsrHeader& elt); - virtual void visitEnd (S_lpsrHeader& elt); - - virtual void visitStart (S_lpsrPaper& elt); - virtual void visitEnd (S_lpsrPaper& elt); - - virtual void visitStart (S_lpsrLayout& elt); - virtual void visitEnd (S_lpsrLayout& elt); - - virtual void visitStart (S_lpsrBookBlock& elt); - virtual void visitEnd (S_lpsrBookBlock& elt); - virtual void visitStart (S_lpsrScoreBlock& elt); - virtual void visitEnd (S_lpsrScoreBlock& elt); - virtual void visitStart (S_lpsrBookPartBlock& elt); - virtual void visitEnd (S_lpsrBookPartBlock& elt); - - virtual void visitStart (S_lpsrParallelMusicBLock& elt); - virtual void visitEnd (S_lpsrParallelMusicBLock& elt); - - virtual void visitStart (S_lpsrPartGroupBlock& elt); - virtual void visitEnd (S_lpsrPartGroupBlock& elt); - - virtual void visitStart (S_lpsrPartBlock& elt); - virtual void visitEnd (S_lpsrPartBlock& elt); - - virtual void visitStart (S_lpsrStaffBlock& elt); - virtual void visitEnd (S_lpsrStaffBlock& elt); - - virtual void visitStart (S_lpsrUseVoiceCommand& elt); - virtual void visitEnd (S_lpsrUseVoiceCommand& elt); - - virtual void visitStart (S_lpsrNewLyricsBlock& elt); - virtual void visitEnd (S_lpsrNewLyricsBlock& elt); - - virtual void visitStart (S_lpsrVariableUseCommand& elt); - virtual void visitEnd (S_lpsrVariableUseCommand& elt); - - // virtual void visitStart (S_lpsrContext& elt); JMI -// virtual void visitEnd (S_lpsrContext& elt); - virtual void visitStart (S_lpsrChordNamesContext& elt); - virtual void visitEnd (S_lpsrChordNamesContext& elt); - virtual void visitStart (S_lpsrFiguredBassContext& elt); - virtual void visitEnd (S_lpsrFiguredBassContext& elt); - - virtual void visitStart (S_lpsrBarCommand& elt); - virtual void visitEnd (S_lpsrBarCommand& elt); - -// JMI virtual void visitStart (S_lpsrMelismaCommand& elt); - // virtual void visitEnd (S_lpsrMelismaCommand& elt); - - virtual void visitStart (S_lpsrComment& elt); - virtual void visitEnd (S_lpsrComment& elt); - - virtual void visitStart (S_lpsrSchemeFunction& elt); - virtual void visitEnd (S_lpsrSchemeFunction& elt); - - // MSR score - - virtual void visitStart (S_msrScore& elt); - virtual void visitEnd (S_msrScore& elt); - - // MSR scaling - - virtual void visitStart (S_msrScaling& elt); - virtual void visitEnd (S_msrScaling& elt); - - // MSR page layout - - virtual void visitStart (S_msrPageLayout& elt); - virtual void visitEnd (S_msrPageLayout& elt); - - virtual void visitStart (S_msrCredit& elt); - virtual void visitEnd (S_msrCredit& elt); - virtual void visitStart (S_msrCreditWords& elt); - virtual void visitEnd (S_msrCreditWords& elt); - - virtual void visitStart (S_msrPartGroup& elt); - virtual void visitEnd (S_msrPartGroup& elt); - - virtual void visitStart (S_msrPart& elt); - virtual void visitEnd (S_msrPart& elt); - - virtual void visitStart (S_msrStaffTuning& elt); - virtual void visitStart (S_msrStaffDetails& elt); - - virtual void visitStart (S_msrStaff& elt); - virtual void visitEnd (S_msrStaff& elt); - - virtual void visitStart (S_msrVoice& elt); - virtual void visitEnd (S_msrVoice& elt); - - virtual void visitStart (S_msrVoiceStaffChange& elt); - - virtual void visitStart (S_msrHarmony& elt); - - virtual void visitStart (S_msrFrame& elt); - - virtual void visitStart (S_msrFiguredBass& elt); - virtual void visitEnd (S_msrFiguredBass& elt); - virtual void visitStart (S_msrFigure& elt); - - virtual void visitStart (S_msrSegment& elt); - virtual void visitEnd (S_msrSegment& elt); - - virtual void visitStart (S_msrMeasure& elt); - virtual void visitEnd (S_msrMeasure& elt); - - virtual void visitStart (S_msrStanza& elt); - virtual void visitEnd (S_msrStanza& elt); - - virtual void visitStart (S_msrSyllable& elt); - virtual void visitEnd (S_msrSyllable& elt); - - virtual void visitStart (S_msrClef& elt); - virtual void visitEnd (S_msrClef& elt); - - virtual void visitStart (S_msrKey& elt); - virtual void visitEnd (S_msrKey& elt); - - virtual void visitStart (S_msrTime& elt); - virtual void visitEnd (S_msrTime& elt); - - virtual void visitStart (S_msrTranspose& elt); - virtual void visitEnd (S_msrTranspose& elt); - - virtual void visitStart (S_msrPartNameDisplay& elt); - virtual void visitStart (S_msrPartAbbreviationDisplay& elt); - - virtual void visitStart (S_msrWords& elt); - virtual void visitEnd (S_msrWords& elt); - - virtual void visitStart (S_msrTempo& elt); - virtual void visitEnd (S_msrTempo& elt); - virtual void visitStart (S_msrTempoRelationshipElements& elt); - virtual void visitEnd (S_msrTempoRelationshipElements& elt); - virtual void visitStart (S_msrTempoNote& elt); - virtual void visitStart (S_msrTempoTuplet& elt); - virtual void visitEnd (S_msrTempoTuplet& elt); - - virtual void visitStart (S_msrArticulation& elt); - virtual void visitEnd (S_msrArticulation& elt); - - virtual void visitStart (S_msrFermata& elt); - virtual void visitEnd (S_msrFermata& elt); - - virtual void visitStart (S_msrArpeggiato& elt); - virtual void visitEnd (S_msrArpeggiato& elt); - virtual void visitStart (S_msrNonArpeggiato& elt); - virtual void visitEnd (S_msrNonArpeggiato& elt); - - virtual void visitStart (S_msrTechnical& elt); - virtual void visitEnd (S_msrTechnical& elt); - - virtual void visitStart (S_msrTechnicalWithInteger& elt); - virtual void visitEnd (S_msrTechnicalWithInteger& elt); - - virtual void visitStart (S_msrTechnicalWithFloat& elt); - virtual void visitEnd (S_msrTechnicalWithFloat& elt); - - virtual void visitStart (S_msrTechnicalWithString& elt); - virtual void visitEnd (S_msrTechnicalWithString& elt); - - virtual void visitStart (S_msrOrnament& elt); - virtual void visitEnd (S_msrOrnament& elt); - - virtual void visitStart (S_msrGlissando& elt); - virtual void visitEnd (S_msrGlissando& elt); - - virtual void visitStart (S_msrSlide& elt); - virtual void visitEnd (S_msrSlide& elt); - - virtual void visitStart (S_msrSingleTremolo& elt); - virtual void visitEnd (S_msrSingleTremolo& elt); - - virtual void visitStart (S_msrDoubleTremolo& elt); - virtual void visitEnd (S_msrDoubleTremolo& elt); - - virtual void visitStart (S_msrDynamics& elt); - virtual void visitEnd (S_msrDynamics& elt); - - virtual void visitStart (S_msrOtherDynamics& elt); - virtual void visitEnd (S_msrOtherDynamics& elt); - - virtual void visitStart (S_msrWedge& elt); - virtual void visitEnd (S_msrWedge& elt); - - virtual void visitStart (S_msrGraceNotesGroup& elt); - virtual void visitEnd (S_msrGraceNotesGroup& elt); - - virtual void visitStart (S_msrAfterGraceNotesGroup& elt); - virtual void visitEnd (S_msrAfterGraceNotesGroup& elt); - virtual void visitStart (S_msrAfterGraceNotesGroupContents& elt); - virtual void visitEnd (S_msrAfterGraceNotesGroupContents& elt); - - virtual void visitStart (S_msrNote& elt); - virtual void visitEnd (S_msrNote& elt); - - virtual void visitStart (S_msrOctaveShift& elt); - virtual void visitEnd (S_msrOctaveShift& elt); - - virtual void visitStart (S_msrAccordionRegistration& elt); - - virtual void visitStart (S_msrHarpPedalsTuning& elt); - - virtual void visitStart (S_msrStem& elt); - virtual void visitEnd (S_msrStem& elt); - - virtual void visitStart (S_msrBeam& elt); - virtual void visitEnd (S_msrBeam& elt); - - virtual void visitStart (S_msrChord& elt); - virtual void visitEnd (S_msrChord& elt); - - virtual void visitStart (S_msrTuplet& elt); - virtual void visitEnd (S_msrTuplet& elt); - - virtual void visitStart (S_msrTie& elt); - virtual void visitEnd (S_msrTie& elt); - - virtual void visitStart (S_msrSlur& elt); - virtual void visitEnd (S_msrSlur& elt); - - virtual void visitStart (S_msrLigature& elt); - virtual void visitEnd (S_msrLigature& elt); - - virtual void visitStart (S_msrBarline& elt); - virtual void visitEnd (S_msrBarline& elt); - - virtual void visitStart (S_msrSegno& elt); - virtual void visitStart (S_msrCoda& elt); - - virtual void visitStart (S_msrEyeGlasses& elt); - virtual void visitStart (S_msrPedal& elt); - virtual void visitStart (S_msrDamp& elt); - virtual void visitStart (S_msrDampAll& elt); - virtual void visitStart (S_msrScordatura& elt); - - virtual void visitStart (S_msrBarCheck& elt); - virtual void visitEnd (S_msrBarCheck& elt); - - virtual void visitStart (S_msrBarNumberCheck& elt); - virtual void visitEnd (S_msrBarNumberCheck& elt); - - virtual void visitStart (S_msrLineBreak& elt); - virtual void visitEnd (S_msrLineBreak& elt); - - virtual void visitStart (S_msrPageBreak& elt); - virtual void visitEnd (S_msrPageBreak& elt); - - virtual void visitStart (S_msrRepeat& elt); - virtual void visitEnd (S_msrRepeat& elt); - virtual void visitStart (S_msrRepeatCommonPart& elt); - virtual void visitEnd (S_msrRepeatCommonPart& elt); - virtual void visitStart (S_msrRepeatEnding& elt); - virtual void visitEnd (S_msrRepeatEnding& elt); - - virtual void visitStart (S_msrMeasuresRepeat& elt); - virtual void visitEnd (S_msrMeasuresRepeat& elt); - virtual void visitStart (S_msrMeasuresRepeatPattern& elt); - virtual void visitEnd (S_msrMeasuresRepeatPattern& elt); - virtual void visitStart (S_msrMeasuresRepeatReplicas& elt); - virtual void visitEnd (S_msrMeasuresRepeatReplicas& elt); - - virtual void visitStart (S_msrRestMeasures& elt); - virtual void visitEnd (S_msrRestMeasures& elt); - virtual void visitStart (S_msrRestMeasuresContents& elt); - virtual void visitEnd (S_msrRestMeasuresContents& elt); - - virtual void visitStart (S_msrRehearsal& elt); - virtual void visitEnd (S_msrRehearsal& elt); - - virtual void visitStart (S_msrMidiTempo& elt); - virtual void visitEnd (S_msrMidiTempo& elt); - - // names - - string nameAsLilypondString ( - string name); - - // variable-value associations - - string lpsrVarValAssocKindAsLilypondString ( - lpsrVarValAssoc::lpsrVarValAssocKind - lilyPondVarValAssocKind); - - string lpsrVarValsListAssocKindAsLilypondString ( - lpsrVarValsListAssoc::lpsrVarValsListAssocKind - lilyPondVarValsListAssocKind); - - void generateLpsrVarValsListAssocValues ( - S_lpsrVarValsListAssoc varValsListAssoc); - - string lpsrVarValAssocAsLilypondString ( - S_lpsrVarValAssoc lpsrVarValAssoc, - int fieldNameWidth); - - // lengths - string lengthUnitAsLilypondString ( - msrLengthUnitKind lengthUnitKind); - - // whole notes - // JMI - - // comments - void generateInputLineNumberAndOrPositionInMeasureAsAComment ( - S_msrMeasureElement measureElement); - - // markups - enum markupColumnKind { - markupColumnKindLeftAligned, - markupColumnKindLeftACentered }; - - string generateAColumnForMarkup ( - string theString, - markupColumnKind columnKind); - string generateMultilineMarkup ( - string theString, - markupColumnKind columnKind); - - // octaves - - string absoluteOctaveAsLilypondString ( - int absoluteOctave); - - // alterations - - string alterationKindAsLilypondString ( - msrAlterationKind alterationKind); - - // durations - - rational fLastMetWholeNotes; - - string durationAsLilypondString ( - int inputLineNumber, - rational wholeNotes); - - /* JMI - string durationAsExplicitLilypondString ( // JMI - int inputLineNumber, - rational wholeNotes); -*/ - - // notes - - msrPrintObjectKind fCurrentNotePrinObjectKind; - - string lilypondOctaveInRelativeEntryMode ( - S_msrNote note); - - string lilypondOctaveInFixedEntryMode ( - S_msrNote note); - - string notePitchAsLilypondString (S_msrNote note); - - string pitchedRestAsLilypondString (S_msrNote note); - - void generateNoteBeams (S_msrNote note); - void generateNoteSlurs (S_msrNote note); - - void generateNoteHeadColor (S_msrNote note); - void generateNoteLigatures (S_msrNote note); - void generateNoteStem (S_msrNote note); - void generateNoteHead (S_msrNote note); - - void generateCodeBeforeNote (S_msrNote note); - void generateCodeForNote (S_msrNote note); - void generateCodeAfterNote (S_msrNote note); - - // articulations - - msrDirectionKind fCurrentArpeggioDirectionKind; - - void generateNoteArticulation ( - S_msrArticulation articulation); - - void generateChordArticulation ( - S_msrArticulation articulation); - - // technicals - - string technicalAsLilypondString ( - S_msrTechnical technical); - - string technicalWithIntegerAsLilypondString ( - S_msrTechnicalWithInteger technicalWithInteger); - - string technicalWithFloatAsLilypondString ( - S_msrTechnicalWithFloat technicalWithFloat); - - string technicalWithStringAsLilypondString ( - S_msrTechnicalWithString technicalWithString); - - // ornaments - - void generateOrnament ( - S_msrOrnament ornament); - - // trills - - bool fOnGoingTrillSpanner; // JMI - - // spanners - - msrPlacementKind fCurrentSpannerPlacementKind; - - void generateCodeForSpannerBeforeNote ( - S_msrSpanner spanner); - - void generateCodeForSpannerAfterNote ( - S_msrSpanner spanner); - - // grace notes - - bool fOnGoingGraceNotesGroup; - - void generateGraceNotesGroup ( - S_msrGraceNotesGroup graceNotesGroup); - - // tremolos - - string singleTremoloDurationAsLilypondString ( - S_msrSingleTremolo singleTremolo); - - // dynamics - - string dynamicsAsLilypondString ( - S_msrDynamics dynamics); - - // string tuning - string stringTuningAsLilypondString ( - int inputLineNumber, - S_msrStringTuning stringTuning); - - // harp pedals tuning - - string harpPedalTuningAsLilypondString ( - msrAlterationKind alterationKind); - - // transpose - - void transposeDiatonicError ( - int inputLineNumber, - int transposeDiatonic, - int transposeChromatic); - - // harmonies - - bool fPowerChordHaveAlreadyBeenGenerated; - // to generate it only once - - string harmonyAsLilypondString ( - S_msrHarmony harmony); - - string harmonyDegreeAlterationKindAsLilypondString ( - msrAlterationKind harmonyDegreeAlterationKind); - - // frames - - string frameAsLilypondString ( - S_msrFrame frame); - - // figured bass - - string figureAsLilypondString ( - S_msrFigure figure); - string figuredBassAsLilypondString ( - S_msrFiguredBass figuredBass); - - S_msrFiguredBass fCurrentFiguredBass; - unsigned int fCurrentFiguredBassFiguresCounter; - - private: - - S_msrOah fMsrOah; - S_lpsrOah fLpsrOah; - - indentedOstream& fLogOutputStream; - indentedOstream& fLilypondCodeOstream; - - // the LPSR score we're visiting - // ------------------------------------------------------ - S_lpsrScore fVisitedLpsrScore; - - // header handling - // ------------------------------------------------------ - bool fOnGoingHeader; - - // score - // ------------------------------------------------------ - S_msrScore fCurrentMsrScoreClone; - - // part groups - // ------------------------------------------------------ - // JMI S_msrPartGroup fCurrentMsrPartGroupClone; - - // parts - // ------------------------------------------------------ - S_msrPart fCurrentPart; // JMI jamais visitee - - // clefs - // ------------------------------------------------------ - S_msrClef fCurrentVoiceClef; - - // time - // ------------------------------------------------------ - bool fVoiceIsCurrentlySenzaMisura; // JMI - bool fOnGoingVoiceCadenza; - - // staves - // ------------------------------------------------------ - // prevent clef, key and time from being handled twice - bool fOnGoingStaff; - - // voices - // ------------------------------------------------------ - bool fOnGoingVoice; - S_msrVoice fCurrentVoice; - - bool fOnGoingHarmonyVoice; - bool fOnGoingFiguredBassVoice; - - // octaves entry - // ------------------------------------------------------ - /* this reference is: - mobile in relative mode - unused in absolute mode - fixed in fixed mode - */ - S_msrNote fCurrentOctaveEntryReference; - void setCurrentOctaveEntryReferenceFromTheLilypondOah (); - - // repeats - // ------------------------------------------------------ - list - fRepeatDescrsStack; - - // rest measures - // ------------------------------------------------------ - int fRemainingRestMeasuresNumber; - bool fOnGoingRestMeasures; - - // segments - // ------------------------------------------------------ - - // measures - // ------------------------------------------------------ - // we need to count the measures - // for option fSeparatorLineEveryNMeasures and bar number checks, - // since measure numbers can actually be any strings - int fCurrentVoiceMeasuresCounter; - - // notes - // ------------------------------------------------------ - bool fOnGoingNote; - - // stems - msrStem::msrStemKind fCurrentStemKind; - - // double tremolos - // ------------------------------------------------------ - - // octave shifts - // ------------------------------------------------------ - void generateCodeForOctaveShift ( - S_msrOctaveShift octaveShift); - - // chords - // ------------------------------------------------------ - list fPendingChordMemberNotesStringNumbers; - bool fOnGoingChord; - - void generateCodeBeforeChordContents (S_msrChord chord); - void generateCodeForChordContents (S_msrChord chord); - void generateCodeAfterChordContents (S_msrChord chord); - - void generateChordInGraceNotesGroup (S_msrChord chord); - - - // tuplets - // ------------------------------------------------------ -// JMI S_msrTuplet fCurrentMsrTupletClone; - stack fTupletsStack; - - // stanzas - // ------------------------------------------------------ - S_msrStanza fCurrentStanzaClone; - bool fGenerateCodeForOngoingNonEmptyStanza; - - - // syllables - // ------------------------------------------------------ - S_msrSyllable fCurrentMsrSyllableClone; - - - // score blocks - // ------------------------------------------------------ - bool fOnGoingScoreBlock; // JMI - - - // parallel music - // ------------------------------------------------------ - S_lpsrParallelMusicBLock - fCurrentParallelMusicBLock; - - - // part group blocks - // ------------------------------------------------------ - int fNumberOfPartGroupBlocks; - int fPartGroupBlocksCounter; - - - // part blocks - // ------------------------------------------------------ - int fNumberOfPartGroupBlockElements; - int fPartGroupBlockElementsCounter; - - - // staff blocks - // ------------------------------------------------------ - int fNumberOfStaffBlocksElements; - int fStaffBlocksCounter; - - - // current ongoing values display - // ------------------------------------------------------ - void displayCurrentOnGoingValues (); -}; - - -} - - -#endif diff --git a/src/lilypond/lpsrBarNumbers.cpp b/src/lilypond/lpsrBarNumbers.cpp deleted file mode 100644 index 195c37a89..000000000 --- a/src/lilypond/lpsrBarNumbers.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrBarNumbers.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrBarNumberCheck lpsrBarNumberCheck::create ( - int inputLineNumber, - int nextBarNumber) -{ - lpsrBarNumberCheck* o = - new lpsrBarNumberCheck ( - inputLineNumber, nextBarNumber); - assert(o!=0); - return o; -} - -lpsrBarNumberCheck::lpsrBarNumberCheck ( - int inputLineNumber, - int nextBarNumber) - : lpsrElement (inputLineNumber) -{ - fNextBarNumber=nextBarNumber; -} - -lpsrBarNumberCheck::~lpsrBarNumberCheck () -{} - -void lpsrBarNumberCheck::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBarNumberCheck::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBarNumberCheck elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBarNumberCheck::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrBarNumberCheck::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBarNumberCheck::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBarNumberCheck elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBarNumberCheck::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrBarNumberCheck::browseData (basevisitor* v) -{} - -void lpsrBarNumberCheck::print (ostream& os) const -{ - os << - "BarNumberCheck" << " " << fNextBarNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrBarNumberCheck& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrBarCommand lpsrBarCommand::create ( - int inputLineNumber) -{ - lpsrBarCommand* o = - new lpsrBarCommand ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrBarCommand::lpsrBarCommand ( - int inputLineNumber) - : lpsrElement (inputLineNumber) -{} - -lpsrBarCommand::~lpsrBarCommand () -{} - -void lpsrBarCommand::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBarCommand::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBarCommand elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBarCommand::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrBarCommand::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBarCommand::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBarCommand elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBarCommand::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrBarCommand::browseData (basevisitor* v) -{} - -void lpsrBarCommand::print (ostream& os) const -{ - os << - "BarCommand" << " " << "\"|.\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrBarCommand& nstf) -{ - nstf->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrBarNumbers.h b/src/lilypond/lpsrBarNumbers.h deleted file mode 100644 index 5f5c9ead8..000000000 --- a/src/lilypond/lpsrBarNumbers.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrBarNumbers___ -#define ___lpsrBarNumbers___ - -#include - -#include "lpsrElements.h" - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrBarNumberCheck : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int nextBarNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrBarNumberCheck( - int inputLineNumber, - int nextBarNumber); - - virtual ~lpsrBarNumberCheck (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fNextBarNumber; -}; -typedef SMARTP S_lpsrBarNumberCheck; - -//______________________________________________________________________________ -class lpsrBarCommand : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrBarCommand ( - int inputLineNumber); - - virtual ~lpsrBarCommand (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_lpsrBarCommand; -EXP ostream& operator<< (ostream& os, const S_lpsrBarCommand& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrBasicTypes.cpp b/src/lilypond/lpsrBasicTypes.cpp deleted file mode 100644 index 717f620fb..000000000 --- a/src/lilypond/lpsrBasicTypes.cpp +++ /dev/null @@ -1,1416 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include // INT_MIN, INT_MAX - -#include "utilities.h" - -#include "msrBasicTypes.h" -#include "lpsrBasicTypes.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" -#include "lpsrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -int lpsrDurationBinaryLogarithm (int duration) -{ - int result = INT_MIN; - -/* -with LilyPond's limitation to 128th of a whole note, -valid denominators binary logarithms, i.e. their exponent, are: -*/ - - switch (duration) { - case 1: - result = 0; - break; - case 2: - result = 1; - break; - case 4: - result = 2; - break; - case 8: - result = 3; - break; - case 16: - result = 4; - break; - case 32: - result = 5; - break; - case 64: - result = 6; - break; - case 128: - result = 7; - break; - case 256: // JMI - result = 8; - break; - - default: - ; - } // switch - - return result; -} - -//_______________________________________________________________________________ -int lpsrNumberOfDots (int n) -{ - int result = INT_MIN; - - switch (n) { - case 1: - result = 0; - break; - case 3: - result = 1; - break; - case 7: - result = 2; - break; - case 15: - result = 3; - break; - case 31: - result = 4; - break; - case 63: - result = 5; - break; - case 127: - result = 6; - break; - - default: - ; - } // switch - - return result; -} - -//_______________________________________________________________________________ -string wholeNotesAsLilypondString ( - int inputLineNumber, - rational wholeNotes, - int& dotsNumber) -{ - // this algorithm is inspired by musicxml2ly - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes) { - gLogOstream << - "--> wholeNotesAsLilypondString() 1 -------------------------------------" << - ", wholeNotes: " << wholeNotes << - ", line " << inputLineNumber << - endl; - } -#endif - - int - numerator = wholeNotes.getNumerator (), - denominator = wholeNotes.getDenominator (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes) { - gLogOstream << - "--> numerator: " << numerator << - endl << - "--> denominator: " << denominator << - endl << - endl; - } -#endif - -/* JMI - if (false && numerator <= 0) { // JMI - stringstream s; - - s << - "%{ZERO_LENGTH: " << - wholeNotes << // JMI - ", line " << - inputLineNumber << - " %}"; - - return s.str (); - } -*/ - - // sanity check - if (numerator <= 0) { - stringstream s; - - s << - "numerator is not positive in wholeNotesAsLilypondString()" << - ", wholeNotes = " << wholeNotes; - - // msrMusicXMLError ( JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); -abort (); // JMI - return "???"; - } - - wholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> wholeNotes rationalised: " << wholeNotes << - endl; - } -#endif - - bool - rationalHasBeenSimplified = - wholeNotes.getNumerator () != numerator; // denominators could be used too - - if (rationalHasBeenSimplified) { - numerator = wholeNotes.getNumerator (), - denominator = wholeNotes.getDenominator (); - } - - bool - integralNumberOfWholeNotes = denominator == 1; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> rationalHasBeenSimplified: " << - booleanAsString ( - rationalHasBeenSimplified) << - endl << - "--> integralNumberOfWholeNotes: " << - booleanAsString ( - integralNumberOfWholeNotes) << - endl << - endl; - } -#endif - - /* - augmentation dots add half the preceding increment to the duration: - they constitue a series of frations or the form '(2^n-1) / 2^n', - starting with 3/2, 7/4, 15/8, - that tends towards 2 while always remaining less than two. - - with MusicXML's limitation to 1024th of a whole note, - with LilyPond's limitation to 128th of a whole note, - valid numerators are: - */ - - int numeratorDots = lpsrNumberOfDots (numerator); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numeratorDots " << " : " << numeratorDots << - endl << - endl; - } -#endif - -/* - default: - if (! integralNumberOfWholeNotes) { - // multiplyingFactorIsToBeUsed = true; - } - else { - // there can be integral numbers of whole notes up to 15, - // corresponding to a \maxima... - stringstream s; - - s << - "numerator " << numerator << - " is not one of 1, 3, 7, 15, 31, 63 or 127" << - // " is not one of 1, 3, 7, 15, 31, 63, 127, 255, 511 or 1023" << - ", whole notes duration " << - numerator << "/" << denominator; - - if (rationalHasBeenSimplified) { - s << - " (" << numerator << "/" << denominator << ")" << - endl; - } - - s << - " it will be represented using a multiplying factor"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - // multiplyingFactorIsToBeUsed = true; - } - } // switch - */ - - /* - valid denominators are powers of 2 - - the rational representing a dotted duration has to be brought - to a value less than two, as explained above - - this is done by changing it denominator in the resulting string: - - whole notes string - 3/1 \breve. - 3/2 1. - 3/4 2. - 3/8 4. - - 7/1 \longa.. - 7/2 \breve.. - 7/4 1.. - 7/8 2.. - - since such resulting denominators can be fractions of wholes notes - as well as multiple thereof, - we'll be better of using binary logarithms for the computations - */ - - int denominatorDurationLog = - lpsrDurationBinaryLogarithm (denominator); - - if (denominatorDurationLog == INT_MIN) { - string result; - - { - stringstream s; - - s << - 1 << - "*" << - numerator << - "/" << - denominator; - - result = s.str (); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - stringstream s; - - s << - "denominator " << denominator << - " is no power of two between 1 and 128" << - // " is no power of 2 between 1 and 1024" << - ", whole notes duration " << - numerator << "/" << denominator; - - if (rationalHasBeenSimplified) { - s << - " (" << numerator << "/" << denominator << ")" << - endl; - } - - s << - " cannot be represented as a dotted power of 2" << - ", " << - result << - " will be used"; - - // msrMusicXMLError ( JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } -#endif - - return result; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - endl; - } -#endif - - // bring the resulting fraction to be less that two if needed - if (integralNumberOfWholeNotes) { - // adapt the duration to avoid even numerators if can be, - // since dotted durations cannot be recognized otherwise - // 6/1 thus becomes 3\breve, hence \longa. -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> integralNumberOfWholeNotes," - " bringing the faction to be less that 2" << - endl; - } -#endif - - while (numerator % 2 == 0) { - numerator /= 2; - denominatorDurationLog -= 1; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numerator" << " : " << - numerator << - endl << - "--> denominatorDurationLog " << " : " << - denominatorDurationLog << - endl << - endl; - } -#endif - } // while - - // update the number of dots - numeratorDots = lpsrNumberOfDots (numerator); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numerator" << " : " << - numerator << - endl << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> numeratorDots " << " : " << - numeratorDots << - endl << - endl; - } -#endif - - // take care of the dots - int multiplyingFactor = 1; - - if (numeratorDots >= 0 && denominatorDurationLog >= numeratorDots) { - // take the dots into account - denominatorDurationLog -= numeratorDots; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - } - else { - // set the multiplying factor -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> setting the multiplying factor" << - endl; - } -#endif - - // 5/8 becomes 8*5 - - multiplyingFactor = numerator; - numerator = 1; - - /* JMI - multiplyingFactor = numerator; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - - while (multiplyingFactor >= 2) { - // double duration - denominatorDurationLog--; - - // adapt multiplying factor - multiplyingFactor /= 2; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - } // while - */ - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numerator " << " : " << - numerator << - endl << - "--> numeratorDots " << " : " << - numeratorDots << - endl << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - - // generate the code for the duration - stringstream s; - - switch (denominatorDurationLog) { - case -3: - s << "\\maxima"; - break; - case -2: - s << "\\longa"; - break; - case -1: - s << "\\breve"; - break; - - default: - s << (1 << denominatorDurationLog); - } // switch - - // append the dots if any - if (numeratorDots > 0) { - for (int i = 0; i < numeratorDots; i++) { - s << "."; - } // for - } - - if (multiplyingFactor != 1) { - // append the multiplying factor - s << - "*" << multiplyingFactor; - - /* JMI - if (integralNumberOfWholeNotes) { - s << - "*" << multiplyingFactor; - } - else { - s << - "*" << multiplyingFactor << "/" << 1; // ??? denominator; - } - */ - } - - string result = s.str (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes) { - gLogOstream << - "--> wholeNotesAsLilypondString() 2 -------------------------------------" << - ", result: \"" << result << "\"" << - ", numeratorDots" << " : " << numeratorDots << - endl; - } -#endif - - // return the result - dotsNumber = numeratorDots; - - return result; -} - -string wholeNotesAsLilypondString ( - int inputLineNumber, - rational wholeNotes) -{ - int dotsNumber; // not used - - return - wholeNotesAsLilypondString ( - inputLineNumber, - wholeNotes, - dotsNumber); -} - -//_______________________________________________________________________________ -string dottedDurationAsLilypondString ( - int inputLineNumber, - msrDottedDuration dottedDuration) -{ - return - wholeNotesAsLilypondString ( - inputLineNumber, - dottedDuration.dottedDurationAsWholeNotes ( - inputLineNumber)); -} - -string dottedDurationAsLilypondStringWithoutBackSlash ( - int inputLineNumber, - msrDottedDuration dottedDuration) -{ - string result = - wholeNotesAsLilypondString ( - inputLineNumber, - dottedDuration.dottedDurationAsWholeNotes ( - inputLineNumber)); - - if (result [0] == '\\') { - result = result.substr (1); - } - - return result; -} - -//_______________________________________________________________________________ -string restMeasuresWholeNoteAsLilypondString ( - int inputLineNumber, - rational wholeNotes) -{ - stringstream s; - - rational - denominatorAsFraction = - rational ( - 1, - wholeNotes.getDenominator ()); - - int numberOfWholeNotes = - wholeNotes.getNumerator (); - - s << - wholeNotesAsLilypondString ( - inputLineNumber, - denominatorAsFraction); - - if (numberOfWholeNotes != 1) { - s << - "*" << numberOfWholeNotes; - } - - return s.str (); -} - -//_______________________________________________________________________________ -void writeTextsListAsLilypondString ( - const list& textsList, - ostream& os) -{ - string contents; - - if (textsList.size ()) { - list::const_iterator - iBegin = textsList.begin (), - iEnd = textsList.end (), - i = iBegin; - - for ( ; ; ) { - contents += (*i); - if (++i == iEnd) break; - // JMI os << ", "; - } // for - } - - size_t found = contents.find("\""); - if (found != std::string::npos) { - os << doubleQuoteString (contents); - } - else { - os << doubleQuoteStringIfNonAlpha (contents); // JMI - } -} - -// score output kinds -//______________________________________________________________________________ - -map - gLpsrScoreOutputKindsMap; - -string lpsrScoreOutputKindAsString ( - lpsrScoreOutputKind scoreOutputKind) -{ - string result; - - // no CamelCase here, these strings are used in the command line options - - switch (scoreOutputKind) { - case kScoreOnly: // default value - result = "score-only"; - break; - case kScoreAndParts: - result = "score-and-parts"; - break; - case kPartsAndScore: - result = "parts-and-score"; - break; - case kPartsOnly: - result = "parts-only"; - break; - case kScoreAndPartsOneFile: - result = "score-and-parts-one-file"; - break; - case kPartsAndScoreOneFile: - result = "parts-and-score-one-file"; - break; - case kPartsOnlyOneFile: - result = "parts-only-one-file"; - break; - } // switch - - return result; -} - -void initializeLpsrScoreOutputKindsMap () -{ - // register the LilyPond score output kinds - // -------------------------------------- - - // no CamelCase here, these strings are used in the command line options - - gLpsrScoreOutputKindsMap ["score-only"] = kScoreOnly; - gLpsrScoreOutputKindsMap ["score-and-parts"] = kScoreAndParts; - gLpsrScoreOutputKindsMap ["parts-and-score"] = kPartsAndScore; - gLpsrScoreOutputKindsMap ["parts-only"] = kPartsOnly; - gLpsrScoreOutputKindsMap ["score-and-parts-one-file"] = kScoreAndPartsOneFile; - gLpsrScoreOutputKindsMap ["parts-and-score-one-file"] = kPartsAndScoreOneFile; - gLpsrScoreOutputKindsMap ["parts-only-one-file"] = kPartsOnlyOneFile; -} - -string existingLpsrScoreOutputKinds (int namesListMaxLength) -{ - stringstream s; - - if (gLpsrScoreOutputKindsMap.size ()) { - map::const_iterator - iBegin = gLpsrScoreOutputKindsMap.begin (), - iEnd = gLpsrScoreOutputKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - - /* JMI BUG IN MAP ITERATORS...??? -{ - list lpsrScoreOutputKindsList; - for ( - map::const_iterator i = gLpsrScoreOutputKindsMap.begin (); - i != gLpsrScoreOutputKindsMap.end (); - ++i - ) { - lpsrScoreOutputKindsList.push_back ((*i).first); - } // for - - list::const_iterator - iBegin = lpsrScoreOutputKindsList.begin (), - iEnd = lpsrScoreOutputKindsList.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i); - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for -} -*/ - } - - return s.str (); -} - -// octave entry kinds -//______________________________________________________________________________ - -map - gLpsrOctaveEntryKindsMap; - -string lpsrOctaveEntryKindAsString ( - lpsrOctaveEntryKind octaveEntryKind) -{ - string result; - - // no CamelCase here, these strings are used in the command line options - - switch (octaveEntryKind) { - case kOctaveEntryRelative: // default value - result = "relative"; - break; - case kOctaveEntryAbsolute: - result = "absolute"; - break; - case kOctaveEntryFixed: - result = "fixed"; - break; - } // switch - - return result; -} - -void initializeLpsrOctaveEntryKindsMap () -{ - // register the LilyPond score output kinds - // -------------------------------------- - - // no CamelCase here, these strings are used in the command line options - - gLpsrOctaveEntryKindsMap ["relative"] = kOctaveEntryRelative; - gLpsrOctaveEntryKindsMap ["absolute"] = kOctaveEntryAbsolute; - gLpsrOctaveEntryKindsMap ["fixed"] = kOctaveEntryFixed; -} - -string existingLpsrOctaveEntryKinds (int namesListMaxLength) -{ - stringstream s; - - if (gLpsrOctaveEntryKindsMap.size ()) { - map::const_iterator - iBegin = gLpsrOctaveEntryKindsMap.begin (), - iEnd = gLpsrOctaveEntryKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -// accidental styles -//______________________________________________________________________________ - -map - gLpsrAccidentalStyleKindsMap; - -string lpsrAccidentalStyleKindAsString ( - lpsrAccidentalStyleKind accidentalStyleKind) -{ - string result; - - switch (accidentalStyleKind) { - case kDefault: // default value - result = "default"; - break; - case kVoice: - result = "voice"; - break; - case kModern: - result = "modern"; - break; - case kModernCautionary: - result = "modernCautionary"; - break; - case kModernVoice: - result = "modernVoice"; - break; - case kModernVoiceCautionary: - result = "modernVoiceCautionary"; - break; - case kPiano: - result = "piano"; - break; - case kPianoCautionary: - result = "pianoCautionary"; - break; - case kNeoModern: - result = "neoModern"; - break; - case kNeoModernCautionary: - result = "neoModernCautionary"; - break; - case kNeoModernVoice: - result = "neoModernVoice"; - break; - case kNeoModernVoiceCautionary: - result = "neoModernVoiceCautionary"; - break; - case kDodecaphonic: - result = "dodecaphonic"; - break; - case kDodecaphonicNoRepeat: - result = "dodecaphonicNoRepeat"; - break; - case kDodecaphonicFirst: - result = "dodecaphonicFirst"; - break; - case kTeaching: - result = "teaching"; - break; - case kNoReset: - result = "noReset"; - break; - case kForget: - result = "Forget"; - break; - } // switch - - return result; -} - -string lpsrAccidentalStyleKindAsLilypondString ( - lpsrAccidentalStyleKind accidentalStyleKind) -{ - string result; - - switch (accidentalStyleKind) { - case kDefault: // default value - result = "default"; - break; - case kVoice: - result = "voice"; - break; - case kModern: - result = "modern"; - break; - case kModernCautionary: - result = "modern-cautionary"; - break; - case kModernVoice: - result = "modern-voice"; - break; - case kModernVoiceCautionary: - result = "modern-voice-cautionary"; - break; - case kPiano: - result = "piano"; - break; - case kPianoCautionary: - result = "piano-cautionary"; - break; - case kNeoModern: - result = "neo-modern"; - break; - case kNeoModernCautionary: - result = "neo-modern-cautionary"; - break; - case kNeoModernVoice: - result = "neo-modern-voice"; - break; - case kNeoModernVoiceCautionary: - result = "neo-modern--voice-cautionary"; - break; - case kDodecaphonic: - result = "dodecaphonic"; - break; - case kDodecaphonicNoRepeat: - result = "dodecaphonic-no-repeat"; - break; - case kDodecaphonicFirst: - result = "dodecaphonic-first"; - break; - case kTeaching: - result = "teaching"; - break; - case kNoReset: - result = "no-reset"; - break; - case kForget: - result = "forget"; - break; - } // switch - - return result; -} - -void initializeLpsrAccidentalStyleKindsMap () -{ - // register the LilyPond accidental styles - // -------------------------------------- - - gLpsrAccidentalStyleKindsMap ["default"] = kDefault; - gLpsrAccidentalStyleKindsMap ["voice"] = kVoice; - gLpsrAccidentalStyleKindsMap ["modern"] = kModern; - gLpsrAccidentalStyleKindsMap ["modern-cautionary"] = kModernCautionary; - gLpsrAccidentalStyleKindsMap ["modern-voice"] = kModernVoice; - gLpsrAccidentalStyleKindsMap ["modern-voice-cautionary"] = kModernVoiceCautionary; - gLpsrAccidentalStyleKindsMap ["piano"] = kPiano; - gLpsrAccidentalStyleKindsMap ["piano-cautionary"] = kPianoCautionary; - gLpsrAccidentalStyleKindsMap ["neo-modern"] = kNeoModern; - gLpsrAccidentalStyleKindsMap ["neo-modern-cautionary"] = kNeoModernCautionary; - gLpsrAccidentalStyleKindsMap ["neo-modern-voice"] = kNeoModernVoice; - gLpsrAccidentalStyleKindsMap ["neo-modern-voice-cautionary"] = kNeoModernVoiceCautionary; - gLpsrAccidentalStyleKindsMap ["dodecaphonic"] = kDodecaphonic; - gLpsrAccidentalStyleKindsMap ["dodecaphonic-no-repeat"] = kDodecaphonicNoRepeat; - gLpsrAccidentalStyleKindsMap ["dodecaphonic-first"] = kDodecaphonicFirst; - gLpsrAccidentalStyleKindsMap ["teaching"] = kTeaching; - gLpsrAccidentalStyleKindsMap ["no-reset"] = kNoReset; - gLpsrAccidentalStyleKindsMap ["forget"] = kForget; -} - -string existingLpsrAccidentalStyleKinds (int namesListMaxLength) -{ - stringstream s; - - if (gLpsrAccidentalStyleKindsMap.size ()) { - map::const_iterator - iBegin = gLpsrAccidentalStyleKindsMap.begin (), - iEnd = gLpsrAccidentalStyleKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -// chords languages -//______________________________________________________________________________ - -map - gLpsrChordsLanguageKindsMap; - -void initializeLpsrChordsLanguageKindsMap () -{ - gLpsrChordsLanguageKindsMap ["ignatzek"] = k_IgnatzekChords; // default - gLpsrChordsLanguageKindsMap ["german"] = k_GermanChords; - gLpsrChordsLanguageKindsMap ["semiGerman"] = k_SemiGermanChords; - gLpsrChordsLanguageKindsMap ["italian"] = k_ItalianChords; - gLpsrChordsLanguageKindsMap ["french"] = k_FrenchChords; -} - -string lpsrChordsLanguageKindAsString ( - lpsrChordsLanguageKind languageKind) -{ - string result; - - switch (languageKind) { - case k_IgnatzekChords: // default value - result = "ignatzek"; - break; - case k_GermanChords: - result = "german"; - break; - case k_SemiGermanChords: - result = "semiGerman"; - break; - case k_ItalianChords: - result = "italian"; - break; - case k_FrenchChords: - result = "french"; - break; - } // switch - - return result; -} - -string existingLpsrChordsLanguageKinds (int namesListMaxLength) -{ - stringstream s; - - if (gLpsrChordsLanguageKindsMap.size ()) { - map::const_iterator - iBegin = gLpsrChordsLanguageKindsMap.begin (), - iEnd = gLpsrChordsLanguageKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -//______________________________________________________________________________ -string msrSemiTonesPitchAndOctaveAsLilypondString ( - msrQuarterTonesPitchesLanguageKind languageKind, - S_msrSemiTonesPitchAndOctave semiTonesPitchAndOctave) -{ - stringstream s; - - msrQuarterTonesPitchKind - quarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - semiTonesPitchAndOctave->getSemiTonesPitchKind ()); - - map - *pitchNamesMapPTR = - &gNederlandsPitchNamesMap; // default LilyPond value - - // is quarterTonesPitchName in the part renaming map? - switch (languageKind) { - case kNederlands: - pitchNamesMapPTR = &gNederlandsPitchNamesMap; - break; - case kCatalan: - pitchNamesMapPTR = &gCatalanPitchNamesMap; - break; - case kDeutsch: - pitchNamesMapPTR = &gDeutschPitchNamesMap; - break; - case kEnglish: - pitchNamesMapPTR = &gEnglishPitchNamesMap; - break; - case kEspanol: - pitchNamesMapPTR = &gEspanolPitchNamesMap; - break; - case kFrancais: - pitchNamesMapPTR = &gFrancaisPitchNamesMap; - break; - case kItaliano: - pitchNamesMapPTR = &gItalianoPitchNamesMap; - break; - case kNorsk: - pitchNamesMapPTR = &gNorskPitchNamesMap; - break; - case kPortugues: - pitchNamesMapPTR = &gPortuguesPitchNamesMap; - break; - case kSuomi: - pitchNamesMapPTR = &gSuomiPitchNamesMap; - break; - case kSvenska: - pitchNamesMapPTR = &gSvenskaPitchNamesMap; - break; - case kVlaams: - pitchNamesMapPTR = &gVlaamsPitchNamesMap; - break; - } // switch - - s << (*pitchNamesMapPTR) [quarterTonesPitchKind]; - - switch (semiTonesPitchAndOctave->getOctave ()) { - case -7: - s << ",,,,,,,,,,"; - break; - case -6: - s << ",,,,,,,,,,"; - break; - case -5: - s << ",,,,,,,,,"; - break; - case -4: - s << ",,,,,,,"; - break; - case -3: - s << ",,,,,,"; - break; - case -2: - s << ",,,,,"; - break; - case -1: - s << ",,,,"; - break; - case 0: - s << ",,,"; - break; - case 1: - s << ",,"; - break; - case 2: - s << ","; - break; - case 3: - s << ""; - break; - case 4: - s << "'"; - break; - case 5: - s << "''"; - break; - case 6: - s << "'''"; - break; - case 7: - s << "''''"; - break; - case 8: - s << "'''''"; - break; - case 9: - s << "''''''"; - break; - case 10: - s << "'''''''"; - break; - case 11: - s << "''''''''"; - break; - case 12: - s << "'''''''''"; - break; - case 13: - s << "''''''''''"; - break; - case 14: - s << "'''''''''''"; - break; - case 15: - s << "''''''''''''"; - break; - case 16: - s << "'''''''''''''"; - break; - default: - s << "!!!"; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - s << - " %{ " << - semiTonesPitchAndOctave->asString () << - " %}"; - } -#endif - - return s.str (); -} - -/* JMI -string msrSemiTonesPitchAndOctaveAsLilypondString ( - msrQuarterTonesPitchesLanguageKind languageKind, - S_msrSemiTonesPitchAndOctave semiTonesPitchAndOctave) -{ - msrQuarterTonesPitchKind - quarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - semiTonesPitchKind); - - return - msrQuarterTonesPitchAndOctaveAsLilypondString ( - languageKind, - quarterTonesPitchKind); - - return "??????"; -} -*/ - -// lyrics durations -//______________________________________________________________________________ - -map - gLpsrLyricsDurationsKindsMap; - -string lpsrLyricsDurationsKindAsString ( - lpsrLyricsDurationsKind lyricsDurationsKind) -{ - string result; - - // no CamelCase here, these strings are used in the command line options - - switch (lyricsDurationsKind) { - case kLyricsDurationsImplicit: - result = "lyricsDurationsImplicit"; - break; - case kLyricsDurationsExplicit: - result = "lyricsDurationsExplicit"; - break; - } // switch - - return result; -} - -void initializeLpsrLyricsDurationsKindsMap () -{ - // register the LilyPond score output kinds - // -------------------------------------- - - // no CamelCase here, these strings are used in the command line options - - gLpsrLyricsDurationsKindsMap ["implicit"] = kLyricsDurationsImplicit; - gLpsrLyricsDurationsKindsMap ["explicit"] = kLyricsDurationsExplicit; -} - -string existingLpsrLyricsDurationsKinds (int namesListMaxLength) -{ - stringstream s; - - if (gLpsrLyricsDurationsKindsMap.size ()) { - map::const_iterator - iBegin = gLpsrLyricsDurationsKindsMap.begin (), - iEnd = gLpsrLyricsDurationsKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -//______________________________________________________________________________ -void initializeLPSRBasicTypes () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing LPSR basic types handling" << - endl; - } -#endif - - // LPSR score output handling - // ------------------------------------------------------ - - initializeLpsrScoreOutputKindsMap (); - - // LPSR octave entry handling - // ------------------------------------------------------ - - initializeLpsrOctaveEntryKindsMap (); - - // LPSR accidental styles handling - // ------------------------------------------------------ - - initializeLpsrAccidentalStyleKindsMap (); - - // LPSR chords languages handling - // ------------------------------------------------------ - - initializeLpsrChordsLanguageKindsMap (); - - - // LPSR lyrics durations kinds handling - // ------------------------------------------------------ - - initializeLpsrLyricsDurationsKindsMap (); -} - - -} diff --git a/src/lilypond/lpsrBasicTypes.h b/src/lilypond/lpsrBasicTypes.h deleted file mode 100644 index 9afe8bd38..000000000 --- a/src/lilypond/lpsrBasicTypes.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrBasicTypes___ -#define ___lpsrBasicTypes___ - -#include -#include - -#include "smartpointer.h" - -#include "rational.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -// score output kinds -//______________________________________________________________________________ -enum lpsrScoreOutputKind { - kScoreOnly, // default value - kScoreAndParts, - kPartsAndScore, - kPartsOnly, - kScoreAndPartsOneFile, - kPartsAndScoreOneFile, - kPartsOnlyOneFile }; - -string lpsrScoreOutputKindAsString ( - lpsrScoreOutputKind scoreOutputKind); - -extern map - gLpsrScoreOutputKindsMap; - -string existingLpsrScoreOutputKinds (int namesListMaxLength); - -void initializeLpsrScoreOutputKindsMap (); - -// octave entry -//______________________________________________________________________________ -enum lpsrOctaveEntryKind { - kOctaveEntryRelative, // default value - kOctaveEntryAbsolute, - kOctaveEntryFixed }; - -string lpsrOctaveEntryKindAsString ( - lpsrOctaveEntryKind octaveEntryKind); - -extern map - gLpsrOctaveEntryKindsMap; - -string existingLpsrOctaveEntryKinds (int namesListMaxLength); - -void initializeLpsrOctaveEntryKindsMap (); - -// accidental styles -//______________________________________________________________________________ -enum lpsrAccidentalStyleKind { - kDefault, - kVoice, - kModern, - kModernCautionary, kModernVoice, kModernVoiceCautionary, - kPiano, kPianoCautionary, - kNeoModern, - kNeoModernCautionary, kNeoModernVoice, kNeoModernVoiceCautionary, - kDodecaphonic, kDodecaphonicNoRepeat, - kDodecaphonicFirst, kTeaching, kNoReset, kForget }; - -string lpsrAccidentalStyleKindAsString ( - lpsrAccidentalStyleKind accidentalStyleKind); - -string lpsrAccidentalStyleKindAsLilypondString ( - lpsrAccidentalStyleKind accidentalStyleKind); - -extern map - gLpsrAccidentalStyleKindsMap; - -string existingLpsrAccidentalStyleKinds (int namesListMaxLength); - -void initializeLpsrAccidentalStyleKindsMap (); - -// chords languages -//______________________________________________________________________________ -enum lpsrChordsLanguageKind { - k_IgnatzekChords, // LilyPond default - k_GermanChords, k_SemiGermanChords, k_ItalianChords, k_FrenchChords }; - -string lpsrChordsLanguageKindAsString ( - lpsrChordsLanguageKind languageKind); - -extern map - gLpsrChordsLanguageKindsMap; - -string existingLpsrChordsLanguageKinds (int namesListMaxLength); - -void initializeLpsrChordsLanguageKindsMap (); - -// whole notes -//______________________________________________________________________________ -string wholeNotesAsLilypondString ( - int inputLineNumber, - rational wholeNotes, - int& dotsNumber); - -string wholeNotesAsLilypondString ( - int inputLineNumber, - rational wholeNotes); - -// dotted durations -//______________________________________________________________________________ - -string dottedDurationAsLilypondString ( - int inputLineNumber, - msrDottedDuration dottedDuration); - -string dottedDurationAsLilypondStringWithoutBackSlash ( - int inputLineNumber, - msrDottedDuration dottedDuration); - -// rests measures -//______________________________________________________________________________ -string restMeasuresWholeNoteAsLilypondString ( - int inputLineNumber, - rational wholeNotes); - -// texts lists -//______________________________________________________________________________ -void writeTextsListAsLilypondString ( - const list& textsList, - ostream& os); - -// pitches and octaves -//______________________________________________________________________________ -string msrSemiTonesPitchKindAsLilypondString ( - msrQuarterTonesPitchesLanguageKind languageKind, - msrSemiTonesPitchKind semiTonesPitchKind); - -string msrSemiTonesPitchAndOctaveAsLilypondString ( - msrQuarterTonesPitchesLanguageKind languageKind, - S_msrSemiTonesPitchAndOctave quarterTonesPitchAndOctave); - -// lyrics durations -//______________________________________________________________________________ -enum lpsrLyricsDurationsKind { - kLyricsDurationsImplicit, // default value - kLyricsDurationsExplicit }; - -string lpsrLyricsDurationsKindAsString ( - lpsrLyricsDurationsKind lyricsDurationsKind); - -extern map - gLpsrLyricsDurationsKindsMap; - -string existingLpsrLyricsDurationsKinds (int namesListMaxLength); - -void initializeLpsrLyricsDurationsKindsMap (); - -// initialization -//______________________________________________________________________________ -void initializeLPSRBasicTypes (); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/lpsrBookBlockElements.cpp b/src/lilypond/lpsrBookBlockElements.cpp deleted file mode 100644 index 45eafdc8d..000000000 --- a/src/lilypond/lpsrBookBlockElements.cpp +++ /dev/null @@ -1,854 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrBookBlockElements.h" - -#include "version.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrBookBlockElement lpsrBookBlockElement::create ( - int inputLineNumber) -{ - lpsrBookBlockElement* o = new lpsrBookBlockElement ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrBookBlockElement::lpsrBookBlockElement ( - int inputLineNumber) - : lpsrElement (inputLineNumber) -{ - // create the book block element parallel music - fBookBlockElementParallelMusicBlock = - lpsrParallelMusicBLock::create ( - inputLineNumber, - lpsrParallelMusicBLock::kEndOfLine); -} - -lpsrBookBlockElement::~lpsrBookBlockElement () -{} - -void lpsrBookBlockElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookBlockElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBookBlockElement elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBookBlockElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrBookBlockElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookBlockElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBookBlockElement elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBookBlockElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrBookBlockElement::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookBlockElement::browseData ()" << - endl; - } -#endif - - { - // browse the book block element parallel music - msrBrowser browser (v); - browser.browse (*fBookBlockElementParallelMusicBlock); - } - -/* JMI - for ( - vector::const_iterator i = fBlockElements.begin (); - i != fBlockElements.end (); - i++ - ) { - // browse the element - // msrBrowser browser (v); - // browser.browse (*(*i)); - } // for -*/ - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrBookBlockElement::browseData ()" << - endl; - } -#endif -} - -void lpsrBookBlockElement::print (ostream& os) const -{ - // will never be called since it is overridden in subclasses -} - -ostream& operator<< (ostream& os, const S_lpsrBookBlockElement& scr) -{ - scr->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrScoreBlock lpsrScoreBlock::create ( - int inputLineNumber) -{ - lpsrScoreBlock* o = new lpsrScoreBlock ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrScoreBlock::lpsrScoreBlock ( - int inputLineNumber) - : lpsrBookBlockElement (inputLineNumber) -{ - // create the score block parallel music block - fBookBlockElementParallelMusicBlock = - lpsrParallelMusicBLock::create ( - inputLineNumber, - lpsrParallelMusicBLock::kEndOfLine); - - // create the score block layout - fScoreBlockLayout = - lpsrLayout::create ( - inputLineNumber); - - /* - // create the score block midi tempo - string midiTempoDuration = gLilypondOah->fMidiTempo.first; // BLARK JMI ??? - int midiTempoPerSecond = gLilypondOah->fMidiTempo.second; - - fScoreBlockMidiTempo = - msrMidiTempo::create ( - inputLineNumber, - midiTempoDuration, - midiTempoPerSecond); - */ - // create the score block midi tempo - fScoreBlockMidiTempo = - gLilypondOah->fMidiTempo.createMsrMidiTempoNewbornClone (); -} - -lpsrScoreBlock::~lpsrScoreBlock () -{} - -void lpsrScoreBlock::appendPartGroupBlockToScoreBlock ( - S_lpsrPartGroupBlock partGroupBlock) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Appending part group block " << - partGroupBlock-> getPartGroup ()-> getPartGroupCombinedName () << - " to LPSR score block" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - appendPartGroupBlockToParallelMusicBLock ( - partGroupBlock); - -// fBlockElements.push_back(partGroupBlock); -} - -/* JMI -void lpsrScoreBlock::appendVoiceUseToParallelMusicBLock ( - S_lpsrUseVoiceCommand voiceUse) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending the use of voice \"" << - voiceUse-> getVoice ()-> getVoiceName () << - "\" to LPSR score" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - addElementToParallelMusicBLock (voiceUse); - -// JMI fBlockElements.push_back(voiceUse); -} - -void lpsrScoreBlock::appendLyricsUseToParallelMusicBLock ( - S_lpsrNewLyricsBlock lyricsUse) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending the use of stanza " << - lyricsUse-> getStanza ()-> getStanzaName () << - " to LPSR score" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - addElementToParallelMusicBLock (lyricsUse); -} -*/ - -void lpsrScoreBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrScoreBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrScoreBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrScoreBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrScoreBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrScoreBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrScoreBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrScoreBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrScoreBlock::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrScoreBlock::browseData ()" << - endl; - } -#endif - - { - // browse the score block parallel music - msrBrowser browser (v); - browser.browse (*fBookBlockElementParallelMusicBlock); - } - -/* JMI - for ( - vector::const_iterator i = fBlockElements.begin (); - i != fBlockElements.end (); - i++ - ) { - // browse the element - // msrBrowser browser (v); - // browser.browse (*(*i)); - } // for -*/ - { - // browse the score block layout - msrBrowser browser (v); - browser.browse (*fScoreBlockLayout); - } - - { - // browse the score block midi tempo - msrBrowser browser (v); - browser.browse (*fScoreBlockMidiTempo); - } - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrScoreBlock::browseData ()" << - endl; - } -#endif -} - -void lpsrScoreBlock::print (ostream& os) const -{ - os << "ScoreBlock" << endl << endl; - - gIndenter++; - - os << - fBookBlockElementParallelMusicBlock << - endl; - - os << - fScoreBlockLayout << - endl; - - os << - fScoreBlockMidiTempo << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrScoreBlock& scr) -{ - scr->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrBookPartBlock lpsrBookPartBlock::create ( - int inputLineNumber) -{ - lpsrBookPartBlock* o = new lpsrBookPartBlock ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrBookPartBlock::lpsrBookPartBlock ( - int inputLineNumber) - : lpsrBookBlockElement (inputLineNumber) -{ - // create the bookpart block parallel music - fBookBlockElementParallelMusicBlock = - lpsrParallelMusicBLock::create ( - inputLineNumber, - lpsrParallelMusicBLock::kEndOfLine); -} - -lpsrBookPartBlock::~lpsrBookPartBlock () -{} - -void lpsrBookPartBlock::appendPartGroupBlockToBookPartBlock ( - S_lpsrPartGroupBlock partGroupBlock) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Appending part group block " << - partGroupBlock-> getPartGroup ()-> getPartGroupCombinedName () << - " to LPSR book part block" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - appendPartGroupBlockToParallelMusicBLock ( - partGroupBlock); - -// fBlockElements.push_back(partGroupBlock); -} - -/* JMI -void lpsrBookPartBlock::appendVoiceUseToParallelMusicBLock ( - S_lpsrUseVoiceCommand voiceUse) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending the use of voice \"" << - voiceUse-> getVoice ()-> getVoiceName () << - "\" to LPSR score" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - addElementToParallelMusicBLock (voiceUse); - -// JMI fBlockElements.push_back(voiceUse); -} - -void lpsrBookPartBlock::appendLyricsUseToParallelMusicBLock ( - S_lpsrNewLyricsBlock lyricsUse) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending the use of stanza " << - lyricsUse-> getStanza ()-> getStanzaName () << - " to LPSR score" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - addElementToParallelMusicBLock (lyricsUse); -} -*/ - -void lpsrBookPartBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookPartBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBookPartBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBookPartBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrBookPartBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookPartBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBookPartBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBookPartBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrBookPartBlock::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookPartBlock::browseData ()" << - endl; - } -#endif - - { - // browse the bookpart block parallel music - msrBrowser browser (v); - browser.browse (*fBookBlockElementParallelMusicBlock); - } - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrBookPartBlock::browseData ()" << - endl; - } -#endif -} - -void lpsrBookPartBlock::print (ostream& os) const -{ - os << "BookPartBlock" << endl << endl; - - gIndenter++; - - os << - fBookBlockElementParallelMusicBlock << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrBookPartBlock& scr) -{ - scr->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrBookBlock lpsrBookBlock::create ( - int inputLineNumber) -{ - lpsrBookBlock* o = new lpsrBookBlock ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrBookBlock::lpsrBookBlock ( - int inputLineNumber) - : lpsrElement (inputLineNumber) -{ - /* JMI - // create the score block element parallel music - fBookBlockElementParallelMusicBlock = - lpsrParallelMusicBLock::create ( - inputLineNumber, - lpsrParallelMusicBLock::kEndOfLine); -*/ - - // create the book block element header - fBookBlockHeader = - lpsrHeader::create ( - inputLineNumber); - - // don't create the book block element paper - // it will be created as a new born clone of the the one in the lpsrScore - // when the scaling is handled in visitStart (S_msrScaling&) -} - -lpsrBookBlock::~lpsrBookBlock () -{} - -/* JMI -void lpsrBookBlock::appendPartGroupBlockToBlock ( - S_lpsrPartGroupBlock partGroupBlock) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Appending part group block " << - partGroupBlock-> getPartGroup ()-> getPartGroupCombinedName () << - " to LPSR score" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - appendPartGroupBlockToParallelMusicBLock ( - partGroupBlock); - -// fBlockElements.push_back(partGroupBlock); -} -*/ - -void lpsrBookBlock::appendBookBlockElementToBookBlockElementsList ( - S_lpsrBookBlockElement bookBlockElement) -{ -/* JMI -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrBlocks) { - gLogOstream << - "Appending book block element " << - bookBlockElement-> asString () << - " to LPSR book block" << - endl; - } -#endif -*/ - fBookBlockElementsList.push_back ( - bookBlockElement); -} - -void lpsrBookBlock::appendLpsrScoreBlockToBookBlockElementsList ( - S_lpsrScoreBlock scoreBlock) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrBlocks) { - gLogOstream << - "Appending score block element " << - scoreBlock-> asString () << - " to LPSR book block elements list" << - endl; - } -#endif - - appendBookBlockElementToBookBlockElementsList ( - scoreBlock); -} - -void lpsrBookBlock::appendLpsrBookPartBlockToBookBlockElementsList ( - S_lpsrBookPartBlock bookPartBlock) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrBlocks) { - gLogOstream << - "Appending book part block element " << - bookPartBlock-> asString () << - " to LPSR book block elements list" << - endl; - } -#endif - - appendBookBlockElementToBookBlockElementsList ( - bookPartBlock); -} - -/* JMI -void lpsrBookBlock::appendVoiceUseToParallelMusicBLock ( - S_lpsrUseVoiceCommand voiceUse) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending the use of voice \"" << - voiceUse-> getVoice ()-> getVoiceName () << - "\" to LPSR score" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - addElementToParallelMusicBLock (voiceUse); - -// JMI fBlockElements.push_back(voiceUse); -} - -void lpsrBookBlock::appendLyricsUseToParallelMusicBLock ( - S_lpsrNewLyricsBlock lyricsUse) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending the use of stanza " << - lyricsUse-> getStanza ()-> getStanzaName () << - " to LPSR score" << - endl; - } -#endif - - fBookBlockElementParallelMusicBlock-> - addElementToParallelMusicBLock (lyricsUse); -} -*/ - -void lpsrBookBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBookBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBookBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrBookBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrBookBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrBookBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrBookBlock::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrBookBlock::browseData ()" << - endl; - } -#endif - - if (fBookBlockHeader) { - // browse the book block header - msrBrowser browser (v); - browser.browse (*fBookBlockHeader); - } - - for ( - list::const_iterator i = fBookBlockElementsList.begin (); - i != fBookBlockElementsList.end (); - i++ - ) { - // browse block the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - if (fBookBlockPaper) { - // browse the book block paper - msrBrowser browser (v); - browser.browse (*fBookBlockPaper); - } - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrBookBlock::browseData ()" << - endl; - } -#endif -} - -void lpsrBookBlock::print (ostream& os) const -{ - os << "BookBlock" << endl << endl; - - gIndenter++; - - if (fBookBlockHeader) { - os << - fBookBlockHeader << - endl; - } - - os << - "BookBlockElements"; - - if (fBookBlockElementsList.size ()) { - os << endl; - - gIndenter++; - - for ( - list::const_iterator i = fBookBlockElementsList.begin (); - i != fBookBlockElementsList.end (); - i++ - ) { - // print the book block element - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : none" << - endl; - } - - if (fBookBlockPaper) { - os << - fBookBlockPaper << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrBookBlock& scr) -{ - scr->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrBookBlockElements.h b/src/lilypond/lpsrBookBlockElements.h deleted file mode 100644 index e9ac651be..000000000 --- a/src/lilypond/lpsrBookBlockElements.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrBookBlockElements___ -#define ___lpsrBookBlockElements___ - -/* -#include -#include -#include -#include - - -#include "exports.h" -#include "typedefs.h" - -#include "msrBasicTypes.h" - - -#include "lpsrVarValAssocs.h" - -#include "lpsrScheme.h" -*/ - -#include "lpsrComments.h" - -#include "lpsrScheme.h" - -#include "lpsrHeaders.h" -#include "lpsrPapers.h" -#include "lpsrLayouts.h" - -#include "lpsrParallelMusic.h" -#include "lpsrVarValAssocs.h" - -//#include "msrBlocks.h" - -#include "msrMidi.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrBookBlockElement : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrBookBlockElement ( - int inputLineNumber); - - virtual ~lpsrBookBlockElement (); - - public: - - // set and get - // ------------------------------------------------------ - - S_lpsrHeader getBookBlockElementHeader () const - { return fBookBlockElementHeader; } - - S_lpsrParallelMusicBLock - getBlockElementParallelMusicBLock () const - { - return - fBookBlockElementParallelMusicBlock; - } - - // services - // ------------------------------------------------------ - - void appendPartGroupBlockToBlockElement ( - S_lpsrPartGroupBlock partGroupBlock); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - S_lpsrHeader fBookBlockElementHeader; - - S_lpsrParallelMusicBLock - fBookBlockElementParallelMusicBlock; -}; -typedef SMARTP S_lpsrBookBlockElement; -EXP ostream& operator<< (ostream& os, const S_lpsrBookBlockElement& elt); - -//______________________________________________________________________________ -class lpsrScoreBlock : public lpsrBookBlockElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrScoreBlock ( - int inputLineNumber); - - virtual ~lpsrScoreBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - S_lpsrLayout getScoreBlockLayout () const - { return fScoreBlockLayout; } - - S_msrMidiTempo getScoreBlockMidiTempo () const - { return fScoreBlockMidiTempo; } - - // services - // ------------------------------------------------------ - - void appendPartGroupBlockToScoreBlock ( - S_lpsrPartGroupBlock partGroupBlock); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_lpsrLayout fScoreBlockLayout; - - S_msrMidiTempo fScoreBlockMidiTempo; -}; -typedef SMARTP S_lpsrScoreBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrScoreBlock& elt); - -//______________________________________________________________________________ -class lpsrBookPartBlock : public lpsrBookBlockElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrBookPartBlock ( - int inputLineNumber); - - virtual ~lpsrBookPartBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - void appendPartGroupBlockToBookPartBlock ( - S_lpsrPartGroupBlock partGroupBlock); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_lpsrBookPartBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrBookPartBlock& elt); - -//______________________________________________________________________________ -class lpsrBookBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrBookBlock ( - int inputLineNumber); - - virtual ~lpsrBookBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - void setBookBlockHeader ( - S_lpsrHeader bookBlockHeader) - { fBookBlockHeader = bookBlockHeader; } - - S_lpsrHeader getBookBlockHeader () const - { return fBookBlockHeader; } - - void setBookBlockPaper ( - S_lpsrPaper bookBlockPaper) - { fBookBlockPaper = bookBlockPaper; } - - S_lpsrPaper getBookBlockPaper () const - { return fBookBlockPaper; } - - const list& - getBookBlockElementsList () const - { return fBookBlockElementsList; } - - public: - - // public services - // ------------------------------------------------------ - - void appendLpsrScoreBlockToBookBlockElementsList ( - S_lpsrScoreBlock scoreBlock); - - void appendLpsrBookPartBlockToBookBlockElementsList ( - S_lpsrBookPartBlock bookPartBlock); - - protected: - - // protected services - // ------------------------------------------------------ - - void appendBookBlockElementToBookBlockElementsList ( - S_lpsrBookBlockElement bookBlockElement); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_lpsrHeader fBookBlockHeader; - - S_lpsrPaper fBookBlockPaper; - - list - fBookBlockElementsList; -}; -typedef SMARTP S_lpsrBookBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrBookBlock& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrComments.cpp b/src/lilypond/lpsrComments.cpp deleted file mode 100644 index a28b7579f..000000000 --- a/src/lilypond/lpsrComments.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrComments.h" - -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrComment lpsrComment::create ( - int inputLineNumber, - string contents, - lpsrCommentGapKind commentGapKind) -{ - lpsrComment* o = new - lpsrComment ( - inputLineNumber, contents, commentGapKind); - assert(o!=0); - return o; -} - -lpsrComment::lpsrComment ( - int inputLineNumber, - string contents, - lpsrCommentGapKind commentGapKind) - : lpsrElement (inputLineNumber) -{ - fContents = contents; - fCommentGapKind = commentGapKind; -} - -lpsrComment::~lpsrComment () -{} - -void lpsrComment::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrComment::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrComment elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrComment::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrComment::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrComment::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrComment elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrComment::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrComment::browseData (basevisitor* v) -{} - -void lpsrComment::print (ostream& os) const -{ - os << - "Comment" << - endl; - - gIndenter++; - - os << - "% " << fContents << - endl; - - if (fCommentGapKind == kGapAfterwards) - os << endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrComment& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrComments.h b/src/lilypond/lpsrComments.h deleted file mode 100644 index 214d6467f..000000000 --- a/src/lilypond/lpsrComments.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrComments___ -#define ___lpsrComments___ - -#include "lpsrElements.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrComment : public lpsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum lpsrCommentGapKind { - kGapAfterwards, kNoGapAfterwards}; - - static string commentGapKindAsString ( - lpsrCommentGapKind commentGapKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string contents, - lpsrCommentGapKind commentGapKind = kNoGapAfterwards); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrComment ( - int inputLineNumber, - string contents, - lpsrCommentGapKind commentGapKind = kNoGapAfterwards); - - virtual ~lpsrComment (); - - public: - - // set and get - // ------------------------------------------------------ - - string getContents () const - { return fContents; } - - lpsrCommentGapKind getCommentGapKind () const - { return fCommentGapKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fContents; - lpsrCommentGapKind fCommentGapKind; -}; -typedef SMARTP S_lpsrComment; -EXP ostream& operator<< (ostream& os, const S_lpsrComment& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrContexts.cpp b/src/lilypond/lpsrContexts.cpp deleted file mode 100644 index e43d88d63..000000000 --- a/src/lilypond/lpsrContexts.cpp +++ /dev/null @@ -1,507 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrContexts.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrContext lpsrContext::create ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - lpsrContextTypeKind contextTypeKind, - string contextName) -{ - lpsrContext* o = - new lpsrContext ( - inputLineNumber, - contextExistingKind, - contextTypeKind, - contextName); - assert(o!=0); - return o; -} - -lpsrContext::lpsrContext ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - lpsrContextTypeKind contextTypeKind, - string contextName) - : lpsrElement (inputLineNumber) -{ - fContextExistingKind = contextExistingKind; - fContextTypeKind = contextTypeKind; - fContextName = contextName; -} - -lpsrContext::~lpsrContext () -{} - -void lpsrContext::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrContext::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrContext elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrContext::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrContext::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrContext::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrContext elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrContext::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrContext::browseData (basevisitor* v) -{} - -string lpsrContext::contextTypeKindAsString ( - lpsrContextTypeKind contextTypeKind) -{ - string result; - - switch (contextTypeKind) { - case lpsrContext::kChordNames: - result = "ChordNames"; - break; - case lpsrContext::kFiguredBass: - result = "FiguredBass"; - break; - } // switch - - return result; -} - -string lpsrContext::contextExistingKindAsString ( - lpsrContextExistingKind contextExistingKind) -{ - string result; - - switch (contextExistingKind) { - case kExistingContextYes: - result = "existingContextYes"; - break; - case kExistingContextNo: - result = "existingContextNo"; - break; - } // switch - - return result; -} - -void lpsrContext::print (ostream& os) const -{ - os << - "Context, \"" << - contextTypeKindAsString ( - fContextTypeKind) << - "\"" << - ", existing kind: " << - contextExistingKindAsString ( - fContextExistingKind); - - if (fContextName.size ()) { - os << " " << fContextName; - } - os << endl; - - gIndenter++; - - os << - "ContextElements"; - - if (fContextElementsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fContextElementsList.begin (), - iEnd = fContextElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - else { - os << "none" << - endl; - } - - gIndenter--; -} - -//______________________________________________________________________________ -S_lpsrChordNamesContext lpsrChordNamesContext::create ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrVoice contextVoice) -{ - lpsrChordNamesContext* o = - new lpsrChordNamesContext ( - inputLineNumber, - contextExistingKind, - contextName, - contextVoice); - assert(o!=0); - return o; -} - -lpsrChordNamesContext::lpsrChordNamesContext ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrVoice contextVoice) - : lpsrContext ( - inputLineNumber, - contextExistingKind, - lpsrContext::kChordNames, - contextName) -{ - fContextExistingKind = contextExistingKind; - - fContextName = contextName; - - fContextVoice = contextVoice; -} - -lpsrChordNamesContext::~lpsrChordNamesContext () -{} - -void lpsrChordNamesContext::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrChordNamesContext::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrChordNamesContext elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrChordNamesContext::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrChordNamesContext::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrChordNamesContext::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrChordNamesContext elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrChordNamesContext::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrChordNamesContext::browseData (basevisitor* v) -{} - -void lpsrChordNamesContext::print (ostream& os) const -{ - os << - /* JMI - "ChordNamesContext, \"" << - contextTypeKindAsString ( - fContextTypeKind) << - "\"" << - */ - "ChordNamesContext" << - endl; - - gIndenter++; - - const int fieldWidth = 20; - - os << left << - setw (fieldWidth) << - "contextExistingKind" << " : " << - contextExistingKindAsString ( - fContextExistingKind) << - endl << - setw (fieldWidth) << - "contextName" << " : \"" << fContextName << "\"" << - endl << - setw (fieldWidth) << - "contextVoice" << " : \"" << fContextVoice->getVoiceName () << "\"" << - endl; - - os << - setw (fieldWidth) << - "ContextElements"; - - if (fContextElementsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fContextElementsList.begin (), - iEnd = fContextElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrChordNamesContext& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrFiguredBassContext lpsrFiguredBassContext::create ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrStaff contextStaff) -{ - lpsrFiguredBassContext* o = - new lpsrFiguredBassContext ( - inputLineNumber, - contextExistingKind, - contextName, - contextStaff); - assert(o!=0); - return o; -} - -lpsrFiguredBassContext::lpsrFiguredBassContext ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrStaff contextStaff) - : lpsrContext ( - inputLineNumber, - contextExistingKind, - lpsrContext::kFiguredBass, - contextName) -{ - fContextExistingKind = contextExistingKind; - - fContextName = contextName; - - fContextStaff = contextStaff; -} - -lpsrFiguredBassContext::~lpsrFiguredBassContext () -{} - -void lpsrFiguredBassContext::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrFiguredBassContext::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrFiguredBassContext elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrFiguredBassContext::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrFiguredBassContext::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrFiguredBassContext::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrFiguredBassContext elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrFiguredBassContext::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrFiguredBassContext::browseData (basevisitor* v) -{} - -void lpsrFiguredBassContext::print (ostream& os) const -{ - os << - /* JMI - "FiguredBassContext, \"" << - contextTypeKindAsString ( - fContextTypeKind) << - "\"" << - */ - "FiguredBassContext" << - endl; - - gIndenter++; - - const int fieldWidth = 20; - - os << left << - setw (fieldWidth) << - "contextExistingKind" << " : " << - contextExistingKindAsString ( - fContextExistingKind) << - endl << - setw (fieldWidth) << - "contextName" << " : \"" << fContextName << "\"" << - endl << - setw (fieldWidth) << - "contextStaff" << " : \"" << fContextStaff->getStaffName () << "\"" << - endl; - - os << - setw (fieldWidth) << - "ContextElements"; - - if (fContextElementsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fContextElementsList.begin (), - iEnd = fContextElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrFiguredBassContext& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrContexts.h b/src/lilypond/lpsrContexts.h deleted file mode 100644 index e1b8d3713..000000000 --- a/src/lilypond/lpsrContexts.h +++ /dev/null @@ -1,270 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrContexts___ -#define ___lpsrContexts___ - -#include -#include -#include - -#include "lpsrElements.h" - -#include "msr.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrContext : public lpsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum lpsrContextTypeKind { - kChordNames, kFiguredBass }; - - static string contextTypeKindAsString ( - lpsrContextTypeKind contextTypeKind); - - enum lpsrContextExistingKind { - kExistingContextYes, kExistingContextNo}; - - static string contextExistingKindAsString ( - lpsrContextExistingKind contextExistingKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - lpsrContextTypeKind contextTypeKind, - string contextName); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrContext ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - lpsrContextTypeKind contextTypeKind, - string contextName); - - virtual ~lpsrContext (); - - public: - - // set and get - // ------------------------------------------------------ - - lpsrContextExistingKind - getContextExistingKind () const - { return fContextExistingKind; } - - lpsrContextTypeKind getContextTypeKind () const - { return fContextTypeKind; } - - string getContextName () const - { return fContextName; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string getContextTypeKindAsString () const - { - return - contextTypeKindAsString ( - fContextTypeKind); - } - - string getContextExistingKindAsString () const - { - return - contextExistingKindAsString ( - fContextExistingKind); - } - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - lpsrContextExistingKind - fContextExistingKind; - lpsrContextTypeKind fContextTypeKind; - string fContextName; - - list fContextElementsList; -}; -typedef SMARTP S_lpsrContext; -EXP ostream& operator<< (ostream& os, const S_lpsrContext& elt); - -//______________________________________________________________________________ -class lpsrChordNamesContext : public lpsrContext -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrVoice contextVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrChordNamesContext ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrVoice contextVoice); - - virtual ~lpsrChordNamesContext (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrVoice getContextVoice () const - { return fContextVoice; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrVoice fContextVoice; -}; -typedef SMARTP S_lpsrChordNamesContext; -EXP ostream& operator<< (ostream& os, const S_lpsrChordNamesContext& elt); - -//______________________________________________________________________________ -class lpsrFiguredBassContext : public lpsrContext -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrStaff contextStaff); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrFiguredBassContext ( - int inputLineNumber, - lpsrContextExistingKind contextExistingKind, - string contextName, - S_msrStaff contextStaff); - - virtual ~lpsrFiguredBassContext (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrStaff getContextStaff () const - { return fContextStaff; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrStaff fContextStaff; -}; -typedef SMARTP S_lpsrFiguredBassContext; -EXP ostream& operator<< (ostream& os, const S_lpsrFiguredBassContext& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrElements.cpp b/src/lilypond/lpsrElements.cpp deleted file mode 100644 index 475dc90a2..000000000 --- a/src/lilypond/lpsrElements.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrElements.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_lpsrElement lpsrElement::create ( - int inputLineNumber) -{ - lpsrElement* o = - new lpsrElement ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrElement::lpsrElement ( - int inputLineNumber) - : msrElement (inputLineNumber) -{} - -lpsrElement::~lpsrElement () -{} - -void lpsrElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrElement elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrElement elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrElement::browseData (basevisitor* v) -{} - - -} diff --git a/src/lilypond/lpsrElements.h b/src/lilypond/lpsrElements.h deleted file mode 100644 index e603c07a5..000000000 --- a/src/lilypond/lpsrElements.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrElements___ -#define ___lpsrElements___ - -#include "msrElements.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrElement : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrElement ( - int inputLineNumber); - - virtual ~lpsrElement (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); -}; -typedef SMARTP S_lpsrElement; - -//______________________________________________________________________________ -template class lpsrBrowser : public browser -{ - protected: - - basevisitor* fVisitor; - - virtual void enter (T& t) { t.acceptIn (fVisitor); } - virtual void leave (T& t) { t.acceptOut (fVisitor); } - - public: - - lpsrBrowser (basevisitor* v) : fVisitor (v) - {} - - virtual ~lpsrBrowser () - {} - - virtual void set (basevisitor* v) - { fVisitor = v; } - - virtual void browse (T& t) - { - enter (t); - - t.browseData (fVisitor); - - leave (t); - } -}; - - -} - - -#endif diff --git a/src/lilypond/lpsrHeaders.cpp b/src/lilypond/lpsrHeaders.cpp deleted file mode 100644 index 00ca5a18a..000000000 --- a/src/lilypond/lpsrHeaders.cpp +++ /dev/null @@ -1,1391 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "lpsrHeaders.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrHeader lpsrHeader::create ( - int inputLineNumber) -{ - lpsrHeader* o = - new lpsrHeader ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrHeader::lpsrHeader ( - int inputLineNumber) - : lpsrElement (inputLineNumber) -{ - // grab values from the LilyPond options if any - if (gLilypondOah->fDedication.size ()) { - setLilypondDedication ( - inputLineNumber, - gLilypondOah->fDedication, - kFontStyleNone, - kFontWeightNone); - } - - if (gLilypondOah->fPiece.size ()) { - setLilypondPiece ( - inputLineNumber, - gLilypondOah->fPiece, - kFontStyleNone, - kFontWeightNone); - } - - if (gLilypondOah->fOpus.size ()) { - setLilypondOpus ( - inputLineNumber, - gLilypondOah->fOpus, - kFontStyleNone, - kFontWeightNone); - } - - if (gLilypondOah->fTitle.size ()) { - setLilypondTitle ( - inputLineNumber, - gLilypondOah->fTitle, - kFontStyleNone, - kFontWeightNone); - } - if (gLilypondOah->fSubTitle.size ()) { - setLilypondSubTitle ( - inputLineNumber, - gLilypondOah->fSubTitle, - kFontStyleNone, - kFontWeightNone); - } - if (gLilypondOah->fSubSubTitle.size ()) { - setLilypondSubSubTitle ( - inputLineNumber, - gLilypondOah->fSubSubTitle, - kFontStyleNone, - kFontWeightNone); - } - - if (gLilypondOah->fInstrument.size ()) { - setLilypondInstrument ( - inputLineNumber, - gLilypondOah->fInstrument, - kFontStyleNone, - kFontWeightNone); - } - if (gLilypondOah->fMeter.size ()) { - setLilypondMeter ( - inputLineNumber, - gLilypondOah->fMeter, - kFontStyleNone, - kFontWeightNone); - } - - if (gLilypondOah->fCopyright.size ()) { - setLilypondCopyright ( - inputLineNumber, - gLilypondOah->fCopyright, - kFontStyleNone, - kFontWeightNone); - } - if (gLilypondOah->fTagline.size ()) { - setLilypondTagline ( - inputLineNumber, - gLilypondOah->fTagline, - kFontStyleNone, - kFontWeightNone); - } -} - -lpsrHeader::~lpsrHeader () -{} - -void lpsrHeader::setLilypondDedication ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondDedication = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondDedication, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondPiece ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondPiece = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondPiece, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondOpus ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondOpus = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondOpus, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondTitle = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondTitle, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondSubTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondSubTitle = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondSubTitle, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondSubSubTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondSubSubTitle = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondSubSubTitle, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondInstrument ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondInstrument = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondInstrument, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondMeter ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondMeter = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondMeter, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondCopyright ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondCopyright = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondCopyright, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setLilypondTagline ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fLilypondTagline = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondTagline, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setWorkNumber ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fWorkNumber = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kMusicXMLWorkNumber, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setWorkTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) - { - fWorkTitle = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kMusicXMLWorkTitle, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); - } - -void lpsrHeader::setMovementNumber ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) - { - fMovementNumber = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kMusicXMLMovementNumber, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); - } - -void lpsrHeader::setMovementTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fMovementTitle = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kMusicXMLMovementTitle, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setEncodingDate ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fEncodingDate = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kMusicXMLEncodingDate, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setScoreInstrument ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fScoreInstrument = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kMusicXMLScoreInstrument, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::setMiscellaneousField ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind) -{ - fMiscellaneousField = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kMusicXMLMiscellaneousField, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueYes, - val, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - fontStyleKind, - fontWeightKind, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlNone); -} - -void lpsrHeader::addRights ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding right \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fRights) { - fRights = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLRights); - } - - fRights-> - addAssocVariableValue (value); -} - -void lpsrHeader::addComposer ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding composer \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fComposers) { - fComposers = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLComposer); - } - - fComposers-> - addAssocVariableValue (value); -} - -void lpsrHeader::addArranger ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding arranger \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fArrangers) { - fArrangers = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLArranger); - } - - fArrangers-> - addAssocVariableValue (value); -} - -void lpsrHeader::addLyricist ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding lyricist \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fLyricists) { - fLyricists = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLLyricist); - } - - fLyricists-> - addAssocVariableValue (value); -} - -void lpsrHeader::addPoet ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding poet \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fPoets) { - fPoets = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLPoet); - } - - fPoets-> - addAssocVariableValue (value); -} - -void lpsrHeader::addTranslator ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding translator \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fTranslators) { - fTranslators = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLTranslator); - } - - fTranslators-> - addAssocVariableValue (value); -} - -void lpsrHeader::addArtist ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding artist \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fArtists) { - fArtists = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLArtist); - } - - fArtists-> - addAssocVariableValue (value); -} - -void lpsrHeader::addSoftware ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding software \"" << - value << - "\" to lpsrHeader" << - ", line " << fInputLineNumber << - endl; - } -#endif - - if (! fSoftwares) { - fSoftwares = - lpsrVarValsListAssoc::create ( - inputLineNumber, - lpsrVarValsListAssoc::kMusicXMLSoftware); - } - - fSoftwares-> - addAssocVariableValue (value); -} - -int lpsrHeader::maxLilypondVariablesNamesLength () -{ - int result = 0; - - // MusicXML informations - - if (fWorkNumber) { - int length = - fWorkNumber-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fWorkTitle) { - int length = - fWorkTitle-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fMovementNumber) { - int length = - fMovementNumber-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fMovementTitle) { - int length = - fMovementTitle-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fRights) { - const list& - variableValuesList = - fRights->getVariableValuesList (); - - list::const_iterator i; - for (i=variableValuesList.begin (); i!=variableValuesList.end (); i++) { - int length = (*i).size (); - if (length > result) { - result = length; - } - } // for - } - - if (fComposers) { - const list& - variableValuesList = - fComposers->getVariableValuesList (); - - list::const_iterator i; - for (i=variableValuesList.begin (); i!=variableValuesList.end (); i++) { - int length = (*i).size (); - if (length > result){ - result = length; - } - } // for - } - - if (fArrangers) { - const list& - variableValuesList = - fArrangers->getVariableValuesList (); - - list::const_iterator i; - for (i=variableValuesList.begin (); i!=variableValuesList.end (); i++) { - int length = (*i).size (); - if (length > result) { - result = length; - } - } // for - } - - if (fLyricists) { - const list& - variableValuesList = - fLyricists->getVariableValuesList (); - - list::const_iterator i; - for (i=variableValuesList.begin (); i!=variableValuesList.end (); i++) { - int length = (*i).size (); - if (length > result) { - result = length; - } - } // for - } - - if (fPoets) { - const list& - variableValuesList = - fPoets->getVariableValuesList (); - - list::const_iterator i; - for (i=variableValuesList.begin (); i!=variableValuesList.end (); i++) { - int length = (*i).size (); - if (length > result) { - result = length; - } - } // for - } - - if (fTranslators) { - const list& - variableValuesList = - fTranslators->getVariableValuesList (); - - list::const_iterator i; - for (i=variableValuesList.begin (); i!=variableValuesList.end (); i++) { - int length = (*i).size (); - if (length > result) { - result = length; - } - } // for - } - - if (fSoftwares) { - const list& - variableValuesList = - fSoftwares->getVariableValuesList (); - - list::const_iterator i; - for (i=variableValuesList.begin (); i!=variableValuesList.end (); i++) { - int length = (*i).size (); - if (length > result) { - result = length; - } - } // for - } - - if (fScoreInstrument) { - int length = fScoreInstrument->lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fEncodingDate) { - int length = fEncodingDate->lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fMiscellaneousField) { - int length = fMiscellaneousField->lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - // Lilypond informations - - if (fLilypondDedication) { - int length = - fLilypondDedication-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondPiece) { - int length = - fLilypondPiece-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondOpus) { - int length = - fLilypondOpus-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondTitle) { - int length = - fLilypondTitle-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondSubTitle) { - int length = - fLilypondSubTitle-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondSubSubTitle) { - int length = - fLilypondSubSubTitle-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondInstrument) { - int length = - fLilypondInstrument-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondMeter) { - int length = - fLilypondMeter-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondCopyright) { - int length = - fLilypondCopyright-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - if (fLilypondTagline) { - int length = - fLilypondTagline-> - lilyPondVarValAssocKindAsString ().size (); - if (length > result) { - result = length; - } - } - - return result; -} - -void lpsrHeader::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrHeader::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrHeader elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrHeader::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrHeader::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrHeader::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrHeader elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrHeader::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrHeader::browseData (basevisitor* v) -{ - if (fWorkNumber) { - // browse fWorkNumber - msrBrowser browser (v); - browser.browse (*fWorkNumber); - } - - if (fWorkTitle) { - // browse fWorkTitle - msrBrowser browser (v); - browser.browse (*fWorkTitle); - } - - if (fMovementNumber) { - // browse fMovementNumber - msrBrowser browser (v); - browser.browse (*fMovementNumber); - } - - if (fMovementTitle) { - // browse fMovementTitle - msrBrowser browser (v); - browser.browse (*fMovementTitle); - } - - if (fRights) { - // browse fRights - msrBrowser browser (v); - browser.browse (*fRights); - } - - if (fComposers) { - // browse fComposers - msrBrowser browser (v); - browser.browse (*fComposers); - } - - if (fArrangers) { - // browse fArrangers - msrBrowser browser (v); - browser.browse (*fArrangers); - } - - if (fLyricists) { - // browse fLyricists - msrBrowser browser (v); - browser.browse (*fLyricists); - } - - if (fPoets) { - // browse fPoets - msrBrowser browser (v); - browser.browse (*fPoets); - } - - if (fTranslators) { - // browse fTranslators - msrBrowser browser (v); - browser.browse (*fTranslators); - } - - if (fSoftwares) { - // browse fSoftwares - msrBrowser browser (v); - browser.browse (*fSoftwares); - } - - if (fScoreInstrument) { - // browse fScoreInstrument - msrBrowser browser (v); - browser.browse (*fScoreInstrument); - } - - if (fEncodingDate) { - // browse fEncodingDate - msrBrowser browser (v); - browser.browse (*fEncodingDate); - } - - if (fMiscellaneousField) { - // browse fMiscellaneousField - msrBrowser browser (v); - browser.browse (*fMiscellaneousField); - } -} - -void lpsrHeader::print (ostream& os) const -{ - os << - "Header" << - endl; - - bool emptyHeader = true; - - gIndenter++; - - const int fieldWidth = 16; - - // LilyPond informations - - // MusicXML informations - - if (fLilypondTitle) { - os << left << - setw (fieldWidth) << - fLilypondTitle->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fLilypondTitle << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fWorkNumber) { - os << left << - setw (fieldWidth) << - fWorkNumber->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fWorkNumber << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fWorkTitle) { - os << left << - setw (fieldWidth) << - fWorkTitle->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fWorkTitle << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fMovementNumber) { - os << left << - setw (fieldWidth) << - fMovementNumber->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fMovementNumber << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fMovementTitle) { - os << left << - setw (fieldWidth) << - fMovementTitle->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fMovementTitle << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fRights) { - os << left << - setw (fieldWidth) << - fRights->lilyPondVarValsListAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fRights << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fComposers) { - os << left << - setw (fieldWidth) << - fComposers->lilyPondVarValsListAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fComposers << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fArrangers) { - os << left << - setw (fieldWidth) << - fArrangers->lilyPondVarValsListAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fArrangers << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fLyricists) { - os << left << - setw (fieldWidth) << - fLyricists->lilyPondVarValsListAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fLyricists << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fPoets) { - os << left << - setw (fieldWidth) << - fPoets->lilyPondVarValsListAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fPoets << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fTranslators) { - os << left << - setw (fieldWidth) << - fTranslators->lilyPondVarValsListAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fTranslators << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fSoftwares) { - os << left << - setw (fieldWidth) << - fSoftwares->lilyPondVarValsListAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fSoftwares << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fScoreInstrument) { - os << left << - setw (fieldWidth) << - fScoreInstrument->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fScoreInstrument << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fEncodingDate) { - os << left << - setw (fieldWidth) << - fEncodingDate->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fEncodingDate << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (fMiscellaneousField) { - os << left << - setw (fieldWidth) << - fMiscellaneousField->lilyPondVarValAssocKindAsString () << " : " << - endl; - - gIndenter++; - - os << - fMiscellaneousField << - endl; - - gIndenter--; - - emptyHeader = false; - } - - if (emptyHeader) { - os << - " " << "nothing specified" << - endl << - endl; // JMI - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrHeader& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrHeaders.h b/src/lilypond/lpsrHeaders.h deleted file mode 100644 index f1ac4e211..000000000 --- a/src/lilypond/lpsrHeaders.h +++ /dev/null @@ -1,415 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrHeaders___ -#define ___lpsrHeaders___ - -#include "lpsrVarValAssocs.h" - -#include "lilypondOah.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrHeader : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrHeader ( - int inputLineNumber); - - virtual ~lpsrHeader (); - - public: - - // set and get - // ------------------------------------------------------ - - // MusicXML informations - - void setWorkNumber ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getWorkNumber () const - { return fWorkNumber; } - - void setWorkTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getWorkTitle () const - { return fWorkTitle; } - - void setMovementNumber ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getMovementNumber () const - { return fMovementNumber; } - - void setMovementTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getMovementTitle () const - { return fMovementTitle; } - - void setEncodingDate ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getEncodingDate () const - { return fEncodingDate; } - - void setScoreInstrument ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getScoreInstrument () const - { return fScoreInstrument; } - - void setMiscellaneousField ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getMiscellaneousField () const - { return fMiscellaneousField; } - - void setComposers ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValsListAssoc - getComposers () const - { return fComposers; } - - void setArrangers ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValsListAssoc - getArrangers () const - { return fArrangers; } - - void setLyricists ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValsListAssoc - getLyricists () const - { return fLyricists; } - - void setPoets ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValsListAssoc - getPoets () const - { return fPoets; } - - void setTranslators ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValsListAssoc - getTranslators () const - { return fTranslators; } - - void setRights ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValsListAssoc - getRights () const - { return fRights; } - - void setSoftwares ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValsListAssoc - getSoftwares () const - { return fSoftwares; } - - // LilyPond informations - - // centered - - void setLilypondDedication ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondDedication () const - { return fLilypondDedication; } - - void setLilypondPiece ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondPiece () const - { return fLilypondPiece; } - - void setLilypondOpus ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondOpus () const - { return fLilypondOpus; } - - void setLilypondTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondTitle () const - { return fLilypondTitle; } - - void setLilypondSubTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondSubTitle () const - { return fLilypondSubTitle; } - - void setLilypondSubSubTitle ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondSubSubTitle () const - { return fLilypondSubSubTitle; } - - // evenly spread on one line - // "instrument" also appears on following pages - - void setLilypondInstrument ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondInstrument () const - { return fLilypondInstrument; } - - // at opposite ends of the same line - - void setLilypondMeter ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondMeter () const - { return fLilypondMeter; } - - // centered at the bottom of the first page - - void setLilypondCopyright ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondCopyright () const - { return fLilypondCopyright; } - - // centered at the bottom of the last page - - void setLilypondTagline ( - int inputLineNumber, - string val, - msrFontStyleKind fontStyleKind, - msrFontWeightKind fontWeightKind); - - S_lpsrVarValAssoc getLilypondTagline () const - { return fLilypondTagline; } - - public: - - // public services - // ------------------------------------------------------ - - public: - - void addRights ( - int inputLineNumber, - string value); - - void addComposer ( - int inputLineNumber, - string value); - - void addArranger ( - int inputLineNumber, - string value); - - void addLyricist ( - int inputLineNumber, - string value); - - void addPoet ( - int inputLineNumber, - string value); - - void addTranslator ( - int inputLineNumber, - string value); - - void addArtist ( - int inputLineNumber, - string value); - - void addSoftware ( - int inputLineNumber, - string value); - - int maxLilypondVariablesNamesLength (); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // MusicXML informations - - S_lpsrVarValAssoc fWorkNumber; - S_lpsrVarValAssoc fWorkTitle; - S_lpsrVarValAssoc fMovementNumber; - S_lpsrVarValAssoc fMovementTitle; - - S_lpsrVarValsListAssoc - fRights; - - S_lpsrVarValsListAssoc - fComposers; - S_lpsrVarValsListAssoc - fArrangers; - S_lpsrVarValsListAssoc - fLyricists; - S_lpsrVarValsListAssoc - fPoets; - S_lpsrVarValsListAssoc - fTranslators; - S_lpsrVarValsListAssoc - fArtists; - - S_lpsrVarValsListAssoc - fSoftwares; - - S_lpsrVarValAssoc fEncodingDate; - - S_lpsrVarValAssoc fScoreInstrument; - - S_lpsrVarValAssoc fMiscellaneousField; - - // Lilypond informations - - // centered - S_lpsrVarValAssoc fLilypondDedication; - - S_lpsrVarValAssoc fLilypondPiece; - S_lpsrVarValAssoc fLilypondOpus; - - S_lpsrVarValAssoc fLilypondTitle; - S_lpsrVarValAssoc fLilypondSubTitle; - S_lpsrVarValAssoc fLilypondSubSubTitle; - - // evenly spread on one line - // "instrument" also appears on following pages - S_lpsrVarValAssoc fLilypondInstrument; - - // at opposite ends of the same line - S_lpsrVarValAssoc fLilypondMeter; - - // centered at the bottom of the first page - S_lpsrVarValAssoc fLilypondCopyright; - - // centered at the bottom of the last page - S_lpsrVarValAssoc fLilypondTagline; -}; -typedef SMARTP S_lpsrHeader; -EXP ostream& operator<< (ostream& os, const S_lpsrHeader& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrLayouts.cpp b/src/lilypond/lpsrLayouts.cpp deleted file mode 100644 index 5ac7882ea..000000000 --- a/src/lilypond/lpsrLayouts.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "lpsrLayouts.h" - -#include "lpsrScheme.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrLayout lpsrLayout::create ( - int inputLineNumber) -{ - lpsrLayout* o = - new lpsrLayout ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrLayout::lpsrLayout ( - int inputLineNumber) - : lpsrElement (inputLineNumber) -{ - fLayoutGlobalStaffSize = 20; // LilyPond default // JMI -} - -lpsrLayout::~lpsrLayout () -{} - -void lpsrLayout::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrLayout::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrLayout elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrLayout::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrLayout::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrLayout::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrLayout elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrLayout::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrLayout::browseData (basevisitor* v) -{ -/* JMI - int lilypondAssocs = flpsrVarValAssocsVector.size (); - - for (int i = 0; i < lilypondAssocs; i++ ) { - // browse the variable/value association - msrBrowser browser (v); - browser.browse (*flpsrVarValAssocsVector [i]); - } // for - - int schemeAssocs = fLpsrSchemeVariablesVector.size (); - - for (int i = 0; i < schemeAssocs; i++ ) { - // browse the Scheme variable/value association - msrBrowser browser (v); - browser.browse (*fLpsrSchemeVariablesVector [i]); - } // for - */ -} - -void lpsrLayout::print (ostream& os) const -{ - os << - "Layout" << - endl; - - gIndenter++; - - const int fieldWidth = 9; - - os << left << - setw (fieldWidth) << - "layoutGlobalStaffSize" << " : " << fLayoutGlobalStaffSize << - endl; - -/* JMI - int lilypondAssocs = fLpsrVarValAssocsVector.size (); - - for (int i = 0; i < lilypondAssocs; i++ ) { - os << fLpsrVarValAssocsVector [i]; - } // for - - int schemeAssocs = fLpsrSchemeVariablesVector.size (); - - for (int i = 0; i < schemeAssocs; i++ ) { - os << fLpsrSchemeVariablesVector[i]; - } // for -*/ - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrLayout& lay) -{ - lay->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrLayouts.h b/src/lilypond/lpsrLayouts.h deleted file mode 100644 index b2a4c9c9d..000000000 --- a/src/lilypond/lpsrLayouts.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrLayouts___ -#define ___lpsrLayouts___ - -#include "lpsrVarValAssocs.h" - -#include "lpsrScheme.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrLayout : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrLayout ( - int inputLineNumber); - - virtual ~lpsrLayout (); - - public: - - // set and get - // ------------------------------------------------------ - - float getLayoutGlobalStaffSize () const - { return fLayoutGlobalStaffSize; } - - void setLayoutGlobalStaffSize (float size) - { fLayoutGlobalStaffSize = size; } - - public: - - // services - // ------------------------------------------------------ - -/* JMI - void addLilypondVarValAssoc ( - S_lpsrVarValAssoc assoc) - { - fLpsrVarValAssocsVector.push_back (assoc); - } -*/ - - void addSchemeVariable ( - S_lpsrSchemeVariable assoc) - { - fLpsrSchemeVariablesVector.push_back (assoc); - } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - float fLayoutGlobalStaffSize; - -/* JMI - vector - fLpsrVarValAssocsVector; - */ - vector - fLpsrSchemeVariablesVector; -}; -typedef SMARTP S_lpsrLayout; -EXP ostream& operator<< (ostream& os, const S_lpsrLayout& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrLyrics.cpp b/src/lilypond/lpsrLyrics.cpp deleted file mode 100644 index 8aa4682c1..000000000 --- a/src/lilypond/lpsrLyrics.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrLyrics.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrNewLyricsBlock lpsrNewLyricsBlock::create ( - int inputLineNumber, - S_msrStanza stanza, - S_msrVoice voice) -{ - lpsrNewLyricsBlock* o = - new lpsrNewLyricsBlock ( - inputLineNumber, - stanza, voice); - assert(o!=0); - return o; -} - -lpsrNewLyricsBlock::lpsrNewLyricsBlock ( - int inputLineNumber, - S_msrStanza stanza, - S_msrVoice voice) - : lpsrElement (inputLineNumber) -{ - fStanza = stanza; - fVoice = voice; -} - -lpsrNewLyricsBlock::~lpsrNewLyricsBlock () -{} - -void lpsrNewLyricsBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewLyricsBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewLyricsBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewLyricsBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrNewLyricsBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewLyricsBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewLyricsBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewLyricsBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrNewLyricsBlock::browseData (basevisitor* v) -{} - -void lpsrNewLyricsBlock::print (ostream& os) const -{ - os << - "NewLyricsBlock" << " " << - fStanza->getStanzaName () << " " << - fVoice->getVoiceName () << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrNewLyricsBlock& nlc) -{ - nlc->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrLyrics.h b/src/lilypond/lpsrLyrics.h deleted file mode 100644 index b228d13d4..000000000 --- a/src/lilypond/lpsrLyrics.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrLyrics___ -#define ___lpsrLyrics___ - -#include "lpsrElements.h" - -#include "msr.h" - -#include "lpsrVariables.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrNewLyricsBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrStanza stanza, - S_msrVoice voice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrNewLyricsBlock ( - int inputLineNumber, - S_msrStanza stanza, - S_msrVoice voice); - - virtual ~lpsrNewLyricsBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrStanza getStanza () const { return fStanza; } - S_msrVoice getVoice () const { return fVoice; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrStanza fStanza; - S_msrVoice fVoice; -}; -typedef SMARTP S_lpsrNewLyricsBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrNewLyricsBlock& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrOah.cpp b/src/lilypond/lpsrOah.cpp deleted file mode 100644 index b56dc69f1..000000000 --- a/src/lilypond/lpsrOah.cpp +++ /dev/null @@ -1,2543 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // setw, setprecision, ... -#include -#include - -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrScoreOutputKindAtom lpsrScoreOutputKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lpsrScoreOutputKindVariable) -{ - lpsrScoreOutputKindAtom* o = new - lpsrScoreOutputKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lpsrScoreOutputKindVariable); - assert(o!=0); - return o; -} - -lpsrScoreOutputKindAtom::lpsrScoreOutputKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lpsrScoreOutputKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLpsrScoreOutputKindVariable ( - lpsrScoreOutputKindVariable) -{} - -lpsrScoreOutputKindAtom::~lpsrScoreOutputKindAtom () -{} - -S_oahValuedAtom lpsrScoreOutputKindAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lpsrScoreOutputKindAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lpsrScoreOutputKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrScoreOutputKindAtom'" << - endl; - } -#endif - - // theString contains the score output kind: - // is it in the score output kinds map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrScoreOutputKindAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gLpsrScoreOutputKindsMap.find ( - theString); - - if (it == gLpsrScoreOutputKindsMap.end ()) { - // no, score output kind is unknown in the map - - stringstream s; - - s << - "LPSR score output kind '" << theString << - "' is unknown" << - endl << - "The " << - gLpsrScoreOutputKindsMap.size () << - " known LPSR score output kinds are:" << - endl; - - gIndenter++; - - s << - existingLpsrScoreOutputKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setLpsrScoreOutputKindVariable ( - (*it).second); -} - -void lpsrScoreOutputKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrScoreOutputKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrScoreOutputKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrScoreOutputKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrScoreOutputKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrScoreOutputKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrScoreOutputKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrScoreOutputKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrScoreOutputKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrScoreOutputKindAtom::browseData ()" << - endl; - } -#endif -} - -string lpsrScoreOutputKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - lpsrScoreOutputKindAsString (fLpsrScoreOutputKindVariable); - - return s.str (); -} - -string lpsrScoreOutputKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - lpsrScoreOutputKindAsString (fLpsrScoreOutputKindVariable); - - return s.str (); -} - -void lpsrScoreOutputKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsLpsrScoreOutputKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fOptionsLpsrScoreOutputKindVariable" << " : \"" << - lpsrScoreOutputKindAsString ( - fLpsrScoreOutputKindVariable) << - "\"" << - endl; -} - -void lpsrScoreOutputKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - lpsrScoreOutputKindAsString ( - fLpsrScoreOutputKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrScoreOutputKindAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrPitchesLanguageAtom lpsrPitchesLanguageAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - lpsrPitchesLanguageKindVariable) -{ - lpsrPitchesLanguageAtom* o = new - lpsrPitchesLanguageAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lpsrPitchesLanguageKindVariable); - assert(o!=0); - return o; -} - -lpsrPitchesLanguageAtom::lpsrPitchesLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - lpsrPitchesLanguageKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fMsrQuarterTonesPitchesLanguageKindVariable ( - lpsrPitchesLanguageKindVariable) -{} - -lpsrPitchesLanguageAtom::~lpsrPitchesLanguageAtom () -{} - -S_oahValuedAtom lpsrPitchesLanguageAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lpsrPitchesLanguageAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lpsrPitchesLanguageAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrPitchesLanguageAtom'" << - endl; - } -#endif - - // theString contains the language name: - // is it in the pitches languages map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrPitchesLanguageAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gQuarterTonesPitchesLanguageKindsMap.find ( - theString); - - if (it == gQuarterTonesPitchesLanguageKindsMap.end ()) { - // no, language is unknown in the map - - stringstream s; - - s << - "LPSR pitches language '" << theString << - "' is unknown" << - endl << - "The " << - gQuarterTonesPitchesLanguageKindsMap.size () << - " known LPSR pitches languages are:" << - endl; - - gIndenter++; - - s << - existingQuarterTonesPitchesLanguageKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setMsrQuarterTonesPitchesLanguageKindVariable ( - (*it).second); -} - -void lpsrPitchesLanguageAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrPitchesLanguageAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPitchesLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrPitchesLanguageAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrPitchesLanguageAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrPitchesLanguageAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPitchesLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrPitchesLanguageAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrPitchesLanguageAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrPitchesLanguageAtom::browseData ()" << - endl; - } -#endif -} - -string lpsrPitchesLanguageAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable); - - return s.str (); -} - -string lpsrPitchesLanguageAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable); - - return s.str (); -} - -void lpsrPitchesLanguageAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsLpsrPitchesLanguageAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fOptionsLpsrPitchesLanguageVariable" << " : \"" << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable) << - "\"" << - endl; -} - -void lpsrPitchesLanguageAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrPitchesLanguageAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrChordsLanguageAtom lpsrChordsLanguageAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrChordsLanguageKind& - lpsrChordsLanguageKindVariable) -{ - lpsrChordsLanguageAtom* o = new - lpsrChordsLanguageAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lpsrChordsLanguageKindVariable); - assert(o!=0); - return o; -} - -lpsrChordsLanguageAtom::lpsrChordsLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrChordsLanguageKind& - lpsrChordsLanguageKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLpsrChordsLanguageKindVariable ( - lpsrChordsLanguageKindVariable) -{} - -lpsrChordsLanguageAtom::~lpsrChordsLanguageAtom () -{} - -S_oahValuedAtom lpsrChordsLanguageAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lpsrChordsLanguageAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lpsrChordsLanguageAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrChordsLanguageAtom'" << - endl; - } -#endif - - // theString contains the language name: - // is it in the chords languages map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrChordsLanguageAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gLpsrChordsLanguageKindsMap.find (theString); - - if (it == gLpsrChordsLanguageKindsMap.end ()) { - // no, language is unknown in the map - stringstream s; - - s << - "LPSR chords language '" << theString << - "' is unknown" << - endl << - "The " << - gLpsrChordsLanguageKindsMap.size () - 1 << - " known LPSR chords languages apart from the default Ignatzek are:" << - endl; - - gIndenter++; - - s << - existingLpsrChordsLanguageKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setLpsrChordsLanguageKindVariable ( - (*it).second); -} - -void lpsrChordsLanguageAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrChordsLanguageAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrChordsLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrChordsLanguageAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrChordsLanguageAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrChordsLanguageAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrChordsLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrChordsLanguageAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrChordsLanguageAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrChordsLanguageAtom::browseData ()" << - endl; - } -#endif -} - -string lpsrChordsLanguageAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - lpsrChordsLanguageKindAsString (fLpsrChordsLanguageKindVariable); - - return s.str (); -} - -string lpsrChordsLanguageAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - lpsrChordsLanguageKindAsString (fLpsrChordsLanguageKindVariable); - - return s.str (); -} - -void lpsrChordsLanguageAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsLpsrChordsLanguageAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fLpsrChordsLanguageKindVariable" << " : \"" << - lpsrChordsLanguageKindAsString ( - fLpsrChordsLanguageKindVariable) << - "\"" << - endl; -} - -void lpsrChordsLanguageAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - lpsrChordsLanguageKindAsString ( - fLpsrChordsLanguageKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrChordsLanguageAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrTransposeAtom lpsrTransposeAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - S_msrSemiTonesPitchAndOctave& - lpsrTransposeVariable) -{ - lpsrTransposeAtom* o = new - lpsrTransposeAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lpsrTransposeVariable); - assert(o!=0); - return o; -} - -lpsrTransposeAtom::lpsrTransposeAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - S_msrSemiTonesPitchAndOctave& - lpsrTransposeVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fMsrSemiTonesPitchAndOctaveVariable ( - lpsrTransposeVariable) -{} - -lpsrTransposeAtom::~lpsrTransposeAtom () -{} - -S_oahValuedAtom lpsrTransposeAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a lpsrTransposeAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void lpsrTransposeAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrTransposeAtom'" << - endl; - } -#endif - - // theString contains the language name: - // is it in the chords languages map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'lpsrTransposeAtom'" << - endl; - } -#endif - - // create the semitones pitch and octave from theString - S_msrSemiTonesPitchAndOctave - semiTonesPitchAndOctave = - msrSemiTonesPitchAndOctave::createFromString ( - K_NO_INPUT_LINE_NUMBER, - theString); - - // set the transpose atom variable value - setMsrSemiTonesPitchAndOctaveVariable ( - semiTonesPitchAndOctave); -} - -void lpsrTransposeAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrTransposeAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrTransposeAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrTransposeAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrTransposeAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrTransposeAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrTransposeAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrTransposeAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrTransposeAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrTransposeAtom::browseData ()" << - endl; - } -#endif -} - -string lpsrTransposeAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - fMsrSemiTonesPitchAndOctaveVariable->asString (); - - return s.str (); -} - -string lpsrTransposeAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - fMsrSemiTonesPitchAndOctaveVariable->asString (); - - return s.str (); -} - -void lpsrTransposeAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "lpsrTransposeAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void lpsrTransposeAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - if (fMsrSemiTonesPitchAndOctaveVariable) { - os << endl; - gIndenter++; - os << - fMsrSemiTonesPitchAndOctaveVariable; - gIndenter--; - } - else { - os << - "none" << - endl; - } -} - -ostream& operator<< (ostream& os, const S_lpsrTransposeAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_lpsrOah gLpsrOah; -S_lpsrOah gLpsrOahUserChoices; -S_lpsrOah gLpsrOahWithDetailedTrace; - -S_lpsrOah lpsrOah::create ( - S_oahHandler handlerUpLink) -{ - lpsrOah* o = new lpsrOah ( - handlerUpLink); - assert(o!=0); - return o; -} - -lpsrOah::lpsrOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "LPSR", - "hlpsr", "help-lpsr", -R"(These options control the way LPSR data is handled.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this options group to the options handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeLpsrOah (false); -} - -lpsrOah::~lpsrOah () -{} - -#ifdef TRACE_OAH -void lpsrOah::initializeLpsrTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Trace", - "hlpsrtrace", "help-lpsr-trace", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // trace- lpsr - - fTraceLpsr = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tlpsr", "trace-lpsr", -R"(Write a trace of the LPSR graphs visiting activity to standard error.)", - "traceLpsr", - fTraceLpsr)); - - // trace lilypond version - - fTraceLilypondVersion = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tlpv", "trace-lilypond-version", -R"(Write a trace of the LilyPond version to standard error.)", - "traceLilypondVersion", - fTraceLilypondVersion)); - - // trace lpsr visitors - - fTraceLpsrVisitors = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tlpsrv", "trace-lpsr-visitors", -R"(Write a trace of the LPSR graphs visiting activity to standard error.)", - "traceLpsrVisitors", - fTraceLpsrVisitors)); - - // trace lpsr blocks - - fTraceLpsrBlocks = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tlpsrb", "trace-lpsr-blocks", -R"(Write a trace of the LPSR blocks to standard error.)", - "traceLpsrBlocks", - fTraceLpsrBlocks)); - - // trace scheme functions - - fTraceSchemeFunctions = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tsf", "trace-scheme-functions", -R"(Write a trace of the activity regarding Scheme functions to standard error.)", - "traceSchemeFunctions", - fTraceSchemeFunctions)); -} -#endif - -void lpsrOah::initializeLpsrDisplayOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Display", - "hlpsrd", "help-lpsr-display", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // display LPSR - - fDisplayLpsr = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dlpsr", "display-lpsr", -R"(Write the contents of the LPSR data to standard error.)", - "displayLpsr", - fDisplayLpsr)); -} - -void lpsrOah::initializeLpsrScoreOutputOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "LilyPond score output", - "hlpso", "help-lilypond-score-output", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // LilyPond version - - string lilyPondVersionDefaultValue = "2.19.83"; - - fLilyPondVersion = lilyPondVersionDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "lpv", "lilypond-version", - replaceSubstringInString ( -R"(Set the LilyPond '\version' to STRING in the LilyPond code. -The default is 'DEFAULT_VALUE'.)", - "DEFAULT_VALUE", - lilyPondVersionDefaultValue), - "STRING", - "lilyPondVersion", - fLilyPondVersion)); - - // LPSR score output kind - - const lpsrScoreOutputKind - lpsrScoreOutputKindDefaultValue = - kScoreOnly; // default value - - fScoreOutputKind = lpsrScoreOutputKindDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - lpsrScoreOutputKindAtom::create ( - "lpsok", "lpsr-score-output-kind", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(Use OUTPUT_KIND to create the LPSR blocks, -as well as in the generated LilyPond code. -The NUMBER LilyPond output kinds available are: - OUTPUT_KINDS. -'-one-file' means that LilyPond will produce a single file containing all the scores and/or parts. -Otherwise, one file will be generated for each score and/or part. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gLpsrScoreOutputKindsMap.size ())), - "OUTPUT_KINDS", - existingLpsrScoreOutputKinds (K_NAMES_LIST_MAX_LENGTH)), - "DEFAULT_VALUE", - lpsrScoreOutputKindAsString ( - lpsrScoreOutputKindDefaultValue)), - "OUTPUT_KIND", - "scoreOutputKind", - fScoreOutputKind)); -} - -void lpsrOah::initializeLpsrGlobalStaffSizeOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Global staff size", - "hlpsrgss", "help-lpsr-gss", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // global staff size - - fStaffGlobalSizeDefaultValue = 20; // LilyPond default - fGlobalStaffSize = fStaffGlobalSizeDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - oahFloatAtom::create ( - "gss", "global-staff-size", - replaceSubstringInString ( -R"(Set the LilyPond '#(set-global-staff-size ...)' to FLOAT in the LilyPond code. -FLOAT should be a floating point or integer number. -The default is 'DEFAULT_VALUE'.)", - "DEFAULT_VALUE", - to_string (fStaffGlobalSizeDefaultValue)), - "FLOAT", - "globalStaffSize", - fGlobalStaffSize)); -} - -void lpsrOah::initializeLpsrPaperOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Paper", - "hlpsrpaper", "help-lpsr-paper", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // length unit kind - - fLengthUnitKindDefaultValue = kMillimeterUnit; // default value; - fLengthUnitKind = fLengthUnitKindDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - oahLengthUnitKindAtom::create ( - "length-unit", "", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(Set the LilyPond length variables unit to UNIT in the forthcoming options. -The NUMBER LilyPond length variables units available are: -LENTGTH_UNITS. -This option should precede options that set paper size and indents -if they don't specify a unit. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gMsrLengthUnitKindsMap.size ())), - "LENTGTH_UNITS", - gIndenter.indentMultiLineString ( - existingMsrLengthUnitKinds (K_NAMES_LIST_MAX_LENGTH))), - "DEFAULT_VALUE", - msrLengthUnitKindAsString ( - fLengthUnitKindDefaultValue)), - "UNIT", - "lengthUnitKind", - fLengthUnitKind)); - - // paper height - - fPaperHeight.setLengthUnitKind (kMillimeterUnit); - fPaperHeight.setLengthValue (297); - - subGroup-> - appendAtomToSubGroup ( - oahLengthAtom::create ( - "paper-height", "", -R"(Set the LilyPond 'paper-height' paper variable to HEIGHT in the LilyPond code. -HEIGHT should be a positive floating point or integer number, -immediately followed by a unit name, i.e. 'in', 'mm' or 'cm'. -The default value is 210 mm (A4 format).)", - "HEIGHT", - "paperHeight", - fPaperHeight)); - - // paper width - - fPaperWidth.setLengthUnitKind (kMillimeterUnit); - fPaperWidth.setLengthValue (210); - - subGroup-> - appendAtomToSubGroup ( - oahLengthAtom::create ( - "paper-width", "", -R"(Set the LilyPond 'paper-width' paper variable to WIDTH in the LilyPond code. -WIDTH should be a positive floating point or integer number, -immediately followed by a unit name, i.e. 'in', 'mm' or 'cm'. -The default value is 297 mm (A4 format).)", - "WIDTH", - "paperWidth", - fPaperWidth)); - - // fPaperHorizontalShift is 0.0 mm by default - - subGroup-> - appendAtomToSubGroup ( - oahLengthAtom::create ( - "hshift", "horizontal-shift", -R"(Set the LilyPond 'horizontal-shift' paper variable to SHIFT in the LilyPond code. -SHIFT should be a floating point or integer number, -immediately followed by a unit name, i.e. 'in', 'mm' or 'cm'. -The default value is 0.0 mm.)", - "SHIFT", - "paperHorizontalShift", - fPaperHorizontalShift)); - - // fPaperIndent is 0.0 mm by default - - subGroup-> - appendAtomToSubGroup ( - oahLengthAtom::create ( - "indent", "", -R"(Set the LilyPond 'indent' paper variable to INDENT in the LilyPond code. -INDENT should be a floating point or integer number, -immediately followed by a unit name, i.e. 'in', 'mm' or 'cm'. -The default value is 0.0 mm.)", - "INDENT", - "paperIndent", - fPaperIndent)); - - // short indent - - // fPaperShortIndent is 0.0 mm by default - - subGroup-> - appendAtomToSubGroup ( - oahLengthAtom::create ( - "short-indent", "", -R"(Set the LilyPond 'short-indent' paper variable to SHORT_INDENT in the LilyPond code. -SHORT_INDENT should be a floating point or integer number, -immediately followed by a unit name, i.e. 'in', 'mm' or 'cm'. -The default value is 0.0 mm.)", - "SHORT_INDENT", - "paperShortIndent", - fPaperShortIndent)); - - // fMarkupSystemSpacingPadding is 0.0 mm by default - - subGroup-> - appendAtomToSubGroup ( - oahLengthAtom::create ( - "mssp", "markup-system-spacing.padding", -R"(Set the LilyPond 'markup-system-spacing.padding' paper variable to PADDING in the LilyPond code. -PADDING should be a floating point or integer number, -immediately followed by a unit name, i.e. 'in', 'mm' or 'cm'. -LilyPond's default value is 0.0 mm.)", - "INDENT", - "markupSystemSpacingPadding", - fMarkupSystemSpacingPadding)); - - // ragged bottom - - fRaggedBottom = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ragged-bottom", "", -R"(Set the LilyPond 'ragged-bottom' paper variable to '##f' in the LilyPond code. -LilyPond's default value is '##t'.)", - "raggedBottom", - fRaggedBottom)); - - // ragged last bottom - - fRaggedLastBottom = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ragged-last-bottom", "", -R"(Set the LilyPond 'ragged-last-bottom' paper variable to '##f' in the LilyPond code. -LilyPond's default value is '##t'.)", - "raggedLastBottom", - fRaggedLastBottom)); - -/* LPSR or LilyPond option?" - // tagline - - fTagline = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tagline", "", -R"(Set the LilyPond 'tagline' paper variable to '##f' in the LilyPond code. -LilyPond's default value is '##t'.)", - "tagline", - fTagline)); -*/ - - // page count - - fPageCount = -1; - - subGroup-> - appendAtomToSubGroup ( - oahIntegerAtom::create ( - "page-count", "", -R"(Set the LilyPond 'page-count' paper variable to PAGE_COUNT in the LilyPond code. -PAGE_COUNT should be a positive integer. -By default, this is left to LilyPond'.)", - "PAGE_COUNT", - "pageCount", - fPageCount)); - - // system count - - fSystemCount = -1; - - subGroup-> - appendAtomToSubGroup ( - oahIntegerAtom::create ( - "system-count", "", -R"(Set the LilyPond 'system-count' paper variable to SYSTEM_COUNT in the LilyPond code. -SYSTEM_COUNT should be a positive integer. -By default, this is left to LilyPond'.)", - "SYSTEM_COUNT", - "systemCount", - fSystemCount)); -} - -void lpsrOah::initializeLpsrMeasuresOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Measures", - "hlpsrmeasures", "help-lpsr-measures", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // replicate empty measure - - fReplicateEmptyMeasureNumber = ""; - fReplicateEmptyMeasureReplicas = 0; - - subGroup-> - appendAtomToSubGroup ( - oahStringAndIntegerAtom::create ( - "rem", "replicate-empty-measure", -R"###(Replicate an empty mesure, adding empty others according to SPECIFICATION. -SPECIFICATION should be of the form 'MEASURE_NUMBER REPLICATES', -where MEASURE_NUMBER is a string, and REPLICATES is the number -of empty measures to add after measure MEASURE_NUMBER. -MEASURE_NUMBER should be the number of an existing, empty measure, -and REPLICATES should be at least 1, , such as '17 3'. -This comes in handly when MusicXML data obtained by scanning contains -a single empty measure when there were several in the original score. -This option can be used any number of times.)###", - "SPECIFICATION", - "replicateEmptyMeasureNumber", - fReplicateEmptyMeasureNumber, - "replicateEmptyMeasureReplicas", - fReplicateEmptyMeasureReplicas)); -} - -void lpsrOah::initializeLpsrWordsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Words", - "hlpsrwords", "help-lpsr-words", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // convert words to tempo - - fConvertWordsToTempo = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "cwtt", "convert-words-to-tempo", -R"(Convert words to tempo. -This may come in handy when MusicXML data has been obtained from scanned instrumental music images.)", - "convertWordsToTempo", - fConvertWordsToTempo)); - - // add words from the lyrics - - fAddWordsFromTheLyrics = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "awftl", "add-words-from-the-lyrics", -R"(Add words with the lyrics contents, keeping the latter untouched. -This may come in handy when MusicXML data has been obtained from scanned images.)", - "addWordsFromTheLyrics", - fAddWordsFromTheLyrics)); - - // convert tempos to rehearsal marks - - fConvertTemposToRehearsalMarks = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "cttrm", "convert-tempos-to-rehearsal-marks", -R"(Convert tempos to rehearsal marks. -This may come in handy when MusicXML data has been obtained from scanned instrumental music images.)", - "convertTemposToRehearsalMarks", - fConvertTemposToRehearsalMarks)); - - // convert words to rehearsal marks - - fConvertWordsToRehearsalMarks = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "cwtrm", "convert-words-to-rehearsal-marks", -R"(Convert words to rehearsal marks. -This may come in handy when MusicXML data has been obtained from scanned instrumental music images.)", - "convertWordsToRehearsalMarks", - fConvertWordsToRehearsalMarks)); -} - -void lpsrOah::initializeLpsrLanguagesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Languages", - "hlpsrl", "help-lpsr-languages", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // lpsr pitches language - - if (! setLpsrQuarterTonesPitchesLanguage ("nederlands")) { - stringstream s; - - s << - "INTERNAL INITIALIZATION ERROR: " - "LPSR pitches language 'nederlands' is unknown" << - endl << - "The " << - gQuarterTonesPitchesLanguageKindsMap.size () << - " known LPSR pitches languages are:" << - endl; - - gIndenter++; - - s << - existingQuarterTonesPitchesLanguageKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - const msrQuarterTonesPitchesLanguageKind - msrQuarterTonesPitchesLanguageKindDefaultValue = - fLpsrQuarterTonesPitchesLanguageKind; - - fLpsrQuarterTonesPitchesLanguageKind = - msrQuarterTonesPitchesLanguageKindDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - lpsrPitchesLanguageAtom::create ( - "lppl", "lpsr-pitches-language", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(Use LANGUAGE to display note pitches in the LPSR logs and views, -as well as in the generated LilyPond code. -The NUMBER LilyPond pitches languages available are: -PITCHES_LANGUAGES. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gQuarterTonesPitchesLanguageKindsMap.size ())), - "PITCHES_LANGUAGES", - gIndenter.indentMultiLineString ( - existingQuarterTonesPitchesLanguageKinds (K_NAMES_LIST_MAX_LENGTH))), - "DEFAULT_VALUE", - msrQuarterTonesPitchesLanguageKindAsString ( - msrQuarterTonesPitchesLanguageKindDefaultValue)), - "LANGUAGE", - "lpsrPitchesLanguage", - fLpsrQuarterTonesPitchesLanguageKind)); - - // lpsr chords language - - const lpsrChordsLanguageKind - lpsrChordsLanguageKindDefaultValue = - k_IgnatzekChords; // LilyPond default - - fLpsrChordsLanguageKind = - lpsrChordsLanguageKindDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - lpsrChordsLanguageAtom::create ( - "lpcl", "lpsr-chords-language", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(Use LANGUAGE to display chord names, their root and bass notes, -in the LPSR logs and views and the generated LilyPond code. -The NUMBER LilyPond pitches languages available are: -CHORDS_LANGUAGES. -'ignatzek' is Ignatzek's jazz-like, english naming used by LilyPond by default. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gLpsrChordsLanguageKindsMap.size ())), - "CHORDS_LANGUAGES", - gIndenter.indentMultiLineString ( - existingLpsrChordsLanguageKinds (K_NAMES_LIST_MAX_LENGTH))), - "DEFAULT_VALUE", - lpsrChordsLanguageKindAsString ( - lpsrChordsLanguageKindDefaultValue)), - "LANGUAGE", - "lpsr-chords-language", - fLpsrChordsLanguageKind)); -} - -void lpsrOah::initializeLpsrTransposeOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Transpose", - "hlpsrt", "help-lpsr-transpose", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // lpsr transpose - - subGroup-> - appendAtomToSubGroup ( - lpsrTransposeAtom::create ( - "lpt", "lpsr-transpose", -R"(Use TRANSPOSITION to tranpose in the LPSR data, -thus as in the generated LilyPond code as well. -TRANSPOSITION should contain a diatonic pitch, followed if needed -by a sequence of ',' or '\'' octave indications. -Such indications cannot be mixed. -For example, 'a', 'f' and 'bes,' can be used respectively -for instruments in 'a', 'f' and B flat respectively)", - "TRANSPOSITION", - "lpsrTranspose", - fTransposeSemiTonesPitchAndOctave)); -} - -void lpsrOah::initializeLpsrExitAfterSomePassesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Exit after some passes", - "hlexit", "help-lpsr-exit", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // exit after pass 3 - - fExit3 = boolOptionsInitialValue; - - S_oahBooleanAtom - exit3OahBooleanAtom = - oahBooleanAtom::create ( - "e3", "exit-3", -R"(Exit after pass 3, i.e. after conversion -of the MSR to LPSR.)", - "exit3", - fExit3); - - subGroup-> - appendAtomToSubGroup ( - exit3OahBooleanAtom); -} - -void lpsrOah::initializeLpsrOah ( - bool boolOptionsInitialValue) -{ -#ifdef TRACE_OAH - // trace and display - // -------------------------------------- - initializeLpsrTraceOah ( - boolOptionsInitialValue); -#endif - - // display - // -------------------------------------- - initializeLpsrDisplayOptions ( - boolOptionsInitialValue); - - // LilyPond score output - // -------------------------------------- - initializeLpsrScoreOutputOptions ( - boolOptionsInitialValue); - - // global staff size - // -------------------------------------- - initializeLpsrGlobalStaffSizeOptions ( - boolOptionsInitialValue); - - // paper - // -------------------------------------- - initializeLpsrPaperOptions ( - boolOptionsInitialValue); - - // measures - // -------------------------------------- - initializeLpsrMeasuresOptions ( - boolOptionsInitialValue); - - // words - // -------------------------------------- - initializeLpsrWordsOptions ( - boolOptionsInitialValue); - - // languages - // -------------------------------------- - initializeLpsrLanguagesOptions ( - boolOptionsInitialValue); - - // transpose - // -------------------------------------- - initializeLpsrTransposeOptions ( - boolOptionsInitialValue); - - // exit after some passes - // -------------------------------------- - initializeLpsrExitAfterSomePassesOptions ( - boolOptionsInitialValue); -} - -S_lpsrOah lpsrOah::createCloneWithDetailedTrace () -{ - S_lpsrOah - clone = - lpsrOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the options handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - // trace - // -------------------------------------- - -#ifdef TRACE_OAH - clone->fTraceLpsr = - true; - - clone->fTraceLilypondVersion = - true; - - clone->fTraceLpsrVisitors = - true; - - clone->fTraceLpsrBlocks = - true; - - clone->fTraceSchemeFunctions = - true; -#endif - - // display - // -------------------------------------- - - clone->fDisplayLpsr = - true; - - // LilyPond version - // -------------------------------------- - - clone->fLilyPondVersion = - fLilyPondVersion; - - // LilyPond output kind - // -------------------------------------- - - clone->fScoreOutputKind = - fScoreOutputKind; - - // global staff size - // -------------------------------------- - - clone->fGlobalStaffSize = - fGlobalStaffSize; - - // paper - // -------------------------------------- - - clone->fLengthUnitKind = - fLengthUnitKind; - clone->fLengthUnitKindDefaultValue = - fLengthUnitKindDefaultValue; - - clone->fPaperHeight = - fPaperHeight; - clone->fPaperWidth = - fPaperWidth; - - clone->fPaperIndent = - fPaperIndent; - clone->fPaperShortIndent = - fPaperShortIndent; - - clone->fMarkupSystemSpacingPadding = - fMarkupSystemSpacingPadding; - - clone->fRaggedBottom = - fRaggedBottom; - clone->fRaggedLastBottom = - fRaggedLastBottom; - - clone->fTagline = - fTagline; - - clone->fPageCount = - fPageCount; - clone->fSystemCount = - fSystemCount; - - // measures - // -------------------------------------- - - clone->fReplicateEmptyMeasureNumber = - fReplicateEmptyMeasureNumber; - clone->fReplicateEmptyMeasureReplicas = - fReplicateEmptyMeasureReplicas; - - clone->fAddEmptyMeasuresStringToIntMap = - fAddEmptyMeasuresStringToIntMap; - - // words - // -------------------------------------- - - clone->fConvertWordsToTempo = - true; - clone->fAddWordsFromTheLyrics = - true; - - // rehearsal marks - clone->fConvertTemposToRehearsalMarks = - true; - clone->fConvertWordsToRehearsalMarks = - true; - - // languages - // -------------------------------------- - - clone->fLpsrQuarterTonesPitchesLanguageKind = - fLpsrQuarterTonesPitchesLanguageKind; - - clone->fLpsrChordsLanguageKind = - fLpsrChordsLanguageKind; - - // transpose - // -------------------------------------- - - clone->fTransposeSemiTonesPitchAndOctave = - fTransposeSemiTonesPitchAndOctave; - - return clone; -} - -//______________________________________________________________________________ -bool lpsrOah::setLpsrQuarterTonesPitchesLanguage (string language) -{ - // is language in the note names languages map? - map::const_iterator - it = - gQuarterTonesPitchesLanguageKindsMap.find (language); - - if (it == gQuarterTonesPitchesLanguageKindsMap.end ()) { - // no, language is unknown in the map - return false; - } - - fLpsrQuarterTonesPitchesLanguageKind = (*it).second; - - return true; -} - -//______________________________________________________________________________ -bool lpsrOah::setLpsrChordsLanguage (string language) -{ - // is language in the chords languages map? - map::const_iterator - it = - gLpsrChordsLanguageKindsMap.find (language); - - if (it == gLpsrChordsLanguageKindsMap.end ()) { - // no, language is unknown in the map - return false; - } - - fLpsrChordsLanguageKind = (*it).second; - - return true; -} - -//______________________________________________________________________________ -void lpsrOah::enforceQuietness () -{ -#ifdef TRACE_OAH - fTraceLpsr = false; - fTraceLilypondVersion = false; - fTraceLpsrVisitors = false; - fTraceLpsrBlocks = false; - fTraceSchemeFunctions = false; -#endif - - fDisplayLpsr = false; -} - -//______________________________________________________________________________ -void lpsrOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void lpsrOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching lpsrOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> lpsrOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void lpsrOah::printLpsrOahValues (int fieldWidth) -{ - gLogOstream << - "The LPSR options are:" << - endl; - - gIndenter++; - -#ifdef TRACE_OAH - // trace - // -------------------------------------- - gLogOstream << - "Trace:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "traceLpsr" << " : " << - booleanAsString (fTraceLpsr) << - endl << - - setw (fieldWidth) << "traceLilypondVersion" << " : " << - booleanAsString (fTraceLilypondVersion) << - endl << - - setw (fieldWidth) << "traceLpsrVisitors" << " : " << - booleanAsString (fTraceLpsrVisitors) << - endl << - - setw (fieldWidth) << "traceLpsrBlocks" << " : " << - booleanAsString (fTraceLpsrBlocks) << - endl << - - setw (fieldWidth) << "traceSchemeFunctions" << " : " << - booleanAsString (fTraceSchemeFunctions) << - endl; - - gIndenter--; -#endif - - // display - // -------------------------------------- - gLogOstream << - "Display:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "displayLpsr" << " : " << - booleanAsString (fDisplayLpsr) << - endl; - - gIndenter--; - - // LilyPond version - // -------------------------------------- - - gLogOstream << - "LilyPond version:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "lilyPondVersion" << " : " << - fLilyPondVersion << - endl; - - gIndenter--; - - // LilyPond output kind - // -------------------------------------- - - gLogOstream << - "LilyPond output kind:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "scoreOutputKind" << " : " << - lpsrScoreOutputKindAsString (fScoreOutputKind) << - endl; - - gIndenter--; - - // global staff size - // -------------------------------------- - - gLogOstream << - "Global staff size:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "fGlobalStaffSize" << " : " << - fGlobalStaffSize << - endl; - - gIndenter--; - - // paper - // -------------------------------------- - - gLogOstream << - "Paper:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "lengthUnitKind" << " : " << - msrLengthUnitKindAsString (fLengthUnitKind) << - endl << - - setw (fieldWidth) << "paperHeight" << " : " << - fPaperHeight.asString () << - endl << - setw (fieldWidth) << "paperWidth" << " : " << - fPaperWidth.asString () << - endl << - - setw (fieldWidth) << "paperIndent" << " : " << - fPaperIndent.asString () << - endl << - setw (fieldWidth) << "paperShortIndent" << " : " << - fPaperShortIndent.asString () << - endl << - - setw (fieldWidth) << "markupSystemPpacingPadding" << " : " << - fMarkupSystemSpacingPadding.asString () << - endl << - - setw (fieldWidth) << "raggedBottom" << " : " << - booleanAsString (fRaggedBottom) << - endl << - setw (fieldWidth) << "raggedLastBottom" << " : " << - booleanAsString (fRaggedLastBottom) << - endl << - - setw (fieldWidth) << "tagline" << " : " << - booleanAsString (fTagline) << - endl << - - setw (fieldWidth) << "pageCount" << " : " << - fPageCount << - endl << - setw (fieldWidth) << "systemCount" << " : " << - fSystemCount << - endl; - - gIndenter--; - - // measures - // -------------------------------------- - - gLogOstream << - "Measures:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "resetMeasureElementMeasureNumberMap" << " : "; - if (! fAddEmptyMeasuresStringToIntMap.size ()) { - gLogOstream << "empty"; - } - else { - map::const_iterator - iBegin = fAddEmptyMeasuresStringToIntMap.begin (), - iEnd = fAddEmptyMeasuresStringToIntMap.end (), - i = iBegin; - for ( ; ; ) { - gLogOstream << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - gLogOstream << ","; - } // for - } - gLogOstream << endl; - - gIndenter--; - - // words - // -------------------------------------- - - gLogOstream << - "Words:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "convertWordsToTempo" << " : " << - booleanAsString (fConvertWordsToTempo) << - endl << - setw (fieldWidth) << "addWordsFromTheLyrics" << " : " << - booleanAsString (fAddWordsFromTheLyrics) << - endl; - - gIndenter--; - - // rehearsal marks - // -------------------------------------- - - gLogOstream << - "Rehearsal marks:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "convertTemposToRehearsalMarks" << " : " << - booleanAsString (fConvertTemposToRehearsalMarks) << - endl << - setw (fieldWidth) << "convertWordsToRehearsalMarks" << " : " << - booleanAsString (fConvertWordsToRehearsalMarks) << - endl; - - gIndenter--; - - // languages - // -------------------------------------- - - gLogOstream << - "Languages:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "lpsrQuarterTonesPitchesLanguage" << " : \"" << - msrQuarterTonesPitchesLanguageKindAsString ( - fLpsrQuarterTonesPitchesLanguageKind) << - "\"" << - endl << - - setw (fieldWidth) << "lpsrChordsLanguage" << " : \"" << - lpsrChordsLanguageKindAsString ( - fLpsrChordsLanguageKind) << - "\"" << - endl; - - gIndenter--; - - // transpose - // -------------------------------------- - - gLogOstream << - "Transpose:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "transposeSemiTonesPitchAndOctave" << " : "; - - if (fTransposeSemiTonesPitchAndOctave) { - gLogOstream << - fTransposeSemiTonesPitchAndOctave->asString (); - } - else { - gLogOstream << - "none"; - } - gLogOstream << endl; - - gIndenter--; - - - gIndenter--; -} - -void lpsrOah::crackLilypondVersionNumber ( - string theString, - int& generationNumber, - int& majorNumber, - int& minorNumber) -{ - // obtains the three numbers in "2.19.83" or "2.20" for example - - // decipher theString with a three-number regular expression - string regularExpression ( - "([[:digit:]]+)" - "." - "([[:digit:]]+)" - "." - "([[:digit:]]+)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLilypondVersion) { - gLogOstream << - "There are " << smSize << " matches" << - " for version string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl << - smSize << " elements: "; - - for (unsigned i = 0; i < smSize; ++i) { - gLogOstream << - "[" << sm [i] << "] "; - } // for - - gLogOstream << endl; - } -#endif - - if (smSize == 4) { - // found an n.x.y specification - string - generationNumberValue = sm [1], - majorNumberValue = sm [2], - minorNumberValue = sm [3]; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLilypondVersion) { - gLogOstream << - "--> generationNumberValue = \"" << generationNumberValue << "\", " << - "--> majorNumberValue = \"" << majorNumberValue << "\", " << - "--> minorNumberValue = \"" << minorNumberValue << "\"" << - endl; - } -#endif - - generationNumber = stoi (generationNumberValue); - majorNumber = stoi (majorNumberValue); - minorNumber = stoi (minorNumberValue); - } - - else { - // decipher theString with a two-number regular expression - string regularExpression ( - "([[:digit:]]+)" - "." - "([[:digit:]]+)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLilypondVersion) { - gLogOstream << - "There are " << smSize << " matches" << - " for chord details string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl << - smSize << " elements: "; - - for (unsigned i = 0; i < smSize; ++i) { - gLogOstream << - "[" << sm [i] << "] "; - } // for - - gLogOstream << endl; - } -#endif - - if (smSize == 3) { - // found an n.x specification - // assume implicit 0 minor number - string - generationNumberValue = sm [1], - majorNumberValue = sm [2]; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLilypondVersion) { - gLogOstream << - "--> generationNumberValue = \"" << generationNumberValue << "\", " << - "--> majorNumberValue = \"" << majorNumberValue << "\", " << - endl; - } -#endif - - generationNumber = stoi (generationNumberValue); - majorNumber = stoi (majorNumberValue); - minorNumber = 0; - } - - else { - stringstream s; - - s << - "version number argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - } -} - -bool lpsrOah::versionNumberGreaterThanOrEqualTo ( - string otherVersionNumber) -{ - bool result = false; - - int - lilyPondVersionGenerationNumber, - lilyPondVersionMajorNumber, - lilyPondVersionMinorNumber; - - crackLilypondVersionNumber ( - fLilyPondVersion, - lilyPondVersionGenerationNumber, - lilyPondVersionMajorNumber, - lilyPondVersionMinorNumber); - - int - otherVersionNumbeGenerationNumber, - otherVersionNumbeMajorNumber, - otherVersionNumbeMinorNumber; - - crackLilypondVersionNumber ( - otherVersionNumber, - otherVersionNumbeGenerationNumber, - otherVersionNumbeMajorNumber, - otherVersionNumbeMinorNumber); - - if (otherVersionNumbeGenerationNumber != 2) { - gLogOstream << - "Using verstion \"" << - otherVersionNumbeGenerationNumber << ".x.y\" " << - "is probably not such a good idea" << - endl; - } - - if (otherVersionNumbeMajorNumber < 19) { - gLogOstream << - "Using a verstion older than \"" << - otherVersionNumbeGenerationNumber << ".19.y\" " << - "is not a good idea: the generated LilyPond code uses features introduced in the latter" << - endl; - } - - if (lilyPondVersionGenerationNumber < otherVersionNumbeGenerationNumber) { - result = false; - } - else if (lilyPondVersionGenerationNumber > otherVersionNumbeGenerationNumber) { - result = true; - } - else { - // same generation number - if (lilyPondVersionMajorNumber < otherVersionNumbeMajorNumber) { - result = false; - } - else if (lilyPondVersionMajorNumber > otherVersionNumbeMajorNumber) { - result = true; - } - else { - // same major number - result = - lilyPondVersionMinorNumber >= otherVersionNumbeMinorNumber; - } - } - - return result; -} - -ostream& operator<< (ostream& os, const S_lpsrOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeLpsrOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing LPSR options handling" << - endl; - } -#endif - - // create the options variables - // ------------------------------------------------------ - - gLpsrOahUserChoices = lpsrOah::create ( - handler); - assert(gLpsrOahUserChoices != 0); - - gLpsrOah = - gLpsrOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ - -/* JMI - gLpsrOahWithDetailedTrace = - gLpsrOah-> - createCloneWithDetailedTrace (); - */ -} - - -} diff --git a/src/lilypond/lpsrOah.h b/src/lilypond/lpsrOah.h deleted file mode 100644 index b329fc3bc..000000000 --- a/src/lilypond/lpsrOah.h +++ /dev/null @@ -1,633 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrOah___ -#define ___lpsrOah___ - -#include "lpsrBasicTypes.h" - -#include "oahBasicTypes.h" - -#include "oahBasicTypes.h" - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrScoreOutputKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lpsrScoreOutputKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrScoreOutputKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrScoreOutputKind& lpsrScoreOutputKindVariable); - - virtual ~lpsrScoreOutputKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setLpsrScoreOutputKindVariable ( - lpsrScoreOutputKind value) - { fLpsrScoreOutputKindVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrScoreOutputKind& fLpsrScoreOutputKindVariable; -}; -typedef SMARTP S_lpsrScoreOutputKindAtom; -EXP ostream& operator<< (ostream& os, const S_lpsrScoreOutputKindAtom& elt); - -//______________________________________________________________________________ -class lpsrPitchesLanguageAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - lpsrPitchesLanguageKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrPitchesLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - lpsrPitchesLanguageKindVariable); - - virtual ~lpsrPitchesLanguageAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setMsrQuarterTonesPitchesLanguageKindVariable ( - msrQuarterTonesPitchesLanguageKind value) - { - fMsrQuarterTonesPitchesLanguageKindVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - msrQuarterTonesPitchesLanguageKind& - fMsrQuarterTonesPitchesLanguageKindVariable; -}; -typedef SMARTP S_lpsrPitchesLanguageAtom; -EXP ostream& operator<< (ostream& os, const S_lpsrPitchesLanguageAtom& elt); - -//______________________________________________________________________________ -class lpsrChordsLanguageAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrChordsLanguageKind& - lpsrChordsLanguageKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrChordsLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - lpsrChordsLanguageKind& - lpsrChordsLanguageKindVariable); - - virtual ~lpsrChordsLanguageAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setLpsrChordsLanguageKindVariable ( - lpsrChordsLanguageKind value) - { - fLpsrChordsLanguageKindVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrChordsLanguageKind& - fLpsrChordsLanguageKindVariable; -}; -typedef SMARTP S_lpsrChordsLanguageAtom; -EXP ostream& operator<< (ostream& os, const S_lpsrChordsLanguageAtom& elt); - -//______________________________________________________________________________ -class lpsrTransposeAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - S_msrSemiTonesPitchAndOctave& - lpsrTransposeVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrTransposeAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - S_msrSemiTonesPitchAndOctave& - lpsrTransposeVariable); - - virtual ~lpsrTransposeAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setMsrSemiTonesPitchAndOctaveVariable ( - S_msrSemiTonesPitchAndOctave value) - { - fMsrSemiTonesPitchAndOctaveVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrSemiTonesPitchAndOctave& - fMsrSemiTonesPitchAndOctaveVariable; -}; -typedef SMARTP S_lpsrTransposeAtom; -EXP ostream& operator<< (ostream& os, const S_lpsrTransposeAtom& elt); - -//______________________________________________________________________________ -class lpsrOah : public oahGroup -{ - public: - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithDetailedTrace (); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeLpsrOah ( - bool boolOptionsInitialValue); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrOah ( - S_oahHandler handlerUpLink); - - virtual ~lpsrOah (); - - // set and get - // ------------------------------------------------------ - - bool setLpsrQuarterTonesPitchesLanguage ( - string language); - - bool setLpsrChordsLanguage ( - string language); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - void crackLilypondVersionNumber ( - string theString, - int& generationNumber, - int& majorNumber, - int& minorNumber); - - bool versionNumberGreaterThanOrEqualTo ( - string otherVersionNumber); - - private: - - // private - // ------------------------------------------------------ - -#ifdef TRACE_OAH - void initializeLpsrTraceOah ( - bool boolOptionsInitialValue); -#endif - - void initializeLpsrDisplayOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrScoreOutputOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrGlobalStaffSizeOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrPaperOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrMeasuresOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrWordsOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrLanguagesOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrTransposeOptions ( - bool boolOptionsInitialValue); - - void initializeLpsrExitAfterSomePassesOptions ( - bool boolOptionsInitialValue); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printLpsrOahHelp (); - - void printLpsrOahValues (int fieldWidth); - - public: - - // trace - // -------------------------------------- - -#ifdef TRACE_OAH - bool fTraceLpsr; - - bool fTraceLilypondVersion; - - bool fTraceLpsrVisitors; - - bool fTraceLpsrBlocks; - - bool fTraceSchemeFunctions; -#endif - - // display - // -------------------------------------- - - bool fDisplayLpsr; - - // LilyPond version - // -------------------------------------- - - string fLilyPondVersion; - - // score output kind - // -------------------------------------- - - lpsrScoreOutputKind fScoreOutputKind; - - // global staff size - // -------------------------------------- - - float fGlobalStaffSize; - float fStaffGlobalSizeDefaultValue; - - // paper - // -------------------------------------- - - msrLengthUnitKind fLengthUnitKind; - msrLengthUnitKind fLengthUnitKindDefaultValue; - - msrLength fPaperHeight; - msrLength fPaperWidth; - - // indents - msrLength fPaperHorizontalShift; - msrLength fPaperIndent; - msrLength fPaperShortIndent; - - msrLength fMarkupSystemSpacingPadding; - - bool fRaggedBottom; - bool fRaggedLastBottom; - - bool fTagline; - - int fPageCount; // negative if not specified - int fSystemCount; // negative if not specified - - - // measures - // -------------------------------------- - - // replicate empty measure JMI ??? - string fReplicateEmptyMeasureNumber; - int fReplicateEmptyMeasureReplicas; - - // add empty measures - map fAddEmptyMeasuresStringToIntMap; - - // words - // -------------------------------------- - - // convert words to tempo - bool fConvertWordsToTempo; - // add words from the lyrics - bool fAddWordsFromTheLyrics; - - // rehearsal marks - // -------------------------------------- - - // convert tempos to rehearsal marks - bool fConvertTemposToRehearsalMarks; - // convert words to rehearsal marks - bool fConvertWordsToRehearsalMarks; - - // languages - // -------------------------------------- - - msrQuarterTonesPitchesLanguageKind - fLpsrQuarterTonesPitchesLanguageKind; - - lpsrChordsLanguageKind - fLpsrChordsLanguageKind; - - // transpose - // -------------------------------------- - - S_msrSemiTonesPitchAndOctave - fTransposeSemiTonesPitchAndOctave; - - // exit after some passes - // -------------------------------------- - - bool fExit3; -}; -typedef SMARTP S_lpsrOah; -EXP ostream& operator<< (ostream& os, const S_lpsrOah& elt); - -EXP extern S_lpsrOah gLpsrOah; -EXP extern S_lpsrOah gLpsrOahUserChoices; -EXP extern S_lpsrOah gLpsrOahWithDetailedTrace; - -//______________________________________________________________________________ -EXP void initializeLpsrOahHandling ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/lpsrOah2ManPageGenerator.cpp b/src/lilypond/lpsrOah2ManPageGenerator.cpp deleted file mode 100644 index 2a407e4e2..000000000 --- a/src/lilypond/lpsrOah2ManPageGenerator.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "lpsrOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -lpsrOah2ManPageGenerator::lpsrOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -lpsrOah2ManPageGenerator::~lpsrOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void lpsrOah2ManPageGenerator::visitStart (S_lpsrScoreOutputKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lpsrScoreOutputKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lpsrOah2ManPageGenerator::visitEnd (S_lpsrScoreOutputKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lpsrScoreOutputKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsrOah2ManPageGenerator::visitStart (S_lpsrPitchesLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lpsrPitchesLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lpsrOah2ManPageGenerator::visitEnd (S_lpsrPitchesLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lpsrPitchesLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsrOah2ManPageGenerator::visitStart (S_lpsrChordsLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lpsrChordsLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lpsrOah2ManPageGenerator::visitEnd (S_lpsrChordsLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lpsrChordsLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void lpsrOah2ManPageGenerator::visitStart (S_lpsrTransposeAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting lpsrTransposeAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void lpsrOah2ManPageGenerator::visitEnd (S_lpsrTransposeAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting lpsrTransposeAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/lpsrOah2ManPageGenerator.h b/src/lilypond/lpsrOah2ManPageGenerator.h deleted file mode 100644 index d3448f83e..000000000 --- a/src/lilypond/lpsrOah2ManPageGenerator.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrOah2ManPageGenerator___ -#define ___lpsrOah2ManPageGenerator___ - -#include "lpsrOah.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class lpsrOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor, - - public visitor, - - public visitor, - - public visitor - -{ - public: - - lpsrOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~lpsrOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_lpsrScoreOutputKindAtom& elt); - virtual void visitEnd (S_lpsrScoreOutputKindAtom& elt); - - virtual void visitStart (S_lpsrPitchesLanguageAtom& elt); - virtual void visitEnd (S_lpsrPitchesLanguageAtom& elt); - - virtual void visitStart (S_lpsrChordsLanguageAtom& elt); - virtual void visitEnd (S_lpsrChordsLanguageAtom& elt); - - virtual void visitStart (S_lpsrTransposeAtom& elt); - virtual void visitEnd (S_lpsrTransposeAtom& elt); -}; -typedef SMARTP S_lpsrOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/lpsrPapers.cpp b/src/lilypond/lpsrPapers.cpp deleted file mode 100644 index f7c787932..000000000 --- a/src/lilypond/lpsrPapers.cpp +++ /dev/null @@ -1,365 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "lpsrPapers.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrPaper lpsrPaper::create ( - int inputLineNumber, - S_msrScaling scaling, - S_msrPageLayout pageLayout) -{ - lpsrPaper* o = - new lpsrPaper ( - inputLineNumber, - scaling, - pageLayout); - assert(o!=0); - return o; -} - -lpsrPaper::lpsrPaper ( - int inputLineNumber, - S_msrScaling scaling, - S_msrPageLayout pageLayout) - : lpsrElement (inputLineNumber) -{ - // sanity checks - msrAssert ( - scaling != nullptr, - "scaling is null"); - msrAssert ( - pageLayout != nullptr, - "pageLayout is null"); - - fScaling = scaling; - fPageLayout = pageLayout; - - fPageCount = -1; - fSystemCount = -1; -} - -S_lpsrPaper lpsrPaper::createPaperNewbornClone () -{ - S_lpsrPaper - newbornClone = - lpsrPaper::create ( - fInputLineNumber, - fScaling, - fPageLayout); - - // indents - newbornClone->fHorizontalShift = - fHorizontalShift; - newbornClone->fIndent = - fIndent; - newbornClone->fShortIndent = - fShortIndent; - - // spaces - newbornClone->fMarkupSystemSpacingPadding = - fMarkupSystemSpacingPadding; - newbornClone->fBetweenSystemSpace = - fBetweenSystemSpace; - newbornClone->fPageTopSpace = - fPageTopSpace; - - // counts - newbornClone->fPageCount = - fPageCount; - newbornClone->fSystemCount = - fSystemCount; - - // headers and footers - newbornClone->fOddHeaderMarkup = - fOddHeaderMarkup; - newbornClone->fEvenHeaderMarkup = - fEvenHeaderMarkup; - newbornClone->fOddFooterMarkup = - fOddFooterMarkup; - newbornClone->fEvenFooterMarkup = - fEvenFooterMarkup; - - return newbornClone; -} - -lpsrPaper::~lpsrPaper () -{} - -void lpsrPaper::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPaper::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPaper elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrPaper::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrPaper::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPaper::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPaper elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrPaper::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrPaper::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPaper::browseData ()" << - endl; - } -#endif - - // browse the scaling - if (fScaling) { - msrBrowser browser (v); - browser.browse (*fScaling); - } - - // browse the page layout - if (fPageLayout) { - msrBrowser browser (v); - browser.browse (*fPageLayout); - } - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrPaper::browseData ()" << - endl; - } -#endif -} - -void lpsrPaper::print (ostream& os) const -{ - os << - "Paper" << - endl; - - gIndenter++; - - const int fieldWidth = 20; - - // scaling - - os << left << - setw (fieldWidth) << - "scaling" << " : "; - if (fScaling) { - os << fScaling; - } - else { - os << "none"; - } - os << endl; - - // page layout - - os << left << - setw (fieldWidth) << - "pageLayout" << " : "; - if (fPageLayout) { - os << fPageLayout; - } - else { - os << "none"; - } - os << endl; - - // indents - - os << left << - setw (fieldWidth) << - "horizontalShift" << " : "; - if (fHorizontalShift) { - os << fHorizontalShift; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "indent" << " : "; - if (fIndent) { - os << fIndent; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "shortIndent" << " : "; - if (fShortIndent) { - os << fShortIndent; - } - else { - os << "none"; - } - os << endl; - - // spaces - - os << left << - setw (fieldWidth) << - "markupSystemSpacingPadding" << " : "; - if (fMarkupSystemSpacingPadding) { - os << fMarkupSystemSpacingPadding; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "betweenSystemSpace" << " : "; - if (fBetweenSystemSpace) { - os << fBetweenSystemSpace; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "pageTopSpace" << " : "; - if (fPageTopSpace) { - os << fPageTopSpace; - } - else { - os << "none"; - } - os << endl; - - // counts - - os << left << - setw (fieldWidth) << - "pageCount" << " : "; - if (fPageCount) { - os << fPageCount; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "systemCount" << " : "; - if (fSystemCount) { - os << fSystemCount; - } - else { - os << "none"; - } - os << endl; - - // headers and footers - - os << left << - setw (fieldWidth) << - "oddHeaderMarkup" << " : \"" << - fOddHeaderMarkup << - "\"" << - endl; - - os << left << - setw (fieldWidth) << - "evenHeaderMarkup" << " : " << - fEvenHeaderMarkup << - "\"" << - endl; - - os << left << - setw (fieldWidth) << - "oddFooterMarkup" << " : " << - fOddFooterMarkup << - "\"" << - endl; - - os << left << - setw (fieldWidth) << - "evenFooterMarkup" << " : " << - fEvenFooterMarkup << - "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrPaper& pap) { - pap->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrPapers.h b/src/lilypond/lpsrPapers.h deleted file mode 100644 index 4fbd4538b..000000000 --- a/src/lilypond/lpsrPapers.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrPapers___ -#define ___lpsrPapers___ - -#include -#include - -#include "msrScaling.h" - -#include "lpsrElements.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrPaper : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrScaling scaling, - S_msrPageLayout pageLayout); - - SMARTP createPaperNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrPaper ( - int inputLineNumber, - S_msrScaling scaling, - S_msrPageLayout pageLayout); - - virtual ~lpsrPaper (); - - public: - - // set and get - // ------------------------------------------------------ - - // LPSR scaling - void setScaling (S_msrScaling value) - { fScaling = value; } - S_msrScaling getScaling () const - { return fScaling; } - - // MSR page layout - void setPageLayout (S_msrPageLayout value) - { fPageLayout = value; } - S_msrPageLayout getPageLayout () const - { return fPageLayout; } - - // indents - void setHorizontalShift (S_msrLength value) - { fHorizontalShift = value; } - S_msrLength getHorizontalShift () const - { return fHorizontalShift; } - - void setIndent (S_msrLength value) - { fIndent = value; } - S_msrLength getIndent () const - { return fIndent; } - - void setShortIndent (S_msrLength value) - { fShortIndent = value; } - S_msrLength getShortIndent () const - { return fShortIndent; } - - // counts - void setPageCount (int value) - { fPageCount = value; } - int getPageCount () const - { return fPageCount; } - - void setSystemCount (int value) - { fSystemCount = value; } - int getSystemCount () const - { return fSystemCount; } - - // spaces - void setMarkupSystemSpacingPadding (S_msrLength val) - { fMarkupSystemSpacingPadding = val; } - S_msrLength getMarkupSystemSpacingPadding () const - { return fMarkupSystemSpacingPadding; } - - void setBetweenSystemSpace (S_msrLength val) - { fBetweenSystemSpace = val; } - S_msrLength getBetweenSystemSpace () const - { return fBetweenSystemSpace; } - - void setPageTopSpace (S_msrLength val) - { fPageTopSpace = val; } - S_msrLength getPageTopSpace () const - { return fPageTopSpace; } - - - // headers and footers - void setOddHeaderMarkup (string value) - { fOddHeaderMarkup = value; } - string getOddHeaderMarkup () const - { return fOddHeaderMarkup; } - - void setEvenHeaderMarkup (string value) - { fEvenHeaderMarkup = value; } - string getEvenHeaderMarkup () const - { return fEvenHeaderMarkup; } - - void setOddFooterMarkup (string value) - { fOddFooterMarkup = value; } - string getOddFooterMarkup () const - { return fOddFooterMarkup; } - - void setEvenFooterMarkup (string value) - { fEvenFooterMarkup = value; } - string getEvenFooterMarkup () const - { return fEvenFooterMarkup; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - - private: - - // fields - // ------------------------------------------------------ - - // MSR scaling - S_msrScaling fScaling; - - // MSR page layout - S_msrPageLayout fPageLayout; - - // indents - S_msrLength fHorizontalShift; - S_msrLength fIndent; - S_msrLength fShortIndent; - - // spaces - S_msrLength fMarkupSystemSpacingPadding; - S_msrLength fBetweenSystemSpace; - S_msrLength fPageTopSpace; - - // counts - int fPageCount; - int fSystemCount; - - // headers and footers - string fOddHeaderMarkup; - string fEvenHeaderMarkup; - string fOddFooterMarkup; - string fEvenFooterMarkup; -}; -typedef SMARTP S_lpsrPaper; -EXP ostream& operator<< (ostream& os, const S_lpsrPaper& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrParallelMusic.cpp b/src/lilypond/lpsrParallelMusic.cpp deleted file mode 100644 index 1b3959146..000000000 --- a/src/lilypond/lpsrParallelMusic.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrParallelMusic.h" - -#include "lpsrComments.h" - -#include "lpsrVariables.h" - -#include "lpsrBarNumbers.h" - -#include "lpsrVoices.h" -#include "lpsrLyrics.h" - -#include "lpsrStaves.h" - -#include "lpsrContexts.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrParallelMusicBLock lpsrParallelMusicBLock::create ( - int inputLineNumber, - lpsrElementsSeparatorKind elementsSeparatorKind) -{ - lpsrParallelMusicBLock* o = - new lpsrParallelMusicBLock ( - inputLineNumber, - elementsSeparatorKind); - assert(o!=0); - return o; -} - -lpsrParallelMusicBLock::lpsrParallelMusicBLock ( - int inputLineNumber, - lpsrElementsSeparatorKind elementsSeparatorKind) - : lpsrElement (inputLineNumber) -{ - fElementsSeparatorKind = elementsSeparatorKind; -} - -lpsrParallelMusicBLock::~lpsrParallelMusicBLock () -{} - -void lpsrParallelMusicBLock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrParallelMusicBLock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrParallelMusicBLock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrParallelMusicBLock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrParallelMusicBLock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrParallelMusicBLock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrParallelMusicBLock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrParallelMusicBLock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrParallelMusicBLock::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrParallelMusicBLock::browseData ()" << - endl; - } -#endif - - for ( - list::const_iterator i = - fParallelMusicBLockPartGroupBlocks.begin (); - i != fParallelMusicBLockPartGroupBlocks.end (); - i++ - ) { - // browse the element browser - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrParallelMusicBLock::browseData ()" << - endl; - } -#endif -} - -void lpsrParallelMusicBLock::print (ostream& os) const -{ - os << - "ParallelMusicBLock" << - ", " << - singularOrPlural ( - fParallelMusicBLockPartGroupBlocks.size (), "part group", "part groups") << - endl; - - gIndenter++; - - for ( - list::const_iterator i = - fParallelMusicBLockPartGroupBlocks.begin (); - i != fParallelMusicBLockPartGroupBlocks.end (); - i++ - ) { - os << (*i); - } // for - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrParallelMusicBLock& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrParallelMusic.h b/src/lilypond/lpsrParallelMusic.h deleted file mode 100644 index 63a3a1996..000000000 --- a/src/lilypond/lpsrParallelMusic.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrParallelMusic___ -#define ___lpsrParallelMusic___ -/* -#include -#include - - -#include "exports.h" -#include "typedefs.h" - -#include "msrBasicTypes.h" - -#include "msr.h" - -#include "lpsrVarValAssocs.h" - -#include "lpsrScheme.h" -*/ - -#include -#include - -#include "lpsrPartGroups.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrParallelMusicBLock : public lpsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum lpsrElementsSeparatorKind { - kEndOfLine, kSpace}; - - static string elementsSeparatorKindAsString ( - lpsrElementsSeparatorKind elementsSeparatorKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - lpsrElementsSeparatorKind elementsSeparatorKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrParallelMusicBLock ( - int inputLineNumber, - lpsrElementsSeparatorKind elementsSeparatorKind); - - virtual ~lpsrParallelMusicBLock (); - - public: - - // set and get - // ------------------------------------------------------ - - const list& - getParallelMusicBLockPartGroupBlocks () const - { return fParallelMusicBLockPartGroupBlocks; } - - // services - // ------------------------------------------------------ - - void appendPartGroupBlockToParallelMusicBLock ( // JMI - S_lpsrPartGroupBlock partGroupBlock) - { - fParallelMusicBLockPartGroupBlocks.push_back ( - partGroupBlock); - } - -/* JMI - S_lpsrPartGroupBlock getLastPartGroupBlockOfParallelMusicBLock () - { - return - fParallelMusicBLockPartGroupBlocks.back (); - } - - void removeLastPartGroupBlockOfParallelMusicBLock () // JMI - { - fParallelMusicBLockPartGroupBlocks.pop_back (); - } -*/ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - list - fParallelMusicBLockPartGroupBlocks; - - lpsrElementsSeparatorKind - fElementsSeparatorKind; -}; -typedef SMARTP S_lpsrParallelMusicBLock; -EXP ostream& operator<< (ostream& os, const S_lpsrParallelMusicBLock& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrPartGroups.cpp b/src/lilypond/lpsrPartGroups.cpp deleted file mode 100644 index 9ba2d1558..000000000 --- a/src/lilypond/lpsrPartGroups.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrPartGroups.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrPartGroupBlock lpsrPartGroupBlock::create ( - S_msrPartGroup partGroup) -{ - lpsrPartGroupBlock* o = new lpsrPartGroupBlock ( - partGroup); - assert(o!=0); - return o; -} - -lpsrPartGroupBlock::lpsrPartGroupBlock ( - S_msrPartGroup partGroup) - : lpsrElement (0) // JMI -{ - fPartGroup = partGroup; -} - -lpsrPartGroupBlock::~lpsrPartGroupBlock () -{} - -void lpsrPartGroupBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPartGroupBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPartGroupBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrPartGroupBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrPartGroupBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPartGroupBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPartGroupBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrPartGroupBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrPartGroupBlock::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPartGroupBlock::browseData ()" << - endl; - } -#endif - - for ( - list::const_iterator i = fPartGroupBlockElements.begin (); - i != fPartGroupBlockElements.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrPartGroupBlock::browseData ()" << - endl; - } -#endif -} - -void lpsrPartGroupBlock::print (ostream& os) const -{ - os << - endl << - "PartGroupBlock for partGroup \"" << - fPartGroup->getPartGroupCombinedName () << - "\", " << fPartGroup->partGroupSymbolKindAsString () << - ", " << - singularOrPlural ( - fPartGroupBlockElements.size (), "element", "elements") << - endl << - endl; - - gIndenter++; - - if (fPartGroupBlockElements.size ()) { - list::const_iterator - iBegin = fPartGroupBlockElements.begin (), - iEnd = fPartGroupBlockElements.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrPartGroupBlock& scr) -{ - scr->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrPartGroups.h b/src/lilypond/lpsrPartGroups.h deleted file mode 100644 index e176285ec..000000000 --- a/src/lilypond/lpsrPartGroups.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrPartGroups___ -#define ___lpsrPartGroups___ - -#include "lpsrElements.h" - -#include "msr.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrPartGroupBlock; -typedef SMARTP S_lpsrPartGroupBlock; - -//______________________________________________________________________________ -class lpsrPartGroupBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - S_msrPartGroup partGroup); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrPartGroupBlock ( - S_msrPartGroup partGroup); - - virtual ~lpsrPartGroupBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrPartGroup getPartGroup () const - { return fPartGroup; } - - const list& - getPartGroupBlockElements () const - { return fPartGroupBlockElements; } - - public: - - // public services - // ------------------------------------------------------ - - void appendElementToPartGroupBlock ( - S_msrElement elem) - { fPartGroupBlockElements.push_back (elem); } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrPartGroup fPartGroup; - - list fPartGroupBlockElements; -}; -EXP ostream& operator<< (ostream& os, const S_lpsrPartGroupBlock& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrParts.cpp b/src/lilypond/lpsrParts.cpp deleted file mode 100644 index 19c82104a..000000000 --- a/src/lilypond/lpsrParts.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrParts.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrPartBlock lpsrPartBlock::create ( - S_msrPart part) -{ - lpsrPartBlock* o = new lpsrPartBlock ( - part); - assert(o!=0); - return o; -} - -lpsrPartBlock::lpsrPartBlock ( - S_msrPart part) - : lpsrElement (0) // JMI -{ - // sanity check - msrAssert ( - part != nullptr, - "part is null"); - - fPart = part; - - // set part block instrument names default values // JMI - fPartBlockInstrumentName = - fPart-> - getPartName (); - fPartBlockShortInstrumentName = - fPart-> - getPartAbbreviation (); -} - -lpsrPartBlock::~lpsrPartBlock () -{} - -bool lpsrPartBlock::compareStaffBlockWithOtherElement ( - const S_lpsrStaffBlock& staffBlock, - const S_msrElement& otherElement) -{ - bool result = true; - - if ( - S_lpsrStaffBlock - secondStaffBlock = - dynamic_cast(&(*otherElement)) - ) { - // otherElement is a staff block - result = - staffBlock->getStaff ()->getStaffNumber () - < - secondStaffBlock->getStaff ()->getStaffNumber (); - } - - else if ( - S_lpsrChordNamesContext - secondChordNamesContext = - dynamic_cast(&(*otherElement)) - ) { - // otherElement is a chord names context - result = - staffBlock->getStaff ()->getStaffNumber () - < - secondChordNamesContext-> - getContextVoice ()-> - getVoiceStaffUpLink ()->getStaffNumber (); - } - - else if ( - S_lpsrFiguredBassContext - secondFiguredBassContext = - dynamic_cast(&(*otherElement)) - ) { - // otherElement is a figured bass context - } - - else { - stringstream s; - - s << - "part block element '" << - otherElement->asShortString () << - " is not a staff nor a chord names or figured bass context"; - - msrInternalError ( - gOahOah->fInputSourceName, - otherElement->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - -/* JMI - gLogOstream << - endl << - "!!!!!!!!!!!!!!!!!!!!!!!!!" << - endl << - "compareStaffBlockWithOtherElement:" << - endl << - staffBlock << - endl << - otherElement << - endl << - "===> " << booleanAsString (result) << - endl << - endl; - */ - - return result; -} - -bool lpsrPartBlock::compareChordNamesContextWithOtherElement ( - const S_lpsrChordNamesContext& chordNamesContext, - const S_msrElement& otherElement) -{ - bool result = true; - - if ( - S_lpsrStaffBlock - secondStaffBlock = - dynamic_cast(&(*otherElement)) - ) { - // otherElement is a staff block - S_msrVoice - chordNamesVoice = - chordNamesContext-> - getContextVoice (); - - int - chordNamesContextStaffNumber = - chordNamesVoice-> - getVoiceStaffUpLink ()-> - getStaffNumber (), - secondStaffBlockStaffNumber = - secondStaffBlock-> - getStaff ()->getStaffNumber (); - - if (chordNamesContextStaffNumber == secondStaffBlockStaffNumber) { - // chord names should precede the staff - result = true; - } - else { - result = - chordNamesContextStaffNumber - < - secondStaffBlockStaffNumber; - } - } - - else if ( - S_lpsrChordNamesContext - secondChordNamesContext = - dynamic_cast(&(*otherElement)) - ) { - // otherElement is a chord names context - S_msrVoice - chordNamesVoice = - chordNamesContext-> - getContextVoice (), - secondChordNamesVoice = - secondChordNamesContext-> - getContextVoice (); - - int - chordNamesContextStaffNumber = - chordNamesVoice-> - getVoiceStaffUpLink ()-> - getStaffNumber (), - secondChordNamesContextStaffNumber = - secondChordNamesVoice-> - getVoiceStaffUpLink ()-> - getStaffNumber (); - - if (chordNamesContextStaffNumber == secondChordNamesContextStaffNumber) { - result = - chordNamesVoice->getVoiceNumber () - < - secondChordNamesVoice->getVoiceNumber (); - } - else { - result = - chordNamesContextStaffNumber - < - secondChordNamesContextStaffNumber; - } - } - - else if ( - S_lpsrFiguredBassContext - secondFiguredBassContext = - dynamic_cast(&(*otherElement)) - ) { - // otherElement is a figured bass context - } - - else { - stringstream s; - - s << - "part block element '" << - otherElement->asShortString () << - " is not a staff nor a chord names or figured bass context"; - - msrInternalError ( - gOahOah->fInputSourceName, - otherElement->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - -/* JMI - gLogOstream << - endl << - "!!!!!!!!!!!!!!!!!!!!!!!!!" << - endl << - "compareChordNamesContextWithOtherElement:" << - endl << - chordNamesContext << - endl << - otherElement << - endl << - "===> " << booleanAsString (result) << - endl << - endl; -*/ - - return result; -} - -bool lpsrPartBlock::compareElementsToHaveHarmoniesAboveCorrespondingStaff ( - const S_msrElement& first, - const S_msrElement& second) -{ - bool result = true; - - if ( - S_lpsrStaffBlock - firstStaffBlock = - dynamic_cast(&(*first)) - ) { - // first is a staff block - result = - compareStaffBlockWithOtherElement ( - firstStaffBlock, - second); - } - - else if ( - S_lpsrChordNamesContext - firstChordNamesContext = - dynamic_cast(&(*first)) - ) { - // first is a chord names context - result = - compareChordNamesContextWithOtherElement ( - firstChordNamesContext, - second); - } - - else if ( - S_lpsrFiguredBassContext - firstFiguredBassContext = - dynamic_cast(&(*first)) - ) { - // first is a figured bass context - result = true; - } - - else { - stringstream s; - - s << - "part block element '" << - first->asShortString () << - " is not a staff nor a chord names or figured bass context"; - - msrInternalError ( - gOahOah->fInputSourceName, - first->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - return result; -} - -void lpsrPartBlock::appendStaffBlockToPartBlock ( - S_lpsrStaffBlock staffBlock) -{ - fPartBlockElementsList.push_back (staffBlock); -} - -void lpsrPartBlock::appendChordNamesContextToPartBlock ( - int inputLineNumber, - S_lpsrChordNamesContext chordNamesContext) -{ - // appent chordNamesContext to the part block elements list - fPartBlockElementsList.push_back (chordNamesContext); - - // sort the list if necessary -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Sorting the voices in part block for part \"" << - fPart->getPartCombinedName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* JMI - gLogOstream << - endl << - endl << - "@@@@@@@@@@@@@@@@ fPartBlockElementsList contains initially:" << - endl << - endl; - - for ( - list::const_iterator i = fPartBlockElementsList.begin (); - i != fPartBlockElementsList.end (); - i++ - ) { - S_msrElement - element = (*i); - - gLogOstream << - element->asShortString () << - endl; - } // for - gLogOstream << - endl << - endl; -*/ - - // sort fPartBlockElementsList, to have harmonies just before - // the corresponding voice - if (fPartBlockElementsList.size ()) { - fPartBlockElementsList.sort ( - compareElementsToHaveHarmoniesAboveCorrespondingStaff); - } - -/* JMI - gLogOstream << - endl << - endl << - "@@@@@@@@@@@@@@@@ fPartBlockElementsList contains after sort:" << - endl << - endl; - - for ( - list::const_iterator i = fPartBlockElementsList.begin (); - i != fPartBlockElementsList.end (); - i++ - ) { - S_msrElement - element = (*i); - - gLogOstream << - element->asShortString () << - endl; - } // for - gLogOstream << - endl << - endl; -*/ -} - -void lpsrPartBlock::appendFiguredBassContextToPartBlock ( - S_lpsrFiguredBassContext context) -{ - fPartBlockElementsList.push_back (context); -} - -void lpsrPartBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPartBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPartBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrPartBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrPartBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPartBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrPartBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrPartBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrPartBlock::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrPartBlock::browseData ()" << - endl; - } -#endif - - for ( - list::const_iterator i = fPartBlockElementsList.begin (); - i != fPartBlockElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrPartBlock::browseData ()" << - endl; - } -#endif -} - -void lpsrPartBlock::print (ostream& os) const -{ - os << - "PartBlock" << " " << - "for part " << fPart->getPartCombinedName () << - ", " << - singularOrPlural ( - fPartBlockElementsList.size (), "element", "elements") << - endl; - - gIndenter++; - - const int fieldWidth = 28; - - os << left << - setw (fieldWidth) << string ("") + "partName" << " = \"" << - fPart->getPartName () << "\"" << - endl << - setw (fieldWidth) << string ("") + "partAbbreviation" << " = \"" << - fPart->getPartAbbreviation () << "\"" << - endl << - - setw (fieldWidth) << "partBlockInstrumentName" << " = \"" << - fPartBlockInstrumentName << - "\"" << - endl << - setw (fieldWidth) << "partBlockShortInstrumentName" << " = \"" << - fPartBlockShortInstrumentName << - "\"" << - endl; - - os << endl; - - if (fPartBlockElementsList.size ()) { - list::const_iterator - iBegin = fPartBlockElementsList.begin (), - iEnd = fPartBlockElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrPartBlock& scr) -{ - scr->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrParts.h b/src/lilypond/lpsrParts.h deleted file mode 100644 index f656f506c..000000000 --- a/src/lilypond/lpsrParts.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrParts___ -#define ___lpsrParts___ - -#include "lpsrContexts.h" - -#include "lpsrStaves.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrPartBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - S_msrPart part); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrPartBlock ( - S_msrPart part); - - virtual ~lpsrPartBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrPart getPart () const - { return fPart; } - - const list& - getPartBlockElementsList () const - { return fPartBlockElementsList; } - - void setPartBlockInstrumentName ( - string instrumentName) - { - fPartBlockInstrumentName = - instrumentName; - } - - string getPartBlockInstrumentName () const - { return fPartBlockInstrumentName; } - - void setPartBlockShortInstrumentName ( - string shortInstrumentName) - { - fPartBlockShortInstrumentName = - shortInstrumentName; - } - - string getPartBlockShortInstrumentName () const - { return fPartBlockShortInstrumentName; } - - public: - - // pbulic services - // ------------------------------------------------------ - - void appendStaffBlockToPartBlock ( - S_lpsrStaffBlock staffBlock); - - void appendChordNamesContextToPartBlock ( - int inputLineNumber, - S_lpsrChordNamesContext chordNamesContext); - - void appendFiguredBassContextToPartBlock ( - S_lpsrFiguredBassContext context); - - private: - - // private services - // ------------------------------------------------------ - - // voices ordering in staves - - static bool compareElementsToHaveHarmoniesAboveCorrespondingStaff ( - const S_msrElement& first, - const S_msrElement& second); - - static bool compareStaffBlockWithOtherElement ( - const S_lpsrStaffBlock& staffBlock, - const S_msrElement& otherElement); - - static bool compareChordNamesContextWithOtherElement ( - const S_lpsrChordNamesContext& chordNamesContext, - const S_msrElement& otherElement); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrPart fPart; - - list fPartBlockElementsList; - - string fPartBlockInstrumentName; // JMI - string fPartBlockShortInstrumentName; // JMI -}; -typedef SMARTP S_lpsrPartBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrPartBlock& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrScheme.cpp b/src/lilypond/lpsrScheme.cpp deleted file mode 100644 index bbccb2b2e..000000000 --- a/src/lilypond/lpsrScheme.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "lpsrScheme.h" - -#include "lpsrVarValAssocs.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -string const lpsrSchemeVariable::g_SchemeVariableNoUnit = ""; -string const lpsrSchemeVariable::g_SchemeVariableNoComment = ""; - -S_lpsrSchemeVariable lpsrSchemeVariable::create ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - string variableName, - string value, - string comment, - lpsrEndlKind endlKind) -{ - lpsrSchemeVariable* o = - new lpsrSchemeVariable ( - inputLineNumber, - commentedKind, variableName, value, comment, endlKind); - assert(o!=0); - return o; -} - -lpsrSchemeVariable::lpsrSchemeVariable ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - string variableName, - string value, - string comment, - lpsrEndlKind endlKind) - : lpsrElement (inputLineNumber) -{ - fCommentedKind = commentedKind; - - fVariableName = variableName; - fVariableValue = value; - - fComment = comment; - - fEndlKind = endlKind; -} - -lpsrSchemeVariable::~lpsrSchemeVariable () -{} - -void lpsrSchemeVariable::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrSchemeVariable::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrSchemeVariable elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrSchemeVariable::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrSchemeVariable::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrSchemeVariable::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrSchemeVariable elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrSchemeVariable::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrSchemeVariable::browseData (basevisitor* v) -{} - -string lpsrSchemeVariable::commentedKindAsString ( - lpsrCommentedKind commentedKind) -{ - string result; - - switch (commentedKind) { - case lpsrSchemeVariable::kCommentedYes: - result = "commentedYes"; - break; - case lpsrSchemeVariable::kCommentedNo: - result = "commentedNo"; - break; - } // switch - - return result; -} - -string lpsrSchemeVariable::endlKindAsString ( - lpsrEndlKind endlKind) -{ - string result; - - switch (endlKind) { - case lpsrSchemeVariable::kEndlOnce: - result = "endlOnce"; - break; - case lpsrSchemeVariable::kEndlTwice: - result = "endlTwice"; - break; - case lpsrSchemeVariable::kEndlNone: - result = "endlNone"; - break; - } // switch - - return result; -} - -void lpsrSchemeVariable::print (ostream& os) const -{ - os << - "SchemeVariable" << - endl; - - gIndenter++; - - // escape quotes if any - string variableName; - string variableValue; - - for_each ( - fVariableName.begin (), - fVariableName.end (), - stringQuoteEscaper (variableName)); - for_each ( - fVariableValue.begin (), - fVariableValue.end (), - stringQuoteEscaper (variableValue)); - - // print resulting strings - const int fieldWidth = 15; - - os << left << - setw (fieldWidth) << - "variableName" << - " : \"" << variableName << "\"" << - endl << - setw (fieldWidth) << - "variableValue" << - " : \"" << variableValue << "\"" << - endl << - - setw (fieldWidth) << - "commentedKind" << " : " << - commentedKindAsString (fCommentedKind) << - endl << - - // backSlashKindAsString ??? JMI - // varValSeparatorKindAsString ??? JMI - // quotesKindAsString ??? JMI - - setw (fieldWidth) << - "endlKind" << " : " << - endlKindAsString (fEndlKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrSchemeVariable& assoc) -{ - assoc->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrSchemeFunction lpsrSchemeFunction::create ( - int inputLineNumber, - string functionName, - string functionDescription, - string functionCode) -{ - lpsrSchemeFunction* o = - new lpsrSchemeFunction ( - inputLineNumber, - functionName, functionDescription, functionCode); - assert(o!=0); - return o; -} - -lpsrSchemeFunction::lpsrSchemeFunction ( - int inputLineNumber, - string functionName, - string functionDescription, - string functionCode) - : lpsrElement (inputLineNumber) -{ - fFunctionName = functionName; - fFunctionDescription = functionDescription; - fFunctionCode = functionCode; - } - -lpsrSchemeFunction::~lpsrSchemeFunction () -{} - -void lpsrSchemeFunction::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrSchemeFunction::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrSchemeFunction elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrSchemeFunction::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrSchemeFunction::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrSchemeFunction::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrSchemeFunction elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrSchemeFunction::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrSchemeFunction::browseData (basevisitor* v) -{} - -void lpsrSchemeFunction::print (ostream& os) const -{ - os << - "SchemeFunction" << - endl; - - gIndenter++; - - // print resulting strings - os << - "function name : \"" << fFunctionName << "\"" << - endl << - "function description: \"" << fFunctionDescription << "\"" << - endl << - "function code: \"" << fFunctionCode << "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrSchemeFunction& assoc) -{ - assoc->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrScheme.h b/src/lilypond/lpsrScheme.h deleted file mode 100644 index b627b6b99..000000000 --- a/src/lilypond/lpsrScheme.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrScheme___ -#define ___lpsrScheme___ - -#include - -#include "lpsrElements.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrSchemeVariable : public lpsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum lpsrCommentedKind { - kCommentedYes, kCommentedNo }; - - static string commentedKindAsString ( - lpsrCommentedKind commentedKind); - - enum lpsrEndlKind { - kEndlNone, kEndlOnce, kEndlTwice }; - - static string endlKindAsString ( - lpsrEndlKind endlKind); - - static string const g_SchemeVariableNoUnit; - static string const g_SchemeVariableNoComment; - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - string variableName, - string value, - string comment, - lpsrEndlKind endlKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrSchemeVariable ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - string variableName, - string value, - string comment, - lpsrEndlKind endlKind); - - virtual ~lpsrSchemeVariable (); - - public: - - // set and get - // ------------------------------------------------------ - - string getVariableName () const { return fVariableName; } - - void setVariableValue (string value) - { fVariableValue = value; } - - string getVariableValue () const { return fVariableValue; } - - lpsrCommentedKind getCommentedKind () const { return fCommentedKind; } - - string getComment () const - { return fComment; } - - lpsrEndlKind getEndlKind () const - { return fEndlKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrCommentedKind fCommentedKind; - - string fVariableName; - string fVariableValue; - - string fComment; - - lpsrEndlKind fEndlKind; - -}; -typedef SMARTP S_lpsrSchemeVariable; -EXP ostream& operator<< (ostream& os, const S_lpsrSchemeVariable& elt); - -//______________________________________________________________________________ -class lpsrSchemeFunction : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string functionName, - string functionDescription, - string functionCode); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrSchemeFunction ( - int inputLineNumber, - string functionName, - string functionDescription, - string functionCode); - - virtual ~lpsrSchemeFunction (); - - public: - - // set and get - // ------------------------------------------------------ - - string getFunctionName () const - { return fFunctionName; } - - string getFunctionDescription () const - { return fFunctionDescription; } - - string getFunctionCode () const - { return fFunctionCode; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fFunctionName; - - string fFunctionDescription; - - string fFunctionCode; -}; -typedef SMARTP S_lpsrSchemeFunction; -EXP ostream& operator<< (ostream& os, const S_lpsrSchemeFunction& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrScores.cpp b/src/lilypond/lpsrScores.cpp deleted file mode 100644 index 4c130add5..000000000 --- a/src/lilypond/lpsrScores.cpp +++ /dev/null @@ -1,2210 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrScores.h" - -#include "version.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrScore lpsrScore::create ( - int inputLineNumber, - S_msrScore mScore) -{ - lpsrScore* o = new lpsrScore ( - inputLineNumber, mScore); - assert(o!=0); - return o; -} - -lpsrScore::lpsrScore ( - int inputLineNumber, - S_msrScore mScore) - : lpsrElement (inputLineNumber) -{ - fMsrScore = mScore; - - // create the LilyPond version assoc - fLilypondVersion = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashYes, - lpsrVarValAssoc::kLibraryVersion, - lpsrVarValAssoc::kVarValSeparatorSpace, - lpsrVarValAssoc::kQuotesAroundValueYes, - gLpsrOah->fLilyPondVersion, - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - kFontStyleNone, - kFontWeightNone, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlOnce); - - // should the initial comments about the executable and the options used - // be generated? - if (gLilypondOah->fXml2lyInfos) { - // create the 'input source name and translation date' comment - { - stringstream s; - - s << - "Generated by " << - gOahOah->fHandlerExecutableName << - " " << - currentVersionNumber () << - " from "; - - if (gOahOah->fInputSourceName == "-") { - s << "standard input"; - } - else { - s << "\"" << gOahOah->fInputSourceName << "\""; - } - - s << - endl << - "% on " << gGeneralOah->fTranslationDate << - endl; - - fInputSourceNameComment = - lpsrComment::create ( - inputLineNumber, - s.str (), - lpsrComment::kNoGapAfterwards); - } - - // create the 'translation command line' comment - { - stringstream s; - - s << - "The translation command line was:"; - - fTranslationDateComment = - lpsrComment::create ( - inputLineNumber, - s.str (), - lpsrComment::kNoGapAfterwards); - } - - // create the 'command line as supplied' comment - { - stringstream s; - - s << - gTab << - gOahOah->fCommandLineAsSupplied; - - fCommandLineAsSuppliedComment = - lpsrComment::create ( - inputLineNumber, - s.str (), - lpsrComment::kNoGapAfterwards); - } - - // do the command line long and short options differ? - bool - longAndShortOptionsDiffer = - gOahOah->fCommandLineWithShortOptionsNames - != - gOahOah->fCommandLineWithLongOptionsNames; - - // create the 'command line long options' comment - { - stringstream s; - - s << - "or, with long option names:" << - endl << - "%" << - gTab << - gOahOah->fCommandLineWithLongOptionsNames; - - if (longAndShortOptionsDiffer) { - s << - endl << - "% or, with short option names:"; - } - - fCommandLineLongOptionsComment = - lpsrComment::create ( - inputLineNumber, - s.str (), - longAndShortOptionsDiffer - ? lpsrComment::kNoGapAfterwards - : lpsrComment::kGapAfterwards); - } - - if (longAndShortOptionsDiffer) { - // create the 'command line short options' comment - stringstream s; - - s << - gTab << - gOahOah->fCommandLineWithShortOptionsNames; - - fCommandLineShortOptionsComment = - lpsrComment::create ( - inputLineNumber, - s.str (), - lpsrComment::kGapAfterwards); - } - } - - // create the global staff size variable - // too early to benefit from gLpsrOah->fGlobalStaffSize... JMI - // needs to be updated later in msrScaling::globalStaffSize() - fScoreGlobalStaffSizeSchemeVariable = - lpsrSchemeVariable::create ( - inputLineNumber, - lpsrSchemeVariable::kCommentedNo, - "set-global-staff-size", - to_string (gLpsrOah->fGlobalStaffSize), - "Comment or adapt next line as needed (default is 20)", - lpsrSchemeVariable::kEndlTwice); - - // initialize Scheme functions informations - // ---------------------------------------- - - // files includes - fJianpuFileIncludeIsNeeded = false; - - // Scheme modules - fScmAndAccregSchemeModulesAreNeeded = false; - - // Scheme functions - fTongueSchemeFunctionIsNeeded = false; - fCustomShortBarlineSchemeFunctionIsNeeded = false; - fEditorialAccidentalSchemeFunctionIsNeeded = false; - fDynamicsSchemeFunctionIsNeeded = false; - fTupletsCurvedBracketsSchemeFunctionIsNeeded = false; - fAfterSchemeFunctionIsNeeded = false; - fTempoRelationshipSchemeFunctionIsNeeded = false; - fGlissandoWithTextSchemeFunctionsIsNeeded = false; - fOtherDynamicSchemeFunctionIsNeeded = false; - - // markups - fDampMarkupIsNeeded = false; - fDampAllMarkupIsNeeded = false; - - // white note heads - fWhiteNoteHeadsIsNeeded = false; - - // bar numbers - fBoxAroundNextBarNumberIsNeeded = false; - - // jazz chords display - fJazzChordsDisplayIsNeeded = false; - - // colored ledger lines - fColoredLedgerLinesIsNeeded = false; - - if (gLilypondOah->fLilypondCompileDate) { - // create the date and time functions - addDateAndTimeSchemeFunctionsToScore (); - } - - if (gLilypondOah->fPointAndClickOff) { - // create the pointAndClickOff scheme function - addPointAndClickOffSchemeFunctionsToScore (); - } - - if (gLilypondOah->fPointAndClickOff) { - // create the glissandoWithText scheme functions - addGlissandoWithTextSchemeFunctionsToScore (); - } - - if (gLilypondOah->fJianpu) { - // create the Jianpu include command JMI - } - - // create the header - fScoreHeader = - lpsrHeader::create ( - inputLineNumber); - - // create the paper - fScorePaper = - lpsrPaper::create ( - inputLineNumber, - fMsrScore->getScaling (), - fMsrScore->getPageLayout ()); - - // populate the paper -/* JMI - // populate paper - msrLength paperWidth = - elt->getPaperWidth (); - if (gLpsrOah->fPaperWidth.getLengthValue () > 0.0) { - paperWidth = gLpsrOah->fPaperWidth; - } - paper -> - setPaperWidth (paperWidth); - - msrLength paperHeight = - elt->getPaperHeight (); - if (gLpsrOah->fPaperHeight.getLengthValue () > 0.0) { - paperWidth = gLpsrOah->fPaperHeight; - } - paper-> - setPaperHeight (paperHeight); - - msrLength topMargin = - elt->getTopMargin (); - if (gLpsrOah->fTopMargin > 0.0) { - topMargin = gLpsrOah->fTopMargin; - } - paper-> - setTopMargin (topMargin); - - msrLength bottomMargin = - elt->getBottomMargin (); - if (gLpsrOah->fBottomMargin > 0.0) { - bottomMargin = gLpsrOah->fBottomMargin; - } - paper-> - setBottomMargin (bottomMargin); - - msrLength leftMargin = - elt->getLeftMargin (); - if (gLpsrOah->fLeftMargin > 0.0) { - leftMargin = gLpsrOah->fLeftMargin; - } - paper-> - setLeftMargin (leftMargin); - - msrLength rightMargin = - elt->getRightMargin (); - if (gLpsrOah->fRightMargin > 0.0) { - rightMargin = gLpsrOah->fRightMargin; - } - paper-> - setRightMargin (rightMargin); -*/ - - // indents - if (gLpsrOah->fPaperHorizontalShift.getLengthValue () > 0.0) { - fScorePaper-> - setHorizontalShift ( - msrLength::create ( - gLpsrOah->fPaperHorizontalShift.getLengthUnitKind (), - gLpsrOah->fPaperHorizontalShift.getLengthValue ())); - } - - if (gLpsrOah->fPaperIndent.getLengthValue () > 0.0) { - fScorePaper-> - setIndent ( - msrLength::create ( - gLpsrOah->fPaperIndent.getLengthUnitKind (), - gLpsrOah->fPaperIndent.getLengthValue ())); - } - - if (gLpsrOah->fPaperShortIndent.getLengthValue () > 0.0) { - fScorePaper-> - setShortIndent ( - msrLength::create ( - gLpsrOah->fPaperShortIndent.getLengthUnitKind (), - gLpsrOah->fPaperShortIndent.getLengthValue ())); - } - - if (gLilypondOah->fLilypondCompileDate) { - // define headers and footers - - fScorePaper-> - setOddHeaderMarkup ( -R"(\markup { - \fill-line { - \on-the-fly \not-first-page { - \fromproperty #'page:page-number-string - " " - \fromproperty #'header:title - " " - \fromproperty #'header:subtitle - } - } - } -)" - ); - - fScorePaper-> - setEvenHeaderMarkup ( -R"(\markup { - \fill-line { - \on-the-fly \not-first-page { - \fromproperty #'page:page-number-string - " " - \fromproperty #'header:title - " " - \fromproperty #'header:subtitle - } - } - } -)" - ); - - stringstream s; - -/* JMI YES??? - \fill-line { - "https://github.com/grame-cncm/libmusicxml/tree/lilypond - http://www.lilypond.org" - } -*/ - s << -R"(\markup { - \tiny - \column { - \fill-line { - #(string-append -)" - << - "\"Music generated from MusicXML by " << - gOahOah->fHandlerExecutableName << - " " << - currentVersionNumber () << - " and engraved by LilyPond \" (lilypond-version))" << -R"( - } - \fill-line { \italic { \modTimeAsString }} - } - } -)"; - - fScorePaper-> - setOddFooterMarkup ( - s.str ()); - } - - // create the score layout // JMI ??? - fScoreLayout = - lpsrLayout::create ( - inputLineNumber); - - // create the 'myBreakIsBreak' assoc - { - lpsrVarValAssoc::lpsrCommentedKind - commentedKind = - gLilypondOah->fIgnoreMusicXMLLineBreaks - ? lpsrVarValAssoc::kCommentedYes - : lpsrVarValAssoc::kCommentedNo; - - fMyBreakIsBreakAssoc = - lpsrVarValAssoc::create ( - inputLineNumber, - commentedKind, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondMyBreak, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueNo, - "{ \\break }", - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - kFontStyleNone, - kFontWeightNone, - "Pick your choice from the next two lines as needed", - lpsrVarValAssoc::kEndlNone); - } - - // create the 'myBreakIsEmpty' assoc - { - lpsrVarValAssoc::lpsrCommentedKind - commentedKind = - gLilypondOah->fIgnoreMusicXMLLineBreaks - ? lpsrVarValAssoc::kCommentedNo - : lpsrVarValAssoc::kCommentedYes; - - fMyBreakIsEmptyAssoc = - lpsrVarValAssoc::create ( - inputLineNumber, - commentedKind, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondMyBreak, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueNo, - "{ }", - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - kFontStyleNone, - kFontWeightNone, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlOnce); - } - - // create the 'myPageBreakIsPageBreak' assoc - { - lpsrVarValAssoc::lpsrCommentedKind - commentedKind = - gLilypondOah->fIgnoreMusicXMLLineBreaks - ? lpsrVarValAssoc::kCommentedYes - : lpsrVarValAssoc::kCommentedNo; - - fMyPageBreakIsPageBreakAssoc = - lpsrVarValAssoc::create ( - inputLineNumber, - commentedKind, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondMyPageBreak, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueNo, - "{ \\pageBreak }", - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - kFontStyleNone, - kFontWeightNone, - "Pick your choice from the next two lines as needed", - lpsrVarValAssoc::kEndlNone); - } - - // create the 'myPageBreakIsEmpty' assoc - { - lpsrVarValAssoc::lpsrCommentedKind - commentedKind = - gLilypondOah->fIgnoreMusicXMLLineBreaks - ? lpsrVarValAssoc::kCommentedNo - : lpsrVarValAssoc::kCommentedYes; - - fMyPageBreakIsEmptyAssoc = - lpsrVarValAssoc::create ( - inputLineNumber, - commentedKind, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondMyPageBreak, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueNo, - "{ }", - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - kFontStyleNone, - kFontWeightNone, - lpsrVarValAssoc::g_LilyPondVarValAssocNoComment, - lpsrVarValAssoc::kEndlOnce); - } - - if (gLilypondOah->fGlobal) { - // create the 'global' assoc - fScoreGlobalAssoc = - lpsrVarValAssoc::create ( - inputLineNumber, - lpsrVarValAssoc::kCommentedNo, - lpsrVarValAssoc::kWithBackSlashNo, - lpsrVarValAssoc::kLilypondGlobal, - lpsrVarValAssoc::kVarValSeparatorEqualSign, - lpsrVarValAssoc::kQuotesAroundValueNo, - "{ }", - lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit, - kFontStyleNone, - kFontWeightNone, - "Place whatever you need in the 'global' variable", - lpsrVarValAssoc::kEndlOnce); - } -} - -lpsrScore::~lpsrScore () -{} - -void lpsrScore::setScoreGlobalStaffSizeSchemeVariable (float size) -{ - stringstream s; - - s << size; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGeometry) { - gLogOstream << - "Setting score global staff size Scheme variable to '" << - size << - "'" << - endl; - } -#endif - - string sizeAsString = s.str (); - - fScoreGlobalStaffSizeSchemeVariable-> - setVariableValue (sizeAsString); -} - -void lpsrScore::setJianpuFileIncludeIsNeeded () -{ - if (! fScmAndAccregSchemeModulesAreNeeded) { - addJianpuFileIncludeToScore (); - - fJianpuFileIncludeIsNeeded = true; - } -} - -void lpsrScore::setScmAndAccregSchemeModulesAreNeeded () -{ - if (! fScmAndAccregSchemeModulesAreNeeded) { - addAccordionRegistrationSchemeModulesToScore (); - - fScmAndAccregSchemeModulesAreNeeded = true; - } -} - -void lpsrScore::setCustomShortBarlineSchemeFunctionIsNeeded () -{ - if (! fCustomShortBarlineSchemeFunctionIsNeeded) { - addCustomShortBarlineSchemeFunctionToScore (); - - fCustomShortBarlineSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setTongueSchemeFunctionIsNeeded () -{ - if (! fTongueSchemeFunctionIsNeeded) { - addTongueSchemeFunctionToScore (); - - fTongueSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setEditorialAccidentalSchemeFunctionIsNeeded () -{ - if (! fEditorialAccidentalSchemeFunctionIsNeeded) { - addEditorialAccidentalSchemeFunctionToScore (); - - fEditorialAccidentalSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setDynamicsSchemeFunctionIsNeeded () -{ - if (! fDynamicsSchemeFunctionIsNeeded) { - addDynamicsSchemeFunctionToScore (); - - fDynamicsSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setTupletsCurvedBracketsSchemeFunctionIsNeeded () -{ - if (! fTupletsCurvedBracketsSchemeFunctionIsNeeded) { - addTupletsCurvedBracketsSchemeFunctionToScore (); - - fTupletsCurvedBracketsSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setAfterSchemeFunctionIsNeeded () -{ - if (! fAfterSchemeFunctionIsNeeded) { - addAfterSchemeFunctionToScore (); - - fAfterSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setTempoRelationshipSchemeFunctionIsNeeded () -{ - if (! fTempoRelationshipSchemeFunctionIsNeeded) { - addTempoRelationshipSchemeFunctionToScore (); - - fTempoRelationshipSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setGlissandoWithTextSchemeFunctionsIsNeeded () -{ - if (! fGlissandoWithTextSchemeFunctionsIsNeeded) { - addGlissandoWithTextSchemeFunctionsToScore (); - - fGlissandoWithTextSchemeFunctionsIsNeeded = true; - } -} - -void lpsrScore::setOtherDynamicSchemeFunctionIsNeeded () -{ - if (! fOtherDynamicSchemeFunctionIsNeeded) { - addOtherDynamicSchemeFunctionToScore (); - - fOtherDynamicSchemeFunctionIsNeeded = true; - } -} - -void lpsrScore::setDampMarkupIsNeeded () -{ - if (! fDampMarkupIsNeeded) { - addDampMarkupToScore (); - - fDampMarkupIsNeeded = true; - } -} - -void lpsrScore::setDampAllMarkupIsNeeded () -{ - if (! fDampAllMarkupIsNeeded) { - addDampAllMarkupToScore (); - - fDampAllMarkupIsNeeded = true; - } -} - -void lpsrScore::setWhiteNoteHeadsIsNeeded () -{ - if (! fWhiteNoteHeadsIsNeeded) { - addWhiteNoteHeadsToScore (); - - fWhiteNoteHeadsIsNeeded = true; - } -} - -void lpsrScore::setBoxAroundNextBarNumberIsNeeded () -{ - if (! fBoxAroundNextBarNumberIsNeeded) { - addBoxAroundNextBarNumberToScore (); - - fBoxAroundNextBarNumberIsNeeded = true; - } -} - -void lpsrScore::setJazzChordsDisplayIsNeeded () -{ - if (! fJazzChordsDisplayIsNeeded) { - addJazzChordsDisplayToScore (); - - fJazzChordsDisplayIsNeeded = true; - } -} - -void lpsrScore::setColoredLedgerLinesIsNeeded () -{ - if (! fColoredLedgerLinesIsNeeded) { - addColoredLedgerLinesToScore (); - - fColoredLedgerLinesIsNeeded = true; - } -} - -void lpsrScore::addDateAndTimeSchemeFunctionsToScore () -{ - string - schemeFunctionName = - "date & time", - - schemeFunctionDescription = -R"( -% A set of functions to obtain a source file's modification time. -)", - - schemeFunctionCode = -R"( -#(define comml (object->string (command-line))) -#(define loc (+ (string-rindex comml #\space ) 2)) -#(define commllen (- (string-length comml) 2)) -#(define filen (substring comml loc commllen)) -#(define siz (object->string (stat:size (stat filen)))) -#(define ver (object->string (lilypond-version))) -#(define dat (strftime "%d/%m/%Y" (localtime (current-time)))) -#(define tim (strftime "%H:%M:%S" (localtime (current-time)))) -#(define modTime (stat:mtime (stat filen))) -#(define modTimeAsString (strftime "%d/%m/%Y - %H:%M:%S" (localtime modTime))) -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme functions for '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addPointAndClickOffSchemeFunctionsToScore () -{ - string - schemeFunctionName = - "pointAndClickOff", - - schemeFunctionDescription = -R"( -% \pointAndClickOff to reduce the size of the produced PDF file. -)", - - schemeFunctionCode = -R"( -\pointAndClickOff -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme functions for '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addGlissandoWithTextSchemeFunctionsToScore () -{ - string - schemeFunctionName = - "glissandoWithText", - - schemeFunctionDescription = -R"( -% \\glissandoTextOn/Off to get text along glissandos. -)", - - schemeFunctionCode = -R"( -% thanks to Thomas Morley for contributing this code - -%% c/p from lily-library.scm (it is not public) -#(define (sign x) - (if (= x 0) - 0 - (if (< x 0) -1 1))) - -#(define (radians->degree radians) - (/ (* radians 180) PI)) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Glissando with text -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Reads from Glissando.details -%%%% - glissando-text -%%%% - glissando-text-font-size -%%%% - glissando-text-padding - -#(define* ((gliss-plus-text #:optional always-add-text) grob) - (let* ((orig-grob (ly:grob-original grob)) - (broken-beams (ly:spanner-broken-into orig-grob)) - (stil (ly:line-spanner::print grob))) - (if (or (null? broken-beams) - (and (pair? broken-beams) - (or - always-add-text - (equal? grob (car broken-beams))))) - (if (not (ly:stencil? stil)) - #f - (let* ((layout (ly:grob-layout grob)) - (line-thickness - (ly:output-def-lookup layout 'line-thickness)) - (props - (ly:grob-alist-chain - grob - (ly:output-def-lookup layout 'text-font-defaults))) - (font - (ly:paper-get-font - layout - (cons - '((font-encoding . fetaMusic) (font-name . #f)) - props))) - (trill-glyph - (ly:font-get-glyph font "scripts.trill_element")) - (trill-glyph-height - (interval-length (ly:stencil-extent trill-glyph Y))) - (zigzag-width - (ly:grob-property grob 'zigzag-width)) - (thickness (ly:grob-property grob 'thickness)) - (thick - (if (number? thickness) - (/ thickness 10) - line-thickness)) - (style (ly:grob-property grob 'style)) - (corr - (cond ((eq? style 'trill) - trill-glyph-height) - ((eq? style 'zigzag) - (+ thick zigzag-width)) - (else 0))) - (stil-x-ext (ly:stencil-extent stil X)) - (stil-y-ext (ly:stencil-extent stil Y)) - (stil-x-length (- (cdr stil-x-ext) (car stil-x-ext))) - (stil-y-length (- (cdr stil-y-ext) (car stil-y-ext))) - (details (ly:grob-property grob 'details)) - (gliss-text - (assoc-get 'glissando-text details "gliss.")) - (gliss-text-font-size - (assoc-get 'glissando-text-font-size details -5)) - (gliss-text-padding - (assoc-get 'glissando-text-padding details 0.5)) - (left-bound-info (ly:grob-property grob 'left-bound-info)) - (y-left (assoc-get 'Y left-bound-info)) - (right-bound-info (ly:grob-property grob 'right-bound-info)) - (y-right (assoc-get 'Y right-bound-info)) - (slant (sign (- y-right y-left))) - (gradient - (/ (- stil-y-length corr) stil-x-length)) - ;; `ly:stencil-rotate' needs an angle in degrees... - ;; TODO use ly:angle ? - (alpha - (radians->degree - (angle - (make-rectangular - stil-x-length - (- stil-y-length corr line-thickness))))) - (text-stencil - (grob-interpret-markup - grob - (make-halign-markup CENTER - (make-fontsize-markup - gliss-text-font-size - gliss-text)))) - (text-stencil-height - (interval-length (ly:stencil-extent text-stencil Y))) - (y-move - (+ - (/ text-stencil-height 2) - gliss-text-padding)) - (rotated-text-stil - (ly:stencil-rotate text-stencil (* slant alpha) 0 0)) - (text-center-X - (interval-center (ly:stencil-extent rotated-text-stil X))) - (translated-text-stencil - (ly:stencil-translate - rotated-text-stil - ;; Constuction-helpers - ;text-stencil - ;(make-cross-stencil '(0 . 0)) ;; not included atm - (cons - (+ - (car stil-x-ext) - (/ stil-x-length 2) - (* slant -1 y-move gradient)) - (+ - (car stil-y-ext) - (/ stil-y-length 2) - y-move))))) - (ly:stencil-add - stil - ;; Construction-helpers - ;; - ;(make-line-stencil - ; 0.1 - ; (+ (car stil-x-ext)(/ stil-x-length 2)) - ; (+ (car stil-y-ext)(/ stil-y-length 2)) - ; (+ (car stil-x-ext)(/ stil-x-length 2)(* slant -1 10 gradient)) - ; 10) - ;; - ;; (2) colors the text-part - ;; - ;(stencil-with-color translated-text-stencil red) - translated-text-stencil - ))) - stil))) - -glissandoTextOn = - \temporary \override Glissando.stencil = - #(gliss-plus-text - ;; change to true, if added text is wished for both parts of a broken - ;; glissando - ;; TODO added text at second parts needs to be improved, vertical - ;; positioning is sometimes bad - #f) - -glissandoTextOff = \revert Glissando.stencil -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme functions for '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addOtherDynamicSchemeFunctionToScore () -{ - string - schemeFunctionName = - "otherDynamic", - - schemeFunctionDescription = -R"( -% \\otherDynamic to handle any string as dynamics. -)", - - schemeFunctionCode = -R"( -#(use-modules (ice-9 regex)) - -otherDynamic = -#(define-event-function (parser location text) (markup?) - (if (string? text) - (let* ((underscores-replaced - (string-map - (lambda (x) (if (eq? x #\_) #\space x)) - text)) - (split-text (string-split underscores-replaced #\space)) - (formatted (map - (lambda (word) - (if (string-match "^[mrzfps]*$" word) - (markup #:dynamic word) - (markup #:normal-text #:italic word))) - split-text))) - #{ - #(make-dynamic-script (make-line-markup formatted)) - #}) - ;; user provided a full-blown markup, so we don't mess with it: - #{ - #(make-dynamic-script (markup #:normal-text text)) - #})) -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme functions for '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addCustomShortBarlineSchemeFunctionToScore () -{ - string - schemeModulesName = - "curstom short barline Scheme function", - - schemeModulesDescription = -R"( -% The function needed to produce curstom short barlines. -)", - - schemeModulesCode = -R"( -#(define ((make-custom-short-bar-line x y) grob extent) - "Draw a short bar line." - (let* ((short-staff (* 1/2 (ly:staff-symbol-staff-space grob))) - (staff-line-thickness (ly:staff-symbol-line-thickness grob)) - (height (interval-end extent))) - (bar-line::draw-filled-box - (cons 0 (+ x staff-line-thickness)) - (cons (- height (* 7 short-staff) x) (- height short-staff x)) - staff-line-thickness - extent - grob))) - -#(add-bar-glyph-print-procedure "/" (make-custom-short-bar-line 0.1 0.1)) - -#(define-bar-line "/" "/" #f #f) -)"; - - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Including Jianpu definition file '" << schemeModulesName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeModulesName, - schemeModulesDescription, - schemeModulesCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeModulesName] = - schemeFunction; -} - -void lpsrScore::addJianpuFileIncludeToScore () -{ - string - schemeModulesName = - "jianpu include file", - - schemeModulesDescription = -R"( -% The definitions needed to produce jianpu scores. -)", - - schemeModulesCode = -R"( -% From https://github.com/nybbs2003/lilypond-Jianpu -\include "jianpu10a.ly" -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Including Jianpu definition file '" << schemeModulesName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeModulesName, - schemeModulesDescription, - schemeModulesCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeModulesName] = - schemeFunction; -} - -void lpsrScore::addAccordionRegistrationSchemeModulesToScore () -{ - string - schemeModulesName = - "scm & accreg", - - schemeModulesDescription = -R"( -% Two modules are to be used in the right order to use accordion registration. -)", - - schemeModulesCode = -R"( -#(use-modules (scm accreg)) -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Using Scheme modules '" << schemeModulesName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeModulesName, - schemeModulesDescription, - schemeModulesCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeModulesName] = - schemeFunction; -} - -void lpsrScore::addTongueSchemeFunctionToScore () -{ - string - schemeFunctionName = - "tongue", - - schemeFunctionDescription = -R"( -% Creates multiple tongue technicals, argument is a number. -% Example: 'c4 -\tongue #3' creates a triple tongue. -)", - - schemeFunctionCode = -R"( -tongue = -#(define-music-function (parser location dots) (integer?) - (let ((script (make-music 'ArticulationEvent - 'articulation-type "staccato"))) - (set! (ly:music-property script 'tweaks) - (acons 'stencil - (lambda (grob) - (let ((stil (ly:script-interface::print grob))) - (let loop ((count (1- dots)) (new-stil stil)) - (if (> count 0) - (loop (1- count) - (ly:stencil-combine-at-edge new-stil X RIGHT stil 0.2)) - (ly:stencil-aligned-to new-stil X CENTER))))) - (ly:music-property script 'tweaks))) - script)) -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addEditorialAccidentalSchemeFunctionToScore () -{ - string - schemeFunctionName = - "editorialAccidental", - - schemeFunctionDescription = -R"( -% Craetes editorial accidentals as LilyPond musica ficta. -% Example: '\editorialAccidental cis4'. -)", - - schemeFunctionCode = -R"( -editorialAccidental = -#(define-music-function - (note) - (ly:music?) - #{ - \once\accidentalStyle forget - \once\set suggestAccidentals = ##t - #note - #}) -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addDynamicsSchemeFunctionToScore () -{ - string - schemeFunctionName = - "dynamics", - - schemeFunctionDescription = -R"( -% Creates variables define dynamics not native to LilyPond. -)", - - schemeFunctionCode = -R"( -rf = #(make-dynamic-script "rf") -sfpp = #(make-dynamic-script "sfpp") -sffz = #(make-dynamic-script "sffz") -ppppp = #(make-dynamic-script "ppppp") -pppppp = #(make-dynamic-script "pppppp") -fffff = #(make-dynamic-script "fffff") -ffffff = #(make-dynamic-script "ffffff") -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addTupletsCurvedBracketsSchemeFunctionToScore () -{ - string - schemeFunctionName = - "tupletsCurvedBrackets", - - schemeFunctionDescription = -R"( -% A function to draw curved tuplets brackets, not native to LilyPond. -% Thanks to Ben, mailto:soundsfromsound@gmail.com -)", - - schemeFunctionCode = -R"( -tupletsCurvedBrackets = { - % Use slur-stencil - \override TupletBracket.stencil = #ly:slur::print - %% Use 'thickness from Slur - \override TupletBracket.thickness = #1.2 - %% 'control-points need to be set - \override TupletBracket.control-points = - #(lambda (grob) - (let* ((x-pos (ly:grob-property grob 'X-positions)) - (pos (ly:grob-property grob 'positions)) - (x-ln (interval-length x-pos)) - (dir (ly:grob-property grob 'direction)) - ;; read out the height of the TupletBracket, may be - ;; negative! - (height (- (cdr pos) (car pos))) - ;; height-corr is introduced because sometimes the shape - ;; of the slur needs to be adjusted. - ;; It is used in the 2nd/3rd control-point. - ;; The value of 0.3 is found by trial and error - (height-corr (* 0.3 dir height)) - (edge-height (ly:grob-property grob 'edge-height - '(0.7 . 0.7))) - (pad 1.0)) - (list - ;; first cp - (cons - (+ (car x-pos) 0.5) - (- (+ (* dir pad) (+ (car pos) (* -1 dir - (car edge-height)))) - (if (= dir -1) - (if (> height 3) - (/ dir 2.0) - 0.0) - (if (< height -3) - (/ dir 2.0) - 0.0)))) - ;; second cp - (cons - (+ (car x-pos) (* x-ln 1/4)) - (+ (* dir pad) (+ (car pos) (* dir (+ 0.5 height-corr))))) - ;; third cp - (cons - (+ (car x-pos) (* x-ln 3/4)) - (+ (* dir pad) (+ (cdr pos) (* dir (- 0.5 height-corr))))) - ;; fourth cp - (cons - (- (cdr x-pos) 0.5) - (+ (* dir pad) (+ (cdr pos) (* -1 dir (cdr edge-height))))) - ))) - \override TupletBracket.staff-padding = #' () - #(define (invert-direction x) (if (eq? UP - (ly:tuplet-bracket::calc-direction x)) DOWN UP)) - % \override TupletBracket.direction = #invert-direction -} -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addAfterSchemeFunctionToScore () -{ - string - schemeFunctionName = - "after", - - schemeFunctionDescription = -R"( -% A function to create events after given music. -% Thanks to David Kastrup for the inspiration! -)", - - schemeFunctionCode = -R"( -after = -#(define-music-function (t e m) (ly:duration? ly:music? ly:music?) - #{ - \context Bottom << - #m - { \skip $t <> -\tweak extra-spacing-width #empty-interval $e } - >> - #}) -)"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addTempoRelationshipSchemeFunctionToScore () -{ - string - schemeFunctionName = - "tempoRelationship", - - schemeFunctionDescription = -R"( -% A function to create tempo relationships, -% such as 'b8 [ b8 ]' = '\tuplet 3/2 { b4 b8 }' for swing. -% See http://lsr.di.unimi.it/LSR/Item?id=204 -)", - - schemeFunctionCode = - // add ! before ( and after ) since the code contains )" -R"!( -tempoRelationshipStaffReduce = #-3 - -tempoRelationship = -#(define-music-function (parser location label parenthesized musicI musicII) - (string? boolean? ly:music? ly:music?) - (let* ( - (left-paren (if parenthesized "(" "")) - (right-paren (if parenthesized ")" "")) - ) - #{ - \tempo \markup { - \line \general-align #Y #DOWN { - % 1st column in line - $label - - % 2nd column in line - - $left-paren - - \score { - \new Staff \with { - % reduce the font size a la cue - fontSize = #tempoRelationshipStaffReduce - \override StaffSymbol.staff-space = #(magstep tempoRelationshipStaffReduce) - % hide the staff lines - \override StaffSymbol.line-count = #0 - % align horizontally - \override VerticalAxisGroup.Y-extent = #'(-0.85 . 0) - } - - { - % \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1/2) % super-tight - % \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 1/4) % tight - % \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 3/16) % even - \override Score.SpacingSpanner.common-shortest-duration = #(ly:make-moment 5/32) % even - - % the left music - \relative c' { \stemUp $musicI } - - % the equivalence sign - \once \override Score.TextScript.Y-offset = #-0.4 - s4.^\markup{ - \halign #-1 "=" - } - - % the right music - \relative c' { \stemUp $musicII } - } - - \layout { - indent = 0 - \context { - \Staff - \remove "Clef_engraver" - \remove "Time_signature_engraver" - } - } % layout end - } % score end - - $right-paren - - } % line end - } % markup end - #})) -)!"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addDampMarkupToScore () -{ - string - schemeFunctionName = - "dampMarkup", - - schemeFunctionDescription = -R"( -% A function to create damp markups, -)", - - schemeFunctionCode = - // add ! before ( and after ) since the code contains )" -R"!( -damp = \markup { -% \scale #'(5 . 5) - { - \center-column { - { - \override #'(thickness . 1.8) - \combine \draw-line #'(-1.5 . 0) - \combine \draw-line #'(0 . -1.5) - \combine \draw-line #'(0 . 1.5) - \combine \draw-line #'(1.5 . 0) - \draw-circle #0.8 #0.2 ##f - } - } - } - -} -)!"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addDampAllMarkupToScore () -{ - string - schemeFunctionName = - "dampAllMarkup", - - schemeFunctionDescription = -R"( -% A function to create damp all markups, -)", - - schemeFunctionCode = - // add ! before ( and after ) since the code contains )" -R"!( -dampAll = \markup -%% do not use 'fontsize -%\scale #'(5 . 5) -{ - \combine \bold "O" - \path #0.2 - #'((moveto -.4 .8)(lineto 2.2 .8) - (closepath) - (moveto .9 -.5)(lineto .9 2.1)) -} -)!"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addWhiteNoteHeadsToScore () -{ - string - schemeFunctionName = - "whiteNoteHeads", - - schemeFunctionDescription = -R"( -% A function to display note shorter than a quarter with white heads, -% as in some ancient music scores -)", - - schemeFunctionCode = - // add ! before ( and after ) since the code contains )" -R"!( -whiteNoteHeads = -#(define-music-function (music) (ly:music?) - #{ - \temporary \override NoteHead.stencil = #ly:text-interface::print - \temporary \override NoteHead.text = \markup { - \musicglyph "noteheads.s1" - } - \omit \time 3/4 - \shiftDurations #1 #0 { #music } - \omit \time 3/2 - \revert NoteHead.stencil - \revert NoteHead.text - #} - ) -)!"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addBoxAroundNextBarNumberToScore () -{ - string - schemeFunctionName = - "boxAroundNextBarNumber", - - schemeFunctionDescription = -R"( -% A macro to draw a box round the next bar number -)", - - schemeFunctionCode = - // add ! before ( and after ) since the code contains )" -R"!( -boxAroundNextBarNumber = { - \once\override Score.BarNumber.font-size = 2 - \once\override Score.BarNumber.stencil = - #(make-stencil-boxer 0.25 0.5 ly:text-interface::print) -} -)!"; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addJazzChordsDisplayToScore () -{ - stringstream s; - - s << -R"###(% Exception music is chords with markups -#(define (lower-extension pitch chbass) - "Return lowered markup for pitch note name." - #{ - \markup \raise #-1.9 \halign #0.2 - #(note-name->markup pitch chbass) - #}) - -chExceptionMusic = {)###" << - endl; - - if (gLilypondOah->fJazzChordsDisplay) { - s << - gLilypondOah->fJazzChordsDisplayLilypondcode; - } - - list >& - chordsDisplayList = - gLilypondOah->fChordsDisplayList; - - if (chordsDisplayList.size ()) { - list >::const_iterator - iBegin = chordsDisplayList.begin (), - iEnd = chordsDisplayList.end (), - i = iBegin; - - for ( ; ; ) { - s << - gTab << - (*i).first << - "1-\\markup { " << - (*i).second << - " }" << - endl; - if (++i == iEnd) break; - // s << endl; - } // for - } - - s << - "}" << - endl << - endl << -R"###(% Convert music to list and prepend to existing exceptions. -chExceptions = #( append - ( sequential-music-to-chord-exceptions chExceptionMusic #t) - ignatzekExceptions))###" << - endl << - endl; - - string - schemeFunctionName = - "jazzChordsDisplay", - - schemeFunctionDescription = -R"( -% A function to display the chords in a common Jazz way using \chordmode -)", - - schemeFunctionCode = s.str (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -void lpsrScore::addColoredLedgerLinesToScore () -{ - stringstream s; - - s << -R"###(% there is ony one ledger line spanner/grob/stencil -% produced for each musical system on the page (!) -% see: ledger-line-spanner.cc for c++ code for ly:ledger-line-spanner::print - -#(define (MyLedgerLineSpannerPrint grob) - (let* - ((stil (ly:ledger-line-spanner::print grob)) - ;; (ifaces (ly:grob-interfaces grob)) - - (noteheads (ly:grob-object grob 'note-heads)) - (new-stil (box-stencil (stencil-with-color stil (rgb-color )###"; - - s << - gLilypondOah->fLedgerLinesRGBColor.getR () << - " " << - gLilypondOah->fLedgerLinesRGBColor.getG () << - " " << - gLilypondOah->fLedgerLinesRGBColor.getB (); - - s << -R"###()) 0.1 1)) - ) - - (display "noteheads: ")(display noteheads)(newline)(newline) - ;; (display (ly:grob-properties grob))(newline)(newline) - ;; (display ifaces)(newline)(newline) - - new-stil)) -)###"; - - string - schemeFunctionName = - "coloredLedgerLines", - - schemeFunctionDescription = -R"( -% A function to color the staves ledger lines other that black -)", - - schemeFunctionCode = s.str (); - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceSchemeFunctions) { - gLogOstream << - "Creating Scheme function '" << schemeFunctionName << "'" << - endl; - } -#endif - - // create the Scheme function - S_lpsrSchemeFunction - schemeFunction = - lpsrSchemeFunction::create ( - 1, // inputLineNumber, JMI ??? - schemeFunctionName, - schemeFunctionDescription, - schemeFunctionCode); - - // register it in the Scheme functions map - fScoreSchemeFunctionsMap [schemeFunctionName] = - schemeFunction; -} - -/* JMI -void lpsrScore::appendVoiceUseToStoreCommand (S_msrVoice voice) -{ - S_lpsrUseVoiceCommand - useVoiceCommand = - lpsrUseVoiceCommand::create ( - fInputLineNumber, - voice); - - fScoreBlock-> - appendVoiceUseToParallelMusicBLock (useVoiceCommand); -} - -void lpsrScore::appendLyricsUseToStoreCommand (S_msrStanza stanza) -{ - S_lpsrNewLyricsBlock - newLyricsCommand = - lpsrNewLyricsBlock::create ( - fInputLineNumber, - stanza, - stanza->getStanzaVoiceUpLink ()); - - fScoreBlock-> - appendLyricsUseToParallelMusicBLock (newLyricsCommand); -} -*/ - -void lpsrScore::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrScore::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrScore elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrScore::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrScore::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrScore::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrScore elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrScore::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrScore::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrScore::browseData ()" << - endl; - } -#endif - - { - // browse the score LilyPond version - msrBrowser browser (v); - browser.browse (*fLilypondVersion); - } - - if (fInputSourceNameComment) { - // browse the input source name comment - msrBrowser browser (v); - browser.browse (*fInputSourceNameComment); - } - - if (fTranslationDateComment) { - // browse the translation date comment - msrBrowser browser (v); - browser.browse (*fTranslationDateComment); - } - - if (fCommandLineAsSuppliedComment) { - // browse the command line as supplied comment - msrBrowser browser (v); - browser.browse (*fCommandLineAsSuppliedComment); - } - - if (fCommandLineLongOptionsComment) { - // browse the command line long options comment - msrBrowser browser (v); - browser.browse (*fCommandLineLongOptionsComment); - } - - if (fCommandLineShortOptionsComment) { - // browse the command line short options comment - msrBrowser browser (v); - browser.browse (*fCommandLineShortOptionsComment); - } - - { - // browse the score global staff size - msrBrowser browser (v); - browser.browse (*fScoreGlobalStaffSizeSchemeVariable); - } - - { - // browse the Scheme function map - for ( - map::const_iterator i = - fScoreSchemeFunctionsMap.begin (); - i != fScoreSchemeFunctionsMap.end (); - i++ - ) { - // browse the Scheme function - msrBrowser browser (v); - browser.browse (*(*i).second); - } // for - } - - { - // browse the score header - msrBrowser browser (v); - browser.browse (*fScoreHeader); - } - - { - // browse the score paper - msrBrowser browser (v); - browser.browse (*fScorePaper); - } - - if (fScoreLayout) { // JMI - // browse the score layout - msrBrowser browser (v); - browser.browse (*fScoreLayout); - } - - { - // browse the myBreakIsBreak assoc - msrBrowser browser (v); - browser.browse (*fMyBreakIsBreakAssoc); - } - { - // browse the myBreakIsEmpty assoc - msrBrowser browser (v); - browser.browse (*fMyBreakIsEmptyAssoc); - } - - { - // browse the myPageBreakIsPageBreak assoc - msrBrowser browser (v); - browser.browse (*fMyPageBreakIsPageBreakAssoc); - } - { - // browse the myPageBreakIsEmpty assoc - msrBrowser browser (v); - browser.browse (*fMyPageBreakIsEmptyAssoc); - } - - if (fScoreGlobalAssoc) { - // browse the 'global' assoc - msrBrowser browser (v); - browser.browse (*fScoreGlobalAssoc); - } - - { - // browse the voices and stanzas list - for ( - list::const_iterator i = fScoreElementsList.begin (); - i != fScoreElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } - - { - // browse the score blocks list - for ( - list::const_iterator i = fScoreBookBlocksList.begin (); - i != fScoreBookBlocksList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrScore::browseData ()" << - endl; - } -#endif -} - -void lpsrScore::print (ostream& os) const -{ - os << - "LPSR Score" << - endl << - endl; - - gIndenter++; - - // print the MSR structure (without the voices) - fMsrScore-> - printSummary (os); - os << endl; - - // are some Scheme functions needed? - const int fieldWidth = 42; - - os << left << - setw (fieldWidth) << - "TongueSchemeFunctionIsNeeded" << " : " << - booleanAsString ( - fTongueSchemeFunctionIsNeeded) << - endl << - setw (fieldWidth) << - "EditorialAccidentalSchemeFunctionIsNeeded" << " : " << - booleanAsString ( - fEditorialAccidentalSchemeFunctionIsNeeded) << - endl << - endl; - - // print LPSR basic information - os << - fLilypondVersion << - endl << - - fScoreGlobalStaffSizeSchemeVariable << - endl << - - fScoreHeader << - // no endl here - - fScorePaper << - endl << - - fScoreLayout << - endl; - -// myBreakAssoc,myPageBreakAssoc globalAssoc? JMI - - // print the voices and stanzas - if (fScoreElementsList.size ()) { - list::const_iterator - iBegin = fScoreElementsList.begin (), - iEnd = fScoreElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - os << endl; - } - - // print the book blocks - if (fScoreBookBlocksList.size ()) { - list::const_iterator - iBegin = fScoreBookBlocksList.begin (), - iEnd = fScoreBookBlocksList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - os << endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrScore& scr) -{ - scr->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrScores.h b/src/lilypond/lpsrScores.h deleted file mode 100644 index d7a5b8a3e..000000000 --- a/src/lilypond/lpsrScores.h +++ /dev/null @@ -1,443 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrScores___ -#define ___lpsrScores___ - -/* -#include -#include -#include -#include - - -#include "exports.h" -#include "typedefs.h" - -#include "msrBasicTypes.h" - - -#include "lpsrVarValAssocs.h" - -#include "lpsrScheme.h" -*/ - -#include "lpsrComments.h" - -#include "lpsrScheme.h" - -#include "lpsrHeaders.h" -#include "lpsrPapers.h" -#include "lpsrLayouts.h" - -#include "lpsrParallelMusic.h" -#include "lpsrVarValAssocs.h" - -#include "lpsrBookBlockElements.h" - -#include "msrScores.h" - -#include "msrMidi.h" - - -namespace MusicXML2 -{ - - -//______________________________________________________________________________ -class lpsrScore : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrScore mScore); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrScore ( - int inputLineNumber, - S_msrScore mScore); - - virtual ~lpsrScore (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrScore getMsrScore () const - { return fMsrScore; } - - S_lpsrVarValAssoc - getLilypondVersion () const - { return fLilypondVersion; } - - void setScoreGlobalStaffSizeSchemeVariable (float size); - - S_lpsrSchemeVariable - getScoreGlobalStaffSizeSchemeVariable () const - { return fScoreGlobalStaffSizeSchemeVariable; } - - S_lpsrHeader getScoreHeader () const - { return fScoreHeader; } - - S_lpsrPaper getScorePaper () const - { return fScorePaper; } - - S_lpsrLayout getScoreLayout () const - { return fScoreLayout; } - - const list& - getScoreElementsList () const - { return fScoreElementsList; } - - const list& - getScoreBookBlocksList () const - { return fScoreBookBlocksList; } - - S_lpsrScoreBlock getScoreScoreBlock () const - { return fScoreScoreBlock; } - - // files includes - // --------------------- - - void setJianpuFileIncludeIsNeeded (); - - bool getJianpuFileIncludeIsNeeded () const - { return fJianpuFileIncludeIsNeeded; } - - // Scheme modules - // --------------------- - - void setScmAndAccregSchemeModulesAreNeeded (); - - bool getScmAndAccregSchemeModulesAreNeeded () const - { return fScmAndAccregSchemeModulesAreNeeded; } - - // Scheme functions - // --------------------- - - // custom short bar lines - void setCustomShortBarlineSchemeFunctionIsNeeded (); - - bool getCustomShortBarlineSchemeFunctionIsNeeded () const - { return fCustomShortBarlineSchemeFunctionIsNeeded; } - - // tongue - void setTongueSchemeFunctionIsNeeded (); - - bool getTongueSchemeFunctionIsNeeded () const - { return fTongueSchemeFunctionIsNeeded; } - - - // editorial accidentals - void setEditorialAccidentalSchemeFunctionIsNeeded (); - - bool getEditorialAccidentalSchemeFunctionIsNeeded () const - { - return - fEditorialAccidentalSchemeFunctionIsNeeded; - } - - // dynamics - void setDynamicsSchemeFunctionIsNeeded (); - - bool getDynamicsSchemeFunctionIsNeeded () const - { - return - fDynamicsSchemeFunctionIsNeeded; - } - - // tuplets curved brackets - void setTupletsCurvedBracketsSchemeFunctionIsNeeded (); - - bool getTupletsCurvedBracketsSchemeFunctionIsNeeded () const - { - return - fTupletsCurvedBracketsSchemeFunctionIsNeeded; - } - - // after - void setAfterSchemeFunctionIsNeeded (); - - bool getAfterSchemeFunctionIsNeeded () const - { - return - fAfterSchemeFunctionIsNeeded; - } - - // tempo relationships - void setTempoRelationshipSchemeFunctionIsNeeded (); - - bool getTempoRelationshipSchemeFunctionIsNeeded () const - { - return - fTempoRelationshipSchemeFunctionIsNeeded; - } - - // glissando with text - void setGlissandoWithTextSchemeFunctionsIsNeeded (); - - bool getGlissandoWithTextSchemeFunctionsIsNeeded () const - { - return - fGlissandoWithTextSchemeFunctionsIsNeeded; - } - - // other dynamic - void setOtherDynamicSchemeFunctionIsNeeded (); - - bool getOtherDynamicSchemeFunctionIsNeeded () const - { - return - fOtherDynamicSchemeFunctionIsNeeded; - } - - // damps - void setDampMarkupIsNeeded (); - - bool getDampMarkupIsNeeded () const - { - return - fDampMarkupIsNeeded; - } - - void setDampAllMarkupIsNeeded (); - - bool getDampAllMarkupIsNeeded () const - { - return - fDampAllMarkupIsNeeded; - } - - // white note heads - void setWhiteNoteHeadsIsNeeded (); - - bool getWhiteNoteHeadsIsNeeded () const - { - return - fWhiteNoteHeadsIsNeeded; - } - - // bar numbers - void setBoxAroundNextBarNumberIsNeeded (); - - bool getBoxAroundNextBarNumberIsNeeded () const - { - return - fBoxAroundNextBarNumberIsNeeded; - } - - // jazz chords display - void setJazzChordsDisplayIsNeeded (); - - bool getJazzChordsDisplayIsNeeded () const - { - return - fJazzChordsDisplayIsNeeded; - } - - // colored ledger lines - void setColoredLedgerLinesIsNeeded (); - - bool getColoredLedgerLinesIsNeeded () const - { - return - fColoredLedgerLinesIsNeeded; - } - - public: - - // public services - // ------------------------------------------------------ - - void appendVoiceToScoreElementsList ( - S_msrVoice voice) - { fScoreElementsList.push_back (voice); } - - void appendStanzaToScoreElementsList ( - S_msrStanza stanza) - { fScoreElementsList.push_back (stanza); } - - void appendBookBlockToBookBlocksList ( - S_lpsrBookBlock bookBlock) - { fScoreBookBlocksList.push_back (bookBlock); } - - void addGlissandoWithTextSchemeFunctionsToScore (); - - private: - - // private services - // ------------------------------------------------------ - - // files includes - - void addJianpuFileIncludeToScore (); - - // Scheme modules - - void addAccordionRegistrationSchemeModulesToScore (); - - // Scheme functions - - void addDateAndTimeSchemeFunctionsToScore (); - - void addPointAndClickOffSchemeFunctionsToScore (); - - void addCustomShortBarlineSchemeFunctionToScore (); - - void addTongueSchemeFunctionToScore (); - - void addEditorialAccidentalSchemeFunctionToScore (); - - void addDynamicsSchemeFunctionToScore (); - - void addTupletsCurvedBracketsSchemeFunctionToScore (); - - void addAfterSchemeFunctionToScore (); - - void addTempoRelationshipSchemeFunctionToScore (); - - void addOtherDynamicSchemeFunctionToScore (); - - // markups - - void addDampMarkupToScore (); - void addDampAllMarkupToScore (); - - // white note heads - - void addWhiteNoteHeadsToScore (); - - // bar numbers - void addBoxAroundNextBarNumberToScore (); - - // jazz chords display - - void addJazzChordsDisplayToScore (); - - // colored ledger lines - - void addColoredLedgerLinesToScore (); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // MSR data - S_msrScore fMsrScore; - - // general information - S_lpsrVarValAssoc fLilypondVersion; - - // command line - S_lpsrComment fInputSourceNameComment; - S_lpsrComment fTranslationDateComment; - S_lpsrComment fCommandLineAsSuppliedComment; - S_lpsrComment fCommandLineLongOptionsComment; - S_lpsrComment fCommandLineShortOptionsComment; - - // scaling - S_lpsrSchemeVariable fScoreGlobalStaffSizeSchemeVariable; // JMI - - // LilyPond stuff - S_lpsrHeader fScoreHeader; - S_lpsrPaper fScorePaper; - S_lpsrLayout fScoreLayout; - - // to keep the original line breaks - S_lpsrVarValAssoc fMyBreakIsBreakAssoc; - S_lpsrVarValAssoc fMyBreakIsEmptyAssoc; - - // to keep the original page breaks - S_lpsrVarValAssoc fMyPageBreakIsPageBreakAssoc; - S_lpsrVarValAssoc fMyPageBreakIsEmptyAssoc; - - // to generate 'global' variable - S_lpsrVarValAssoc fScoreGlobalAssoc; - - // variables, voices and stanzas - list fScoreElementsList; - - // score LPSR book blocks list - list fScoreBookBlocksList; - S_lpsrScoreBlock fScoreScoreBlock; // JMI ??? - - // files includes - bool fJianpuFileIncludeIsNeeded; - - // Scheme modules - bool fScmAndAccregSchemeModulesAreNeeded; - - // Scheme functions - bool fTongueSchemeFunctionIsNeeded; - bool fCustomShortBarlineSchemeFunctionIsNeeded; - bool fEditorialAccidentalSchemeFunctionIsNeeded; - bool fDynamicsSchemeFunctionIsNeeded; - bool fTupletsCurvedBracketsSchemeFunctionIsNeeded; - bool fAfterSchemeFunctionIsNeeded; - bool fTempoRelationshipSchemeFunctionIsNeeded; - bool fGlissandoWithTextSchemeFunctionsIsNeeded; - bool fOtherDynamicSchemeFunctionIsNeeded; - - // markups - bool fDampMarkupIsNeeded; - bool fDampAllMarkupIsNeeded; - - // white note heads - bool fWhiteNoteHeadsIsNeeded; - - // bar numbers - bool fBoxAroundNextBarNumberIsNeeded; - - // jazz chords display - bool fJazzChordsDisplayIsNeeded; - - // colored ledger lines - bool fColoredLedgerLinesIsNeeded; - - map - fScoreSchemeFunctionsMap; -}; -typedef SMARTP S_lpsrScore; -EXP ostream& operator<< (ostream& os, const S_lpsrScore& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrStaves.cpp b/src/lilypond/lpsrStaves.cpp deleted file mode 100644 index ffd6f03bb..000000000 --- a/src/lilypond/lpsrStaves.cpp +++ /dev/null @@ -1,497 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrStaves.h" - -#include "lpsrVoices.h" -#include "lpsrLyrics.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrNewStaffgroupBlock lpsrNewStaffgroupBlock::create ( - int inputLineNumber) -{ - lpsrNewStaffgroupBlock* o = - new lpsrNewStaffgroupBlock ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrNewStaffgroupBlock::lpsrNewStaffgroupBlock ( - int inputLineNumber) - : lpsrElement (inputLineNumber) -{} - -lpsrNewStaffgroupBlock::~lpsrNewStaffgroupBlock () -{} - -void lpsrNewStaffgroupBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewStaffgroupBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewStaffgroupBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewStaffgroupBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrNewStaffgroupBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewStaffgroupBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewStaffgroupBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewStaffgroupBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrNewStaffgroupBlock::browseData (basevisitor* v) -{} - -void lpsrNewStaffgroupBlock::print (ostream& os) const -{ - os << "NewStaffgroupBlock" << endl; - - gIndenter++; - - int size = fNewStaffgroupElements.size (); - - for (int i = 0; i < size; i++ ) { - os << fNewStaffgroupElements[i]; - } // for - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrNewStaffgroupBlock& nstf) -{ - nstf->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrNewStaffTuningBlock lpsrNewStaffTuningBlock::create ( - int inputLineNumber, - S_msrStaffTuning staffTuning) -{ - lpsrNewStaffTuningBlock* o = - new lpsrNewStaffTuningBlock ( - inputLineNumber, staffTuning); - assert(o!=0); - return o; -} - -lpsrNewStaffTuningBlock::lpsrNewStaffTuningBlock ( - int inputLineNumber, - S_msrStaffTuning staffTuning) - : lpsrElement (inputLineNumber) -{ - fStaffTuning = staffTuning; -} - -lpsrNewStaffTuningBlock::~lpsrNewStaffTuningBlock () -{} - -void lpsrNewStaffTuningBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewStaffTuningBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewStaffTuningBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewStaffTuningBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrNewStaffTuningBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewStaffTuningBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewStaffTuningBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewStaffTuningBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrNewStaffTuningBlock::browseData (basevisitor* v) -{} - -void lpsrNewStaffTuningBlock::print (ostream& os) const -{ - os << "NewStaffTuningBlock" << endl; - - gIndenter++; - - os << - fStaffTuning; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrNewStaffTuningBlock& nstf) -{ - nstf->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrNewStaffBlock lpsrNewStaffBlock::create ( - int inputLineNumber) -{ - lpsrNewStaffBlock* o = - new lpsrNewStaffBlock ( - inputLineNumber); - assert(o!=0); - return o; -} - -lpsrNewStaffBlock::lpsrNewStaffBlock ( - int inputLineNumber) - : lpsrElement (inputLineNumber) -{} - -lpsrNewStaffBlock::~lpsrNewStaffBlock () -{} - -void lpsrNewStaffBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewStaffBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewStaffBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewStaffBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrNewStaffBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrNewStaffBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrNewStaffBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrNewStaffBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrNewStaffBlock::browseData (basevisitor* v) -{} - -void lpsrNewStaffBlock::print (ostream& os) const -{ - os << "NewStaffBlock" << endl; - - gIndenter++; - - int size = fNewStaffElements.size (); - - for (int i = 0; i < size; i++ ) { - os << fNewStaffElements[i]; - } // for - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrNewStaffBlock& nstf) -{ - nstf->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrStaffBlock lpsrStaffBlock::create ( - S_msrStaff staff) -{ - lpsrStaffBlock* o = new lpsrStaffBlock ( - staff); - assert(o!=0); - return o; -} - -lpsrStaffBlock::lpsrStaffBlock ( - S_msrStaff staff) - : lpsrElement (0) // JMI -{ - // sanity check - msrAssert ( - staff != nullptr, - "staff is null"); - - fStaff = staff; - - // set staff block instrument names - fStaffBlockInstrumentName = - fStaff-> - getStaffInstrumentName (); - fStaffBlockShortInstrumentName = - fStaff-> - getStaffInstrumentAbbreviation (); -} - -lpsrStaffBlock::~lpsrStaffBlock () -{} - -void lpsrStaffBlock::appendVoiceUseToStaffBlock (S_msrVoice voice) -{ - S_lpsrUseVoiceCommand - useVoiceCommand = - lpsrUseVoiceCommand::create ( - fInputLineNumber, - voice); - - fStaffBlockElements.push_back (useVoiceCommand); -} - -void lpsrStaffBlock::appendLyricsUseToStaffBlock (S_msrStanza stanza) -{ - S_lpsrNewLyricsBlock - newLyricsCommand = - lpsrNewLyricsBlock::create ( - fInputLineNumber, - stanza, - stanza->getStanzaVoiceUpLink ()); - - fStaffBlockElements.push_back (newLyricsCommand); -} - -void lpsrStaffBlock::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrStaffBlock::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrStaffBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrStaffBlock::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrStaffBlock::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrStaffBlock::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrStaffBlock elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrStaffBlock::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrStaffBlock::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrStaffBlock::browseData ()" << - endl; - } -#endif - - for ( - list::const_iterator i = fStaffBlockElements.begin (); - i != fStaffBlockElements.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== lpsrStaffBlock::browseData ()" << - endl; - } -#endif -} - -void lpsrStaffBlock::print (ostream& os) const -{ - os << - "StaffBlock for staff \"" << - fStaff->getStaffName () << - "\" (" << fStaff->staffKindAsString () << - "), " << - singularOrPlural ( - fStaffBlockElements.size (), "element", "elements") << - endl; - - gIndenter++; - - const int fieldWidth = 31; - - os << left << - setw (fieldWidth) << - "(StaffBlockInstrumentName" << " = \"" << fStaffBlockInstrumentName << - "\")" << - endl << - setw (fieldWidth) << - "(StaffBlockShortInstrumentName" << " = \"" << fStaffBlockShortInstrumentName << - "\")" << - endl << - endl; - - if (fStaffBlockElements.size ()) { - list::const_iterator - iBegin = fStaffBlockElements.begin (), - iEnd = fStaffBlockElements.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrStaffBlock& scr) -{ - scr->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrStaves.h b/src/lilypond/lpsrStaves.h deleted file mode 100644 index aec5167a7..000000000 --- a/src/lilypond/lpsrStaves.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrStaves___ -#define ___lpsrStaves___ - -#include - -#include "lpsrElements.h" - -#include "msr.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrNewStaffgroupBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrNewStaffgroupBlock ( - int inputLineNumber); - - virtual ~lpsrNewStaffgroupBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - vector fNewStaffgroupElements; -}; -typedef SMARTP S_lpsrNewStaffgroupBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrNewStaffgroupBlock& elt); - -//______________________________________________________________________________ -class lpsrNewStaffTuningBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrStaffTuning staffTuning); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrNewStaffTuningBlock ( - int inputLineNumber, - S_msrStaffTuning staffTuning); - - virtual ~lpsrNewStaffTuningBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrStaffTuning getStaffTuning () const - { return fStaffTuning; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrStaffTuning fStaffTuning; -}; -typedef SMARTP S_lpsrNewStaffTuningBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrNewStaffTuningBlock& elt); - -//______________________________________________________________________________ -class lpsrNewStaffBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrNewStaffBlock ( - int inputLineNumber); - - virtual ~lpsrNewStaffBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - vector fNewStaffElements; -}; -typedef SMARTP S_lpsrNewStaffBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrNewStaffBlock& elt); - -//______________________________________________________________________________ -class lpsrStaffBlock : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - S_msrStaff staff); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrStaffBlock ( - S_msrStaff staff); - - virtual ~lpsrStaffBlock (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrStaff getStaff () const - { return fStaff; } - - const list& - getStaffBlockElements () const - { return fStaffBlockElements; } - - void setStaffBlockInstrumentName ( - string instrumentName) - { - fStaffBlockInstrumentName = - instrumentName; - } - - string getStaffBlockInstrumentName () const - { return fStaffBlockInstrumentName; } - - void setStaffBlockShortInstrumentName ( - string shortInstrumentName) - { - fStaffBlockShortInstrumentName = - shortInstrumentName; - } - - string getStaffBlockShortInstrumentName () const - { return fStaffBlockShortInstrumentName; } - - public: - - // public services - // ------------------------------------------------------ - - void appendVoiceUseToStaffBlock ( - S_msrVoice voice); - - void appendLyricsUseToStaffBlock ( - S_msrStanza stanza); - - void appendElementToStaffBlock ( - S_msrElement elem) - { fStaffBlockElements.push_back (elem); } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrStaff fStaff; - - list fStaffBlockElements; - - string fStaffBlockInstrumentName; - string fStaffBlockShortInstrumentName; -}; -typedef SMARTP S_lpsrStaffBlock; -EXP ostream& operator<< (ostream& os, const S_lpsrStaffBlock& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrVarValAssocs.cpp b/src/lilypond/lpsrVarValAssocs.cpp deleted file mode 100644 index c8c1ae67a..000000000 --- a/src/lilypond/lpsrVarValAssocs.cpp +++ /dev/null @@ -1,620 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "lpsrVarValAssocs.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -string const lpsrVarValAssoc::g_LilyPondVarValAssocNoUnit = ""; -string const lpsrVarValAssoc::g_LilyPondVarValAssocNoComment = ""; - -S_lpsrVarValAssoc lpsrVarValAssoc::create ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - lpsrBackSlashKind backSlashKind, - lpsrVarValAssocKind - lilyPondVarValAssocKind, - lpsrVarValSeparatorKind varValSeparatorKind, - lpsrQuotesKind quotesKind, - string value, - string unit, - msrFontStyleKind varValFontStyleKind, - msrFontWeightKind varValFontWeightKind, - string comment, - lpsrEndlKind endlKind) -{ - lpsrVarValAssoc* o = - new lpsrVarValAssoc( - inputLineNumber, - commentedKind, - backSlashKind, - lilyPondVarValAssocKind, - varValSeparatorKind, - quotesKind, - value, - unit, - varValFontStyleKind, - varValFontWeightKind, - comment, - endlKind); - assert(o!=0); - return o; -} - -lpsrVarValAssoc::lpsrVarValAssoc ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - lpsrBackSlashKind backSlashKind, - lpsrVarValAssocKind - lilyPondVarValAssocKind, - lpsrVarValSeparatorKind varValSeparatorKind, - lpsrQuotesKind quotesKind, - string value, - string unit, - msrFontStyleKind varValFontStyleKind, - msrFontWeightKind varValFontWeightKind, - string comment, - lpsrEndlKind endlKind) - : lpsrElement (inputLineNumber) -{ - fBackSlashKind = backSlashKind; - fLilyPondVarValAssocKind = lilyPondVarValAssocKind; - fVarValSeparatorKind = varValSeparatorKind; - fQuotesKind = quotesKind; - - fVariableValue = value; - fCommentedKind = commentedKind; - fUnit = unit; - - fVarValFontStyleKind = varValFontStyleKind; - fVarValFontWeightKind = varValFontWeightKind; - - fComment = comment; - - fEndlKind = endlKind; -} - -lpsrVarValAssoc::~lpsrVarValAssoc () -{} - -void lpsrVarValAssoc::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrVarValAssoc::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrVarValAssoc elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrVarValAssoc::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrVarValAssoc::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrVarValAssoc::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrVarValAssoc elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrVarValAssoc::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrVarValAssoc::browseData (basevisitor* v) -{} - -string lpsrVarValAssoc::lilyPondVarValAssocKindAsString ( - lpsrVarValAssocKind lilyPondVarValAssocKind) -{ - string result; - - switch (lilyPondVarValAssocKind) { - // library - - case lpsrVarValAssoc::kLibraryVersion: - result = "version"; - break; - - // MusicXML informations - - case lpsrVarValAssoc::kMusicXMLWorkNumber: - result = "workNumber"; - break; - case lpsrVarValAssoc::kMusicXMLWorkTitle: - result = "workTitle"; - break; - case lpsrVarValAssoc::kMusicXMLMovementNumber: - result = "movementNumber"; - break; - case lpsrVarValAssoc::kMusicXMLMovementTitle: - result = "movementTitle"; - break; - - case lpsrVarValAssoc::kMusicXMLEncodingDate: - result = "encodingDate"; - break; - - case lpsrVarValAssoc::kMusicXMLScoreInstrument: - result = "scoreInstrument"; - break; - - case lpsrVarValAssoc::kMusicXMLMiscellaneousField: - result = "miscellaneousField"; - break; - - // LilyPond informations - - case lpsrVarValAssoc::kLilypondDedication: - result = "dedication"; - break; - - case lpsrVarValAssoc::kLilypondPiece: - result = "piece"; - break; - case lpsrVarValAssoc::kLilypondOpus: - result = "opus"; - break; - - case lpsrVarValAssoc::kLilypondTitle: - result = "title"; - break; - case lpsrVarValAssoc::kLilypondSubTitle: - result = "subTitle"; - break; - case lpsrVarValAssoc::kLilypondSubSubTitle: - result = "subSubTitle"; - break; - - case lpsrVarValAssoc::kLilypondInstrument: - result = "instrument"; - break; - case lpsrVarValAssoc::kLilypondMeter: - result = "meter"; - break; - - case lpsrVarValAssoc::kLilypondTagline: - result = "tagline"; - break; - case lpsrVarValAssoc::kLilypondCopyright: - result = "copyright"; - break; - - case lpsrVarValAssoc::kLilypondMyBreak: - result = "myBreak"; - break; - case lpsrVarValAssoc::kLilypondMyPageBreak: - result = "myPageBreak"; - break; - - case lpsrVarValAssoc::kLilypondGlobal: - result = "global"; - break; - } // switch - - return result; -} - -string lpsrVarValAssoc::commentedKindAsString ( - lpsrCommentedKind commentedKind) -{ - string result; - - switch (commentedKind) { - case lpsrVarValAssoc::kCommentedYes: - result = "commentedYes"; - break; - case lpsrVarValAssoc::kCommentedNo: - result = "commentedNo"; - break; - } // switch - - return result; -} - -string lpsrVarValAssoc::backSlashKindAsString ( - lpsrBackSlashKind backSlashKind) -{ - string result; - - switch (backSlashKind) { - case lpsrVarValAssoc::kWithBackSlashYes: - result = "withBackSlashYes"; - break; - case lpsrVarValAssoc::kWithBackSlashNo: - result = "withBackSlashNo"; - break; - } // switch - - return result; -} - -string lpsrVarValAssoc::varValSeparatorKindAsString ( - lpsrVarValSeparatorKind varValSeparatorKind) -{ - string result; - - switch (varValSeparatorKind) { - case lpsrVarValAssoc::kVarValSeparatorSpace: - result = "varValSeparatorSpace"; - break; - case lpsrVarValAssoc::kVarValSeparatorEqualSign: - result = "varValSeparatorEqualSign"; - break; - } // switch - - return result; -} - -string lpsrVarValAssoc::quotesKindAsString ( - lpsrQuotesKind quotesKind) -{ - string result; - - switch (quotesKind) { - case lpsrVarValAssoc::kQuotesAroundValueYes: - result = "quotesAroundValueYes"; - break; - case lpsrVarValAssoc::kQuotesAroundValueNo: - result = "quotesAroundValueNo"; - break; - } // switch - - return result; -} - -string lpsrVarValAssoc::endlKindAsString ( - lpsrEndlKind endlKind) -{ - string result; - - switch (endlKind) { - case lpsrVarValAssoc::kEndlNone: - result = "endlNone"; - break; - case lpsrVarValAssoc::kEndlOnce: - result = "endlOnce"; - break; - case lpsrVarValAssoc::kEndlTwice: - result = "endlTwice"; - break; - } // switch - - return result; -} - -void lpsrVarValAssoc::print (ostream& os) const -{ - os << - "LPSR VarValAssoc" << - endl; - - gIndenter++; - - // escape quotes if any - string variableValue; - - for_each ( - fVariableValue.begin (), - fVariableValue.end (), - stringQuoteEscaper (variableValue)); - - const int fieldWidth = 24; - - os << left << - setw (fieldWidth) << - "lilyPondVarValAssocKind" << " : " << - lilyPondVarValAssocKindAsString () << - endl << - - setw (fieldWidth) << - "variableValue" << " : \"" << - variableValue << - "\"" << - endl << - - setw (fieldWidth) << - "varValFontStyleKind" << " : " << - msrFontStyleKindAsString ( - fVarValFontStyleKind) << - endl << - - setw (fieldWidth) << - "varValFontWeightKind" << " : " << - msrFontWeightKindAsString ( - fVarValFontWeightKind) << - endl << - - setw (fieldWidth) << - "commentedKind" << " : " << - commentedKindAsString ( - fCommentedKind) << - endl << - - setw (fieldWidth) << - "back slash kind" << " : " << - backSlashKindAsString ( - fBackSlashKind) << - endl << - - setw (fieldWidth) << - "varValSeparatorKind" << " : " << - varValSeparatorKindAsString ( - fVarValSeparatorKind) << - endl << - - setw (fieldWidth) << - "quotesKind" << " : " << - quotesKindAsString ( - fQuotesKind) << - endl << - - setw (fieldWidth) << - "unit" << " : "; - - if (fUnit.size ()) { - os << "\"" << fUnit << "\""; - } - else { - os << "none"; - } - os << endl; - - os << - setw (fieldWidth) << - "comment" << " : "; - - if (fComment.size ()) { - os << "\"" << fComment << "\""; - } - else { - os << "none"; - } - os << endl; - - os << - setw (fieldWidth) << - "endlKind" << " : " << - endlKindAsString ( - fEndlKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrVarValAssoc& assoc) { - assoc->print (os); - return os; -} - -//______________________________________________________________________________ -S_lpsrVarValsListAssoc lpsrVarValsListAssoc::create ( - int inputLineNumber, - lpsrVarValsListAssocKind varValsListAssocKind) -{ - lpsrVarValsListAssoc* o = - new lpsrVarValsListAssoc ( - inputLineNumber, - varValsListAssocKind); - assert(o!=0); - return o; -} - -lpsrVarValsListAssoc::lpsrVarValsListAssoc ( - int inputLineNumber, - lpsrVarValsListAssocKind varValsListAssocKind) - : lpsrElement (inputLineNumber) -{ - fVarValsListAssocKind = varValsListAssocKind; -} - -lpsrVarValsListAssoc::~lpsrVarValsListAssoc () -{} - -void lpsrVarValsListAssoc::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrVarValsListAssoc::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrVarValsListAssoc elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrVarValsListAssoc::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrVarValsListAssoc::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrVarValsListAssoc::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrVarValsListAssoc elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrVarValsListAssoc::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrVarValsListAssoc::browseData (basevisitor* v) -{} - -string lpsrVarValsListAssoc::lilyPondVarValsListAssocValuesAsString ( - lpsrVarValsListAssocKind varValsListAssocKind) -{ - string result; - - switch (varValsListAssocKind) { - // MusicXML informations - - case lpsrVarValsListAssoc::kMusicXMLRights: - result = "rights"; - break; - - case lpsrVarValsListAssoc::kMusicXMLComposer: - result = "composer"; - break; - case lpsrVarValsListAssoc::kMusicXMLArranger: - result = "arranger"; - break; - case lpsrVarValsListAssoc::kMusicXMLPoet: - result = "poet"; - break; - case lpsrVarValsListAssoc::kMusicXMLLyricist: - result = "lyricist"; - break; - case lpsrVarValsListAssoc::kMusicXMLTranslator: - result = "translator"; - break; - case lpsrVarValsListAssoc::kMusicXMLArtist: - result = "artist"; - break; - - case lpsrVarValsListAssoc::kMusicXMLSoftware: - result = "software"; - break; - } // switch - - return result; -} - -string lpsrVarValsListAssoc::lilyPondVarValsListAssocValuesAsString () const -{ - stringstream s; - - list::const_iterator - iBegin = fVariableValuesList.begin (), - iEnd = fVariableValuesList.end (), - i = iBegin; - - s << "["; - for ( ; ; ) { - s << "\"" << (*i) << "\""; - if (++i == iEnd) break; - s << ", "; - } // for - s << "]"; - - return s.str (); -} - -void lpsrVarValsListAssoc::print (ostream& os) const -{ - os << - "LPSR VarValsListAssoc" << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - os << left << - setw (fieldWidth) << - "assoc kind" << " : " << - lilyPondVarValsListAssocKindAsString () << - endl << - - setw (fieldWidth) << - "variable values" << " : " << - endl; - - gIndenter++; - - list::const_iterator - iBegin = fVariableValuesList.begin (), - iEnd = fVariableValuesList.end (), - i = iBegin; - - for ( ; ; ) { - os << "\"" << (*i) << "\""; - if (++i == iEnd) break; - os << endl; - } // for - - os << endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrVarValsListAssoc& assoc) { - assoc->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrVarValAssocs.h b/src/lilypond/lpsrVarValAssocs.h deleted file mode 100644 index 856bd6f35..000000000 --- a/src/lilypond/lpsrVarValAssocs.h +++ /dev/null @@ -1,358 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrVarValAssocs___ -#define ___lpsrVarValAssocs___ - -#include -#include - -#include "lpsrElements.h" - -#include "msrBasicTypes.h" - - -using namespace std; - -namespace MusicXML2 - -{ - -//______________________________________________________________________________ -class lpsrVarValAssoc : public lpsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - // data types - // ------------------------------------------------------ - - enum lpsrVarValAssocKind { - // library - - kLibraryVersion, - - // MusicXML informations - - kMusicXMLWorkNumber, kMusicXMLWorkTitle, - kMusicXMLMovementNumber, kMusicXMLMovementTitle, - kMusicXMLEncodingDate, - kMusicXMLScoreInstrument, - kMusicXMLMiscellaneousField, - - // LilyPond informations - - kLilypondDedication, - kLilypondPiece, kLilypondOpus, - kLilypondTitle, kLilypondSubTitle, kLilypondSubSubTitle, - kLilypondInstrument, kLilypondMeter, - kLilypondTagline, kLilypondCopyright, - - kLilypondMyBreak, kLilypondMyPageBreak, - kLilypondGlobal }; - - static string lilyPondVarValAssocKindAsString ( - lpsrVarValAssocKind lilyPondVarValAssocKind); - - enum lpsrCommentedKind { - kCommentedYes, kCommentedNo }; - - static string commentedKindAsString ( - lpsrCommentedKind commentedKind); - - enum lpsrBackSlashKind { - kWithBackSlashYes, kWithBackSlashNo }; - - static string backSlashKindAsString ( - lpsrBackSlashKind backSlashKind); - - enum lpsrVarValSeparatorKind { - kVarValSeparatorSpace, kVarValSeparatorEqualSign }; - - static string varValSeparatorKindAsString ( - lpsrVarValSeparatorKind varValSeparatorKind); - - enum lpsrQuotesKind { - kQuotesAroundValueYes, kQuotesAroundValueNo }; - - static string quotesKindAsString ( - lpsrQuotesKind quotesKind); - - enum lpsrEndlKind { - kEndlNone, kEndlOnce, kEndlTwice }; - - static string endlKindAsString ( - lpsrEndlKind endlKind); - - static string const g_LilyPondVarValAssocNoUnit; - static string const g_LilyPondVarValAssocNoComment; - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - lpsrBackSlashKind backSlashKind, - lpsrVarValAssocKind - lilyPondVarValAssocKind, - lpsrVarValSeparatorKind varValSeparatorKind, - lpsrQuotesKind quotesKind, - string value, - string unit, - msrFontStyleKind varValFontStyleKind, - msrFontWeightKind varValFontWeightKind, - string comment, - lpsrEndlKind endlKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrVarValAssoc ( - int inputLineNumber, - lpsrCommentedKind commentedKind, - lpsrBackSlashKind backSlashKind, - lpsrVarValAssocKind - lilyPondVarValAssocKind, - lpsrVarValSeparatorKind varValSeparatorKind, - lpsrQuotesKind quotesKind, - string value, - string unit, - msrFontStyleKind varValFontStyleKind, - msrFontWeightKind varValFontWeightKind, - string comment, - lpsrEndlKind endlKind); - - virtual ~lpsrVarValAssoc (); - - public: - - // set and get - // ------------------------------------------------------ - - lpsrCommentedKind getCommentedKind () const - { return fCommentedKind; } - - lpsrBackSlashKind getBackSlashKind () const - { return fBackSlashKind; } - - lpsrVarValAssocKind - getLilyPondVarValAssocKind () const - { return fLilyPondVarValAssocKind; } - - lpsrVarValSeparatorKind - getVarValSeparatorKind () const - { return fVarValSeparatorKind; } - - lpsrQuotesKind getQuotesKind () const - { return fQuotesKind; } - - void setVariableValue (string value) - { fVariableValue = value; } - - string getVariableValue () const - { return fVariableValue; } - - string getUnit () const - { return fUnit; } - - msrFontStyleKind getVarValFontStyleKind () const - { return fVarValFontStyleKind; } - - msrFontWeightKind getVarValFontWeightKind () const - { return fVarValFontWeightKind; } - - string getComment () const - { return fComment; } - - lpsrEndlKind getEndlKind () const - { return fEndlKind; } - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string lilyPondVarValAssocKindAsString () const - { - return - lilyPondVarValAssocKindAsString ( - fLilyPondVarValAssocKind); - } - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrCommentedKind fCommentedKind; - lpsrBackSlashKind fBackSlashKind; - lpsrVarValAssocKind - fLilyPondVarValAssocKind; - lpsrVarValSeparatorKind - fVarValSeparatorKind; - lpsrQuotesKind fQuotesKind; - - string fVariableValue; - string fUnit; - - msrFontStyleKind fVarValFontStyleKind; - msrFontWeightKind fVarValFontWeightKind; - - string fComment; - - lpsrEndlKind fEndlKind; -}; -typedef SMARTP S_lpsrVarValAssoc; -EXP ostream& operator<< (ostream& os, const S_lpsrVarValAssoc& elt); - -//______________________________________________________________________________ -class lpsrVarValsListAssoc : public lpsrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum lpsrVarValsListAssocKind { - // MusicXML informations - kMusicXMLRights, - kMusicXMLComposer, kMusicXMLArranger, - kMusicXMLPoet, kMusicXMLLyricist, kMusicXMLTranslator, - kMusicXMLArtist, - kMusicXMLSoftware }; - -/* - % The following fields are centered - dedication = "Dedication" - title = "Title" - subtitle = "Subtitle" - subsubtitle = "Subsubtitle" - % The following fields are evenly spread on one line - % the field "instrument" also appears on following pages - instrument = \markup \with-color #green "Instrument" - poet = "Poet" - composer = "Composer" - % The following fields are placed at opposite ends of the same line - meter = "Meter" - arranger = "Arranger" - % The following fields are centered at the bottom - tagline = "tagline goes at the bottom of the last page" - copyright = "copyright goes at the bottom of the first page" -*/ - - static string lilyPondVarValsListAssocValuesAsString ( - lpsrVarValsListAssocKind varValsListAssocKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - lpsrVarValsListAssocKind varValsListAssocKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrVarValsListAssoc ( - int inputLineNumber, - lpsrVarValsListAssocKind varValsListAssocKind); - - virtual ~lpsrVarValsListAssoc (); - - public: - - // set and get - // ------------------------------------------------------ - - lpsrVarValsListAssocKind - getVarValsListAssocKind () const - { return fVarValsListAssocKind; } - - const list& getVariableValuesList () - { return fVariableValuesList; } - - // services - // ------------------------------------------------------ - - void addAssocVariableValue (string value) - { - fVariableValuesList.push_back (value); - } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string lilyPondVarValsListAssocKindAsString () const - { - return - lilyPondVarValsListAssocValuesAsString ( - fVarValsListAssocKind); - } - - string lilyPondVarValsListAssocValuesAsString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - lpsrVarValsListAssocKind - fVarValsListAssocKind; - - list fVariableValuesList; -}; -typedef SMARTP S_lpsrVarValsListAssoc; -EXP ostream& operator<< (ostream& os, const S_lpsrVarValsListAssoc& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/lpsrVariables.cpp b/src/lilypond/lpsrVariables.cpp deleted file mode 100644 index 4bb665ee1..000000000 --- a/src/lilypond/lpsrVariables.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrVariables.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrVariableUseCommand lpsrVariableUseCommand::create ( - int inputLineNumber, - string variableName) -{ - lpsrVariableUseCommand* o = - new lpsrVariableUseCommand ( - inputLineNumber, variableName); - assert(o!=0); - return o; -} - -lpsrVariableUseCommand::lpsrVariableUseCommand ( - int inputLineNumber, - string variableName) - : lpsrElement (inputLineNumber) -{ - fVariableName = variableName; -} - -lpsrVariableUseCommand::~lpsrVariableUseCommand() -{} - -void lpsrVariableUseCommand::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrVariableUseCommand::acceptIn()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrVariableUseCommand elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrVariableUseCommand::visitStart()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrVariableUseCommand::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrVariableUseCommand::acceptOut()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrVariableUseCommand elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrVariableUseCommand::visitEnd()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrVariableUseCommand::browseData (basevisitor* v) -{} - -void lpsrVariableUseCommand::print (ostream& os) const -{ - os << "VariableUseCommand" << endl; - gIndenter++; - os << fVariableName << endl; - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_lpsrVariableUseCommand& nstf) -{ - nstf->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrVariables.h b/src/lilypond/lpsrVariables.h deleted file mode 100644 index 3d9ee5489..000000000 --- a/src/lilypond/lpsrVariables.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrVariables___ -#define ___lpsrVariables___ - -#include - -#include "lpsrElements.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrVariableUseCommand : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string variableName); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrVariableUseCommand ( - int inputLineNumber, - string variableName); - - virtual ~lpsrVariableUseCommand (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fVariableName; -}; -typedef SMARTP S_lpsrVariableUseCommand; -EXP ostream& operator<< (ostream& os, const S_lpsrVariableUseCommand& elt); - - -} - - -#endif diff --git a/src/lilypond/lpsrVoices.cpp b/src/lilypond/lpsrVoices.cpp deleted file mode 100644 index d68fab021..000000000 --- a/src/lilypond/lpsrVoices.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "lpsrVoices.h" - -#include "lpsrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_lpsrUseVoiceCommand lpsrUseVoiceCommand::create ( - int inputLineNumber, - S_msrVoice voice) -{ - lpsrUseVoiceCommand* o = - new lpsrUseVoiceCommand ( - inputLineNumber, - voice); - assert(o!=0); - return o; -} - -lpsrUseVoiceCommand::lpsrUseVoiceCommand ( - int inputLineNumber, - S_msrVoice voice) - : lpsrElement (inputLineNumber) -{ - fVoice = voice; -} - -lpsrUseVoiceCommand::~lpsrUseVoiceCommand () -{} - -void lpsrUseVoiceCommand::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrUseVoiceCommand::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrUseVoiceCommand elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrUseVoiceCommand::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void lpsrUseVoiceCommand::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> lpsrUseVoiceCommand::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_lpsrUseVoiceCommand elem = this; - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> Launching lpsrUseVoiceCommand::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void lpsrUseVoiceCommand::browseData (basevisitor* v) -{} - -void lpsrUseVoiceCommand::print (ostream& os) const -{ - os << - "UseVoiceCommand" << " \"" << - fVoice->getVoiceName () << - "\", " << - singularOrPlural ( - fVoice->getVoiceStanzasMap ().size (), "stanza", "stanzas") << - endl; -} - -ostream& operator<< (ostream& os, const S_lpsrUseVoiceCommand& nlc) -{ - nlc->print (os); - return os; -} - - -} diff --git a/src/lilypond/lpsrVoices.h b/src/lilypond/lpsrVoices.h deleted file mode 100644 index a3186490e..000000000 --- a/src/lilypond/lpsrVoices.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___lpsrVoices___ -#define ___lpsrVoices___ - -#include - -#include "lpsrElements.h" - -#include "msr.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class lpsrUseVoiceCommand : public lpsrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrVoice voice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - lpsrUseVoiceCommand ( - int inputLineNumber, - S_msrVoice voice); - - virtual ~lpsrUseVoiceCommand (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrVoice getVoice () const { return fVoice; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrVoice fVoice; -}; -typedef SMARTP S_lpsrUseVoiceCommand; -EXP ostream& operator<< (ostream& os, const S_lpsrUseVoiceCommand& elt); - - -} - - -#endif diff --git a/src/lilypond/messagesHandling.cpp b/src/lilypond/messagesHandling.cpp deleted file mode 100644 index 0058a45ae..000000000 --- a/src/lilypond/messagesHandling.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "utilities.h" - -#include "messagesHandling.h" - -#include "musicXMLOah.h" -#include "generalOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -void msrAssert ( - bool condition, - string messageIfFalse) -{ - if (! condition) { - gLogOstream << - "#### msrAssert failure: " << messageIfFalse << - ", aborting." << - endl; - - abort (); - } -} - -//______________________________________________________________________________ -void msrWarning ( - string context, - string inputSourceName, - int inputLineNumber, - string message) -{ - if (! gGeneralOah->fQuiet) { - gLogOstream << - "*** " << context << " warning *** " << - inputSourceName << ":" << inputLineNumber << ": " <fQuiet) { - if (gGeneralOah->fDisplaySourceCodePosition) { - gLogOstream << - baseName (sourceCodeFileName) << ":" << sourceCodeLineNumber << - " "; - } - - if (! gGeneralOah->fDontShowErrors) { - gLogOstream << - "### " << context << " ERROR ### " << - inputSourceName << ":" << inputLineNumber << ": " << message << - endl; - - gErrorsInputLineNumbers.insert (inputLineNumber); - } - } -} - -//______________________________________________________________________________ -void msrMusicXMLError ( - string inputSourceName, - int inputLineNumber, - string sourceCodeFileName, - int sourceCodeLineNumber, - string message) -{ - msrError ( - "MusicXML", - inputSourceName, - inputLineNumber, - sourceCodeFileName, - sourceCodeLineNumber, - message); - - if (! gGeneralOah->fDontShowErrors) { - if (! gGeneralOah->fDontAbortOnErrors) { - abort (); - } - else { - exit (15); - } - } -} - -//______________________________________________________________________________ -void lpsrMusicXMLError ( - string inputSourceName, - int inputLineNumber, - string sourceCodeFileName, - int sourceCodeLineNumber, - string message) -{ - msrError ( - "LPSR", - inputSourceName, - inputLineNumber, - sourceCodeFileName, - sourceCodeLineNumber, - message); - - if (! gGeneralOah->fDontShowErrors) { - exit (16); - } -} - -//______________________________________________________________________________ -void msrInternalError ( - string inputSourceName, - int inputLineNumber, - string sourceCodeFileName, - int sourceCodeLineNumber, - string message) -{ - msrError ( - "MSR INTERNAL", - inputSourceName, - inputLineNumber, - sourceCodeFileName, - sourceCodeLineNumber, - message); - - abort (); -} - -void msrLimitation ( - string inputSourceName, - int inputLineNumber, - string sourceCodeFileName, - int sourceCodeLineNumber, - string message) -{ - if (! (gGeneralOah->fQuiet && gGeneralOah->fDontShowErrors)) { - if (gGeneralOah->fDisplaySourceCodePosition) { - gLogOstream << - baseName (sourceCodeFileName) << ":" << sourceCodeLineNumber << - " "; - } - - gLogOstream << - "### MSR LIMITATION ### " << - inputSourceName << ":" << inputLineNumber << ": " << message << - endl; - - abort (); - } -} - -//______________________________________________________________________________ -void msrStreamsError ( - int inputLineNumber, - string sourceCodeFileName, - int sourceCodeLineNumber, - string message) -{ - if (! (gGeneralOah->fQuiet && gGeneralOah->fDontShowErrors)) { - if (gGeneralOah->fDisplaySourceCodePosition) { - gLogOstream << - baseName (sourceCodeFileName) << ":" << sourceCodeLineNumber << - " "; - } - - gLogOstream << - "### " << "MSR STREAMS" << " ERROR ### " << - "fake line number" << ":" << inputLineNumber << ": " << message << - endl; - } - - abort (); -} - -void msrStreamsWarning ( - int inputLineNumber, - string sourceCodeFileName, - int sourceCodeLineNumber, - string message) -{ - if (! (gGeneralOah->fQuiet && gGeneralOah->fDontShowErrors)) { - if (gGeneralOah->fDisplaySourceCodePosition) { - gLogOstream << - baseName (sourceCodeFileName) << ":" << sourceCodeLineNumber << - " "; - } - - gLogOstream << - "*** " << "MSR STREAMS" << " warning *** " << - " ### " << "MSR STREAMS" << " ERROR ### " << - "fake line number" << ":" << inputLineNumber << ": " << message << - endl; - } - - abort (); -} - -//______________________________________________________________________________ -std::set gWarningsInputLineNumbers; -std::set gErrorsInputLineNumbers; - -void displayWarningsAndErrorsInputLineNumbers () -{ - int warningsInputLineNumbersSize = - gWarningsInputLineNumbers.size (); - - if (warningsInputLineNumbersSize && ! gGeneralOah->fQuiet) { - gLogOstream << - "Warning message(s) were issued for input " << - singularOrPluralWithoutNumber ( - warningsInputLineNumbersSize, "line", "lines") << - " "; - - set::const_iterator - iBegin = gWarningsInputLineNumbers.begin (), - iEnd = gWarningsInputLineNumbers.end (), - i = iBegin; - for ( ; ; ) { - gLogOstream << (*i); - if (++i == iEnd) break; - gLogOstream << ", "; - } // for - - gLogOstream << endl; - } - - int errorsInputLineNumbersSize = - gErrorsInputLineNumbers.size (); - - if (errorsInputLineNumbersSize) { - gLogOstream << - endl << - "Error message(s) were issued for input " << - singularOrPluralWithoutNumber ( - errorsInputLineNumbersSize, "line", "lines") << - " "; - - set::const_iterator - iBegin = gErrorsInputLineNumbers.begin (), - iEnd = gErrorsInputLineNumbers.end (), - i = iBegin; - for ( ; ; ) { - gLogOstream << (*i); - if (++i == iEnd) break; - gLogOstream << ", "; - } // for - - gLogOstream << endl; - } -} - -} diff --git a/src/lilypond/messagesHandling.h b/src/lilypond/messagesHandling.h deleted file mode 100644 index 355f5be8d..000000000 --- a/src/lilypond/messagesHandling.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___messagesHandling___ -#define ___messagesHandling___ - -#include // for 'setw()' -#include // for 'setw()' - -#include "exports.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -EXP void msrAssert ( - bool condition, - std::string messageIfFalse); - -//______________________________________________________________________________ -EXP void msrWarning ( - std::string context, - std::string inputSourceName, - int inputLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void msrMusicXMLWarning ( - std::string inputSourceName, - int inputLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void lpsrMusicXMLWarning ( - std::string inputSourceName, - int inputLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void msrInternalWarning ( - std::string inputSourceName, - int inputLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void msrError ( - std::string context, - std::string inputSourceName, - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void msrMusicXMLError ( - std::string inputSourceName, - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void lpsrMusicXMLError ( - std::string inputSourceName, - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void msrInternalError ( - std::string inputSourceName, - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void msrLimitation ( - std::string inputSourceName, - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP void msrStreamsError ( - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -EXP void msrStreamsWarning ( - int inputLineNumber, - std::string sourceCodeFileName, - int sourceCodeLineNumber, - std::string message); - -//______________________________________________________________________________ -EXP extern std::set gWarningsInputLineNumbers; -EXP extern std::set gErrorsInputLineNumbers; - -EXP void displayWarningsAndErrorsInputLineNumbers (); - -} - - -#endif diff --git a/src/lilypond/msr.cpp b/src/lilypond/msr.cpp deleted file mode 100644 index 1313e1b9c..000000000 --- a/src/lilypond/msr.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - - -#include "msr.h" - - -using namespace std; - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -void initializeMSR () -{ - initializeMSRBasicTypes (); -} - - -} diff --git a/src/lilypond/msr.h b/src/lilypond/msr.h deleted file mode 100644 index a85a58a6b..000000000 --- a/src/lilypond/msr.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msr___ -#define ___msr___ - -#include "typedefs.h" -#include "tree_browser.h" -#include "exports.h" - -#include "utilities.h" -#include "messagesHandling.h" - -#include "msrBasicTypes.h" - -#include "msrElements.h" - -#include "msrVarValAssocs.h" - -#include "msrIdentification.h" - -#include "msrLayouts.h" // JMI ??? -#include "msrScaling.h" - -#include "msrCredits.h" - -#include "msrDivisions.h" - -#include "msrPartNamesDisplays.h" - -#include "msrStavesDetails.h" - -#include "msrClefs.h" -#include "msrKeys.h" -#include "msrTimes.h" - -#include "msrTempos.h" - -#include "msrRehearsals.h" - -#include "msrWords.h" - -#include "msrTranspositions.h" - -#include "msrBreaks.h" - -#include "msrStems.h" -#include "msrBeams.h" - -#include "msrTechnicals.h" - -#include "msrBars.h" - -#include "msrDynamics.h" -#include "msrArticulations.h" - -#include "msrTablatures.h" -#include "msrInstruments.h" -#include "msrOtherElements.h" - -#include "msrTies.h" -#include "msrSlurs.h" -#include "msrLigatures.h" - -#include "msrSingleTremolos.h" - -#include "msrSlashes.h" - -#include "msrScores.h" -#include "msrPartGroups.h" - -#include "msrMutualDependencies.h" - -#include "msrMidi.h" - -#include "generalOah.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -void EXP initializeMSR (); - - -} - -#endif diff --git a/src/lilypond/msr2BsrTranslator.cpp b/src/lilypond/msr2BsrTranslator.cpp deleted file mode 100644 index 1e05907dd..000000000 --- a/src/lilypond/msr2BsrTranslator.cpp +++ /dev/null @@ -1,6693 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // INT_MIN, INT_MAX -#include // for_each - -#include "conversions.h" - -#include "msr2BsrTranslator.h" - -#include "msr.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" -#include "brailleOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -msr2BsrTranslator::msr2BsrTranslator ( - indentedOstream& ios, - S_msrScore mScore) - : fLogOutputStream (ios) -{ - // the MSR score we're visiting - fVisitedMsrScore = mScore; - - // pages & lines - fCurrentPrintPageNumber = 1; - fCurrentPrintLineNumber = 1; - - // notes - fCurrentNoteOctaveKind = bsrNote::kNoteOctaveNone; - fCurrentNoteValueSizeKind = bsrNote::kNoteValueSizeLarger; - -/* - // identification - fOnGoingIdentification = false; - - // header - fWorkNumberKnown = false; - fWorkTitleKnown = false; - fMovementNumberKnown = false; - fMovementTitleKnown = false; - - // staves - fOnGoingStaff = false; - - // voices - fOnGoingHarmonyVoice = false; - fOnGoingFiguredBassVoice = false; - - // repeats - - // measures - fMeasuresCounter = 0; - - // notes - fOnGoingNote = false; - - // double tremolos - fOnGoingDoubleTremolo = false; - - // grace notes - fOnGoingGraceNotesGroup = false; - - // chords - fOnGoingChord = false; - - // stanzas - fOnGoingStanza = false; - - // syllables - fOnGoingSyllableExtend = false; - */ -}; - -msr2BsrTranslator::~msr2BsrTranslator () -{} - -//________________________________________________________________________ -void msr2BsrTranslator::buildBsrScoreFromMsrScore () -{ - if (fVisitedMsrScore) { - // create a msrScore browser - msrBrowser browser (this); - - // browse the score with the browser - browser.browse (*fVisitedMsrScore); - } -} - -void msr2BsrTranslator::notSupportedMessage ( - int inputLineNumber, - string message) -{ - // issue a warning message to the output log stream - bsrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - message); - - // append a note to the BSR JMI -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrPageBreak& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPageBreak" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentPage = - bsrPage::create ( - inputLineNumber, - ++fCurrentPrintPageNumber, - gBrailleOah->fLinesPerPage); - - fBsrScore-> - appendPageToScore (fCurrentPage); -} - -void msr2BsrTranslator::visitEnd (S_msrPageBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrPageBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrLineBreak& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrLineBreak" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the line - fCurrentLine = - bsrLine::create ( - inputLineNumber, - ++fCurrentPrintLineNumber, - gBrailleOah->fCellsPerLine); - - // append it to the current page - fCurrentPage-> - appendLineToPage (fCurrentLine); - - // a note octave will be needed for the next note to come, - // i.e., the first one in the new line - fCurrentNoteOctaveKind = bsrNote::kNoteOctaveNone; -} - -void msr2BsrTranslator::visitEnd (S_msrLineBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrLineBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrScore& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrScore" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the BSR score - fBsrScore = - bsrScore::create ( - K_NO_INPUT_LINE_NUMBER, - fVisitedMsrScore); - - // get the worktitle if any - S_msrIdentification - identification = - elt->getIdentification (); - S_msrVarValAssoc - workTitleVarValAssoc = - identification->getWorkTitle (); - - string workTitle; - - if (workTitleVarValAssoc) { - workTitle = - workTitleVarValAssoc->getVariableValue (); - } - - // append a first transcription note to it - S_bsrTranscriptionNotesElement - transcriptionNotesElement = - bsrTranscriptionNotesElement::create ( - inputLineNumber, - "This braille music data created by " - + - gOahOah->fHandlerExecutableName); - - fBsrScore-> - getTranscriptionNotes ()-> - appendElementToTranscriptionNotes ( - transcriptionNotesElement); - - // create the first page - fCurrentPage = - bsrPage::create ( - inputLineNumber, - fCurrentPrintPageNumber, - gBrailleOah->fLinesPerPage); - - /* JMI - // create a pagination - S_bsrPagination - pagination = - bsrPagination::create ( - inputLineNumber, - 1, // printPageNumber - 1); // braillePageNumber - - // create the first page heading - fFirstPageHeading = - bsrPageHeading::create ( - inputLineNumber, - workTitle, - pagination, - 1); // pageHeadingNumber - - // append it to the first page - fCurrentPage-> - appendPageHeadingToPage (fFirstPageHeading); - */ - - // create the first music heading - fFirstMusicHeading = - bsrMusicHeading::create ( - inputLineNumber); - - // append it to the first page - fCurrentPage-> - appendMusicHeadingToPage (fFirstMusicHeading); - -/* JMI - // create a foot notes - S_bsrFootNotes - footNotes = - bsrFootNotes::create ( - inputLineNumber); - - // append a first transcription note to it - S_bsrFootNotesElement - footNotesElement = - bsrFootNotesElement::create ( - inputLineNumber, - "A sympathetic and most useful foot note"); - - footNotes-> - appendElementToFootNotes ( - footNotesElement); - - // append foot notes to the first page - fCurrentPage-> - appendFootNotesToPage (footNotes); -*/ - - // append first page to the score - fBsrScore-> - appendPageToScore (fCurrentPage); - - // create the fisrt line - fCurrentLine = - bsrLine::create ( - inputLineNumber, - fCurrentPrintLineNumber, - gBrailleOah->fCellsPerLine); - - // append the fisrt line to the first page - fCurrentPage-> - appendLineToPage (fCurrentLine); - - -/* - // create an empty clone of fVisitedMsrScore for use by the BSR score - // not sharing the visitiged MSR score allows cleaner data handling - // and optimisations of the BSR data - fCurrentMsrScoreClone = - fVisitedMsrScore-> - createScoreNewbornClone (); - - // fetch score header - fBsrScoreHeader = - fBsrScore-> getHeader(); - - // is there a rights option? - if (gLilypondOah->fRights.size ()) { - // define rights - - fBsrScoreHeader-> - addRights ( - inputLineNumber, - gLilypondOah->fRights); - } - - // is there a composer option? - if (gLilypondOah->fComposer.size ()) { - // define composer - - fBsrScoreHeader-> - addComposer ( - inputLineNumber, - gLilypondOah->fComposer); - } - - // is there an arranger option? - if (gLilypondOah->fArranger.size ()) { - // define arranger - - fBsrScoreHeader-> - addArranger ( - inputLineNumber, - gLilypondOah->fArranger); - } - - // is there a poet option? - if (gLilypondOah->fPoet.size ()) { - // define poet - - fBsrScoreHeader-> - addPoet ( - inputLineNumber, - gLilypondOah->fPoet); - } - - // is there a lyricist option? - if (gLilypondOah->fLyricist.size ()) { - // define lyricist - - fBsrScoreHeader-> - addLyricist ( - inputLineNumber, - gLilypondOah->fLyricist); - } - - // is there a software option? - if (gLilypondOah->fSoftware.size ()) { - // define software - - fBsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fSoftware); - } - - // is the Scheme function 'whiteNoteHeads' to be generated? - if (gLilypondOah->fWhiteNoteHeads) { - fBsrScore-> - // this score needs the 'whiteNoteHeads' Scheme function - setWhiteNoteHeadsIsNeeded (); - } - - // is Jianpu notation to be generated? - if (gLilypondOah->fJianpu) { - fBsrScore-> - // this score needs the 'jianpu file include' Scheme function - setJianpuFileIncludeIsNeeded (); - } - */ -} - -void msr2BsrTranslator::visitEnd (S_msrScore& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrScore" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - if (fWorkTitleKnown && fMovementTitleKnown) { - string - workTitle = - fCurrentIdentification-> - getWorkTitle ()-> - getVariableValue (), - movementTitle = - fCurrentIdentification-> - getMovementTitle ()-> - getVariableValue (); - - if ( - workTitle.size () == 0 - && - movementTitle.size () > 0) { - // use the movement title as the work title - fCurrentIdentification-> - setWorkTitle ( - inputLineNumber, movementTitle); - - fBsrScoreHeader-> - setWorkTitle ( - inputLineNumber, movementTitle); - - // forget the movement title - fCurrentIdentification-> - setMovementTitle ( - inputLineNumber, ""); - - fBsrScoreHeader-> - setMovementTitle ( - inputLineNumber, ""); - } - } - - else if (! fWorkTitleKnown && fMovementTitleKnown) { - string - movementTitle = - fCurrentIdentification-> - getMovementTitle ()-> - getVariableValue (); - - // use the movement title as the work title - fCurrentIdentification-> - setWorkTitle ( - inputLineNumber, movementTitle); - - fBsrScoreHeader-> - setWorkTitle ( - inputLineNumber, movementTitle); - - // forget the movement title - fCurrentIdentification-> - setMovementTitle ( - inputLineNumber, ""); - - fBsrScoreHeader-> - setMovementTitle ( - inputLineNumber, ""); - } - - // set ident and short indent if needed - setPaperIndentsIfNeeded ( - elt->getGeometry ()); - */ -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrPartGroup& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPartGroup " << - elt->getPartGroupCombinedName () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentPartGroup = elt; -} - -void msr2BsrTranslator::visitEnd (S_msrPartGroup& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrPartGroup " << - elt->getPartGroupCombinedName () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - string - partCombinedName = - elt->getPartCombinedName (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPart " << - partCombinedName << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts || gTraceOah->fTraceMeasures) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - gIndenter++; - - fCurrentPart = elt; -} - -void msr2BsrTranslator::visitEnd (S_msrPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - gIndenter--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts || gTraceOah->fTraceMeasures) { - fLogOutputStream << - "--> End visiting msrPart " << - elt->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrStaffTuning& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStaffTuning" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a staff tuning clone - fCurrentStaffTuning = elt; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrStaffDetails& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStaffDetails" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentStaffTuning = nullptr; -} - -void msr2BsrTranslator::visitEnd (S_msrStaffDetails& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrStaffDetails" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrStaff& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStaff \"" << - elt->getStaffName () << "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - - fCurrentStaff = elt; -} - -void msr2BsrTranslator::visitEnd (S_msrStaff& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting S_msrStaff \"" << - elt->getStaffName () << "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrVoice& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVoice \"" << - elt->getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentVoice = elt; - - fRelativeOctaveReference = nullptr; - - gIndenter++; -} - -void msr2BsrTranslator::visitEnd (S_msrVoice& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrVoice \"" << - elt->getVoiceName () << "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrVoiceStaffChange& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVoiceStaffChange '" << - elt->asString () << "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrBarline& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarline" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - fLogOutputStream << - "Handling '" << - msrBarline::barlineCategoryKindAsString ( - elt->getBarlineCategory ()) << - endl; - } -#endif - - // get the MSR barline attributes - - msrBarline::msrBarlineStyleKind - mBarlineStyleKind = - elt->getBarlineStyleKind (); - - // let's go - - bsrBarline::bsrBarlineKind - bBarlineKind = bsrBarline::kBarlineKindNone; - - switch (mBarlineStyleKind) { - case msrBarline::kBarlineStyleNone: - break; - case msrBarline::kBarlineStyleRegular: - break; - case msrBarline::kBarlineStyleDotted: - bBarlineKind = bsrBarline::kBarlineKindSpecial; - break; - case msrBarline::kBarlineStyleDashed: - bBarlineKind = bsrBarline::kBarlineKindSpecial; - break; - case msrBarline::kBarlineStyleHeavy: - break; - case msrBarline::kBarlineStyleLightLight: - bBarlineKind = bsrBarline::kBarlineKindSectionalDouble; - break; - case msrBarline::kBarlineStyleLightHeavy: - bBarlineKind = bsrBarline::kBarlineKindFinalDouble; - break; - case msrBarline::kBarlineStyleHeavyLight: - break; - case msrBarline::kBarlineStyleHeavyHeavy: - break; - case msrBarline::kBarlineStyleTick: - break; - case msrBarline::kBarlineStyleShort: - break; - } // switch - - if (bBarlineKind == bsrBarline::kBarlineKindNone) { - stringstream s; - - s << - "MSR barline kind '" << - msrBarline::barlineStyleKindAsString (mBarlineStyleKind) << - "' is not supported in Braille music"; - - notSupportedMessage ( - inputLineNumber, - s.str ()); - } - else { - S_bsrBarline - barline = - bsrBarline::create ( - inputLineNumber, bBarlineKind); - - fCurrentMeasure-> - appendBarlineToMeasure (barline); - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrMeasure& elt) -{ - int - inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasure '" << - measureNumber << - "'" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create a measure - fCurrentMeasure = - bsrMeasure::create ( - inputLineNumber, - measureNumber); - - // append it to the current line - fCurrentLine-> - appendMeasureToLine (fCurrentMeasure); -} - -void msr2BsrTranslator::visitEnd (S_msrMeasure& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasure '" << - elt->getMeasureElementMeasureNumber () << - "'" << - ", line " << inputLineNumber << - endl; - } -#endif - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrClef& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrClef" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (gBsrOah->fIncludeClefs) { - bsrClef::bsrClefKind bClefKind = bsrClef::kClefKindNone; - - /* JMI - kClefModifiedBassForRightHandPartKind, - kClefModifiedTrebleForLeftHandPartKind }; - */ - - msrClef::msrClefKind mClefKind = elt->getClefKind (); - - switch (mClefKind) { - case msrClef::k_NoClef: - bClefKind = bsrClef::kClefKindNone; - break; - case msrClef::kTrebleClef: - bClefKind = bsrClef::kClefKindGTreble; - break; - case msrClef::kSopranoClef: - bClefKind = bsrClef::kClefKindNone; - break; - case msrClef::kMezzoSopranoClef: - break; - case msrClef::kAltoClef: - bClefKind = bsrClef::kClefKindNone; - break; - case msrClef::kTenorClef: - bClefKind = bsrClef::kClefKindCTenor; - break; - case msrClef::kBaritoneClef: - bClefKind = bsrClef::kClefKindFBaritone; - break; - case msrClef::kBassClef: - bClefKind = bsrClef::kClefKindFBass; - break; - case msrClef::kTrebleLine1Clef: - bClefKind = bsrClef::kClefKindGSoprano; - break; - case msrClef::kTrebleMinus15Clef: - break; - case msrClef::kTrebleMinus8Clef: - bClefKind = bsrClef::kClefKindGOttavaBassa; // JMI permute??? - break; - case msrClef::kTreblePlus8Clef: - bClefKind = bsrClef::kClefKindGOttavaAlta; // JMI permute??? - break; - case msrClef::kTreblePlus15Clef: - break; - case msrClef::kBassMinus15Clef: - break; - case msrClef::kBassMinus8Clef: - break; - case msrClef::kBassPlus8Clef: - break; - case msrClef::kBassPlus15Clef: - break; - case msrClef::kVarbaritoneClef: - break; - case msrClef::kTablature4Clef: - break; - case msrClef::kTablature5Clef: - break; - case msrClef::kTablature6Clef: - break; - case msrClef::kTablature7Clef: - break; - case msrClef::kPercussionClef: - break; - case msrClef::kJianpuClef: - break; - } // switch - - if (bClefKind == bsrClef::kClefKindNone) { - stringstream s; - - s << - "MSR clef kind '" << - msrClef::clefKindAsString (mClefKind) << - "' is not supported in Braille music"; - - notSupportedMessage ( - inputLineNumber, - s.str ()); - } - else { - S_bsrClef - clef = - bsrClef::create ( - inputLineNumber, bClefKind); - - fCurrentMeasure-> - appendClefToMeasure (clef); - } - } -} - -void msr2BsrTranslator::visitEnd (S_msrClef& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrClef" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrKey& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrKey" << - ", line " << inputLineNumber << - endl; - } -#endif - - // get MSR key attributes - - msrKey::msrKeyKind - mKeyKind = elt->getKeyKind (); - - msrQuarterTonesPitchKind - mTonicQuarterTonesPitchKind = - elt->getKeyTonicQuarterTonesPitchKind (); - - msrSemiTonesPitchKind - mSemiTonesPitchKind = - semiTonesPitchKindFromQuarterTonesPitchKind ( - mTonicQuarterTonesPitchKind); - - msrKey::msrKeyModeKind - mKeyModeKind = - elt->getKeyModeKind (); - - // let's go - - bsrKey::bsrKeyKind bKeyKind = bsrKey::kKeyKindNone; - int numberOfAlterations = 0; - - switch (mKeyKind) { - case msrKey::kTraditionalKind: - - // traditional keys - switch (mSemiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - break; - - case kC_TripleFlat_STP: - break; - case kC_DoubleFlat_STP: - break; - case kC_Flat_STP: - break; - case kC_Natural_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindNaturals; - numberOfAlterations = 0; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 3; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kC_Sharp_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 7; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 4; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kC_DoubleSharp_STP: - break; - case kC_TripleSharp_STP: - break; - - case kD_TripleFlat_STP: - break; - case kD_DoubleFlat_STP: - break; - case kD_Flat_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 5; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 8; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kD_Natural_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 2; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 1; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kD_Sharp_STP: - break; - case kD_DoubleSharp_STP: - break; - case kD_TripleSharp_STP: - break; - - case kE_TripleFlat_STP: - break; - case kE_DoubleFlat_STP: - break; - case kE_Flat_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 3; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 6; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kE_Natural_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 4; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 1; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kE_Sharp_STP: - case kE_DoubleSharp_STP: - break; - case kE_TripleSharp_STP: - break; - - case kF_TripleFlat_STP: - break; - case kF_DoubleFlat_STP: - break; - case kF_Flat_STP: - break; - case kF_Natural_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 1; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 4; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kF_Sharp_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 6; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 3; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kF_DoubleSharp_STP: - break; - case kF_TripleSharp_STP: - break; - - case kG_TripleFlat_STP: - break; - case kG_DoubleFlat_STP: - break; - case kG_Flat_STP: - break; - case kG_Natural_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 1; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 2; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kG_Sharp_STP: - break; - case kG_DoubleSharp_STP: - break; - case kG_TripleSharp_STP: - break; - - case kA_TripleFlat_STP: - break; - case kA_DoubleFlat_STP: - break; - case kA_Flat_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 4; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 7; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kA_Natural_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 3; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindNaturals; - numberOfAlterations = 0; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kA_Sharp_STP: - break; - case kA_DoubleSharp_STP: - break; - case kA_TripleSharp_STP: - break; - - case kB_TripleFlat_STP: - break; - case kB_DoubleFlat_STP: - break; - case kB_Flat_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 2; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindFlats; - numberOfAlterations = 5; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kB_Natural_STP: - switch (mKeyModeKind) { - case msrKey::kMajorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 5; - break; - case msrKey::kMinorMode: - bKeyKind = bsrKey::kKeyKindSharps; - numberOfAlterations = 2; - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - break; - case kB_Sharp_STP: - break; - case kB_DoubleSharp_STP: - break; - case kB_TripleSharp_STP: - break; - } // switch - break; - - case msrKey::kHumdrumScotKind: - // JMI - break; - } // switch - - // create the BSR key - if (bKeyKind == bsrKey::kKeyKindNone) { - stringstream s; - - s << - "MSR key kind '" << - msrKey::keyKindAsString (mKeyKind) << - ", " << - msrSemiTonesPitchKindAsString (mSemiTonesPitchKind) << - "' is not supported in Braille music"; - - notSupportedMessage ( - inputLineNumber, - s.str ()); - } - else { - S_bsrKey - key = - bsrKey::create ( - inputLineNumber, - bKeyKind, - numberOfAlterations); - - if (! fFirstKey) { - // register key in first page heading - fFirstMusicHeading-> - setMusicHeadingKey (key); - fFirstKey = key; - } - else { - // append the BSR key to the current measure - fCurrentLine-> - appendKeyToLine (key); - } - } -} - -void msr2BsrTranslator::visitEnd (S_msrKey& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrKey" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTime& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTime" << - ", line " << inputLineNumber << - endl; - } -#endif - - // get MSR time attributes - - msrTime::msrTimeSymbolKind - mTimeSymbolKind = - elt->getTimeSymbolKind (); - -/* JMI - bool - mTimeIsCompound = - elt->getTimeIsCompound (); - */ - - const vector& - mTimeItemsVector = - elt->getTimeItemsVector (); - - // let's go - - bsrTime::bsrTimeKind bTimeKind = bsrTime::kTimeNone; - - switch (mTimeSymbolKind) { - case msrTime::kTimeSymbolNone: - bTimeKind = bsrTime::kTimeNone; - - case msrTime::kTimeSymbolCommon: - bTimeKind = bsrTime::kTimeCommon; - break; - case msrTime::kTimeSymbolCut: - bTimeKind = bsrTime::kTimeCut; - break; - - case msrTime::kTimeSymbolNote: - bTimeKind = bsrTime::kTimeNote; - break; - case msrTime::kTimeSymbolDottedNote: - bTimeKind = bsrTime::kTimeDottedNote; - break; - - case msrTime::kTimeSymbolSingleNumber: - bTimeKind = bsrTime::kTimeSingleNumber; - break; - - case msrTime::kTimeSymbolSenzaMisura: - bTimeKind = bsrTime::kTimeSenzaMisura; - break; - break; - } // switch - - // create the BSR time - S_bsrTime - time = - bsrTime::create ( - inputLineNumber, - bTimeKind); - -/* - if (mTimeIsCompound) { - // JMI ??? - } - else { - */ - - if (mTimeItemsVector.size ()) { - for ( - vector::const_iterator i = - mTimeItemsVector.begin (); - i != mTimeItemsVector.end (); - i++ - ) { - S_msrTimeItem mTimeItem = (*i); - - // get the MSR time item attributes - - int - mTimeBeatValue = - mTimeItem->getTimeBeatValue (); - - const vector& - mTimeBeatsNumbersVector = - mTimeItem->getTimeBeatsNumbersVector (); - - int vectorSize = mTimeBeatsNumbersVector.size (); - - for (int i = 0; i < vectorSize; i++) { - int - mTimeItemBeatsNumber = - mTimeBeatsNumbersVector [i]; - - // create the BSR time item - S_bsrTimeItem - bTimeItem = - bsrTimeItem::create (inputLineNumber); - - // populate it - bTimeItem-> - appendBeatsNumber (mTimeItemBeatsNumber); - bTimeItem-> - setTimeBeatValue (mTimeBeatValue); - - // append it to the time - time-> - appendTimeItem (bTimeItem); - } // for - } // for - } - - if (! fFirstTime) { - fFirstMusicHeading-> - // register time in first page heading - setMusicHeadingTime (time); - fFirstTime = time; - } - else { - // this time belongs to the current measure, - // which has already been created and appended - // to the current line, - // but it should be placed before it in the latter, so: - fCurrentLine-> - insertTimeBeforeLastElementOfLine (time); - } - - // a note octave will be needed for the next note to come, - // i.e., the first one after a numeric indicator - fCurrentNoteOctaveKind = bsrNote::kNoteOctaveNone; -} - -void msr2BsrTranslator::visitEnd (S_msrTime& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTime" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTempo& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTempo" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (! gBsrOah->fNoTempos) { - // create the BSR tempo - S_bsrTempo - tempo = - bsrTempo::create ( - inputLineNumber, - elt); - - // append the BSR tempo to the current measure - fCurrentLine-> - appendTempoToLine (tempo); - } -} - -void msr2BsrTranslator::visitEnd (S_msrTempo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -bsrNote::bsrNoteOctaveIsNeeded msr2BsrTranslator::brailleOctaveMarkInNeeded ( - S_msrNote note) -{ - bsrNote::bsrNoteOctaveIsNeeded - result = bsrNote::kNoteOctaveIsNeededNo; - - int inputLineNumber = - note->getInputLineNumber (); - - // select BSR octave sign relative to fRelativeOctaveReference - - // in braille music, octave number is 4 for the octave starting with middle C - int noteAbsoluteOctave = - note->getNoteOctave (); - - msrDiatonicPitchKind - noteDiatonicPitchKind = - note-> - noteDiatonicPitchKind ( - inputLineNumber); - - msrDiatonicPitchKind - referenceDiatonicPitchKind = - fRelativeOctaveReference-> - noteDiatonicPitchKind ( - inputLineNumber); - - string - referenceDiatonicPitchKindAsString = - fRelativeOctaveReference-> - noteDiatonicPitchKindAsString ( - inputLineNumber); - - int - referenceAbsoluteOctave = - fRelativeOctaveReference-> - getNoteOctave (); - - /* - In a melodic progression: - - (a) the octave is not marked for the second of two consecutive notes if the interval is less than a fourth, - - (b) the octave is always marked in a skip greater than a fifth, and - - (c) the octave is only marked in a skip of a fourth or fifth when the second note is in a different octave from the first. - */ - - int - noteAboluteDiatonicOrdinal = - noteAbsoluteOctave * 7 - + - noteDiatonicPitchKind - kC, - - referenceAboluteDiatonicOrdinal = - referenceAbsoluteOctave * 7 - + - referenceDiatonicPitchKind - kC; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - const int fieldWidth = 28; - - fLogOutputStream << left << -/* - setw (fieldWidth) << - "% referenceDiatonicPitch" << - " = " << - referenceDiatonicPitch << - endl << -*/ - setw (fieldWidth) << - "% fRelativeOctaveReference" << - " = " << - fRelativeOctaveReference->asShortString () << - endl << - setw (fieldWidth) << - "% note" << - " = " << - note->asShortString () << - endl << - setw (fieldWidth) << - "% referenceDiatonicPitchAsString" << - " = " << - referenceDiatonicPitchKindAsString << - endl << - setw (fieldWidth) << - "% referenceAbsoluteOctave" << - " = " << - referenceAbsoluteOctave << - endl << - setw (fieldWidth) << - "% noteAbsoluteOctave" << - " = " << - noteAbsoluteOctave << - endl << - endl << - setw (fieldWidth) << - "% referenceAboluteDiatonicOrdinal" << - " = " << - referenceAboluteDiatonicOrdinal << - endl << - setw (fieldWidth) << - "% noteAboluteDiatonicOrdinal" << - " = " << - noteAboluteDiatonicOrdinal << - endl << - setw (fieldWidth) << - "% noteAboluteDiatonicOrdinal - referenceAboluteDiatonicOrdinal" << - " = " << - noteAboluteDiatonicOrdinal - referenceAboluteDiatonicOrdinal << - endl << - setw (fieldWidth) << - ", line " << inputLineNumber << - endl << - endl; - } -#endif - - stringstream s; - - // should an octave sign be used? - switch (noteAboluteDiatonicOrdinal - referenceAboluteDiatonicOrdinal) { - case 0: - case 1: case -1: - case 2: case -2: - // less than a fourth, no octave sign needed - break; - case 3: case -3: - case 4: case -4: - // a fourth or fifth, octave sign needed if there an octave change - if (noteAbsoluteOctave == referenceAbsoluteOctave) { - result = bsrNote::kNoteOctaveIsNeededNo; - } - else { - result = bsrNote::kNoteOctaveIsNeededYes; - } - break; - default: - // more that a fifth, use an octave sign - result = bsrNote::kNoteOctaveIsNeededYes; - } // switch - - return result; -} - -void msr2BsrTranslator::createBsrForNote (S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - - // get MSR note attributes - - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind = - note->getNoteQuarterTonesPitchKind (); - -/* JMI - msrSemiTonesPitchKind - noteSemiTonesPitchKind = - semiTonesPitchKindFromQuarterTonesPitchKind ( - noteQuarterTonesPitchKind); - */ - - msrDiatonicPitchKind - noteDiatonicPitchKind = - diatonicPitchKindFromQuarterTonesPitchKind ( - inputLineNumber, - noteQuarterTonesPitchKind); - - msrNote::msrNoteAccidentalKind - mNoteAccidentalKind = - note->getNoteAccidentalKind (); - - int noteDotsNumber = note->getNoteDotsNumber (); - - msrDurationKind - noteGraphicDurationKind = - note->getNoteGraphicDurationKind (); - - int noteOctave = note->getNoteOctave (); - - // let's go - - // braille the note words if any, - // which should precede the articulations in LilyPond - // generate code for the words only - // if note doesn't belong to a chord, - // otherwise it will be generated for the chord itself - if (! note->getNoteBelongsToAChord ()) { - const list& - noteWords = - note->getNoteWords (); - - if (noteWords.size ()) { - list::const_iterator i; - - for ( - i=noteWords.begin (); - i!=noteWords.end (); - i++ - ) { - msrPlacementKind - wordsPlacementKind = - (*i)->getWordsPlacementKind (); - - string wordsContents = - (*i)->getWordsContents (); - - msrFontStyleKind - wordsFontStyleKind = - (*i)->getWordsFontStyleKind (); - - S_msrFontSize - wordsFontSize = - (*i)->getWordsFontSize (); - - msrFontWeightKind - wordsFontWeightKind = - (*i)->getWordsFontWeightKind (); - - { - switch (wordsPlacementKind) { - case kPlacementNone: - break; - case kPlacementAbove: - break; - case kPlacementBelow: - break; - } // switch - - switch (wordsFontStyleKind) { - case kFontStyleNone: - break; - case kFontStyleNormal: - break; - case KFontStyleItalic: - break; - } // switch - - switch (wordsFontWeightKind) { - case kFontWeightNone: - break; - case kFontWeightNormal: - break; - case kFontWeightBold: - break; - } // switch - - switch (wordsFontSize->getFontSizeKind ()) { - case msrFontSize::kFontSizeNone: - break; - case msrFontSize::kFontSizeXXSmall: - break; - case msrFontSize::kFontSizeXSmall: - break; - case msrFontSize::kFontSizeSmall: - break; - case msrFontSize::kFontSizeMedium: - break; - case msrFontSize::kFontSizeLarge: - break; - case msrFontSize::kFontSizeXLarge: - break; - case msrFontSize::kFontSizeXXLarge: - break; - case msrFontSize::kFontSizeNumeric: - break; - } // switch - - // create the words string - S_bsrWords - bWords = - bsrWords::create ( - inputLineNumber, wordsContents); - - // append it to the current measure - fCurrentMeasure-> - appendWordsToMeasure (bWords); - - // a note octave will be needed for the next note to come, - // i.e., the first one after the word sign - fCurrentNoteOctaveKind = bsrNote::kNoteOctaveNone; - } - } // for - } - } - - bsrNote::bsrNoteOctaveKind - noteOctaveKind = - bsrNote::kNoteOctaveNone; - - // middle C starts octave 4, as in MusicXML - switch (noteOctave) { - case 1: noteOctaveKind = bsrNote::kNoteOctave1; break; - case 2: noteOctaveKind = bsrNote::kNoteOctave2; break; - case 3: noteOctaveKind = bsrNote::kNoteOctave3; break; - case 4: noteOctaveKind = bsrNote::kNoteOctave4; break; - case 5: noteOctaveKind = bsrNote::kNoteOctave5; break; - case 6: noteOctaveKind = bsrNote::kNoteOctave6; break; - case 7: noteOctaveKind = bsrNote::kNoteOctave7; break; - default: - // kNoteOctaveBelow1Kind and kNoteOctaveAbove7Kind - // cannot occur in MusicXML - ; - } // switch - - bsrNote::bsrNoteValueKind noteValueKind = bsrNote::kNoteValueNone; - - if (note->getNoteIsARest ()) { - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueRest256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueRest128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueRest64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueRest32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueRest16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueRest8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueRestQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueRestHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueRestWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueRestBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - } - - else { - switch (noteDiatonicPitchKind) { - case k_NoDiatonicPitch: - break; - - case kA: - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueA256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueA128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueA64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueA32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueA16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueA8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueAQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueAHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueAWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueABreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - break; - - case kB: - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueB256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueB128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueB64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueB32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueB16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueB8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueBQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueBHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueBWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueBBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - break; - - case kC: - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueC256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueC128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueC64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueC32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueC16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueC8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueCQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueCHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueCWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueCBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - break; - - case kD: - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueD256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueD128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueD64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueD32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueD16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueD8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueDQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueDHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueDWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueDBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - break; - - case kE: - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueE256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueE128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueE64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueE32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueE16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueE8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueEQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueEHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueEWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueEBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - break; - - case kF: - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueF256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueF128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueF64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueF32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueF16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueF8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueFQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueFHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueFWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueFBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - break; - - case kG: - switch (noteGraphicDurationKind) { - case k_NoDuration: - break; - - case k1024th: - break; - case k512th: - break; - case k256th: - noteValueKind = bsrNote::kNoteValueG256th; - break; - case k128th: - noteValueKind = bsrNote::kNoteValueG128th; - break; - case k64th: - noteValueKind = bsrNote::kNoteValueG64th; - break; - case k32nd: - noteValueKind = bsrNote::kNoteValueG32nd; - break; - case k16th: - noteValueKind = bsrNote::kNoteValueG16th; - break; - case kEighth: - noteValueKind = bsrNote::kNoteValueG8th; - break; - case kQuarter: - noteValueKind = bsrNote::kNoteValueGQuarter; - break; - case kHalf: - noteValueKind = bsrNote::kNoteValueGHalf; - break; - case kWhole: - noteValueKind = bsrNote::kNoteValueGWhole; - break; - case kBreve: - noteValueKind = bsrNote::kNoteValueGBreve; - break; - case kLong: - break; - case kMaxima: - break; - } // switch - break; - } // switch - } - - // is the note octave needed? - bsrNote::bsrNoteOctaveIsNeeded - noteOctaveIsNeeded = - bsrNote::kNoteOctaveIsNeededNo; - - if (fCurrentNoteOctaveKind == bsrNote::kNoteOctaveNone) { - // this note is the first one in the voice, - // or a preceding braille element forces the octave sign for it - noteOctaveIsNeeded = - bsrNote::kNoteOctaveIsNeededYes; - } - else if (fRelativeOctaveReference) { - // analyye relationship to relative octave reference - noteOctaveIsNeeded = - brailleOctaveMarkInNeeded (note); - } - - // register note's octave kind - fCurrentNoteOctaveKind = noteOctaveKind; - - // is there an accidental attached to the note? - bsrNote::bsrNoteAccidentalKind - bNoteAccidentalKind = - bsrNote::kNoteAccidentalNone; - - switch (mNoteAccidentalKind) { - case msrNote::kNoteAccidentalNone: - break; - - case msrNote::kNoteAccidentalSharp: - bNoteAccidentalKind = bsrNote::kNoteAccidentalSharp; - break; - case msrNote::kNoteAccidentalNatural: - bNoteAccidentalKind = bsrNote::kNoteAccidentalNatural; - break; - case msrNote::kNoteAccidentalFlat: - bNoteAccidentalKind = bsrNote::kNoteAccidentalFlat; - break; - - case msrNote::kNoteAccidentalDoubleSharp: - bNoteAccidentalKind = bsrNote::kNoteAccidentalDoubleSharp; - break; - case msrNote::kNoteAccidentalSharpSharp: - break; - - case msrNote::kNoteAccidentalFlatFlat: - bNoteAccidentalKind = bsrNote::kNoteAccidentalDoubleFlat; - break; - case msrNote::kNoteAccidentalNaturalSharp: - break; - case msrNote::kNoteAccidentalNaturalFlat: - break; - - case msrNote::kNoteAccidentalQuarterFlat: - bNoteAccidentalKind = bsrNote::kNoteAccidentalDoubleFlat; - break; - case msrNote::kNoteAccidentalQuarterSharp: - bNoteAccidentalKind = bsrNote::kNoteAccidentalQuarterSharp; - break; - - case msrNote::kNoteAccidentalThreeQuartersFlat: - bNoteAccidentalKind = bsrNote::kNoteAccidentalThreeQuarterFlat; - break; - case msrNote::kNoteAccidentalThreeQuartersSharp: - bNoteAccidentalKind = bsrNote::kNoteAccidentalThreeQuarterSharp; - break; - - case msrNote::kNoteAccidentalSharpDown: - break; - case msrNote::kNoteAccidentalSharpUp: - break; - case msrNote::kNoteAccidentalNaturalDown: - break; - case msrNote::kNoteAccidentalNaturalUp: - break; - case msrNote::kNoteAccidentalFlatDown: - break; - case msrNote::kNoteAccidentalFlatUp: - break; - case msrNote::kNoteAccidentalTripleSharp: - break; - case msrNote::kNoteAccidentalTripleFlat: - break; - case msrNote::kNoteAccidentalSlashQuarterSharp: - break; - case msrNote::kNoteAccidentalSlashSharp: - break; - case msrNote::kNoteAccidentalSlashFlat: - break; - case msrNote::kNoteAccidentaldoubleSlashFlat: - break; - case msrNote::kNoteAccidentalSharp_1: - break; - case msrNote::kNoteAccidentalSharp_2: - break; - case msrNote::kNoteAccidentalSharp_3: - break; - case msrNote::kNoteAccidentalSharp_5: - break; - case msrNote::kNoteAccidentalFlat_1: - break; - case msrNote::kNoteAccidentalFlat_2: - break; - case msrNote::kNoteAccidentalFlat_3: - break; - case msrNote::kNoteAccidentalFlat_4: - break; - case msrNote::kNoteAccidentalSori: - break; - case msrNote::kNoteAccidentalKoron: - break; - } // switch - - // create the note - S_bsrNote bNote = - bsrNote::create ( - inputLineNumber, - noteValueKind, - noteDotsNumber, - noteOctaveKind, - noteOctaveIsNeeded, - bNoteAccidentalKind); - - // append it to the current measure - fCurrentMeasure-> - appendNoteToMeasure (bNote); - - // determine the note value size kind - bsrNote::bsrNoteValueSizeKind - noteValueSizeKind = - bsrNote::noteValueSizeKindFromNoteValueKind ( - noteValueKind); - - // is a note value sign needed? -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "--> fCurrentNoteValueSizeKind = " << - bsrNote::noteValueSizeKindAsString (fCurrentNoteValueSizeKind) << - ", noteValueSizeKind = " << - bsrNote::noteValueSizeKindAsString (noteValueSizeKind) << - ", noteOctaveIsNeeded = " << - bsrNote::noteOctaveIsNeededAsString (noteOctaveIsNeeded) << - ", line " << inputLineNumber << - endl; - } -#endif - - if (false && noteValueSizeKind != fCurrentNoteValueSizeKind) { // JMI - fLogOutputStream << - "--> note = '" << - bNote->asShortString () << - "', needs a note value size sign" << - endl; - - // set the note value size kind as needed - bNote->setNoteValueSizeIsNeeded (); - // register new note value size kind - fCurrentNoteValueSizeKind = noteValueSizeKind; - } -} - -void msr2BsrTranslator::visitStart (S_msrNote& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrNote '" << - elt->asString () << - "'" << - ", line " << inputLineNumber << - endl; - } -#endif - - createBsrForNote (elt); - - fRelativeOctaveReference = elt; -} - -void msr2BsrTranslator::visitEnd (S_msrNote& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrNote " << - elt->asString () << - ", line " << inputLineNumber << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the dynamics - S_bsrDynamics - dynamics = - bsrDynamics::create ( - elt->getInputLineNumber (), - elt->getDynamicsKind ()); - - // append it to the current measure - fCurrentMeasure-> - appendDynamicsToMeasure (dynamics); -} - -void msr2BsrTranslator::visitEnd (S_msrDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -/* -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrIdentification& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrIdentification" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - - fCurrentIdentification = - fBsrScore-> - getMsrScore ()-> - getIdentification (); - - fOnGoingIdentification = true; -} - -void msr2BsrTranslator::visitEnd (S_msrIdentification& elt) -{ - fOnGoingIdentification = false; - - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrIdentification" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} -*/ - -/* -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrCredit& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrCredit" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentCredit = elt; - - // set elt as credit of the MSR score part of the BSR score - fBsrScore-> - getMsrScore ()-> - appendCreditToScore (fCurrentCredit); -} - -void msr2BsrTranslator::visitEnd (S_msrCredit& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrCredit" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentCredit = nullptr; -} - -void msr2BsrTranslator::visitStart (S_msrCreditWords& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrCreditWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't append it to the current credit, since the latter is no clone - / * JMI - fCurrentCredit-> - appendCreditWordsToCredit ( - elt); - * / -} - -void msr2BsrTranslator::visitEnd (S_msrCreditWords& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrCreditWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSegment& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/ * JMI - - // fetch the current segment clone - fCurrentSegmentClone = - fCurrentVoiceClone-> - getVoiceLastSegment (); - * / - - // create a clone of the segment - S_msrSegment - segmentClone = - elt->createSegmentNewbornClone ( - fCurrentVoiceClone); - - // push it onto the segment clones stack - fCurrentSegmentClonesStack.push ( - segmentClone); - - // append it to the current voice - fCurrentVoiceClone-> - appendSegmentToVoiceClone ( - segmentClone); -} - -void msr2BsrTranslator::visitEnd (S_msrSegment& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // forget current segment clone - fCurrentSegmentClonesStack.pop (); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrHarmony& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrHarmony '" << - elt->asString () << - ", fOnGoingNote = " << booleanAsString (fOnGoingNote) << - ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - ", fOnGoingHarmonyVoice = " << booleanAsString (fOnGoingHarmonyVoice) << - "', line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a harmony new born clone - fCurrentHarmonyClone = - elt->createHarmonyNewbornClone ( - fCurrentVoiceClone); - - if (fOnGoingNote) { - // register the harmony in the current non-grace note clone - fCurrentNonGraceNoteClone-> - appendNoteToNoteHarmoniesList ( - fCurrentHarmonyClone); - - // don't append the harmony to the part harmony, - // this has been done in pass2b - } - - else if (fOnGoingChord) { - // register the harmony in the current chord clone - fCurrentChordClone-> - appendHarmonyToChord (fCurrentHarmonyClone); // JMI - } - - else if (fOnGoingHarmonyVoice) { - fCurrentVoiceClone-> - appendHarmonyToVoiceClone ( - fCurrentHarmonyClone); - } -} - -void msr2BsrTranslator::visitStart (S_msrHarmonyDegree& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting S_msrHarmonyDegree '" << - elt->asString () << - ", fOnGoingNote = " << booleanAsString (fOnGoingNote) << - ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - ", fOnGoingHarmonyVoice = " << booleanAsString (fOnGoingHarmonyVoice) << - "', line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the harmony degree to the current harmony clone - fCurrentHarmonyClone-> - appendHarmonyDegreeToHarmony ( - elt); -} - -void msr2BsrTranslator::visitEnd (S_msrHarmony& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrHarmony '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrFrame& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFrame '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - // register the frame in the current non-grace note clone - fCurrentNonGraceNoteClone-> - setNoteFrame (elt); - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrFiguredBass& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a deep copy of the figured bass - fCurrentFiguredBass = - elt-> - createFiguredBassDeepCopy ( - fCurrentPartClone); - - if (fOnGoingNote) { - // register the figured bass in the current non-grace note clone - fCurrentNonGraceNoteClone-> - setNoteFiguredBass (fCurrentFiguredBass); - - // don't append the figured bass to the part figured bass, - // this will be done below - } - - else if (fOnGoingChord) { - // register the figured bass in the current chord clone - fCurrentChordClone-> - setChordFiguredBass (fCurrentFiguredBass); // JMI - } - - else if (fOnGoingFiguredBassVoice) { // JMI - // register the figured bass in the part clone figured bass - fCurrentPartClone-> - appendFiguredBassToPartClone ( - fCurrentVoiceClone, - fCurrentFiguredBass); - } -} - -void msr2BsrTranslator::visitStart (S_msrFigure& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFigure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the figure to the current figured bass - fCurrentFiguredBass-> - appendFigureToFiguredBass ( - elt); -} - -void msr2BsrTranslator::visitEnd (S_msrFiguredBass& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFiguredBass = nullptr; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrMeasure& elt) -{ - int - inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasure '" << - measureNumber << - "'" << - ", line " << inputLineNumber << - endl; - } -#endif - -/ * JMI - { - fLogOutputStream << - endl << - elt << - endl; - } - * / - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - // measure 1 is created by default initially ??? JMI - - // create a clone of the measure - fCurrentMeasureClone = - elt-> - createMeasureNewbornClone ( - fCurrentSegmentClonesStack.top ()); - - // append it to the current segment clone - fCurrentSegmentClonesStack.top ()-> - appendMeasureToSegment ( - fCurrentMeasureClone); - -// JMI utile??? - fCurrentPartClone-> - setPartCurrentMeasureNumber ( - measureNumber); - - // should the last bar check's measure be set? - if (fLastBarCheck) { - fLastBarCheck-> - setNextBarNumber ( - measureNumber); - - fLastBarCheck = nullptr; - } -} - -void msr2BsrTranslator::finalizeCurrentMeasureClone ( - int inputLineNumber, - S_msrMeasure originalMeasure) -{ - // take this measure into account - fMeasuresCounter++; - - // fetch the voice - S_msrVoice - voice = - fCurrentMeasureClone-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink (); - - // get the measure number - string - measureNumber = - fCurrentMeasureClone-> - getMeasureElementMeasureNumber (); - - // get the current measure whole notes - rational - currentMeasureWholeNotesDuration = - fCurrentMeasureClone-> - getCurrentMeasureWholeNotesDuration (); - - // get the full current measure whole notes - rational - measureFullLength = - fCurrentMeasureClone-> - getMeasureFullLength (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - fLogOutputStream << - "Finalizing measure '" << measureNumber << - "' in voice \"" << voice->getVoiceName () << - "\", line " << inputLineNumber << - endl << - "currentMeasureWholeNotesDuration = " << currentMeasureWholeNotesDuration << - endl; - } -#endif - - msrMeasure::msrMeasureKind - measureKind = - msrMeasure::kUnknownMeasure; // JMI - // JMI fMeasureKind = kFullMeasure; // may be changed afterwards - - if (currentMeasureWholeNotesDuration == measureFullLength ) { - // this measure is full - measureKind = - msrMeasure::kFullMeasure; - } - - else if (currentMeasureWholeNotesDuration < measureFullLength) { - / * - if (fSegmentMeasuresList.size () == 1) { // JMI - // this is the first measure in the segment - measureKind = - msrMeasure::kIncompleteLeftMeasure; - } - - else { - // this is the last measure in the segment - measureKind = - msrMeasure::kIncompleteRightMeasure; - } - * / - - // this measure is an up beat - measureKind = - msrMeasure::kUpbeatMeasure; // JMI - } - - else if (currentMeasureWholeNotesDuration > measureFullLength) { - // this measure is overfull - measureKind = - msrMeasure::kOverfullMeasure; - } - - if (false && / * JMI * / measureKind != originalMeasure->getMeasureKind ()) { // JMI - stringstream s; - - s << - "line " << inputLineNumber << ":" << - " clone measure:" << - endl << - fCurrentMeasureClone << - endl << - "differs for measure kind from original measure:" << - endl << - originalMeasure; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2BsrTranslator::visitEnd (S_msrMeasure& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasure '" << - elt->getMeasureElementMeasureNumber () << - "'" << - ", line " << inputLineNumber << - endl; - } -#endif - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - - finalizeCurrentMeasureClone ( // JMI - inputLineNumber, - elt); // original measure - - bool doCreateABarCheck = false; // JMI - - switch (elt->getMeasureKind ()) { - - case msrMeasure::kMeasureKindUnknown: - { - stringstream s; - - s << - "measure '" << measureNumber << - "' in voice \"" << - elt-> - fetchMeasureVoiceUpLink ()-> - getVoiceName () << - "\" is of unknown kind"; - - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - break; - - case msrMeasure::kMeasureKindRegular: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindAnacrusis: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindIncompleteStandalone: - doCreateABarCheck = true; - break; - case msrMeasure::kMeasureKindIncompleteLastInRepeat: - doCreateABarCheck = true; - break; - case msrMeasure::kMeasureKindIncompleteAfterRepeat: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindOvercomplete: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindCadenza: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindEmpty: - // JMI - break; - } // switch - - if (doCreateABarCheck) { - // create a bar check without next bar number, - // it will be set upon visitStart (S_msrMeasure&) - // for the next measure - fLastBarCheck = - msrBarCheck::create ( - inputLineNumber); - - / * JMI - fLogOutputStream << - endl << - "***********" << - endl << - endl; - fCurrentPartClone->print (fLogOutputStream); - fLogOutputStream << - "***********" << - endl << - endl; - * / -/ * JMI - // append it to the current voice clone - fCurrentVoiceClone-> - appendBarCheckToVoice (fLastBarCheck); - * / - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrStanza& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStanza \"" << - elt->getStanzaName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - -// if (elt->getStanzaTextPresent ()) { // JMI - fCurrentStanzaClone = - elt->createStanzaNewbornClone ( - fCurrentVoiceClone); - - // append the stanza clone to the BSR score elements list - fBsrScore -> - appendStanzaToScoreElements ( - fCurrentStanzaClone); - - // append a use of the stanza to the current staff block - fCurrentStaffBlock -> - appendLyricsUseToStaffBlock ( - fCurrentStanzaClone); -// } -// else - // fCurrentStanzaClone = 0; // JMI - - fOnGoingStanza = true; -} - -void msr2BsrTranslator::visitEnd (S_msrStanza& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrStanza \"" << - elt->getStanzaName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // forget about this stanza - fCurrentStanzaClone = nullptr; - - fOnGoingStanza = false; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSyllable& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSyllable" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the syllable clone - fCurrentSyllableClone = - elt->createSyllableNewbornClone ( - fCurrentPartClone); - - // add it to the current stanza clone or current note clone - if (fOnGoingStanza) { // fCurrentStanzaClone JM - // visiting a syllable as a stanza member - fCurrentStanzaClone-> - appendSyllableToStanza ( - fCurrentSyllableClone); - } - - else if (fOnGoingNote) { // JMI - // visiting a syllable as attached to the current non-grace note - fCurrentSyllableClone-> - appendSyllableToNoteAndSetItsNoteUpLink ( - fCurrentNonGraceNoteClone); - - if (gBsrOah->fAddWordsFromTheLyrics) { - // get the syllable texts list - const list& - syllableTextsList = - elt->getSyllableTextsList (); - - if (syllableTextsList.size ()) { - // build a single words value from the texts list - // JMI create an msrWords instance for each??? - string wordsValue = - elt->syllableTextsListAsString(); - - // create the words -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics || gTraceOah->fTraceWords) { - fLogOutputStream << - "Changing lyrics '" << - wordsValue << - "' into words for note '" << - fCurrentNonGraceNoteClone->asShortString () << - "'" << - // JMI fCurrentSyllableClone->asString () << - endl; - } -#endif - - S_msrWords - words = - msrWords::create ( - inputLineNumber, - kPlacementNone, // default value - wordsValue, - kJustifyNone, // default value - kVerticalAlignmentNone, // default value - kFontStyleNone, // default value - msrFontSize::create ( - msrFontSize::kFontSizeNone), // default value - kFontWeightNone, // default value - msrWords::kItLang); // default value - - // append it to the current non-grace note -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics || gTraceOah->fTraceWords) { - fLogOutputStream << - "Appending words '" << - words->asShortString () << - "' to note '" << - fCurrentNonGraceNoteClone->asShortString () << - "'" << - endl; - } -#endif - fCurrentNonGraceNoteClone-> - appendWordsToNote ( - words); - } - } - } - - // a syllable ends the sysllable extend range if any - if (fOnGoingSyllableExtend) { - / * JMI ??? - // create melisma end command - S_bsrMelismaCommand - melismaCommand = - bsrMelismaCommand::create ( - inputLineNumber, - bsrMelismaCommand::kMelismaEnd); - - // append it to current voice clone - fCurrentVoiceClone-> - appendOtherElementToVoice (melismaCommand); -* / - - fOnGoingSyllableExtend = false; - } -} - -void msr2BsrTranslator::visitEnd (S_msrSyllable& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSyllable" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} -*/ - -/* -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTranspose& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTranspose" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append transpose to voice clone - fCurrentVoiceClone-> - appendTransposeToVoice (elt); -} - -void msr2BsrTranslator::visitEnd (S_msrTranspose& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTranspose" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrPartNameDisplay& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPartNameDisplay" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append part name display to voice clone - fCurrentVoiceClone-> - appendPartNameDisplayToVoice (elt); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrPartAbbreviationDisplay& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPartAbbreviationDisplay" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append part abbreviation display to voice clone - fCurrentVoiceClone-> - appendPartAbbreviationDisplayToVoice (elt); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendRehearsalToVoice (elt); -} - -void msr2BsrTranslator::visitEnd (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrArticulation& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrArticulation" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrArticulation& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrArticulation" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrFermata& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFermata" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // a fermata is an articulation - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // an arpeggiato is an articulation - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); // addArpeggiatoToNote ??? JMI - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrNonArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrNonArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // an nonArpeggiato is an articulation - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); // addArpeggiatoToNote ??? JMI - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTechnical& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalToChord (elt); - } - - // doest the score need the 'tongue' function? - switch (elt->getTechnicalKind ()) { - case msrTechnical::kArrow: - break; - case msrTechnical::kDoubleTongue: - fBsrScore-> - // this score needs the 'tongue' Scheme function - setTongueSchemeFunctionIsNeeded (); - break; - case msrTechnical::kDownBow: - break; - case msrTechnical::kFingernails: - break; - case msrTechnical::kHarmonic: - break; - case msrTechnical::kHeel: - break; - case msrTechnical::kHole: - break; - case msrTechnical::kOpenString: - break; - case msrTechnical::kSnapPizzicato: - break; - case msrTechnical::kStopped: - break; - case msrTechnical::kTap: - break; - case msrTechnical::kThumbPosition: - break; - case msrTechnical::kToe: - break; - case msrTechnical::kTripleTongue: - fBsrScore-> - // this score needs the 'tongue' Scheme function - setTongueSchemeFunctionIsNeeded (); - break; - case msrTechnical::kUpBow: - break; - } // switch -} - -void msr2BsrTranslator::visitEnd (S_msrTechnical& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTechnicalWithInteger& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnicalWithInteger" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalWithIntegerToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalWithIntegerToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrTechnicalWithInteger& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnicalWithInteger" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTechnicalWithFloat& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnicalWithFloat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalWithFloatToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalWithFloatToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrTechnicalWithFloat& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnicalWithFloat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTechnicalWithString& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnicalWithString" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalWithStringToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalWithStringToChord (elt); - } - - switch (elt->getTechnicalWithStringKind ()) { - case msrTechnicalWithString::kHammerOn: - case msrTechnicalWithString::kPullOff: - // this score needs the 'after' Scheme function - fBsrScore-> - setAfterSchemeFunctionIsNeeded (); - break; - default: - ; - } // switch -} - -void msr2BsrTranslator::visitEnd (S_msrTechnicalWithString& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnicalWithString" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrOrnament& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrOrnament" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendOrnamentToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendOrnamentToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrOrnament& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrOrnament" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSpanner& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSpanner" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (elt->getSpannerTypeKind ()) { - case kSpannerTypeStart: - break; - case kSpannerTypeStop: - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - break; - } // switch - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendSpannerToNote (elt); - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSpannerToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrSpanner& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSpanner" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrGlissando& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrGlissando" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendGlissandoToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendGlissandoToChord (elt); - } - - if (elt->getGlissandoTextValue ().size ()) { - fBsrScore-> - // this score needs the 'glissandoWithText' Scheme function - addGlissandoWithTextSchemeFunctionsToScore (); - } -} - -void msr2BsrTranslator::visitEnd (S_msrGlissando& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrGlissando" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSlide& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSlide" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendSlideToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSlideToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrSlide& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSlide" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSingleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - setNoteSingleTremolo (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - setChordSingleTremolo (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrSingleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrDoubleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrDoubleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a double tremolo clone from the two elements - fCurrentDoubleTremoloClone = elt; // JMI FIX THAT -/ * JMI - elt->createDoubleTremoloNewbornClone ( - elt->getDoubleTremoloFirstElement ()-> - createNewBornClone (), - elt->getDoubleTremoloSecondElement () - createNewBornClone ()); - * / - - fOnGoingDoubleTremolo = true; -} - -void msr2BsrTranslator::visitEnd (S_msrDoubleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the current double tremolo clone to the current voice clone - fCurrentVoiceClone-> - appendDoubleTremoloToVoice ( - fCurrentDoubleTremoloClone); - - // forget about it - fCurrentDoubleTremoloClone = nullptr; - - fOnGoingDoubleTremolo = false; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrOtherDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrOtherDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendOtherDynamicsToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendOtherDynamicsToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrOtherDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrOtherDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrWords& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendWordsToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendWordsToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrWords& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSlur& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSlur" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - / * - Only the first note of the chord should get the slur notation. - Some applications print out the slur for all notes, - i.e. a stop and a start in sequqnce: - these should be ignored - * / - - if (fOnGoingNote) { - // don't add slurs to chord member notes except the first one - switch (fCurrentNonGraceNoteClone->getNoteKind ()) { - case msrNote::kChordMemberNote: - if (fCurrentNonGraceNoteClone->getNoteIsAChordsFirstMemberNote ()) { - fCurrentNonGraceNoteClone-> - appendSlurToNote (elt); - } - break; - - default: - fCurrentNonGraceNoteClone-> - appendSlurToNote (elt); - } // switch - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSlurToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrSlur& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSlur" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrLigature& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrLigature" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendLigatureToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendLigatureToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrLigature& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrLigature" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSlash& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSlash" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendSlashToNote (elt); - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSlashToChord (elt); - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrWedge& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrWedge" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendWedgeToNote (elt); - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendWedgeToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrWedge& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrWedge" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrGraceNotesGroup& elt) -{ - int inputLineNumber = - elt->getInputLineNumber () ; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrGraceNotesGroup" << - ", line " << inputLineNumber << - endl; - } -#endif - - bool doCreateAGraceNoteClone = true; // JMI - - if (doCreateAGraceNoteClone) { - // create a clone of this graceNotesGroup -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Creating a clone of grace notes group '" << - elt->asShortString () << - "' and attaching it to clone note '" << - fCurrentNonGraceNoteClone->asShortString () << - "'" << - endl; - } -#endif - - fCurrentGraceNotesGroupClone = - elt-> - createGraceNotesGroupNewbornClone ( - fCurrentVoiceClone); - - // attach it to the current note clone - // if (fOnGoingNote) { JMI - // { // JMI - - switch (elt->getGraceNotesGroupKind ()) { - case msrGraceNotesGroup::kGraceNotesGroupBefore: - fCurrentNonGraceNoteClone-> - setNoteGraceNotesGroupBefore ( - fCurrentGraceNotesGroupClone); - break; - case msrGraceNotesGroup::kGraceNotesGroupAfter: - fCurrentNonGraceNoteClone-> - setNoteGraceNotesGroupAfter ( - fCurrentGraceNotesGroupClone); - break; - } // switch - // } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "+++++++++++++++++++++++++ 1" << - endl << - "fCurrentNonGraceNoteClone:"; - - if (fCurrentNonGraceNoteClone) { - fLogOutputStream << - fCurrentNonGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr"; - } - fLogOutputStream << endl; - } -#endif - - // get the note this grace notes group is attached to - S_msrNote - noteNotesGroupIsAttachedTo = - elt-> - getGraceNotesGroupNoteUpLink (); - - if (! noteNotesGroupIsAttachedTo) { - stringstream s; - - s << - "grace notes group '" << elt->asShortString () << - "' has an empty note upLink"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fOnGoingGraceNotesGroup = true; - - // is noteNotesGroupIsAttachedTo the first one in its voice? -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceGraceNotes - || - gTraceOah->fTraceNotes - || - gTraceOah->fTraceVoices - ) { - fLogOutputStream << - "The noteNotesGroupIsAttachedTo voice clone PEOJIOFEIOJEF '" << - fCurrentVoiceClone->getVoiceName () << - "' is '"; - - if (noteNotesGroupIsAttachedTo) { - fLogOutputStream << - noteNotesGroupIsAttachedTo->asShortString () const; - } - else { - fLogOutputStream << - "none"; - } - fLogOutputStream << - "'" << - endl; - } -#endif - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceGraceNotes - || - gTraceOah->fTraceNotes - || - gTraceOah->fTraceVoices - ) { - fLogOutputStream << - "The first note of voice clone KLJWLPOEF '" << - fCurrentVoiceClone->getVoiceName () << - "' is '"; - - if (fFirstNoteCloneInVoice) { - fLogOutputStream << - fFirstNoteCloneInVoice->asShortString () const; - } - else { - fLogOutputStream << - "none"; - } - fLogOutputStream << - "'" << - endl; - } -#endif - - // fetch the original voice first non grace note - S_msrNote - originalVoiceFirstNonGraceNote = - fCurrentVoiceOriginal-> - fetchVoiceFirstNonGraceNote (); - - if (originalVoiceFirstNonGraceNote) { - if (noteNotesGroupIsAttachedTo == originalVoiceFirstNonGraceNote) { - // bug 34 in LilyPond should be worked around by creating - // skip grace notes in the other voices of the part - - // create the skip grace notes group -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceGraceNotes - || - gTraceOah->fTraceNotes - || - gTraceOah->fTraceVoices - ) { - fLogOutputStream << - "Creating a skip clone of grace notes group '" << - elt->asShortString () << - "' to work around LilyPond issue 34" << - endl; - } -#endif - - fCurrentSkipGraceNotesGroup = - elt-> - createSkipGraceNotesGroupClone ( - fCurrentVoiceClone); - } - } - - // addSkipGraceNotesGroupBeforeAheadOfVoicesClonesIfNeeded() will - // append the same skip grace notes to the ofhter voices if needed - // in visitEnd (S_msrPart&) -} - - / * JMI - if (fFirstNoteCloneInVoice) { - // there is at least a note before these grace notes in the voice - - if ( - fCurrentNonGraceNoteClone->getNoteTrillOrnament () - && - fCurrentNonGraceNoteClone->getNoteIsFollowedByGraceNotesGroup ()) { - // fPendingAfterGraceNotesGroup already contains - // the afterGraceNotesGroup to use - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Optimising grace notes '" << - elt->asShortString () << - "' into after grace notes" << - endl; - } -#endif - - // attach the current after grace notes clone to the current note clone - if (fOnGoingNote) { // JMI - fCurrentNonGraceNoteClone-> - setNoteAfterGraceNotesGroup ( - fPendingAfterGraceNotesGroup); - } - - doCreateAGraceNoteClone = false; - } - } - - if (doCreateAGraceNoteClone) { - // are these grace notes the last element in a measure? - if (elt->getGraceNotesGroupIsFollowedByNotes ()) { - // yes, this is a regular grace notes - - // create a clone of this graceNotesGroup - fCurrentGraceNotesGroupClone = - elt-> - createGraceNotesGroupNewbornClone ( - fCurrentVoiceClone); - - // attach it to the current note clone - if (fOnGoingNote) { // JMI - fCurrentNonGraceNoteClone-> - setNoteGraceNotesGroup ( - fCurrentGraceNotesGroupClone); - } - - // JMI XXL find good criterion for this - - // these grace notes are at the beginning of a segment JMI - // doCreateAGraceNoteClone = true; // JMI - - // bug 34 in LilyPond should be worked aroud by creating - // skip grace notes in the other voices of the part - - // create skip graceNotesGroup clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Creating a skip clone of grace notes '" << - elt->asShortString () << - "' to work around LilyPond issue 34" << - endl; - } -#endif - - S_msrGraceNotesGroup - skipGraceNotesGroup = - elt-> - createSkipGraceNotesGroupClone ( - fCurrentVoiceClone); - - // prepend it to the other voices in the part - fCurrentPartClone-> - prependSkipGraceNotesGroupToVoicesClones ( - fCurrentVoiceClone, - skipGraceNotesGroup); - } - - else { - // no, we should build an msrAfterGraceNotesGroup from this - // and the last element in the current voice clone - - // fetch the voice last element - fCurrentAfterGraceNotesGroupElement = - fCurrentVoiceClone-> - fetchVoiceLastElement (inputLineNumber); - - // create the after grace notes -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Converting grace notes '" << - elt->asShortString () << - "' into after grace notes attached to:"<< - endl; - - gIndenter++; - - fCurrentAfterGraceNotesGroupElement-> - print (fLogOutputStream); - - gIndenter--; - } -#endif - - fPendingAfterGraceNotesGroup = - msrAfterGraceNotesGroup::create ( - inputLineNumber, - fCurrentAfterGraceNotesGroupElement, - elt->getGraceNotesGroupIsSlashed (), - fCurrentVoiceClone); - - // append it to the current note clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Appending the after grace notes to current note clone" << - endl; - } -#endif - - if (fOnGoingNote) { // JMI - fCurrentNonGraceNoteClone-> - setNoteAfterGraceNotesGroup ( - fPendingAfterGraceNotesGroup); - } - } - } -*/ - -/* - -void msr2BsrTranslator::visitEnd (S_msrGraceNotesGroup& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrGraceNotesGroup" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "+++++++++++++++++++++++++ 2" << - endl << - "fCurrentNonGraceNoteClone:"; - - if (fCurrentNonGraceNoteClone) { - fLogOutputStream << - fCurrentNonGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr"; - } - fLogOutputStream << endl; - } -#endif - - // forget about these grace notes - fCurrentGraceNotesGroupClone = nullptr; - - fOnGoingGraceNotesGroup = false; - -/ * JMI - if (fPendingAfterGraceNotesGroup) { - // remove the current afterGraceNotesGroup note clone - // from the current voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Removing the after grace notes element from the current voice clone" << - endl; - } -#endif - - fCurrentVoiceClone-> - removeElementFromVoice ( - inputLineNumber, - fCurrentAfterGraceNotesGroupElement); - - // forget about the current after grace notes element - fCurrentAfterGraceNotesGroupElement = nullptr; - - // forget about these after the pending grace notes - fPendingAfterGraceNotesGroup = nullptr; - } - * / -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrNote& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrNote '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the note clone - S_msrNote - noteClone = - elt->createNoteNewbornClone ( - fCurrentPartClone); - - // register clone in this tranlastors' voice notes map - fVoiceNotesMap [elt] = noteClone; // JMI XXL - - // don't register grace notes as the current note clone, - // but as the current grace note clone instead -/ * JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceVoices) { - fLogOutputStream << - "The first note of voice clone GFFF '" << - fCurrentVoiceClone->getVoiceName () << - "' is '"; - - if (fFirstNoteCloneInVoice) { - fLogOutputStream << - fFirstNoteCloneInVoice->asShortString () const; - } - else { - fLogOutputStream << - "none"; - } - fLogOutputStream << - "'" << - endl; - } -#endif -* / - - switch (elt->getNoteKind ()) { - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - case msrNote::kGraceTupletMemberNote: - fCurrentGraceNoteClone = noteClone; - break; - - default: - fCurrentNonGraceNoteClone = noteClone; - - if (! fFirstNoteCloneInVoice) { - fFirstNoteCloneInVoice = - fCurrentNonGraceNoteClone; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceVoices) { - fLogOutputStream << - "The first note of voice clone RJIRWR '" << - fCurrentVoiceClone->getVoiceName () << - "' is '" << - fFirstNoteCloneInVoice->asShortString () << - "'" << - endl; - } -#endif - } - - fOnGoingNote = true; - } // switch - -/ * JMI - // can we optimize graceNotesGroup into afterGraceNotesGroup? - if ( - elt->getNoteIsFollowedByGraceNotesGroup () - && - elt->getNoteTrillOrnament ()) { - // yes, create the after grace notes -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesGroup) { - fLogOutputStream << - "Optimizing grace notes on trilled note '" << - elt->asShortString () << - "' as after grace notes " << - ", line " << inputLineNumber << - endl; - } -#endif - - fPendingAfterGraceNotesGroup = - msrAfterGraceNotesGroup::create ( - inputLineNumber, - fCurrentNonGraceNoteClone, - false, // aftergracenoteIsSlashed, may be updated later - fCurrentVoiceClone); - - // register current afterGraceNotesGroup element - fCurrentAfterGraceNotesGroupElement = - fCurrentNonGraceNoteClone; - } -* / -} - -void msr2BsrTranslator::visitEnd (S_msrNote& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrNote " << - elt->asString () << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "FAA fCurrentNonGraceNoteClone = " << - endl; - if (fCurrentNonGraceNoteClone) { - fLogOutputStream << - fCurrentNonGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr" << - endl; - } - - fLogOutputStream << - "FAA fCurrentGraceNoteClone = " << - endl; - if (fCurrentGraceNoteClone) { - fLogOutputStream << - fCurrentGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr" << - endl; - } - } -#endif - - switch (elt->getNoteKind ()) { - - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending rest note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kSkipNote: // JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending skip note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kUnpitchedNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending unpitched note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kStandaloneNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending standalone note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kDoubleTremoloMemberNote: - if (fOnGoingDoubleTremolo) { - - if (fCurrentNonGraceNoteClone->getNoteIsFirstNoteInADoubleTremolo ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Setting note '" << - fCurrentNonGraceNoteClone->asString () << - "', line " << fCurrentNonGraceNoteClone->getInputLineNumber () << - ", as double tremolo first element" << - " in voice \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentDoubleTremoloClone-> - setDoubleTremoloNoteFirstElement ( - fCurrentNonGraceNoteClone); - } - - else if (fCurrentNonGraceNoteClone->getNoteIsSecondNoteInADoubleTremolo ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Setting note '" << - fCurrentNonGraceNoteClone->asString () << - "', line " << fCurrentNonGraceNoteClone->getInputLineNumber () << - ", as double tremolo second element" << - " in voice \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentDoubleTremoloClone-> - setDoubleTremoloNoteSecondElement ( - fCurrentNonGraceNoteClone); - } - - else { - stringstream s; - - s << - "note '" << fCurrentNonGraceNoteClone->asShortString () << - "' belongs to a double tremolo, but is not marked as such"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else { - stringstream s; - - s << - "double tremolo note '" << fCurrentNonGraceNoteClone->asShortString () << - "' found outside of a double tremolo"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kGraceNote: - / * JMI - fLogOutputStream << - "fOnGoingGraceNotesGroup = " << - booleanAsString ( - fOnGoingGraceNotesGroup) << - endl; - * / - - if (! fOnGoingGraceNotesGroup) { - stringstream s; - - s << - "grace note '" << fCurrentNonGraceNoteClone->asShortString () << - "' found outside of grace notes"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes || gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending grace note '" << - fCurrentGraceNoteClone->asShortString () << - "' to the grace notes group'" << - fCurrentGraceNotesGroupClone->asShortString () << - "' in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - fCurrentGraceNotesGroupClone-> - appendNoteToGraceNotesGroup ( - fCurrentGraceNoteClone); - } - - / * JMI ??? - if (fCurrentGraceNotesGroupClone) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes || gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending note '" << - fCurrentNonGraceNoteClone->asShortString () << - "' to the grace notes in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - fCurrentGraceNotesClone-> - appendNoteToGraceNotes ( - fCurrentNonGraceNoteClone); - } - - else if (fPendingAfterGraceNotes) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes || gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending note '" << - fCurrentNonGraceNoteClone->asShortString () << - "' to the after grace notes in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - fPendingAfterGraceNotes-> - appendNoteToAfterGraceNotesContents ( - fCurrentNonGraceNoteClone); - } - - else { - stringstream s; - - s << - "both fCurrentGraceNoteGroupsClone and fPendingAfterGraceNoteGroup are null," << - endl << - "cannot handle grace note'" << - elt->asString () << - "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - * / - break; - - case msrNote::kChordMemberNote: - if (fOnGoingChord) { - fCurrentChordClone-> - addAnotherNoteToChord ( - fCurrentNonGraceNoteClone, - fCurrentVoiceClone); - } - - else { - stringstream s; - - s << - "msr2BsrTranslator:::visitEnd (S_msrNote& elt): chord member note " << - elt->asString () << - " appears outside of a chord"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kGraceChordMemberNote: - if (fOnGoingChord) { - fCurrentChordClone-> - addAnotherNoteToChord ( - fCurrentGraceNoteClone, - fCurrentVoiceClone); - } - - else { - stringstream s; - - s << - "msr2BsrTranslator:::visitEnd (S_msrNote& elt): chord member note " << - elt->asString () << - " appears outside of a chord"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "'' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fTupletClonesStack.top ()-> - addNoteToTuplet ( - fCurrentNonGraceNoteClone, - fCurrentVoiceClone); - break; - } // switch - - // handle editorial accidentals - switch (fCurrentNonGraceNoteClone->getNoteEditorialAccidentalKind ()) { - case msrNote::kNoteEditorialAccidentalYes: - fBsrScore-> - // this score needs the 'editorial accidental' Scheme function - setEditorialAccidentalSchemeFunctionIsNeeded (); - break; - case msrNote::kNoteEditorialAccidentalNo: - break; - } // switch - - // handle cautionary accidentals - switch (fCurrentNonGraceNoteClone->getNoteCautionaryAccidentalKind ()) { - case msrNote::kNoteCautionaryAccidentalYes: - break; - case msrNote::kNoteCautionaryAccidentalNo: - break; - } // switch - -/ * JMI - // handle melisma - msrSyllable::msrSyllableExtendKind - noteSyllableExtendKind = - elt->getNoteSyllableExtendKind (); - - switch (noteSyllableExtendKind) { - case msrSyllable::kStandaloneSyllableExtend: - { - / * JMI ??? - // create melisma start command - S_bsrMelismaCommand - melismaCommand = - bsrMelismaCommand::create ( - inputLineNumber, - bsrMelismaCommand::kMelismaStart); - - // append it to current voice clone - fCurrentVoiceClone-> - appendOtherElementToVoice (melismaCommand); - - // append - * / - - fOnGoingSyllableExtend = true; - } - break; - case msrSyllable::kStartSyllableExtend: - break; - case msrSyllable::kContinueSyllableExtend: - break; - case msrSyllable::kStopSyllableExtend: - break; - case msrSyllable::k_NoSyllableExtend: - break; - } // switch -* / - - fOnGoingNote = false; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrOctaveShift& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrOctaveShift" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - setNoteOctaveShift (elt); -} - -void msr2BsrTranslator::visitEnd (S_msrOctaveShift& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrOctaveShift" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrAccordionRegistration& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrAccordionRegistration" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the accordion registration to the voice clone - fCurrentVoiceClone-> - appendAccordionRegistrationToVoice (elt); - - // the generated code needs modules scm and accreg - fBsrScore-> - setScmAndAccregSchemeModulesAreNeeded (); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrHarpPedalsTuning& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrHarpPedalsTuning" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the harp pedals tuning to the voice clone - fCurrentVoiceClone-> - appendHarpPedalsTuningToVoice (elt); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrStem& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStem" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - setNoteStem (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendStemToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrStem& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrStem" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrBeam& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBeam" << - ", line " << elt->getInputLineNumber () << -// JMI ", fOnGoingNote = " << booleanAsString (fOnGoingNote) << -// JMI ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - endl; - } -#endif - - // a beam may be present at the same time - // in a note or grace note and the chord the latter belongs to - - if (fOnGoingGraceNotesGroup) { - fCurrentGraceNoteClone-> - appendBeamToNote (elt); - } - else if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendBeamToNote (elt); - } - - if (fOnGoingChord) { - fCurrentChordClone-> - appendBeamToChord (elt); - } -} - -void msr2BsrTranslator::visitEnd (S_msrBeam& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBeam" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrChord& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrChord" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentChordClone = - elt->createChordNewbornClone ( - fCurrentPartClone); - - if (fTupletClonesStack.size ()) { - // a chord in a tuplet is handled as part of the tuplet JMI - fTupletClonesStack.top ()-> - addChordToTuplet ( - fCurrentChordClone); - } - - else if (fOnGoingDoubleTremolo) { - if (elt->getChordIsFirstChordInADoubleTremolo ()) { - // replace double tremolo's first element by chord - fCurrentDoubleTremoloClone-> - setDoubleTremoloChordFirstElement ( - elt); - } - - else if (elt->getChordIsSecondChordInADoubleTremolo ()) { - // replace double tremolo's second element by chord - fCurrentDoubleTremoloClone-> - setDoubleTremoloChordSecondElement ( - elt); - } - - else { - stringstream s; - - s << - "chord '" << elt->asString () << - "' belongs to a double tremolo, but is not marked as such"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else if (fCurrentGraceNotesGroupClone) { - // append the chord to the grace notes - fCurrentGraceNotesGroupClone-> - appendChordToGraceNotesGroup ( - fCurrentChordClone); - } - - else { - // appending the chord to the voice clone at once - fCurrentVoiceClone-> - appendChordToVoice ( - fCurrentChordClone); - } - - fOnGoingChord = true; -} - -void msr2BsrTranslator::visitEnd (S_msrChord& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrChord" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingChord = false; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the tuplet clone - S_msrTuplet - tupletClone = - elt->createTupletNewbornClone (); - - // register it in this visitor -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "++> pushing tuplet '" << - tupletClone->asString () << - "' to tuplets stack" << - endl; - } -#endif - - fTupletClonesStack.push (tupletClone); - - switch (elt->getTupletLineShapeKind ()) { - case msrTuplet::kTupletLineShapeStraight: - case msrTuplet::kTupletLineShapeCurved: - fBsrScore-> - // this score needs the 'tuplets curved brackets' Scheme function - setTupletsCurvedBracketsSchemeFunctionIsNeeded (); - break; - } // switch -} - -void msr2BsrTranslator::visitEnd (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Popping tuplet '" << - elt->asString () << - "' from tuplets stack" << - endl; - } -#endif - - fTupletClonesStack.pop (); - - if (fTupletClonesStack.size ()) { - // tuplet is a nested tuplet -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Adding nested tuplet '" << - elt->asString () << - "' to stack top tuplet '" << - fTupletClonesStack.top ()->asString () << - "'" << - endl; - } -#endif - - fTupletClonesStack.top ()-> - addTupletToTupletClone (elt); - } - - else { - // tuplet is a top level tuplet - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Adding top level tuplet '" << - elt->asString () << - "' to voice" << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendTupletToVoice (elt); - } -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrTie& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTie" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - setNoteTie (elt); -} - -void msr2BsrTranslator::visitEnd (S_msrTie& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTie" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrSegno& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSegno" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendSegnoToVoice (elt); -} - -void msr2BsrTranslator::visitStart (S_msrCoda& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrCoda" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendCodaToVoice (elt); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrEyeGlasses& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting eyeGlasses" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendEyeGlassesToNote (elt); -} - -void msr2BsrTranslator::visitStart (S_msrScordatura& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting scordatura" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendScordaturaToNote (elt); -} - -void msr2BsrTranslator::visitStart (S_msrPedal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting pedal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendPedalToNote (elt); -} - -void msr2BsrTranslator::visitStart (S_msrDamp& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting damp" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendDampToNote (elt); - - fBsrScore-> - // this score needs the 'custom short barline' Scheme function - setDampMarkupIsNeeded (); -} - -void msr2BsrTranslator::visitStart (S_msrDampAll& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting dampAll" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendDampAllToNote (elt); - - fBsrScore-> - // this score needs the 'custom short barline' Scheme function - setDampAllMarkupIsNeeded (); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarCheck" << - ", nextBarNumber: " << - elt->getNextBarNumber () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendBarCheckToVoice (elt); -} - -void msr2BsrTranslator::visitEnd (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarNumberCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendBarNumberCheckToVoice (elt); -} - -void msr2BsrTranslator::visitEnd (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarNumberCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -/ * JMI - fLogOutputStream << - endl << - "*********** fCurrentPartClone" << - endl << - endl; - fCurrentPartClone->print (fLogOutputStream); - fLogOutputStream << - "*********** fCurrentPartClone" << - endl << - endl; - * / - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling repeat start in part clone" << - fCurrentPartClone->getPartCombinedName () << - endl; - } -#endif - -/ * JMI ??? - fCurrentPartClone-> - prepareForRepeatInPart ( - inputLineNumber); - * / - fCurrentVoiceClone-> - prepareForRepeatInVoiceClone ( - inputLineNumber, - elt->getRepeatTimes ()); - -/ * JMI - // create a repeat clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Creating a repeat newborn clone" << - ", line " << inputLineNumber << - ", in voice \"" << - elt-> - getRepeatVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentRepeatClone = - elt-> - createRepeatNewbornClone ( - fCurrentVoiceClone); -* / -} - -void msr2BsrTranslator::visitEnd (S_msrRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -/ * JMI - // append the repeat clone to the current part clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Appending a repeat to part clone " << - fCurrentPartClone->getPartCombinedName () << "\"" << - endl; - } -#endif - - fCurrentPartClone-> // no test needed JMI - appendRepeatCloneToPart ( - inputLineNumber, - fCurrentRepeatClone); -* / - - // forget about current repeat clone // JMI -// JMI fCurrentRepeatClone = 0; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrRepeatCommonPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeatCommonPart" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRepeats - || - gTraceOah->fTraceVoicesDetails - ) { - gLogOstream << - endl << - "Upon visitStart (S_msrRepeatCommonPart&(), voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains:" << - endl; - - gIndenter++; - - gLogOstream << - fCurrentVoiceClone; - - gIndenter--; - } -#endif -} - -void msr2BsrTranslator::visitEnd (S_msrRepeatCommonPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeatCommonPart" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRepeats - || - gTraceOah->fTraceVoicesDetails - ) { - gLogOstream << - endl << - "Upon visitEnd (S_msrRepeatCommonPart&(), voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains:" << - endl; - - gIndenter++; - - gLogOstream << - fCurrentVoiceClone; - - gIndenter--; - } -#endif - - // create a repeat and append it to voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Appending a repeat to voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - createRepeatUponItsEndAndAppendItToVoiceClone ( // JMI - inputLineNumber, - elt-> - getRepeatCommonPartRepeatUpLink ()-> - getRepeatTimes ()); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrRepeatEnding& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeatEnding" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void msr2BsrTranslator::visitEnd (S_msrRepeatEnding& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeatEnding" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create a repeat ending clone and append it to voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Appending a repeat ending clone to voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } - - if (gTraceOah->fTraceRepeats || gTraceOah->fTraceVoices) { - gLogOstream << - endl << - "*********>> msrRepeatEnding HHH " << - ", line " << inputLineNumber << - " contains:" << - endl << - elt << - endl << - "<<*********" << - endl << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRepeatEndingEndInVoice ( - inputLineNumber, - elt->getRepeatEndingNumber (), - elt->getRepeatEndingKind ()); -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrMeasuresRepeat& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void msr2BsrTranslator::visitEnd (S_msrMeasuresRepeat& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasuresRepeat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - // set last segment as the measures repeat pattern segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Setting current last segment as measures repeat pattern segment in voice \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrMeasuresRepeatPattern& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeatPattern" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void msr2BsrTranslator::visitEnd (S_msrMeasuresRepeatPattern& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasuresRepeatPattern" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter--; - - // get the measures repeat upLink - S_msrMeasuresRepeat - measuresRepeat = - elt->getMeasuresRepeatUpLink (); - - // create a measures repeat and append it to voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Appending a measures repeat to voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - createMeasuresRepeatAndAppendItToVoiceClone ( - inputLineNumber, - measuresRepeat-> - getMeasuresRepeatMeasuresNumber (), - measuresRepeat-> - getMeasuresRepeatSlashesNumber ()); - - // forget about the current measures repeat pattern clone - fCurrentMeasuresRepeatPatternClone = nullptr; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrMeasuresRepeatReplicas& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeatReplicas" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void msr2BsrTranslator::visitEnd (S_msrMeasuresRepeatReplicas& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasuresRepeatReplicas" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - - // create a measures repeat replica clone and append it to voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Appending a repeat replica clone to voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - appendMeasuresRepeatReplicaToVoice ( - inputLineNumber); - - // forget about the current measures repeat replicas clone - // JMI ??? fCurrentMeasuresRepeatReplicasClone = nullptr; -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrMultipleRest& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMultipleRest" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLogOutputStream << - "Handling multiple rest start in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRestMeasures - || - gTraceOah->fTraceVoicesDetails - ) { - gLogOstream << - endl << - "Upon I visitStart (S_msrMultipleRest&(), voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains:" << - endl; - - gIndenter++; - - gLogOstream << - fCurrentVoiceClone; - - gIndenter--; - } -#endif - - fCurrentVoiceClone-> - handleMultipleRestInVoiceClone ( - inputLineNumber); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRestMeasures - || - gTraceOah->fTraceVoicesDetails - ) { - gLogOstream << - endl << - "Upon II visitStart (S_msrMultipleRest&(), voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains:" << - endl; - - gIndenter++; - - gLogOstream << - fCurrentVoiceClone; - - gIndenter--; - } -#endif -} - -void msr2BsrTranslator::visitEnd (S_msrMultipleRest& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMultipleRest" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the multiple rest clone -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRestMeasures - || - gTraceOah->fTraceSegments - || - gTraceOah->fTraceVoices - ) { - fLogOutputStream << - "Creating a clone of multiple rest '" << - "'" << - elt->asShortString () << - "' in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - ", fCurrentMultipleRestContentsClone =" << - endl; - - gIndenter++; - - fLogOutputStream << - fCurrentMultipleRestContentsClone; - - gIndenter--; - } -#endif - - S_msrMultipleRest - multipleRestClone = - elt->createMultipleRestNewbornClone ( - fCurrentVoiceClone); - - // set the multiple rest clone's contents - multipleRestClone-> - setMultipleRestContents ( - fCurrentMultipleRestContentsClone); - - // create a new last segment to collect the remainder of the voice, - // containing the next, yet incomplete, measure -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRestMeasures - || - gTraceOah->fTraceSegments - || - gTraceOah->fTraceVoices - ) { - fLogOutputStream << - "Creating a new last segment for the remainder of voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - createNewLastSegmentForVoice ( - inputLineNumber); - - // append the multiple rest clone to the current voice clone - fCurrentVoiceClone-> - appendMultipleRestCloneToVoice ( - inputLineNumber, // JMI ??? - multipleRestClone); - - // forget about the current multiple rest contents clone - fCurrentMultipleRestContentsClone = nullptr; - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRestMeasures - || - gTraceOah->fTraceVoicesDetails - ) { - gLogOstream << - endl << - "Upon visitEnd (S_msrMultipleRest&(), voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains:" << - endl; - - gIndenter++; - - gLogOstream << - fCurrentVoiceClone; - - gIndenter--; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrMultipleRestContents& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMultipleRestContents" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRestMeasures - || - gTraceOah->fTraceVoicesDetails - ) { - gLogOstream << - endl << - "Upon visitStart (S_msrMultipleRestContents&(), voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains:" << - endl; - - gIndenter++; - - gLogOstream << - fCurrentVoiceClone; - - gIndenter--; - } -#endif -} - -void msr2BsrTranslator::visitEnd (S_msrMultipleRestContents& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMultipleRestContents" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - - // create a multiple rest contents clone - fCurrentMultipleRestContentsClone = - elt->createMultipleRestContentsNewbornClone ( - fCurrentVoiceClone); - - // set last segment as the multiple rest contents segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLogOutputStream << - "Setting current last segment as multiple rest contents segment in voice \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentMultipleRestContentsClone-> - setMultipleRestContentsSegment ( - fCurrentVoiceClone-> - getVoiceLastSegment ()); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceRestMeasures - || - gTraceOah->fTraceVoicesDetails - ) { - gLogOstream << - endl << - "Upon visitEnd (S_msrMultipleRestContents&(), voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains:" << - endl; - - gIndenter++; - - gLogOstream << - fCurrentVoiceClone; - - gIndenter--; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrVarValAssoc& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVarValAssoc" << - ", line " << inputLineNumber << - endl; - } -#endif - - msrVarValAssoc::msrVarValAssocKind - varValAssocKind = - elt->getVarValAssocKind (); - string variableValueAux = elt->getVariableValue (); - string variableValue; - - // escape quotes if any - for_each ( - variableValueAux.begin (), - variableValueAux.end (), - stringQuoteEscaper (variableValue)); - - switch (varValAssocKind) { - case msrVarValAssoc::kWorkNumber: - fCurrentIdentification-> - setWorkNumber ( - inputLineNumber, variableValue); - - fBsrScoreHeader-> - setWorkNumber ( - inputLineNumber, variableValue); - - fWorkNumberKnown = true; - break; - - case msrVarValAssoc::kWorkTitle: - fCurrentIdentification-> - setWorkTitle ( - inputLineNumber, variableValue); - - fBsrScoreHeader-> - setWorkTitle ( - inputLineNumber, variableValue); - - fWorkTitleKnown = true; - break; - - case msrVarValAssoc::kMovementNumber: - fCurrentIdentification-> - setMovementNumber ( - inputLineNumber, variableValue); - - fBsrScoreHeader-> - setMovementNumber ( - inputLineNumber, variableValue); - - fMovementNumberKnown = true; - break; - - case msrVarValAssoc::kMovementTitle: - fCurrentIdentification-> - setMovementTitle ( - inputLineNumber, variableValue); - - fBsrScoreHeader-> - setMovementTitle ( - inputLineNumber, variableValue); - - fMovementTitleKnown = true; - break; - - case msrVarValAssoc::kEncodingDate: - fCurrentIdentification-> - setEncodingDate ( - inputLineNumber, variableValue); - - fBsrScoreHeader-> - setEncodingDate ( - inputLineNumber, variableValue); - break; - - case msrVarValAssoc::kScoreInstrument: - fCurrentIdentification-> - setScoreInstrument ( - inputLineNumber, variableValue); - - fBsrScoreHeader-> - setScoreInstrument ( - inputLineNumber, variableValue); - break; - - case msrVarValAssoc::kMiscellaneousField: - fCurrentIdentification-> - setMiscellaneousField ( - inputLineNumber, variableValue); - - fBsrScoreHeader-> - setMiscellaneousField ( - inputLineNumber, variableValue); - break; - - default: - { - stringstream s; - - s << - "### msrVarValAssoc kind '" << - msrVarValAssoc::varValAssocKindAsString ( - varValAssocKind) << - "' is not handled"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - } // switch -} - -void msr2BsrTranslator::visitEnd (S_msrVarValAssoc& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrVarValAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrVarValsListAssoc& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVarValsListAssoc" << - ", line " << inputLineNumber << - endl; - } -#endif - - msrVarValsListAssoc::msrVarValsListAssocKind - varValsListAssocKind = - elt->getVarValsListAssocKind (); - - const list& - variableValuesList = - elt->getVariableValuesList (); - - switch (varValsListAssocKind) { - case msrVarValsListAssoc::kRights: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addRights ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kComposer: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addComposer ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kArranger: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addArranger ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kLyricist: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addLyricist ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kPoet: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addLyricist ( // JMI - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kTranslator: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addTranslator ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kArtist: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addArtist ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kSoftware: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fBsrScoreHeader-> - addSoftware ( - inputLineNumber, (*i)); - } // for - break; -/ * JMI - default: - { - stringstream s; - - s << - "### msrVarValsListAssoc kind '" << - msrVarValsListAssoc::varValsListAssocKindAsString ( - varValsListAssocKind) << - "' is not handled"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - * / - } // switch -} - -void msr2BsrTranslator::visitEnd (S_msrVarValsListAssoc& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrVarValsListAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2BsrTranslator::visitStart (S_msrLayout& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void msr2BsrTranslator::visitEnd (S_msrLayout& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} -*/ - - -} // namespace diff --git a/src/lilypond/msr2BsrTranslator.h b/src/lilypond/msr2BsrTranslator.h deleted file mode 100644 index fef6a7547..000000000 --- a/src/lilypond/msr2BsrTranslator.h +++ /dev/null @@ -1,857 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msr2BsrTranslator___ -#define ___msr2BsrTranslator___ - -#include -#include - -#include "msr.h" -#include "bsr.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class msr2BsrTranslator : - - // score - - public visitor, - - // parts & part groups - - public visitor, - public visitor, - - // staves & voices - - public visitor, - public visitor, - public visitor, - public visitor, - - // barlines - - public visitor, - - // measures - - public visitor, - - // clef, key, time - - public visitor, - public visitor, - public visitor, - - // tempos - - public visitor, - - // notes - - public visitor, - - // dynamics - - public visitor, - - // pages & lines - - public visitor, - public visitor -{ - public: - - msr2BsrTranslator ( - indentedOstream& ios, - S_msrScore mScore); - - virtual ~msr2BsrTranslator (); - - void buildBsrScoreFromMsrScore (); - - S_bsrScore getBsrScore () const - { return fBsrScore; } - - protected: - - // pages & lines - - virtual void visitStart (S_msrPageBreak& elt); - virtual void visitEnd (S_msrPageBreak& elt); - - virtual void visitStart (S_msrLineBreak& elt); - virtual void visitEnd (S_msrLineBreak& elt); - - // score - - virtual void visitStart (S_msrScore& elt); - virtual void visitEnd (S_msrScore& elt); - - // parts & part groups - - virtual void visitStart (S_msrPartGroup& elt); - virtual void visitEnd (S_msrPartGroup& elt); - - virtual void visitStart (S_msrPart& elt); - virtual void visitEnd (S_msrPart& elt); - - // staves & voices - - virtual void visitStart (S_msrStaffTuning& elt); - virtual void visitStart (S_msrStaffDetails& elt); - virtual void visitEnd (S_msrStaffDetails& elt); - - virtual void visitStart (S_msrStaff& elt); - virtual void visitEnd (S_msrStaff& elt); - - virtual void visitStart (S_msrVoice& elt); - virtual void visitEnd (S_msrVoice& elt); - - virtual void visitStart (S_msrVoiceStaffChange& elt); - - // barlines - - virtual void visitStart (S_msrBarline& elt); - - // measures - - virtual void visitStart (S_msrMeasure& elt); - virtual void visitEnd (S_msrMeasure& elt); - - // clef, key, time - - virtual void visitStart (S_msrClef& elt); - virtual void visitEnd (S_msrClef& elt); - - virtual void visitStart (S_msrKey& elt); - virtual void visitEnd (S_msrKey& elt); - - virtual void visitStart (S_msrTime& elt); - virtual void visitEnd (S_msrTime& elt); - - // tempos - - virtual void visitStart (S_msrTempo& elt); - virtual void visitEnd (S_msrTempo& elt); - - // notes - - virtual void visitStart (S_msrNote& elt); - virtual void visitEnd (S_msrNote& elt); - - // dynamics - - virtual void visitStart (S_msrDynamics& elt); - virtual void visitEnd (S_msrDynamics& elt); - - private: - - indentedOstream& fLogOutputStream; - - // messages - // ------------------------------------------------------ - - void notSupportedMessage ( - int inputLineNumber, - string message); - - // the MSR score we're visiting - // ------------------------------------------------------ - S_msrScore fVisitedMsrScore; - - - // the BSR score we're building - // ------------------------------------------------------ - S_bsrScore fBsrScore; - - - // transcription notes - // ------------------------------------------------------ - - S_bsrTranscriptionNotes fCurrentTranscriptionsNotes; - - - // parts & part groups - // ------------------------------------------------------ - S_msrPartGroup fCurrentPartGroup; - S_msrPart fCurrentPart; - - - // staff details - // ------------------------------------------------------ - - S_msrStaffTuning fCurrentStaffTuning; - - - // staves - // ------------------------------------------------------ - S_msrStaff fCurrentStaff; - - - // voices - // ------------------------------------------------------ - S_msrVoice fCurrentVoice; - // map fVoiceNotesMap; // JMI - - - // pages & lines - // ------------------------------------------------------ - S_bsrPage fCurrentPage; - int fCurrentPrintPageNumber; - - S_bsrLine fCurrentLine; - int fCurrentPrintLineNumber; - - - // headings - // ------------------------------------------------------ - - S_bsrPageHeading fFirstPageHeading; - S_bsrMusicHeading fFirstMusicHeading; - - - // foot notes - // ------------------------------------------------------ - -// JMI S_bsrFootNotes fFirstFootNotes; - - - // measures - // ------------------------------------------------------ - - S_bsrMeasure fCurrentMeasure; - - - // clef, key, time - // ------------------------------------------------------ - - S_bsrKey fFirstKey; - S_bsrTime fFirstTime; - - // notes - // ------------------------------------------------------ - - bsrNote::bsrNoteOctaveKind - fCurrentNoteOctaveKind; - - bsrNote::bsrNoteValueSizeKind - fCurrentNoteValueSizeKind; - - void createBsrForNote (S_msrNote note); - - // relative octaves - // ------------------------------------------------------ - S_msrNote fRelativeOctaveReference; - // contains absolute octave - - bsrNote::bsrNoteOctaveIsNeeded - brailleOctaveMarkInNeeded (S_msrNote note); - - -/* - // it's header - // ------------------------------------------------------ - S_bsrHeader fBsrScoreHeader; - - - // score - // ------------------------------------------------------ - S_msrScore fCurrentMsrScoreClone; - - - // identification - // ------------------------------------------------------ - bool fOnGoingIdentification; - S_msrIdentification fCurrentIdentification; - - - // header - // ------------------------------------------------------ - bool fWorkNumberKnown; - bool fWorkTitleKnown; - bool fMovementNumberKnown; - bool fMovementTitleKnown; - - - // paper - // ------------------------------------------------------ - void setPaperIndentsIfNeeded ( - S_msrScaling scaling); - - // credits - // ------------------------------------------------------ - S_msrCredit fCurrentCredit; - - - // part groups - // ------------------------------------------------------ - // S_msrPartGroup fCurrentPartGroupClone; JMI - - // the current partGroup is the top of the stack - stack fPartGroupsStack; - - - // harmonies - // ------------------------------------------------------ - bool fOnGoingHarmonyVoice; - - S_msrHarmony fCurrentHarmonyClone; - - list fPendingHarmoniesList; - - - // frames - // ------------------------------------------------------ - // bool fOnGoingFramesVoice; JMI - - // list fPendingFramesList; // JMI - - - // figured bass - // ------------------------------------------------------ - bool fOnGoingFiguredBassVoice; - S_msrFiguredBass fCurrentFiguredBass; - - - // repeats - // ------------------------------------------------------ - -// JMI S_msrRepeatCommonPart fCurrentRepeatCommonPartClone; - S_msrRepeatEnding fCurrentRepeatEndingClone; - - - // measures repeats - // ------------------------------------------------------ - - S_msrMeasuresRepeatPattern - fCurrentMeasuresRepeatPatternClone; - S_msrMeasuresRepeatReplicas - fCurrentMeasuresRepeatReplicasClone; - - // multiple rests - // ------------------------------------------------------ - - S_msrMultipleRest fCurrentMultipleRestClone; // JMI - S_msrMultipleRestContents fCurrentMultipleRestContentsClone; - - - // segments - // ------------------------------------------------------ - // segments can be imbedded in others, - // the current segment clone is the one at the top of the stack - stack fCurrentSegmentClonesStack; - - - // measures - // ------------------------------------------------------ - // we need to count the measures for option fSeparatorLineEveryNMeasures, - // since measure numbers are actually strings - int fMeasuresCounter; - - S_msrMeasure fCurrentMeasureClone; - - void finalizeCurrentMeasureClone ( - int inputLineNumber, - S_msrMeasure originalMeasure); - - // bar checks - // ------------------------------------------------------ - S_msrBarCheck fLastBarCheck; - - - // notes - // ------------------------------------------------------ - bool fOnGoingNote; - - // fCurrentNonGraceNoteClone is not used for grace notes, - // which are visited while the note they're attached to - // is being visited too - S_msrNote fCurrentNonGraceNoteClone; - - // to help workaround LilyPond issue 34 - S_msrNote fFirstNoteCloneInVoice; - - S_msrGraceNotesGroup fCurrentSkipGraceNotesGroup; - - - // glissandos - // ------------------------------------------------------ - - - // slides - // ------------------------------------------------------ - - - // double tremolos - // ------------------------------------------------------ - S_msrDoubleTremolo fCurrentDoubleTremoloClone; - bool fOnGoingDoubleTremolo; - - - // stems - // ------------------------------------------------------ - S_msrStem fCurrentStem; - - - // grace notes - // ------------------------------------------------------ - S_msrGraceNotesGroup fCurrentGraceNotesGroupClone; - S_msrNote fCurrentGraceNoteClone; - bool fOnGoingGraceNotesGroup; - - // afterGraceNotes optimisation - S_msrAfterGraceNotesGroup fPendingAfterGraceNotesGroup; - S_msrElement fCurrentAfterGraceNotesGroupElement; - - - // chords - // ------------------------------------------------------ - bool fOnGoingChord; - S_msrChord fCurrentChordClone; - - - // tuplets - // ------------------------------------------------------ -// S_msrTuplet fCurrentTupletClone; - // bool fOnGoingTuplet; - stack fTupletClonesStack; - - - // stanzas - // ------------------------------------------------------ - S_msrStanza fCurrentStanzaClone; - bool fOnGoingStanza; - - - // syllables - // ------------------------------------------------------ - S_msrSyllable fCurrentSyllableClone; - bool fOnGoingSyllableExtend; - - - // part groups block - // the current partGroup block is the top of the stack - stack - fPartGroupBlocksStack; - */ - - - // current ongoing values display - // ------------------------------------------------------ - void displayCurrentOnGoingValues (); -}; - - -} - - -#endif - - /* - - // rights - - public visitor, - - public visitor, - public visitor, - - // variable-value associations - - public visitor, - public visitor, - - // scaling - - public visitor, - - // layout - - public visitor, - - // parts & part groups - - public visitor, - - public visitor, - - // staff details - - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - - // lyrics - - public visitor, - public visitor, - - // clefs - - public visitor, - - // keys - - public visitor, - - // times - - public visitor, - - // transpose - - public visitor, - - // print - - public visitor, - public visitor, - - // words - - public visitor, - - // tempo - - public visitor, - - public visitor, - - // rehearsal - - public visitor, - - // harmonies - - public visitor, - public visitor, - - // frames - - public visitor, - - // figured bass - - public visitor, - public visitor, - - // measures - - public visitor, - - // articulations - - public visitor, - - public visitor, - - public visitor, - public visitor, - - // technicals - - public visitor, - public visitor, - public visitor, - public visitor, - - // ornaments - - public visitor, - - // spanners - - public visitor, - - // glissandos - - public visitor, - - // slides - - public visitor, - - // tremolos - - public visitor, - - public visitor, - - // dynamics - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - public visitor, - - // grace notes - - public visitor, - - // notes - - public visitor, - public visitor, - - // accordion registration - - public visitor, - - // harp pedals tuning - - public visitor, - - public visitor, - - // chords - - public visitor, - - // tuplets - - public visitor, - - // ties, slurs, brackets & beams - - public visitor, - - public visitor, - - // ? - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - - - // repeats - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - */ - - -/* - virtual void visitStart (S_msrIdentification& elt); - virtual void visitEnd (S_msrIdentification& elt); - - virtual void visitStart (S_msrCredit& elt); - virtual void visitEnd (S_msrCredit& elt); - virtual void visitStart (S_msrCreditWords& elt); - virtual void visitEnd (S_msrCreditWords& elt); - - virtual void visitStart (S_msrStanza& elt); - virtual void visitEnd (S_msrStanza& elt); - - virtual void visitStart (S_msrSyllable& elt); - virtual void visitEnd (S_msrSyllable& elt); -*/ - - -/* - virtual void visitStart (S_msrTranspose& elt); - virtual void visitEnd (S_msrTranspose& elt); - - virtual void visitStart (S_msrPartNameDisplay& elt); - virtual void visitStart (S_msrPartAbbreviationDisplay& elt); - - virtual void visitStart (S_msrWords& elt); - virtual void visitEnd (S_msrWords& elt); - - virtual void visitStart (S_msrTempo& elt); - virtual void visitEnd (S_msrTempo& elt); - - virtual void visitStart (S_msrRehearsal& elt); - virtual void visitEnd (S_msrRehearsal& elt); - - virtual void visitStart (S_msrSegment& elt); - virtual void visitEnd (S_msrSegment& elt); - - virtual void visitStart (S_msrHarmony& elt); - virtual void visitEnd (S_msrHarmony& elt); - virtual void visitStart (S_msrHarmonyDegree& elt); - - virtual void visitStart (S_msrFrame& elt); - - virtual void visitStart (S_msrFiguredBass& elt); - virtual void visitEnd (S_msrFiguredBass& elt); - virtual void visitStart (S_msrFigure& elt); - - virtual void visitStart (S_msrArticulation& elt); - virtual void visitEnd (S_msrArticulation& elt); - - virtual void visitStart (S_msrFermata& elt); - - virtual void visitStart (S_msrArpeggiato& elt); - virtual void visitStart (S_msrNonArpeggiato& elt); - - virtual void visitStart (S_msrTechnical& elt); - virtual void visitEnd (S_msrTechnical& elt); - - virtual void visitStart (S_msrTechnicalWithInteger& elt); - virtual void visitEnd (S_msrTechnicalWithInteger& elt); - - virtual void visitStart (S_msrTechnicalWithFloat& elt); - virtual void visitEnd (S_msrTechnicalWithFloat& elt); - - virtual void visitStart (S_msrTechnicalWithString& elt); - virtual void visitEnd (S_msrTechnicalWithString& elt); - - virtual void visitStart (S_msrOrnament& elt); - virtual void visitEnd (S_msrOrnament& elt); - - virtual void visitStart (S_msrSpanner& elt); - virtual void visitEnd (S_msrSpanner& elt); - - virtual void visitStart (S_msrGlissando& elt); - virtual void visitEnd (S_msrGlissando& elt); - - virtual void visitStart (S_msrSlide& elt); - virtual void visitEnd (S_msrSlide& elt); - - virtual void visitStart (S_msrSingleTremolo& elt); - virtual void visitEnd (S_msrSingleTremolo& elt); - - virtual void visitStart (S_msrDoubleTremolo& elt); - virtual void visitEnd (S_msrDoubleTremolo& elt); - - virtual void visitStart (S_msrDynamics& elt); - virtual void visitEnd (S_msrDynamics& elt); - - virtual void visitStart (S_msrOtherDynamics& elt); - virtual void visitEnd (S_msrOtherDynamics& elt); - - virtual void visitStart (S_msrSlash& elt); - - virtual void visitStart (S_msrWedge& elt); - virtual void visitEnd (S_msrWedge& elt); - - virtual void visitStart (S_msrGraceNotesGroup& elt); - virtual void visitEnd (S_msrGraceNotesGroup& elt); - - virtual void visitStart (S_msrNote& elt); - virtual void visitEnd (S_msrNote& elt); - - virtual void visitStart (S_msrOctaveShift& elt); - virtual void visitEnd (S_msrOctaveShift& elt); - - virtual void visitStart (S_msrAccordionRegistration& elt); - - virtual void visitStart (S_msrHarpPedalsTuning& elt); - - virtual void visitStart (S_msrStem& elt); - virtual void visitEnd (S_msrStem& elt); - - virtual void visitStart (S_msrBeam& elt); - virtual void visitEnd (S_msrBeam& elt); - - virtual void visitStart (S_msrChord& elt); - virtual void visitEnd (S_msrChord& elt); - - virtual void visitStart (S_msrTuplet& elt); - virtual void visitEnd (S_msrTuplet& elt); - - virtual void visitStart (S_msrTie& elt); - virtual void visitEnd (S_msrTie& elt); - - virtual void visitStart (S_msrSlur& elt); - virtual void visitEnd (S_msrSlur& elt); - - virtual void visitStart (S_msrLigature& elt); - virtual void visitEnd (S_msrLigature& elt); - - virtual void visitStart (S_msrBarline& elt); - virtual void visitEnd (S_msrBarline& elt); - - virtual void visitStart (S_msrSegno& elt); - virtual void visitStart (S_msrCoda& elt); - - virtual void visitStart (S_msrEyeGlasses& elt); - virtual void visitStart (S_msrPedal& elt); - virtual void visitStart (S_msrDamp& elt); - virtual void visitStart (S_msrDampAll& elt); - virtual void visitStart (S_msrScordatura& elt); - - virtual void visitStart (S_msrBarCheck& elt); - virtual void visitEnd (S_msrBarCheck& elt); - virtual void visitStart (S_msrBarNumberCheck& elt); - virtual void visitEnd (S_msrBarNumberCheck& elt); - - virtual void visitStart (S_msrLineBreak& elt); - virtual void visitEnd (S_msrLineBreak& elt); - - virtual void visitStart (S_msrRepeat& elt); - virtual void visitEnd (S_msrRepeat& elt); - virtual void visitStart (S_msrRepeatCommonPart& elt); - virtual void visitEnd (S_msrRepeatCommonPart& elt); - virtual void visitStart (S_msrRepeatEnding& elt); - virtual void visitEnd (S_msrRepeatEnding& elt); - - virtual void visitStart (S_msrMeasuresRepeat& elt); - virtual void visitEnd (S_msrMeasuresRepeat& elt); - virtual void visitStart (S_msrMeasuresRepeatPattern& elt); - virtual void visitEnd (S_msrMeasuresRepeatPattern& elt); - virtual void visitStart (S_msrMeasuresRepeatReplicas& elt); - virtual void visitEnd (S_msrMeasuresRepeatReplicas& elt); - - virtual void visitStart (S_msrMultipleRest& elt); - virtual void visitEnd (S_msrMultipleRest& elt); - virtual void visitStart (S_msrMultipleRestContents& elt); - virtual void visitEnd (S_msrMultipleRestContents& elt); - - virtual void visitStart (S_msrVarValAssoc& elt); - virtual void visitEnd (S_msrVarValAssoc& elt); - virtual void visitStart (S_msrVarValsListAssoc& elt); - virtual void visitEnd (S_msrVarValsListAssoc& elt); - - virtual void visitStart (S_msrScaling& elt); - virtual void visitEnd (S_msrScaling& elt); - - virtual void visitStart (S_msrLayout& elt); - virtual void visitEnd (S_msrLayout& elt); - - virtual void visitStart (S_msrMidi& elt); - virtual void visitEnd (S_msrMidi& elt); - */ diff --git a/src/lilypond/msr2LpsrTranslator.cpp b/src/lilypond/msr2LpsrTranslator.cpp deleted file mode 100644 index 85c114909..000000000 --- a/src/lilypond/msr2LpsrTranslator.cpp +++ /dev/null @@ -1,6535 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // INT_MIN, INT_MAX -#include // for_each - -#include "conversions.h" - -#include "msr2LpsrTranslator.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" -#include "lilypondOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -msr2LpsrTranslator::msr2LpsrTranslator ( - indentedOstream& ios, - S_msrScore mScore) - : fLogOutputStream (ios) -{ - // the MSR score we're visiting - fVisitedMsrScore = mScore; - - // create an empty clone of fVisitedMsrScore for use by the LPSR score - // not sharing the visitiged MSR score allows cleaner data handling - // and optimisations of the LPSR data - fCurrentMsrScoreClone = - fVisitedMsrScore-> - createScoreNewbornClone (); - - // create the current LPSR score - fLpsrScore = - lpsrScore::create ( - K_NO_INPUT_LINE_NUMBER, - fCurrentMsrScoreClone); - - // create the current book block - fCurrentLpsrBookBlock = - lpsrBookBlock::create ( - K_NO_INPUT_LINE_NUMBER); - - // append it to the current book blocks list - fLpsrScore-> - appendBookBlockToBookBlocksList ( - fCurrentLpsrBookBlock); - - // create the current score block if relevant - switch (gLpsrOah->fScoreOutputKind) { - case kScoreOnly: - case kScoreAndParts: - case kPartsAndScore: - case kScoreAndPartsOneFile: - case kPartsAndScoreOneFile: - { - // create the current score block - fCurrentScoreBlock = - lpsrScoreBlock::create ( - K_NO_INPUT_LINE_NUMBER); - - // append it to the book block elements list - fCurrentLpsrBookBlock-> - appendLpsrScoreBlockToBookBlockElementsList ( - fCurrentScoreBlock); - } - break; - case kPartsOnly: - case kPartsOnlyOneFile: - break; - } // switch - - // identification - fOnGoingIdentification = false; - - // header - fWorkNumberKnown = false; - fWorkTitleKnown = false; - fMovementNumberKnown = false; - fMovementTitleKnown = false; - - // staves - fOnGoingStaff = false; - - // voices - fOnGoingHarmonyVoice = false; - fOnGoingFiguredBassVoice = false; - - // repeats - - // notes - fOnGoingNonGraceNote = false; - - // double tremolos - fOnGoingDoubleTremolo = false; - - // grace notes - fOnGoingGraceNotesGroup = false; - - // chords - fOnGoingChord = false; - - // stanzas - fOnGoingStanza = false; - - // syllables - fOnGoingSyllableExtend = false; -}; - -msr2LpsrTranslator::~msr2LpsrTranslator () -{} - -//________________________________________________________________________ -void msr2LpsrTranslator::buildLpsrScoreFromMsrScore () -{ - if (fVisitedMsrScore) { - // create a msrScore browser - msrBrowser browser (this); - - // browse the visited score with the browser - browser.browse (*fVisitedMsrScore); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::displayCurrentOnGoingValues () -{ - fLogOutputStream << - "Ongoing value:" << - endl; - - gIndenter++; - - const int fieldWidth = 25; - - fLogOutputStream << - setw (fieldWidth) << - "fOnGoingIdentification" << ": " << booleanAsString (fOnGoingIdentification) << - endl<< - setw (fieldWidth) << - "fOnGoingStaff" << ": " << booleanAsString (fOnGoingStaff) << - endl<< - setw (fieldWidth) << - "fOnGoingHarmonyVoice" << ": " << booleanAsString (fOnGoingHarmonyVoice) << - endl<< - setw (fieldWidth) << - "fOnGoingFiguredBassVoice" << ": " << booleanAsString (fOnGoingFiguredBassVoice) << - endl<< - setw (fieldWidth) << - "fOnGoingNonGraceNote" << ": " << booleanAsString (fOnGoingNonGraceNote) << - endl<< - setw (fieldWidth) << - "fOnGoingDoubleTremolo" << ": " << booleanAsString (fOnGoingDoubleTremolo) << - endl<< - setw (fieldWidth) << - "fOnGoingGraceNotesGroup" << ": " << booleanAsString (fOnGoingGraceNotesGroup) << - endl<< - setw (fieldWidth) << - "fOnGoingChord" << ": " << booleanAsString (fOnGoingChord) << - endl<< - setw (fieldWidth) << - "fOnGoingStanza" << ": " << booleanAsString (fOnGoingStanza) << - endl<< - setw (fieldWidth) << - "fOnGoingSyllableExtend" << ": " << booleanAsString (fOnGoingSyllableExtend) << - endl; - - gIndenter--; -} - -//________________________________________________________________________ -void msr2LpsrTranslator::setPaperIndentsIfNeeded ( - S_msrScaling scaling) -{ - S_lpsrPaper - paper = - fLpsrScore->getScorePaper (); - - int - scorePartGroupNamesMaxLength = - fCurrentMsrScoreClone-> - getScorePartGroupNamesMaxLength (); - - int - scorePartNamesMaxLength = - fCurrentMsrScoreClone-> - getScorePartNamesMaxLength (); - - int - scoreInstrumentNamesMaxLength = - fCurrentMsrScoreClone-> - getScoreInstrumentNamesMaxLength (); - - int - scoreInstrumentAbbreviationsMaxLength = - fCurrentMsrScoreClone-> - getScoreInstrumentAbbreviationsMaxLength (); - - // compute the maximum value - int maxValue = -1; - - if (scorePartGroupNamesMaxLength > maxValue) { - maxValue = scorePartGroupNamesMaxLength; - } - - if (scorePartNamesMaxLength > maxValue) { - maxValue = scorePartNamesMaxLength; - } - - if (scoreInstrumentNamesMaxLength > maxValue) { - maxValue = scoreInstrumentNamesMaxLength; - } - - // compute the maximum short value - int maxShortValue = -1; - - if (scoreInstrumentAbbreviationsMaxLength > maxShortValue) { - maxShortValue = scoreInstrumentAbbreviationsMaxLength; - } - - // heuristics to determine the number of characters per centimeter - float charactersPerCemtimeter = 4.0; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGeometry) { - // get the paper width - S_msrLength - paperWidth = - scaling-> - getPageLayout ()-> - getPageWidth (); - - if (paperWidth) { - fLogOutputStream << - "setPaperIndentsIfNeeded()" << // JMI ??? - endl; - } - - gIndenter++; - - const int fieldWidth = 40; - - fLogOutputStream << left << - setw (fieldWidth) << - "scorePartGroupNamesMaxLength" << " : " << - scorePartGroupNamesMaxLength << - endl << - setw (fieldWidth) << - "scorePartNamesMaxLength" << " : " << - scorePartNamesMaxLength << - endl << - - setw (fieldWidth) << - "scoreInstrumentNamesMaxLength" << " : " << - scoreInstrumentNamesMaxLength << - endl << - setw (fieldWidth) << - "scoreInstrumentAbbreviationsMaxLength" << " : " << - scoreInstrumentAbbreviationsMaxLength << - endl << - - setw (fieldWidth) << - "maxValue" << " : " << - maxValue << - endl << - setw (fieldWidth) << - "maxShortValue" << " : " << - maxShortValue << - endl << - - setw (fieldWidth) << - "charactersPerCemtimeter" << " : " << - charactersPerCemtimeter << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "paperWidth" << " : "; - if (paperWidth) { - fLogOutputStream << paperWidth; - } - else { - fLogOutputStream << "none"; - } - fLogOutputStream << endl; - - gIndenter--; - } -#endif - -/* JMI - // set indent if relevant - if (maxValue > 0) { - paper-> - setIndent ( - maxValue / charactersPerCemtimeter); - } - - // set short indent if relevant - if (maxShortValue > 0) { - paper-> - setShortIndent ( - maxShortValue / charactersPerCemtimeter); - } - */ -} - -//________________________________________________________________________ -/* JMI -void msr2LpsrTranslator::prependSkipGraceNotesGroupToPartOtherVoices ( - S_msrPart partClone, - S_msrVoice voiceClone, - S_msrGraceNotesGroup skipGraceNotesGroup) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "--> prepending a skip graceNotesGroup clone " << - skipGraceNotesGroup->asShortString () << - " to voices other than \"" << - voiceClone->getVoiceName () << "\"" << - " in part " << - partClone->getPartCombinedName () << - ", line " << skipGraceNotesGroup->getInputLineNumber () << - endl; - } -#endif - - map - partStavesMap = - partClone-> - getPartStavesMap (); - - for ( - map::const_iterator i=partStavesMap.begin (); - i!=partStavesMap.end (); - i++ - ) { - list - staffAllVoicesVector = - (*i).second-> - getStaffAllVoicesVector (); - - for ( - list::const_iterator j=staffAllVoicesVector.begin (); - j!=staffAllVoicesVector.end (); - j++ - ) { - S_msrVoice voice = (*j); - - if (voice != voiceClone) { - // prepend skip grace notes to voice JMI - / * - voice-> - prependGraceNotesGroupToVoice ( - skipGraceNotesGroup); - * / - } - } // for - - } // for -} -*/ - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrScore& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrScore" << - ", line " << inputLineNumber << - endl; - } -#endif - - // fetch score header - fCurrentLpsrScoreHeader = - fLpsrScore-> getScoreHeader(); - - // is there a rights option? - if (gLilypondOah->fRights.size ()) { - // define rights - fCurrentLpsrScoreHeader-> - addRights ( - inputLineNumber, - gLilypondOah->fRights); - } - - // is there a composer option? - if (gLilypondOah->fComposer.size ()) { - // define composer - fCurrentLpsrScoreHeader-> - addComposer ( - inputLineNumber, - gLilypondOah->fComposer); - } - - // is there an arranger option? - if (gLilypondOah->fArranger.size ()) { - // define arranger - fCurrentLpsrScoreHeader-> - addArranger ( - inputLineNumber, - gLilypondOah->fArranger); - } - - // is there a poet option? - if (gLilypondOah->fPoet.size ()) { - // define poet - fCurrentLpsrScoreHeader-> - addPoet ( - inputLineNumber, - gLilypondOah->fPoet); - } - - // is there a lyricist option? - if (gLilypondOah->fLyricist.size ()) { - // define lyricist - fCurrentLpsrScoreHeader-> - addLyricist ( - inputLineNumber, - gLilypondOah->fLyricist); - } - - // is there a software option? - if (gLilypondOah->fSoftware.size ()) { - // define software - - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fSoftware); - } - - // is there a dedication? - if (gLilypondOah->fDedication.size ()) { - // define dedication - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fDedication); - } - - // is there a piece? - if (gLilypondOah->fPiece.size ()) { - // define piece - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fPiece); - } - - // is there an opus? - if (gLilypondOah->fOpus.size ()) { - // define opus - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fOpus); - } - - // is there a title? - if (gLilypondOah->fTitle.size ()) { - // define title - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fTitle); - } - - // is there a subtitle? - if (gLilypondOah->fSubTitle.size ()) { - // define subtitle - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fSubTitle); - } - - // is there a subsubtitle? - if (gLilypondOah->fSubSubTitle.size ()) { - // define subsubtitle - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fSubSubTitle); - } - - // is there a meter? - if (gLilypondOah->fMeter.size ()) { - // define meter - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fMeter); - } - - // is there a tagline? - if (gLilypondOah->fTagline.size ()) { - // define tagline - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fTagline); - } - - // is there a copyright? - if (gLilypondOah->fCopyright.size ()) { - // define copyright - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, - gLilypondOah->fCopyright); - } - - // is the LilyPond macro 'boxAroundNextBarNumber' to be generated? - if (gLilypondOah->fBoxAroundBarNumberSet.size ()) { - fLpsrScore-> - // this score needs the 'boxAroundNextBarNumber' Scheme function - setBoxAroundNextBarNumberIsNeeded (); - } - - // is the Scheme function 'whiteNoteHeads' to be generated? - if (gLilypondOah->fWhiteNoteHeads) { - fLpsrScore-> - // this score needs the 'whiteNoteHeads' Scheme function - setWhiteNoteHeadsIsNeeded (); - } - - // is the Scheme function 'jazzChordsDisplay' to be generated? - if (gLilypondOah->fJazzChordsDisplay) { - fLpsrScore-> - // this score needs the 'jazzChordsDisplay' Scheme function - setJazzChordsDisplayIsNeeded (); - } - - // is Jianpu notation to be generated? - if (gLilypondOah->fJianpu) { - fLpsrScore-> - // this score needs the 'jianpu file include' Scheme function - setJianpuFileIncludeIsNeeded (); - } - - // are colored ledger lines to be generated? - if (! gLilypondOah->fLedgerLinesRGBColor.isEmpty ()) { - fLpsrScore-> - // this score needs the 'colored ledger lines' Scheme function - setColoredLedgerLinesIsNeeded (); - } - -/* JMI - // push it onto this visitors's stack, - // making it the current partGroup block - fPartGroupBlocksStack.push ( - partGroupBlock); - */ -} - -void msr2LpsrTranslator::visitEnd (S_msrScore& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrScore" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fWorkTitleKnown && fMovementTitleKnown) { - string - workTitle = - fCurrentIdentification-> - getWorkTitle ()-> - getVariableValue (), - movementTitle = - fCurrentIdentification-> - getMovementTitle ()-> - getVariableValue (); - - if ( - workTitle.size () == 0 - && - movementTitle.size () > 0 - ) { - // use the movement title as the work title - fCurrentIdentification-> - setWorkTitle ( - inputLineNumber, movementTitle); - - fCurrentLpsrScoreHeader-> - setWorkTitle ( - inputLineNumber, - movementTitle, - kFontStyleNone, - kFontWeightNone); - - // forget the movement title - fCurrentIdentification-> - setMovementTitle ( - inputLineNumber, ""); - - fCurrentLpsrScoreHeader-> - setMovementTitle ( - inputLineNumber, - "", - kFontStyleNone, - kFontWeightNone); - } - } - - else if (! fWorkTitleKnown && fMovementTitleKnown) { - string - movementTitle = - fCurrentIdentification-> - getMovementTitle ()-> - getVariableValue (); - - // use the movement title as the work title - fCurrentIdentification-> - setWorkTitle ( - inputLineNumber, movementTitle); - - fCurrentLpsrScoreHeader-> - setWorkTitle ( - inputLineNumber, - movementTitle, - kFontStyleNone, - kFontWeightNone); - - // forget the movement title - fCurrentIdentification-> - setMovementTitle ( - inputLineNumber, ""); - - fCurrentLpsrScoreHeader-> - setMovementTitle ( - inputLineNumber, - "", - kFontStyleNone, - kFontWeightNone); - } - - if (fWorkNumberKnown && fMovementNumberKnown) { - string - workNumber = - fCurrentIdentification-> - getWorkNumber ()-> - getVariableValue (), - movementNumber = - fCurrentIdentification-> - getMovementNumber ()-> - getVariableValue (); - - if ( - workNumber.size () == 0 - && - movementNumber.size () > 0 - ) { - // use the movement number as the work number - fCurrentIdentification-> - setWorkNumber ( - inputLineNumber, movementNumber); - - fCurrentLpsrScoreHeader-> - setWorkNumber ( - inputLineNumber, - movementNumber, - kFontStyleNone, - kFontWeightNone); - - // forget the movement number - fCurrentIdentification-> - setMovementNumber ( - inputLineNumber, ""); - - fCurrentLpsrScoreHeader-> - setMovementNumber ( - inputLineNumber, - "", - kFontStyleNone, - kFontWeightNone); - } - } - - else if (! fWorkNumberKnown && fMovementNumberKnown) { - string - movementNumber = - fCurrentIdentification-> - getMovementNumber ()-> - getVariableValue (); - - // use the movement number as the work number - fCurrentIdentification-> - setWorkNumber ( - inputLineNumber, movementNumber); - - fCurrentLpsrScoreHeader-> - setWorkNumber ( - inputLineNumber, - movementNumber, - kFontStyleNone, - kFontWeightNone); - - // forget the movement number - fCurrentIdentification-> - setMovementNumber ( - inputLineNumber, ""); - - fCurrentLpsrScoreHeader-> - setMovementNumber ( - inputLineNumber, - "", - kFontStyleNone, - kFontWeightNone); - } - - // set ident and short indent if needed - setPaperIndentsIfNeeded ( // JMI ??? BLARK - elt->getScaling ()); - -/* JMI - // get top level partgroup block from the stack - S_lpsrPartGroupBlock - partGroupBlock = - fPartGroupBlocksStack.top (); - - // pop it from the stack - fPartGroupBlocksStack.top (); - - // the stack should now be empty - if (fPartGroupBlocksStack.size ()) { - msrInternalError ( - 1, - "the partGroup block stack is not exmpty at the end of the visit"); - } - */ -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrIdentification& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrIdentification" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - - fCurrentIdentification = - fLpsrScore-> - getMsrScore ()-> - getIdentification (); - - fOnGoingIdentification = true; -} - -void msr2LpsrTranslator::visitEnd (S_msrIdentification& elt) -{ - fOnGoingIdentification = false; - - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrIdentification" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrScaling& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrScaling" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - - // create a scaling clone - S_msrScaling - geometryClone = - elt->createMsrScalingNewbornClone (); - - // register it in current MSR score clone - fCurrentMsrScoreClone-> // JMI BLARK ??? - setScaling ( - geometryClone); - - // get LPSR score paper - S_lpsrPaper - paper = - fLpsrScore->getScorePaper (); - - // sanity check - msrAssert ( - paper != nullptr, - "paper is null"); - - // set the current book block's paper as a newborn clone of paper - fCurrentLpsrBookBlock -> - setBookBlockPaper ( - paper-> - createPaperNewbornClone ()); - - // get LPSR score layout - S_lpsrLayout - scoreLayout = - fLpsrScore->getScoreLayout (); - - // populate layout JMI ??? - /* - scoreLayout-> - setMillimeters (elt->getMillimeters ()); - scoreLayout-> - setTenths (elt->getTenths ()); - */ - - // populate LPSR score global staff size - float globalStaffSize = 0.0; - - if ( - gLpsrOah->fGlobalStaffSize - != - gLpsrOah->fStaffGlobalSizeDefaultValue - ) { - // the LPSR option value takes precedence - globalStaffSize = - gLpsrOah->fGlobalStaffSize; - } - - else { - // fetch LPSR score global staff size - globalStaffSize = - elt->fetchGlobalStaffSize (); - } - - // set score global staff size Scheme variable - fLpsrScore-> - setScoreGlobalStaffSizeSchemeVariable ( - globalStaffSize); - - // get LPSR score block layout - S_lpsrLayout - scoreBlockLayout = - fLpsrScore->getScoreLayout (); - - // create the score block layout staff-size Scheme assoc - stringstream s; - s << globalStaffSize; - S_lpsrSchemeVariable - assoc = - lpsrSchemeVariable::create ( - K_NO_INPUT_LINE_NUMBER, // JMI - lpsrSchemeVariable::kCommentedYes, - "layout-set-staff-size", - s.str (), - "Uncomment and adapt next line as needed (default is 20)", - lpsrSchemeVariable::kEndlOnce); - - // populate score block layout - scoreBlockLayout-> - addSchemeVariable (assoc); -} - -void msr2LpsrTranslator::visitEnd (S_msrScaling& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrScaling" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrCredit& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrCredit" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentCredit = elt; - - // set elt as credit of the MSR score part of the LPSR score - fLpsrScore-> - getMsrScore ()-> - appendCreditToScore (fCurrentCredit); -} - -void msr2LpsrTranslator::visitEnd (S_msrCredit& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrCredit" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentCredit = nullptr; -} - -void msr2LpsrTranslator::visitStart (S_msrCreditWords& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrCreditWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // don't append it to the current credit, since the latter is no clone - /* JMI - fCurrentCredit-> - appendCreditWordsToCredit ( - elt); - */ -} - -void msr2LpsrTranslator::visitEnd (S_msrCreditWords& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrCreditWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrPartGroup& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPartGroup " << - elt->getPartGroupCombinedName () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a partGroup clone - // current partGroup clone, i.e. the top of the stack, - // is the upLink of the new one if it exists - S_msrPartGroup - partGroupClone = - elt->createPartGroupNewbornClone ( - fPartGroupsStack.size () - ? fPartGroupsStack.top () - : nullptr, - fLpsrScore->getMsrScore ()); - - // push it onto this visitors's stack, - // making it the current partGroup block -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Pushing part group clone " << - partGroupClone->getPartGroupCombinedName () << - " onto stack" << - endl; - } -#endif - - fPartGroupsStack.push ( - partGroupClone); - -/* JMI - // add it to the MSR score clone - fCurrentMsrScoreClone-> - addPartGroupToScore (fCurrentPartGroupClone); -*/ - - // create a partGroup block refering to the part group clone - S_lpsrPartGroupBlock - partGroupBlock = - lpsrPartGroupBlock::create ( - partGroupClone); - - // push it onto this visitors's stack, - // making it the current partGroup block - fPartGroupBlocksStack.push ( - partGroupBlock); - - // get the LPSR store block - S_lpsrScoreBlock - scoreBlock = - fLpsrScore->getScoreScoreBlock (); - - // don't append the partgroup block to the score/bookpart block now: - // this will be done when it gets popped from the stack -} - -void msr2LpsrTranslator::visitEnd (S_msrPartGroup& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrPartGroup " << - elt->getPartGroupCombinedName () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - S_msrPartGroup - currentPartGroup = - fPartGroupsStack.top (); - - if (fPartGroupsStack.size () == 1) { - // add the current partgroup clone to the MSR score clone - // if it is the top-level one, i.e it's alone in the stack - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Adding part group clone " << - currentPartGroup->getPartGroupCombinedName () << - " to MSR score" << - endl; - } -#endif - - fCurrentMsrScoreClone-> - addPartGroupToScore (currentPartGroup); - - fPartGroupsStack.pop (); - } - - else { - - // pop current partGroup from this visitors's stack -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Popping part group clone " << - fPartGroupsStack.top ()->getPartGroupCombinedName () << - " from stack" << - endl; - } -#endif - - fPartGroupsStack.pop (); - - // append the current part group to the one one level higher, - // i.e. the new current part group - fPartGroupsStack.top ()-> - appendSubPartGroupToPartGroup ( - currentPartGroup); - } - - S_lpsrPartGroupBlock - currentPartGroupBlock = - fPartGroupBlocksStack.top (); - - if (fPartGroupBlocksStack.size () == 1) { - // add the current partgroup clone to the LPSR score's parallel music - // if it is the top-level one, i.e it's alone in the stack - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Adding part group block clone for part group " << - currentPartGroupBlock-> - getPartGroup ()-> - getPartGroupCombinedName () << - " to LPSR score" << - endl; - } -#endif - - // append the current partgroup block to the current score block if relevant - switch (gLpsrOah->fScoreOutputKind) { - case kScoreOnly: - case kScoreAndParts: - case kPartsAndScore: - case kScoreAndPartsOneFile: - case kPartsAndScoreOneFile: - { - // sanity check - msrAssert ( - fCurrentScoreBlock != nullptr, - "fCurrentScoreBlock is null"); - - // append the current partgroup block to the current score block - // if it is the top-level one, i.e it's alone in the stack JMI - // JMI BOF if (fPartGroupBlocksStack.size () == 1) -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrBlocks) { - fLogOutputStream << - "Appending part group block for part group " << - currentPartGroupBlock-> - getPartGroup ()-> - getPartGroupCombinedName () << - " to the current score block '" << - fCurrentScoreBlock->asShortString () << - "'" << - endl; - } -#endif - fCurrentScoreBlock-> - appendPartGroupBlockToScoreBlock ( - fPartGroupBlocksStack.top ()); - } - break; - case kPartsOnly: - case kPartsOnlyOneFile: - break; - } // switch - - // append the current partgroup block to the current bookpart block if relevant - switch (gLpsrOah->fScoreOutputKind) { - case kScoreOnly: - break; - case kScoreAndParts: - case kPartsAndScore: - case kScoreAndPartsOneFile: - case kPartsAndScoreOneFile: - case kPartsOnly: - case kPartsOnlyOneFile: - { - // sanity check - msrAssert ( - fCurrentBookPartBlock != nullptr, - "fCurrentBookPartBlock is null"); - - // append the current partgroup block to the current bookpart block - // if it is the top-level one, i.e it's alone in the stack JMI - // JMI BOF if (fPartGroupBlocksStack.size () == 1) -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrBlocks) { - fLogOutputStream << - "Appending part group block for part group " << - currentPartGroupBlock-> - getPartGroup ()-> - getPartGroupCombinedName () << - " to the current bookpart block '" << - fCurrentScoreBlock->asShortString () << - "'" << - endl; - } -#endif - fCurrentBookPartBlock-> - appendPartGroupBlockToBookPartBlock ( - fPartGroupBlocksStack.top ()); - } - break; - } // switch - - // pop current partGroup block from this visitors's stack, - // only now to restore the appearence order - fPartGroupBlocksStack.pop (); - } - - else { - // pop current partGroup block from this visitors's stack -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Popping part group block clone for part group " << - currentPartGroupBlock-> - getPartGroup ()-> - getPartGroupCombinedName () << - " from stack" << - endl; - } -#endif - - fPartGroupBlocksStack.pop (); - - // append the current part group block to the one one level higher, - // i.e. the new current part group block - fPartGroupBlocksStack.top ()-> - appendElementToPartGroupBlock ( - currentPartGroupBlock); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - string - partCombinedName = - elt->getPartCombinedName (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPart " << - partCombinedName << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - gIndenter++; - - // create a part clone - fCurrentPartClone = - elt->createPartNewbornClone ( - fPartGroupsStack.top ()); - - // add it to the partGroup clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "Adding part clone " << - fCurrentPartClone->getPartCombinedName () << - " to part group clone \"" << - fPartGroupsStack.top ()->getPartGroupCombinedName () << - "\"" << - endl; - } -#endif - - fPartGroupsStack.top ()-> - appendPartToPartGroup (fCurrentPartClone); - - // create a part block - fCurrentPartBlock = - lpsrPartBlock::create ( - fCurrentPartClone); - - // append it to the current partGroup block -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "Appending part block " << - fPartGroupsStack.top ()->getPartGroupCombinedName () << - " to part group blocks stack top" << - endl; - } -#endif - - fPartGroupBlocksStack.top ()-> - appendElementToPartGroupBlock ( - fCurrentPartBlock); - - // create a bookpart block if relevant - switch (gLpsrOah->fScoreOutputKind) { - case kScoreOnly: - break; - case kScoreAndParts: - case kPartsAndScore: - case kScoreAndPartsOneFile: - case kPartsAndScoreOneFile: - case kPartsOnly: - case kPartsOnlyOneFile: - { - // create the current score block - fCurrentBookPartBlock = - lpsrBookPartBlock::create ( - inputLineNumber); - - // append it to the book block elements list - fCurrentLpsrBookBlock-> - appendLpsrBookPartBlockToBookBlockElementsList ( - fCurrentBookPartBlock); - } - break; - } // switch -} - -void msr2LpsrTranslator::visitEnd (S_msrPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrPart " << - elt->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - string - partInstrumentAbbreviation = - fCurrentPartClone-> - getPartInstrumentAbbreviation (); - - // populate part instrument short name if empty and possible - if (partInstrumentAbbreviation.size () == 0) { - string - partAbbreviation = - elt->getPartAbbreviation (); - - fCurrentPartClone-> - setPartInstrumentAbbreviation ( - partAbbreviation); - - fCurrentPartClone-> - finalizePartClone ( - inputLineNumber); - } - - if (fCurrentSkipGraceNotesGroup) { - // add it ahead of the other voices in the part if needed - fCurrentPartClone-> - addSkipGraceNotesGroupBeforeAheadOfVoicesClonesIfNeeded ( - fCurrentVoiceClone, - fCurrentSkipGraceNotesGroup); - - // forget about this skip grace notes group - fCurrentSkipGraceNotesGroup = nullptr; - } - - // forget about the current part block - fCurrentPartBlock = nullptr; - - // forget about the current book part block - fCurrentBookPartBlock = nullptr; -} - -//________________________________________________________________________ -/* JMI -void msr2LpsrTranslator::visitStart (S_msrStaffLinesNumber& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStaffLinesNumber" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create a staff lines number clone - fCurrentStaffLinesNumberClone = - elt-> - createStaffLinesNumberNewbornClone (); -} -*/ - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrStaffTuning& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStaffTuning" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a staff tuning clone - fCurrentStaffTuningClone = - elt-> - createStaffTuningNewbornClone (); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrStaffDetails& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStaffDetails" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentStaffTuningClone = nullptr; -} - -void msr2LpsrTranslator::visitEnd (S_msrStaffDetails& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrStaffDetails" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the staff details to the current voice clone - fCurrentVoiceClone-> - appendStaffDetailsToVoice ( - elt); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrStaff& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStaff \"" << - elt->getStaffName () << "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - - switch (elt->getStaffKind ()) { - case msrStaff::kStaffRegular: - case msrStaff::kStaffTablature: - case msrStaff::kStaffDrum: - case msrStaff::kStaffRythmic: - { - // create a staff clone - fCurrentStaffClone = - elt->createStaffNewbornClone ( - fCurrentPartClone); - - // add it to the part clone - fCurrentPartClone-> - addStaffToPartCloneByItsNumber ( - fCurrentStaffClone); - - // create a staff block - fCurrentStaffBlock = - lpsrStaffBlock::create ( - fCurrentStaffClone); - - string - partName = - fCurrentPartClone->getPartName (), - partAbbreviation = - fCurrentPartClone->getPartAbbreviation (); - - string staffBlockInstrumentName; - string staffBlockShortInstrumentName; - - // don't set instrument name nor short instrument name // JMI - // if the staff belongs to a piano part where they're already set - if (! partName.size ()) { - staffBlockInstrumentName = partName; - } - if (! partAbbreviation.size ()) { - staffBlockShortInstrumentName = partAbbreviation; - } - - if (staffBlockInstrumentName.size ()) { - fCurrentStaffBlock-> - setStaffBlockInstrumentName (staffBlockInstrumentName); - } - - if (staffBlockShortInstrumentName.size ()) { - fCurrentStaffBlock-> - setStaffBlockShortInstrumentName (staffBlockShortInstrumentName); - } - - // append the staff block to the current part block - fCurrentPartBlock-> - appendStaffBlockToPartBlock ( - fCurrentStaffBlock); - - // handle the current staff block - switch (gLpsrOah->fScoreOutputKind) { - case kScoreOnly: // default value - break; - case kScoreAndParts: - case kPartsAndScore: - case kScoreAndPartsOneFile: - case kPartsAndScoreOneFile: - { - /* JMI - // create the current score block - fCurrentScoreBlock = - lpsrScoreBlock::create ( - K_NO_INPUT_LINE_NUMBER); - - // append it to the book block elements list - fCurrentLpsrBookBlock-> - appendLpsrScoreBlockToBookBlockElementsList ( - fCurrentScoreBlock); - */ - } - break; - case kPartsOnly: - case kPartsOnlyOneFile: - break; - } // switch - - fOnGoingStaff = true; - } - break; - - case msrStaff::kStaffHarmony: - { - // create a staff clone - fCurrentStaffClone = - elt->createStaffNewbornClone ( - fCurrentPartClone); - - // add it to the part clone - fCurrentPartClone-> - addStaffToPartCloneByItsNumber ( - fCurrentStaffClone); - - fOnGoingStaff = true; - } - break; - - case msrStaff::kStaffFiguredBass: - { - // create a staff clone - fCurrentStaffClone = - elt->createStaffNewbornClone ( - fCurrentPartClone); - - // add it to the part clone - fCurrentPartClone-> - addStaffToPartCloneByItsNumber ( - fCurrentStaffClone); - - // register it as the part figured bass staff - fCurrentPartClone-> - setPartFiguredBassStaff (fCurrentStaffClone); - - fOnGoingStaff = true; - } - break; - } // switch -} - -void msr2LpsrTranslator::visitEnd (S_msrStaff& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting S_msrStaff \"" << - elt->getStaffName () << "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (elt->getStaffKind ()) { - case msrStaff::kStaffRegular: - case msrStaff::kStaffDrum: - case msrStaff::kStaffRythmic: - { - fOnGoingStaff = false; - } - break; - - case msrStaff::kStaffTablature: - // JMI - break; - - case msrStaff::kStaffHarmony: - // JMI - break; - - case msrStaff::kStaffFiguredBass: - // JMI - break; - } // switch -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrVoice& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVoice \"" << - elt->asString () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentVoiceOriginal = elt; - - gIndenter++; - - switch (elt->getVoiceKind ()) { - - case msrVoice::kVoiceRegular: - // create a voice clone - fCurrentVoiceClone = - elt->createVoiceNewbornClone ( - fCurrentStaffClone); - - // add it to the staff clone - fCurrentStaffClone-> - registerVoiceInStaff ( - inputLineNumber, - fCurrentVoiceClone); - - // append the voice clone to the LPSR score elements list - fLpsrScore -> - appendVoiceToScoreElementsList (fCurrentVoiceClone); - - // append a use of the voice to the current staff block - fCurrentStaffBlock-> - appendVoiceUseToStaffBlock ( - fCurrentVoiceClone); - break; - - case msrVoice::kVoiceHarmony: - { - /* JMI - // create the harmony staff and voice if not yet done - fCurrentPartClone-> - createPartHarmonyStaffAndVoiceIfNotYetDone ( - inputLineNumber); - - // fetch harmony voice - fCurrentVoiceClone = - fCurrentPartClone-> - getPartHarmonyVoice (); -*/ - - // create a voice clone - fCurrentVoiceClone = - elt->createVoiceNewbornClone ( - fCurrentStaffClone); - - // add it to the staff clone - fCurrentStaffClone-> - registerVoiceInStaff ( - inputLineNumber, - fCurrentVoiceClone); - - if ( - elt->getMusicHasBeenInsertedInVoice () // superfluous test ??? JMI - ) { - // append the voice clone to the LPSR score elements list - fLpsrScore -> - appendVoiceToScoreElementsList ( - fCurrentVoiceClone); - - // create a ChordNames context - string voiceName = - elt->getVoiceName (); - - string partCombinedName = - elt->fetchVoicePartUpLink ()-> - getPartCombinedName (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Creating a ChordNames context for \"" << voiceName << - "\" in part " << partCombinedName << - endl; - } -#endif - - S_lpsrChordNamesContext - chordNamesContext = - lpsrChordNamesContext::create ( - inputLineNumber, - lpsrContext::kExistingContextYes, - voiceName, - elt->getRegularVoiceForHarmonyVoiceBackwardLink ()); - - // append it to the current part block -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Appending the ChordNames context for \"" << voiceName << - "\" in part " << partCombinedName << - endl; - } -#endif - - fCurrentPartBlock-> - appendChordNamesContextToPartBlock ( - inputLineNumber, - chordNamesContext); - - fOnGoingHarmonyVoice = true; - } - } - break; - - case msrVoice::kVoiceFiguredBass: - { - // create a voice clone - fCurrentVoiceClone = - elt->createVoiceNewbornClone ( - fCurrentStaffClone); - - // add it to the staff clone - fCurrentStaffClone-> - registerVoiceInStaff ( - inputLineNumber, - fCurrentVoiceClone); - - // register it as the part figured bass voice - fCurrentPartClone-> - setPartFiguredBassVoice (fCurrentVoiceClone); - - if ( - elt->getMusicHasBeenInsertedInVoice () // superfluous test ??? JMI - ) { - // append the voice clone to the LPSR score elements list - fLpsrScore -> - appendVoiceToScoreElementsList ( - fCurrentVoiceClone); - - // create a FiguredBass context - string voiceName = - elt->getVoiceName (); - - string partCombinedName = - elt->fetchVoicePartUpLink ()-> - getPartCombinedName (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Creating a FiguredBass context for \"" << voiceName << - "\" in part " << partCombinedName << - endl; - } -#endif - - S_lpsrFiguredBassContext - figuredBassContext = - lpsrFiguredBassContext::create ( - inputLineNumber, - lpsrContext::kExistingContextYes, - voiceName, - elt-> getVoiceStaffUpLink ()); - - // append it to the current part block -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Appending the FiguredBass context for \"" << voiceName << - "\" in part " << partCombinedName << - endl; - } -#endif - - fCurrentPartBlock-> - appendFiguredBassContextToPartBlock ( - figuredBassContext); - - fOnGoingFiguredBassVoice = true; - } - } - break; - } // switch - - // clear the voice notes map - fVoiceNotesMap.clear (); - - fFirstNoteCloneInVoice = nullptr; -} - -void msr2LpsrTranslator::visitEnd (S_msrVoice& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrVoice \"" << - elt->getVoiceName () << "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (elt->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - // JMI - break; - - case msrVoice::kVoiceHarmony: - fOnGoingHarmonyVoice = false; - break; - - case msrVoice::kVoiceFiguredBass: - fOnGoingFiguredBassVoice = false; - break; - } // switch -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrVoiceStaffChange& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVoiceStaffChange '" << - elt->asString () << "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a voice staff change clone - S_msrVoiceStaffChange - voiceStaffChangeClone = - elt-> - createStaffChangeNewbornClone (); - - // append it to the current voice clone - fCurrentVoiceClone-> - appendVoiceStaffChangeToVoice ( - voiceStaffChangeClone); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSegment& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a clone of the segment - fCurrentSegmentClone = - elt->createSegmentNewbornClone ( - fCurrentVoiceClone); - - // set it as the new voice last segment - fCurrentVoiceClone-> - setVoiceLastSegmentInVoiceClone ( - fCurrentSegmentClone); -} - -void msr2LpsrTranslator::visitEnd (S_msrSegment& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentVoiceClone-> - handleSegmentCloneEndInVoiceClone ( - inputLineNumber, - fCurrentSegmentClone); - - // forget current segment clone - fCurrentSegmentClone = nullptr; -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrHarmony& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrHarmony '" << - elt->asString () << - ", fOnGoingNonGraceNote: " << booleanAsString (fOnGoingNonGraceNote) << - ", fOnGoingChord: " << booleanAsString (fOnGoingChord) << - ", fOnGoingHarmonyVoice: " << booleanAsString (fOnGoingHarmonyVoice) << - "', line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a harmony new born clone - fCurrentHarmonyClone = - elt-> - createHarmonyNewbornClone ( - fCurrentVoiceClone); - - if (fOnGoingNonGraceNote) { - // register the harmony in the current non-grace note clone - fCurrentNonGraceNoteClone-> - appendNoteToNoteHarmoniesList ( - fCurrentHarmonyClone); - - // don't append the harmony to the part harmony, - // this has been done in pass2b // JMI ??? - } - - else if (fOnGoingChord) { - // register the harmony in the current chord clone - fCurrentChordClone-> - appendHarmonyToChord (fCurrentHarmonyClone); // JMI - } - - else if (fOnGoingHarmonyVoice) { - /* JMI - // get the harmony whole notes offset - rational - harmonyWholeNotesOffset = - elt->getHarmonyWholeNotesOffset (); - - // is harmonyWholeNotesOffset not equal to 0? - if (harmonyWholeNotesOffset.getNumerator () != 0) { - // create skip with duration harmonyWholeNotesOffset - S_msrNote - skip = - msrNote::createSkipNote ( - elt-> getInputLineNumber (), - "666", // JMI elt-> getHarmonyMeasureNumber (), - elt-> getHarmonyDisplayWholeNotes (), // would be 0/1 otherwise JMI - elt-> getHarmonyDisplayWholeNotes (), - 0, // JMI elt-> getHarmonyDotsNumber (), - fCurrentVoiceClone-> getRegularVoiceStaffSequentialNumber (), // JMI - fCurrentVoiceClone-> getVoiceNumber ()); - - // append it to the current voice clone - // to 'push' the harmony aside - fCurrentVoiceClone-> - appendNoteToVoice (skip); - } -*/ - - // append the harmony to the current voice clone - fCurrentVoiceClone-> - appendHarmonyToVoiceClone ( - fCurrentHarmonyClone); - } - - else { - stringstream s; - - s << - "harmony '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitStart (S_msrHarmonyDegree& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting S_msrHarmonyDegree '" << - elt->asString () << - ", fOnGoingNonGraceNote: " << booleanAsString (fOnGoingNonGraceNote) << - ", fOnGoingChord: " << booleanAsString (fOnGoingChord) << - ", fOnGoingHarmonyVoice: " << booleanAsString (fOnGoingHarmonyVoice) << - "', line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the harmony degree to the current harmony clone - fCurrentHarmonyClone-> - appendHarmonyDegreeToHarmony ( - elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrHarmony& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrHarmony '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentHarmonyClone = nullptr; -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrFrame& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFrame '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - // register the frame in the current non-grace note clone - fCurrentNonGraceNoteClone-> - setNoteFrame (elt); - } - - else { - stringstream s; - - s << - "frame '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrFiguredBass& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", fOnGoingFiguredBassVoice = " << booleanAsString (fOnGoingFiguredBassVoice) << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a figured bass new born clone - fCurrentFiguredBassClone = - elt-> - createFiguredBassNewbornClone ( - fCurrentVoiceClone); - - if (fOnGoingNonGraceNote) { - // register the figured bass in the current non-grace note clone - fCurrentNonGraceNoteClone-> - setNoteFiguredBass (fCurrentFiguredBassClone); - - // don't append the figured bass to the part figured bass, - // this will be done below - } - - /* JMI - else if (fOnGoingChord) { - // register the figured bass in the current chord clone - fCurrentChordClone-> - setChordFiguredBass (fCurrentFiguredBassClone); // JMI - } - */ - - else if (fOnGoingFiguredBassVoice) { // JMI - /* - // register the figured bass in the part clone figured bass - fCurrentPartClone-> - appendFiguredBassToPartClone ( - fCurrentVoiceClone, - fCurrentFiguredBassClone); - */ - // append the figured bass to the current voice clone - fCurrentVoiceClone-> - appendFiguredBassToVoiceClone ( - fCurrentFiguredBassClone); - } - - else { - stringstream s; - - s << - "figured bass '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitStart (S_msrFigure& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFigure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the figure to the current figured bass - fCurrentFiguredBassClone-> - appendFigureToFiguredBass ( - elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrFiguredBass& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFiguredBassClone = nullptr; -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrMeasure& elt) -{ - int - inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - - int - measurePuristNumber = - elt->getMeasurePuristNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasure '" << - measureNumber << - "', measurePuristNumber = '" << - measurePuristNumber << - "', line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - // create a clone of the measure - fCurrentMeasureClone = - elt-> - createMeasureNewbornClone ( - fCurrentSegmentClone); -/* JMI - // is this a full measures rest? - if (elt->getMeasureIsAFullMeasureRest ()) { - // yes - - // should we compress full measures rests? - if (gLilypondOah->fCompressFullMeasureRests) { - // yes - - if (! fCurrentRestMeasure) { - // this is the first full measure rest in the sequence - - // create a rest measures containing fCurrentMeasureClone - fCurrentRestMeasures = - msrRestMeasures::create ( - inputLineNumber, - fCurrentMeasureClone, - fCurrentVoiceClone); - -/ * JMI - // append the current rest measures to the current voice clone - fCurrentVoiceClone-> - appendRestMeasuresToVoice ( - inputLineNumber, - fCurrentRestMeasures); - * / - } - - else { - // this is a subsequent full measure rest, merely append it - fCurrentRestMeasures-> - appendMeasureCloneToRestMeasures ( - fCurrentMeasureClone); - } - - fCurrentRestMeasure = fCurrentMeasureClone; - } - - else { - // no - - // append current measure clone to the current voice clone - fCurrentVoiceClone-> - appendMeasureCloneToVoiceClone ( - inputLineNumber, - fCurrentMeasureClone); - } - } - - else { - // no - - // append current measure clone to the current voice clone - fCurrentVoiceClone-> - appendMeasureCloneToVoiceClone ( - inputLineNumber, - fCurrentMeasureClone); - } - */ - - // append current measure clone to the current voice clone - fCurrentVoiceClone-> - appendMeasureCloneToVoiceClone ( - inputLineNumber, - fCurrentMeasureClone); - - // JMI superflous??? - fCurrentPartClone-> - setPartCurrentMeasureNumber ( - measureNumber); - - // should the last bar check's measure purist number be set? - if (fLastBarCheck) { - fLastBarCheck-> - setNextBarPuristNumber ( - measurePuristNumber); - - fLastBarCheck = nullptr; - } -} - -void msr2LpsrTranslator::visitEnd (S_msrMeasure& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - - string - nextMeasureNumber = - elt->getNextMeasureNumber (); - - int - measurePuristNumber = - elt->getMeasurePuristNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasure '" << - measureNumber << - "', nextMeasureNumber = '" << - nextMeasureNumber << - "', measurePuristNumber = '" << - measurePuristNumber << - "', line " << inputLineNumber << - endl; - } -#endif - - fCurrentMeasureClone-> - finalizeMeasureClone ( - inputLineNumber, - elt, // original measure - fCurrentVoiceClone); - - bool doCreateABarCheck = false; - - switch (elt->getMeasureKind ()) { - case msrMeasure::kMeasureKindUnknown: - { - stringstream s; - - s << - "measure '" << measureNumber << - "' in voice \"" << - elt-> - fetchMeasureVoiceUpLink ()-> - getVoiceName () << - "\" is of unknown kind"; - - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - break; - - case msrMeasure::kMeasureKindRegular: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindAnacrusis: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindIncompleteStandalone: - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: - // generate a bar check if relevant - switch (elt-> getMeasureEndRegularKind ()) { - case msrMeasure::kMeasureEndRegularKindUnknown: - break; - case msrMeasure::kMeasureEndRegularKindYes: - doCreateABarCheck = true; - break; - case msrMeasure::kMeasureEndRegularKindNo: - break; - } // switch - break; - - case msrMeasure::kMeasureKindOvercomplete: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindCadenza: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindMusicallyEmpty: - // JMI - break; - } // switch - - // is this a full measures rest? - if (elt->getMeasureIsAFullMeasureRest ()) { - // yes JMI - } - - else { - // no - - // should we compress full measures rests? - if (gLilypondOah->fCompressFullMeasureRests) { - // yes - - if (fCurrentRestMeasures) { - // append the current rest measures to the current voice clone - fCurrentVoiceClone-> - appendRestMeasuresToVoice ( - inputLineNumber, - fCurrentRestMeasures); - - // forget about the current rest measure - fCurrentRestMeasure = nullptr; - - // forget about the current rest measures - fCurrentRestMeasures = nullptr; - } - - else { - stringstream s; - - s << - "fCurrentRestMeasures is null upon full measure rest end" << - measureNumber << - "', measurePuristNumber = '" << - measurePuristNumber << - "', line " << inputLineNumber; - -/* JMI ??? - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - } - } - - if (doCreateABarCheck) { - // create a bar check - int voiceCurrentMeasurePuristNumber = - fCurrentVoiceClone-> - getVoiceCurrentMeasurePuristNumber (); - - fLastBarCheck = - msrBarCheck::createWithNextBarPuristNumber ( - inputLineNumber, - nextMeasureNumber, - voiceCurrentMeasurePuristNumber); - - // append it to the current voice clone - fCurrentVoiceClone-> - appendBarCheckToVoice (fLastBarCheck); - - // create a bar number check - // should NOT be done in cadenza, SEE TO IT JMI - S_msrBarNumberCheck - barNumberCheck_ = - msrBarNumberCheck::create ( - inputLineNumber, - nextMeasureNumber, - voiceCurrentMeasurePuristNumber); - - // append it to the current voice clone - fCurrentVoiceClone-> - appendBarNumberCheckToVoice (barNumberCheck_); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrStanza& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStanza \"" << - elt->getStanzaName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - -// if (elt->getStanzaTextPresent ()) { // JMI - fCurrentStanzaClone = - elt->createStanzaNewbornClone ( - fCurrentVoiceClone); - - // append the stanza clone to the LPSR score elements list - fLpsrScore -> - appendStanzaToScoreElementsList ( - fCurrentStanzaClone); - - // append a use of the stanza to the current staff block - fCurrentStaffBlock -> - appendLyricsUseToStaffBlock ( - fCurrentStanzaClone); -// } -// else - // fCurrentStanzaClone = 0; // JMI - - fOnGoingStanza = true; -} - -void msr2LpsrTranslator::visitEnd (S_msrStanza& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrStanza \"" << - elt->getStanzaName () << - "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // forget about this stanza - fCurrentStanzaClone = nullptr; - - fOnGoingStanza = false; -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSyllable& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSyllable" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the syllable clone - fCurrentSyllableClone = - elt->createSyllableNewbornClone ( - fCurrentPartClone); - - // add it to the current stanza clone or current note clone - if (fOnGoingStanza) { // fCurrentStanzaClone JM - // visiting a syllable as a stanza member - fCurrentStanzaClone-> - appendSyllableToStanza ( - fCurrentSyllableClone); - } - - else if (fOnGoingNonGraceNote) { // JMI - // visiting a syllable as attached to the current non-grace note - fCurrentSyllableClone-> - appendSyllableToNoteAndSetItsNoteUpLink ( - fCurrentNonGraceNoteClone); - - if (gLpsrOah->fAddWordsFromTheLyrics) { - // get the syllable texts list - const list& - syllableTextsList = - elt->getSyllableTextsList (); - - if (syllableTextsList.size ()) { - // build a single words value from the texts list - // JMI create an msrWords instance for each??? - string wordsValue = - elt->syllableTextsListAsString(); - - // create the words -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "Changing lyrics '" << - wordsValue << - "' into words for note '" << - fCurrentNonGraceNoteClone->asShortString () << - "'" << - // JMI fCurrentSyllableClone->asString () << - endl; - } -#endif - - S_msrWords - words = - msrWords::create ( - inputLineNumber, - kPlacementNone, // default value - wordsValue, - kJustifyNone, // default value - kHorizontalAlignmentNone, // default value - kVerticalAlignmentNone, // default value - kFontStyleNone, // default value - msrFontSize::create ( - msrFontSize::kFontSizeNone), // default value - kFontWeightNone, // default value - kXMLLangIt); // default value - - // append it to the current non-grace note -#ifdef TRACE_OAH - if (gTraceOah->fTraceWords) { - fLogOutputStream << - "Appending words '" << - words->asShortString () << - "' to note '" << - fCurrentNonGraceNoteClone->asShortString () << - "'" << - endl; - } -#endif - fCurrentNonGraceNoteClone-> - appendWordsToNote ( - words); - } - } - } - else { - stringstream s; - - s << - "syllable '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - // a syllable ends the sysllable extend range if any - if (fOnGoingSyllableExtend) { - /* JMI ??? - // create melisma end command - S_lpsrMelismaCommand - melismaCommand = - lpsrMelismaCommand::create ( - inputLineNumber, - lpsrMelismaCommand::kMelismaEnd); - - // append it to current voice clone - fCurrentVoiceClone-> - appendOtherElementToVoice (melismaCommand); -*/ - - fOnGoingSyllableExtend = false; - } -} - -void msr2LpsrTranslator::visitEnd (S_msrSyllable& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSyllable" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrClef& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrClef" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendClefToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrClef& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrClef" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrKey& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrKey" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendKeyToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrKey& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrKey" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTime& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTime" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append time to voice clone - fCurrentVoiceClone-> - appendTimeToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrTime& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTime" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTranspose& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTranspose" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append transpose to voice clone - fCurrentVoiceClone-> - appendTransposeToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrTranspose& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTranspose" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrPartNameDisplay& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPartNameDisplay" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append part name display to voice clone - fCurrentVoiceClone-> - appendPartNameDisplayToVoice (elt); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrPartAbbreviationDisplay& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPartAbbreviationDisplay" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append part abbreviation display to voice clone - fCurrentVoiceClone-> - appendPartAbbreviationDisplayToVoice (elt); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTempo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (elt->getTempoKind ()) { - case msrTempo::k_NoTempoKind: - break; - - case msrTempo::kTempoBeatUnitsWordsOnly: - break; - - case msrTempo::kTempoBeatUnitsPerMinute: - break; - - case msrTempo::kTempoBeatUnitsEquivalence: - break; - - case msrTempo::kTempoNotesRelationShip: - fLpsrScore-> - // this score needs the 'tempo relationship' Scheme function - setTempoRelationshipSchemeFunctionIsNeeded (); - break; - } // switch - - if (gLpsrOah->fConvertTemposToRehearsalMarks) { - // create a rehearsal mark containing elt's words - - S_msrRehearsal - rehearsal = - msrRehearsal::create ( - elt->getInputLineNumber (), - msrRehearsal::kNone, - elt->tempoWordsListAsString (" "), //JMI ??? - elt->getTempoPlacementKind ()); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "Converting tempos '" << - elt->asShortString () << - "' to rehearsal mark '" << - rehearsal->asShortString () << - "'" << - endl; - } -#endif - - // append the rehearsal to the current voice clone - fCurrentVoiceClone-> - appendRehearsalToVoice (rehearsal); - } - - else { - fCurrentVoiceClone-> - appendTempoToVoice (elt); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrTempo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendRehearsalToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrArticulation& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrArticulation" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } - else { - stringstream s; - - s << - "articulation '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrArticulation& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrArticulation" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrFermata& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFermata" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // a fermata is an articulation - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } - else { - stringstream s; - - s << - "fermata '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // an arpeggiato is an articulation - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); // addArpeggiatoToNote ??? JMI - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } - else { - stringstream s; - - s << - "arpeggiato '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrNonArpeggiato& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrNonArpeggiato" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // an nonArpeggiato is an articulation - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); // addArpeggiatoToNote ??? JMI - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } - else { - stringstream s; - - s << - "nonArpeggiato '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTechnical& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalToChord (elt); - } - else { - stringstream s; - - s << - "technical '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - // doest the score need the 'tongue' function? - switch (elt->getTechnicalKind ()) { - case msrTechnical::kArrow: - break; - case msrTechnical::kDoubleTongue: - fLpsrScore-> - // this score needs the 'tongue' Scheme function - setTongueSchemeFunctionIsNeeded (); - break; - case msrTechnical::kDownBow: - break; - case msrTechnical::kFingernails: - break; - case msrTechnical::kHarmonic: - break; - case msrTechnical::kHeel: - break; - case msrTechnical::kHole: - break; - case msrTechnical::kOpenString: - break; - case msrTechnical::kSnapPizzicato: - break; - case msrTechnical::kStopped: - break; - case msrTechnical::kTap: - break; - case msrTechnical::kThumbPosition: - break; - case msrTechnical::kToe: - break; - case msrTechnical::kTripleTongue: - fLpsrScore-> - // this score needs the 'tongue' Scheme function - setTongueSchemeFunctionIsNeeded (); - break; - case msrTechnical::kUpBow: - break; - } // switch -} - -void msr2LpsrTranslator::visitEnd (S_msrTechnical& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTechnicalWithInteger& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnicalWithInteger" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalWithIntegerToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalWithIntegerToChord (elt); - } - else { - stringstream s; - - s << - "technicalWithInteger '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrTechnicalWithInteger& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnicalWithInteger" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTechnicalWithFloat& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnicalWithFloat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalWithFloatToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalWithFloatToChord (elt); - } - else { - stringstream s; - - s << - "technicalWithFloat '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrTechnicalWithFloat& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnicalWithFloat" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTechnicalWithString& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTechnicalWithString" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendTechnicalWithStringToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTechnicalWithStringToChord (elt); - } - else { - stringstream s; - - s << - "technicalWithString '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - switch (elt->getTechnicalWithStringKind ()) { - case msrTechnicalWithString::kHammerOn: - case msrTechnicalWithString::kPullOff: - // this score needs the 'after' Scheme function - fLpsrScore-> - setAfterSchemeFunctionIsNeeded (); - break; - default: - ; - } // switch -} - -void msr2LpsrTranslator::visitEnd (S_msrTechnicalWithString& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTechnicalWithString" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrOrnament& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrOrnament" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendOrnamentToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendOrnamentToChord (elt); - } - else { - stringstream s; - - s << - "ornament '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrOrnament& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrOrnament" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSpanner& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSpanner" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (elt->getSpannerTypeKind ()) { - case kSpannerTypeStart: - break; - case kSpannerTypeStop: - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - break; - } // switch - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendSpannerToNote (elt); - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSpannerToChord (elt); - } - else { - stringstream s; - - s << - "spanner '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrSpanner& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSpanner" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrGlissando& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrGlissando" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendGlissandoToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendGlissandoToChord (elt); - } - else { - stringstream s; - - s << - "glissando '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - if (elt->getGlissandoTextValue ().size ()) { - fLpsrScore-> - // this score needs the 'glissandoWithText' Scheme functions - addGlissandoWithTextSchemeFunctionsToScore (); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrGlissando& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrGlissando" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSlide& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSlide" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendSlideToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSlideToChord (elt); - } - else { - stringstream s; - - s << - "slide '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrSlide& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSlide" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSingleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - setNoteSingleTremolo (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - setChordSingleTremolo (elt); - } - else { - stringstream s; - - s << - "singleTremolo '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrSingleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrDoubleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrDoubleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a double tremolo clone from the two elements - fCurrentDoubleTremoloClone = elt; // JMI FIX THAT -/* JMI - elt->createDoubleTremoloNewbornClone ( - elt->getDoubleTremoloFirstElement ()-> - createNewBornClone (), - elt->getDoubleTremoloSecondElement () - createNewBornClone ()); - */ - - fOnGoingDoubleTremolo = true; -} - -void msr2LpsrTranslator::visitEnd (S_msrDoubleTremolo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSingleTremolo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the current double tremolo clone to the current voice clone - fCurrentVoiceClone-> - appendDoubleTremoloToVoice ( - fCurrentDoubleTremoloClone); - - // forget about it - fCurrentDoubleTremoloClone = nullptr; - - fOnGoingDoubleTremolo = false; -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendDynamicsToNote (elt); - - // is this a non LilyPond native dynamics? - bool knownToLilyPondNatively = true; - - switch (elt->getDynamicsKind ()) { - case msrDynamics::kFFFFF: - case msrDynamics::kFFFFFF: - case msrDynamics::kPPPPP: - case msrDynamics::kPPPPPP: - case msrDynamics::kRF: - case msrDynamics::kSFPP: - case msrDynamics::kSFFZ: - case msrDynamics::k_NoDynamics: - knownToLilyPondNatively = false; - - default: - ; - } // switch - - if (! knownToLilyPondNatively) { - // this score needs the 'dynamics' Scheme function - fLpsrScore-> - setDynamicsSchemeFunctionIsNeeded (); - } - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendDynamicsToChord (elt); - } - - else { - stringstream s; - - s << - "dynamics '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrOtherDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrOtherDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendOtherDynamicsToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendOtherDynamicsToChord (elt); - } - else { - stringstream s; - - s << - "otherDynamics '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - fLpsrScore-> - // this score needs the 'otherDynamic' Scheme function - setOtherDynamicSchemeFunctionIsNeeded (); -} - -void msr2LpsrTranslator::visitEnd (S_msrOtherDynamics& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrOtherDynamics" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrWords& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrWords" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (gLpsrOah->fConvertWordsToTempo) { - // create a tempo containing elt - S_msrTempo - tempo = - msrTempo::create ( - inputLineNumber, - elt); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWords) { - fLogOutputStream << - "Converting words '" << - elt->asShortString () << - "' to tempo '" << - tempo->asShortString () << - "'" << - endl; - } -#endif - - // append the tempo to the current voice clone - fCurrentVoiceClone-> - appendTempoToVoice (tempo); - } - - else if (gLpsrOah->fConvertWordsToRehearsalMarks) { - // create a rehearsal mark containing elt's words - - S_msrRehearsal - rehearsal = - msrRehearsal::create ( - inputLineNumber, - msrRehearsal::kNone, - elt->getWordsContents (), - elt->getWordsPlacementKind ()); // above ??? JMI - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWords) { - fLogOutputStream << - "Converting words '" << - elt->asShortString () << - "' to rehearsal mark '" << - rehearsal->asShortString () << - "'" << - endl; - } -#endif - - // append the rehearsal to the current voice clone - fCurrentVoiceClone-> - appendRehearsalToVoice (rehearsal); - } - - else if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendWordsToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendWordsToChord (elt); - } - else { - stringstream s; - - s << - "words '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrWords& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrWords" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSlur& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSlur" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - /* - Only the first note of the chord should get the slur notation. - Some applications print out the slur for all notes, - i.e. a stop and a start in sequence: - these should be ignored - */ - - if (fOnGoingNonGraceNote) { - // don't add slurs to chord member notes except the first one - switch (fCurrentNonGraceNoteClone->getNoteKind ()) { - case msrNote::kChordMemberNote: - if (fCurrentNonGraceNoteClone->getNoteIsAChordsFirstMemberNote ()) { - fCurrentNonGraceNoteClone-> - appendSlurToNote (elt); - } - break; - - default: - fCurrentNonGraceNoteClone-> - appendSlurToNote (elt); - } // switch - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSlurToChord (elt); - } - - else { - displayCurrentOnGoingValues (); - - stringstream s; - - s << - "slur '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrSlur& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSlur" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrLigature& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrLigature" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendLigatureToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendLigatureToChord (elt); - } - else { - stringstream s; - - s << - "ligature '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrLigature& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrLigature" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSlash& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSlash" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendSlashToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSlashToChord (elt); - } - else { - stringstream s; - - s << - "slash '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrWedge& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrWedge" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendWedgeToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendWedgeToChord (elt); - } - else { - stringstream s; - - s << - "wedge '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrWedge& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrWedge" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrGraceNotesGroup& elt) -{ - int inputLineNumber = - elt->getInputLineNumber () ; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrGraceNotesGroup" << - ", line " << inputLineNumber << - endl; - } -#endif - - bool doCreateAGraceNoteClone = true; // JMI - - if (doCreateAGraceNoteClone) { - // create a clone of this graceNotesGroup -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Creating a clone of grace notes group '" << - elt->asShortString () << - "' and attaching it to clone note '" << - fCurrentNonGraceNoteClone->asShortString () << - "'" << - endl; - } -#endif - - fCurrentGraceNotesGroupClone = - elt-> - createGraceNotesGroupNewbornClone ( - fCurrentVoiceClone); - - // attach it to the current note clone - // if (fOnGoingNonGraceNote) { JMI - // { // JMI - - switch (elt->getGraceNotesGroupKind ()) { - case msrGraceNotesGroup::kGraceNotesGroupBefore: - fCurrentNonGraceNoteClone-> - setNoteGraceNotesGroupBefore ( - fCurrentGraceNotesGroupClone); - break; - case msrGraceNotesGroup::kGraceNotesGroupAfter: - fCurrentNonGraceNoteClone-> - setNoteGraceNotesGroupAfter ( - fCurrentGraceNotesGroupClone); - break; - } // switch - // } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "+++++++++++++++++++++++++ 1" << - endl << - "fCurrentNonGraceNoteClone:"; - - if (fCurrentNonGraceNoteClone) { - fLogOutputStream << - fCurrentNonGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr"; - } - fLogOutputStream << endl; - } -#endif - - // get the note this grace notes group is attached to - S_msrNote - noteNotesGroupIsAttachedTo = - elt-> - getGraceNotesGroupNoteUpLink (); - - if (! noteNotesGroupIsAttachedTo) { - stringstream s; - - s << - "grace notes group '" << elt->asShortString () << - "' has an empty note upLink"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fOnGoingGraceNotesGroup = true; - - // is noteNotesGroupIsAttachedTo the first one in its voice? -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "The noteNotesGroupIsAttachedTo voice clone PEOJIOFEIOJEF '" << - fCurrentVoiceClone->getVoiceName () << - "' is '"; - - if (noteNotesGroupIsAttachedTo) { - fLogOutputStream << - noteNotesGroupIsAttachedTo->asShortString (); - } - else { - fLogOutputStream << - "none"; - } - fLogOutputStream << - "'" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "The first note of voice clone KLJWLPOEF '" << - fCurrentVoiceClone->getVoiceName () << - "' is '"; - - if (fFirstNoteCloneInVoice) { - fLogOutputStream << - fFirstNoteCloneInVoice->asShortString (); - } - else { - fLogOutputStream << - "none"; - } - fLogOutputStream << - "'" << - endl; - } -#endif - - // fetch the original voice first non grace note - S_msrNote - originalVoiceFirstNonGraceNote = - fCurrentVoiceOriginal-> - fetchVoiceFirstNonGraceNote (); - - if (originalVoiceFirstNonGraceNote) { - if (noteNotesGroupIsAttachedTo == originalVoiceFirstNonGraceNote) { - // bug 34 in LilyPond should be worked around by creating - // skip grace notes in the other voices of the part - - // create the skip grace notes group -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Creating a skip clone of grace notes group '" << - elt->asShortString () << - "' to work around LilyPond issue 34" << - endl; - } -#endif - - fCurrentSkipGraceNotesGroup = - elt-> - createSkipGraceNotesGroupClone ( - fCurrentVoiceClone); - } - } - - // addSkipGraceNotesGroupBeforeAheadOfVoicesClonesIfNeeded() will - // append the same skip grace notes to the ofhter voices if needed - // in visitEnd (S_msrPart&) -} - - /* JMI - if (fFirstNoteCloneInVoice) { - // there is at least a note before these grace notes in the voice - - if ( - fCurrentNonGraceNoteClone->getNoteTrillOrnament () - && - fCurrentNonGraceNoteClone->getNoteIsFollowedByGraceNotesGroup ()) { - // fPendingAfterGraceNotesGroup already contains - // the afterGraceNotesGroup to use - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Optimising grace notes '" << - elt->asShortString () << - "' into after grace notes" << - endl; - } -#endif - - // attach the current after grace notes clone to the current note clone - if (fOnGoingNonGraceNote) { // JMI - fCurrentNonGraceNoteClone-> - setNoteAfterGraceNotesGroup ( - fPendingAfterGraceNotesGroup); - } - - doCreateAGraceNoteClone = false; - } - } - - if (doCreateAGraceNoteClone) { - // are these grace notes the last element in a measure? - if (elt->getGraceNotesGroupIsFollowedByNotes ()) { - // yes, this is a regular grace notes - - // create a clone of this graceNotesGroup - fCurrentGraceNotesGroupClone = - elt-> - createGraceNotesGroupNewbornClone ( - fCurrentVoiceClone); - - // attach it to the current note clone - if (fOnGoingNonGraceNote) { // JMI - fCurrentNonGraceNoteClone-> - setNoteGraceNotesGroup ( - fCurrentGraceNotesGroupClone); - } - - // JMI XXL find good criterion for this - - // these grace notes are at the beginning of a segment JMI - // doCreateAGraceNoteClone = true; // JMI - - // bug 34 in LilyPond should be worked aroud by creating - // skip grace notes in the other voices of the part - - // create skip graceNotesGroup clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Creating a skip clone of grace notes '" << - elt->asShortString () << - "' to work around LilyPond issue 34" << - endl; - } -#endif - - S_msrGraceNotesGroup - skipGraceNotesGroup = - elt-> - createSkipGraceNotesGroupClone ( - fCurrentVoiceClone); - - // prepend it to the other voices in the part - fCurrentPartClone-> - prependSkipGraceNotesGroupToVoicesClones ( - fCurrentVoiceClone, - skipGraceNotesGroup); - } - - else { - // no, we should build an msrAfterGraceNotesGroup from this - // and the last element in the current voice clone - - // fetch the voice last element - fCurrentAfterGraceNotesGroupElement = - fCurrentVoiceClone-> - fetchVoiceLastElement (inputLineNumber); - - // create the after grace notes -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Converting grace notes '" << - elt->asShortString () << - "' into after grace notes attached to:"<< - endl; - - gIndenter++; - - fCurrentAfterGraceNotesGroupElement-> - print (fLogOutputStream); - - gIndenter--; - } -#endif - - fPendingAfterGraceNotesGroup = - msrAfterGraceNotesGroup::create ( - inputLineNumber, - fCurrentAfterGraceNotesGroupElement, - elt->getGraceNotesGroupIsSlashed (), - fCurrentVoiceClone); - - // append it to the current note clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Appending the after grace notes to current note clone" << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { // JMI - fCurrentNonGraceNoteClone-> - setNoteAfterGraceNotesGroup ( - fPendingAfterGraceNotesGroup); - } - } - } -*/ - - -void msr2LpsrTranslator::visitEnd (S_msrGraceNotesGroup& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrGraceNotesGroup" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "+++++++++++++++++++++++++ 2" << - endl << - "fCurrentNonGraceNoteClone:"; - - if (fCurrentNonGraceNoteClone) { - fLogOutputStream << - fCurrentNonGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr"; - } - fLogOutputStream << endl; - } -#endif - - // forget about these grace notes - fCurrentGraceNotesGroupClone = nullptr; - - fOnGoingGraceNotesGroup = false; - -/* JMI - if (fPendingAfterGraceNotesGroup) { - // remove the current afterGraceNotesGroup note clone - // from the current voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotesGroup) { - fLogOutputStream << - "Removing the after grace notes element from the current voice clone" << - endl; - } -#endif - - fCurrentVoiceClone-> - removeElementFromVoice ( - inputLineNumber, - fCurrentAfterGraceNotesGroupElement); - - // forget about the current after grace notes element - fCurrentAfterGraceNotesGroupElement = nullptr; - - // forget about these after the pending grace notes - fPendingAfterGraceNotesGroup = nullptr; - } - */ -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrNote& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrNote '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the note clone - S_msrNote - noteClone = - elt->createNoteNewbornClone ( - fCurrentPartClone); - - // register clone in this tranlastors' voice notes map - fVoiceNotesMap [elt] = noteClone; // JMI XXL - - // don't register grace notes as the current note clone, - // but as the current grace note clone instead -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "The first note of voice clone GFFF '" << - fCurrentVoiceClone->getVoiceName () << - "' is '"; - - if (fFirstNoteCloneInVoice) { - fLogOutputStream << - fFirstNoteCloneInVoice->asShortString () const; - } - else { - fLogOutputStream << - "none"; - } - fLogOutputStream << - "'" << - endl; - } -#endif -*/ - - switch (elt->getNoteKind ()) { - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - case msrNote::kGraceTupletMemberNote: - fCurrentGraceNoteClone = noteClone; - break; - - default: - fCurrentNonGraceNoteClone = noteClone; - - if (! fFirstNoteCloneInVoice) { - fFirstNoteCloneInVoice = - fCurrentNonGraceNoteClone; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "The first note of voice clone RJIRWR '" << - fCurrentVoiceClone->getVoiceName () << - "' is '" << - fFirstNoteCloneInVoice->asShortString () << - "'" << - endl; - } -#endif - } - - fOnGoingNonGraceNote = true; - } // switch - -/* JMI - // can we optimize graceNotesGroup into afterGraceNotesGroup? - if ( - elt->getNoteIsFollowedByGraceNotesGroup () - && - elt->getNoteTrillOrnament ()) { - // yes, create the after grace notes -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesGroup) { - fLogOutputStream << - "Optimizing grace notes on trilled note '" << - elt->asShortString () << - "' as after grace notes " << - ", line " << inputLineNumber << - endl; - } -#endif - - fPendingAfterGraceNotesGroup = - msrAfterGraceNotesGroup::create ( - inputLineNumber, - fCurrentNonGraceNoteClone, - false, // aftergracenoteIsSlashed, may be updated later - fCurrentVoiceClone); - - // register current afterGraceNotesGroup element - fCurrentAfterGraceNotesGroupElement = - fCurrentNonGraceNoteClone; - } -*/ -} - -void msr2LpsrTranslator::visitEnd (S_msrNote& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - msrNote::msrNoteKind - noteKind = elt->getNoteKind (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrNote " << - elt->asString () << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "FAA fCurrentNonGraceNoteClone = " << - endl; - if (fCurrentNonGraceNoteClone) { - fLogOutputStream << - fCurrentNonGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr" << - endl; - } - - fLogOutputStream << - "FAA fCurrentGraceNoteClone = " << - endl; - if (fCurrentGraceNoteClone) { - fLogOutputStream << - fCurrentGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr" << - endl; - } - } -#endif - - switch (noteKind) { - - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending rest note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kSkipNote: // JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending skip note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kUnpitchedNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending unpitched note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kStandaloneNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending standalone note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kDoubleTremoloMemberNote: - if (fOnGoingDoubleTremolo) { - - if (fCurrentNonGraceNoteClone->getNoteIsFirstNoteInADoubleTremolo ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Setting note '" << - fCurrentNonGraceNoteClone->asString () << - "', line " << fCurrentNonGraceNoteClone->getInputLineNumber () << - ", as double tremolo first element" << - " in voice \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentDoubleTremoloClone-> - setDoubleTremoloNoteFirstElement ( - fCurrentNonGraceNoteClone); - } - - else if (fCurrentNonGraceNoteClone->getNoteIsSecondNoteInADoubleTremolo ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Setting note '" << - fCurrentNonGraceNoteClone->asString () << - "', line " << fCurrentNonGraceNoteClone->getInputLineNumber () << - ", as double tremolo second element" << - " in voice \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentDoubleTremoloClone-> - setDoubleTremoloNoteSecondElement ( - fCurrentNonGraceNoteClone); - } - - else { - stringstream s; - - s << - "note '" << fCurrentNonGraceNoteClone->asShortString () << - "' belongs to a double tremolo, but is not marked as such"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else { - stringstream s; - - s << - "double tremolo note '" << fCurrentNonGraceNoteClone->asShortString () << - "' found outside of a double tremolo"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kGraceNote: - /* JMI - fLogOutputStream << - "fOnGoingGraceNotesGroup = " << - booleanAsString ( - fOnGoingGraceNotesGroup) << - endl; - */ - - if (! fOnGoingGraceNotesGroup) { - stringstream s; - - s << - "grace note '" << fCurrentNonGraceNoteClone->asShortString () << - "' found outside of grace notes"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Appending grace note '" << - fCurrentGraceNoteClone->asShortString () << - "' to the grace notes group'" << - fCurrentGraceNotesGroupClone->asShortString () << - "' in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - fCurrentGraceNotesGroupClone-> - appendNoteToGraceNotesGroup ( - fCurrentGraceNoteClone); - } - - /* JMI ??? - if (fCurrentGraceNotesGroupClone) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Appending note '" << - fCurrentNonGraceNoteClone->asShortString () << - "' to the grace notes in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - fCurrentGraceNotesClone-> - appendNoteToGraceNotes ( - fCurrentNonGraceNoteClone); - } - - else if (fPendingAfterGraceNotes) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Appending note '" << - fCurrentNonGraceNoteClone->asShortString () << - "' to the after grace notes in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - fPendingAfterGraceNotes-> - appendNoteToAfterGraceNotesContents ( - fCurrentNonGraceNoteClone); - } - - else { - stringstream s; - - s << - "both fCurrentGraceNoteGroupsClone and fPendingAfterGraceNoteGroup are null," << - endl << - "cannot handle grace note'" << - elt->asString () << - "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - */ - break; - - case msrNote::kChordMemberNote: - if (fOnGoingChord) { - fCurrentChordClone-> - addAnotherNoteToChord ( - fCurrentNonGraceNoteClone, - fCurrentVoiceClone); - } - - else { - stringstream s; - - s << - "msr2LpsrTranslator:::visitEnd (S_msrNote& elt): chord member note " << - elt->asString () << - " appears outside of a chord"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kGraceChordMemberNote: - if (fOnGoingChord) { - fCurrentChordClone-> - addAnotherNoteToChord ( - fCurrentGraceNoteClone, - fCurrentVoiceClone); - } - - else { - stringstream s; - - s << - "msr2LpsrTranslator:::visitEnd (S_msrNote& elt): chord member note " << - elt->asString () << - " appears outside of a chord"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "'' to voice clone " << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fTupletClonesStack.top ()-> - addNoteToTuplet ( - fCurrentNonGraceNoteClone, - fCurrentVoiceClone); - break; - } // switch - - // handle editorial accidentals - switch (fCurrentNonGraceNoteClone->getNoteEditorialAccidentalKind ()) { - case msrNote::kNoteEditorialAccidentalYes: - fLpsrScore-> - // this score needs the 'editorial accidental' Scheme function - setEditorialAccidentalSchemeFunctionIsNeeded (); - break; - case msrNote::kNoteEditorialAccidentalNo: - break; - } // switch - - // handle cautionary accidentals - switch (fCurrentNonGraceNoteClone->getNoteCautionaryAccidentalKind ()) { - case msrNote::kNoteCautionaryAccidentalYes: - break; - case msrNote::kNoteCautionaryAccidentalNo: - break; - } // switch - -/* JMI - // handle melisma - msrSyllable::msrSyllableExtendKind - noteSyllableExtendKind = - elt->getNoteSyllableExtendKind (); - - switch (noteSyllableExtendKind) { - case msrSyllable::kStandaloneSyllableExtend: - { - / * JMI ??? - // create melisma start command - S_lpsrMelismaCommand - melismaCommand = - lpsrMelismaCommand::create ( - inputLineNumber, - lpsrMelismaCommand::kMelismaStart); - - // append it to current voice clone - fCurrentVoiceClone-> - appendOtherElementToVoice (melismaCommand); - - // append - * / - - fOnGoingSyllableExtend = true; - } - break; - case msrSyllable::kStartSyllableExtend: - break; - case msrSyllable::kContinueSyllableExtend: - break; - case msrSyllable::kStopSyllableExtend: - break; - case msrSyllable::k_NoSyllableExtend: - break; - } // switch -*/ - - switch (noteKind) { - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - case msrNote::kGraceTupletMemberNote: - break; - - default: - fOnGoingNonGraceNote = false; - } // switch -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrOctaveShift& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrOctaveShift" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingChord) { - fCurrentChordClone-> - setChordOctaveShift (elt); - } - else if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - setNoteOctaveShift (elt); - } - else { - stringstream s; - - s << - "octaveShift '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrOctaveShift& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrOctaveShift" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrAccordionRegistration& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrAccordionRegistration" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the accordion registration to the voice clone - fCurrentVoiceClone-> - appendAccordionRegistrationToVoice (elt); - - // the generated code needs modules scm and accreg - fLpsrScore-> - setScmAndAccregSchemeModulesAreNeeded (); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrHarpPedalsTuning& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrHarpPedalsTuning" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the harp pedals tuning to the voice clone - fCurrentVoiceClone-> - appendHarpPedalsTuningToVoice (elt); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrStem& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrStem" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - setNoteStem (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendStemToChord (elt); - } - else { - stringstream s; - - s << - "stem '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrStem& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrStem" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrBeam& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBeam" << - ", line " << elt->getInputLineNumber () << -// JMI ", fOnGoingNonGraceNote = " << booleanAsString (fOnGoingNonGraceNote) << -// JMI ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - endl; - } -#endif - - // a beam may be present at the same time - // in a note or grace note and the chord the latter belongs to - - if (fOnGoingGraceNotesGroup) { - fCurrentGraceNoteClone-> - appendBeamToNote (elt); - } - else if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - appendBeamToNote (elt); - } - - if (fOnGoingChord) { - fCurrentChordClone-> - appendBeamToChord (elt); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrBeam& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBeam" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrChord& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrChord" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentChordClone = - elt->createChordNewbornClone ( - fCurrentPartClone); - - if (fTupletClonesStack.size ()) { - // a chord in a tuplet is handled as part of the tuplet JMI - fTupletClonesStack.top ()-> - addChordToTuplet ( - fCurrentChordClone); - } - - else if (fOnGoingDoubleTremolo) { - if (elt->getChordIsFirstChordInADoubleTremolo ()) { - // replace double tremolo's first element by chord - fCurrentDoubleTremoloClone-> - setDoubleTremoloChordFirstElement ( - elt); - } - - else if (elt->getChordIsSecondChordInADoubleTremolo ()) { - // replace double tremolo's second element by chord - fCurrentDoubleTremoloClone-> - setDoubleTremoloChordSecondElement ( - elt); - } - - else { - stringstream s; - - s << - "chord '" << elt->asString () << - "' belongs to a double tremolo, but is not marked as such"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else if (fCurrentGraceNotesGroupClone) { - // append the chord to the grace notes - fCurrentGraceNotesGroupClone-> - appendChordToGraceNotesGroup ( - fCurrentChordClone); - } - - else { - // appending the chord to the voice clone at once - fCurrentVoiceClone-> - appendChordToVoice ( - fCurrentChordClone); - } - - fOnGoingChord = true; -} - -void msr2LpsrTranslator::visitEnd (S_msrChord& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrChord" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingChord = false; -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the tuplet clone - S_msrTuplet - tupletClone = - elt->createTupletNewbornClone (); - - // register it in this visitor -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "++> pushing tuplet '" << - tupletClone->asString () << - "' to tuplets stack" << - endl; - } -#endif - - fTupletClonesStack.push (tupletClone); - - switch (elt->getTupletLineShapeKind ()) { - case msrTuplet::kTupletLineShapeStraight: - break; - case msrTuplet::kTupletLineShapeCurved: - fLpsrScore-> - // this score needs the 'tuplets curved brackets' Scheme function - setTupletsCurvedBracketsSchemeFunctionIsNeeded (); - break; - } // switch -} - -void msr2LpsrTranslator::visitEnd (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Popping tuplet '" << - elt->asString () << - "' from tuplets stack" << - endl; - } -#endif - - fTupletClonesStack.pop (); - - if (fTupletClonesStack.size ()) { - // tuplet is a nested tuplet -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Adding nested tuplet '" << - elt->asString () << - "' to stack top tuplet '" << - fTupletClonesStack.top ()->asString () << - "'" << - endl; - } -#endif - - fTupletClonesStack.top ()-> - addTupletToTupletClone (elt); - } - - else { - // tuplet is a top level tuplet - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Adding top level tuplet '" << - elt->asString () << - "' to voice" << - fCurrentVoiceClone->getVoiceName () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendTupletToVoice (elt); - } -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrTie& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTie" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNonGraceNote) { - fCurrentNonGraceNoteClone-> - setNoteTie (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendTieToChord (elt); - } - else { - stringstream s; - - s << - "tie '" << elt->asShortString () << - "' cannot be handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } -} - -void msr2LpsrTranslator::visitEnd (S_msrTie& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTie" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrSegno& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSegno" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendSegnoToVoice (elt); -} - -void msr2LpsrTranslator::visitStart (S_msrCoda& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrCoda" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendCodaToVoice (elt); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrEyeGlasses& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting eyeGlasses" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendEyeGlassesToNote (elt); -} - -void msr2LpsrTranslator::visitStart (S_msrScordatura& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting scordatura" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendScordaturaToNote (elt); -} - -void msr2LpsrTranslator::visitStart (S_msrPedal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting pedal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendPedalToNote (elt); -} - -void msr2LpsrTranslator::visitStart (S_msrDamp& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting damp" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendDampToNote (elt); - - fLpsrScore-> - // this score needs the 'custom short barline' Scheme function - setDampMarkupIsNeeded (); -} - -void msr2LpsrTranslator::visitStart (S_msrDampAll& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting dampAll" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendDampAllToNote (elt); - - fLpsrScore-> - // this score needs the 'custom short barline' Scheme function - setDampAllMarkupIsNeeded (); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarCheck" << - ", nextBarNumber: " << - elt->getNextBarPuristNumber () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendBarCheckToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarNumberCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendBarNumberCheckToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarNumberCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrLineBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrLineBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendLineBreakToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrLineBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrLineBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrPageBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPageBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentVoiceClone-> - appendPageBreakToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrPageBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrPageBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling repeat start in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRepeatStartInVoiceClone ( - inputLineNumber, - elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling repeat end in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << -// "\" in part \"" << -// fCurrentPartClone->getPartCombinedName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRepeatEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrRepeatCommonPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeatCommonPart" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRepeatCommonPartStartInVoiceClone ( - inputLineNumber); -} - -void msr2LpsrTranslator::visitEnd (S_msrRepeatCommonPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeatCommonPart" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRepeatCommonPartEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrRepeatEnding& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeatEnding" << - ", line " << inputLineNumber << - endl; - } -#endif - - // handle the repeat ending start in the voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat ending start in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRepeatEndingStartInVoiceClone ( - inputLineNumber, - elt->getRepeatEndingKind (), - elt->getRepeatEndingNumber ()); -} - -void msr2LpsrTranslator::visitEnd (S_msrRepeatEnding& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeatEnding" << - ", line " << inputLineNumber << - endl; - } -#endif - - // handle the repeat ending end in the voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat ending end in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRepeatEndingEndInVoiceClone ( - inputLineNumber, - elt->getRepeatEndingNumber (), - elt->getRepeatEndingKind ()); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrRestMeasures& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRestMeasures" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLogOutputStream << - "Handling multiple rest start in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRestMeasuresStartInVoiceClone ( - inputLineNumber, - elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrRestMeasures& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRestMeasures" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLogOutputStream << - "Handling multiple rest start in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleRestMeasuresEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrRestMeasuresContents& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRestMeasuresContents" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fCurrentVoiceClone-> - displayVoice ( - inputLineNumber, - "Upon visitStart (S_msrRestMeasuresContents&)"); - } -#endif - - fCurrentVoiceClone-> - handleRestMeasuresContentsStartInVoiceClone ( - inputLineNumber); -} - -void msr2LpsrTranslator::visitEnd (S_msrRestMeasuresContents& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRestMeasuresContents" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fCurrentVoiceClone-> - displayVoice ( - inputLineNumber, - "Upon visitEnd (S_msrRestMeasuresContents&) 1"); - } -#endif - - fCurrentVoiceClone-> - handleRestMeasuresContentsEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrMeasuresRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Handling measures repeat start in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleMeasuresRepeatStartInVoiceClone ( - inputLineNumber, - elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrMeasuresRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasuresRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -/* JMI - // set last segment as the measures repeat pattern segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Setting current last segment as measures repeat pattern segment in voice \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif -*/ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Handling measures repeat end in voice clone \"" << - fCurrentVoiceClone->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentVoiceClone-> - handleMeasuresRepeatEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrMeasuresRepeatPattern& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeatPattern" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fCurrentVoiceClone-> - displayVoice ( - inputLineNumber, - "Upon visitStart (S_msrMeasuresRepeatPattern&)"); - } -#endif - - fCurrentVoiceClone-> - handleMeasuresRepeatPatternStartInVoiceClone ( - inputLineNumber); -} - -void msr2LpsrTranslator::visitEnd (S_msrMeasuresRepeatPattern& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasuresRepeatPattern" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fCurrentVoiceClone-> - displayVoice ( - inputLineNumber, - "Upon visitEnd (S_msrMeasuresRepeatPattern&) 1"); - } -#endif - - fCurrentVoiceClone-> - handleMeasuresRepeatPatternEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrMeasuresRepeatReplicas& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeatReplicas" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fCurrentVoiceClone-> - displayVoice ( - inputLineNumber, - "Upon visitStart (S_msrMeasuresRepeatReplicas&)"); - } -#endif - - fCurrentVoiceClone-> - handleMeasuresRepeatReplicasStartInVoiceClone ( - inputLineNumber); -} - -void msr2LpsrTranslator::visitEnd (S_msrMeasuresRepeatReplicas& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting S_msrMeasuresRepeatReplicas" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fCurrentVoiceClone-> - displayVoice ( - inputLineNumber, - "Upon visitEnd (S_msrMeasuresRepeatReplicas&) 1"); - } -#endif - - fCurrentVoiceClone-> - handleMeasuresRepeatReplicasEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrBarline& elt) -{ -#ifdef TRACE_OAH - int inputLineNumber = - elt->getInputLineNumber (); -#endif - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarline" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - fLogOutputStream << - "Handling '" << - msrBarline::barlineCategoryKindAsString ( - elt->getBarlineCategory ()) << - "' in voice \"" << - fCurrentVoiceClone->getVoiceName () << "\"" << - endl; - } -#endif - - switch (elt->getBarlineStyleKind ()) { - case msrBarline::kBarlineStyleNone: - break; - case msrBarline::kBarlineStyleRegular: - break; - case msrBarline::kBarlineStyleDotted: - break; - case msrBarline::kBarlineStyleDashed: - break; - case msrBarline::kBarlineStyleHeavy: - break; - case msrBarline::kBarlineStyleLightLight: - break; - case msrBarline::kBarlineStyleLightHeavy: - break; - case msrBarline::kBarlineStyleHeavyLight: - break; - case msrBarline::kBarlineStyleHeavyHeavy: - break; - case msrBarline::kBarlineStyleTick: - break; - case msrBarline::kBarlineStyleShort: - fLpsrScore-> - // this score needs the 'custom short barline' Scheme function - setCustomShortBarlineSchemeFunctionIsNeeded (); - break; - /* JMI - case msrBarline::kBarlineStyleNone: - break; - */ - } // switch - - // append the barline to the current voice clone - fCurrentVoiceClone-> - appendBarlineToVoice (elt); -} - -void msr2LpsrTranslator::visitEnd (S_msrBarline& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarline" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrVarValAssoc& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVarValAssoc" << - ", line " << inputLineNumber << - endl; - } -#endif - - msrVarValAssoc::msrVarValAssocKind - varValAssocKind = - elt->getVarValAssocKind (); - string variableValueAux = elt->getVariableValue (); - string variableValue; - - // escape quotes if any - for_each ( - variableValueAux.begin (), - variableValueAux.end (), - stringQuoteEscaper (variableValue)); - - switch (varValAssocKind) { - case msrVarValAssoc::kWorkNumber: - fCurrentIdentification-> - setWorkNumber ( - inputLineNumber, variableValue); - - fCurrentLpsrScoreHeader-> - setWorkNumber ( - inputLineNumber, - variableValue, - kFontStyleNone, - kFontWeightNone); - - fWorkNumberKnown = true; - break; - - case msrVarValAssoc::kWorkTitle: - fCurrentIdentification-> - setWorkTitle ( - inputLineNumber, variableValue); - - fCurrentLpsrScoreHeader-> - setWorkTitle ( - inputLineNumber, - variableValue, - kFontStyleNone, - kFontWeightNone); - - fWorkTitleKnown = true; - break; - - case msrVarValAssoc::kMovementNumber: - fCurrentIdentification-> - setMovementNumber ( - inputLineNumber, variableValue); - - fCurrentLpsrScoreHeader-> - setMovementNumber ( - inputLineNumber, - variableValue, - kFontStyleNone, - kFontWeightNone); - - fMovementNumberKnown = true; - break; - - case msrVarValAssoc::kMovementTitle: - fCurrentIdentification-> - setMovementTitle ( - inputLineNumber, variableValue); - - fCurrentLpsrScoreHeader-> - setMovementTitle ( - inputLineNumber, - variableValue, - kFontStyleNone, - kFontWeightNone); - - fMovementTitleKnown = true; - break; - - case msrVarValAssoc::kEncodingDate: - fCurrentIdentification-> - setEncodingDate ( - inputLineNumber, variableValue); - - fCurrentLpsrScoreHeader-> - setEncodingDate ( - inputLineNumber, - variableValue, - kFontStyleNone, - kFontWeightNone); - break; - - case msrVarValAssoc::kScoreInstrument: - fCurrentIdentification-> - setScoreInstrument ( - inputLineNumber, variableValue); - - fCurrentLpsrScoreHeader-> - setScoreInstrument ( - inputLineNumber, - variableValue, - kFontStyleNone, - kFontWeightNone); - break; - - case msrVarValAssoc::kMiscellaneousField: - fCurrentIdentification-> - setMiscellaneousField ( - inputLineNumber, variableValue); - - fCurrentLpsrScoreHeader-> - setMiscellaneousField ( - inputLineNumber, - variableValue, - kFontStyleNone, - kFontWeightNone); - break; - - default: - { - stringstream s; - - s << - "### msrVarValAssoc kind '" << - msrVarValAssoc::varValAssocKindAsString ( - varValAssocKind) << - "' is not handled"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - } // switch -} - -void msr2LpsrTranslator::visitEnd (S_msrVarValAssoc& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrVarValAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrVarValsListAssoc& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVarValsListAssoc" << - ", line " << inputLineNumber << - endl; - } -#endif - - msrVarValsListAssoc::msrVarValsListAssocKind - varValsListAssocKind = - elt->getVarValsListAssocKind (); - - const list& - variableValuesList = - elt->getVariableValuesList (); - - switch (varValsListAssocKind) { - case msrVarValsListAssoc::kRights: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addRights ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kComposer: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addComposer ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kArranger: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addArranger ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kLyricist: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addLyricist ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kPoet: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addPoet ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kTranslator: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addTranslator ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kArtist: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addArtist ( - inputLineNumber, (*i)); - } // for - break; - - case msrVarValsListAssoc::kSoftware: - for (list::const_iterator i = variableValuesList.begin (); - i != variableValuesList.end (); - i++ - ) { - fCurrentLpsrScoreHeader-> - addSoftware ( - inputLineNumber, (*i)); - } // for - break; -/* JMI - default: - { - stringstream s; - - s << - "### msrVarValsListAssoc kind '" << - msrVarValsListAssoc::varValsListAssocKindAsString ( - varValsListAssocKind) << - "' is not handled"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - */ - } // switch -} - -void msr2LpsrTranslator::visitEnd (S_msrVarValsListAssoc& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrVarValsListAssoc" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrPageLayout& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPageLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; -} - -void msr2LpsrTranslator::visitEnd (S_msrPageLayout& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrPageLayout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msr2LpsrTranslator::visitStart (S_msrMidiTempo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMidiTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void msr2LpsrTranslator::visitEnd (S_msrMidiTempo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMidiTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/msr2LpsrTranslator.h b/src/lilypond/msr2LpsrTranslator.h deleted file mode 100644 index 4421506ba..000000000 --- a/src/lilypond/msr2LpsrTranslator.h +++ /dev/null @@ -1,693 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msr2LpsrTranslator___ -#define ___msr2LpsrTranslator___ - -#include -#include - -#include "lpsr.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class msr2LpsrTranslator : - - public visitor, - - // rights - - public visitor, - - public visitor, - public visitor, - - // variable-value associations - - public visitor, - public visitor, - - // scaling - - public visitor, - - // layout - - public visitor, - - // parts & part groups - - public visitor, - - public visitor, - - // staff details - - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - - // lyrics - - public visitor, - public visitor, - - // clefs - - public visitor, - - // keys - - public visitor, - - // times - - public visitor, - - // transpose - - public visitor, - - // print - - public visitor, - public visitor, - - // words - - public visitor, - - // tempo - - public visitor, - - public visitor, - - // rehearsal - - public visitor, - - // harmonies - - public visitor, - public visitor, - - // frames - - public visitor, - - // figured bass - - public visitor, - public visitor, - - // measures - - public visitor, - - // articulations - - public visitor, - - public visitor, - - public visitor, - public visitor, - - // technicals - - public visitor, - public visitor, - public visitor, - public visitor, - - // ornaments - - public visitor, - - // spanners - - public visitor, - - // glissandos - - public visitor, - - // slides - - public visitor, - - // tremolos - - public visitor, - - public visitor, - - // dynamics - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - public visitor, - - // grace notes - - public visitor, - - // notes - - public visitor, - public visitor, - - // accordion registration - - public visitor, - - // harp pedals tuning - - public visitor, - - public visitor, - - // chords - - public visitor, - - // tuplets - - public visitor, - - // ties, slurs, brackets & beams - - public visitor, - - public visitor, - - // ? - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - - // repeats - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - - // midi - - public visitor - -{ - public: - - msr2LpsrTranslator ( - indentedOstream& ios, - S_msrScore mScore); - - virtual ~msr2LpsrTranslator (); - - void buildLpsrScoreFromMsrScore (); - - S_lpsrScore getLpsrScore () const - { return fLpsrScore; } - - protected: - - virtual void visitStart (S_msrScore& elt); - virtual void visitEnd (S_msrScore& elt); - - virtual void visitStart (S_msrIdentification& elt); - virtual void visitEnd (S_msrIdentification& elt); - - virtual void visitStart (S_msrCredit& elt); - virtual void visitEnd (S_msrCredit& elt); - virtual void visitStart (S_msrCreditWords& elt); - virtual void visitEnd (S_msrCreditWords& elt); - - // parts & part groups - - virtual void visitStart (S_msrPartGroup& elt); - virtual void visitEnd (S_msrPartGroup& elt); - - virtual void visitStart (S_msrPart& elt); - virtual void visitEnd (S_msrPart& elt); - - virtual void visitStart (S_msrStaffTuning& elt); - virtual void visitStart (S_msrStaffDetails& elt); - virtual void visitEnd (S_msrStaffDetails& elt); - - virtual void visitStart (S_msrStaff& elt); - virtual void visitEnd (S_msrStaff& elt); - - virtual void visitStart (S_msrVoice& elt); - virtual void visitEnd (S_msrVoice& elt); - - virtual void visitStart (S_msrVoiceStaffChange& elt); - - virtual void visitStart (S_msrStanza& elt); - virtual void visitEnd (S_msrStanza& elt); - - virtual void visitStart (S_msrSyllable& elt); - virtual void visitEnd (S_msrSyllable& elt); - - virtual void visitStart (S_msrClef& elt); - virtual void visitEnd (S_msrClef& elt); - - virtual void visitStart (S_msrKey& elt); - virtual void visitEnd (S_msrKey& elt); - - virtual void visitStart (S_msrTime& elt); - virtual void visitEnd (S_msrTime& elt); - - virtual void visitStart (S_msrTranspose& elt); - virtual void visitEnd (S_msrTranspose& elt); - - virtual void visitStart (S_msrPartNameDisplay& elt); - virtual void visitStart (S_msrPartAbbreviationDisplay& elt); - - virtual void visitStart (S_msrWords& elt); - virtual void visitEnd (S_msrWords& elt); - - virtual void visitStart (S_msrTempo& elt); - virtual void visitEnd (S_msrTempo& elt); - - virtual void visitStart (S_msrRehearsal& elt); - virtual void visitEnd (S_msrRehearsal& elt); - - virtual void visitStart (S_msrSegment& elt); - virtual void visitEnd (S_msrSegment& elt); - - virtual void visitStart (S_msrHarmony& elt); - virtual void visitEnd (S_msrHarmony& elt); - virtual void visitStart (S_msrHarmonyDegree& elt); - - virtual void visitStart (S_msrFrame& elt); - - virtual void visitStart (S_msrFiguredBass& elt); - virtual void visitEnd (S_msrFiguredBass& elt); - virtual void visitStart (S_msrFigure& elt); - - virtual void visitStart (S_msrMeasure& elt); - virtual void visitEnd (S_msrMeasure& elt); - - virtual void visitStart (S_msrArticulation& elt); - virtual void visitEnd (S_msrArticulation& elt); - - virtual void visitStart (S_msrFermata& elt); - - virtual void visitStart (S_msrArpeggiato& elt); - virtual void visitStart (S_msrNonArpeggiato& elt); - - virtual void visitStart (S_msrTechnical& elt); - virtual void visitEnd (S_msrTechnical& elt); - - virtual void visitStart (S_msrTechnicalWithInteger& elt); - virtual void visitEnd (S_msrTechnicalWithInteger& elt); - - virtual void visitStart (S_msrTechnicalWithFloat& elt); - virtual void visitEnd (S_msrTechnicalWithFloat& elt); - - virtual void visitStart (S_msrTechnicalWithString& elt); - virtual void visitEnd (S_msrTechnicalWithString& elt); - - virtual void visitStart (S_msrOrnament& elt); - virtual void visitEnd (S_msrOrnament& elt); - - virtual void visitStart (S_msrSpanner& elt); - virtual void visitEnd (S_msrSpanner& elt); - - virtual void visitStart (S_msrGlissando& elt); - virtual void visitEnd (S_msrGlissando& elt); - - virtual void visitStart (S_msrSlide& elt); - virtual void visitEnd (S_msrSlide& elt); - - virtual void visitStart (S_msrSingleTremolo& elt); - virtual void visitEnd (S_msrSingleTremolo& elt); - - virtual void visitStart (S_msrDoubleTremolo& elt); - virtual void visitEnd (S_msrDoubleTremolo& elt); - - virtual void visitStart (S_msrDynamics& elt); - virtual void visitEnd (S_msrDynamics& elt); - - virtual void visitStart (S_msrOtherDynamics& elt); - virtual void visitEnd (S_msrOtherDynamics& elt); - - virtual void visitStart (S_msrSlash& elt); - - virtual void visitStart (S_msrWedge& elt); - virtual void visitEnd (S_msrWedge& elt); - - virtual void visitStart (S_msrGraceNotesGroup& elt); - virtual void visitEnd (S_msrGraceNotesGroup& elt); - - virtual void visitStart (S_msrNote& elt); - virtual void visitEnd (S_msrNote& elt); - - virtual void visitStart (S_msrOctaveShift& elt); - virtual void visitEnd (S_msrOctaveShift& elt); - - virtual void visitStart (S_msrAccordionRegistration& elt); - - virtual void visitStart (S_msrHarpPedalsTuning& elt); - - virtual void visitStart (S_msrStem& elt); - virtual void visitEnd (S_msrStem& elt); - - virtual void visitStart (S_msrBeam& elt); - virtual void visitEnd (S_msrBeam& elt); - - virtual void visitStart (S_msrChord& elt); - virtual void visitEnd (S_msrChord& elt); - - virtual void visitStart (S_msrTuplet& elt); - virtual void visitEnd (S_msrTuplet& elt); - - virtual void visitStart (S_msrTie& elt); - virtual void visitEnd (S_msrTie& elt); - - virtual void visitStart (S_msrSlur& elt); - virtual void visitEnd (S_msrSlur& elt); - - virtual void visitStart (S_msrLigature& elt); - virtual void visitEnd (S_msrLigature& elt); - - virtual void visitStart (S_msrBarline& elt); - virtual void visitEnd (S_msrBarline& elt); - - virtual void visitStart (S_msrSegno& elt); - virtual void visitStart (S_msrCoda& elt); - - virtual void visitStart (S_msrEyeGlasses& elt); - virtual void visitStart (S_msrPedal& elt); - virtual void visitStart (S_msrDamp& elt); - virtual void visitStart (S_msrDampAll& elt); - virtual void visitStart (S_msrScordatura& elt); - - virtual void visitStart (S_msrBarCheck& elt); - virtual void visitEnd (S_msrBarCheck& elt); - virtual void visitStart (S_msrBarNumberCheck& elt); - virtual void visitEnd (S_msrBarNumberCheck& elt); - - virtual void visitStart (S_msrLineBreak& elt); - virtual void visitEnd (S_msrLineBreak& elt); - - virtual void visitStart (S_msrPageBreak& elt); - virtual void visitEnd (S_msrPageBreak& elt); - - virtual void visitStart (S_msrRepeat& elt); - virtual void visitEnd (S_msrRepeat& elt); - virtual void visitStart (S_msrRepeatCommonPart& elt); - virtual void visitEnd (S_msrRepeatCommonPart& elt); - virtual void visitStart (S_msrRepeatEnding& elt); - virtual void visitEnd (S_msrRepeatEnding& elt); - - virtual void visitStart (S_msrMeasuresRepeat& elt); - virtual void visitEnd (S_msrMeasuresRepeat& elt); - virtual void visitStart (S_msrMeasuresRepeatPattern& elt); - virtual void visitEnd (S_msrMeasuresRepeatPattern& elt); - virtual void visitStart (S_msrMeasuresRepeatReplicas& elt); - virtual void visitEnd (S_msrMeasuresRepeatReplicas& elt); - - virtual void visitStart (S_msrRestMeasures& elt); - virtual void visitEnd (S_msrRestMeasures& elt); - virtual void visitStart (S_msrRestMeasuresContents& elt); - virtual void visitEnd (S_msrRestMeasuresContents& elt); - - virtual void visitStart (S_msrVarValAssoc& elt); - virtual void visitEnd (S_msrVarValAssoc& elt); - virtual void visitStart (S_msrVarValsListAssoc& elt); - virtual void visitEnd (S_msrVarValsListAssoc& elt); - - virtual void visitStart (S_msrScaling& elt); - virtual void visitEnd (S_msrScaling& elt); - - virtual void visitStart (S_msrPageLayout& elt); - virtual void visitEnd (S_msrPageLayout& elt); - - virtual void visitStart (S_msrMidiTempo& elt); - virtual void visitEnd (S_msrMidiTempo& elt); - - private: - - indentedOstream& fLogOutputStream; - - - // the MSR score we're visiting - // ------------------------------------------------------ - S_msrScore fVisitedMsrScore; - - - // the LPSR score we're building (it is always built) - // ------------------------------------------------------ - S_lpsrScore fLpsrScore; - S_lpsrScoreBlock fCurrentScoreBlock; - - - // its header - // ------------------------------------------------------ - S_lpsrHeader fCurrentLpsrScoreHeader; - - - // score - // ------------------------------------------------------ - S_msrScore fCurrentMsrScoreClone; - - - // identification - // ------------------------------------------------------ - bool fOnGoingIdentification; - S_msrIdentification fCurrentIdentification; - - - // header - // ------------------------------------------------------ - bool fWorkNumberKnown; - bool fWorkTitleKnown; - bool fMovementNumberKnown; - bool fMovementTitleKnown; - - - // paper - // ------------------------------------------------------ - void setPaperIndentsIfNeeded ( - S_msrScaling scaling); - - // credits - // ------------------------------------------------------ - S_msrCredit fCurrentCredit; - - - // books - // ------------------------------------------------------ - S_lpsrBookBlock fCurrentLpsrBookBlock; - - // part groups - // ------------------------------------------------------ - // S_msrPartGroup fCurrentPartGroupClone; JMI - - // partGroup's can be nested, hence this stack - // the current partGroup is the top of the stack - stack fPartGroupsStack; - - // part groups block are nested as the partGroup's are - // the current partGroup block is the top of the stack - stack - fPartGroupBlocksStack; - - S_lpsrBookPartBlock fCurrentBookPartBlock; - - // parts - // ------------------------------------------------------ - S_msrPart fCurrentPartClone; - S_lpsrPartBlock fCurrentPartBlock; - - - // staff details - // ------------------------------------------------------ - - S_msrStaffTuning fCurrentStaffTuningClone; - - - // staves - // ------------------------------------------------------ - S_msrStaff fCurrentStaffClone; - S_lpsrStaffBlock fCurrentStaffBlock; - // prevent clef, key and time from being handled twice - bool fOnGoingStaff; - - - // voices - // ------------------------------------------------------ - S_msrVoice fCurrentVoiceClone; - S_msrVoice fCurrentVoiceOriginal; - map fVoiceNotesMap; // JMI - - - // harmonies - // ------------------------------------------------------ - bool fOnGoingHarmonyVoice; - - S_msrHarmony fCurrentHarmonyClone; - - list fPendingHarmoniesList; - - - // figured bass - // ------------------------------------------------------ - bool fOnGoingFiguredBassVoice; - S_msrFiguredBass fCurrentFiguredBassClone; - - - // segments - // ------------------------------------------------------ - // the current segment clone is the one at the top of the stack - S_msrSegment fCurrentSegmentClone; - - - // measures - // ------------------------------------------------------ - S_msrMeasure fCurrentMeasureClone; - - // full measure rests compression - S_msrMeasure fCurrentRestMeasure; - S_msrRestMeasures fCurrentRestMeasures; - - // bar checks - // ------------------------------------------------------ - S_msrBarCheck fLastBarCheck; - - - // notes - // ------------------------------------------------------ - bool fOnGoingNonGraceNote; - - // fCurrentNonGraceNoteClone is not used for grace notes, - // which are visited while the note they're attached to - // is being visited too - S_msrNote fCurrentNonGraceNoteClone; - - // to help workaround LilyPond issue 34 - S_msrNote fFirstNoteCloneInVoice; - - S_msrGraceNotesGroup fCurrentSkipGraceNotesGroup; - - - // glissandos - // ------------------------------------------------------ - - - // slides - // ------------------------------------------------------ - - - // double tremolos - // ------------------------------------------------------ - S_msrDoubleTremolo fCurrentDoubleTremoloClone; - bool fOnGoingDoubleTremolo; - - - // stems - // ------------------------------------------------------ - S_msrStem fCurrentStem; - - - // grace notes - // ------------------------------------------------------ - S_msrGraceNotesGroup fCurrentGraceNotesGroupClone; - S_msrNote fCurrentGraceNoteClone; - bool fOnGoingGraceNotesGroup; - - // afterGraceNotes optimisation - S_msrAfterGraceNotesGroup fPendingAfterGraceNotesGroup; - S_msrElement fCurrentAfterGraceNotesGroupElement; - - /* JMI - void prependSkipGraceNotesGroupToPartOtherVoices ( - S_msrPart partClone, - S_msrVoice voiceClone, - S_msrGraceNotesGroup skipGraceNotesGroup); - */ - - - // chords - // ------------------------------------------------------ - bool fOnGoingChord; - S_msrChord fCurrentChordClone; - - - // tuplets - // ------------------------------------------------------ -// S_msrTuplet fCurrentTupletClone; - // bool fOnGoingTuplet; - stack fTupletClonesStack; - - - // stanzas - // ------------------------------------------------------ - S_msrStanza fCurrentStanzaClone; - bool fOnGoingStanza; - - - // syllables - // ------------------------------------------------------ - S_msrSyllable fCurrentSyllableClone; - bool fOnGoingSyllableExtend; - - - // current ongoing values display - // ------------------------------------------------------ - void displayCurrentOnGoingValues (); -}; - - -} - - -#endif diff --git a/src/lilypond/msr2Names.cpp b/src/lilypond/msr2Names.cpp deleted file mode 100644 index 9998b6c66..000000000 --- a/src/lilypond/msr2Names.cpp +++ /dev/null @@ -1,454 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "msrOah.h" - -#include "msr2Names.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -msr2NamesVisitor::msr2NamesVisitor ( - S_msrOah& msrOpts, - indentedOstream& ios) - : fMsrNamesOutputStream (ios) -{ - fMsrOah = msrOpts; - - // part groups - fPartGroupsCounter = 0; - - // parts - fPartsCounter = 0; - - // staves - fStavesCounter = 0; - fOnGoingStaff = false; - - // voices - fVoicesCounter = 0; -}; - -msr2NamesVisitor::~msr2NamesVisitor () -{} - -//________________________________________________________________________ -void msr2NamesVisitor::printNamesFromMsrScore ( - const S_msrScore& score) -{ - if (score) { - // create a msrScore browser - msrBrowser browser (this); - - // browse the score with the browser - browser.browse (*score); - } -} - -//________________________________________________________________________ -void msr2NamesVisitor::visitStart (S_msrScore& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> Start visiting msrScore" << - endl; - } - - fMsrNamesOutputStream << - "MSR names summary of \"" << - gOahOah->fInputSourceName << - "\":" << - endl << - endl; - - gIndenter++; -} - -void msr2NamesVisitor::visitEnd (S_msrScore& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> End visiting msrScore" << - endl; - } - - fMsrNamesOutputStream << - "The score contains:" << - endl; - - gIndenter++; - - const int fieldWidth = 3; - - fMsrNamesOutputStream << - setw (fieldWidth) << - singularOrPlural ( - fPartGroupsCounter, - "part group", - "part groups") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fPartsCounter, - "part", - "parts") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fStavesCounter, - "stave", - "staves") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fVoicesCounter, - "voice", - "voices") << - endl; - - gIndenter--; -} - -//________________________________________________________________________ -void msr2NamesVisitor::visitStart (S_msrPartGroup& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> Start visiting msrPartGroup" << - endl; - } - - fPartGroupsCounter++; - - int partGroupElementsSize = elt->getPartGroupElements ().size (); - - fMsrNamesOutputStream << - "PartGroup" << " " << elt->getPartGroupCombinedName () << - " contains " << - singularOrPlural ( - partGroupElementsSize, - " part or sub part group", - " parts or sub part groups") << - endl; - - gIndenter++; - - const int fieldWidth = 25; - - fMsrNamesOutputStream << left << - setw (fieldWidth) << - "partGroupName" << " : \"" << - elt->getPartGroupName () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupNameDisplayText" << " : \"" << - elt->getPartGroupNameDisplayText () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupAbbrevation" << " : \"" << - elt->getPartGroupAbbreviation () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupInstrumentName" << " : \"" << - elt->getPartGroupInstrumentName () << "\"" << - endl << - endl; -} - -void msr2NamesVisitor::visitEnd (S_msrPartGroup& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> End visiting msrPartGroup" << - endl; - } -} - -//________________________________________________________________________ -void msr2NamesVisitor::visitStart (S_msrPart& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> Start visiting msrPart" << - endl; - } - - fPartsCounter++; - - int partStavesMapSize = elt->getPartStavesMap ().size (); - - fMsrNamesOutputStream << - "Part " << elt->getPartCombinedName () << - " contains " << - singularOrPlural ( - partStavesMapSize, - "staff", "staves") << - endl; - - gIndenter++; - - const int fieldWidth = 27; - - fMsrNamesOutputStream << left << - setw (fieldWidth) << - "partID" << " : \"" << - elt->getPartID () << "\"" << - endl << - setw (fieldWidth) << - "partMsrName" << " : \"" << - elt->getPartMsrName () << "\"" << - endl << - setw (fieldWidth) << - "partName" << " : \"" << - elt->getPartName () << "\"" << - endl << - setw (fieldWidth) << - "partAbbrevation" << " : \"" << - elt->getPartAbbreviation () << "\"" << - endl << - setw (fieldWidth) << - "partInstrumentName" << " : \"" << - elt->getPartInstrumentName () << "\"" << - endl << - setw (fieldWidth) << - "partInstrumentAbbreviation" << " : \"" << - elt->getPartInstrumentAbbreviation () << "\"" << - endl; - - fMsrNamesOutputStream << endl; -} - -void msr2NamesVisitor::visitEnd (S_msrPart& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> End visiting msrPart" << - endl; - } -} - -//________________________________________________________________________ -void msr2NamesVisitor::visitStart (S_msrStaff& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> Start visiting msrStaff" << - endl; - } - - fStavesCounter++; - - int staffAllVoicesVectorSize = elt->getStaffAllVoicesVector ().size (); - - fMsrNamesOutputStream << - "Staff" << " " << elt->getStaffName () << - " contains " << - singularOrPlural ( - staffAllVoicesVectorSize, - "voice", "voices") << - endl; - - gIndenter++; - - - const int fieldWidth = 28; - - fMsrNamesOutputStream << left << - setw (fieldWidth) << - "staffNumber" << " : " << - elt->getStaffNumber () << - endl << - - setw (fieldWidth) << - "staffInstrumentName" << ": \"" << - elt->getStaffInstrumentName () << "\"" << - endl << - - setw (fieldWidth) << - "staffInstrumentAbbreviation" << ": \"" << - elt->getStaffInstrumentAbbreviation () << "\"" << - endl; - - fMsrNamesOutputStream << endl; - - fOnGoingStaff = true; -} - -void msr2NamesVisitor::visitEnd (S_msrStaff& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> End visiting msrStaff" << - endl; - } - - fOnGoingStaff = false; -} - -//________________________________________________________________________ -void msr2NamesVisitor::visitStart (S_msrVoice& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> Start visiting msrVoice" << - endl; - } - - fVoicesCounter++; - - int voiceStanzasMapSize = elt->getVoiceStanzasMap ().size (); - - fMsrNamesOutputStream << - "Voice" << " " << elt->getVoiceName () << - " has " << - singularOrPlural ( - voiceStanzasMapSize, - "stanza", "stanzas") << - endl; - - gIndenter++; - - const int fieldWidth = 28; - - fMsrNamesOutputStream << left << - setw (fieldWidth) << - "voiceNumber" << " : " << - elt->getVoiceNumber () << - endl << - setw (fieldWidth) << - "musicHasBeenInsertedInVoice" << " : " << - booleanAsString ( - elt->getMusicHasBeenInsertedInVoice ()) << - endl; - - fMsrNamesOutputStream << endl; -} - -void msr2NamesVisitor::visitEnd (S_msrVoice& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> End visiting msrVoice" << - endl; - } -} - -//________________________________________________________________________ -void msr2NamesVisitor::visitStart (S_msrVarValAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> Start visiting msrVarValAssoc" << - endl; - } - - fMsrNamesOutputStream << - "VarValAssoc" << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - fMsrNamesOutputStream << - setw (fieldWidth) << - "varValAssocKind" << " : " << - "\"" << - elt->varValAssocKindAsString () << - "\"" << - endl << - - setw (fieldWidth) << - "variableValue" << " : " << - "\"" << elt->getVariableValue () << "\"" << - endl << - endl; - - gIndenter--; -} - -void msr2NamesVisitor::visitEnd (S_msrVarValAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> End visiting msrVarValAssoc" << - endl; - } -} - -//________________________________________________________________________ -void msr2NamesVisitor::visitStart (S_msrVarValsListAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> Start visiting msrVarValsListAssoc" << - endl; - } - - fMsrNamesOutputStream << - "VarValsListAssoc" << - endl; - - gIndenter++; - - const int fieldWidth = 23; - - fMsrNamesOutputStream << left << - setw (fieldWidth) << - "varValsListAssocKind" << " : " << - "\"" << - elt->varValsListAssocKindAsString () << - "\"" << - endl << - - setw (fieldWidth) << - "varValsListAssocValues" << " : " << - "'" << elt->varValsListAssocValuesAsString () << "'" << - endl << - endl; - - gIndenter--; -} - -void msr2NamesVisitor::visitEnd (S_msrVarValsListAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrNamesOutputStream << - "--> End visiting msrVarValsListAssoc" << - endl; - } -} - - -} // namespace diff --git a/src/lilypond/msr2Names.h b/src/lilypond/msr2Names.h deleted file mode 100644 index ebbd1bc71..000000000 --- a/src/lilypond/msr2Names.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msr2Names___ -#define ___msr2Names___ - -#include "msr.h" - -#include "msrOah.h" - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class msr2NamesVisitor : - - public visitor, - - // parts & part groups - - public visitor, - - public visitor, - - // staves - - public visitor, - - // voices - - public visitor, - - // varValAssocs - - public visitor, - public visitor - -{ - public: - - msr2NamesVisitor ( - S_msrOah& msrOpts, - indentedOstream& ios); - - virtual ~msr2NamesVisitor (); - - void printNamesFromMsrScore ( - const S_msrScore& score); - - protected: - - virtual void visitStart (S_msrScore& elt); - virtual void visitEnd (S_msrScore& elt); - - virtual void visitStart (S_msrPartGroup& elt); - virtual void visitEnd (S_msrPartGroup& elt); - - virtual void visitStart (S_msrPart& elt); - virtual void visitEnd (S_msrPart& elt); - - virtual void visitStart (S_msrStaff& elt); - virtual void visitEnd (S_msrStaff& elt); - - virtual void visitStart (S_msrVoice& elt); - virtual void visitEnd (S_msrVoice& elt); - - virtual void visitStart (S_msrVarValAssoc& elt); - virtual void visitEnd (S_msrVarValAssoc& elt); - virtual void visitStart (S_msrVarValsListAssoc& elt); - virtual void visitEnd (S_msrVarValsListAssoc& elt); - - private: - - S_msrOah fMsrOah; - - indentedOstream& fMsrNamesOutputStream; - - // score - // ------------------------------------------------------ - - // part groups - // ------------------------------------------------------ - - int fPartGroupsCounter; - - // parts - // ------------------------------------------------------ - - int fPartsCounter; - - // staves - // ------------------------------------------------------ - - int fStavesCounter; - - // prevent clef, key and time from being handled twice - bool fOnGoingStaff; - - // voices - // ------------------------------------------------------ - - int fVoicesCounter; -}; - - -} - - -#endif diff --git a/src/lilypond/msr2Summary.cpp b/src/lilypond/msr2Summary.cpp deleted file mode 100644 index 564027a54..000000000 --- a/src/lilypond/msr2Summary.cpp +++ /dev/null @@ -1,1182 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "msrOah.h" - -#include "msr2Summary.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -msr2SummaryVisitor::msr2SummaryVisitor ( - S_msrOah& msrOpts, - indentedOstream& ios) - : fMsrSummaryOutputStream (ios) -{ - fMsrOah = msrOpts; - - // part groups - fPartGroupsCounter = 0; - - // parts - fPartsCounter = 0; - - // staves - fStavesCounter = 0; - fOnGoingStaff = false; - - // voices - fVoicesCounter = 0; - - // stanzas - fStanzasCounter = 0; - - // notes - fScoreUnpitchedNotesCounter = 0; - fScoreStandaloneNotesCounter = 0; - fScoreRestNotesCounter = 0; - fScoreSkipNotesCounter = 0; - fScoreDoubleTremoloNotesCounter = 0; - fScoreGraceNotesGroupCounter = 0; - - // chords - fScoreChordNotesCounter = 0; - fScoreChordsCounter = 0; - - // tuplets - fScoreTupletNotesCounter = 0; - fScoreTupletsCounter = 0; -}; - -msr2SummaryVisitor::~msr2SummaryVisitor () -{} - -//________________________________________________________________________ -void msr2SummaryVisitor::printSummaryFromMsrScore ( - const S_msrScore& score) -{ - if (score) { - // create a msrScore browser - msrBrowser browser (this); - - // browse the score with the browser - browser.browse (*score); - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrScore& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrScore" << - endl; - } - - fMsrSummaryOutputStream << - "MSR contents summary of \"" << - gOahOah->fInputSourceName << - "\":" << - endl << - endl; - - gIndenter++; -} - -void msr2SummaryVisitor::visitEnd (S_msrScore& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrScore" << - endl; - } - - fMsrSummaryOutputStream << - "The score contains:" << - endl; - - gIndenter++; - - const int fieldWidth = 3; - - fMsrSummaryOutputStream << - setw (fieldWidth) << - singularOrPlural ( - fPartGroupsCounter, - "part group", - "part groups") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fPartsCounter, - "part", - "parts") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fStavesCounter, - "stave", - "staves") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fVoicesCounter, - "voice", - "voices") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fStanzasCounter, - "stanza", - "stanzas") << - endl << - - endl << - - setw (fieldWidth) << - singularOrPlural ( - elt->getScoreNumberOfMeasures (), - "measure", - "measures") << - endl << - - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreStandaloneNotesCounter, - "standalone note", - "standalone notes") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreRestNotesCounter, - "rest note", - "rest notes") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreSkipNotesCounter, - "skip note", - "skip notes") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreUnpitchedNotesCounter, - "unpitched note", - "unpitched notes") << - endl << - - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreChordsCounter, - "chord", - "chords") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreChordNotesCounter, - "chord note", - "chord notes") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreTupletsCounter, - "tuplet", - "tuplets") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreTupletNotesCounter, - "tuplet note", - "tuplet notes") << - endl << - - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreGraceNotesGroupCounter, - "grace note group", - "grace notes groups") << - endl << - - setw (fieldWidth) << - singularOrPlural ( - fScoreDoubleTremoloNotesCounter, - "double tremolo note", - "double tremolo notes") << - endl << - endl; - - gIndenter--; -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrPartGroup& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrPartGroup" << - endl; - } - - fPartGroupsCounter++; - - int partGroupElementsSize = elt->getPartGroupElements ().size (); - - fMsrSummaryOutputStream << - "PartGroup" << " " << elt->getPartGroupCombinedName () << - " contains " << - singularOrPlural ( - partGroupElementsSize, - " part or sub part group", - " parts or sub part groups") << - endl; - - gIndenter++; - - const int fieldWidth = 24; - - fMsrSummaryOutputStream << left << - setw (fieldWidth) << - "partGroupAbsoluteNumber" << " : \"" << - elt->getPartGroupAbsoluteNumber () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupName" << " : \"" << - elt->getPartGroupName () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupNameDisplayText" << " : \"" << - elt->getPartGroupNameDisplayText () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupAccidentalText" << " : \"" << - elt->getPartGroupAccidentalText () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupAbbrevation" << " : \"" << - elt->getPartGroupAbbreviation () << "\"" << - endl << - - setw (fieldWidth) << - "partGroupSymbolKind" << " : " << - msrPartGroup::partGroupSymbolKindAsString ( - elt->getPartGroupSymbolKind ()) << - endl << - - setw (fieldWidth) << - "partGroupSymbolDefaultX" << " : " << - elt->getPartGroupSymbolDefaultX () << - endl << - - setw (fieldWidth) << - "partGroupBarline" << " : \"" << - msrPartGroup::partGroupBarlineKindAsString ( - elt->getPartGroupBarlineKind ()) << - "\"" << - endl << - - setw (fieldWidth) << - "partGroupInstrumentName" << " : \"" << - elt->getPartGroupInstrumentName () << "\"" << - endl << - endl; -} - -void msr2SummaryVisitor::visitEnd (S_msrPartGroup& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrPartGroup" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrPart& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrPart" << - endl; - } - - fPartsCounter++; - - int partStavesMapSize = elt->getPartStavesMap ().size (); - - fMsrSummaryOutputStream << - "Part " << elt->getPartCombinedName () << - " contains " << - singularOrPlural ( - partStavesMapSize, - "staff", "staves") << - endl; - - gIndenter++; - - const int fieldWidth = 28; - - fMsrSummaryOutputStream << left << - setw (fieldWidth) << - "partID" << " : \"" << - elt->getPartID () << "\"" << - endl << - - setw (fieldWidth) << - "partMsrName" << " : \"" << - elt->getPartMsrName () << "\"" << - endl << - - setw (fieldWidth) << - "partName" << " : \"" << - elt->getPartName () << "\"" << - endl << - - setw (fieldWidth) << - "partAbbrevation" << " : \"" << - elt->getPartAbbreviation () << "\"" << - endl << - - setw (fieldWidth) << - "partInstrumentName" << " : \"" << - elt->getPartInstrumentName () << "\"" << - endl << - - setw (fieldWidth) << - "partInstrumentAbbreviation" << " : \"" << - elt->getPartInstrumentAbbreviation () << "\"" << - endl << - - setw (fieldWidth) << - "partNumberOfMeasures" << " : " << - elt->getPartNumberOfMeasures () << - endl << - endl; -} - -void msr2SummaryVisitor::visitEnd (S_msrPart& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrPart" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrStaff& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrStaff" << - endl; - } - - fStavesCounter++; - - int staffAllVoicesVectorSize = elt->getStaffAllVoicesVector ().size (); - - fMsrSummaryOutputStream << - "Staff" << " " << elt->getStaffName () << - " contains " << - singularOrPlural ( - staffAllVoicesVectorSize, - "voice", "voices") << - endl; - - gIndenter++; - - - const int fieldWidth = 27; - - // print the staff number - fMsrSummaryOutputStream << left << - setw (fieldWidth) << - "staffNumber" << " : " << - elt->getStaffNumber () << - endl << - - setw (fieldWidth) << - "staffInstrumentName" << ": \"" << - elt->getStaffInstrumentName () << "\"" << - endl << - - setw (fieldWidth) << - "staffInstrumentAbbreviation" << ": \"" << - elt->getStaffInstrumentAbbreviation () << "\"" << - endl; - - fMsrSummaryOutputStream << endl; - - fOnGoingStaff = true; -} - -void msr2SummaryVisitor::visitEnd (S_msrStaff& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrStaff" << - endl; - } - - fOnGoingStaff = false; -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrVoice& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrVoice" << - endl; - } - - fVoicesCounter++; - - int voiceStanzasMapSize = elt->getVoiceStanzasMap ().size (); - - fMsrSummaryOutputStream << - "Voice" << " " << elt->getVoiceName () << - " has " << - singularOrPlural ( - voiceStanzasMapSize, - "stanza", "stanzas") << - endl; - - gIndenter++; - - const int fieldWidth = 34; - - fMsrSummaryOutputStream << left << - setw (fieldWidth) << - "voiceNumber" << " : " << - elt->getVoiceNumber () << - endl << - setw (fieldWidth) << - "regularVoiceStaffSequentialNumber" << " : " << - elt->getRegularVoiceStaffSequentialNumber () << - endl << - setw (fieldWidth) << - "voiceActualNotesCounter" << " : " << - elt->getVoiceActualNotesCounter () << - endl << - setw (fieldWidth) << - "voiceActualHarmoniesCounter" << " : " << - elt->getVoiceActualHarmoniesCounter () << - endl << - setw (fieldWidth) << - "musicHasBeenInsertedInVoice" << " : " << - booleanAsString ( - elt->getMusicHasBeenInsertedInVoice ()) << - endl; - - fMsrSummaryOutputStream << endl; - - // don't show fVoiceMuteStanza in the summary -} - -void msr2SummaryVisitor::visitEnd (S_msrVoice& elt) -{ - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrVoice" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrStanza& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrStanza" << - endl; - } - - fStanzasCounter++; - - int syllablesSize = elt->getSyllables ().size (); - - fMsrSummaryOutputStream << - "Stanza" << " " << elt->getStanzaName () << - " contains " << - singularOrPlural ( - syllablesSize, - "syllable", "syllables"); - - if (! elt->getStanzaTextPresent ()) { - fMsrSummaryOutputStream << - " (no actual text)"; - } - - fMsrSummaryOutputStream << - endl << - endl; -} - -void msr2SummaryVisitor::visitEnd (S_msrStanza& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrStanza" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrSyllable& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrSyllable" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrSyllable& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrSyllable" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrClef& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrClef" << - endl; - } - - if (! fOnGoingStaff) { - fMsrSummaryOutputStream << - elt->asString () << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrClef& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrClef" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrKey& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrKey" << - endl; - } - - if (! fOnGoingStaff) { - fMsrSummaryOutputStream << - elt->asString () << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrKey& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrKey" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrTime& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrTime" << - endl; - } - - if (! fOnGoingStaff) { - fMsrSummaryOutputStream << - elt->asString () << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrTime& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrTime" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrTempo& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrTempo" << - endl; - } - - fMsrSummaryOutputStream << - "Tempo " << - elt->getTempoBeatUnit () << " " << elt->getTempoPerMinute () << - endl; -} - -void msr2SummaryVisitor::visitEnd (S_msrTempo& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrTempo" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrSegment& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrSegment" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrSegment& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrSegment" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrArticulation& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrArticulation" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrArticulation& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrArticulation" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrDynamics& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrDynamics" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrDynamics& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrDynamics" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrWedge& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrWedge" << endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrWedge& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrWedge" << endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrGraceNotesGroup& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrGraceNotesGroup" << endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrGraceNotesGroup& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrGraceNotesGroup" << endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrNote& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting " << - msrNote::noteKindAsString ( - elt->getNoteKind ()) << - " msrNote" << - endl; - } - - switch (elt->getNoteKind ()) { - case msrNote::k_NoNoteKind: - break; - case msrNote::kRestNote: - fScoreRestNotesCounter++; - break; - case msrNote::kSkipNote: - fScoreSkipNotesCounter++; - break; - case msrNote::kUnpitchedNote: - fScoreUnpitchedNotesCounter++; - break; - case msrNote::kStandaloneNote: - fScoreStandaloneNotesCounter++; - break; - case msrNote::kDoubleTremoloMemberNote: - fScoreStandaloneNotesCounter++; - break; - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - fScoreGraceNotesGroupCounter++; - break; - case msrNote::kChordMemberNote: - fScoreChordNotesCounter++; - break; - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - fScoreTupletNotesCounter++; - break; - } // switch -} - -void msr2SummaryVisitor::visitEnd (S_msrNote& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting " << - msrNote::noteKindAsString ( - elt->getNoteKind ()) << - " msrNote" << - endl; - } - - switch (elt->getNoteKind ()) { // JMI - case msrNote::k_NoNoteKind: - break; - case msrNote::kRestNote: - break; - case msrNote::kSkipNote: - break; - case msrNote::kUnpitchedNote: - break; - case msrNote::kStandaloneNote: - break; - case msrNote::kDoubleTremoloMemberNote: - break; - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - break; - case msrNote::kChordMemberNote: - break; - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - break; - } // switch -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrStem& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrStem" << endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrStem& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrStem" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrBeam& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrBeam" << endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrBeam& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrBeam" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrChord& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrChord" << - endl; - } - - fScoreChordsCounter++; -} - -void msr2SummaryVisitor::visitEnd (S_msrChord& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrChord" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrTuplet& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrTuplet" << - endl; - } - - fScoreTupletsCounter++; -} - -void msr2SummaryVisitor::visitEnd (S_msrTuplet& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrTuplet" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrSlur& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrSlur" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrSlur& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrSlur" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrBarline& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrBarline" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrBarline& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrBarline" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrBarNumberCheck& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrBarNumberCheck" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrBarNumberCheck& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrBarNumberCheck" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrLineBreak& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrLineBreak" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrLineBreak& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrLineBreak" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrRepeat& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrRepeat" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrRepeat& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrRepeat" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrVarValAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrVarValAssoc" << - endl; - } - - fMsrSummaryOutputStream << - "VarValAssoc" << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - fMsrSummaryOutputStream << - setw (fieldWidth) << - "varValAssocKind" << " : " << - "\"" << - elt->varValAssocKindAsString () << - "\"" << - endl << - - setw (fieldWidth) << - "variableValue" << " : " << - "\"" << elt->getVariableValue () << "\"" << - endl << - endl; - - gIndenter--; -} - -void msr2SummaryVisitor::visitEnd (S_msrVarValAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrVarValAssoc" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrVarValsListAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrVarValsListAssoc" << - endl; - } - - fMsrSummaryOutputStream << - "VarValsListAssoc" << - endl; - - gIndenter++; - - const int fieldWidth = 21; - - fMsrSummaryOutputStream << left << - setw (fieldWidth) << - "varValsListAssocKind" << " : " << - "\"" << - elt->varValsListAssocKindAsString () << - "\"" << - endl << - - setw (fieldWidth) << - "varValsListAssocValues" << " : " << - "'" << elt->varValsListAssocValuesAsString () << "'" << - endl << - endl; - - gIndenter--; -} - -void msr2SummaryVisitor::visitEnd (S_msrVarValsListAssoc& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrVarValsListAssoc" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrScaling& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrScaling" << - endl; - } - - fMsrSummaryOutputStream << - elt; -} - -void msr2SummaryVisitor::visitEnd (S_msrScaling& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrScaling" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrPageLayout& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrPageLayout" << - endl; - } - - fMsrSummaryOutputStream << elt << endl; -} - -void msr2SummaryVisitor::visitEnd (S_msrPageLayout& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrPageLayout" << - endl; - } -} - -//________________________________________________________________________ -void msr2SummaryVisitor::visitStart (S_msrMidiTempo& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> Start visiting msrMidiTempo" << - endl; - } -} - -void msr2SummaryVisitor::visitEnd (S_msrMidiTempo& elt) -{ - if (gMsrOah->fTraceMsrVisitors) { - fMsrSummaryOutputStream << - "--> End visiting msrMidiTempo" << - endl; - } -} - - -} // namespace diff --git a/src/lilypond/msr2Summary.h b/src/lilypond/msr2Summary.h deleted file mode 100644 index feb2e6144..000000000 --- a/src/lilypond/msr2Summary.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msr2Summary___ -#define ___msr2Summary___ - -#include "msr.h" - -#include "msrOah.h" - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class msr2SummaryVisitor : - - public visitor, - - // parts & part groups - - public visitor, - - public visitor, - - // staves - - public visitor, - - public visitor, - - // lyrics - - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - - public visitor - -{ - public: - - msr2SummaryVisitor ( - S_msrOah& msrOpts, - indentedOstream& ios); - - virtual ~msr2SummaryVisitor (); - - void printSummaryFromMsrScore ( - const S_msrScore& score); - - protected: - - virtual void visitStart (S_msrScore& elt); - virtual void visitEnd (S_msrScore& elt); - - virtual void visitStart (S_msrPartGroup& elt); - virtual void visitEnd (S_msrPartGroup& elt); - - virtual void visitStart (S_msrPart& elt); - virtual void visitEnd (S_msrPart& elt); - - virtual void visitStart (S_msrStaff& elt); - virtual void visitEnd (S_msrStaff& elt); - - virtual void visitStart (S_msrVoice& elt); - virtual void visitEnd (S_msrVoice& elt); - - virtual void visitStart (S_msrStanza& elt); - virtual void visitEnd (S_msrStanza& elt); - - virtual void visitStart (S_msrSyllable& elt); - virtual void visitEnd (S_msrSyllable& elt); - - virtual void visitStart (S_msrClef& elt); - virtual void visitEnd (S_msrClef& elt); - - virtual void visitStart (S_msrKey& elt); - virtual void visitEnd (S_msrKey& elt); - - virtual void visitStart (S_msrTime& elt); - virtual void visitEnd (S_msrTime& elt); - - virtual void visitStart (S_msrTempo& elt); - virtual void visitEnd (S_msrTempo& elt); - - virtual void visitStart (S_msrSegment& elt); - virtual void visitEnd (S_msrSegment& elt); - - virtual void visitStart (S_msrArticulation& elt); - virtual void visitEnd (S_msrArticulation& elt); - - virtual void visitStart (S_msrDynamics& elt); - virtual void visitEnd (S_msrDynamics& elt); - - virtual void visitStart (S_msrWedge& elt); - virtual void visitEnd (S_msrWedge& elt); - - virtual void visitStart (S_msrGraceNotesGroup& elt); - virtual void visitEnd (S_msrGraceNotesGroup& elt); - - virtual void visitStart (S_msrNote& elt); - virtual void visitEnd (S_msrNote& elt); - - virtual void visitStart (S_msrStem& elt); - virtual void visitEnd (S_msrStem& elt); - - virtual void visitStart (S_msrBeam& elt); - virtual void visitEnd (S_msrBeam& elt); - - virtual void visitStart (S_msrChord& elt); - virtual void visitEnd (S_msrChord& elt); - - virtual void visitStart (S_msrTuplet& elt); - virtual void visitEnd (S_msrTuplet& elt); - - virtual void visitStart (S_msrSlur& elt); - virtual void visitEnd (S_msrSlur& elt); - - virtual void visitStart (S_msrBarline& elt); - virtual void visitEnd (S_msrBarline& elt); - - virtual void visitStart (S_msrBarNumberCheck& elt); - virtual void visitEnd (S_msrBarNumberCheck& elt); - - virtual void visitStart (S_msrLineBreak& elt); - virtual void visitEnd (S_msrLineBreak& elt); - - virtual void visitStart (S_msrRepeat& elt); - virtual void visitEnd (S_msrRepeat& elt); - - virtual void visitStart (S_msrVarValAssoc& elt); - virtual void visitEnd (S_msrVarValAssoc& elt); - virtual void visitStart (S_msrVarValsListAssoc& elt); - virtual void visitEnd (S_msrVarValsListAssoc& elt); - - virtual void visitStart (S_msrScaling& elt); - virtual void visitEnd (S_msrScaling& elt); - - virtual void visitStart (S_msrPageLayout& elt); - virtual void visitEnd (S_msrPageLayout& elt); - - virtual void visitStart (S_msrMidiTempo& elt); - virtual void visitEnd (S_msrMidiTempo& elt); - - private: - - S_msrOah fMsrOah; - - indentedOstream& fMsrSummaryOutputStream; - - // score - // ------------------------------------------------------ - - // part groups - // ------------------------------------------------------ - - int fPartGroupsCounter; - - // parts - // ------------------------------------------------------ - - int fPartsCounter; - - // staves - // ------------------------------------------------------ - - int fStavesCounter; - - // prevent clef, key and time from being handled twice - bool fOnGoingStaff; - - // voices - // ------------------------------------------------------ - - int fVoicesCounter; - - // stanzas - // ------------------------------------------------------ - - int fStanzasCounter; - - // notes - // ------------------------------------------------------ - - int fScoreUnpitchedNotesCounter; - int fScoreStandaloneNotesCounter; - int fScoreRestNotesCounter; - int fScoreSkipNotesCounter; - int fScoreDoubleTremoloNotesCounter; - int fScoreGraceNotesGroupCounter; - - // chords - // ------------------------------------------------------ - - int fScoreChordNotesCounter; - int fScoreChordsCounter; - - // tuplets - // ------------------------------------------------------ - - int fScoreTupletNotesCounter; - int fScoreTupletsCounter; -}; - - -} - - -#endif diff --git a/src/lilypond/msrAfterGraceNotes.cpp b/src/lilypond/msrAfterGraceNotes.cpp deleted file mode 100644 index 7d6fefe2f..000000000 --- a/src/lilypond/msrAfterGraceNotes.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrAfterGraceNotesGroupContents msrAfterGraceNotesGroupContents::create ( - int inputLineNumber, - S_msrVoice afterGraceNotesGroupContentsVoiceUpLink) -{ - msrAfterGraceNotesGroupContents* o = - new msrAfterGraceNotesGroupContents ( - inputLineNumber, - afterGraceNotesGroupContentsVoiceUpLink); - assert(o!=0); - - return o; -} - -msrAfterGraceNotesGroupContents::msrAfterGraceNotesGroupContents ( - int inputLineNumber, - S_msrVoice afterGraceNotesGroupContentsVoiceUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert( - afterGraceNotesGroupContentsVoiceUpLink != nullptr, - "afterGraceNotesGroupContentsVoiceUpLink is null"); - - // set after notes contents's voice upLink - fAfterGraceNotesGroupContentsVoiceUpLink = - afterGraceNotesGroupContentsVoiceUpLink; -} - -msrAfterGraceNotesGroupContents::~msrAfterGraceNotesGroupContents () -{} - -S_msrPart msrAfterGraceNotesGroupContents::fetchAfterGraceNotesGroupContentsPartUpLink () const -{ - return - fAfterGraceNotesGroupContentsVoiceUpLink-> - fetchVoicePartUpLink (); -} - -S_msrAfterGraceNotesGroupContents msrAfterGraceNotesGroupContents::createAfterGraceNotesGroupContentsNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Creating a newborn clone of after grace notes group" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrAfterGraceNotesGroupContents - newbornClone = - msrAfterGraceNotesGroupContents::create ( - fInputLineNumber, - containingVoice); - - return newbornClone; -} - -void msrAfterGraceNotesGroupContents::appendNoteToAfterGraceNotesGroupContents ( - S_msrNote note) -{ - fAfterGraceNotesGroupContentsNotesList.push_back (note); -} - -void msrAfterGraceNotesGroupContents::appendNoteToAfterGraceNotesGroupContents ( - S_msrChord chord) -{ - fAfterGraceNotesGroupContentsNotesList.push_back (chord); -} - -void msrAfterGraceNotesGroupContents::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrAfterGraceNotesGroupContents::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrAfterGraceNotesGroupContents elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrAfterGraceNotesGroupContents::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrAfterGraceNotesGroupContents::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrAfterGraceNotesGroupContents::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrAfterGraceNotesGroupContents elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrAfterGraceNotesGroupContents::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrAfterGraceNotesGroupContents::browseData (basevisitor* v) -{ - list::const_iterator i; - - for ( - i=fAfterGraceNotesGroupContentsNotesList.begin (); - i!=fAfterGraceNotesGroupContentsNotesList.end (); - i++ - ) { - // browse the note - msrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string msrAfterGraceNotesGroupContents::asShortString () const -{ - stringstream s; - - s << - "AfterGraceNotesGroupContents" << - ", " << - singularOrPlural ( - fAfterGraceNotesGroupContentsNotesList.size (), "note", "notes"); - - - if (fAfterGraceNotesGroupContentsNotesList.size ()) { - list::const_iterator - iBegin = fAfterGraceNotesGroupContentsNotesList.begin (), - iEnd = fAfterGraceNotesGroupContentsNotesList.end (), - i = iBegin; - - for ( ; ; ) { - s << (*i)->asShortString (); - if (++i == iEnd) break; - s << " "; - } // for - } - - return s.str (); -} - -void msrAfterGraceNotesGroupContents::print (ostream& os) const -{ - os << - "AfterGraceNotesGroupContents" << - ", " << - singularOrPlural ( - fAfterGraceNotesGroupContentsNotesList.size (), "note", "notes") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - if (fAfterGraceNotesGroupContentsNotesList.size ()) { - list::const_iterator - iBegin = fAfterGraceNotesGroupContentsNotesList.begin (), - iEnd = fAfterGraceNotesGroupContentsNotesList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrAfterGraceNotesGroupContents& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrAfterGraceNotesGroup msrAfterGraceNotesGroup::create ( - int inputLineNumber, - S_msrElement afterGraceNotesGroupElement, - bool afterGraceNotesGroupIsSlashed, - S_msrVoice afterGraceNotesGroupVoiceUpLink) -{ - msrAfterGraceNotesGroup* o = - new msrAfterGraceNotesGroup ( - inputLineNumber, - afterGraceNotesGroupElement, - afterGraceNotesGroupIsSlashed, - afterGraceNotesGroupVoiceUpLink); - assert(o!=0); - - return o; -} - -msrAfterGraceNotesGroup::msrAfterGraceNotesGroup ( - int inputLineNumber, - S_msrElement afterGraceNotesGroupElement, - bool afterGraceNotesGroupIsSlashed, - S_msrVoice afterGraceNotesGroupVoiceUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert( - afterGraceNotesGroupVoiceUpLink != nullptr, - "afterGraceNotesGroupVoiceUpLink is null"); - - // set after gracenotes group voice upLink - fAfterGraceNotesGroupVoiceUpLink = - afterGraceNotesGroupVoiceUpLink; - - // pupulate this after grace notes group - fAfterGraceNotesGroupElement = - afterGraceNotesGroupElement; - - fAfterGraceNotesGroupIsSlashed = - afterGraceNotesGroupIsSlashed; - - // create the after grace notes contents - fAfterGraceNotesGroupContents = - msrAfterGraceNotesGroupContents::create ( - inputLineNumber, - afterGraceNotesGroupVoiceUpLink); -} - -msrAfterGraceNotesGroup::~msrAfterGraceNotesGroup () -{} - -S_msrPart msrAfterGraceNotesGroup::fetchAfterGraceNotesGroupPartUpLink () const -{ - return - fAfterGraceNotesGroupVoiceUpLink-> - fetchVoicePartUpLink (); -} - -S_msrAfterGraceNotesGroup msrAfterGraceNotesGroup::createAfterGraceNotesGroupNewbornClone ( - S_msrNote noteClone, - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Creating a newborn clone of after grace notes group '" << - asShortString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - noteClone != nullptr, - "noteClone is null"); - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrAfterGraceNotesGroup - newbornClone = - msrAfterGraceNotesGroup::create ( - fInputLineNumber, - noteClone, - fAfterGraceNotesGroupIsSlashed, - containingVoice); - - return newbornClone; -} - -void msrAfterGraceNotesGroup::appendNoteToAfterGraceNotesGroupContents ( - S_msrNote note) -{ - fAfterGraceNotesGroupContents-> - appendNoteToAfterGraceNotesGroupContents ( - note); -} - -void msrAfterGraceNotesGroup::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrAfterGraceNotesGroup::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrAfterGraceNotesGroup elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrAfterGraceNotesGroup::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrAfterGraceNotesGroup::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrAfterGraceNotesGroup::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrAfterGraceNotesGroup elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrAfterGraceNotesGroup::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrAfterGraceNotesGroup::browseData (basevisitor* v) -{ - { - // browse the afterGraceNotesGroup note - msrBrowser browser (v); - browser.browse (*fAfterGraceNotesGroupElement); - } - - { - // browse the afterGraceNotesGroupContents - msrBrowser browser (v); - browser.browse (*fAfterGraceNotesGroupContents); - } -} - -string msrAfterGraceNotesGroup::asShortString () const -{ - stringstream s; - - s << - "AfterGraceNotesGroup " << - ", AfterGraceNotesGroupElement: " << - "JMI ???fAfterGraceNotesGroupElement->asShortString ()" << - ", fAfterGraceNotesGroupContents: " << - fAfterGraceNotesGroupContents->asShortString (); - - return s.str (); -} - -void msrAfterGraceNotesGroup::print (ostream& os) const -{ - os << - "AfterGraceNotesGroup" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - // print the afterGraceNotesGroup element - os << - "Element:" << - endl; - gIndenter++; - os << - fAfterGraceNotesGroupElement; - gIndenter--; - - os << - "afterGraceNotesGroupIsSlashed: " << - booleanAsString (fAfterGraceNotesGroupIsSlashed) << - endl; - - // print the afterGraceNotesGroup contents - os << - fAfterGraceNotesGroupContents; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrAfterGraceNotesGroup& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrAfterGraceNotes_MUT_DEP.h b/src/lilypond/msrAfterGraceNotes_MUT_DEP.h deleted file mode 100644 index e3a996a5e..000000000 --- a/src/lilypond/msrAfterGraceNotes_MUT_DEP.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrAfterGraceNotesGroupContents : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrVoice afterGraceNotesGroupContentsVoiceUpLink); - - SMARTP createAfterGraceNotesGroupContentsNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createAfterGraceNotesGroupContentsDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrAfterGraceNotesGroupContents ( - int inputLineNumber, - S_msrVoice afterGraceNotesGroupContentsVoiceUpLink); - - virtual ~msrAfterGraceNotesGroupContents (); - - public: - - // set and get - // ------------------------------------------------------ - - const list& - getAfterGraceNotesGroupContentsNotesList () - { - return - fAfterGraceNotesGroupContentsNotesList; - } - - // services - // ------------------------------------------------------ - - // upLinks - S_msrPart fetchAfterGraceNotesGroupContentsPartUpLink () const; - - // notes - void appendNoteToAfterGraceNotesGroupContents ( - S_msrNote note); - void appendNoteToAfterGraceNotesGroupContents ( - S_msrChord chord); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fAfterGraceNotesGroupContentsVoiceUpLink; - - // the notes list - list - fAfterGraceNotesGroupContentsNotesList; -}; -typedef SMARTP S_msrAfterGraceNotesGroupContents; -EXP ostream& operator<< (ostream& os, const S_msrAfterGraceNotesGroupContents& elt); - -//______________________________________________________________________________ -class msrAfterGraceNotesGroup : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrElement afterGraceNotesGroupElement, - bool afterGraceNotesGroupIsSlashed, - S_msrVoice afterGraceNotesGroupVoiceUpLink); - - SMARTP createAfterGraceNotesGroupNewbornClone ( - S_msrNote noteClone, - S_msrVoice containingVoice); - - SMARTP createAfterGraceNotesGroupDeepCopy ( - S_msrNote noteClone, - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrAfterGraceNotesGroup ( - int inputLineNumber, - S_msrElement afterGraceNotesGroupElement, - bool afterGraceNotesGroupIsSlashed, - S_msrVoice afterGraceNotesGroupVoiceUpLink); - - virtual ~msrAfterGraceNotesGroup (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrElement getAfterGraceNotesGroupElement () const - { return fAfterGraceNotesGroupElement; } - - S_msrAfterGraceNotesGroupContents - getAfterGraceNotesGroupContents () const - { return fAfterGraceNotesGroupContents; } - - // services - // ------------------------------------------------------ - - // upLinks - S_msrPart fetchAfterGraceNotesGroupPartUpLink () const; - - // notes - void appendNoteToAfterGraceNotesGroupContents ( - S_msrNote note); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fAfterGraceNotesGroupVoiceUpLink; - - S_msrElement fAfterGraceNotesGroupElement; - - bool fAfterGraceNotesGroupIsSlashed; - - S_msrAfterGraceNotesGroupContents - fAfterGraceNotesGroupContents; -}; -typedef SMARTP S_msrAfterGraceNotesGroup; -EXP ostream& operator<< (ostream& os, const S_msrAfterGraceNotesGroup& elt); - diff --git a/src/lilypond/msrArpeggiatos.cpp b/src/lilypond/msrArpeggiatos.cpp deleted file mode 100644 index 5c65b81e6..000000000 --- a/src/lilypond/msrArpeggiatos.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrArpeggiatos.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - // JMI ??? - -} diff --git a/src/lilypond/msrArpeggiatos.h b/src/lilypond/msrArpeggiatos.h deleted file mode 100644 index 119badd7f..000000000 --- a/src/lilypond/msrArpeggiatos.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrArpeggiatos___ -#define ___msrArpeggiatos___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ -// JMI ??? - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrArticulations.cpp b/src/lilypond/msrArticulations.cpp deleted file mode 100644 index bf1ee705c..000000000 --- a/src/lilypond/msrArticulations.cpp +++ /dev/null @@ -1,583 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrArticulations.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrArticulation msrArticulation::create ( - int inputLineNumber, - msrArticulationKind articulationKind, - msrPlacementKind articulationPlacementKind) -{ - msrArticulation* o = - new msrArticulation ( - inputLineNumber, - articulationKind, - articulationPlacementKind); - assert (o!=0); - return o; -} - -msrArticulation::msrArticulation ( - int inputLineNumber, - msrArticulationKind articulationKind, - msrPlacementKind articulationPlacementKind) - : msrElement (inputLineNumber) -{ - fArticulationKind = articulationKind; - - fArticulationPlacementKind = articulationPlacementKind; -} - -msrArticulation::~msrArticulation () -{} - -string msrArticulation::articulationKindAsString ( - msrArticulationKind articulationKind) -{ - string result; - - switch (articulationKind) { - case msrArticulation::kAccent: - result = "accent"; - break; - case msrArticulation::kBreathMark: - result = "breathMark"; - break; - case msrArticulation::kCaesura: - result = "caesura"; - break; - case msrArticulation::kSpiccato: - result = "spiccato"; - break; - case msrArticulation::kStaccato: - result = "staccato"; - break; - case msrArticulation::kStaccatissimo: - result = "staccatissimo"; - break; - case msrArticulation::kStress: - result = "stress"; - break; - case msrArticulation::kUnstress: - result = "unstress"; - break; - case msrArticulation::kDetachedLegato: - result = "detachedLegato"; - break; - case msrArticulation::kStrongAccent: - result = "strongAccent"; - break; - case msrArticulation::kTenuto: - result = "tenuto"; - break; - case msrArticulation::kFermata: - result = "fermata"; - break; - case msrArticulation::kArpeggiato: - result = "arpeggiato"; - break; - case msrArticulation::kNonArpeggiato: - result = "nonArpeggiato"; - break; - case msrArticulation::kDoit: - result = "doit"; - break; - case msrArticulation::kFalloff: - result = "falloff"; - break; - case msrArticulation::kPlop: - result = "plop"; - break; - case msrArticulation::kScoop: - result = "scoop"; - break; - } // switch - - return result; -} - -string msrArticulation::articulationKindAsString () const -{ - return - articulationKindAsString ( - fArticulationKind); -} - -string msrArticulation::articulationPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fArticulationPlacementKind); -} - -void msrArticulation::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrArticulation::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrArticulation elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrArticulation::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrArticulation::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrArticulation::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrArticulation elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrArticulation::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrArticulation::browseData (basevisitor* v) -{} - -void msrArticulation::print (ostream& os) const -{ - os << - "Articulation" " " << - articulationKindAsString () << - ", " << - articulationPlacementKindAsString () << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrArticulation& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrFermata msrFermata::create ( - int inputLineNumber, - msrFermataKind fermataKind, - msrFermataTypeKind fermataTypeKind) -{ - msrFermata* o = - new msrFermata ( - inputLineNumber, - fermataKind, - fermataTypeKind); - assert (o!=0); - return o; -} - -msrFermata::msrFermata ( - int inputLineNumber, - msrFermataKind fermataKind, - msrFermataTypeKind fermataTypeKind) - : msrArticulation ( - inputLineNumber, - msrArticulation::kFermata, - kPlacementNone) // temporary, JMI TEMP -{ - fFermataKind = fermataKind; - fFermataTypeKind = fermataTypeKind; -} - -msrFermata::~msrFermata () -{} - -void msrFermata::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFermata::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFermata elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFermata::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrFermata::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFermata::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFermata elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFermata::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrFermata::browseData (basevisitor* v) -{} - -string msrFermata::fermataKindAsString ( - msrFermataKind fermataKind) -{ - string result; - - switch (fermataKind) { - case msrFermata::kNormalFermataKind: - result = "fermata kind: normal"; - break; - case msrFermata::kAngledFermataKind: - result = "fermata kind: angled"; - break; - case msrFermata::kSquareFermataKind: - result = "fermata kind: square"; - break; - } // switch - - return result; -} - -string msrFermata::fermataTypeKindAsString ( - msrFermataTypeKind fermataTypeKind) -{ - string result; - - switch (fermataTypeKind) { - case msrFermata::kFermataTypeNone: - result = "fermataTypeNone"; - break; - case msrFermata::kFermataTypeUpright: - result = "fermataTypeUpright"; - break; - case msrFermata::kFermataTypeInverted: - result = "fermataTypeInverted"; - break; - } // switch - - return result; -} - -string msrFermata::asString () const -{ - stringstream s; - - s << - "Fermata" << - ", " << - fermataKindAsString (fFermataKind) << - ", " << - fermataTypeKindAsString (fFermataTypeKind) << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrFermata::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrFermata& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrArpeggiato msrArpeggiato::create ( - int inputLineNumber, - msrPlacementKind arpeggiatoPlacementKind, - msrDirectionKind arpeggiatoDirectionKind, - int arpeggiatoNumber) -{ - msrArpeggiato* o = - new msrArpeggiato ( - inputLineNumber, - arpeggiatoPlacementKind, - arpeggiatoDirectionKind, - arpeggiatoNumber); - assert (o!=0); - return o; -} - -msrArpeggiato::msrArpeggiato ( - int inputLineNumber, - msrPlacementKind arpeggiatoPlacementKind, - msrDirectionKind arpeggiatoDirectionKind, - int arpeggiatoNumber) - : msrArticulation ( - inputLineNumber, - kArpeggiato, - arpeggiatoPlacementKind) -{ - fArpeggiatoDirectionKind = arpeggiatoDirectionKind; - - fArpeggiatoNumber = arpeggiatoNumber; -} - -msrArpeggiato::~msrArpeggiato () -{} - -string msrArpeggiato::arpeggiatoDirectionKindAsString () const -{ - return - msrDirectionKindAsString (fArpeggiatoDirectionKind); -} - -void msrArpeggiato::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrArpeggiato::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrArpeggiato elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrArpeggiato::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrArpeggiato::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrArpeggiato::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrArpeggiato elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrArpeggiato::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrArpeggiato::browseData (basevisitor* v) -{} - -void msrArpeggiato::print (ostream& os) const -{ - os << - "Arpeggiato" " " << - articulationKindAsString () << - ", " << - articulationPlacementKindAsString () << - ", " << - arpeggiatoDirectionKindAsString () << - ", number: " << - fArpeggiatoNumber << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrArpeggiato& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrNonArpeggiato msrNonArpeggiato::create ( - int inputLineNumber, - msrPlacementKind nonArpeggiatoPlacementKind, - msrNonArpeggiatoTypeKind nonArpeggiatoTypeKind, - int nonArpeggiatoNumber) -{ - msrNonArpeggiato* o = - new msrNonArpeggiato ( - inputLineNumber, - nonArpeggiatoPlacementKind, - nonArpeggiatoTypeKind, - nonArpeggiatoNumber); - assert (o!=0); - return o; -} - -msrNonArpeggiato::msrNonArpeggiato ( - int inputLineNumber, - msrPlacementKind nonArpeggiatoPlacementKind, - msrNonArpeggiatoTypeKind nonArpeggiatoTypeKind, - int nonArpeggiatoNumber) - : msrArticulation ( - inputLineNumber, - kNonArpeggiato, - nonArpeggiatoPlacementKind) -{ - fNonArpeggiatoTypeKind = nonArpeggiatoTypeKind; - - fNonArpeggiatoNumber = nonArpeggiatoNumber; -} - -msrNonArpeggiato::~msrNonArpeggiato () -{} - -string msrNonArpeggiato::nonArpeggiatoTypeKindAsString ( - msrNonArpeggiatoTypeKind nonArpeggiatoTypeKind) -{ - string result; - - switch (nonArpeggiatoTypeKind) { - case msrNonArpeggiato::kNonArpeggiatoTypeNone: - result = "nonArpeggiatoTypeNone"; - break; - case msrNonArpeggiato::kNonArpeggiatoTypeTop: - result = "nonArpeggiatoTypeTop"; - break; - case msrNonArpeggiato::kNonArpeggiatoTypeBottom: - result = "nonArpeggiatoTypeBottom"; - break; - } // switch - - return result; -} - -string msrNonArpeggiato::nonArpeggiatoTypeKindAsString () const -{ - return - nonArpeggiatoTypeKindAsString (fNonArpeggiatoTypeKind); -} - -void msrNonArpeggiato::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrNonArpeggiato::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrNonArpeggiato elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrNonArpeggiato::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrNonArpeggiato::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrNonArpeggiato::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrNonArpeggiato elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrNonArpeggiato::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrNonArpeggiato::browseData (basevisitor* v) -{} - -void msrNonArpeggiato::print (ostream& os) const -{ - os << - "NonArpeggiato" " " << - articulationKindAsString () << - ", " << - articulationPlacementKindAsString () << - ", " << - nonArpeggiatoTypeKindAsString () << - ", number: " << - fNonArpeggiatoNumber << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrNonArpeggiato& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrArticulations.h b/src/lilypond/msrArticulations.h deleted file mode 100644 index 3d9254e61..000000000 --- a/src/lilypond/msrArticulations.h +++ /dev/null @@ -1,359 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrArticulations___ -#define ___msrArticulations___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrArticulation : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrArticulationKind { - kAccent, kBreathMark, kCaesura, - kSpiccato, - kStaccato, kStaccatissimo, - kStress, kUnstress, - kDetachedLegato, - kStrongAccent, kTenuto, - kFermata, // barline ??? JMI - kArpeggiato, kNonArpeggiato, - kDoit, kFalloff, kPlop, kScoop}; - - static string articulationKindAsString ( - msrArticulationKind articulationKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrArticulationKind articulationKind, - msrPlacementKind articulationPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrArticulation ( - int inputLineNumber, - msrArticulationKind articulationKind, - msrPlacementKind articulationPlacementKind); - - virtual ~msrArticulation (); - - public: - - // set and get - // ------------------------------------------------------ - - msrArticulationKind getArticulationKind () const - { return fArticulationKind; } - - msrPlacementKind getArticulationPlacementKind () const - { return fArticulationPlacementKind; } - - // services - // ------------------------------------------------------ - - virtual string articulationKindAsString () const; - - virtual string articulationPlacementKindAsString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - protected: - - // fields - // ------------------------------------------------------ - - msrArticulationKind fArticulationKind; - - msrPlacementKind fArticulationPlacementKind; -}; -typedef SMARTP S_msrArticulation; -EXP ostream& operator<< (ostream& os, const S_msrArticulation& elt); - -//______________________________________________________________________________ -class msrFermata : public msrArticulation -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrFermataKind { - kNormalFermataKind, kAngledFermataKind, kSquareFermataKind}; - - static string fermataKindAsString ( - msrFermataKind fermataKind); - - enum msrFermataTypeKind { - kFermataTypeNone, - kFermataTypeUpright, kFermataTypeInverted }; - - static string fermataTypeKindAsString ( - msrFermataTypeKind fermataTypeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrFermataKind fermataKind, - msrFermataTypeKind fermataTypeKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrFermata ( - int inputLineNumber, - msrFermataKind fermataKind, - msrFermataTypeKind fermataTypeKind); - - virtual ~msrFermata (); - - public: - - // set and get - // ------------------------------------------------------ - - msrFermataKind getFermataKind () const - { return fFermataKind; } - - msrFermataTypeKind getFermataTypeKind () const - { return fFermataTypeKind; } - - // services - // ------------------------------------------------------ - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrFermataKind fFermataKind; - - msrFermataTypeKind fFermataTypeKind; -}; -typedef SMARTP S_msrFermata; -EXP ostream& operator<< (ostream& os, const S_msrFermata& elt); - -//______________________________________________________________________________ -class msrArpeggiato : public msrArticulation -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrPlacementKind arpeggiatoPlacementKind, - msrDirectionKind arpeggiatoDirectionKind, - int arpeggiatoNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrArpeggiato ( - int inputLineNumber, - msrPlacementKind arpeggiatoPlacementKind, - msrDirectionKind arpeggiatoDirectionKind, - int arpeggiatoNumber); - - virtual ~msrArpeggiato (); - - public: - - // set and get - // ------------------------------------------------------ - - msrDirectionKind getArpeggiatoDirectionKind () const - { return fArpeggiatoDirectionKind; } - - int getArpeggiatoNumber () const - { return fArpeggiatoNumber; } - - // services - // ------------------------------------------------------ - - virtual string arpeggiatoDirectionKindAsString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrDirectionKind fArpeggiatoDirectionKind; - - int fArpeggiatoNumber; -}; -typedef SMARTP S_msrArpeggiato; -EXP ostream& operator<< (ostream& os, const S_msrArpeggiato& elt); - -//______________________________________________________________________________ -class msrNonArpeggiato : public msrArticulation -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrNonArpeggiatoTypeKind { - kNonArpeggiatoTypeNone, - kNonArpeggiatoTypeTop, kNonArpeggiatoTypeBottom }; - - static string nonArpeggiatoTypeKindAsString ( - msrNonArpeggiatoTypeKind nonArpeggiatoTypeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrPlacementKind nonArpeggiatoPlacementKind, - msrNonArpeggiatoTypeKind nonArpeggiatoTypeKind, - int nonArpeggiatoNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrNonArpeggiato ( - int inputLineNumber, - msrPlacementKind nonArpeggiatoPlacementKind, - msrNonArpeggiatoTypeKind nonArpeggiatoTypeKind, - int nonArpeggiatoNumber); - - virtual ~msrNonArpeggiato (); - - public: - - // set and get - // ------------------------------------------------------ - - msrNonArpeggiatoTypeKind - getNonArpeggiatoTypeKind () const - { return fNonArpeggiatoTypeKind; } - - int getNonArpeggiatoNumber () const - { return fNonArpeggiatoNumber; } - - // services - // ------------------------------------------------------ - - virtual string nonArpeggiatoTypeKindAsString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrNonArpeggiatoTypeKind - fNonArpeggiatoTypeKind; - - int fNonArpeggiatoNumber; -}; -typedef SMARTP S_msrNonArpeggiato; -EXP ostream& operator<< (ostream& os, const S_msrNonArpeggiato& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrBars.cpp b/src/lilypond/msrBars.cpp deleted file mode 100644 index c8b511cf0..000000000 --- a/src/lilypond/msrBars.cpp +++ /dev/null @@ -1,833 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrBars.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrBarCheck msrBarCheck::create ( - int inputLineNumber) -{ - msrBarCheck* o = - new msrBarCheck ( - inputLineNumber); - assert(o!=0); - return o; -} - -S_msrBarCheck msrBarCheck::createWithNextBarPuristNumber ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber) -{ - msrBarCheck* o = - new msrBarCheck ( - inputLineNumber, - nextBarOriginalNumber, - nextBarPuristNumber); - assert(o!=0); - return o; -} - -msrBarCheck::msrBarCheck ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - gLogOstream << - "Creating a bar check without next bar number" << - endl; - } -#endif -} - -msrBarCheck::msrBarCheck ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber) - : msrMeasureElement (inputLineNumber) -{ - fNextBarOriginalNumber = nextBarOriginalNumber; - fNextBarPuristNumber = nextBarPuristNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - gLogOstream << - "Creating a bar check" << - " with next bar original number '" << - nextBarOriginalNumber << - " and next bar purist number '" << - fNextBarPuristNumber << - "'" << - endl; - } -#endif -} - -msrBarCheck::~msrBarCheck () -{} - -void msrBarCheck::setNextBarPuristNumber (int puristNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - gLogOstream << - "Setting bar check next bar number to '" << - puristNumber << - "'" << - endl; - } -#endif - - fNextBarPuristNumber = puristNumber; -} - -void msrBarCheck::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBarCheck::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBarCheck elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBarCheck::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBarCheck::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBarCheck::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBarCheck elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBarCheck::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBarCheck::browseData (basevisitor* v) -{} - -string msrBarCheck::asString () const -{ - stringstream s; - - s << - "BarCheck" << - ", nextBarOriginalNumber = \"" << fNextBarOriginalNumber << "\"" << - ", nextBarPuristNumber = \"" << fNextBarPuristNumber << "\"" << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrBarCheck::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrBarCheck& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrBarNumberCheck msrBarNumberCheck::create ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber) -{ - msrBarNumberCheck* o = - new msrBarNumberCheck ( - inputLineNumber, - nextBarOriginalNumber, - nextBarPuristNumber); - assert(o!=0); - return o; -} - -msrBarNumberCheck::msrBarNumberCheck ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber) - : msrMeasureElement (inputLineNumber) -{ - fNextBarOriginalNumber = nextBarOriginalNumber; - fNextBarPuristNumber = nextBarPuristNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresNumbers) { - gLogOstream << - "Creating a bar number check" << - " with next bar original number '" << - nextBarOriginalNumber << - " and next bar purist number '" << - fNextBarPuristNumber << - "'" << - endl; - } -#endif -} - -msrBarNumberCheck::~msrBarNumberCheck () -{} - -void msrBarNumberCheck::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBarNumberCheck::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBarNumberCheck elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBarNumberCheck::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBarNumberCheck::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBarNumberCheck::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBarNumberCheck elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBarNumberCheck::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBarNumberCheck::browseData (basevisitor* v) -{} - -string msrBarNumberCheck::asString () const -{ - stringstream s; - - s << - "BarNumberCheck" << - ", nextBarOriginalNumber = \"" << fNextBarOriginalNumber << "\"" << - ", nextBarPuristNumber = \"" << fNextBarPuristNumber << "\""; - - return s.str (); -} - -void msrBarNumberCheck::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrBarNumberCheck& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrBarline msrBarline::create ( - int inputLineNumber, - msrBarlineLocationKind barlineLocationKind, - msrBarlineStyleKind barlineStyleKind, - msrBarlineRepeatDirectionKind barlineRepeatDirectionKind, - msrBarlineEndingTypeKind barlineEndingTypeKind, - string endingNumber, - int barlineTimes, - msrBarlineCategoryKind barlineCategoryKind, - msrBarlineHasSegnoKind barlineHasSegnoKind, - msrBarlineHasCodaKind barlineHasCodaKind, - msrBarlineRepeatWingedKind barlineRepeatWingedKind) -{ - msrBarline* o = - new msrBarline ( - inputLineNumber, - barlineLocationKind, - barlineStyleKind, - barlineRepeatDirectionKind, - barlineEndingTypeKind, - endingNumber, - barlineTimes, - barlineCategoryKind, - barlineHasSegnoKind, - barlineHasCodaKind, - barlineRepeatWingedKind); - assert(o!=0); - return o; -} - -msrBarline::msrBarline ( - int inputLineNumber, - msrBarlineLocationKind barlineLocationKind, - msrBarlineStyleKind barlineStyleKind, - msrBarlineRepeatDirectionKind barlineRepeatDirectionKind, - msrBarlineEndingTypeKind barlineEndingTypeKind, - string endingNumber, - int barlineTimes, - msrBarlineCategoryKind barlineCategoryKind, - msrBarlineHasSegnoKind barlineHasSegnoKind, - msrBarlineHasCodaKind barlineHasCodaKind, - msrBarlineRepeatWingedKind barlineRepeatWingedKind) - : msrMeasureElement (inputLineNumber) -{ - fLocationKind = barlineLocationKind; - - fStyleKind = barlineStyleKind; - - fRepeatDirectionKind = barlineRepeatDirectionKind; - - fEndingTypeKind = barlineEndingTypeKind; - fEndingNumber = endingNumber; - - fBarlineTimes = barlineTimes; - - fBarlineCategoryKind = barlineCategoryKind; - - fBarlineHasSegnoKind = barlineHasSegnoKind; - fBarlineHasCodaKind = barlineHasCodaKind; - - fRepeatWingedKind = barlineRepeatWingedKind; - - // extract individual numbers from fEndingNumber - // that may contain "1, 2" - fEndingNumbersList = - extractNumbersFromString ( - fEndingNumber, false); // 'true' to debug it -} - -msrBarline::~msrBarline () -{} - -void msrBarline::setBarlineCategory ( - msrBarlineCategoryKind barlineCategoryKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - gLogOstream << - "Setting barline category of " << - this->asString () << - " to '" << - barlineCategoryKindAsString (barlineCategoryKind) << - "'" << - endl; - } -#endif - - fBarlineCategoryKind = barlineCategoryKind; -} - -void msrBarline::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBarline::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBarline elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBarline::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBarline::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBarline::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBarline elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBarline::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBarline::browseData (basevisitor* v) -{} - -string msrBarline::barlineLocationKindAsString ( - msrBarlineLocationKind barlineLocationKind) -{ - string result; - - switch (barlineLocationKind) { - case msrBarline::kBarlineLocationNone: - result = "barlineLocationNone"; - break; - case msrBarline::kBarlineLocationLeft: - result = "barlineLocationLeft"; - break; - case msrBarline::kBarlineLocationMiddle: - result = "barlineLocationMiddle"; - break; - case msrBarline::kBarlineLocationRight: - result = "barlineLocationRight"; - break; - } // switch - - return result; -} - -string msrBarline::barlineCategoryKindAsString ( - msrBarlineCategoryKind barlineCategoryKind) -{ - string result; - - switch (barlineCategoryKind) { - case msrBarline::k_NoBarlineCategory: - result = "noBarlineCategory"; - break; - case msrBarline::kBarlineCategoryStandalone: - result = "barlineCategoryStandalone"; - break; - case msrBarline::kBarlineCategoryRepeatStart: - result = "barlineCategoryRepeatStart"; - break; - case msrBarline::kBarlineCategoryRepeatEnd: - result = "barlineCategoryRepeatEnd"; - break; - case msrBarline::kBarlineCategoryHookedEndingStart: - result = "barlineCategoryHookedEndingStart"; - break; - case msrBarline::kBarlineCategoryHookedEndingEnd: - result = "kBarlineCategoryHookedEndingEnd"; - break; - case msrBarline::kBarlineCategoryHooklessEndingStart: - result = "barlineCategoryHooklessEndingStart"; - break; - case msrBarline::kBarlineCategoryHooklessEndingEnd: - result = "barlineCategoryHooklessEndingEnd"; - break; - } // switch - - return result; -} - -string msrBarline::barlineHasSegnoKindAsString ( - msrBarlineHasSegnoKind barlineHasSegnoKind) -{ - string result; - - switch (barlineHasSegnoKind) { - case msrBarline::kBarlineHasSegnoYes: - result = "barlineHasSegnoYes"; - break; - case msrBarline::kBarlineHasSegnoNo: - result = "barlineHasSegnoNo"; - break; - } // switch - - return result; -} - -string msrBarline::barlineHasCodaKindAsString ( - msrBarlineHasCodaKind barlineHasCodaKind) -{ - string result; - - switch (barlineHasCodaKind) { - case msrBarline::kBarlineHasCodaYes: - result = "barlineHasCodaYes"; - break; - case msrBarline::kBarlineHasCodaNo: - result = "barlineHasCodaNo"; - break; - } // switch - - return result; -} - -string msrBarline::barlineStyleKindAsString ( - msrBarlineStyleKind barlineStyleKind) -{ - string result; - - switch (barlineStyleKind) { - case msrBarline::kBarlineStyleNone: - result = "barlineStyleNone"; - break; - case msrBarline::kBarlineStyleRegular: - result = "barlineStyleRegular"; - break; - case msrBarline::kBarlineStyleDotted: - result = "barlineStyleDotted"; - break; - case msrBarline::kBarlineStyleDashed: - result = "barlineStyleDashed"; - break; - case msrBarline::kBarlineStyleHeavy: - result = "barlineStyleHeavy"; - break; - case msrBarline::kBarlineStyleLightLight: - result = "barlineStyleLightLight"; - break; - case msrBarline::kBarlineStyleLightHeavy: - result = "barlineStyleLightHeavy"; - break; - case msrBarline::kBarlineStyleHeavyLight: - result = "barlineStyleHeavyLight"; - break; - case msrBarline::kBarlineStyleHeavyHeavy: - result = "barlineStyleHeavyHeavy"; - break; - case msrBarline::kBarlineStyleTick: - result = "barlineStyleTick"; - break; - case msrBarline::kBarlineStyleShort: - result = "barlineStyleShort"; - break; - } // switch - - return result; -} - -string msrBarline::barlineEndingTypeKindAsString ( - msrBarlineEndingTypeKind barlineEndingTypeKind) -{ - string result; - - switch (barlineEndingTypeKind) { - case msrBarline::kBarlineEndingNone: - result = "barlineEndingNone"; - break; - case msrBarline::kBarlineEndingTypeStart: - result = "barlineEndingTypeStart"; - break; - case msrBarline::kBarlineEndingTypeStop: - result = "barlineEndingTypeStop"; - break; - case msrBarline::kBarlineEndingTypeDiscontinue: - result = "barlineEndingTypeDiscontinue"; - break; - } // switch - - return result; -} - -string msrBarline::barlineRepeatDirectionKindAsString ( - msrBarlineRepeatDirectionKind barlineRepeatDirectionKind) -{ - string result; - - switch (barlineRepeatDirectionKind) { - case msrBarline::kBarlineRepeatDirectionNone: - result ="barlineRepeatDirectionNone"; - break; - case msrBarline::kBarlineRepeatDirectionForward: - result ="barlineRepeatDirectionForward"; - break; - case msrBarline::kBarlineRepeatDirectionBackward: - result ="barlineRepeatDirectionBackward"; - break; - } // switch - - return result; -} - -string msrBarline::barlineRepeatWingedKindAsString ( - msrBarlineRepeatWingedKind barlineRepeatWingedKind) -{ - string result; - - switch (barlineRepeatWingedKind) { - case msrBarline::kBarlineRepeatWingedNone: - result = "barlineRepeatWingedNone"; - break; - case msrBarline::kBarlineRepeatWingedStraight: - result = "barlineRepeatWingedStraight"; - break; - case msrBarline::kBarlineRepeatWingedCurved: - result = "barlineRepeatWingedCurved"; - break; - case msrBarline::kBarlineRepeatWingedDoubleStraight: - result = "barlineRepeatWingedDoubleStraight"; - break; - case msrBarline::kBarlineRepeatWingedDoubleCurved: - result = "barlineRepeatWingedDoubleCurved"; - break; - } // switch - - return result; -} - -string msrBarline::endingNumbersListAsString () const -{ - stringstream s; - - if (fEndingNumbersList.size ()) { - list::const_iterator - iBegin = fEndingNumbersList.begin (), - iEnd = fEndingNumbersList.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << " "; - } // for - } - - return s.str (); -} - -string msrBarline::asShortString () const -{ - stringstream s; - - s << - "[" - "Barline " << - barlineCategoryKindAsString (fBarlineCategoryKind) << - ", measureNumber " << fMeasureElementMeasureNumber << - ", positionInMeasure " << fMeasureElementPositionInMeasure << - -/* JMI - ", " << - barlineHasSegnoKindAsString ( - fBarlineHasSegnoKind) << - ", " << - barlineHasCodaKindAsString ( - fBarlineHasCodaKind) << - - ", " << - barlineLocationKindAsString (fLocationKind) << - ", " << - barlineStyleKindAsString (fStyleKind) << - ", " << - barlineEndingTypeKindAsString (fEndingTypeKind) << - ", " << - endingNumbersListAsString () << - - ", " << - barlineRepeatDirectionKindAsString (fRepeatDirectionKind) << - ", " << - barlineRepeatWingedKindAsString (fRepeatWingedKind) << - */ - ", " << - fBarlineTimes << " times" << - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -string msrBarline::asString () const -{ - stringstream s; - - s << - "[" - "Barline " << - barlineCategoryKindAsString (fBarlineCategoryKind) << - ", measureNumber " << fMeasureElementMeasureNumber << - ", positionInMeasure " << fMeasureElementPositionInMeasure << - - ", " << - barlineLocationKindAsString (fLocationKind) << - ", " << - barlineStyleKindAsString (fStyleKind) << - - ", " << - barlineRepeatDirectionKindAsString (fRepeatDirectionKind) << - - ", " << - barlineRepeatWingedKindAsString (fRepeatWingedKind) << - - ", " << - barlineEndingTypeKindAsString (fEndingTypeKind) << - ", " << - endingNumbersListAsString () << - - ", barlineTimes: \"" << - fBarlineTimes << "\" times" << - - ", " << - barlineHasSegnoKindAsString ( - fBarlineHasSegnoKind) << - ", " << - barlineHasCodaKindAsString ( - fBarlineHasCodaKind) << - - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -void msrBarline::print (ostream& os) const -{ - os << - "Barline, " << - barlineCategoryKindAsString ( - fBarlineCategoryKind) << - ", measureNumber " << fMeasureElementMeasureNumber << - ", positionInMeasure " << fMeasureElementPositionInMeasure << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 24; - - os << left << - setw (fieldWidth) << - "locationKind" << " : " << - barlineLocationKindAsString (fLocationKind) << - endl << - setw (fieldWidth) << - "styleKind" << " : " << - barlineStyleKindAsString (fStyleKind) << - endl << - - setw (fieldWidth) << - "repeatDirectionKind" << " : " << - barlineRepeatDirectionKindAsString (fRepeatDirectionKind) << - endl << - - setw (fieldWidth) << - "repeatWingedKind" << " : " << - barlineRepeatWingedKindAsString (fRepeatWingedKind) << - endl << - - setw (fieldWidth) << - "endingTypeKind" << " : " << - barlineEndingTypeKindAsString (fEndingTypeKind) << - endl << - setw (fieldWidth) << - "endingNumber" << " : " << - fEndingNumber << - endl << - - setw (fieldWidth) << - "barlineTimes" << " : " << - fBarlineTimes << - endl << - - setw (fieldWidth) << - "barlineCategoryKind" << " : " << - barlineCategoryKindAsString ( - fBarlineCategoryKind) << - endl << - - setw (fieldWidth) << - "barlineHasSegnoKind" << " : " << - barlineHasSegnoKindAsString ( - fBarlineHasSegnoKind) << - endl << - setw (fieldWidth) << - "barlineHasCodaKind" << " : " << - barlineHasCodaKindAsString ( - fBarlineHasCodaKind) << - endl << - - setw (fieldWidth) << - "endingNumbersList" << " : " << - endingNumbersListAsString () << - endl << - - setw (fieldWidth) << - "measureNumber" << " : " << - fMeasureElementMeasureNumber << - endl << - setw (fieldWidth) << - "positionInMeasure" << " : " << - fMeasureElementPositionInMeasure << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrBarline& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrBars.h b/src/lilypond/msrBars.h deleted file mode 100644 index 07a2da6bd..000000000 --- a/src/lilypond/msrBars.h +++ /dev/null @@ -1,412 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrBars___ -#define ___msrBars___ - -#include - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrBarCheck : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - static SMARTP createWithNextBarPuristNumber ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrBarCheck ( - int inputLineNumber); - - msrBarCheck ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber); - - virtual ~msrBarCheck (); - - public: - - // set and get - // ------------------------------------------------------ - - string getNextBarOriginalNumber () const - { return fNextBarOriginalNumber; } - - void setNextBarPuristNumber (int puristNumber); - - int getNextBarPuristNumber () const - { return fNextBarPuristNumber; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fNextBarOriginalNumber; - int fNextBarPuristNumber; -}; -typedef SMARTP S_msrBarCheck; -EXP ostream& operator<< (ostream& os, const S_msrBarCheck& elt); - -//______________________________________________________________________________ -class msrBarNumberCheck : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrBarNumberCheck ( - int inputLineNumber, - string nextBarOriginalNumber, - int nextBarPuristNumber); - - virtual ~msrBarNumberCheck (); - - public: - - // set and get - // ------------------------------------------------------ - - string getNextBarOriginalNumber () const - { return fNextBarOriginalNumber; } - - int getNextBarPuristNumber () const - { return fNextBarPuristNumber; } - - // services - // ------------------------------------------------------ - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fNextBarOriginalNumber; - int fNextBarPuristNumber; -}; -typedef SMARTP S_msrBarNumberCheck; -EXP ostream& operator<< (ostream& os, const S_msrBarNumberCheck& elt); - -//______________________________________________________________________________ -class msrBarline : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - // location - enum msrBarlineLocationKind { - kBarlineLocationNone, - - kBarlineLocationLeft, - kBarlineLocationMiddle, - kBarlineLocationRight }; // by default - - static string barlineLocationKindAsString ( - msrBarlineLocationKind barlineLocationKind); - - // style - enum msrBarlineStyleKind { - kBarlineStyleNone, - - kBarlineStyleRegular, // by default - - kBarlineStyleDotted, kBarlineStyleDashed, kBarlineStyleHeavy, - kBarlineStyleLightLight, kBarlineStyleLightHeavy, - kBarlineStyleHeavyLight, kBarlineStyleHeavyHeavy, - kBarlineStyleTick, kBarlineStyleShort }; - - static string barlineStyleKindAsString ( - msrBarlineStyleKind barlineStyleKind); - - // repeat direction - enum msrBarlineRepeatDirectionKind { - kBarlineRepeatDirectionNone, - kBarlineRepeatDirectionForward, kBarlineRepeatDirectionBackward }; - - static string barlineRepeatDirectionKindAsString ( - msrBarlineRepeatDirectionKind barlineRepeatDirectionKind); - - // ending type - enum msrBarlineEndingTypeKind { - kBarlineEndingNone, - - kBarlineEndingTypeStart, - kBarlineEndingTypeStop, - kBarlineEndingTypeDiscontinue }; - - static string barlineEndingTypeKindAsString ( - msrBarlineEndingTypeKind barlineEndingTypeKind); - - // category - enum msrBarlineCategoryKind { - k_NoBarlineCategory, - - kBarlineCategoryStandalone, - - kBarlineCategoryRepeatStart, kBarlineCategoryRepeatEnd, - - kBarlineCategoryHookedEndingStart, kBarlineCategoryHookedEndingEnd, - kBarlineCategoryHooklessEndingStart, kBarlineCategoryHooklessEndingEnd }; - - static string barlineCategoryKindAsString ( - msrBarlineCategoryKind barlineCategoryKind); - - // segno - enum msrBarlineHasSegnoKind { - kBarlineHasSegnoYes, kBarlineHasSegnoNo}; - - static string barlineHasSegnoKindAsString ( - msrBarlineHasSegnoKind barlineHasSegnoKind); - - // coda - enum msrBarlineHasCodaKind { - kBarlineHasCodaYes, kBarlineHasCodaNo}; - - static string barlineHasCodaKindAsString ( - msrBarlineHasCodaKind barlineHasCodaKind); - - // repeat winged - enum msrBarlineRepeatWingedKind { - kBarlineRepeatWingedNone, - - kBarlineRepeatWingedStraight, kBarlineRepeatWingedCurved, - kBarlineRepeatWingedDoubleStraight, kBarlineRepeatWingedDoubleCurved }; - - static string barlineRepeatWingedKindAsString ( - msrBarlineRepeatWingedKind barlineRepeatWingedKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrBarlineLocationKind barlineLocationKind, - msrBarlineStyleKind barlineStyleKind, - msrBarlineRepeatDirectionKind barlineRepeatDirectionKind, - msrBarlineEndingTypeKind barlineEndingTypeKind, - string endingNumber, - int barlineTimes, - msrBarlineCategoryKind barlineCategoryKind, - msrBarlineHasSegnoKind barlineHasSegnoKind, - msrBarlineHasCodaKind barlineHasCodaKind, - msrBarlineRepeatWingedKind barlineRepeatWingedKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrBarline ( - int inputLineNumber, - msrBarlineLocationKind barlineLocationKind, - msrBarlineStyleKind barlineStyleKind, - msrBarlineRepeatDirectionKind barlineRepeatDirectionKind, - msrBarlineEndingTypeKind barlineEndingTypeKind, - string endingNumber, - int barlineTimes, - msrBarlineCategoryKind barlineCategoryKind, - msrBarlineHasSegnoKind barlineHasSegnoKind, - msrBarlineHasCodaKind barlineHasCodaKind, - msrBarlineRepeatWingedKind barlineRepeatWingedKind); - - virtual ~msrBarline (); - - public: - - // set and get - // ------------------------------------------------------ - - msrBarlineLocationKind - getLocation () const // JMI - { return fLocationKind; } - - msrBarlineStyleKind getBarlineStyleKind () const - { return fStyleKind; } - - msrBarlineRepeatDirectionKind - getRepeatDirection () const - { return fRepeatDirectionKind; } - - msrBarlineRepeatWingedKind - getRepeatWinged () const - { return fRepeatWingedKind; } - - msrBarlineEndingTypeKind - getEndingType () const - { return fEndingTypeKind; } - - string getEndingNumber () const - { return fEndingNumber; } - - msrBarlineCategoryKind - getBarlineCategory () const - { return fBarlineCategoryKind; } - - void setBarlineCategory ( - msrBarlineCategoryKind barlineCategoryKind); - - int getBarlineTimes () const - { return fBarlineTimes; } - - msrBarlineHasSegnoKind - getBarlineHasSegnoKind () const - { return fBarlineHasSegnoKind; } - msrBarlineHasCodaKind getBarlineHasCodaKind () const - { return fBarlineHasCodaKind; } - - private: - - // private services - // ------------------------------------------------------ - - const list& getEndingNumbersList () const - { return fEndingNumbersList; } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string endingNumbersListAsString () const; - - string asString () const; - string asShortString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrBarlineLocationKind - fLocationKind; - - msrBarlineStyleKind fStyleKind; - - msrBarlineRepeatDirectionKind - fRepeatDirectionKind; - - msrBarlineRepeatWingedKind - fRepeatWingedKind; - - - - msrBarlineEndingTypeKind - fEndingTypeKind; - string fEndingNumber; // may be "1, 2" - - int fBarlineTimes; - - msrBarlineCategoryKind - fBarlineCategoryKind; - - msrBarlineHasSegnoKind - fBarlineHasSegnoKind; - msrBarlineHasCodaKind fBarlineHasCodaKind; - - // the numbers extracted from fEndingNumber - list fEndingNumbersList; -}; -typedef SMARTP S_msrBarline; -EXP ostream& operator<< (ostream& os, const S_msrBarline& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrBasicTypes.cpp b/src/lilypond/msrBasicTypes.cpp deleted file mode 100644 index fc7f1d8e8..000000000 --- a/src/lilypond/msrBasicTypes.cpp +++ /dev/null @@ -1,19285 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include - -#include // INT_MIN, INT_MAX - -#include -#include - -#include // setw, ... - -#include - -#include "rational.h" - -#include "utilities.h" - -#include "messagesHandling.h" - -#include "msrBasicTypes.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" -#include "lpsrOah.h" - - -namespace MusicXML2 -{ - -// XMLLang -//______________________________________________________________________________ -msrXMLLangKind msrXMLLangKindFromString ( - int inputLineNumber, - string XMLLangString) -{ - msrXMLLangKind - result = kXMLLangIt; // default value - - if (XMLLangString == "it") - result = kXMLLangIt; - else if (XMLLangString == "en") - result = kXMLLangEn; - else if (XMLLangString == "de") - result = kXMLLangDe; - else if (XMLLangString == "fr") - result = kXMLLangFr; - else if (XMLLangString == "ja") - result = kXMLLangJa; - else if (XMLLangString == "la") - result = kXMLLangLa; - else { - if (XMLLangString.size ()) { - stringstream s; - - s << - "xml:lang value '" << XMLLangString << - "' should be 'it', 'en', 'de' or 'fr'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrXMLLangKindAsString ( - msrXMLLangKind XMLLangKind) -{ - string result; - - switch (XMLLangKind) { - case kXMLLangIt: - result = "it"; - break; - case kXMLLangEn: - result = "en"; - break; - case kXMLLangDe: - result = "de"; - break; - case kXMLLangFr: - result = "fr"; - case kXMLLangJa: - result = "ja"; - break; - case kXMLLangLa: - result = "la"; - break; - } // switch - - return result; -} - -// dotted durations -//______________________________________________________________________________ -msrDottedDuration::msrDottedDuration () -{ - fDurationKind = k_NoDuration; - fDotsNumber = -1; -} - -msrDottedDuration::msrDottedDuration ( - msrDurationKind durationKind, - int dotsNumber) -{ - fDurationKind = durationKind; - fDotsNumber = dotsNumber; -} - -msrDottedDuration::~msrDottedDuration () -{} - -rational msrDottedDuration::dottedDurationAsWholeNotes ( - int inputLineNumber) const -{ - // convert duration into whole notes - rational - result = - msrDurationKindAsWholeNotes ( - fDurationKind); - - // take dots into account if any - if (fDotsNumber > 0) { - int dots = fDotsNumber; - - while (dots > 0) { - result *= - rational (3, 2); - result.rationalise (); - - dots--; - } // while - } - - return result; -} - -void msrDottedDuration::print (ostream& os) const -{ - const int fieldWidth = 11; - - os << left << - setw (fieldWidth) << - "durationKind" << " : " << - msrDurationKindAsString (fDurationKind) << - endl << - setw (fieldWidth) << - "dotsNumber" << " : " << fDotsNumber << - endl; -}; - -ostream& operator<< (ostream& os, const msrDottedDuration& elt) -{ - elt.print (os); - return os; -} - -// semitone pitches and absolute octave -//______________________________________________________________________________ -S_msrSemiTonesPitchAndOctave msrSemiTonesPitchAndOctave::create ( - msrSemiTonesPitchKind semiTonesPitchKind, - int relativeOctave) -{ - msrSemiTonesPitchAndOctave* o = - new msrSemiTonesPitchAndOctave ( - semiTonesPitchKind, - relativeOctave); - assert(o!=0); - - return o; -} - -S_msrSemiTonesPitchAndOctave msrSemiTonesPitchAndOctave::createFromString ( - int inputLineNumber, - string theString) -{ - S_msrSemiTonesPitchAndOctave result; - - // decipher theString with a three-number regular expression - string regularExpression ( - "([[:lower:]]+)" - "([,\']*)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "There are " << smSize << " matches" << - " for transposition string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl << - smSize << " elements: "; - - for (unsigned i = 0; i < smSize; ++i) { - gLogOstream << - "[" << sm [i] << "] "; - } // for - - gLogOstream << endl; - } -#endif - - if (smSize == 3) { - // found a well-formed specification, - // need to check its ',' and '\'' contents - string - pitch = sm [1], - octaveIndication = sm [2]; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "--> pitch = \"" << pitch << "\", " << - "--> octaveIndication = \"" << octaveIndication << "\"" << - endl; - } -#endif - - // fetch semitones pitch - msrSemiTonesPitchKind - semiTonesPitchKind = - semiTonesPitchKindFromString ( - pitch); - - // handling ',' and '\'' in octave indication - // middle C, LilyPond's c', starts octave 4, - // thus a single pitch without any octave indication is in octave 3 - int octave = 3; - for (unsigned int i = 0; i < octaveIndication.size (); i++) { - switch (octaveIndication [i]) { - case ',': - if (octave > 3) { - // a '\'' has been found previously - stringstream s; - - s << - "argument \"" << theString << - "\" contains a ',' after a '\\'"; - - oahError (s.str ()); - } - - octave--; - break; - case '\'': - if (octave < 3) { - // a ',' has been found previously - stringstream s; - - s << - "argument \"" << theString << - "\" contains a '\\'' after a ','"; - - oahError (s.str ()); - } - - octave++; - break; - default: - ; - } // switch - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "--> semiTonesPitchKind = \"" << - msrSemiTonesPitchKindAsString ( - semiTonesPitchKind) << "\", " << - "--> octave = " << octave << - endl; - } -#endif - - // create the semiTonesPitchAndOctave - result = - msrSemiTonesPitchAndOctave::create ( - semiTonesPitchKind, - octave); - } - - else { - stringstream s; - - s << - "semitones pitch and octave argument '" << theString << - "' is ill-formed"; - - msrMusicXMLError ( -// msrMusicXMLWarning ( // JMI - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return result; -} - -msrSemiTonesPitchAndOctave::msrSemiTonesPitchAndOctave ( - msrSemiTonesPitchKind semiTonesPitchKind, - int relativeOctave) -{ - fSemiTonesPitchKind = semiTonesPitchKind; - fOctave = relativeOctave; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> Creating pitch and octave '" << - asString () << - "'" << - endl; - } -#endif -} - -msrSemiTonesPitchAndOctave::~msrSemiTonesPitchAndOctave () -{} - -S_msrSemiTonesPitchAndOctave msrSemiTonesPitchAndOctave::createSemiTonesPitchAndOctaveNewbornClone () -{ - S_msrSemiTonesPitchAndOctave - newbornClone = - msrSemiTonesPitchAndOctave::create ( - fSemiTonesPitchKind, - fOctave); - - return newbornClone; -} - -string msrSemiTonesPitchAndOctave::asString () const -{ - stringstream s; - - s << left << - "SemiTonesPitchAndOctave" << - ": " << - "semiTonesPitchKind: " << - msrSemiTonesPitchKindAsString (fSemiTonesPitchKind) << - ", octave: " << fOctave; - - return s.str (); -} - -void msrSemiTonesPitchAndOctave::print (ostream& os) const -{ - os << - "SemiTonesPitchAndOctave" << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - setw (fieldWidth) << - "semiTonesPitchKind" << " : " << - msrSemiTonesPitchKindAsString (fSemiTonesPitchKind) << - endl << - setw (fieldWidth) << - "octave" << " : " << fOctave << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSemiTonesPitchAndOctave& elt) -{ - elt->print (os); - return os; -} - -// durations -//______________________________________________________________________________ -msrDurationKind msrDurationKindFromString ( - int inputLineNumber, - string durationString) -{ - msrDurationKind result = k_NoDuration; - - if (durationString == "maxima") { - result = kMaxima; - } - else if (durationString == "long") { - result = kLong; - } - else if (durationString == "breve") { - result = kBreve; - } - else if (durationString == "whole") { - result = kWhole; - } - else if (durationString == "half") { - result = kHalf; - } - else if (durationString == "quarter") { - result = kQuarter; - } - else if (durationString == "eighth") { - result = kEighth; - } - else if (durationString == "16th") { - result = k16th; - } - else if (durationString == "32nd") { - result = k32nd; - } - else if (durationString == "64th") { - result = k64th; - } - else if (durationString == "128th") { - result = k128th; - } - else if (durationString == "256th") { - result = k256th; - } - else if (durationString == "512th") { - result = k512th; - } - else if (durationString == "1024th") { - result = k1024th; - } - else { - stringstream s; - - s << - "durationString \"" << durationString << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return result; -} - -rational msrDurationKindAsWholeNotes (msrDurationKind durationKind) -{ - rational result; - - switch (durationKind) { - case k_NoDuration: - result = rational (0, 1); - break; - - case k1024th: - result = rational (1, 1024); - break; - case k512th: - result = rational (1, 512); - break; - case k256th: - result = rational (1, 256); - break; - case k128th: - result = rational (1, 128); - break; - case k64th: - result = rational (1, 64); - break; - case k32nd: - result = rational (1, 32); - break; - case k16th: - result = rational (1, 16); - break; - case kEighth: - result = rational (1, 8); - break; - case kQuarter: - result = rational (1, 4); - break; - case kHalf: - result = rational (1, 2); - break; - case kWhole: - result = rational (1, 1); - break; - case kBreve: - result = rational (2, 1); - break; - case kLong: - result = rational (4, 1); - break; - case kMaxima: - result = rational (8, 1); - break; - } // switch - - return result; -} - -msrDurationKind wholeNotesAsDurationKind (rational wholeNotes) -{ - msrDurationKind result = k_NoDuration; - - if (wholeNotes.getNumerator () == 1) { - switch (wholeNotes.getDenominator ()) { - case 1: - result = kWhole; - break; - case 2: - result = kHalf; - break; - case 4: - result = kQuarter; - break; - case 8: - result = kEighth; - break; - case 16: - result = k16th; - break; - case 32: - result = k32nd; - break; - case 64: - result = k64th; - break; - case 128: - result = k128th; - break; - case 256: - result = k256th; - break; - case 512: - result = k512th; - break; - case 1024: - result = k1024th; - break; - default: - ; - } // switch - } - - else if (wholeNotes.getDenominator () == 1) { - switch (wholeNotes.getNumerator ()) { - case 2: - result = kBreve; - break; - case 4: - result = kLong; - break; - case 8: - result = kMaxima; - break; - default: - ; - } // switch - } - - return result; -} - -string msrDurationKindAsString (msrDurationKind durationKind) -{ - string result; - - switch (durationKind) { - case k_NoDuration: - result = "noDuration"; - break; - - case k1024th: - result = "1024"; - break; - case k512th: - result = "512"; - break; - case k256th: - result = "256"; - break; - case k128th: - result = "128"; - break; - case k64th: - result = "64"; - break; - case k32nd: - result = "32"; - break; - case k16th: - result = "16"; - break; - case kEighth: - result = "8"; - break; - case kQuarter: - result = "4"; - break; - case kHalf: - result = "2"; - break; - case kWhole: - result = "1"; - break; - case kBreve: - result = "Breve"; - break; - case kLong: - result = "Long"; - break; - case kMaxima: - result = "Maxima"; - break; - } // switch - - return result; -} - -//_______________________________________________________________________________ -int msrDurationBinaryLogarithm (int duration) -{ - int result = INT_MIN; - -/* -with MusicXML's limitation to 1024th of a whole note, -valid denominators binary logarithms, i.e. their exponent, are: -*/ - - switch (duration) { - case 1: - result = 0; - break; - case 2: - result = 1; - break; - case 4: - result = 2; - break; - case 8: - result = 3; - break; - case 16: - result = 4; - break; - case 32: - result = 5; - break; - case 64: - result = 6; - break; - case 128: - result = 7; - break; - case 256: - result = 8; - break; - case 512: - result = 9; - break; - case 1024: - result = 10; - break; - - default: - ; - } // switch - - return result; -} - -//_______________________________________________________________________________ -int msrNumberOfDots (int n) -{ - int result = INT_MIN; - - switch (n) { - case 1: - result = 0; - break; - case 3: - result = 1; - break; - case 7: - result = 2; - break; - case 15: - result = 3; - break; - case 31: - result = 4; - break; - case 63: - result = 5; - break; - case 127: - result = 6; - break; - case 255: - result = 7; - break; - case 511: - result = 8; - break; - case 1023: - result = 9; - break; - - default: - ; - } // switch - - return result; -} - -//_______________________________________________________________________________ -string wholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes, - int& dotsNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes) { - gLogOstream << - "--> wholeNotesAsMsrString() 1 -------------------------------------" << - ", wholeNotes: " << wholeNotes << - ", line " << inputLineNumber << - endl; - } -#endif - - int - numerator = wholeNotes.getNumerator (), - denominator = wholeNotes.getDenominator (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes) { - gLogOstream << - "--> numerator: " << numerator << - endl << - "--> denominator: " << denominator << - endl << - endl; - } -#endif - - if (numerator == 0) { // JMI TEMP - dotsNumber = 0; - return "zero"; - } - else if (numerator < 0) { - // sanity check - stringstream s; - - s << - "numerator is not positive in wholeNotesAsMsrString()" << - ", wholeNotes = " << wholeNotes; - - // msrMusicXMLError ( JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); -abort (); - return "???"; - } - - wholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> wholeNotes rationalised: " << wholeNotes << - endl; - } -#endif - - bool - rationalHasBeenSimplified = - wholeNotes.getNumerator () != numerator; // denominators could be used too - - if (rationalHasBeenSimplified) { - numerator = wholeNotes.getNumerator (), - denominator = wholeNotes.getDenominator (); - } - - bool - integralNumberOfWholeNotes = denominator == 1; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> rationalHasBeenSimplified: " << - booleanAsString ( - rationalHasBeenSimplified) << - endl << - "--> integralNumberOfWholeNotes: " << - booleanAsString ( - integralNumberOfWholeNotes) << - endl << - endl; - } -#endif - - /* - augmentation dots add half the preceding duration or increment to the duration: - they constitue a series of frations or the form '(2^n-1) / 2^n', - starting with 3/2, 7/4, 15/8, - that tends towards 2 while always remaining less than two. - - with MusicXML's limitation to 1024th of a whole note, - with LilyPond's limitation to 128th of a whole note, - valid numerators are: - */ - - int numeratorDots = msrNumberOfDots (numerator); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numeratorDots " << " : " << numeratorDots << - endl << - endl; - } -#endif - - /* - valid denominators are powers of 2 - - the rational representing a dotted duration has to be brought - to a value less than two, as explained above - - this is done by changing it denominator in the resulting string: - - whole notes string - 3/1 \breve. - 3/2 1. - 3/4 2. - 3/8 4. - - 7/1 \longa.. - 7/2 \breve.. - 7/4 1.. - 7/8 2.. - - since such resulting denominators can be fractions of wholes notes - as well as multiple thereof, - we'll be better of using binary logarithms for the computations - */ - - int denominatorDurationLog = - msrDurationBinaryLogarithm (denominator); - - if (denominatorDurationLog == INT_MIN) { - string result; - - { - stringstream s; - - s << - 1 << - "*" << - numerator << - "/" << - denominator; - - result = s.str (); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - stringstream s; - - s << - "denominator " << denominator << - " is no power of two between 1 and 128" << - // " is no power of 2 between 1 and 1024" << - ", whole notes duration " << - numerator << "/" << denominator; - - if (rationalHasBeenSimplified) { - s << - " (" << numerator << "/" << denominator << ")" << - endl; - } - - s << - " cannot be represented as a dotted power of 2" << - ", " << - result << - " will be used"; - - // msrMusicXMLError ( JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } -#endif - - return result; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - endl; - } -#endif - - // bring the resulting fraction to be less that two if needed - if (integralNumberOfWholeNotes) { - // adapt the duration to avoid even numerators if can be, - // since dotted durations cannot be recognized otherwise - // 6/1 thus becomes 3 \breve, hence '\longa.' -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> integralNumberOfWholeNotes," - " bringing the faction to be less that 2" << - endl; - } -#endif - - while (numerator % 2 == 0) { - numerator /= 2; - denominatorDurationLog -= 1; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numerator" << " : " << - numerator << - endl << - "--> denominatorDurationLog " << " : " << - denominatorDurationLog << - endl << - endl; - } -#endif - } // while - - // update the number of dots - numeratorDots = msrNumberOfDots (numerator); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numerator" << " : " << - numerator << - endl << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> numeratorDots " << " : " << - numeratorDots << - endl << - endl; - } -#endif - - // take care of the dots - int multiplyingFactor = 1; - - if (numeratorDots >= 0 && denominatorDurationLog >= numeratorDots) { - // take the dots into account -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> taking the dots into account" << - endl; - } -#endif - - denominatorDurationLog -= numeratorDots; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - } - else { - // set the multiplying factor -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> setting the multiplying factor" << - endl; - } -#endif - - // 5/8 becomes 8*5 - - multiplyingFactor = numerator; - numerator = 1; - - /* JMI - multiplyingFactor = numerator; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - - while (multiplyingFactor >= 2) { - // double duration - denominatorDurationLog--; - - // adapt multiplying factor - multiplyingFactor /= 2; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - } // while - */ - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotesDetails) { - gLogOstream << - "--> numerator " << " : " << - numerator << - endl << - "--> numeratorDots " << " : " << - numeratorDots << - endl << - "--> denominatorDurationLog" << " : " << - denominatorDurationLog << - endl << - "--> multiplyingFactor " << " : " << - multiplyingFactor << - endl << - endl; - } -#endif - - // generate the code for the duration - stringstream s; - - switch (denominatorDurationLog) { - case -3: - s << "\\maxima"; - break; - case -2: - s << "\\longa"; - break; - case -1: - s << "\\breve"; - break; - - default: - s << (1 << denominatorDurationLog); - } // switch - - // append the dots if any - if (numeratorDots > 0) { - for (int i = 0; i < numeratorDots; i++) { - s << "."; - } // for - } - - if (multiplyingFactor != 1) { - // append the multiplying factor - s << - "*" << multiplyingFactor; - - /* JMI - if (integralNumberOfWholeNotes) { - s << - "*" << multiplyingFactor; - } - else { - s << - "*" << multiplyingFactor << "/" << 1; // ??? denominator; - } - */ - } - - string result = s.str (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes) { - gLogOstream << - "--> wholeNotesAsMsrString() 2 -------------------------------------" << - ", result: \"" << result << "\"" << - ", numeratorDots" << " : " << numeratorDots << - endl; - } -#endif - - // return the result - dotsNumber = numeratorDots; - - return result; -} - -string wholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes) -{ - int dotsNumber; // not used - - return - wholeNotesAsMsrString ( - inputLineNumber, - wholeNotes, - dotsNumber); -} - -string multipleRestMeasuresWholeNotesAsMsrString ( - int inputLineNumber, // JMI - rational wholeNotes) -{ - stringstream s; - - rational - denominatorAsFraction = - rational ( - 1, - wholeNotes.getDenominator ()); - - int numberOfWholeNotes = - wholeNotes.getNumerator (); - - s << - wholeNotesAsLilypondString ( - inputLineNumber, - denominatorAsFraction); - - if (numberOfWholeNotes != 1) { - s << - "*" << numberOfWholeNotes; - } - - return s.str (); -} - -// tuplet factors -//______________________________________________________________________________ -msrTupletFactor::msrTupletFactor () -{ - fTupletActualNotes = -1; - fTupletNormalNotes = -1; -} - -msrTupletFactor::msrTupletFactor ( - int tupletActualNotes, - int tupletNormalNotes) -{ - fTupletActualNotes = tupletActualNotes; - fTupletNormalNotes = tupletNormalNotes; -} - -msrTupletFactor::msrTupletFactor ( - rational rationalTupletFactor) -{ - fTupletActualNotes = rationalTupletFactor.getNumerator (); - fTupletNormalNotes = rationalTupletFactor.getDenominator (); -} - -msrTupletFactor::~msrTupletFactor () -{} - -string msrTupletFactor::asString () const -{ - stringstream s; - - s << - "'" << - "tupletActualNotes: " << fTupletActualNotes << - ", tupletNormalNotes: " << fTupletNormalNotes << - "'"; - - return s.str (); -} - -void msrTupletFactor::print (ostream& os) const -{ - const int fieldWidth = 11; - - os << left << - setw (fieldWidth) << - "tupletActualNotes" << " : " << fTupletActualNotes << - endl << - setw (fieldWidth) << - "tupletNormalNotes" << " : " << fTupletNormalNotes << - endl; -}; - -ostream& operator<< (ostream& os, const msrTupletFactor& elt) -{ - elt.print (os); - return os; -} - -// intervals -//______________________________________________________________________________ -int msrIntervalKindAsSemiTones ( - msrIntervalKind intervalKind) -{ - int result = INT_MIN; - - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = -1; - break; - case kPerfectUnison: - result = 0; - break; - case kAugmentedUnison: - result = 1; - break; - - case kDiminishedSecond: - result = 0; - break; - case kMinorSecond: - result = 1; - break; - case kMajorSecond: - result = 2; - break; - case kAugmentedSecond: - result = 4; - break; - - case kDiminishedThird: - result = 2; - break; - case kMinorThird: - result = 3; - break; - case kMajorThird: - result = 4; - break; - case kAugmentedThird: - result = 5; - break; - - case kDiminishedFourth: - result = 4; - break; - case kPerfectFourth: - result = 5; - break; - case kAugmentedFourth: - result = 6; - break; - - case kDiminishedFifth: - result = 6; - break; - case kPerfectFifth: - result = 7; - break; - case kAugmentedFifth: - result = 8; - break; - - case kDiminishedSixth: - result = 7; - break; - case kMinorSixth: - result = 8; - break; - case kMajorSixth: - result = 9; - break; - case kAugmentedSixth: - result = 10; - break; - - case kDiminishedSeventh: - result = 9; - break; - case kMinorSeventh: - result = 10; - break; - case kMajorSeventh: - result = 11; - break; - case kAugmentedSeventh: - result = 12; - break; - - case kDiminishedOctave: - result = 11; - break; - case kPerfectOctave: - result = 12; - break; - case kAugmentedOctave: - result = 13; - break; - - case kDiminishedNinth: - result = 12; - break; - case kMinorNinth: - result = 13; - break; - case kMajorNinth: - result = 14; - break; - case kAugmentedNinth: - result = 15; - break; - - case kDiminishedTenth: - result = 14; - break; - case kMinorTenth: - result = 15; - break; - case kMajorTenth: - result = 16; - break; - case kAugmentedTenth: - result = 17; - break; - - case kDiminishedEleventh: - result = 16; - break; - case kPerfectEleventh: - result = 17; - break; - case kAugmentedEleventh: - result = 18; - break; - - case kDiminishedTwelfth: - result = 18; - break; - case kPerfectTwelfth: - result = 19; - break; - case kAugmentedTwelfth: - result = 20; - break; - - case kDiminishedThirteenth: - result = 19; - break; - case kMinorThirteenth: - result = 20; - break; - case kMajorThirteenth: - result = 21; - break; - case kAugmentedThirteenth: - result = 22; - break; - } // switch - - return result; -} - -int msrIntervalAsQuarterTones ( - msrIntervalKind intervalKind) -{ - return - msrIntervalKindAsSemiTones (intervalKind) * 2; -} - -//______________________________________________________________________________ -string msrIntervalKindAsString ( - msrIntervalKind intervalKind) -{ - string result; - - switch (intervalKind) { - case k_NoIntervalKind: - result = "noInterval"; - break; - - case kDiminishedUnisson: - result = "diminishedUnisson"; - break; - case kPerfectUnison: - result = "perfectUnison"; - break; - case kAugmentedUnison: - result = "augmentedUnison"; - break; - - case kDiminishedSecond: - result = "diminishedSecond"; - break; - case kMinorSecond: - result = "minorSecond"; - break; - case kMajorSecond: - result = "majorSecond"; - break; - case kAugmentedSecond: - result = "augmentedSecond"; - break; - - case kDiminishedThird: - result = "diminishedThird"; - break; - case kMinorThird: - result = "minorThird"; - break; - case kMajorThird: - result = "majorThird"; - break; - case kAugmentedThird: - result = "augmentedThird"; - break; - - case kDiminishedFourth: - result = "diminishedFourth"; - break; - case kPerfectFourth: - result = "perfectFourth"; - break; - case kAugmentedFourth: - result = "augmentedFourth"; - break; - - case kDiminishedFifth: - result = "diminishedFifth"; - break; - case kPerfectFifth: - result = "perfectFifth"; - break; - case kAugmentedFifth: - result = "augmentedFifth"; - break; - - case kDiminishedSixth: - result = "diminishedSixth"; - break; - case kMinorSixth: - result = "minorSixth"; - break; - case kMajorSixth: - result = "majorSixth"; - break; - case kAugmentedSixth: - result = "augmentedSixth"; - break; - - case kDiminishedSeventh: - result = "diminishedSeventh"; - break; - case kMinorSeventh: - result = "minorSeventh"; - break; - case kMajorSeventh: - result = "majorSeventh"; - break; - case kAugmentedSeventh: - result = "augmentedSeventh"; - break; - - case kDiminishedOctave: - result = "diminishedOctave"; - break; - case kPerfectOctave: - result = "perfectOctave"; - break; - case kAugmentedOctave: - result = "augmentedOctave"; - break; - - case kDiminishedNinth: - result = "diminishedNinth"; - break; - case kMinorNinth: - result = "minorNinth"; - break; - case kMajorNinth: - result = "majorNinth"; - break; - case kAugmentedNinth: - result = "sugmentedNinth"; - break; - - case kDiminishedTenth: - result = "diminishedTenth"; - break; - case kMinorTenth: - result = "minorTenth"; - break; - case kMajorTenth: - result = "majorTenth"; - break; - case kAugmentedTenth: - result = "augmentedTenth"; - break; - - case kDiminishedEleventh: - result = "diminishedEleventh"; - break; - case kPerfectEleventh: - result = "perfectEleventh"; - break; - case kAugmentedEleventh: - result = "augmentedEleventh"; - break; - - case kDiminishedTwelfth: - result = "diminishedTwelfth"; - break; - case kPerfectTwelfth: - result = "perfectTwelfth"; - break; - case kAugmentedTwelfth: - result = "augmentedTwelfth"; - break; - - case kDiminishedThirteenth: - result = "diminishedThirteenth"; - break; - case kMinorThirteenth: - result = "minorThirteenth"; - break; - case kMajorThirteenth: - result = "majorThirteenth"; - break; - case kAugmentedThirteenth: - result = "augmentedThirteenth"; - break; - } // switch - - return result; -} - -string msrIntervalAsShortString ( - msrIntervalKind intervalKind) -{ - string result; - - switch (intervalKind) { - case k_NoIntervalKind: - result = "noInterval"; - break; - - case kDiminishedUnisson: - result = "bu"; - break; - case kPerfectUnison: - result = "u"; - break; - case kAugmentedUnison: - result = "#u"; - break; - - case kDiminishedSecond: - result = "bb2"; - break; - case kMinorSecond: - result = "b2"; - break; - case kMajorSecond: - result = "2"; - break; - case kAugmentedSecond: - result = "#2"; - break; - - case kDiminishedThird: - result = "bb3"; - break; - case kMinorThird: - result = "b3"; - break; - case kMajorThird: - result = "3"; - break; - case kAugmentedThird: - result = "#3"; - break; - - case kDiminishedFourth: - result = "b4"; - break; - case kPerfectFourth: - result = "4"; - break; - case kAugmentedFourth: - result = "#4"; - break; - - case kDiminishedFifth: - result = "b5"; - break; - case kPerfectFifth: - result = "5"; - break; - case kAugmentedFifth: - result = "#4"; - break; - - case kDiminishedSixth: - result = "bb6"; - break; - case kMinorSixth: - result = "b6"; - break; - case kMajorSixth: - result = "6"; - break; - case kAugmentedSixth: - result = "#6"; - break; - - case kDiminishedSeventh: - result = "b7"; - break; - case kMinorSeventh: - result = "7"; - break; - case kMajorSeventh: - result = "∆7"; - break; - case kAugmentedSeventh: - result = "∆∆7"; - break; - - case kDiminishedOctave: - result = "b8"; - break; - case kPerfectOctave: - result = "8"; - break; - case kAugmentedOctave: - result = "#8"; - break; - - case kDiminishedNinth: - result = "bb9"; - break; - case kMinorNinth: - result = "b9"; - break; - case kMajorNinth: - result = "9"; - break; - case kAugmentedNinth: - result = "#9"; - break; - - case kDiminishedTenth: - result = "bb10"; - break; - case kMinorTenth: - result = "b10"; - break; - case kMajorTenth: - result = "10"; - break; - case kAugmentedTenth: - result = "#10"; - break; - - case kDiminishedEleventh: - result = "b11"; - break; - case kPerfectEleventh: - result = "11"; - break; - case kAugmentedEleventh: - result = "#11"; - break; - - case kDiminishedTwelfth: - result = "b12"; - break; - case kPerfectTwelfth: - result = "12"; - break; - case kAugmentedTwelfth: - result = "#12"; - break; - - case kDiminishedThirteenth: - result = "bb13"; - break; - case kMinorThirteenth: - result = "b13"; - break; - case kMajorThirteenth: - result = "13"; - break; - case kAugmentedThirteenth: - result = "#13"; - break; - } // switch - - return result; -} - -msrIntervalKind invertIntervalKind ( - msrIntervalKind intervalKind) -{ - msrIntervalKind result = k_NoIntervalKind; - - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kAugmentedUnison; - break; - case kPerfectUnison: - result = kPerfectUnison; - break; - case kAugmentedUnison: - result = kDiminishedOctave; - break; - - case kDiminishedSecond: - result = kAugmentedSeventh; - break; - case kMinorSecond: - result = kMajorSeventh; - break; - case kMajorSecond: - result = kMinorSeventh; - break; - case kAugmentedSecond: - result = kDiminishedSeventh; - break; - - case kDiminishedThird: - result = kAugmentedSixth; - break; - case kMinorThird: - result = kMajorSixth; - break; - case kMajorThird: - result = kMinorSixth; - break; - case kAugmentedThird: - result = kDiminishedSixth; - break; - - case kDiminishedFourth: - result = kAugmentedFifth; - break; - case kPerfectFourth: - result = kPerfectFifth; - break; - case kAugmentedFourth: - result = kDiminishedFifth; - break; - - case kDiminishedFifth: - result = kAugmentedFourth; - break; - case kPerfectFifth: - result = kPerfectFourth; - break; - case kAugmentedFifth: - result = kDiminishedFourth; - break; - - case kDiminishedSixth: - result = kAugmentedThird; - break; - case kMinorSixth: - result = kMajorThird; - break; - case kMajorSixth: - result = kMinorThird; - break; - case kAugmentedSixth: - result = kDiminishedThird; - break; - - case kDiminishedSeventh: - result = kAugmentedSecond; - break; - case kMinorSeventh: - result = kMajorSecond; - break; - case kMajorSeventh: - result = kMinorSecond; - break; - case kAugmentedSeventh: - result = kDiminishedSecond; - break; - - case kDiminishedOctave: - result = kAugmentedUnison; - break; - case kPerfectOctave: - result = kPerfectOctave; - break; - case kAugmentedOctave: - result = kDiminishedUnisson; - break; - - case kDiminishedNinth: - result = kAugmentedSeventh; - break; - case kMinorNinth: - result = kMajorSeventh; - break; - case kMajorNinth: - result = kMinorSeventh; - break; - case kAugmentedNinth: - result = kDiminishedSeventh; - break; - - case kDiminishedTenth: - result = kAugmentedSixth; - break; - case kMinorTenth: - result = kMajorSixth; - break; - case kMajorTenth: - result = kMinorSixth; - break; - case kAugmentedTenth: - result = kDiminishedSixth; - break; - - case kDiminishedEleventh: - result = kAugmentedFifth; - break; - case kPerfectEleventh: - result = kPerfectFifth; - break; - case kAugmentedEleventh: - result = kDiminishedFifth; - break; - - case kDiminishedTwelfth: - result = kAugmentedFourth; - break; - case kPerfectTwelfth: - result = kPerfectFourth; - break; - case kAugmentedTwelfth: - result = kDiminishedFourth; - break; - - case kDiminishedThirteenth: - result = kAugmentedThird; - break; - case kMinorThirteenth: - result = kMajorThird; - break; - case kMajorThirteenth: - result = kMinorThird; - break; - case kAugmentedThirteenth: - result = kDiminishedThird; - break; - } // switch - - return result; -} - -int intervalKindAsSemitones ( - msrIntervalKind intervalKind) -{ - int result = INT_MIN; - - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = -1; - break; - case kPerfectUnison: - result = 0; - break; - case kAugmentedUnison: - result = 1; - break; - - case kDiminishedSecond: - result = 0; - break; - case kMinorSecond: - result = 1; - break; - case kMajorSecond: - result = 2; - break; - case kAugmentedSecond: - result = 3; - break; - - case kDiminishedThird: - result = 2; - break; - case kMinorThird: - result = 3; - break; - case kMajorThird: - result = 4; - break; - case kAugmentedThird: - result = 5; - break; - - case kDiminishedFourth: - result = 4; - break; - case kPerfectFourth: - result = 5; - break; - case kAugmentedFourth: - result = 6; - break; - - case kDiminishedFifth: - result = 7; - break; - case kPerfectFifth: - result = 7; - break; - case kAugmentedFifth: - result = 8; - break; - - case kDiminishedSixth: - result = 7; - break; - case kMinorSixth: - result = 8; - break; - case kMajorSixth: - result = 9; - break; - case kAugmentedSixth: - result = 10; - break; - - case kDiminishedSeventh: - result = 9; - break; - case kMinorSeventh: - result = 10; - break; - case kMajorSeventh: - result = 11; - break; - case kAugmentedSeventh: - result = 12; - break; - - case kDiminishedOctave: - result = 11; - break; - case kPerfectOctave: - result = 12; - break; - case kAugmentedOctave: - result = 13; - break; - - case kDiminishedNinth: - result = 12; - break; - case kMinorNinth: - result = 13; - break; - case kMajorNinth: - result = 14; - break; - case kAugmentedNinth: - result = 15; - break; - - case kDiminishedTenth: - result = 14; - break; - case kMinorTenth: - result = 15; - break; - case kMajorTenth: - result = 16; - break; - case kAugmentedTenth: - result = 17; - break; - - case kDiminishedEleventh: - result = 16; - break; - case kPerfectEleventh: - result = 17; - break; - case kAugmentedEleventh: - result = 18; - break; - - case kDiminishedTwelfth: - result = 18; - break; - case kPerfectTwelfth: - result = 19; - break; - case kAugmentedTwelfth: - result = 20; - break; - - case kDiminishedThirteenth: - result = 19; - break; - case kMinorThirteenth: - result = 20; - break; - case kMajorThirteenth: - result = 21; - break; - case kAugmentedThirteenth: - result = 22; - break; - } // switch - - return result; -} - - -/* JMI -msrSemiTonesPitchKind noteAtIntervalKindFromNote ( - msrIntervalKind intervalKind, - msrSemiTonesPitchKind semiTonesPitchKind, - msrAlterationPreferenceKind alterationPreferenceKind) -{ - msrSemiTonesPitchKind result = k_NoSemiTonesPitch_STP; - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - result = k_NoSemiTonesPitch_STP; - break; - - case kB_Sharp_STP: - switch (intervalKind) { - case kDiminishedUnisson: - switch (alterationPreferenceKind) { - case kPreferFlat: - result = kC_Sharp_STP; - break; - case kPreferNatural: - result = kC_Sharp_STP; - break; - case kPreferSharp: - result = kC_Sharp_STP; - break; - } // switch - break; - case kPerfectUnison: - break; - case kAugmentedUnison: - break; - - case kDiminishedSecond: - break; - case kMinorSecond: - break; - case kMajorSecond: - break; - case kAugmentedSecond: - break; - - case kDiminishedThird: - break; - case kMinorThird: - break; - case kMajorThird: - break; - case kAugmentedThird: - break; - - case kDiminishedFourth: - break; - case kPerfectFourth: - break; - case kAugmentedFourth: - break; - - case kDiminishedFifth: - break; - case kPerfectFifth: - break; - case kAugmentedFifth: - break; - - case kDiminishedSixth: - break; - case kMinorSixth: - break; - case kMajorSixth: - break; - case kAugmentedSixth: - break; - - case kDiminishedSeventh: - break; - case kMinorSeventh: - break; - case kMajorSeventh: - break; - case kAugmentedSeventh: - break; - - case kDiminishedOctave: - break; - case kPerfectOctave: - break; - case kAugmentedOctave: - break; - - case kDiminishedNinth: - break; - case kMinorNinth: - break; - case kMajorNinth: - break; - case kAugmentedNinth: - break; - - case kDiminishedTenth: - break; - case kMinorTenth: - break; - case kMajorTenth: - break; - case kAugmentedTenth: - break; - - case kDiminishedEleventh: - break; - case kPerfectEleventh: - break; - case kAugmentedEleventh: - break; - - case kDiminishedTwelfth: - break; - case kPerfectTwelfth: - break; - case kAugmentedTwelfth: - break; - - case kDiminishedThirteenth: - break; - case kMinorThirteenth: - break; - case kMajorThirteenth: - break; - case kAugmentedThirteenth: - break; - } // switch - break; - - case kC_Natural_STP: - break; - case kD_DoubleFlat_STP: - break; - - case kC_Sharp_STP: - break; - case kB_DoubleSharp_STP: - break; - case kD_Flat_STP: - break; - - case kD_Natural_STP: - break; - case kC_DoubleSharp_STP: - break; - case kE_DoubleFlat_STP: - break; - - case kD_Sharp_STP: - break; - case kE_Flat_STP: - break; - - case kE_Natural_STP: - break; - case kD_DoubleSharp_STP: - break; - case kF_Flat_STP: - break; - - case kF_Natural_STP: - break; - case kE_Sharp_STP: - break; - case kG_DoubleFlat_STP: - break; - - case kF_Sharp_STP: - break; - case kE_DoubleSharp_STP: - break; - case kG_Flat_STP: - break; - - case kG_Natural_STP: - break; - case kF_DoubleSharp_STP: - break; - case kA_DoubleFlat_STP: - break; - - case kG_Sharp_STP: - break; - case kA_Flat_STP: - break; - - case kA_Natural_STP: - break; - case kG_DoubleSharp_STP: - break; - case kB_DoubleFlat_STP: - break; - - case kA_Sharp_STP: - break; - case kB_Flat_STP: - break; - - case kB_Natural_STP: - break; - case kA_DoubleSharp_STP: - break; - case kC_Flat_STP: - break; - } // switch - - return result; -} -*/ - -msrSemiTonesPitchKind noteAtIntervalFromSemiTonesPitch ( - int inputLineNumber, - msrIntervalKind intervalKind, - msrSemiTonesPitchKind semiTonesPitchKind) -{ - msrSemiTonesPitchKind result = k_NoSemiTonesPitch_STP; - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - result = k_NoSemiTonesPitch_STP; - break; - - case kC_Flat_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kC_DoubleFlat_STP; - break; - case kPerfectUnison: - result = kC_Flat_STP; - break; - case kAugmentedUnison: - result = kC_Natural_STP; - break; - - case kDiminishedSecond: - result = kD_TripleFlat_STP; - break; - case kMinorSecond: - result = kD_DoubleFlat_STP; - break; - case kMajorSecond: - result = kD_Flat_STP; - break; - case kAugmentedSecond: - result = kD_Natural_STP; - break; - - case kDiminishedThird: - result = kE_DoubleFlat_STP; - break; - case kMinorThird: - result = kE_TripleFlat_STP; - break; - case kMajorThird: - result = kE_Flat_STP; - break; - case kAugmentedThird: - result = kE_Natural_STP; - break; - - case kDiminishedFourth: - result = kF_DoubleFlat_STP; - break; - case kPerfectFourth: - result = kF_Flat_STP; - break; - case kAugmentedFourth: - result = kF_Natural_STP; - break; - - case kDiminishedFifth: - result = kG_DoubleFlat_STP; - break; - case kPerfectFifth: - result = kG_Flat_STP; - break; - case kAugmentedFifth: - result = kG_Natural_STP; - break; - - case kDiminishedSixth: - result = kA_TripleFlat_STP; - break; - case kMinorSixth: - result = kA_DoubleFlat_STP; - break; - case kMajorSixth: - result = kA_Flat_STP; - break; - case kAugmentedSixth: - result = kA_Natural_STP; - break; - - case kDiminishedSeventh: - result = kB_TripleFlat_STP; - break; - case kMinorSeventh: - result = kB_DoubleFlat_STP; - break; - case kMajorSeventh: - result = kB_Flat_STP; - break; - case kAugmentedSeventh: - result = kB_Natural_STP; - break; - - case kDiminishedOctave: - result = kC_DoubleFlat_STP; - break; - case kPerfectOctave: - result = kC_Flat_STP; - break; - case kAugmentedOctave: - result = kC_Natural_STP; - break; - - case kDiminishedNinth: - result = kD_TripleFlat_STP; - break; - case kMinorNinth: - result = kD_DoubleFlat_STP; - break; - case kMajorNinth: - result = kD_Flat_STP; - break; - case kAugmentedNinth: - result = kD_Natural_STP; - break; - - case kDiminishedTenth: - result = kE_TripleFlat_STP; - break; - case kMinorTenth: - result = kE_DoubleFlat_STP; - break; - case kMajorTenth: - result = kE_Flat_STP; - break; - case kAugmentedTenth: - result = kE_Natural_STP; - break; - - case kDiminishedEleventh: - result = kF_DoubleFlat_STP; - break; - case kPerfectEleventh: - result = kF_Flat_STP; - break; - case kAugmentedEleventh: - result = kF_Natural_STP; - break; - - case kDiminishedTwelfth: - result = kG_DoubleFlat_STP; - break; - case kPerfectTwelfth: - result = kG_Flat_STP; - break; - case kAugmentedTwelfth: - result = kG_Natural_STP; - break; - - case kDiminishedThirteenth: - result = kA_TripleFlat_STP; - break; - case kMinorThirteenth: - result = kA_DoubleFlat_STP; - break; - case kMajorThirteenth: - result = kA_Flat_STP; - break; - case kAugmentedThirteenth: - result = kA_Natural_STP; - break; - } // switch - break; - - case kC_Natural_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kC_Flat_STP; - break; - case kPerfectUnison: - result = kC_Natural_STP; - break; - case kAugmentedUnison: - result = kC_Sharp_STP; - break; - - case kDiminishedSecond: - result = kD_DoubleFlat_STP; - break; - case kMinorSecond: - result = kD_Flat_STP; - break; - case kMajorSecond: - result = kD_Natural_STP; - break; - case kAugmentedSecond: - result = kD_Sharp_STP; - break; - - case kDiminishedThird: - result = kE_DoubleFlat_STP; - break; - case kMinorThird: - result = kE_Flat_STP; - break; - case kMajorThird: - result = kE_Natural_STP; - break; - case kAugmentedThird: - result = kE_Sharp_STP; - break; - - case kDiminishedFourth: - result = kF_Flat_STP; - break; - case kPerfectFourth: - result = kF_Natural_STP; - break; - case kAugmentedFourth: - result = kF_Sharp_STP; - break; - - case kDiminishedFifth: - result = kG_Flat_STP; - break; - case kPerfectFifth: - result = kG_Natural_STP; - break; - case kAugmentedFifth: - result = kG_Sharp_STP; - break; - - case kDiminishedSixth: - result = kA_DoubleFlat_STP; - break; - case kMinorSixth: - result = kA_Flat_STP; - break; - case kMajorSixth: - result = kA_Natural_STP; - break; - case kAugmentedSixth: - result = kA_Sharp_STP; - break; - - case kDiminishedSeventh: - result = kB_DoubleFlat_STP; - break; - case kMinorSeventh: - result = kB_Flat_STP; - break; - case kMajorSeventh: - result = kB_Natural_STP; - break; - case kAugmentedSeventh: - result = kB_Sharp_STP; - break; - - case kDiminishedOctave: - result = kC_Flat_STP; - break; - case kPerfectOctave: - result = kC_Natural_STP; - break; - case kAugmentedOctave: - result = kC_Sharp_STP; - break; - - case kDiminishedNinth: - result = kD_DoubleFlat_STP; - break; - case kMinorNinth: - result = kD_Flat_STP; - break; - case kMajorNinth: - result = kD_Natural_STP; - break; - case kAugmentedNinth: - result = kD_Sharp_STP; - break; - - case kDiminishedTenth: - result = kE_DoubleFlat_STP; - break; - case kMinorTenth: - result = kE_Flat_STP; - break; - case kMajorTenth: - result = kE_Natural_STP; - break; - case kAugmentedTenth: - result = kE_Sharp_STP; - break; - - case kDiminishedEleventh: - result = kF_Flat_STP; - break; - case kPerfectEleventh: - result = kF_Natural_STP; - break; - case kAugmentedEleventh: - result = kF_Sharp_STP; - break; - - case kDiminishedTwelfth: - result = kG_Flat_STP; - break; - case kPerfectTwelfth: - result = kG_Natural_STP; - break; - case kAugmentedTwelfth: - result = kG_Sharp_STP; - break; - - case kDiminishedThirteenth: - result = kA_DoubleFlat_STP; - break; - case kMinorThirteenth: - result = kA_Flat_STP; - break; - case kMajorThirteenth: - result = kA_Natural_STP; - break; - case kAugmentedThirteenth: - result = kG_Sharp_STP; - break; - } // switch - break; - - case kC_Sharp_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kC_Natural_STP; - break; - case kPerfectUnison: - result = kC_Sharp_STP; - break; - case kAugmentedUnison: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedSecond: - result = kD_Flat_STP; - break; - case kMinorSecond: - result = kD_Natural_STP; - break; - case kMajorSecond: - result = kD_Sharp_STP; - break; - case kAugmentedSecond: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedThird: - result = kE_Flat_STP; - break; - case kMinorThird: - result = kE_Natural_STP; - break; - case kMajorThird: - result = kE_Sharp_STP; - break; - case kAugmentedThird: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kF_Natural_STP; - break; - case kPerfectFourth: - result = kF_Sharp_STP; - break; - case kAugmentedFourth: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedFifth: - result = kG_Natural_STP; - break; - case kPerfectFifth: - result = kG_Sharp_STP; - break; - case kAugmentedFifth: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kA_Flat_STP; - break; - case kMinorSixth: - result = kA_Natural_STP; - break; - case kMajorSixth: - result = kA_Sharp_STP; - break; - case kAugmentedSixth: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedSeventh: - result = kB_Flat_STP; - break; - case kMinorSeventh: - result = kB_Natural_STP; - break; - case kMajorSeventh: - result = kB_Sharp_STP; - break; - case kAugmentedSeventh: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedOctave: - result = kC_Natural_STP; - break; - case kPerfectOctave: - result = kC_Sharp_STP; - break; - case kAugmentedOctave: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedNinth: - result = kD_Flat_STP; - break; - case kMinorNinth: - result = kD_Natural_STP; - break; - case kMajorNinth: - result = kD_Sharp_STP; - break; - case kAugmentedNinth: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedTenth: - result = kE_Flat_STP; - break; - case kMinorTenth: - result = kE_Natural_STP; - break; - case kMajorTenth: - result = kE_Sharp_STP; - break; - case kAugmentedTenth: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kF_Natural_STP; - break; - case kPerfectEleventh: - result = kF_Sharp_STP; - break; - case kAugmentedEleventh: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedTwelfth: - result = kG_Natural_STP; - break; - case kPerfectTwelfth: - result = kG_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kA_Flat_STP; - break; - case kMinorThirteenth: - result = kA_Natural_STP; - break; - case kMajorThirteenth: - result = kA_Sharp_STP; - break; - case kAugmentedThirteenth: - result = kA_DoubleSharp_STP; - break; - } // switch - break; - - case kD_Flat_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kD_DoubleFlat_STP; - break; - case kPerfectUnison: - result = kD_Flat_STP; - break; - case kAugmentedUnison: - result = kD_Natural_STP; - break; - - case kDiminishedSecond: - result = kE_TripleFlat_STP; - break; - case kMinorSecond: - result = kE_DoubleFlat_STP; - break; - case kMajorSecond: - result = kE_Flat_STP; - break; - case kAugmentedSecond: - result = kE_Natural_STP; - break; - - case kDiminishedThird: - result = kF_DoubleFlat_STP; - break; - case kMinorThird: - result = kF_Flat_STP; - break; - case kMajorThird: - result = kF_Natural_STP; - break; - case kAugmentedThird: - result = kF_Sharp_STP; - break; - - case kDiminishedFourth: - result = kG_DoubleFlat_STP; - break; - case kPerfectFourth: - result = kG_Flat_STP; - break; - case kAugmentedFourth: - result = kG_Natural_STP; - break; - - case kDiminishedFifth: - result = kA_DoubleFlat_STP; - break; - case kPerfectFifth: - result = kA_Flat_STP; - break; - case kAugmentedFifth: - result = kA_Natural_STP; - break; - - case kDiminishedSixth: - result = kB_TripleFlat_STP; - break; - case kMinorSixth: - result = kB_DoubleFlat_STP; - break; - case kMajorSixth: - result = kB_Flat_STP; - break; - case kAugmentedSixth: - result = kB_Natural_STP; - break; - - case kDiminishedSeventh: - result = kC_DoubleFlat_STP; - break; - case kMinorSeventh: - result = kC_Flat_STP; - break; - case kMajorSeventh: - result = kC_Natural_STP; - break; - case kAugmentedSeventh: - result = kC_Sharp_STP; - break; - - case kDiminishedOctave: - result = kD_DoubleFlat_STP; - break; - case kPerfectOctave: - result = kD_Flat_STP; - break; - case kAugmentedOctave: - result = kD_Natural_STP; - break; - - case kDiminishedNinth: - result = kE_TripleFlat_STP; - break; - case kMinorNinth: - result = kE_DoubleFlat_STP; - break; - case kMajorNinth: - result = kE_Flat_STP; - break; - case kAugmentedNinth: - result = kE_Natural_STP; - break; - - case kDiminishedTenth: - result = kF_DoubleFlat_STP; - break; - case kMinorTenth: - result = kF_Flat_STP; - break; - case kMajorTenth: - result = kF_Natural_STP; - break; - case kAugmentedTenth: - result = kF_Sharp_STP; - break; - - case kDiminishedEleventh: - result = kG_DoubleFlat_STP; - break; - case kPerfectEleventh: - result = kG_Flat_STP; - break; - case kAugmentedEleventh: - result = kG_Natural_STP; - break; - - case kDiminishedTwelfth: - result = kA_DoubleFlat_STP; - break; - case kPerfectTwelfth: - result = kA_Flat_STP; - break; - case kAugmentedTwelfth: - result = kA_Natural_STP; - break; - - case kDiminishedThirteenth: - result = kB_TripleFlat_STP; - break; - case kMinorThirteenth: - result = kB_DoubleFlat_STP; - break; - case kMajorThirteenth: - result = kB_Flat_STP; - break; - case kAugmentedThirteenth: - result = kB_Natural_STP; - break; - } // switch - break; - - case kD_Natural_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kD_Flat_STP; - break; - case kPerfectUnison: - result = kD_Natural_STP; - break; - case kAugmentedUnison: - result = kD_Sharp_STP; - break; - - case kDiminishedSecond: - result = kE_DoubleFlat_STP; - break; - case kMinorSecond: - result = kE_Flat_STP; - break; - case kMajorSecond: - result = kE_Natural_STP; - break; - case kAugmentedSecond: - result = kE_Sharp_STP; - break; - - case kDiminishedThird: - result = kF_Flat_STP; - break; - case kMinorThird: - result = kF_Natural_STP; - break; - case kMajorThird: - result = kF_Sharp_STP; - break; - case kAugmentedThird: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kG_Flat_STP; - break; - case kPerfectFourth: - result = kG_Natural_STP; - break; - case kAugmentedFourth: - result = kG_Sharp_STP; - break; - - case kDiminishedFifth: - result = kA_Flat_STP; - break; - case kPerfectFifth: - result = kA_Natural_STP; - break; - case kAugmentedFifth: - result = kA_Sharp_STP; - break; - - case kDiminishedSixth: - result = kB_DoubleFlat_STP; - break; - case kMinorSixth: - result = kB_Flat_STP; - break; - case kMajorSixth: - result = kB_Natural_STP; - break; - case kAugmentedSixth: - result = kB_Sharp_STP; - break; - - case kDiminishedSeventh: - result = kC_Flat_STP; - break; - case kMinorSeventh: - result = kC_Natural_STP; - break; - case kMajorSeventh: - result = kC_Sharp_STP; - break; - case kAugmentedSeventh: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedOctave: - result = kD_Flat_STP; - break; - case kPerfectOctave: - result = kD_Natural_STP; - break; - case kAugmentedOctave: - result = kD_Sharp_STP; - break; - - case kDiminishedNinth: - result = kE_DoubleFlat_STP; - break; - case kMinorNinth: - result = kE_Flat_STP; - break; - case kMajorNinth: - result = kE_Natural_STP; - break; - case kAugmentedNinth: - result = kE_Sharp_STP; - break; - - case kDiminishedTenth: - result = kF_Flat_STP; - break; - case kMinorTenth: - result = kF_Natural_STP; - break; - case kMajorTenth: - result = kF_Sharp_STP; - break; - case kAugmentedTenth: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kG_Flat_STP; - break; - case kPerfectEleventh: - result = kG_Natural_STP; - break; - case kAugmentedEleventh: - result = kG_Sharp_STP; - break; - - case kDiminishedTwelfth: - result = kA_Flat_STP; - break; - case kPerfectTwelfth: - result = kA_Natural_STP; - break; - case kAugmentedTwelfth: - result = kA_Sharp_STP; - break; - - case kDiminishedThirteenth: - result = kB_DoubleFlat_STP; - break; - case kMinorThirteenth: - result = kB_Flat_STP; - break; - case kMajorThirteenth: - result = kB_Natural_STP; - break; - case kAugmentedThirteenth: - result = kB_Sharp_STP; - break; - } // switch - break; - - case kD_Sharp_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kD_Natural_STP; - break; - case kPerfectUnison: - result = kD_Sharp_STP; - break; - case kAugmentedUnison: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedSecond: - result = kE_Flat_STP; - break; - case kMinorSecond: - result = kE_Natural_STP; - break; - case kMajorSecond: - result = kE_Sharp_STP; - break; - case kAugmentedSecond: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedThird: - result = kF_Flat_STP; - break; - case kMinorThird: - result = kF_Natural_STP; - break; - case kMajorThird: - result = kF_Sharp_STP; - break; - case kAugmentedThird: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kG_Natural_STP; - break; - case kPerfectFourth: - result = kG_Sharp_STP; - break; - case kAugmentedFourth: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedFifth: - result = kA_Natural_STP; - break; - case kPerfectFifth: - result = kA_Sharp_STP; - break; - case kAugmentedFifth: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kB_Flat_STP; - break; - case kMinorSixth: - result = kB_Natural_STP; - break; - case kMajorSixth: - result = kB_Sharp_STP; - break; - case kAugmentedSixth: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedSeventh: - result = kC_Natural_STP; - break; - case kMinorSeventh: - result = kC_Sharp_STP; - break; - case kMajorSeventh: - result = kC_DoubleSharp_STP; - break; - case kAugmentedSeventh: - result = kC_TripleSharp_STP; - break; - - case kDiminishedOctave: - result = kD_Natural_STP; - break; - case kPerfectOctave: - result = kD_Sharp_STP; - break; - case kAugmentedOctave: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedNinth: - result = kE_Flat_STP; - break; - case kMinorNinth: - result = kE_Natural_STP; - break; - case kMajorNinth: - result = kE_Sharp_STP; - break; - case kAugmentedNinth: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedTenth: - result = kF_Natural_STP; - break; - case kMinorTenth: - result = kF_Sharp_STP; - break; - case kMajorTenth: - result = kF_DoubleSharp_STP; - break; - case kAugmentedTenth: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kG_Natural_STP; - break; - case kPerfectEleventh: - result = kG_Sharp_STP; - break; - case kAugmentedEleventh: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedTwelfth: - result = kA_Natural_STP; - break; - case kPerfectTwelfth: - result = kA_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kB_Flat_STP; - break; - case kMinorThirteenth: - result = kB_Natural_STP; - break; - case kMajorThirteenth: - result = kB_Sharp_STP; - break; - case kAugmentedThirteenth: - result = kB_DoubleSharp_STP; - break; - } // switch - break; - - case kE_Flat_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kE_DoubleFlat_STP; - break; - case kPerfectUnison: - result = kE_Flat_STP; - break; - case kAugmentedUnison: - result = kE_Natural_STP; - break; - - case kDiminishedSecond: - result = kF_DoubleFlat_STP; - break; - case kMinorSecond: - result = kF_Flat_STP; - break; - case kMajorSecond: - result = kF_Natural_STP; - break; - case kAugmentedSecond: - result = kF_Sharp_STP; - break; - - case kDiminishedThird: - result = kG_DoubleFlat_STP; - break; - case kMinorThird: - result = kG_Flat_STP; - break; - case kMajorThird: - result = kG_Natural_STP; - break; - case kAugmentedThird: - result = kG_Sharp_STP; - break; - - case kDiminishedFourth: - result = kA_DoubleFlat_STP; - break; - case kPerfectFourth: - result = kA_Flat_STP; - break; - case kAugmentedFourth: - result = kA_Natural_STP; - break; - - case kDiminishedFifth: - result = kB_DoubleFlat_STP; - break; - case kPerfectFifth: - result = kB_Flat_STP; - break; - case kAugmentedFifth: - result = kB_Natural_STP; - break; - - case kDiminishedSixth: - result = kC_DoubleFlat_STP; - break; - case kMinorSixth: - result = kC_Flat_STP; - break; - case kMajorSixth: - result = kC_Natural_STP; - break; - case kAugmentedSixth: - result = kC_Sharp_STP; - break; - - case kDiminishedSeventh: - result = kD_DoubleFlat_STP; - break; - case kMinorSeventh: - result = kD_Flat_STP; - break; - case kMajorSeventh: - result = kD_Natural_STP; - break; - case kAugmentedSeventh: - result = kD_Sharp_STP; - break; - - case kDiminishedOctave: - result = kE_DoubleFlat_STP; - break; - case kPerfectOctave: - result = kE_Flat_STP; - break; - case kAugmentedOctave: - result = kE_Natural_STP; - break; - - case kDiminishedNinth: - result = kF_DoubleFlat_STP; - break; - case kMinorNinth: - result = kF_Flat_STP; - break; - case kMajorNinth: - result = kF_Natural_STP; - break; - case kAugmentedNinth: - result = kF_Sharp_STP; - break; - - case kDiminishedTenth: - result = kG_DoubleFlat_STP; - break; - case kMinorTenth: - result = kG_Flat_STP; - break; - case kMajorTenth: - result = kG_Natural_STP; - break; - case kAugmentedTenth: - result = kG_Sharp_STP; - break; - - case kDiminishedEleventh: - result = kA_DoubleFlat_STP; - break; - case kPerfectEleventh: - result = kA_Flat_STP; - break; - case kAugmentedEleventh: - result = kA_Natural_STP; - break; - - case kDiminishedTwelfth: - result = kB_DoubleFlat_STP; - break; - case kPerfectTwelfth: - result = kB_Flat_STP; - break; - case kAugmentedTwelfth: - result = kB_Natural_STP; - break; - - case kDiminishedThirteenth: - result = kC_DoubleFlat_STP; - break; - case kMinorThirteenth: - result = kC_Flat_STP; - break; - case kMajorThirteenth: - result = kC_Natural_STP; - break; - case kAugmentedThirteenth: - result = kC_Sharp_STP; - break; - } // switch - break; - - case kE_Natural_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kE_Flat_STP; - break; - case kPerfectUnison: - result = kE_Natural_STP; - break; - case kAugmentedUnison: - result = kE_Sharp_STP; - break; - - case kDiminishedSecond: - result = kF_Flat_STP; - break; - case kMinorSecond: - result = kF_Natural_STP; - break; - case kMajorSecond: - result = kF_Sharp_STP; - break; - case kAugmentedSecond: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedThird: - result = kG_Flat_STP; - break; - case kMinorThird: - result = kG_Natural_STP; - break; - case kMajorThird: - result = kG_Sharp_STP; - break; - case kAugmentedThird: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kA_Flat_STP; - break; - case kPerfectFourth: - result = kA_Natural_STP; - break; - case kAugmentedFourth: - result = kA_Sharp_STP; - break; - - case kDiminishedFifth: - result = kB_Natural_STP; - break; - case kPerfectFifth: - result = kB_Sharp_STP; - break; - case kAugmentedFifth: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kC_Flat_STP; - break; - case kMinorSixth: - result = kC_Natural_STP; - break; - case kMajorSixth: - result = kC_Sharp_STP; - break; - case kAugmentedSixth: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedSeventh: - result = kD_Flat_STP; - break; - case kMinorSeventh: - result = kD_Natural_STP; - break; - case kMajorSeventh: - result = kD_Sharp_STP; - break; - case kAugmentedSeventh: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedOctave: - result = kE_Flat_STP; - break; - case kPerfectOctave: - result = kE_Natural_STP; - break; - case kAugmentedOctave: - result = kE_Sharp_STP; - break; - - case kDiminishedNinth: - result = kF_Flat_STP; - break; - case kMinorNinth: - result = kF_Natural_STP; - break; - case kMajorNinth: - result = kF_Sharp_STP; - break; - case kAugmentedNinth: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedTenth: - result = kG_Flat_STP; - break; - case kMinorTenth: - result = kG_Natural_STP; - break; - case kMajorTenth: - result = kG_Sharp_STP; - break; - case kAugmentedTenth: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kA_Flat_STP; - break; - case kPerfectEleventh: - result = kA_Natural_STP; - break; - case kAugmentedEleventh: - result = kA_Sharp_STP; - break; - - case kDiminishedTwelfth: - result = kB_Natural_STP; - break; - case kPerfectTwelfth: - result = kB_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kC_Flat_STP; - break; - case kMinorThirteenth: - result = kC_Natural_STP; - break; - case kMajorThirteenth: - result = kC_Sharp_STP; - break; - case kAugmentedThirteenth: - result = kC_DoubleSharp_STP; - break; - } // switch - break; - - case kE_Sharp_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kE_Natural_STP; - break; - case kPerfectUnison: - result = kE_Sharp_STP; - break; - case kAugmentedUnison: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedSecond: - result = kF_Natural_STP; - break; - case kMinorSecond: - result = kF_Sharp_STP; - break; - case kMajorSecond: - result = kF_DoubleSharp_STP; - break; - case kAugmentedSecond: - result = kF_TripleSharp_STP; - break; - - case kDiminishedThird: - result = kG_Natural_STP; - break; - case kMinorThird: - result = kG_Sharp_STP; - break; - case kMajorThird: - result = kG_DoubleSharp_STP; - break; - case kAugmentedThird: - result = kG_TripleSharp_STP; - break; - - case kDiminishedFourth: - result = kA_Natural_STP; - break; - case kPerfectFourth: - result = kA_Sharp_STP; - break; - case kAugmentedFourth: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedFifth: - result = kB_Natural_STP; - break; - case kPerfectFifth: - result = kB_Sharp_STP; - break; - case kAugmentedFifth: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kC_Natural_STP; - break; - case kMinorSixth: - result = kC_Sharp_STP; - break; - case kMajorSixth: - result = kC_DoubleSharp_STP; - break; - case kAugmentedSixth: - result = kC_TripleSharp_STP; - break; - - case kDiminishedSeventh: - result = kD_Natural_STP; - break; - case kMinorSeventh: - result = kD_Sharp_STP; - break; - case kMajorSeventh: - result = kD_DoubleSharp_STP; - break; - case kAugmentedSeventh: - result = kD_TripleSharp_STP; - break; - - case kDiminishedOctave: - result = kE_Natural_STP; - break; - case kPerfectOctave: - result = kE_Sharp_STP; - break; - case kAugmentedOctave: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedNinth: - result = kF_Natural_STP; - break; - case kMinorNinth: - result = kF_Sharp_STP; - break; - case kMajorNinth: - result = kF_DoubleSharp_STP; - break; - case kAugmentedNinth: - result = kF_TripleSharp_STP; - break; - - case kDiminishedTenth: - result = kG_Natural_STP; - break; - case kMinorTenth: - result = kG_Sharp_STP; - break; - case kMajorTenth: - result = kG_DoubleSharp_STP; - break; - case kAugmentedTenth: - result = kG_TripleSharp_STP; - break; - - case kDiminishedEleventh: - result = kA_Natural_STP; - break; - case kPerfectEleventh: - result = kA_Sharp_STP; - break; - case kAugmentedEleventh: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedTwelfth: - result = kB_Natural_STP; - break; - case kPerfectTwelfth: - result = kB_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kC_Natural_STP; - break; - case kMinorThirteenth: - result = kC_Sharp_STP; - break; - case kMajorThirteenth: - result = kC_DoubleSharp_STP; - break; - case kAugmentedThirteenth: - result = kC_TripleSharp_STP; - break; - } // switch - break; - - case kF_Flat_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kF_DoubleFlat_STP; - break; - case kPerfectUnison: - result = kF_Flat_STP; - break; - case kAugmentedUnison: - result = kF_Natural_STP; - break; - - case kDiminishedSecond: - result = kG_TripleFlat_STP; - break; - case kMinorSecond: - result = kG_DoubleFlat_STP; - break; - case kMajorSecond: - result = kG_Flat_STP; - break; - case kAugmentedSecond: - result = kG_Natural_STP; - break; - - case kDiminishedThird: - result = kA_TripleFlat_STP; - break; - case kMinorThird: - result = kA_DoubleFlat_STP; - break; - case kMajorThird: - result = kA_Flat_STP; - break; - case kAugmentedThird: - result = kA_Natural_STP; - break; - - case kDiminishedFourth: - result = kB_TripleFlat_STP; - break; - case kPerfectFourth: - result = kB_DoubleFlat_STP; - break; - case kAugmentedFourth: - result = kB_Flat_STP; - break; - - case kDiminishedFifth: - result = kC_DoubleFlat_STP; - break; - case kPerfectFifth: - result = kC_Flat_STP; - break; - case kAugmentedFifth: - result = kC_Natural_STP; - break; - - case kDiminishedSixth: - result = kD_TripleFlat_STP; - break; - case kMinorSixth: - result = kD_DoubleFlat_STP; - break; - case kMajorSixth: - result = kD_Flat_STP; - break; - case kAugmentedSixth: - result = kD_Natural_STP; - break; - - case kDiminishedSeventh: - result = kE_TripleFlat_STP; - break; - case kMinorSeventh: - result = kE_DoubleFlat_STP; - break; - case kMajorSeventh: - result = kE_Flat_STP; - break; - case kAugmentedSeventh: - result = kE_Natural_STP; - break; - - case kDiminishedOctave: - result = kF_DoubleFlat_STP; - break; - case kPerfectOctave: - result = kF_Flat_STP; - break; - case kAugmentedOctave: - result = kF_Natural_STP; - break; - - case kDiminishedNinth: - result = kG_TripleFlat_STP; - break; - case kMinorNinth: - result = kG_DoubleFlat_STP; - break; - case kMajorNinth: - result = kG_Flat_STP; - break; - case kAugmentedNinth: - result = kG_Natural_STP; - break; - - case kDiminishedTenth: - result = kA_TripleFlat_STP; - break; - case kMinorTenth: - result = kA_DoubleFlat_STP; - break; - case kMajorTenth: - result = kA_Flat_STP; - break; - case kAugmentedTenth: - result = kA_Natural_STP; - break; - - case kDiminishedEleventh: - result = kB_TripleFlat_STP; - break; - case kPerfectEleventh: - result = kB_DoubleFlat_STP; - break; - case kAugmentedEleventh: - result = kB_Flat_STP; - break; - - case kDiminishedTwelfth: - result = kC_DoubleFlat_STP; - break; - case kPerfectTwelfth: - result = kC_Flat_STP; - break; - case kAugmentedTwelfth: - result = kC_Natural_STP; - break; - - case kDiminishedThirteenth: - result = kD_TripleFlat_STP; - break; - case kMinorThirteenth: - result = kD_DoubleFlat_STP; - break; - case kMajorThirteenth: - result = kD_Flat_STP; - break; - case kAugmentedThirteenth: - result = kD_Natural_STP; - break; - } // switch - break; - - case kF_Natural_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kF_Flat_STP; - break; - case kPerfectUnison: - result = kF_Natural_STP; - break; - case kAugmentedUnison: - result = kF_Sharp_STP; - break; - - case kDiminishedSecond: - result = kG_DoubleFlat_STP; - break; - case kMinorSecond: - result = kG_Flat_STP; - break; - case kMajorSecond: - result = kG_Natural_STP; - break; - case kAugmentedSecond: - result = kG_Sharp_STP; - break; - - case kDiminishedThird: - result = kA_DoubleFlat_STP; - break; - case kMinorThird: - result = kA_Flat_STP; - break; - case kMajorThird: - result = kA_Natural_STP; - break; - case kAugmentedThird: - result = kA_Sharp_STP; - break; - - case kDiminishedFourth: - result = kB_DoubleFlat_STP; - break; - case kPerfectFourth: - result = kB_Flat_STP; - break; - case kAugmentedFourth: - result = kB_Natural_STP; - break; - - case kDiminishedFifth: - result = kC_Flat_STP; - break; - case kPerfectFifth: - result = kC_Natural_STP; - break; - case kAugmentedFifth: - result = kC_Sharp_STP; - break; - - case kDiminishedSixth: - result = kD_DoubleFlat_STP; - break; - case kMinorSixth: - result = kD_Flat_STP; - break; - case kMajorSixth: - result = kD_Natural_STP; - break; - case kAugmentedSixth: - result = kD_Sharp_STP; - break; - - case kDiminishedSeventh: - result = kE_DoubleFlat_STP; - break; - case kMinorSeventh: - result = kE_Flat_STP; - break; - case kMajorSeventh: - result = kE_Natural_STP; - break; - case kAugmentedSeventh: - result = kE_Sharp_STP; - break; - - case kDiminishedOctave: - result = kF_Flat_STP; - break; - case kPerfectOctave: - result = kF_Natural_STP; - break; - case kAugmentedOctave: - result = kF_Sharp_STP; - break; - - case kDiminishedNinth: - result = kG_DoubleFlat_STP; - break; - case kMinorNinth: - result = kG_Flat_STP; - break; - case kMajorNinth: - result = kG_Natural_STP; - break; - case kAugmentedNinth: - result = kG_Sharp_STP; - break; - - case kDiminishedTenth: - result = kA_DoubleFlat_STP; - break; - case kMinorTenth: - result = kA_Flat_STP; - break; - case kMajorTenth: - result = kA_Natural_STP; - break; - case kAugmentedTenth: - result = kA_Sharp_STP; - break; - - case kDiminishedEleventh: - result = kB_DoubleFlat_STP; - break; - case kPerfectEleventh: - result = kB_Flat_STP; - break; - case kAugmentedEleventh: - result = kB_Natural_STP; - break; - - case kDiminishedTwelfth: - result = kC_Flat_STP; - break; - case kPerfectTwelfth: - result = kC_Natural_STP; - break; - case kAugmentedTwelfth: - result = kC_Sharp_STP; - break; - - case kDiminishedThirteenth: - result = kD_DoubleFlat_STP; - break; - case kMinorThirteenth: - result = kD_Flat_STP; - break; - case kMajorThirteenth: - result = kD_Natural_STP; - break; - case kAugmentedThirteenth: - result = kD_Sharp_STP; - break; - } // switch - break; - - case kF_Sharp_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kF_Natural_STP; - break; - case kPerfectUnison: - result = kF_Sharp_STP; - break; - case kAugmentedUnison: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedSecond: - result = kG_Flat_STP; - break; - case kMinorSecond: - result = kG_Natural_STP; - break; - case kMajorSecond: - result = kG_Sharp_STP; - break; - case kAugmentedSecond: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedThird: - result = kA_Flat_STP; - break; - case kMinorThird: - result = kA_Natural_STP; - break; - case kMajorThird: - result = kA_Sharp_STP; - break; - case kAugmentedThird: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kB_Sharp_STP; - break; - case kPerfectFourth: - result = kB_DoubleSharp_STP; - break; - case kAugmentedFourth: - result = kB_TripleSharp_STP; - break; - - case kDiminishedFifth: - result = kC_Natural_STP; - break; - case kPerfectFifth: - result = kC_Sharp_STP; - break; - case kAugmentedFifth: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kD_Flat_STP; - break; - case kMinorSixth: - result = kD_Natural_STP; - break; - case kMajorSixth: - result = kD_Sharp_STP; - break; - case kAugmentedSixth: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedSeventh: - result = kE_Flat_STP; - break; - case kMinorSeventh: - result = kE_Natural_STP; - break; - case kMajorSeventh: - result = kE_Sharp_STP; - break; - case kAugmentedSeventh: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedOctave: - result = kF_Natural_STP; - break; - case kPerfectOctave: - result = kF_Sharp_STP; - break; - case kAugmentedOctave: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedNinth: - result = kG_Flat_STP; - break; - case kMinorNinth: - result = kG_Natural_STP; - break; - case kMajorNinth: - result = kG_Sharp_STP; - break; - case kAugmentedNinth: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedTenth: - result = kA_Natural_STP; - break; - case kMinorTenth: - result = kA_Natural_STP; - break; - case kMajorTenth: - result = kA_Sharp_STP; - break; - case kAugmentedTenth: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kB_Sharp_STP; - break; - case kPerfectEleventh: - result = kB_DoubleSharp_STP; - break; - case kAugmentedEleventh: - result = kB_TripleSharp_STP; - break; - - case kDiminishedTwelfth: - result = kC_Natural_STP; - break; - case kPerfectTwelfth: - result = kC_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kE_Flat_STP; - break; - case kMinorThirteenth: - result = kD_Natural_STP; - break; - case kMajorThirteenth: - result = kD_Sharp_STP; - break; - case kAugmentedThirteenth: - result = kD_DoubleSharp_STP; - break; - } // switch - break; - - case kG_Flat_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kG_DoubleFlat_STP; - break; - case kPerfectUnison: - result = kG_Flat_STP; - break; - case kAugmentedUnison: - result = kG_Natural_STP; - break; - - case kDiminishedSecond: - result = kA_TripleFlat_STP; - break; - case kMinorSecond: - result = kA_DoubleFlat_STP; - break; - case kMajorSecond: - result = kA_Flat_STP; - break; - case kAugmentedSecond: - result = kA_Natural_STP; - break; - - case kDiminishedThird: - result = kB_TripleFlat_STP; - break; - case kMinorThird: - result = kB_DoubleFlat_STP; - break; - case kMajorThird: - result = kB_Flat_STP; - break; - case kAugmentedThird: - result = kB_Natural_STP; - break; - - case kDiminishedFourth: - result = kC_DoubleFlat_STP; - break; - case kPerfectFourth: - result = kC_Flat_STP; - break; - case kAugmentedFourth: - result = kC_Natural_STP; - break; - - case kDiminishedFifth: - result = kD_DoubleFlat_STP; - break; - case kPerfectFifth: - result = kD_Flat_STP; - break; - case kAugmentedFifth: - result = kD_Natural_STP; - break; - - case kDiminishedSixth: - result = kE_TripleFlat_STP; - break; - case kMinorSixth: - result = kE_DoubleFlat_STP; - break; - case kMajorSixth: - result = kE_Flat_STP; - break; - case kAugmentedSixth: - result = kE_Natural_STP; - break; - - case kDiminishedSeventh: - result = kF_DoubleFlat_STP; - break; - case kMinorSeventh: - result = kF_Flat_STP; - break; - case kMajorSeventh: - result = kF_Natural_STP; - break; - case kAugmentedSeventh: - result = kF_Sharp_STP; - break; - - case kDiminishedOctave: - result = kG_DoubleFlat_STP; - break; - case kPerfectOctave: - result = kG_Flat_STP; - break; - case kAugmentedOctave: - result = kG_Natural_STP; - break; - - case kDiminishedNinth: - result = kA_TripleFlat_STP; - break; - case kMinorNinth: - result = kA_DoubleFlat_STP; - break; - case kMajorNinth: - result = kA_Flat_STP; - break; - case kAugmentedNinth: - result = kA_Natural_STP; - break; - - case kDiminishedTenth: - result = kB_TripleFlat_STP; - break; - case kMinorTenth: - result = kB_DoubleFlat_STP; - break; - case kMajorTenth: - result = kB_Flat_STP; - break; - case kAugmentedTenth: - result = kB_Natural_STP; - break; - - case kDiminishedEleventh: - result = kC_DoubleFlat_STP; - break; - case kPerfectEleventh: - result = kC_Flat_STP; - break; - case kAugmentedEleventh: - result = kC_Natural_STP; - break; - - case kDiminishedTwelfth: - result = kD_DoubleFlat_STP; - break; - case kPerfectTwelfth: - result = kD_Flat_STP; - break; - case kAugmentedTwelfth: - result = kD_Natural_STP; - break; - - case kDiminishedThirteenth: - result = kE_TripleFlat_STP; - break; - case kMinorThirteenth: - result = kE_DoubleFlat_STP; - break; - case kMajorThirteenth: - result = kE_Flat_STP; - break; - case kAugmentedThirteenth: - result = kE_Natural_STP; - break; - } // switch - break; - - case kG_Natural_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kG_Flat_STP; - break; - case kPerfectUnison: - result = kG_Natural_STP; - break; - case kAugmentedUnison: - result = kG_Sharp_STP; - break; - - case kDiminishedSecond: - result = kA_DoubleFlat_STP; - break; - case kMinorSecond: - result = kA_Flat_STP; - break; - case kMajorSecond: - result = kA_Natural_STP; - break; - case kAugmentedSecond: - result = kA_Sharp_STP; - break; - - case kDiminishedThird: - result = kB_DoubleFlat_STP; - break; - case kMinorThird: - result = kB_Flat_STP; - break; - case kMajorThird: - result = kB_Natural_STP; - break; - case kAugmentedThird: - result = kB_Sharp_STP; - break; - - case kDiminishedFourth: - result = kC_Flat_STP; - break; - case kPerfectFourth: - result = kC_Natural_STP; - break; - case kAugmentedFourth: - result = kC_Sharp_STP; - break; - - case kDiminishedFifth: - result = kD_Flat_STP; - break; - case kPerfectFifth: - result = kD_Natural_STP; - break; - case kAugmentedFifth: - result = kD_Sharp_STP; - break; - - case kDiminishedSixth: - result = kE_DoubleFlat_STP; - break; - case kMinorSixth: - result = kE_Flat_STP; - break; - case kMajorSixth: - result = kE_Natural_STP; - break; - case kAugmentedSixth: - result = kE_Sharp_STP; - break; - - case kDiminishedSeventh: - result = kF_Flat_STP; - break; - case kMinorSeventh: - result = kF_Natural_STP; - break; - case kMajorSeventh: - result = kF_Sharp_STP; - break; - case kAugmentedSeventh: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedOctave: - result = kG_Flat_STP; - break; - case kPerfectOctave: - result = kG_Natural_STP; - break; - case kAugmentedOctave: - result = kG_Sharp_STP; - break; - - case kDiminishedNinth: - result = kA_DoubleFlat_STP; - break; - case kMinorNinth: - result = kA_Flat_STP; - break; - case kMajorNinth: - result = kA_Natural_STP; - break; - case kAugmentedNinth: - result = kA_Sharp_STP; - break; - - case kDiminishedTenth: - result = kB_DoubleFlat_STP; - break; - case kMinorTenth: - result = kB_Flat_STP; - break; - case kMajorTenth: - result = kB_Natural_STP; - break; - case kAugmentedTenth: - result = kB_Sharp_STP; - break; - - case kDiminishedEleventh: - result = kC_Flat_STP; - break; - case kPerfectEleventh: - result = kC_Natural_STP; - break; - case kAugmentedEleventh: - result = kC_Sharp_STP; - break; - - case kDiminishedTwelfth: - result = kD_Flat_STP; - break; - case kPerfectTwelfth: - result = kD_Natural_STP; - break; - case kAugmentedTwelfth: - result = kD_Sharp_STP; - break; - - case kDiminishedThirteenth: - result = kE_DoubleFlat_STP; - break; - case kMinorThirteenth: - result = kE_Flat_STP; - break; - case kMajorThirteenth: - result = kE_Natural_STP; - break; - case kAugmentedThirteenth: - result = kE_Sharp_STP; - break; - } // switch - break; - - case kG_Sharp_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kG_Natural_STP; - break; - case kPerfectUnison: - result = kG_Sharp_STP; - break; - case kAugmentedUnison: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedSecond: - result = kA_Flat_STP; - break; - case kMinorSecond: - result = kA_Natural_STP; - break; - case kMajorSecond: - result = kA_Sharp_STP; - break; - case kAugmentedSecond: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedThird: - result = kB_Flat_STP; - break; - case kMinorThird: - result = kB_Natural_STP; - break; - case kMajorThird: - result = kB_Sharp_STP; - break; - case kAugmentedThird: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kC_Natural_STP; - break; - case kPerfectFourth: - result = kC_Sharp_STP; - break; - case kAugmentedFourth: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedFifth: - result = kD_Natural_STP; - break; - case kPerfectFifth: - result = kD_Sharp_STP; - break; - case kAugmentedFifth: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kE_Flat_STP; - break; - case kMinorSixth: - result = kE_Natural_STP; - break; - case kMajorSixth: - result = kE_Sharp_STP; - break; - case kAugmentedSixth: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedSeventh: - result = kF_Natural_STP; - break; - case kMinorSeventh: - result = kF_Sharp_STP; - break; - case kMajorSeventh: - result = kF_DoubleSharp_STP; - break; - case kAugmentedSeventh: - result = kF_TripleSharp_STP; - break; - - case kDiminishedOctave: - result = kG_Natural_STP; - break; - case kPerfectOctave: - result = kG_Sharp_STP; - break; - case kAugmentedOctave: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedNinth: - result = kA_Flat_STP; - break; - case kMinorNinth: - result = kA_Natural_STP; - break; - case kMajorNinth: - result = kA_Sharp_STP; - break; - case kAugmentedNinth: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedTenth: - result = kB_Flat_STP; - break; - case kMinorTenth: - result = kB_Natural_STP; - break; - case kMajorTenth: - result = kB_Sharp_STP; - break; - case kAugmentedTenth: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kC_Natural_STP; - break; - case kPerfectEleventh: - result = kC_Sharp_STP; - break; - case kAugmentedEleventh: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedTwelfth: - result = kD_Natural_STP; - break; - case kPerfectTwelfth: - result = kD_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kE_Flat_STP; - break; - case kMinorThirteenth: - result = kE_Natural_STP; - break; - case kMajorThirteenth: - result = kE_Sharp_STP; - break; - case kAugmentedThirteenth: - result = kE_DoubleSharp_STP; - break; - } // switch - break; - - case kA_Flat_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kA_DoubleFlat_STP; - break; - case kPerfectUnison: - result = kA_Flat_STP; - break; - case kAugmentedUnison: - result = kA_Natural_STP; - break; - - case kDiminishedSecond: - result = kB_TripleFlat_STP; - break; - case kMinorSecond: - result = kB_DoubleFlat_STP; - break; - case kMajorSecond: - result = kB_Flat_STP; - break; - case kAugmentedSecond: - result = kB_Natural_STP; - break; - - case kDiminishedThird: - result = kC_DoubleFlat_STP; - break; - case kMinorThird: - result = kC_Flat_STP; - break; - case kMajorThird: - result = kC_Natural_STP; - break; - case kAugmentedThird: - result = kC_Sharp_STP; - break; - - case kDiminishedFourth: - result = kD_DoubleFlat_STP; - break; - case kPerfectFourth: - result = kD_Flat_STP; - break; - case kAugmentedFourth: - result = kD_Natural_STP; - break; - - case kDiminishedFifth: - result = kE_DoubleFlat_STP; - break; - case kPerfectFifth: - result = kE_Flat_STP; - break; - case kAugmentedFifth: - result = kE_Natural_STP; - break; - - case kDiminishedSixth: - result = kF_DoubleFlat_STP; - break; - case kMinorSixth: - result = kF_Flat_STP; - break; - case kMajorSixth: - result = kF_Natural_STP; - break; - case kAugmentedSixth: - result = kF_Sharp_STP; - break; - - case kDiminishedSeventh: - result = kG_DoubleFlat_STP; - break; - case kMinorSeventh: - result = kG_Flat_STP; - break; - case kMajorSeventh: - result = kG_Natural_STP; - break; - case kAugmentedSeventh: - result = kG_Sharp_STP; - break; - - case kDiminishedOctave: - result = kA_DoubleFlat_STP; - break; - case kPerfectOctave: - result = kA_Flat_STP; - break; - case kAugmentedOctave: - result = kA_Natural_STP; - break; - - case kDiminishedNinth: - result = kB_TripleFlat_STP; - break; - case kMinorNinth: - result = kB_DoubleFlat_STP; - break; - case kMajorNinth: - result = kB_Flat_STP; - break; - case kAugmentedNinth: - result = kB_Natural_STP; - break; - - case kDiminishedTenth: - result = kC_DoubleFlat_STP; - break; - case kMinorTenth: - result = kC_Flat_STP; - break; - case kMajorTenth: - result = kC_Natural_STP; - break; - case kAugmentedTenth: - result = kC_Sharp_STP; - break; - - case kDiminishedEleventh: - result = kD_DoubleFlat_STP; - break; - case kPerfectEleventh: - result = kD_Flat_STP; - break; - case kAugmentedEleventh: - result = kD_Natural_STP; - break; - - case kDiminishedTwelfth: - result = kE_DoubleFlat_STP; - break; - case kPerfectTwelfth: - result = kE_Flat_STP; - break; - case kAugmentedTwelfth: - result = kE_Natural_STP; - break; - - case kDiminishedThirteenth: - result = kF_TripleFlat_STP; - break; - case kMinorThirteenth: - result = kF_DoubleFlat_STP; - break; - case kMajorThirteenth: - result = kF_Flat_STP; - break; - case kAugmentedThirteenth: - result = kF_Natural_STP; - break; - } // switch - break; - - case kA_Natural_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kA_Flat_STP; - break; - case kPerfectUnison: - result = kA_Natural_STP; - break; - case kAugmentedUnison: - result = kA_Sharp_STP; - break; - - case kDiminishedSecond: - result = kB_DoubleFlat_STP; - break; - case kMinorSecond: - result = kB_Flat_STP; - break; - case kMajorSecond: - result = kB_Natural_STP; - break; - case kAugmentedSecond: - result = kB_Sharp_STP; - break; - - case kDiminishedThird: - result = kC_Flat_STP; - break; - case kMinorThird: - result = kC_Natural_STP; - break; - case kMajorThird: - result = kC_Sharp_STP; - break; - case kAugmentedThird: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kD_Flat_STP; - break; - case kPerfectFourth: - result = kD_Natural_STP; - break; - case kAugmentedFourth: - result = kD_Sharp_STP; - break; - - case kDiminishedFifth: - result = kE_Flat_STP; - break; - case kPerfectFifth: - result = kE_Natural_STP; - break; - case kAugmentedFifth: - result = kE_Sharp_STP; - break; - - case kDiminishedSixth: - result = kF_Flat_STP; - break; - case kMinorSixth: - result = kF_Natural_STP; - break; - case kMajorSixth: - result = kF_Sharp_STP; - break; - case kAugmentedSixth: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedSeventh: - result = kG_Flat_STP; - break; - case kMinorSeventh: - result = kG_Natural_STP; - break; - case kMajorSeventh: - result = kG_Sharp_STP; - break; - case kAugmentedSeventh: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedOctave: - result = kA_Flat_STP; - break; - case kPerfectOctave: - result = kA_Natural_STP; - break; - case kAugmentedOctave: - result = kA_Sharp_STP; - break; - - case kDiminishedNinth: - result = kB_DoubleFlat_STP; - break; - case kMinorNinth: - result = kB_Flat_STP; - break; - case kMajorNinth: - result = kB_Natural_STP; - break; - case kAugmentedNinth: - result = kB_Sharp_STP; - break; - - case kDiminishedTenth: - result = kC_Flat_STP; - break; - case kMinorTenth: - result = kC_Natural_STP; - break; - case kMajorTenth: - result = kC_Sharp_STP; - break; - case kAugmentedTenth: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kD_Flat_STP; - break; - case kPerfectEleventh: - result = kD_Natural_STP; - break; - case kAugmentedEleventh: - result = kD_Sharp_STP; - break; - - case kDiminishedTwelfth: - result = kE_Flat_STP; - break; - case kPerfectTwelfth: - result = kE_Natural_STP; - break; - case kAugmentedTwelfth: - result = kE_Sharp_STP; - break; - - case kDiminishedThirteenth: - result = kF_Flat_STP; - break; - case kMinorThirteenth: - result = kF_Natural_STP; - break; - case kMajorThirteenth: - result = kF_Sharp_STP; - break; - case kAugmentedThirteenth: - result = kF_DoubleSharp_STP; - break; - } // switch - break; - - case kA_Sharp_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kA_Natural_STP; - break; - case kPerfectUnison: - result = kA_Sharp_STP; - break; - case kAugmentedUnison: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedSecond: - result = kB_Flat_STP; - break; - case kMinorSecond: - result = kB_Natural_STP; - break; - case kMajorSecond: - result = kB_Sharp_STP; - break; - case kAugmentedSecond: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedThird: - result = kC_Natural_STP; - break; - case kMinorThird: - result = kC_Sharp_STP; - break; - case kMajorThird: - result = kC_DoubleSharp_STP; - break; - case kAugmentedThird: - result = kC_TripleSharp_STP; - break; - - case kDiminishedFourth: - result = kD_Natural_STP; - break; - case kPerfectFourth: - result = kD_Sharp_STP; - break; - case kAugmentedFourth: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedFifth: - result = kE_Natural_STP; - break; - case kPerfectFifth: - result = kE_Sharp_STP; - break; - case kAugmentedFifth: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kF_Natural_STP; - break; - case kMinorSixth: - result = kF_Sharp_STP; - break; - case kMajorSixth: - result = kF_DoubleSharp_STP; - break; - case kAugmentedSixth: - result = kF_TripleSharp_STP; - break; - - case kDiminishedSeventh: - result = kG_Natural_STP; - break; - case kMinorSeventh: - result = kG_Sharp_STP; - break; - case kMajorSeventh: - result = kG_DoubleSharp_STP; - break; - case kAugmentedSeventh: - result = kG_TripleSharp_STP; - break; - - case kDiminishedOctave: - result = kA_Natural_STP; - break; - case kPerfectOctave: - result = kA_Sharp_STP; - break; - case kAugmentedOctave: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedNinth: - result = kB_Flat_STP; - break; - case kMinorNinth: - result = kB_Natural_STP; - break; - case kMajorNinth: - result = kB_Sharp_STP; - break; - case kAugmentedNinth: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedTenth: - result = kC_Natural_STP; - break; - case kMinorTenth: - result = kC_Sharp_STP; - break; - case kMajorTenth: - result = kC_DoubleSharp_STP; - break; - case kAugmentedTenth: - result = kC_TripleSharp_STP; - break; - - case kDiminishedEleventh: - result = kD_Natural_STP; - break; - case kPerfectEleventh: - result = kD_Sharp_STP; - break; - case kAugmentedEleventh: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedTwelfth: - result = kE_Natural_STP; - break; - case kPerfectTwelfth: - result = kE_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kF_Natural_STP; - break; - case kMinorThirteenth: - result = kF_Sharp_STP; - break; - case kMajorThirteenth: - result = kF_DoubleSharp_STP; - break; - case kAugmentedThirteenth: - result = kF_TripleSharp_STP; - break; - } // switch - break; - - case kB_Flat_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kB_DoubleFlat_STP; - break; - case kPerfectUnison: - result = kB_Flat_STP; - break; - case kAugmentedUnison: - result = kB_Natural_STP; - break; - - case kDiminishedSecond: - result = kC_DoubleFlat_STP; - break; - case kMinorSecond: - result = kC_Flat_STP; - break; - case kMajorSecond: - result = kC_Natural_STP; - break; - case kAugmentedSecond: - result = kC_Sharp_STP; - break; - - case kDiminishedThird: - result = kD_DoubleFlat_STP; - break; - case kMinorThird: - result = kD_Flat_STP; - break; - case kMajorThird: - result = kD_Natural_STP; - break; - case kAugmentedThird: - result = kD_Sharp_STP; - break; - - case kDiminishedFourth: - result = kE_DoubleFlat_STP; - break; - case kPerfectFourth: - result = kE_Flat_STP; - break; - case kAugmentedFourth: - result = kE_Natural_STP; - break; - - case kDiminishedFifth: - result = kF_Flat_STP; - break; - case kPerfectFifth: - result = kF_Natural_STP; - break; - case kAugmentedFifth: - result = kF_Sharp_STP; - break; - - case kDiminishedSixth: - result = kG_DoubleFlat_STP; - break; - case kMinorSixth: - result = kG_Flat_STP; - break; - case kMajorSixth: - result = kG_Natural_STP; - break; - case kAugmentedSixth: - result = kG_Sharp_STP; - break; - - case kDiminishedSeventh: - result = kA_DoubleFlat_STP; - break; - case kMinorSeventh: - result = kA_Flat_STP; - break; - case kMajorSeventh: - result = kA_Natural_STP; - break; - case kAugmentedSeventh: - result = kA_Sharp_STP; - break; - - case kDiminishedOctave: - result = kB_DoubleFlat_STP; - break; - case kPerfectOctave: - result = kB_Flat_STP; - break; - case kAugmentedOctave: - result = kB_Natural_STP; - break; - - case kDiminishedNinth: - result = kC_DoubleFlat_STP; - break; - case kMinorNinth: - result = kC_Flat_STP; - break; - case kMajorNinth: - result = kC_Natural_STP; - break; - case kAugmentedNinth: - result = kC_Sharp_STP; - break; - - case kDiminishedTenth: - result = kD_DoubleFlat_STP; - break; - case kMinorTenth: - result = kD_Flat_STP; - break; - case kMajorTenth: - result = kD_Natural_STP; - break; - case kAugmentedTenth: - result = kD_Sharp_STP; - break; - - case kDiminishedEleventh: - result = kE_DoubleFlat_STP; - break; - case kPerfectEleventh: - result = kE_Flat_STP; - break; - case kAugmentedEleventh: - result = kE_Natural_STP; - break; - - case kDiminishedTwelfth: - result = kF_Flat_STP; - break; - case kPerfectTwelfth: - result = kF_Natural_STP; - break; - case kAugmentedTwelfth: - result = kF_Sharp_STP; - break; - - case kDiminishedThirteenth: - result = kG_DoubleFlat_STP; - break; - case kMinorThirteenth: - result = kG_Flat_STP; - break; - case kMajorThirteenth: - result = kG_Natural_STP; - break; - case kAugmentedThirteenth: - result = kG_Sharp_STP; - break; - } // switch - break; - - case kB_Natural_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kB_Flat_STP; - break; - case kPerfectUnison: - result = kB_Natural_STP; - break; - case kAugmentedUnison: - result = kB_Sharp_STP; - break; - - case kDiminishedSecond: - result = kC_Flat_STP; - break; - case kMinorSecond: - result = kC_Natural_STP; - break; - case kMajorSecond: - result = kC_Sharp_STP; - break; - case kAugmentedSecond: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedThird: - result = kD_Flat_STP; - break; - case kMinorThird: - result = kD_Natural_STP; - break; - case kMajorThird: - result = kD_Sharp_STP; - break; - case kAugmentedThird: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedFourth: - result = kE_Flat_STP; - break; - case kPerfectFourth: - result = kE_Natural_STP; - break; - case kAugmentedFourth: - result = kE_Sharp_STP; - break; - - case kDiminishedFifth: - result = kF_Natural_STP; - break; - case kPerfectFifth: - result = kF_Sharp_STP; - break; - case kAugmentedFifth: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedSixth: - result = kG_Flat_STP; - break; - case kMinorSixth: - result = kG_Natural_STP; - break; - case kMajorSixth: - result = kG_Sharp_STP; - break; - case kAugmentedSixth: - result = kG_DoubleSharp_STP; - break; - - case kDiminishedSeventh: - result = kA_Flat_STP; - break; - case kMinorSeventh: - result = kA_Natural_STP; - break; - case kMajorSeventh: - result = kA_Sharp_STP; - break; - case kAugmentedSeventh: - result = kA_DoubleSharp_STP; - break; - - case kDiminishedOctave: - result = kB_Flat_STP; - break; - case kPerfectOctave: - result = kB_Natural_STP; - break; - case kAugmentedOctave: - result = kB_Sharp_STP; - break; - - case kDiminishedNinth: - result = kC_Flat_STP; - break; - case kMinorNinth: - result = kC_Natural_STP; - break; - case kMajorNinth: - result = kC_Sharp_STP; - break; - case kAugmentedNinth: - result = kC_DoubleSharp_STP; - break; - - case kDiminishedTenth: - result = kD_Flat_STP; - break; - case kMinorTenth: - result = kD_Natural_STP; - break; - case kMajorTenth: - result = kD_Sharp_STP; - break; - case kAugmentedTenth: - result = kD_DoubleSharp_STP; - break; - - case kDiminishedEleventh: - result = kE_Flat_STP; - break; - case kPerfectEleventh: - result = kE_Natural_STP; - break; - case kAugmentedEleventh: - result = kE_Sharp_STP; - break; - - case kDiminishedTwelfth: - result = kF_Natural_STP; - break; - case kPerfectTwelfth: - result = kF_Sharp_STP; - break; - case kAugmentedTwelfth: - result = kF_DoubleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kG_Flat_STP; - break; - case kMinorThirteenth: - result = kG_Natural_STP; - break; - case kMajorThirteenth: - result = kG_Sharp_STP; - break; - case kAugmentedThirteenth: - result = kG_DoubleSharp_STP; - break; - } // switch - break; - - case kB_Sharp_STP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kB_Natural_STP; - break; - case kPerfectUnison: - result = kB_Sharp_STP; - break; - case kAugmentedUnison: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedSecond: - result = kC_Natural_STP; - break; - case kMinorSecond: - result = kC_Sharp_STP; - break; - case kMajorSecond: - result = kC_DoubleSharp_STP; - break; - case kAugmentedSecond: - result = kC_TripleSharp_STP; - break; - - case kDiminishedThird: - result = kD_Natural_STP; - break; - case kMinorThird: - result = kD_Sharp_STP; - break; - case kMajorThird: - result = kD_DoubleSharp_STP; - break; - case kAugmentedThird: - result = kD_TripleSharp_STP; - break; - - case kDiminishedFourth: - result = kE_Natural_STP; - break; - case kPerfectFourth: - result = kE_Sharp_STP; - break; - case kAugmentedFourth: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedFifth: - result = kF_Sharp_STP; - break; - case kPerfectFifth: - result = kF_DoubleSharp_STP; - break; - case kAugmentedFifth: - result = kF_TripleSharp_STP; - break; - - case kDiminishedSixth: - result = kG_Natural_STP; - break; - case kMinorSixth: - result = kG_Sharp_STP; - break; - case kMajorSixth: - result = kG_DoubleSharp_STP; - break; - case kAugmentedSixth: - result = kG_TripleSharp_STP; - break; - - case kDiminishedSeventh: - result = kA_Natural_STP; - break; - case kMinorSeventh: - result = kA_Sharp_STP; - break; - case kMajorSeventh: - result = kA_DoubleSharp_STP; - break; - case kAugmentedSeventh: - result = kA_TripleSharp_STP; - break; - - case kDiminishedOctave: - result = kB_Natural_STP; - break; - case kPerfectOctave: - result = kB_Sharp_STP; - break; - case kAugmentedOctave: - result = kB_DoubleSharp_STP; - break; - - case kDiminishedNinth: - result = kC_Natural_STP; - break; - case kMinorNinth: - result = kC_Sharp_STP; - break; - case kMajorNinth: - result = kC_DoubleSharp_STP; - break; - case kAugmentedNinth: - result = kC_TripleSharp_STP; - break; - - case kDiminishedTenth: - result = kD_Natural_STP; - break; - case kMinorTenth: - result = kD_Sharp_STP; - break; - case kMajorTenth: - result = kD_DoubleSharp_STP; - break; - case kAugmentedTenth: - result = kD_TripleSharp_STP; - break; - - case kDiminishedEleventh: - result = kE_Natural_STP; - break; - case kPerfectEleventh: - result = kE_Sharp_STP; - break; - case kAugmentedEleventh: - result = kE_DoubleSharp_STP; - break; - - case kDiminishedTwelfth: - result = kF_Sharp_STP; - break; - case kPerfectTwelfth: - result = kF_DoubleSharp_STP; - break; - case kAugmentedTwelfth: - result = kF_TripleSharp_STP; - break; - - case kDiminishedThirteenth: - result = kG_Natural_STP; - break; - case kMinorThirteenth: - result = kG_Sharp_STP; - break; - case kMajorThirteenth: - result = kG_DoubleSharp_STP; - break; - case kAugmentedThirteenth: - result = kG_TripleSharp_STP; - break; - } // switch - break; - - default: - { - // computing intervals on double or triple flats/sharps - // is not considered useful, hence not supported - stringstream s; - - s << - "Sorry, computing intervals from semitones pitch '" << - msrSemiTonesPitchKindAsString (semiTonesPitchKind) << - "(" << semiTonesPitchKind << ")" << - "' is not supported" - ", line = " << inputLineNumber; - - msrLimitation ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // switch - - return result; -} - -msrQuarterTonesPitchKind noteAtIntervalFromQuarterTonesPitch ( - int inputLineNumber, - msrIntervalKind intervalKind, - msrQuarterTonesPitchKind quarterTonesPitchKind) -{ - msrQuarterTonesPitchKind result = k_NoQuarterTonesPitch_QTP; - - switch (quarterTonesPitchKind) { - case k_NoQuarterTonesPitch_QTP: - result = k_NoQuarterTonesPitch_QTP; - break; - - case kC_Flat_QTP: - break; - - case kC_Natural_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kC_Flat_QTP; - break; - case kPerfectUnison: - result = kC_Natural_QTP; - break; - case kAugmentedUnison: - result = kC_Sharp_QTP; - break; - - case kDiminishedSecond: - result = kD_DoubleFlat_QTP; - break; - case kMinorSecond: - result = kD_Flat_QTP; - break; - case kMajorSecond: - result = kD_Natural_QTP; - break; - case kAugmentedSecond: - result = kD_Sharp_QTP; - break; - - case kDiminishedThird: - result = kE_DoubleFlat_QTP; - break; - case kMinorThird: - result = kE_Flat_QTP; - break; - case kMajorThird: - result = kE_Natural_QTP; - break; - case kAugmentedThird: - result = kE_Sharp_QTP; - break; - - case kDiminishedFourth: - result = kF_Flat_QTP; - break; - case kPerfectFourth: - result = kF_Natural_QTP; - break; - case kAugmentedFourth: - result = kF_Sharp_QTP; - break; - - case kDiminishedFifth: - result = kG_Flat_QTP; - break; - case kPerfectFifth: - result = kG_Natural_QTP; - break; - case kAugmentedFifth: - result = kG_Sharp_QTP; - break; - - case kDiminishedSixth: - result = kA_DoubleFlat_QTP; - break; - case kMinorSixth: - result = kA_Flat_QTP; - break; - case kMajorSixth: - result = kA_Natural_QTP; - break; - case kAugmentedSixth: - result = kA_Sharp_QTP; - break; - - case kDiminishedSeventh: - result = kB_DoubleFlat_QTP; - break; - case kMinorSeventh: - result = kB_Flat_QTP; - break; - case kMajorSeventh: - result = kB_Natural_QTP; - break; - case kAugmentedSeventh: - result = kB_Sharp_QTP; - break; - - case kDiminishedOctave: - result = kC_Flat_QTP; - break; - case kPerfectOctave: - result = kC_Natural_QTP; - break; - case kAugmentedOctave: - result = kC_Sharp_QTP; - break; - - case kDiminishedNinth: - result = kD_DoubleFlat_QTP; - break; - case kMinorNinth: - result = kD_Flat_QTP; - break; - case kMajorNinth: - result = kD_Natural_QTP; - break; - case kAugmentedNinth: - result = kD_Sharp_QTP; - break; - - case kDiminishedTenth: - result = kE_DoubleFlat_QTP; - break; - case kMinorTenth: - result = kE_Flat_QTP; - break; - case kMajorTenth: - result = kE_Natural_QTP; - break; - case kAugmentedTenth: - result = kE_Sharp_QTP; - break; - - case kDiminishedEleventh: - result = kF_Flat_QTP; - break; - case kPerfectEleventh: - result = kF_Natural_QTP; - break; - case kAugmentedEleventh: - result = kF_Sharp_QTP; - break; - - case kDiminishedTwelfth: - result = kG_Flat_QTP; - break; - case kPerfectTwelfth: - result = kG_Natural_QTP; - break; - case kAugmentedTwelfth: - result = kG_Sharp_QTP; - break; - - case kDiminishedThirteenth: - result = kA_DoubleFlat_QTP; - break; - case kMinorThirteenth: - result = kA_Flat_QTP; - break; - case kMajorThirteenth: - result = kA_Natural_QTP; - break; - case kAugmentedThirteenth: - result = kG_Sharp_QTP; - break; - } // switch - break; - - case kC_Sharp_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kC_Natural_QTP; - break; - case kPerfectUnison: - result = kC_Sharp_QTP; - break; - case kAugmentedUnison: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedSecond: - result = kD_Flat_QTP; - break; - case kMinorSecond: - result = kD_Natural_QTP; - break; - case kMajorSecond: - result = kD_Sharp_QTP; - break; - case kAugmentedSecond: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedThird: - result = kE_Flat_QTP; - break; - case kMinorThird: - result = kE_Natural_QTP; - break; - case kMajorThird: - result = kE_Sharp_QTP; - break; - case kAugmentedThird: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kF_Natural_QTP; - break; - case kPerfectFourth: - result = kF_Sharp_QTP; - break; - case kAugmentedFourth: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedFifth: - result = kG_Natural_QTP; - break; - case kPerfectFifth: - result = kG_Sharp_QTP; - break; - case kAugmentedFifth: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedSixth: - result = kA_Flat_QTP; - break; - case kMinorSixth: - result = kA_Natural_QTP; - break; - case kMajorSixth: - result = kA_Sharp_QTP; - break; - case kAugmentedSixth: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kB_Flat_QTP; - break; - case kMinorSeventh: - result = kB_Natural_QTP; - break; - case kMajorSeventh: - result = kB_Sharp_QTP; - break; - case kAugmentedSeventh: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedOctave: - result = kC_Natural_QTP; - break; - case kPerfectOctave: - result = kC_Sharp_QTP; - break; - case kAugmentedOctave: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedNinth: - result = kD_Flat_QTP; - break; - case kMinorNinth: - result = kD_Natural_QTP; - break; - case kMajorNinth: - result = kD_Sharp_QTP; - break; - case kAugmentedNinth: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedTenth: - result = kE_Flat_QTP; - break; - case kMinorTenth: - result = kE_Natural_QTP; - break; - case kMajorTenth: - result = kE_Sharp_QTP; - break; - case kAugmentedTenth: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kF_Natural_QTP; - break; - case kPerfectEleventh: - result = kF_Sharp_QTP; - break; - case kAugmentedEleventh: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedTwelfth: - result = kG_Natural_QTP; - break; - case kPerfectTwelfth: - result = kG_Sharp_QTP; - break; - case kAugmentedTwelfth: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kA_Flat_QTP; - break; - case kMinorThirteenth: - result = kA_Natural_QTP; - break; - case kMajorThirteenth: - result = kA_Sharp_QTP; - break; - case kAugmentedThirteenth: - result = kA_DoubleSharp_QTP; - break; - } // switch - break; - - case kD_Flat_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kD_DoubleFlat_QTP; - break; - case kPerfectUnison: - result = kD_Flat_QTP; - break; - case kAugmentedUnison: - result = kD_Natural_QTP; - break; - - case kDiminishedSecond: - result = kE_TripleFlat_QTP; - break; - case kMinorSecond: - result = kE_DoubleFlat_QTP; - break; - case kMajorSecond: - result = kE_Flat_QTP; - break; - case kAugmentedSecond: - result = kE_Natural_QTP; - break; - - case kDiminishedThird: - result = kF_DoubleFlat_QTP; - break; - case kMinorThird: - result = kF_Flat_QTP; - break; - case kMajorThird: - result = kF_Natural_QTP; - break; - case kAugmentedThird: - result = kF_Sharp_QTP; - break; - - case kDiminishedFourth: - result = kG_DoubleFlat_QTP; - break; - case kPerfectFourth: - result = kG_Flat_QTP; - break; - case kAugmentedFourth: - result = kG_Natural_QTP; - break; - - case kDiminishedFifth: - result = kA_DoubleFlat_QTP; - break; - case kPerfectFifth: - result = kA_Flat_QTP; - break; - case kAugmentedFifth: - result = kA_Natural_QTP; - break; - - case kDiminishedSixth: - result = kB_TripleFlat_QTP; - break; - case kMinorSixth: - result = kB_DoubleFlat_QTP; - break; - case kMajorSixth: - result = kB_Flat_QTP; - break; - case kAugmentedSixth: - result = kB_Natural_QTP; - break; - - case kDiminishedSeventh: - result = kC_DoubleFlat_QTP; - break; - case kMinorSeventh: - result = kC_Flat_QTP; - break; - case kMajorSeventh: - result = kC_Natural_QTP; - break; - case kAugmentedSeventh: - result = kC_Sharp_QTP; - break; - - case kDiminishedOctave: - result = kD_DoubleFlat_QTP; - break; - case kPerfectOctave: - result = kD_Flat_QTP; - break; - case kAugmentedOctave: - result = kD_Natural_QTP; - break; - - case kDiminishedNinth: - result = kE_TripleFlat_QTP; - break; - case kMinorNinth: - result = kE_DoubleFlat_QTP; - break; - case kMajorNinth: - result = kE_Flat_QTP; - break; - case kAugmentedNinth: - result = kE_Natural_QTP; - break; - - case kDiminishedTenth: - result = kF_DoubleFlat_QTP; - break; - case kMinorTenth: - result = kF_Flat_QTP; - break; - case kMajorTenth: - result = kF_Natural_QTP; - break; - case kAugmentedTenth: - result = kF_Sharp_QTP; - break; - - case kDiminishedEleventh: - result = kG_DoubleFlat_QTP; - break; - case kPerfectEleventh: - result = kG_Flat_QTP; - break; - case kAugmentedEleventh: - result = kG_Natural_QTP; - break; - - case kDiminishedTwelfth: - result = kA_DoubleFlat_QTP; - break; - case kPerfectTwelfth: - result = kA_Flat_QTP; - break; - case kAugmentedTwelfth: - result = kA_Natural_QTP; - break; - - case kDiminishedThirteenth: - result = kB_TripleFlat_QTP; - break; - case kMinorThirteenth: - result = kB_DoubleFlat_QTP; - break; - case kMajorThirteenth: - result = kB_Flat_QTP; - break; - case kAugmentedThirteenth: - result = kB_Natural_QTP; - break; - } // switch - break; - - case kD_Natural_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kD_Flat_QTP; - break; - case kPerfectUnison: - result = kD_Natural_QTP; - break; - case kAugmentedUnison: - result = kD_Sharp_QTP; - break; - - case kDiminishedSecond: - result = kE_DoubleFlat_QTP; - break; - case kMinorSecond: - result = kE_Flat_QTP; - break; - case kMajorSecond: - result = kE_Natural_QTP; - break; - case kAugmentedSecond: - result = kE_Sharp_QTP; - break; - - case kDiminishedThird: - result = kF_Flat_QTP; - break; - case kMinorThird: - result = kF_Natural_QTP; - break; - case kMajorThird: - result = kF_Sharp_QTP; - break; - case kAugmentedThird: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kG_Flat_QTP; - break; - case kPerfectFourth: - result = kG_Natural_QTP; - break; - case kAugmentedFourth: - result = kG_Sharp_QTP; - break; - - case kDiminishedFifth: - result = kA_Flat_QTP; - break; - case kPerfectFifth: - result = kA_Natural_QTP; - break; - case kAugmentedFifth: - result = kA_Sharp_QTP; - break; - - case kDiminishedSixth: - result = kB_DoubleFlat_QTP; - break; - case kMinorSixth: - result = kB_Flat_QTP; - break; - case kMajorSixth: - result = kB_Natural_QTP; - break; - case kAugmentedSixth: - result = kB_Sharp_QTP; - break; - - case kDiminishedSeventh: - result = kC_Flat_QTP; - break; - case kMinorSeventh: - result = kC_Natural_QTP; - break; - case kMajorSeventh: - result = kC_Sharp_QTP; - break; - case kAugmentedSeventh: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedOctave: - result = kD_Flat_QTP; - break; - case kPerfectOctave: - result = kD_Natural_QTP; - break; - case kAugmentedOctave: - result = kD_Sharp_QTP; - break; - - case kDiminishedNinth: - result = kE_DoubleFlat_QTP; - break; - case kMinorNinth: - result = kE_Flat_QTP; - break; - case kMajorNinth: - result = kE_Natural_QTP; - break; - case kAugmentedNinth: - result = kE_Sharp_QTP; - break; - - case kDiminishedTenth: - result = kF_Flat_QTP; - break; - case kMinorTenth: - result = kF_Natural_QTP; - break; - case kMajorTenth: - result = kF_Sharp_QTP; - break; - case kAugmentedTenth: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kG_Flat_QTP; - break; - case kPerfectEleventh: - result = kG_Natural_QTP; - break; - case kAugmentedEleventh: - result = kG_Sharp_QTP; - break; - - case kDiminishedTwelfth: - result = kA_Flat_QTP; - break; - case kPerfectTwelfth: - result = kA_Natural_QTP; - break; - case kAugmentedTwelfth: - result = kA_Sharp_QTP; - break; - - case kDiminishedThirteenth: - result = kB_DoubleFlat_QTP; - break; - case kMinorThirteenth: - result = kB_Flat_QTP; - break; - case kMajorThirteenth: - result = kB_Natural_QTP; - break; - case kAugmentedThirteenth: - result = kB_Sharp_QTP; - break; - } // switch - break; - - case kD_Sharp_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kD_Natural_QTP; - break; - case kPerfectUnison: - result = kD_Sharp_QTP; - break; - case kAugmentedUnison: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedSecond: - result = kE_Flat_QTP; - break; - case kMinorSecond: - result = kE_Natural_QTP; - break; - case kMajorSecond: - result = kE_Sharp_QTP; - break; - case kAugmentedSecond: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedThird: - result = kF_Flat_QTP; - break; - case kMinorThird: - result = kF_Natural_QTP; - break; - case kMajorThird: - result = kF_Sharp_QTP; - break; - case kAugmentedThird: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kG_Natural_QTP; - break; - case kPerfectFourth: - result = kG_Sharp_QTP; - break; - case kAugmentedFourth: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedFifth: - result = kA_Natural_QTP; - break; - case kPerfectFifth: - result = kA_Sharp_QTP; - break; - case kAugmentedFifth: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedSixth: - result = kB_Flat_QTP; - break; - case kMinorSixth: - result = kB_Natural_QTP; - break; - case kMajorSixth: - result = kB_Sharp_QTP; - break; - case kAugmentedSixth: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kC_Natural_QTP; - break; - case kMinorSeventh: - result = kC_Sharp_QTP; - break; - case kMajorSeventh: - result = kC_DoubleSharp_QTP; - break; - case kAugmentedSeventh: - result = kC_TripleSharp_QTP; - break; - - case kDiminishedOctave: - result = kD_Natural_QTP; - break; - case kPerfectOctave: - result = kD_Sharp_QTP; - break; - case kAugmentedOctave: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedNinth: - result = kE_Flat_QTP; - break; - case kMinorNinth: - result = kE_Natural_QTP; - break; - case kMajorNinth: - result = kE_Sharp_QTP; - break; - case kAugmentedNinth: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedTenth: - result = kF_Natural_QTP; - break; - case kMinorTenth: - result = kF_Sharp_QTP; - break; - case kMajorTenth: - result = kF_DoubleSharp_QTP; - break; - case kAugmentedTenth: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kG_Natural_QTP; - break; - case kPerfectEleventh: - result = kG_Sharp_QTP; - break; - case kAugmentedEleventh: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedTwelfth: - result = kA_Natural_QTP; - break; - case kPerfectTwelfth: - result = kA_Sharp_QTP; - break; - case kAugmentedTwelfth: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kB_Flat_QTP; - break; - case kMinorThirteenth: - result = kB_Natural_QTP; - break; - case kMajorThirteenth: - result = kB_Sharp_QTP; - break; - case kAugmentedThirteenth: - result = kB_DoubleSharp_QTP; - break; - } // switch - break; - - case kE_Flat_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kE_DoubleFlat_QTP; - break; - case kPerfectUnison: - result = kE_Flat_QTP; - break; - case kAugmentedUnison: - result = kE_Natural_QTP; - break; - - case kDiminishedSecond: - result = kF_DoubleFlat_QTP; - break; - case kMinorSecond: - result = kF_Flat_QTP; - break; - case kMajorSecond: - result = kF_Natural_QTP; - break; - case kAugmentedSecond: - result = kF_Sharp_QTP; - break; - - case kDiminishedThird: - result = kG_DoubleFlat_QTP; - break; - case kMinorThird: - result = kG_Flat_QTP; - break; - case kMajorThird: - result = kG_Natural_QTP; - break; - case kAugmentedThird: - result = kG_Sharp_QTP; - break; - - case kDiminishedFourth: - result = kA_DoubleFlat_QTP; - break; - case kPerfectFourth: - result = kA_Flat_QTP; - break; - case kAugmentedFourth: - result = kA_Natural_QTP; - break; - - case kDiminishedFifth: - result = kB_DoubleFlat_QTP; - break; - case kPerfectFifth: - result = kB_Flat_QTP; - break; - case kAugmentedFifth: - result = kB_Natural_QTP; - break; - - case kDiminishedSixth: - result = kC_DoubleFlat_QTP; - break; - case kMinorSixth: - result = kC_Flat_QTP; - break; - case kMajorSixth: - result = kC_Natural_QTP; - break; - case kAugmentedSixth: - result = kC_Sharp_QTP; - break; - - case kDiminishedSeventh: - result = kD_DoubleFlat_QTP; - break; - case kMinorSeventh: - result = kD_Flat_QTP; - break; - case kMajorSeventh: - result = kD_Natural_QTP; - break; - case kAugmentedSeventh: - result = kD_Sharp_QTP; - break; - - case kDiminishedOctave: - result = kE_DoubleFlat_QTP; - break; - case kPerfectOctave: - result = kE_Flat_QTP; - break; - case kAugmentedOctave: - result = kE_Natural_QTP; - break; - - case kDiminishedNinth: - result = kF_DoubleFlat_QTP; - break; - case kMinorNinth: - result = kF_Flat_QTP; - break; - case kMajorNinth: - result = kF_Natural_QTP; - break; - case kAugmentedNinth: - result = kF_Sharp_QTP; - break; - - case kDiminishedTenth: - result = kG_DoubleFlat_QTP; - break; - case kMinorTenth: - result = kG_Flat_QTP; - break; - case kMajorTenth: - result = kG_Natural_QTP; - break; - case kAugmentedTenth: - result = kG_Sharp_QTP; - break; - - case kDiminishedEleventh: - result = kA_DoubleFlat_QTP; - break; - case kPerfectEleventh: - result = kA_Flat_QTP; - break; - case kAugmentedEleventh: - result = kA_Natural_QTP; - break; - - case kDiminishedTwelfth: - result = kB_DoubleFlat_QTP; - break; - case kPerfectTwelfth: - result = kB_Flat_QTP; - break; - case kAugmentedTwelfth: - result = kB_Natural_QTP; - break; - - case kDiminishedThirteenth: - result = kC_DoubleFlat_QTP; - break; - case kMinorThirteenth: - result = kC_Flat_QTP; - break; - case kMajorThirteenth: - result = kC_Natural_QTP; - break; - case kAugmentedThirteenth: - result = kC_Sharp_QTP; - break; - } // switch - break; - - case kE_Natural_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kE_Flat_QTP; - break; - case kPerfectUnison: - result = kE_Natural_QTP; - break; - case kAugmentedUnison: - result = kE_Sharp_QTP; - break; - - case kDiminishedSecond: - result = kF_Flat_QTP; - break; - case kMinorSecond: - result = kF_Natural_QTP; - break; - case kMajorSecond: - result = kF_Sharp_QTP; - break; - case kAugmentedSecond: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedThird: - result = kG_Flat_QTP; - break; - case kMinorThird: - result = kG_Natural_QTP; - break; - case kMajorThird: - result = kG_Sharp_QTP; - break; - case kAugmentedThird: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kA_Flat_QTP; - break; - case kPerfectFourth: - result = kA_Natural_QTP; - break; - case kAugmentedFourth: - result = kA_Sharp_QTP; - break; - - case kDiminishedFifth: - result = kB_Natural_QTP; - break; - case kPerfectFifth: - result = kB_Sharp_QTP; - break; - case kAugmentedFifth: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedSixth: - result = kC_Flat_QTP; - break; - case kMinorSixth: - result = kC_Natural_QTP; - break; - case kMajorSixth: - result = kC_Sharp_QTP; - break; - case kAugmentedSixth: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kD_Flat_QTP; - break; - case kMinorSeventh: - result = kD_Natural_QTP; - break; - case kMajorSeventh: - result = kD_Sharp_QTP; - break; - case kAugmentedSeventh: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedOctave: - result = kE_Flat_QTP; - break; - case kPerfectOctave: - result = kE_Natural_QTP; - break; - case kAugmentedOctave: - result = kE_Sharp_QTP; - break; - - case kDiminishedNinth: - result = kF_Flat_QTP; - break; - case kMinorNinth: - result = kF_Natural_QTP; - break; - case kMajorNinth: - result = kF_Sharp_QTP; - break; - case kAugmentedNinth: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedTenth: - result = kG_Flat_QTP; - break; - case kMinorTenth: - result = kG_Natural_QTP; - break; - case kMajorTenth: - result = kG_Sharp_QTP; - break; - case kAugmentedTenth: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kA_Flat_QTP; - break; - case kPerfectEleventh: - result = kA_Natural_QTP; - break; - case kAugmentedEleventh: - result = kA_Sharp_QTP; - break; - - case kDiminishedTwelfth: - result = kB_Natural_QTP; - break; - case kPerfectTwelfth: - result = kB_Sharp_QTP; - break; - case kAugmentedTwelfth: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kC_Flat_QTP; - break; - case kMinorThirteenth: - result = kC_Natural_QTP; - break; - case kMajorThirteenth: - result = kC_Sharp_QTP; - break; - case kAugmentedThirteenth: - result = kC_DoubleSharp_QTP; - break; - } // switch - break; - - case kE_Sharp_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kE_Natural_QTP; - break; - case kPerfectUnison: - result = kE_Sharp_QTP; - break; - case kAugmentedUnison: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedSecond: - result = kF_Natural_QTP; - break; - case kMinorSecond: - result = kF_Sharp_QTP; - break; - case kMajorSecond: - result = kF_DoubleSharp_QTP; - break; - case kAugmentedSecond: - result = kF_TripleSharp_QTP; - break; - - case kDiminishedThird: - result = kG_Natural_QTP; - break; - case kMinorThird: - result = kG_Sharp_QTP; - break; - case kMajorThird: - result = kG_DoubleSharp_QTP; - break; - case kAugmentedThird: - result = kG_TripleSharp_QTP; - break; - - case kDiminishedFourth: - result = kA_Natural_QTP; - break; - case kPerfectFourth: - result = kA_Sharp_QTP; - break; - case kAugmentedFourth: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedFifth: - result = kB_Natural_QTP; - break; - case kPerfectFifth: - result = kB_Sharp_QTP; - break; - case kAugmentedFifth: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedSixth: - result = kC_Natural_QTP; - break; - case kMinorSixth: - result = kC_Sharp_QTP; - break; - case kMajorSixth: - result = kC_DoubleSharp_QTP; - break; - case kAugmentedSixth: - result = kC_TripleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kD_Natural_QTP; - break; - case kMinorSeventh: - result = kD_Sharp_QTP; - break; - case kMajorSeventh: - result = kD_DoubleSharp_QTP; - break; - case kAugmentedSeventh: - result = kD_TripleSharp_QTP; - break; - - case kDiminishedOctave: - result = kE_Natural_QTP; - break; - case kPerfectOctave: - result = kE_Sharp_QTP; - break; - case kAugmentedOctave: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedNinth: - result = kF_Natural_QTP; - break; - case kMinorNinth: - result = kF_Sharp_QTP; - break; - case kMajorNinth: - result = kF_DoubleSharp_QTP; - break; - case kAugmentedNinth: - result = kF_TripleSharp_QTP; - break; - - case kDiminishedTenth: - result = kG_Natural_QTP; - break; - case kMinorTenth: - result = kG_Sharp_QTP; - break; - case kMajorTenth: - result = kG_DoubleSharp_QTP; - break; - case kAugmentedTenth: - result = kG_TripleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kA_Natural_QTP; - break; - case kPerfectEleventh: - result = kA_Sharp_QTP; - break; - case kAugmentedEleventh: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedTwelfth: - result = kB_Natural_QTP; - break; - case kPerfectTwelfth: - result = kB_Sharp_QTP; - break; - case kAugmentedTwelfth: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kC_Natural_QTP; - break; - case kMinorThirteenth: - result = kC_Sharp_QTP; - break; - case kMajorThirteenth: - result = kC_DoubleSharp_QTP; - break; - case kAugmentedThirteenth: - result = kC_TripleSharp_QTP; - break; - } // switch - break; - - case kF_Flat_QTP: - break; - - case kF_Natural_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kF_Flat_QTP; - break; - case kPerfectUnison: - result = kF_Natural_QTP; - break; - case kAugmentedUnison: - result = kF_Sharp_QTP; - break; - - case kDiminishedSecond: - result = kG_DoubleFlat_QTP; - break; - case kMinorSecond: - result = kG_Flat_QTP; - break; - case kMajorSecond: - result = kG_Natural_QTP; - break; - case kAugmentedSecond: - result = kG_Sharp_QTP; - break; - - case kDiminishedThird: - result = kA_DoubleFlat_QTP; - break; - case kMinorThird: - result = kA_Flat_QTP; - break; - case kMajorThird: - result = kA_Natural_QTP; - break; - case kAugmentedThird: - result = kA_Sharp_QTP; - break; - - case kDiminishedFourth: - result = kB_DoubleFlat_QTP; - break; - case kPerfectFourth: - result = kB_Flat_QTP; - break; - case kAugmentedFourth: - result = kB_Natural_QTP; - break; - - case kDiminishedFifth: - result = kC_Flat_QTP; - break; - case kPerfectFifth: - result = kC_Natural_QTP; - break; - case kAugmentedFifth: - result = kC_Sharp_QTP; - break; - - case kDiminishedSixth: - result = kD_DoubleFlat_QTP; - break; - case kMinorSixth: - result = kD_Flat_QTP; - break; - case kMajorSixth: - result = kD_Natural_QTP; - break; - case kAugmentedSixth: - result = kD_Sharp_QTP; - break; - - case kDiminishedSeventh: - result = kE_DoubleFlat_QTP; - break; - case kMinorSeventh: - result = kE_Flat_QTP; - break; - case kMajorSeventh: - result = kE_Natural_QTP; - break; - case kAugmentedSeventh: - result = kE_Sharp_QTP; - break; - - case kDiminishedOctave: - result = kF_Flat_QTP; - break; - case kPerfectOctave: - result = kF_Natural_QTP; - break; - case kAugmentedOctave: - result = kF_Sharp_QTP; - break; - - case kDiminishedNinth: - result = kG_DoubleFlat_QTP; - break; - case kMinorNinth: - result = kG_Flat_QTP; - break; - case kMajorNinth: - result = kG_Natural_QTP; - break; - case kAugmentedNinth: - result = kG_Sharp_QTP; - break; - - case kDiminishedTenth: - result = kA_DoubleFlat_QTP; - break; - case kMinorTenth: - result = kA_Flat_QTP; - break; - case kMajorTenth: - result = kA_Natural_QTP; - break; - case kAugmentedTenth: - result = kA_Sharp_QTP; - break; - - case kDiminishedEleventh: - result = kB_DoubleFlat_QTP; - break; - case kPerfectEleventh: - result = kB_Flat_QTP; - break; - case kAugmentedEleventh: - result = kB_Natural_QTP; - break; - - case kDiminishedTwelfth: - result = kC_Flat_QTP; - break; - case kPerfectTwelfth: - result = kC_Natural_QTP; - break; - case kAugmentedTwelfth: - result = kC_Sharp_QTP; - break; - - case kDiminishedThirteenth: - result = kD_DoubleFlat_QTP; - break; - case kMinorThirteenth: - result = kD_Flat_QTP; - break; - case kMajorThirteenth: - result = kD_Natural_QTP; - break; - case kAugmentedThirteenth: - result = kD_Sharp_QTP; - break; - } // switch - break; - - case kF_Sharp_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kF_Natural_QTP; - break; - case kPerfectUnison: - result = kF_Sharp_QTP; - break; - case kAugmentedUnison: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedSecond: - result = kG_Flat_QTP; - break; - case kMinorSecond: - result = kG_Natural_QTP; - break; - case kMajorSecond: - result = kG_Sharp_QTP; - break; - case kAugmentedSecond: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedThird: - result = kA_Flat_QTP; - break; - case kMinorThird: - result = kA_Natural_QTP; - break; - case kMajorThird: - result = kA_Sharp_QTP; - break; - case kAugmentedThird: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kB_Sharp_QTP; - break; - case kPerfectFourth: - result = kB_DoubleSharp_QTP; - break; - case kAugmentedFourth: - result = kB_TripleSharp_QTP; - break; - - case kDiminishedFifth: - result = kC_Natural_QTP; - break; - case kPerfectFifth: - result = kC_Sharp_QTP; - break; - case kAugmentedFifth: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedSixth: - result = kD_Flat_QTP; - break; - case kMinorSixth: - result = kD_Natural_QTP; - break; - case kMajorSixth: - result = kD_Sharp_QTP; - break; - case kAugmentedSixth: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kE_Flat_QTP; - break; - case kMinorSeventh: - result = kE_Natural_QTP; - break; - case kMajorSeventh: - result = kE_Sharp_QTP; - break; - case kAugmentedSeventh: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedOctave: - result = kF_Natural_QTP; - break; - case kPerfectOctave: - result = kF_Sharp_QTP; - break; - case kAugmentedOctave: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedNinth: - result = kG_Flat_QTP; - break; - case kMinorNinth: - result = kG_Natural_QTP; - break; - case kMajorNinth: - result = kG_Sharp_QTP; - break; - case kAugmentedNinth: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedTenth: - result = kA_Natural_QTP; - break; - case kMinorTenth: - result = kA_Natural_QTP; - break; - case kMajorTenth: - result = kA_Sharp_QTP; - break; - case kAugmentedTenth: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kB_Sharp_QTP; - break; - case kPerfectEleventh: - result = kB_DoubleSharp_QTP; - break; - case kAugmentedEleventh: - result = kB_TripleSharp_QTP; - break; - - case kDiminishedTwelfth: - result = kC_Natural_QTP; - break; - case kPerfectTwelfth: - result = kC_Sharp_QTP; - break; - case kAugmentedTwelfth: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kE_Flat_QTP; - break; - case kMinorThirteenth: - result = kD_Natural_QTP; - break; - case kMajorThirteenth: - result = kD_Sharp_QTP; - break; - case kAugmentedThirteenth: - result = kD_DoubleSharp_QTP; - break; - } // switch - break; - - case kG_Flat_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kG_DoubleFlat_QTP; - break; - case kPerfectUnison: - result = kG_Flat_QTP; - break; - case kAugmentedUnison: - result = kG_Natural_QTP; - break; - - case kDiminishedSecond: - result = kA_TripleFlat_QTP; - break; - case kMinorSecond: - result = kA_DoubleFlat_QTP; - break; - case kMajorSecond: - result = kA_Flat_QTP; - break; - case kAugmentedSecond: - result = kA_Natural_QTP; - break; - - case kDiminishedThird: - result = kB_TripleFlat_QTP; - break; - case kMinorThird: - result = kB_DoubleFlat_QTP; - break; - case kMajorThird: - result = kB_Flat_QTP; - break; - case kAugmentedThird: - result = kB_Natural_QTP; - break; - - case kDiminishedFourth: - result = kC_DoubleFlat_QTP; - break; - case kPerfectFourth: - result = kC_Flat_QTP; - break; - case kAugmentedFourth: - result = kC_Natural_QTP; - break; - - case kDiminishedFifth: - result = kD_DoubleFlat_QTP; - break; - case kPerfectFifth: - result = kD_Flat_QTP; - break; - case kAugmentedFifth: - result = kD_Natural_QTP; - break; - - case kDiminishedSixth: - result = kE_TripleFlat_QTP; - break; - case kMinorSixth: - result = kE_DoubleFlat_QTP; - break; - case kMajorSixth: - result = kE_Flat_QTP; - break; - case kAugmentedSixth: - result = kE_Natural_QTP; - break; - - case kDiminishedSeventh: - result = kF_DoubleFlat_QTP; - break; - case kMinorSeventh: - result = kF_Flat_QTP; - break; - case kMajorSeventh: - result = kF_Natural_QTP; - break; - case kAugmentedSeventh: - result = kF_Sharp_QTP; - break; - - case kDiminishedOctave: - result = kG_DoubleFlat_QTP; - break; - case kPerfectOctave: - result = kG_Flat_QTP; - break; - case kAugmentedOctave: - result = kG_Natural_QTP; - break; - - case kDiminishedNinth: - result = kA_TripleFlat_QTP; - break; - case kMinorNinth: - result = kA_DoubleFlat_QTP; - break; - case kMajorNinth: - result = kA_Flat_QTP; - break; - case kAugmentedNinth: - result = kA_Natural_QTP; - break; - - case kDiminishedTenth: - result = kB_TripleFlat_QTP; - break; - case kMinorTenth: - result = kB_DoubleFlat_QTP; - break; - case kMajorTenth: - result = kB_Flat_QTP; - break; - case kAugmentedTenth: - result = kB_Natural_QTP; - break; - - case kDiminishedEleventh: - result = kC_DoubleFlat_QTP; - break; - case kPerfectEleventh: - result = kC_Flat_QTP; - break; - case kAugmentedEleventh: - result = kC_Natural_QTP; - break; - - case kDiminishedTwelfth: - result = kD_DoubleFlat_QTP; - break; - case kPerfectTwelfth: - result = kD_Flat_QTP; - break; - case kAugmentedTwelfth: - result = kD_Natural_QTP; - break; - - case kDiminishedThirteenth: - result = kE_TripleFlat_QTP; - break; - case kMinorThirteenth: - result = kE_DoubleFlat_QTP; - break; - case kMajorThirteenth: - result = kE_Flat_QTP; - break; - case kAugmentedThirteenth: - result = kE_Natural_QTP; - break; - } // switch - break; - - case kG_Natural_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kG_Flat_QTP; - break; - case kPerfectUnison: - result = kG_Natural_QTP; - break; - case kAugmentedUnison: - result = kG_Sharp_QTP; - break; - - case kDiminishedSecond: - result = kA_DoubleFlat_QTP; - break; - case kMinorSecond: - result = kA_Flat_QTP; - break; - case kMajorSecond: - result = kA_Natural_QTP; - break; - case kAugmentedSecond: - result = kA_Sharp_QTP; - break; - - case kDiminishedThird: - result = kB_DoubleFlat_QTP; - break; - case kMinorThird: - result = kB_Flat_QTP; - break; - case kMajorThird: - result = kB_Natural_QTP; - break; - case kAugmentedThird: - result = kB_Sharp_QTP; - break; - - case kDiminishedFourth: - result = kC_Flat_QTP; - break; - case kPerfectFourth: - result = kC_Natural_QTP; - break; - case kAugmentedFourth: - result = kC_Sharp_QTP; - break; - - case kDiminishedFifth: - result = kD_Flat_QTP; - break; - case kPerfectFifth: - result = kD_Natural_QTP; - break; - case kAugmentedFifth: - result = kD_Sharp_QTP; - break; - - case kDiminishedSixth: - result = kE_DoubleFlat_QTP; - break; - case kMinorSixth: - result = kE_Flat_QTP; - break; - case kMajorSixth: - result = kE_Natural_QTP; - break; - case kAugmentedSixth: - result = kE_Sharp_QTP; - break; - - case kDiminishedSeventh: - result = kF_Flat_QTP; - break; - case kMinorSeventh: - result = kF_Natural_QTP; - break; - case kMajorSeventh: - result = kF_Sharp_QTP; - break; - case kAugmentedSeventh: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedOctave: - result = kG_Flat_QTP; - break; - case kPerfectOctave: - result = kG_Natural_QTP; - break; - case kAugmentedOctave: - result = kG_Sharp_QTP; - break; - - case kDiminishedNinth: - result = kA_DoubleFlat_QTP; - break; - case kMinorNinth: - result = kA_Flat_QTP; - break; - case kMajorNinth: - result = kA_Natural_QTP; - break; - case kAugmentedNinth: - result = kA_Sharp_QTP; - break; - - case kDiminishedTenth: - result = kB_DoubleFlat_QTP; - break; - case kMinorTenth: - result = kB_Flat_QTP; - break; - case kMajorTenth: - result = kB_Natural_QTP; - break; - case kAugmentedTenth: - result = kB_Sharp_QTP; - break; - - case kDiminishedEleventh: - result = kC_Flat_QTP; - break; - case kPerfectEleventh: - result = kC_Natural_QTP; - break; - case kAugmentedEleventh: - result = kC_Sharp_QTP; - break; - - case kDiminishedTwelfth: - result = kD_Flat_QTP; - break; - case kPerfectTwelfth: - result = kD_Natural_QTP; - break; - case kAugmentedTwelfth: - result = kD_Sharp_QTP; - break; - - case kDiminishedThirteenth: - result = kE_DoubleFlat_QTP; - break; - case kMinorThirteenth: - result = kE_Flat_QTP; - break; - case kMajorThirteenth: - result = kE_Natural_QTP; - break; - case kAugmentedThirteenth: - result = kE_Sharp_QTP; - break; - } // switch - break; - - case kG_Sharp_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kG_Natural_QTP; - break; - case kPerfectUnison: - result = kG_Sharp_QTP; - break; - case kAugmentedUnison: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedSecond: - result = kA_Flat_QTP; - break; - case kMinorSecond: - result = kA_Natural_QTP; - break; - case kMajorSecond: - result = kA_Sharp_QTP; - break; - case kAugmentedSecond: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedThird: - result = kB_Flat_QTP; - break; - case kMinorThird: - result = kB_Natural_QTP; - break; - case kMajorThird: - result = kB_Sharp_QTP; - break; - case kAugmentedThird: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kC_Natural_QTP; - break; - case kPerfectFourth: - result = kC_Sharp_QTP; - break; - case kAugmentedFourth: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedFifth: - result = kD_Natural_QTP; - break; - case kPerfectFifth: - result = kD_Sharp_QTP; - break; - case kAugmentedFifth: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedSixth: - result = kE_Flat_QTP; - break; - case kMinorSixth: - result = kE_Natural_QTP; - break; - case kMajorSixth: - result = kE_Sharp_QTP; - break; - case kAugmentedSixth: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kF_Natural_QTP; - break; - case kMinorSeventh: - result = kF_Sharp_QTP; - break; - case kMajorSeventh: - result = kF_DoubleSharp_QTP; - break; - case kAugmentedSeventh: - result = kF_TripleSharp_QTP; - break; - - case kDiminishedOctave: - result = kG_Natural_QTP; - break; - case kPerfectOctave: - result = kG_Sharp_QTP; - break; - case kAugmentedOctave: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedNinth: - result = kA_Flat_QTP; - break; - case kMinorNinth: - result = kA_Natural_QTP; - break; - case kMajorNinth: - result = kA_Sharp_QTP; - break; - case kAugmentedNinth: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedTenth: - result = kB_Flat_QTP; - break; - case kMinorTenth: - result = kB_Natural_QTP; - break; - case kMajorTenth: - result = kB_Sharp_QTP; - break; - case kAugmentedTenth: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kC_Natural_QTP; - break; - case kPerfectEleventh: - result = kC_Sharp_QTP; - break; - case kAugmentedEleventh: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedTwelfth: - result = kD_Natural_QTP; - break; - case kPerfectTwelfth: - result = kD_Sharp_QTP; - break; - case kAugmentedTwelfth: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kE_Flat_QTP; - break; - case kMinorThirteenth: - result = kE_Natural_QTP; - break; - case kMajorThirteenth: - result = kE_Sharp_QTP; - break; - case kAugmentedThirteenth: - result = kE_DoubleSharp_QTP; - break; - } // switch - break; - - case kA_Flat_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kA_DoubleFlat_QTP; - break; - case kPerfectUnison: - result = kA_Flat_QTP; - break; - case kAugmentedUnison: - result = kA_Natural_QTP; - break; - - case kDiminishedSecond: - result = kB_TripleFlat_QTP; - break; - case kMinorSecond: - result = kB_DoubleFlat_QTP; - break; - case kMajorSecond: - result = kB_Flat_QTP; - break; - case kAugmentedSecond: - result = kB_Natural_QTP; - break; - - case kDiminishedThird: - result = kC_DoubleFlat_QTP; - break; - case kMinorThird: - result = kC_Flat_QTP; - break; - case kMajorThird: - result = kC_Natural_QTP; - break; - case kAugmentedThird: - result = kC_Sharp_QTP; - break; - - case kDiminishedFourth: - result = kD_DoubleFlat_QTP; - break; - case kPerfectFourth: - result = kD_Flat_QTP; - break; - case kAugmentedFourth: - result = kD_Natural_QTP; - break; - - case kDiminishedFifth: - result = kE_DoubleFlat_QTP; - break; - case kPerfectFifth: - result = kE_Flat_QTP; - break; - case kAugmentedFifth: - result = kE_Natural_QTP; - break; - - case kDiminishedSixth: - result = kF_DoubleFlat_QTP; - break; - case kMinorSixth: - result = kF_Flat_QTP; - break; - case kMajorSixth: - result = kF_Natural_QTP; - break; - case kAugmentedSixth: - result = kF_Sharp_QTP; - break; - - case kDiminishedSeventh: - result = kG_DoubleFlat_QTP; - break; - case kMinorSeventh: - result = kG_Flat_QTP; - break; - case kMajorSeventh: - result = kG_Natural_QTP; - break; - case kAugmentedSeventh: - result = kG_Sharp_QTP; - break; - - case kDiminishedOctave: - result = kA_DoubleFlat_QTP; - break; - case kPerfectOctave: - result = kA_Flat_QTP; - break; - case kAugmentedOctave: - result = kA_Natural_QTP; - break; - - case kDiminishedNinth: - result = kB_TripleFlat_QTP; - break; - case kMinorNinth: - result = kB_DoubleFlat_QTP; - break; - case kMajorNinth: - result = kB_Flat_QTP; - break; - case kAugmentedNinth: - result = kB_Natural_QTP; - break; - - case kDiminishedTenth: - result = kC_DoubleFlat_QTP; - break; - case kMinorTenth: - result = kC_Flat_QTP; - break; - case kMajorTenth: - result = kC_Natural_QTP; - break; - case kAugmentedTenth: - result = kC_Sharp_QTP; - break; - - case kDiminishedEleventh: - result = kD_DoubleFlat_QTP; - break; - case kPerfectEleventh: - result = kD_Flat_QTP; - break; - case kAugmentedEleventh: - result = kD_Natural_QTP; - break; - - case kDiminishedTwelfth: - result = kE_DoubleFlat_QTP; - break; - case kPerfectTwelfth: - result = kE_Flat_QTP; - break; - case kAugmentedTwelfth: - result = kE_Natural_QTP; - break; - - case kDiminishedThirteenth: - result = kF_TripleFlat_QTP; - break; - case kMinorThirteenth: - result = kF_DoubleFlat_QTP; - break; - case kMajorThirteenth: - result = kF_Flat_QTP; - break; - case kAugmentedThirteenth: - result = kF_Natural_QTP; - break; - } // switch - break; - - case kA_Natural_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kA_Flat_QTP; - break; - case kPerfectUnison: - result = kA_Natural_QTP; - break; - case kAugmentedUnison: - result = kA_Sharp_QTP; - break; - - case kDiminishedSecond: - result = kB_DoubleFlat_QTP; - break; - case kMinorSecond: - result = kB_Flat_QTP; - break; - case kMajorSecond: - result = kB_Natural_QTP; - break; - case kAugmentedSecond: - result = kB_Sharp_QTP; - break; - - case kDiminishedThird: - result = kC_Flat_QTP; - break; - case kMinorThird: - result = kC_Natural_QTP; - break; - case kMajorThird: - result = kC_Sharp_QTP; - break; - case kAugmentedThird: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kD_Flat_QTP; - break; - case kPerfectFourth: - result = kD_Natural_QTP; - break; - case kAugmentedFourth: - result = kD_Sharp_QTP; - break; - - case kDiminishedFifth: - result = kE_Flat_QTP; - break; - case kPerfectFifth: - result = kE_Natural_QTP; - break; - case kAugmentedFifth: - result = kE_Sharp_QTP; - break; - - case kDiminishedSixth: - result = kF_Flat_QTP; - break; - case kMinorSixth: - result = kF_Natural_QTP; - break; - case kMajorSixth: - result = kF_Sharp_QTP; - break; - case kAugmentedSixth: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kG_Flat_QTP; - break; - case kMinorSeventh: - result = kG_Natural_QTP; - break; - case kMajorSeventh: - result = kG_Sharp_QTP; - break; - case kAugmentedSeventh: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedOctave: - result = kA_Flat_QTP; - break; - case kPerfectOctave: - result = kA_Natural_QTP; - break; - case kAugmentedOctave: - result = kA_Sharp_QTP; - break; - - case kDiminishedNinth: - result = kB_DoubleFlat_QTP; - break; - case kMinorNinth: - result = kB_Flat_QTP; - break; - case kMajorNinth: - result = kB_Natural_QTP; - break; - case kAugmentedNinth: - result = kB_Sharp_QTP; - break; - - case kDiminishedTenth: - result = kC_Flat_QTP; - break; - case kMinorTenth: - result = kC_Natural_QTP; - break; - case kMajorTenth: - result = kC_Sharp_QTP; - break; - case kAugmentedTenth: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kD_Flat_QTP; - break; - case kPerfectEleventh: - result = kD_Natural_QTP; - break; - case kAugmentedEleventh: - result = kD_Sharp_QTP; - break; - - case kDiminishedTwelfth: - result = kE_Flat_QTP; - break; - case kPerfectTwelfth: - result = kE_Natural_QTP; - break; - case kAugmentedTwelfth: - result = kE_Sharp_QTP; - break; - - case kDiminishedThirteenth: - result = kF_Flat_QTP; - break; - case kMinorThirteenth: - result = kF_Natural_QTP; - break; - case kMajorThirteenth: - result = kF_Sharp_QTP; - break; - case kAugmentedThirteenth: - result = kF_DoubleSharp_QTP; - break; - } // switch - break; - - case kA_Sharp_QTP: - break; - - case kB_Flat_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kB_DoubleFlat_QTP; - break; - case kPerfectUnison: - result = kB_Flat_QTP; - break; - case kAugmentedUnison: - result = kB_Natural_QTP; - break; - - case kDiminishedSecond: - result = kC_DoubleFlat_QTP; - break; - case kMinorSecond: - result = kC_Flat_QTP; - break; - case kMajorSecond: - result = kC_Natural_QTP; - break; - case kAugmentedSecond: - result = kC_Sharp_QTP; - break; - - case kDiminishedThird: - result = kD_DoubleFlat_QTP; - break; - case kMinorThird: - result = kD_Flat_QTP; - break; - case kMajorThird: - result = kD_Natural_QTP; - break; - case kAugmentedThird: - result = kD_Sharp_QTP; - break; - - case kDiminishedFourth: - result = kE_DoubleFlat_QTP; - break; - case kPerfectFourth: - result = kE_Flat_QTP; - break; - case kAugmentedFourth: - result = kE_Natural_QTP; - break; - - case kDiminishedFifth: - result = kF_Flat_QTP; - break; - case kPerfectFifth: - result = kF_Natural_QTP; - break; - case kAugmentedFifth: - result = kF_Sharp_QTP; - break; - - case kDiminishedSixth: - result = kG_DoubleFlat_QTP; - break; - case kMinorSixth: - result = kG_Flat_QTP; - break; - case kMajorSixth: - result = kG_Natural_QTP; - break; - case kAugmentedSixth: - result = kG_Sharp_QTP; - break; - - case kDiminishedSeventh: - result = kA_DoubleFlat_QTP; - break; - case kMinorSeventh: - result = kA_Flat_QTP; - break; - case kMajorSeventh: - result = kA_Natural_QTP; - break; - case kAugmentedSeventh: - result = kA_Sharp_QTP; - break; - - case kDiminishedOctave: - result = kB_DoubleFlat_QTP; - break; - case kPerfectOctave: - result = kB_Flat_QTP; - break; - case kAugmentedOctave: - result = kB_Natural_QTP; - break; - - case kDiminishedNinth: - result = kC_DoubleFlat_QTP; - break; - case kMinorNinth: - result = kC_Flat_QTP; - break; - case kMajorNinth: - result = kC_Natural_QTP; - break; - case kAugmentedNinth: - result = kC_Sharp_QTP; - break; - - case kDiminishedTenth: - result = kD_DoubleFlat_QTP; - break; - case kMinorTenth: - result = kD_Flat_QTP; - break; - case kMajorTenth: - result = kD_Natural_QTP; - break; - case kAugmentedTenth: - result = kD_Sharp_QTP; - break; - - case kDiminishedEleventh: - result = kE_DoubleFlat_QTP; - break; - case kPerfectEleventh: - result = kE_Flat_QTP; - break; - case kAugmentedEleventh: - result = kE_Natural_QTP; - break; - - case kDiminishedTwelfth: - result = kF_Flat_QTP; - break; - case kPerfectTwelfth: - result = kF_Natural_QTP; - break; - case kAugmentedTwelfth: - result = kF_Sharp_QTP; - break; - - case kDiminishedThirteenth: - result = kG_DoubleFlat_QTP; - break; - case kMinorThirteenth: - result = kG_Flat_QTP; - break; - case kMajorThirteenth: - result = kG_Natural_QTP; - break; - case kAugmentedThirteenth: - result = kG_Sharp_QTP; - break; - } // switch - break; - - case kB_Natural_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kB_Flat_QTP; - break; - case kPerfectUnison: - result = kB_Natural_QTP; - break; - case kAugmentedUnison: - result = kB_Sharp_QTP; - break; - - case kDiminishedSecond: - result = kC_Flat_QTP; - break; - case kMinorSecond: - result = kC_Natural_QTP; - break; - case kMajorSecond: - result = kC_Sharp_QTP; - break; - case kAugmentedSecond: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedThird: - result = kD_Flat_QTP; - break; - case kMinorThird: - result = kD_Natural_QTP; - break; - case kMajorThird: - result = kD_Sharp_QTP; - break; - case kAugmentedThird: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedFourth: - result = kE_Flat_QTP; - break; - case kPerfectFourth: - result = kE_Natural_QTP; - break; - case kAugmentedFourth: - result = kE_Sharp_QTP; - break; - - case kDiminishedFifth: - result = kF_Natural_QTP; - break; - case kPerfectFifth: - result = kF_Sharp_QTP; - break; - case kAugmentedFifth: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedSixth: - result = kG_Flat_QTP; - break; - case kMinorSixth: - result = kG_Natural_QTP; - break; - case kMajorSixth: - result = kG_Sharp_QTP; - break; - case kAugmentedSixth: - result = kG_DoubleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kA_Flat_QTP; - break; - case kMinorSeventh: - result = kA_Natural_QTP; - break; - case kMajorSeventh: - result = kA_Sharp_QTP; - break; - case kAugmentedSeventh: - result = kA_DoubleSharp_QTP; - break; - - case kDiminishedOctave: - result = kB_Flat_QTP; - break; - case kPerfectOctave: - result = kB_Natural_QTP; - break; - case kAugmentedOctave: - result = kB_Sharp_QTP; - break; - - case kDiminishedNinth: - result = kC_Flat_QTP; - break; - case kMinorNinth: - result = kC_Natural_QTP; - break; - case kMajorNinth: - result = kC_Sharp_QTP; - break; - case kAugmentedNinth: - result = kC_DoubleSharp_QTP; - break; - - case kDiminishedTenth: - result = kD_Flat_QTP; - break; - case kMinorTenth: - result = kD_Natural_QTP; - break; - case kMajorTenth: - result = kD_Sharp_QTP; - break; - case kAugmentedTenth: - result = kD_DoubleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kE_Flat_QTP; - break; - case kPerfectEleventh: - result = kE_Natural_QTP; - break; - case kAugmentedEleventh: - result = kE_Sharp_QTP; - break; - - case kDiminishedTwelfth: - result = kF_Natural_QTP; - break; - case kPerfectTwelfth: - result = kF_Sharp_QTP; - break; - case kAugmentedTwelfth: - result = kF_DoubleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kG_Flat_QTP; - break; - case kMinorThirteenth: - result = kG_Natural_QTP; - break; - case kMajorThirteenth: - result = kG_Sharp_QTP; - break; - case kAugmentedThirteenth: - result = kG_DoubleSharp_QTP; - break; - } // switch - break; - - case kB_Sharp_QTP: - switch (intervalKind) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - result = kB_Natural_QTP; - break; - case kPerfectUnison: - result = kB_Sharp_QTP; - break; - case kAugmentedUnison: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedSecond: - result = kC_Natural_QTP; - break; - case kMinorSecond: - result = kC_Sharp_QTP; - break; - case kMajorSecond: - result = kC_DoubleSharp_QTP; - break; - case kAugmentedSecond: - result = kC_TripleSharp_QTP; - break; - - case kDiminishedThird: - result = kD_Natural_QTP; - break; - case kMinorThird: - result = kD_Sharp_QTP; - break; - case kMajorThird: - result = kD_DoubleSharp_QTP; - break; - case kAugmentedThird: - result = kD_TripleSharp_QTP; - break; - - case kDiminishedFourth: - result = kE_Natural_QTP; - break; - case kPerfectFourth: - result = kE_Sharp_QTP; - break; - case kAugmentedFourth: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedFifth: - result = kF_Sharp_QTP; - break; - case kPerfectFifth: - result = kF_DoubleSharp_QTP; - break; - case kAugmentedFifth: - result = kF_TripleSharp_QTP; - break; - - case kDiminishedSixth: - result = kG_Natural_QTP; - break; - case kMinorSixth: - result = kG_Sharp_QTP; - break; - case kMajorSixth: - result = kG_DoubleSharp_QTP; - break; - case kAugmentedSixth: - result = kG_TripleSharp_QTP; - break; - - case kDiminishedSeventh: - result = kA_Natural_QTP; - break; - case kMinorSeventh: - result = kA_Sharp_QTP; - break; - case kMajorSeventh: - result = kA_DoubleSharp_QTP; - break; - case kAugmentedSeventh: - result = kA_TripleSharp_QTP; - break; - - case kDiminishedOctave: - result = kB_Natural_QTP; - break; - case kPerfectOctave: - result = kB_Sharp_QTP; - break; - case kAugmentedOctave: - result = kB_DoubleSharp_QTP; - break; - - case kDiminishedNinth: - result = kC_Natural_QTP; - break; - case kMinorNinth: - result = kC_Sharp_QTP; - break; - case kMajorNinth: - result = kC_DoubleSharp_QTP; - break; - case kAugmentedNinth: - result = kC_TripleSharp_QTP; - break; - - case kDiminishedTenth: - result = kD_Natural_QTP; - break; - case kMinorTenth: - result = kD_Sharp_QTP; - break; - case kMajorTenth: - result = kD_DoubleSharp_QTP; - break; - case kAugmentedTenth: - result = kD_TripleSharp_QTP; - break; - - case kDiminishedEleventh: - result = kE_Natural_QTP; - break; - case kPerfectEleventh: - result = kE_Sharp_QTP; - break; - case kAugmentedEleventh: - result = kE_DoubleSharp_QTP; - break; - - case kDiminishedTwelfth: - result = kF_Sharp_QTP; - break; - case kPerfectTwelfth: - result = kF_DoubleSharp_QTP; - break; - case kAugmentedTwelfth: - result = kF_TripleSharp_QTP; - break; - - case kDiminishedThirteenth: - result = kG_Natural_QTP; - break; - case kMinorThirteenth: - result = kG_Sharp_QTP; - break; - case kMajorThirteenth: - result = kG_DoubleSharp_QTP; - break; - case kAugmentedThirteenth: - result = kG_TripleSharp_QTP; - break; - } // switch - break; - - default: - { - // computing intervals on double or triple flats/sharps - // is not considered useful, hence not supported - stringstream s; - - s << - "Sorry, computing intervals from quartertones pitch '" << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - quarterTonesPitchKind) << - "(" << quarterTonesPitchKind << ")" << - "' is not supported" - ", line = " << inputLineNumber; - - msrLimitation ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // switch - - return result; -} - -msrIntervalKind intervalBetweenSemiTonesPitches ( - msrSemiTonesPitchKind semiTonesPitch1, - msrSemiTonesPitchKind semiTonesPitch2) -{ - msrIntervalKind result = k_NoIntervalKind; - - msrSemiTonesPitchKind - workSemiTonesPitch1 = semiTonesPitch1, - workSemiTonesPitch2 = semiTonesPitch2; - - // order the semitones pitches so that - // workSemiTonesPitch1 is greater or equal to workSemiTonesPitch2 - // according to the enum type - bool invertInterval = false; - - if (semiTonesPitch1 < semiTonesPitch2) { - workSemiTonesPitch1 = semiTonesPitch2; - workSemiTonesPitch2 = semiTonesPitch1; - invertInterval = true; - } - - switch (workSemiTonesPitch1) { - case k_NoSemiTonesPitch_STP: - break; - - case kC_TripleFlat_STP: - switch (workSemiTonesPitch2) { - case k_NoSemiTonesPitch_STP: - break; - - /* - kDiminishedUnisson, kPerfectUnison, kAugmentedUnison, - - kDiminishedSecond, kMinorSecond, kMajorSecond, kAugmentedSecond, - - kDiminishedThird, kMinorThird, kMajorThird, kAugmentedThird, - - kDiminishedFourth, kPerfectFourth, kAugmentedFourth, - - kDiminishedFifth, kPerfectFifth, kAugmentedFifth, - - kDiminishedSixth, kMinorSixth, kMajorSixth, kAugmentedSixth, - - kDiminishedSeventh, kMinorSeventh, kMajorSeventh, kAugmentedSeventh, - - kDiminishedOctave, kPerfectOctave, kAugmentedOctave, - - kDiminishedNinth, kMinorNinth, kMajorNinth, kAugmentedNinth, - - kDiminishedTenth, kMinorTenth, kMajorTenth, kAugmentedTenth, - - kDiminishedEleventh, kPerfectEleventh, kAugmentedEleventh, - - kDiminishedTwelfth, kPerfectTwelfth, kAugmentedTwelfth, - - kDiminishedThirteenth, kMinorThirteenth, kMajorThirteenth, kAugmentedThirteenth }; - -*/ - - case kC_TripleFlat_STP: - break; - case kC_DoubleFlat_STP: - break; - case kC_Flat_STP: - break; - case kC_Natural_STP: - break; - case kC_Sharp_STP: - break; - case kC_DoubleSharp_STP: - break; - case kC_TripleSharp_STP: - break; - - case kD_TripleFlat_STP: - break; - case kD_DoubleFlat_STP: - break; - case kD_Flat_STP: - break; - case kD_Natural_STP: - break; - case kD_Sharp_STP: - break; - case kD_DoubleSharp_STP: - break; - case kD_TripleSharp_STP: - break; - - case kE_TripleFlat_STP: - break; - case kE_DoubleFlat_STP: - break; - case kE_Flat_STP: - break; - case kE_Natural_STP: - break; - case kE_Sharp_STP: - break; - case kE_DoubleSharp_STP: - break; - case kE_TripleSharp_STP: - break; - - case kF_TripleFlat_STP: - break; - case kF_DoubleFlat_STP: - break; - case kF_Flat_STP: - break; - case kF_Natural_STP: - break; - case kF_Sharp_STP: - break; - case kF_DoubleSharp_STP: - break; - case kF_TripleSharp_STP: - break; - - case kG_TripleFlat_STP: - break; - case kG_DoubleFlat_STP: - break; - case kG_Flat_STP: - break; - case kG_Natural_STP: - break; - case kG_Sharp_STP: - break; - case kG_DoubleSharp_STP: - break; - case kG_TripleSharp_STP: - break; - - case kA_TripleFlat_STP: - break; - case kA_DoubleFlat_STP: - break; - case kA_Flat_STP: - break; - case kA_Natural_STP: - break; - case kA_Sharp_STP: - break; - case kA_DoubleSharp_STP: - break; - case kA_TripleSharp_STP: - break; - - case kB_TripleFlat_STP: - break; - case kB_DoubleFlat_STP: - break; - case kB_Flat_STP: - break; - case kB_Natural_STP: - break; - case kB_Sharp_STP: - break; - case kB_DoubleSharp_STP: - break; - case kB_TripleSharp_STP: - break; - } // switch - break; - - case kC_DoubleFlat_STP: - break; - case kC_Flat_STP: - break; - case kC_Natural_STP: - break; - case kC_Sharp_STP: - break; - case kC_DoubleSharp_STP: - break; - case kC_TripleSharp_STP: - break; - - case kD_TripleFlat_STP: - break; - case kD_DoubleFlat_STP: - break; - case kD_Flat_STP: - break; - case kD_Natural_STP: - break; - case kD_Sharp_STP: - break; - case kD_DoubleSharp_STP: - break; - case kD_TripleSharp_STP: - break; - - case kE_TripleFlat_STP: - break; - case kE_DoubleFlat_STP: - break; - case kE_Flat_STP: - break; - case kE_Natural_STP: - break; - case kE_Sharp_STP: - break; - case kE_DoubleSharp_STP: - break; - case kE_TripleSharp_STP: - break; - - case kF_TripleFlat_STP: - break; - case kF_DoubleFlat_STP: - break; - case kF_Flat_STP: - break; - case kF_Natural_STP: - break; - case kF_Sharp_STP: - break; - case kF_DoubleSharp_STP: - break; - case kF_TripleSharp_STP: - break; - - case kG_TripleFlat_STP: - break; - case kG_DoubleFlat_STP: - break; - case kG_Flat_STP: - break; - case kG_Natural_STP: - break; - case kG_Sharp_STP: - break; - case kG_DoubleSharp_STP: - break; - case kG_TripleSharp_STP: - break; - - case kA_TripleFlat_STP: - break; - case kA_DoubleFlat_STP: - break; - case kA_Flat_STP: - break; - case kA_Natural_STP: - break; - case kA_Sharp_STP: - break; - case kA_DoubleSharp_STP: - break; - case kA_TripleSharp_STP: - break; - - case kB_TripleFlat_STP: - break; - case kB_DoubleFlat_STP: - break; - case kB_Flat_STP: - break; - case kB_Natural_STP: - break; - case kB_Sharp_STP: - break; - - case kB_DoubleSharp_STP: - switch (workSemiTonesPitch2) { - case k_NoSemiTonesPitch_STP: - break; - - /* - kDiminishedUnisson, kPerfectUnison, kAugmentedUnison, - - kDiminishedSecond, kMinorSecond, kMajorSecond, kAugmentedSecond, - - kDiminishedThird, kMinorThird, kMajorThird, kAugmentedThird, - - kDiminishedFourth, kPerfectFourth, kAugmentedFourth, - - kDiminishedFifth, kPerfectFifth, kAugmentedFifth, - - kDiminishedSixth, kMinorSixth, kMajorSixth, kAugmentedSixth, - - kDiminishedSeventh, kMinorSeventh, kMajorSeventh, kAugmentedSeventh, - - kDiminishedOctave, kPerfectOctave, kAugmentedOctave, - - kDiminishedNinth, kMinorNinth, kMajorNinth, kAugmentedNinth, - - kDiminishedTenth, kMinorTenth, kMajorTenth, kAugmentedTenth, - - kDiminishedEleventh, kPerfectEleventh, kAugmentedEleventh, - - kDiminishedTwelfth, kPerfectTwelfth, kAugmentedTwelfth, - - kDiminishedThirteenth, kMinorThirteenth, kMajorThirteenth, kAugmentedThirteenth }; - -*/ - - case kC_TripleFlat_STP: - break; - case kC_DoubleFlat_STP: - break; - case kC_Flat_STP: - break; - case kC_Natural_STP: - break; - case kC_Sharp_STP: - break; - case kC_DoubleSharp_STP: - break; - case kC_TripleSharp_STP: - break; - - case kD_TripleFlat_STP: - break; - case kD_DoubleFlat_STP: - break; - case kD_Flat_STP: - break; - case kD_Natural_STP: - break; - case kD_Sharp_STP: - break; - case kD_DoubleSharp_STP: - break; - case kD_TripleSharp_STP: - break; - - case kE_TripleFlat_STP: - break; - case kE_DoubleFlat_STP: - break; - case kE_Flat_STP: - break; - case kE_Natural_STP: - break; - case kE_Sharp_STP: - break; - case kE_DoubleSharp_STP: - break; - case kE_TripleSharp_STP: - break; - - case kF_TripleFlat_STP: - break; - case kF_DoubleFlat_STP: - break; - case kF_Flat_STP: - break; - case kF_Natural_STP: - break; - case kF_Sharp_STP: - break; - case kF_DoubleSharp_STP: - break; - case kF_TripleSharp_STP: - break; - - case kG_TripleFlat_STP: - break; - case kG_DoubleFlat_STP: - break; - case kG_Flat_STP: - break; - case kG_Natural_STP: - break; - case kG_Sharp_STP: - break; - case kG_DoubleSharp_STP: - break; - case kG_TripleSharp_STP: - break; - - case kA_TripleFlat_STP: - break; - case kA_DoubleFlat_STP: - break; - case kA_Flat_STP: - break; - case kA_Natural_STP: - break; - case kA_Sharp_STP: - break; - case kA_DoubleSharp_STP: - break; - case kA_TripleSharp_STP: - break; - - case kB_TripleFlat_STP: - break; - case kB_DoubleFlat_STP: - break; - case kB_Flat_STP: - break; - case kB_Natural_STP: - break; - case kB_Sharp_STP: - result = kAugmentedUnison; - break; - case kB_DoubleSharp_STP: - result = kPerfectUnison; - break; - case kB_TripleSharp_STP: - result = kPerfectUnison; - break; - } // switch - break; - - case kB_TripleSharp_STP: - switch (workSemiTonesPitch2) { - case k_NoSemiTonesPitch_STP: - break; - - /* - kDiminishedUnisson, kPerfectUnison, kAugmentedUnison, - - kDiminishedSecond, kMinorSecond, kMajorSecond, kAugmentedSecond, - - kDiminishedThird, kMinorThird, kMajorThird, kAugmentedThird, - - kDiminishedFourth, kPerfectFourth, kAugmentedFourth, - - kDiminishedFifth, kPerfectFifth, kAugmentedFifth, - - kDiminishedSixth, kMinorSixth, kMajorSixth, kAugmentedSixth, - - kDiminishedSeventh, kMinorSeventh, kMajorSeventh, kAugmentedSeventh, - - kDiminishedOctave, kPerfectOctave, kAugmentedOctave, - - kDiminishedNinth, kMinorNinth, kMajorNinth, kAugmentedNinth, - - kDiminishedTenth, kMinorTenth, kMajorTenth, kAugmentedTenth, - - kDiminishedEleventh, kPerfectEleventh, kAugmentedEleventh, - - kDiminishedTwelfth, kPerfectTwelfth, kAugmentedTwelfth, - - kDiminishedThirteenth, kMinorThirteenth, kMajorThirteenth, kAugmentedThirteenth }; - -*/ - - case kC_TripleFlat_STP: - break; - case kC_DoubleFlat_STP: - break; - case kC_Flat_STP: - break; - case kC_Natural_STP: - break; - case kC_Sharp_STP: - break; - case kC_DoubleSharp_STP: - break; - case kC_TripleSharp_STP: - break; - - case kD_TripleFlat_STP: - break; - case kD_DoubleFlat_STP: - break; - case kD_Flat_STP: - break; - case kD_Natural_STP: - break; - case kD_Sharp_STP: - break; - case kD_DoubleSharp_STP: - break; - case kD_TripleSharp_STP: - break; - - case kE_TripleFlat_STP: - break; - case kE_DoubleFlat_STP: - break; - case kE_Flat_STP: - break; - case kE_Natural_STP: - break; - case kE_Sharp_STP: - break; - case kE_DoubleSharp_STP: - break; - case kE_TripleSharp_STP: - break; - - case kF_TripleFlat_STP: - break; - case kF_DoubleFlat_STP: - break; - case kF_Flat_STP: - break; - case kF_Natural_STP: - break; - case kF_Sharp_STP: - break; - case kF_DoubleSharp_STP: - break; - case kF_TripleSharp_STP: - break; - - case kG_TripleFlat_STP: - break; - case kG_DoubleFlat_STP: - break; - case kG_Flat_STP: - break; - case kG_Natural_STP: - break; - case kG_Sharp_STP: - break; - case kG_DoubleSharp_STP: - break; - case kG_TripleSharp_STP: - break; - - case kA_TripleFlat_STP: - break; - case kA_DoubleFlat_STP: - break; - case kA_Flat_STP: - break; - case kA_Natural_STP: - break; - case kA_Sharp_STP: - break; - case kA_DoubleSharp_STP: - break; - case kA_TripleSharp_STP: - break; - - case kB_TripleFlat_STP: - break; - case kB_DoubleFlat_STP: - break; - case kB_Flat_STP: - break; - case kB_Natural_STP: - break; - case kB_Sharp_STP: - break; - case kB_DoubleSharp_STP: - result = kAugmentedUnison; - break; - case kB_TripleSharp_STP: - result = kPerfectUnison; - break; - } // switch - break; - } // switch - - if (invertInterval) { - result = invertIntervalKind (result); - } - - return result; -} - -// harmonies -//______________________________________________________________________________ -string msrHarmonyKindAsString ( - msrHarmonyKind harmonyKind) -{ - string result; - - switch (harmonyKind) { - case k_NoHarmony: - result = "noHarmony"; - break; - - // MusicXML chords - - case kMajorHarmony: - result = "major"; - break; - case kMinorHarmony: - result = "minor"; - break; - case kAugmentedHarmony: - result = "augmented"; - break; - case kDiminishedHarmony: - result = "diminished"; - break; - - case kDominantHarmony: - result = "dominant"; - break; - case kMajorSeventhHarmony: - result = "majorSeventh"; - break; - case kMinorSeventhHarmony: - result = "minorSeventh"; - break; - case kDiminishedSeventhHarmony: - result = "diminishedSeventh"; - break; - case kAugmentedSeventhHarmony: - result = "augmentedSeventh"; - break; - case kHalfDiminishedHarmony: - result = "halfDiminished"; - break; - case kMinorMajorSeventhHarmony: - result = "minorMajorSeventhHarmony"; - break; - - case kMajorSixthHarmony: - result = "majorSixth"; - break; - case kMinorSixthHarmony: - result = "minorSixth"; - break; - - case kDominantNinthHarmony: - result = "dominantNinth"; - break; - case kMajorNinthHarmony: - result = "majorNinth"; - break; - case kMinorNinthHarmony: - result = "minorNinth"; - break; - - case kDominantEleventhHarmony: - result = "dominantEleventh"; - break; - case kMajorEleventhHarmony: - result = "majorEleventh"; - break; - case kMinorEleventhHarmony: - result = "minorEleventh"; - break; - - case kDominantThirteenthHarmony: - result = "dominantThirteenth"; - break; - case kMajorThirteenthHarmony: - result = "majorThirteenth"; - break; - case kMinorThirteenthHarmony: - result = "minorThirteenth"; - break; - - case kSuspendedSecondHarmony: - result = "suspendedSecond"; - break; - case kSuspendedFourthHarmony: - result = "suspendedFourth"; - break; - - case kNeapolitanHarmony: - result = "neapolitan"; - break; - case kItalianHarmony: - result = "italian"; - break; - case kFrenchHarmony: - result = "french"; - break; - case kGermanHarmony: - result = "german"; - break; - - case kPedalHarmony: - result = "pedal"; - break; - case kPowerHarmony: - result = "power"; - break; - case kTristanHarmony: - result = "tristan"; - break; - - // jazz-specific chords - - case kMinorMajorNinth: // -maj9, minmaj9 - result = "minorMajorNinth"; - break; - - case kDominantSuspendedFourthHarmony: // 7sus4, domsus4 - result = "dominantSuspendedFourthHarmony"; - break; - case kDominantAugmentedFifthHarmony: // 7#5, domaug5 - result = "dominantAugmentedFifthHarmony"; - break; - case kDominantMinorNinthHarmony: // 7b9, dommin9 - result = "dominantMinorNinthHarmony"; - break; - case kDominantAugmentedNinthDiminishedFifthHarmony: // 7#9b5, domaug9dim5 - result = "dominantAugmentedNinthDiminishedFifthHarmony"; - break; - case kDominantAugmentedNinthAugmentedFifthHarmony: // 7#9#5, domaug9aug5 - result = "dominantAugmentedNinthAugmentedFifthHarmony"; - break; - case kDominantAugmentedEleventhHarmony: // 7#11, domaug11 - result = "dominantAugmentedEleventhHarmony"; - break; - - case kMajorSeventhAugmentedEleventhHarmony: // maj7#11, maj7aug11 - result = "majorSeventhAugmentedEleventhHarmony"; - break; - - // other - - case kOtherHarmony: - result = "other"; - break; - case kNoneHarmony: - result = "none"; - break; - } // switch - - return result; -} - -string msrHarmonyKindAsShortString ( - msrHarmonyKind harmonyKind) -{ - string result; - - switch (harmonyKind) { - case k_NoHarmony: - result = "noHarmony"; - break; - - // MusicXML chords - - case kMajorHarmony: - result = "M"; - break; - case kMinorHarmony: - result = "m"; - break; - case kAugmentedHarmony: - result = "+"; - break; - case kDiminishedHarmony: - result = "dim"; - break; - - case kDominantHarmony: - result = "7"; - break; - case kMajorSeventhHarmony: - result = "∆7"; - break; - case kMinorSeventhHarmony: - result = "m7"; - break; - case kDiminishedSeventhHarmony: - result = "7/5-"; - break; - case kAugmentedSeventhHarmony: - result = "7/5+"; - break; - case kHalfDiminishedHarmony: - result = "ø7"; - break; - case kMinorMajorSeventhHarmony: - result = "m∆7"; - break; - - case kMajorSixthHarmony: - result = "6"; - break; - case kMinorSixthHarmony: - result = "m6"; - break; - - case kDominantNinthHarmony: - result = "9"; - break; - case kMajorNinthHarmony: - result = "∆7/9"; - break; - case kMinorNinthHarmony: - result = "m∆7/9"; - break; - - case kDominantEleventhHarmony: - result = "11"; - break; - case kMajorEleventhHarmony: - result = "∆7/11"; - break; - case kMinorEleventhHarmony: - result = "m∆7/11"; - break; - - case kDominantThirteenthHarmony: - result = "13"; - break; - case kMajorThirteenthHarmony: - result = "∆7/13"; - break; - case kMinorThirteenthHarmony: - result = "m∆7/13"; - break; - - case kSuspendedSecondHarmony: - result = "sus2"; - break; - case kSuspendedFourthHarmony: - result = "sus4"; - break; - - case kNeapolitanHarmony: - result = "Neapolitan"; - break; - case kItalianHarmony: - result = "Italian"; - break; - case kFrenchHarmony: - result = "French"; - break; - case kGermanHarmony: - result = "German"; - break; - - case kPedalHarmony: - result = "Pedal"; - break; - case kPowerHarmony: - result = "Power"; - break; - case kTristanHarmony: - result = "Tristan"; - break; - - // jazz-specific chords - - case kMinorMajorNinth: // -maj9, minmaj9 - result = "m∆9"; - break; - - case kDominantSuspendedFourthHarmony: // 7sus4, domsus4 - result = "7sus4"; - break; - case kDominantAugmentedFifthHarmony: // 7#5, domaug5 - result = "7#5"; - break; - case kDominantMinorNinthHarmony: // 7b9, dommin9 - result = "7b9"; - break; - case kDominantAugmentedNinthDiminishedFifthHarmony: // 7#9b5, domaug9dim5 - result = "7#9b5"; - break; - case kDominantAugmentedNinthAugmentedFifthHarmony: // 7#9#5, domaug9aug5 - result = "7#9#5"; - break; - case kDominantAugmentedEleventhHarmony: // 7#11, domaug11 - result = "7#11"; - break; - - case kMajorSeventhAugmentedEleventhHarmony: // maj7#11, maj7aug11 - result = "maj7#11"; - break; - - // other - - case kOtherHarmony: - result = "Other"; - break; - case kNoneHarmony: - result = "None"; - break; - } // switch - - return result; -} - -string msrHarmonyKindShortName ( - msrHarmonyKind harmonyKind) -{ - string result; - - switch (harmonyKind) { - case k_NoHarmony: - result = "noHarmony"; - break; - - // MusicXML chords - - case kMajorHarmony: - result = "maj"; - break; - case kMinorHarmony: - result = "min"; - break; - case kAugmentedHarmony: - result = "aug"; - break; - case kDiminishedHarmony: - result = "dim"; - break; - - case kDominantHarmony: - result = "dom"; - break; - case kMajorSeventhHarmony: - result = "maj"; - break; - case kMinorSeventhHarmony: - result = "min7"; - break; - case kDiminishedSeventhHarmony: - result = "dim7"; - break; - case kAugmentedSeventhHarmony: - result = "aug7"; - break; - case kHalfDiminishedHarmony: - result = "halfdim"; - break; - case kMinorMajorSeventhHarmony: - result = "minmaj7"; - break; - - case kMajorSixthHarmony: - result = "maj6"; - break; - case kMinorSixthHarmony: - result = "min6"; - break; - - case kDominantNinthHarmony: - result = "dom9"; - break; - case kMajorNinthHarmony: - result = "maj9"; - break; - case kMinorNinthHarmony: - result = "min9"; - break; - - case kDominantEleventhHarmony: - result = "dom11"; - break; - case kMajorEleventhHarmony: - result = "maj11"; - break; - case kMinorEleventhHarmony: - result = "min11"; - break; - - case kDominantThirteenthHarmony: - result = "dom13"; - break; - case kMajorThirteenthHarmony: - result = "maj13"; - break; - case kMinorThirteenthHarmony: - result = "min13"; - break; - - case kSuspendedSecondHarmony: - result = "sus2"; - break; - case kSuspendedFourthHarmony: - result = "sus4"; - break; - - case kNeapolitanHarmony: - result = "neapolitan"; - break; - case kItalianHarmony: - result = "ttalian"; - break; - case kFrenchHarmony: - result = "french"; - break; - case kGermanHarmony: - result = "german"; - break; - - case kPedalHarmony: - result = "pedal"; - break; - case kPowerHarmony: - result = "power"; - break; - case kTristanHarmony: - result = "tristan"; - break; - - // jazz-specific chords - - case kMinorMajorNinth: // -maj9, minmaj9 - result = "minmaj9"; - break; - - case kDominantSuspendedFourthHarmony: // 7sus4, domsus4 - result = "domsus4"; - break; - case kDominantAugmentedFifthHarmony: // 7#5, domaug5 - result = "domaug5"; - break; - case kDominantMinorNinthHarmony: // 7b9, dommin9 - result = "dommin9"; - break; - case kDominantAugmentedNinthDiminishedFifthHarmony: // 7#9b5, domaug9dim5 - result = "domaug9dim5"; - break; - case kDominantAugmentedNinthAugmentedFifthHarmony: // 7#9#5, domaug9aug5 - result = "domaug9aug5"; - break; - case kDominantAugmentedEleventhHarmony: // 7#11, domaug11 - result = "domaug11"; - break; - - case kMajorSeventhAugmentedEleventhHarmony: // maj7#11, maj7aug11 - result = "maj7aug11"; - break; - - // other - - case kOtherHarmony: - result = "other"; - break; - case kNoneHarmony: - result = "none"; - break; - } // switch - - return result; -} - -msrHarmonyKind msrHarmonyKindFromString ( - string theString) -{ - msrHarmonyKind result = k_NoHarmony; - - // MusicXML chords - - if (theString == "maj") { - result = kMajorHarmony; - } - else if (theString == "min") { - result = kMinorHarmony; - } - else if (theString == "aug") { - result = kAugmentedHarmony; - } - else if (theString == "dim") { - result = kDiminishedHarmony; - } - else if (theString == "dom") { - result = kDominantHarmony; - } - else if (theString == "maj7") { - result = kMajorSeventhHarmony; - } - else if (theString == "min7") { - result = kMinorSeventhHarmony; - } - else if (theString == "dim7") { - result = kDiminishedSeventhHarmony; - } - else if (theString == "aug7") { - result = kAugmentedSeventhHarmony; - } - else if (theString == "halfdim") { - result = kHalfDiminishedHarmony; - } - else if (theString == "minmaj7") { - result = kMinorMajorSeventhHarmony; - } - else if (theString == "maj6") { - result = kMajorSixthHarmony; - } - else if (theString == "min6") { - result = kMinorSixthHarmony; - } - else if (theString == "dom9") { - result = kDominantNinthHarmony; - } - else if (theString == "maj9") { - result = kMajorNinthHarmony; - } - else if (theString == "min9") { - result = kMinorNinthHarmony; - } - else if (theString == "dom11") { - result = kDominantEleventhHarmony; - } - else if (theString == "maj11") { - result = kMajorEleventhHarmony; - } - else if (theString == "min11") { - result = kMinorEleventhHarmony; - } - else if (theString == "dom13") { - result = kDominantThirteenthHarmony; - } - else if (theString == "maj13") { - result = kMajorThirteenthHarmony; - } - else if (theString == "min13") { - result = kMinorThirteenthHarmony; - } - else if (theString == "sus2") { - result = kSuspendedSecondHarmony; - } - else if (theString == "sus4") { - result = kSuspendedFourthHarmony; - } - else if (theString == "neapolitan") { - result = kNeapolitanHarmony; - } - else if (theString == "italian") { - result = kItalianHarmony; - } - else if (theString == "french") { - result = kFrenchHarmony; - } - else if (theString == "german") { - result = kGermanHarmony; - } - else if (theString == "pedal") { - result = kPedalHarmony; - } - else if (theString == "power") { - result = kPowerHarmony; - } - else if (theString == "tristan") { - result = kTristanHarmony; - } - - // jazz-specific chords - - else if (theString == "minmaj9") { - result = kMinorMajorNinth; // -maj9, minmaj9 - } - else if (theString == "domsus4") { - result = kDominantSuspendedFourthHarmony; // 7sus4, domsus4 - } - else if (theString == "domaug5") { - result = kDominantAugmentedFifthHarmony; // 7#5, domaug5 - } - else if (theString == "dommin9") { - result = kDominantMinorNinthHarmony; // 7b9, dommin9 - } - else if (theString == "domaug9dim5") { - result = kDominantAugmentedNinthDiminishedFifthHarmony; // 7#9b5, domaug9dim5 - } - else if (theString == "domaug9aug5") { - result = kDominantAugmentedNinthAugmentedFifthHarmony; // 7#9#5, domaug9aug5 - } - else if (theString == "domaug11") { - result = kDominantAugmentedEleventhHarmony; // 7#11, domaug11 - } - else if (theString == "maj7aug11") { - result = kMajorSeventhAugmentedEleventhHarmony; // maj7#11, maj7aug11 - } - - return result; -} - -map - gHarmonyKindsMap; - -list - gHarmonyKindsNamesList; - -void initializeHarmonyKinds () -{ - // MusicXML chords - - gHarmonyKindsNamesList.push_back ("maj"); - gHarmonyKindsMap [gHarmonyKindsNamesList.back ()] = kMajorHarmony; - gHarmonyKindsMap ["min"] = kMinorHarmony; - gHarmonyKindsMap ["aug"] = kAugmentedHarmony; - gHarmonyKindsMap ["dim"] = kDiminishedHarmony; - gHarmonyKindsMap ["dom"] = kDominantHarmony; - gHarmonyKindsMap ["maj7"] = kMajorSeventhHarmony; - gHarmonyKindsMap ["min7"] = kMinorSeventhHarmony; - gHarmonyKindsMap ["dim7"] = kDiminishedSeventhHarmony; - gHarmonyKindsMap ["aug7"] = kAugmentedSeventhHarmony; - gHarmonyKindsMap ["halfdim"] = kHalfDiminishedHarmony; - gHarmonyKindsMap ["minmaj7"] = kMinorMajorSeventhHarmony; - gHarmonyKindsMap ["maj6"] = kMajorSixthHarmony; - gHarmonyKindsMap ["min6"] = kMinorSixthHarmony; - gHarmonyKindsMap ["dom9"] = kDominantNinthHarmony; - gHarmonyKindsMap ["maj9"] = kMajorNinthHarmony; - gHarmonyKindsMap ["min9"] = kMinorNinthHarmony; - gHarmonyKindsMap ["dom11"] = kDominantEleventhHarmony; - gHarmonyKindsMap ["maj11"] = kMajorEleventhHarmony; - gHarmonyKindsMap ["min11"] = kMinorEleventhHarmony; - gHarmonyKindsMap ["dom13"] = kDominantThirteenthHarmony; - gHarmonyKindsMap ["maj13"] = kMajorThirteenthHarmony; - gHarmonyKindsMap ["min13"] = kMinorThirteenthHarmony; - gHarmonyKindsMap ["sus2"] = kSuspendedSecondHarmony; - gHarmonyKindsMap ["sus4"] = kSuspendedFourthHarmony; - gHarmonyKindsMap ["neapolitan"] = kNeapolitanHarmony; - gHarmonyKindsMap ["italian"] = kItalianHarmony; - gHarmonyKindsMap ["french"] = kFrenchHarmony; - gHarmonyKindsMap ["german"] = kGermanHarmony; - gHarmonyKindsMap ["pedal"] = kPedalHarmony; - gHarmonyKindsMap ["power"] = kPowerHarmony; - gHarmonyKindsMap ["tristan"] = kTristanHarmony; - - // jazz-specific chords - - gHarmonyKindsMap ["minmaj9"] = kMinorMajorNinth; - gHarmonyKindsMap ["domsus4"] = kDominantSuspendedFourthHarmony; - gHarmonyKindsMap ["domaug5"] = kDominantAugmentedFifthHarmony; - gHarmonyKindsMap ["dommin9"] = kDominantMinorNinthHarmony; - gHarmonyKindsMap ["domaug9dim5"] = kDominantAugmentedNinthDiminishedFifthHarmony; - gHarmonyKindsMap ["domaug9aug5"] = kDominantAugmentedNinthAugmentedFifthHarmony; - gHarmonyKindsMap ["domaug11"] = kDominantAugmentedEleventhHarmony; - gHarmonyKindsMap ["maj7aug11"] = kMajorSeventhAugmentedEleventhHarmony; -} - -string existingHarmonyKinds () -{ - stringstream s; - - if (gHarmonyKindsMap.size ()) { - map::const_iterator - iBegin = gHarmonyKindsMap.begin (), - iEnd = gHarmonyKindsMap.end (), - i = iBegin; - for ( ; ; ) { - s << (*i).first; - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - - } // for - } - - return s.str (); -} - -string existingHarmonyKindsNames (int namesListMaxLength) -{ - stringstream s; - - if (gHarmonyKindsNamesList.size ()) { - list::const_iterator - iBegin = gHarmonyKindsNamesList.begin (), - iEnd = gHarmonyKindsNamesList.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i); - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - - } // for - } - - return s.str (); -} - -void initializeChordStructuresMap () -{ - for (int i = k_NoHarmony; i <= kNoneHarmony; i++) { - msrHarmonyKind - harmonyKind = - msrHarmonyKind (i); - - // create the chord structure - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - harmonyKind); - - // register it in the map - gChordStructuresMap [harmonyKind] = - chordStructure; - } // for -} - -void printChordStructuresMap () -{ - gLogOstream << - "Harmonies chords structures:" << - " (" << gChordStructuresMap.size () << ")" << - endl; - - gIndenter++; - - for (int i = k_NoHarmony; i <= kNoneHarmony; i++) { - msrHarmonyKind - harmonyKind = - msrHarmonyKind (i); - - gLogOstream << -// JMI "i:" << i << " " << - msrHarmonyKindAsString (harmonyKind) << ":" << - endl; - - gIndenter++; - - S_msrChordStructure - chordStructure = - gChordStructuresMap [harmonyKind]; - - if (chordStructure) { - gLogOstream << - chordStructure << - endl; - } - else { - gLogOstream << - "no intervals" << - endl; - } - - gIndenter--; - - gLogOstream << endl; - } // for - - gIndenter--; - - gLogOstream << endl; -} - -// notes names languages -// ------------------------------------------------------ - -map - gQuarterTonesPitchesLanguageKindsMap; - -map gNederlandsPitchNamesMap; -map gCatalanPitchNamesMap; -map gDeutschPitchNamesMap; -map gEnglishPitchNamesMap; -map gEspanolPitchNamesMap; -map gFrancaisPitchNamesMap; -map gItalianoPitchNamesMap; -map gNorskPitchNamesMap; -map gPortuguesPitchNamesMap; -map gSuomiPitchNamesMap; -map gSvenskaPitchNamesMap; -map gVlaamsPitchNamesMap; - -void initializeQuarterTonesPitchesLanguageKinds () -{ - gQuarterTonesPitchesLanguageKindsMap ["nederlands"] = kNederlands; - gQuarterTonesPitchesLanguageKindsMap ["catalan"] = kCatalan; - gQuarterTonesPitchesLanguageKindsMap ["deutsch"] = kDeutsch; - gQuarterTonesPitchesLanguageKindsMap ["english"] = kEnglish; - gQuarterTonesPitchesLanguageKindsMap ["espanol"] = kEspanol; - gQuarterTonesPitchesLanguageKindsMap ["italiano"] = kItaliano; - gQuarterTonesPitchesLanguageKindsMap ["francais"] = kFrancais; - gQuarterTonesPitchesLanguageKindsMap ["norsk"] = kNorsk; - gQuarterTonesPitchesLanguageKindsMap ["portugues"] = kPortugues; - gQuarterTonesPitchesLanguageKindsMap ["suomi"] = kSuomi; - gQuarterTonesPitchesLanguageKindsMap ["svenska"] = kSvenska; - gQuarterTonesPitchesLanguageKindsMap ["vlaams"] = kVlaams; - - // nederlands - gNederlandsPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gNederlandsPitchNamesMap [k_Rest_QTP] = "r"; - - gNederlandsPitchNamesMap [kA_DoubleFlat_QTP] = "aeses"; - gNederlandsPitchNamesMap [kA_SesquiFlat_QTP] = "aeseh"; - gNederlandsPitchNamesMap [kA_Flat_QTP] = "aes"; - gNederlandsPitchNamesMap [kA_SemiFlat_QTP] = "aeh"; - gNederlandsPitchNamesMap [kA_Natural_QTP] = "a"; - gNederlandsPitchNamesMap [kA_SemiSharp_QTP] = "aih"; - gNederlandsPitchNamesMap [kA_Sharp_QTP] = "ais"; - gNederlandsPitchNamesMap [kA_SesquiSharp_QTP] = "aisih"; - gNederlandsPitchNamesMap [kA_DoubleSharp_QTP] = "aisis"; - - gNederlandsPitchNamesMap [kB_DoubleFlat_QTP] = "beses"; - gNederlandsPitchNamesMap [kB_SesquiFlat_QTP] = "beseh"; - gNederlandsPitchNamesMap [kB_Flat_QTP] = "bes"; - gNederlandsPitchNamesMap [kB_SemiFlat_QTP] = "beh"; - gNederlandsPitchNamesMap [kB_Natural_QTP] = "b"; - gNederlandsPitchNamesMap [kB_SemiSharp_QTP] = "bih"; - gNederlandsPitchNamesMap [kB_Sharp_QTP] = "bis"; - gNederlandsPitchNamesMap [kB_SesquiSharp_QTP] = "bisih"; - gNederlandsPitchNamesMap [kB_DoubleSharp_QTP] = "bisis"; - - gNederlandsPitchNamesMap [kC_DoubleFlat_QTP] = "ceses"; - gNederlandsPitchNamesMap [kC_SesquiFlat_QTP] = "ceseh"; - gNederlandsPitchNamesMap [kC_Flat_QTP] = "ces"; - gNederlandsPitchNamesMap [kC_SemiFlat_QTP] = "ceh"; - gNederlandsPitchNamesMap [kC_Natural_QTP] = "c"; - gNederlandsPitchNamesMap [kC_SemiSharp_QTP] = "cih"; - gNederlandsPitchNamesMap [kC_Sharp_QTP] = "cis"; - gNederlandsPitchNamesMap [kC_SesquiSharp_QTP] = "cisih"; - gNederlandsPitchNamesMap [kC_DoubleSharp_QTP] = "cisis"; - - gNederlandsPitchNamesMap [kD_DoubleFlat_QTP] = "deses"; - gNederlandsPitchNamesMap [kD_SesquiFlat_QTP] = "deseh"; - gNederlandsPitchNamesMap [kD_Flat_QTP] = "des"; - gNederlandsPitchNamesMap [kD_SemiFlat_QTP] = "deh"; - gNederlandsPitchNamesMap [kD_Natural_QTP] = "d"; - gNederlandsPitchNamesMap [kD_SemiSharp_QTP] = "dih"; - gNederlandsPitchNamesMap [kD_Sharp_QTP] = "dis"; - gNederlandsPitchNamesMap [kD_SesquiSharp_QTP] = "disih"; - gNederlandsPitchNamesMap [kD_DoubleSharp_QTP] = "disis"; - - gNederlandsPitchNamesMap [kE_DoubleFlat_QTP] = "eeses"; - gNederlandsPitchNamesMap [kE_SesquiFlat_QTP] = "eeseh"; - gNederlandsPitchNamesMap [kE_Flat_QTP] = "ees"; - gNederlandsPitchNamesMap [kE_SemiFlat_QTP] = "eeh"; - gNederlandsPitchNamesMap [kE_Natural_QTP] = "e"; - gNederlandsPitchNamesMap [kE_SemiSharp_QTP] = "eih"; - gNederlandsPitchNamesMap [kE_Sharp_QTP] = "eis"; - gNederlandsPitchNamesMap [kE_SesquiSharp_QTP] = "eisih"; - gNederlandsPitchNamesMap [kE_DoubleSharp_QTP] = "eisis"; - - gNederlandsPitchNamesMap [kF_DoubleFlat_QTP] = "feses"; - gNederlandsPitchNamesMap [kF_SesquiFlat_QTP] = "feseh"; - gNederlandsPitchNamesMap [kF_Flat_QTP] = "fes"; - gNederlandsPitchNamesMap [kF_SemiFlat_QTP] = "feh"; - gNederlandsPitchNamesMap [kF_Natural_QTP] = "f"; - gNederlandsPitchNamesMap [kF_SemiSharp_QTP] = "fih"; - gNederlandsPitchNamesMap [kF_Sharp_QTP] = "fis"; - gNederlandsPitchNamesMap [kF_SesquiSharp_QTP] = "fisih"; - gNederlandsPitchNamesMap [kF_DoubleSharp_QTP] = "fisis"; - - gNederlandsPitchNamesMap [kG_DoubleFlat_QTP] = "geses"; - gNederlandsPitchNamesMap [kG_SesquiFlat_QTP] = "geseh"; - gNederlandsPitchNamesMap [kG_Flat_QTP] = "ges"; - gNederlandsPitchNamesMap [kG_SemiFlat_QTP] = "geh"; - gNederlandsPitchNamesMap [kG_Natural_QTP] = "g"; - gNederlandsPitchNamesMap [kG_SemiSharp_QTP] = "gih"; - gNederlandsPitchNamesMap [kG_Sharp_QTP] = "gis"; - gNederlandsPitchNamesMap [kG_SesquiSharp_QTP] = "gisih"; - gNederlandsPitchNamesMap [kG_DoubleSharp_QTP] = "gisis"; - - // catalan - gCatalanPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gCatalanPitchNamesMap [k_Rest_QTP] = "r"; - - gCatalanPitchNamesMap [kA_DoubleFlat_QTP] = "labb"; - gCatalanPitchNamesMap [kA_SesquiFlat_QTP] = "labSesquiFlat???"; - gCatalanPitchNamesMap [kA_Flat_QTP] = "lab"; - gCatalanPitchNamesMap [kA_SemiFlat_QTP] = "aSemiFlat???"; - gCatalanPitchNamesMap [kA_Natural_QTP] = "la"; - gCatalanPitchNamesMap [kA_SemiSharp_QTP] = "aSemiSharp???"; - gCatalanPitchNamesMap [kA_Sharp_QTP] = "lad"; - gCatalanPitchNamesMap [kA_SesquiSharp_QTP] = "laSesquiSharp???"; - gCatalanPitchNamesMap [kA_DoubleSharp_QTP] = "ladd"; - - gCatalanPitchNamesMap [kB_DoubleFlat_QTP] = "sibb"; - gCatalanPitchNamesMap [kB_SesquiFlat_QTP] = "sibSesquiFlat???"; - gCatalanPitchNamesMap [kB_Flat_QTP] = "sib"; - gCatalanPitchNamesMap [kB_SemiFlat_QTP] = "bSemiFlat???"; - gCatalanPitchNamesMap [kB_Natural_QTP] = "b"; - gCatalanPitchNamesMap [kB_SemiSharp_QTP] = "bSemiSharp???"; - gCatalanPitchNamesMap [kB_Sharp_QTP] = "sid"; - gCatalanPitchNamesMap [kB_SesquiSharp_QTP] = "siSesquiSharp???"; - gCatalanPitchNamesMap [kB_DoubleSharp_QTP] = "sidd"; - - gCatalanPitchNamesMap [kC_DoubleFlat_QTP] = "dobb"; - gCatalanPitchNamesMap [kC_SesquiFlat_QTP] = "doSesquiFlat???"; - gCatalanPitchNamesMap [kC_Flat_QTP] = "dob"; - gCatalanPitchNamesMap [kC_SemiFlat_QTP] = "cSemiFlat???"; - gCatalanPitchNamesMap [kC_Natural_QTP] = "do"; - gCatalanPitchNamesMap [kC_SemiSharp_QTP] = "cSemiSharp???"; - gCatalanPitchNamesMap [kC_Sharp_QTP] = "dod"; - gCatalanPitchNamesMap [kC_SesquiSharp_QTP] = "doSesquiSharp???"; - gCatalanPitchNamesMap [kC_DoubleSharp_QTP] = "dodd"; - - gCatalanPitchNamesMap [kD_DoubleFlat_QTP] = "rebb"; - gCatalanPitchNamesMap [kD_SesquiFlat_QTP] = "reSesquiFlat???"; - gCatalanPitchNamesMap [kD_Flat_QTP] = "reb"; - gCatalanPitchNamesMap [kD_SemiFlat_QTP] = "dSemiFlat???"; - gCatalanPitchNamesMap [kD_Natural_QTP] = "re"; - gCatalanPitchNamesMap [kD_SemiSharp_QTP] = "dSemiSharp???"; - gCatalanPitchNamesMap [kD_Sharp_QTP] = "red"; - gCatalanPitchNamesMap [kD_SesquiSharp_QTP] = "reSesquiSharp???"; - gCatalanPitchNamesMap [kD_DoubleSharp_QTP] = "redd"; - - gCatalanPitchNamesMap [kE_DoubleFlat_QTP] = "mibb"; - gCatalanPitchNamesMap [kE_SesquiFlat_QTP] = "miSesquiFlat???"; - gCatalanPitchNamesMap [kE_Flat_QTP] = "mib"; - gCatalanPitchNamesMap [kE_SemiFlat_QTP] = "eSemiFlat???"; - gCatalanPitchNamesMap [kE_Natural_QTP] = "mi"; - gCatalanPitchNamesMap [kE_SemiSharp_QTP] = "eSemiSharp???"; - gCatalanPitchNamesMap [kE_Sharp_QTP] = "mid"; - gCatalanPitchNamesMap [kE_SesquiSharp_QTP] = "miSesquiSharp???"; - gCatalanPitchNamesMap [kE_DoubleSharp_QTP] = "midd"; - - gCatalanPitchNamesMap [kF_DoubleFlat_QTP] = "fabb"; - gCatalanPitchNamesMap [kF_SesquiFlat_QTP] = "faSesquiFlat???"; - gCatalanPitchNamesMap [kF_Flat_QTP] = "fab"; - gCatalanPitchNamesMap [kF_SemiFlat_QTP] = "fSemiFlat???"; - gCatalanPitchNamesMap [kF_Natural_QTP] = "fa"; - gCatalanPitchNamesMap [kF_SemiSharp_QTP] = "fSemiSharp???"; - gCatalanPitchNamesMap [kF_Sharp_QTP] = "fad"; - gCatalanPitchNamesMap [kF_SesquiSharp_QTP] = "faSesquiSharp???"; - gCatalanPitchNamesMap [kF_DoubleSharp_QTP] = "fadd"; - - gCatalanPitchNamesMap [kG_DoubleFlat_QTP] = "solbb"; - gCatalanPitchNamesMap [kG_SesquiFlat_QTP] = "solSesquiFlat???"; - gCatalanPitchNamesMap [kG_Flat_QTP] = "solb"; - gCatalanPitchNamesMap [kG_SemiFlat_QTP] = "gSemiFlat???"; - gCatalanPitchNamesMap [kG_Natural_QTP] = "sol"; - gCatalanPitchNamesMap [kG_SemiSharp_QTP] = "gSemiSharp???"; - gCatalanPitchNamesMap [kG_Sharp_QTP] = "sold"; - gCatalanPitchNamesMap [kG_SesquiSharp_QTP] = "solSesquiSharp???"; - gCatalanPitchNamesMap [kG_DoubleSharp_QTP] = "soldd"; - - // deutsch - gDeutschPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gDeutschPitchNamesMap [k_Rest_QTP] = "r"; - - gDeutschPitchNamesMap [kA_DoubleFlat_QTP] = "asas"; - gDeutschPitchNamesMap [kA_SesquiFlat_QTP] = "asah"; - gDeutschPitchNamesMap [kA_Flat_QTP] = "as"; - gDeutschPitchNamesMap [kA_SemiFlat_QTP] = "aeh"; - gDeutschPitchNamesMap [kA_Natural_QTP] = "a"; - gDeutschPitchNamesMap [kA_SemiSharp_QTP] = "aih"; - gDeutschPitchNamesMap [kA_Sharp_QTP] = "ais"; - gDeutschPitchNamesMap [kA_SesquiSharp_QTP] = "aisih"; - gDeutschPitchNamesMap [kA_DoubleSharp_QTP] = "aisis"; - - gDeutschPitchNamesMap [kB_DoubleFlat_QTP] = "heses"; - gDeutschPitchNamesMap [kB_SesquiFlat_QTP] = "heseh"; - gDeutschPitchNamesMap [kB_Flat_QTP] = "b"; - gDeutschPitchNamesMap [kB_SemiFlat_QTP] = "beh"; - gDeutschPitchNamesMap [kB_Natural_QTP] = "h"; - gDeutschPitchNamesMap [kB_SemiSharp_QTP] = "hih"; - gDeutschPitchNamesMap [kB_Sharp_QTP] = "his"; - gDeutschPitchNamesMap [kB_SesquiSharp_QTP] = "hisih"; - gDeutschPitchNamesMap [kB_DoubleSharp_QTP] = "hisis"; - - gDeutschPitchNamesMap [kC_DoubleFlat_QTP] = "ceses"; - gDeutschPitchNamesMap [kC_SesquiFlat_QTP] = "ceseh"; - gDeutschPitchNamesMap [kC_Flat_QTP] = "ces"; - gDeutschPitchNamesMap [kC_SemiFlat_QTP] = "ceh"; - gDeutschPitchNamesMap [kC_Natural_QTP] = "c"; - gDeutschPitchNamesMap [kC_SemiSharp_QTP] = "cih"; - gDeutschPitchNamesMap [kC_Sharp_QTP] = "cis"; - gDeutschPitchNamesMap [kC_SesquiSharp_QTP] = "cisih"; - gDeutschPitchNamesMap [kC_DoubleSharp_QTP] = "cisis"; - - gDeutschPitchNamesMap [kD_DoubleFlat_QTP] = "deses"; - gDeutschPitchNamesMap [kD_SesquiFlat_QTP] = "deseh"; - gDeutschPitchNamesMap [kD_Flat_QTP] = "des"; - gDeutschPitchNamesMap [kD_SemiFlat_QTP] = "deh"; - gDeutschPitchNamesMap [kD_Natural_QTP] = "d"; - gDeutschPitchNamesMap [kD_SemiSharp_QTP] = "dih"; - gDeutschPitchNamesMap [kD_Sharp_QTP] = "dis"; - gDeutschPitchNamesMap [kD_SesquiSharp_QTP] = "disih"; - gDeutschPitchNamesMap [kD_DoubleSharp_QTP] = "disis"; - - gDeutschPitchNamesMap [kE_DoubleFlat_QTP] = "eses"; - gDeutschPitchNamesMap [kE_SesquiFlat_QTP] = "esseh"; - gDeutschPitchNamesMap [kE_Flat_QTP] = "es"; - gDeutschPitchNamesMap [kE_SemiFlat_QTP] = "eeh"; - gDeutschPitchNamesMap [kE_Natural_QTP] = "e"; - gDeutschPitchNamesMap [kE_SemiSharp_QTP] = "eih"; - gDeutschPitchNamesMap [kE_Sharp_QTP] = "eis"; - gDeutschPitchNamesMap [kE_SesquiSharp_QTP] = "eisih"; - gDeutschPitchNamesMap [kE_DoubleSharp_QTP] = "eisis"; - - gDeutschPitchNamesMap [kF_DoubleFlat_QTP] = "feses"; - gDeutschPitchNamesMap [kF_SesquiFlat_QTP] = "feseh"; - gDeutschPitchNamesMap [kF_Flat_QTP] = "fes"; - gDeutschPitchNamesMap [kF_SemiFlat_QTP] = "feh"; - gDeutschPitchNamesMap [kF_Natural_QTP] = "f"; - gDeutschPitchNamesMap [kF_SemiSharp_QTP] = "fih"; - gDeutschPitchNamesMap [kF_Sharp_QTP] = "fis"; - gDeutschPitchNamesMap [kF_SesquiSharp_QTP] = "fisih"; - gDeutschPitchNamesMap [kF_DoubleSharp_QTP] = "fisis"; - - gDeutschPitchNamesMap [kG_DoubleFlat_QTP] = "geses"; - gDeutschPitchNamesMap [kG_SesquiFlat_QTP] = "geseh"; - gDeutschPitchNamesMap [kG_Flat_QTP] = "ges"; - gDeutschPitchNamesMap [kG_SemiFlat_QTP] = "geh"; - gDeutschPitchNamesMap [kG_Natural_QTP] = "g"; - gDeutschPitchNamesMap [kG_SemiSharp_QTP] = "gih"; - gDeutschPitchNamesMap [kG_Sharp_QTP] = "gis"; - gDeutschPitchNamesMap [kG_SesquiSharp_QTP] = "gisih"; - gDeutschPitchNamesMap [kG_DoubleSharp_QTP] = "gisis"; - - // english - gEnglishPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gEnglishPitchNamesMap [k_Rest_QTP] = "r"; - - gEnglishPitchNamesMap [kA_DoubleFlat_QTP] = "aff"; - gEnglishPitchNamesMap [kA_SesquiFlat_QTP] = "atqf"; - gEnglishPitchNamesMap [kA_Flat_QTP] = "af"; - gEnglishPitchNamesMap [kA_SemiFlat_QTP] = "aqf"; - gEnglishPitchNamesMap [kA_Natural_QTP] = "a"; - gEnglishPitchNamesMap [kA_SemiSharp_QTP] = "aqs"; - gEnglishPitchNamesMap [kA_Sharp_QTP] = "as"; - gEnglishPitchNamesMap [kA_SesquiSharp_QTP] = "atqs"; - gEnglishPitchNamesMap [kA_DoubleSharp_QTP] = "a"; - - gEnglishPitchNamesMap [kB_DoubleFlat_QTP] = "bfqf"; - gEnglishPitchNamesMap [kB_SesquiFlat_QTP] = "btqf"; - gEnglishPitchNamesMap [kB_Flat_QTP] = "bf"; - gEnglishPitchNamesMap [kB_SemiFlat_QTP] = "bqf"; - gEnglishPitchNamesMap [kB_Natural_QTP] = "b"; - gEnglishPitchNamesMap [kB_SemiSharp_QTP] = "bqs"; - gEnglishPitchNamesMap [kB_Sharp_QTP] = "bs"; - gEnglishPitchNamesMap [kB_SesquiSharp_QTP] = "btqs"; - gEnglishPitchNamesMap [kB_DoubleSharp_QTP] = "bx"; - - gEnglishPitchNamesMap [kC_DoubleFlat_QTP] = "cff"; - gEnglishPitchNamesMap [kC_SesquiFlat_QTP] = "ctqf"; - gEnglishPitchNamesMap [kC_Flat_QTP] = "cf"; - gEnglishPitchNamesMap [kC_SemiFlat_QTP] = "cqf"; - gEnglishPitchNamesMap [kC_Natural_QTP] = "c"; - gEnglishPitchNamesMap [kC_SemiSharp_QTP] = "cqs"; - gEnglishPitchNamesMap [kC_Sharp_QTP] = "cs"; - gEnglishPitchNamesMap [kC_SesquiSharp_QTP] = "ctqs"; - gEnglishPitchNamesMap [kC_DoubleSharp_QTP] = "cx"; - - gEnglishPitchNamesMap [kD_DoubleFlat_QTP] = "dff"; - gEnglishPitchNamesMap [kD_SesquiFlat_QTP] = "dtqf"; - gEnglishPitchNamesMap [kD_Flat_QTP] = "df"; - gEnglishPitchNamesMap [kD_SemiFlat_QTP] = "dqf"; - gEnglishPitchNamesMap [kD_Natural_QTP] = "d"; - gEnglishPitchNamesMap [kD_SemiSharp_QTP] = "dqs"; - gEnglishPitchNamesMap [kD_Sharp_QTP] = "ds"; - gEnglishPitchNamesMap [kD_SesquiSharp_QTP] = "dtqs"; - gEnglishPitchNamesMap [kD_DoubleSharp_QTP] = "dx"; - - gEnglishPitchNamesMap [kE_DoubleFlat_QTP] = "eff"; - gEnglishPitchNamesMap [kE_SesquiFlat_QTP] = "etqf"; - gEnglishPitchNamesMap [kE_Flat_QTP] = "ef"; - gEnglishPitchNamesMap [kE_SemiFlat_QTP] = "eqf"; - gEnglishPitchNamesMap [kE_Natural_QTP] = "e"; - gEnglishPitchNamesMap [kE_SemiSharp_QTP] = "eqs"; - gEnglishPitchNamesMap [kE_Sharp_QTP] = "es"; - gEnglishPitchNamesMap [kE_SesquiSharp_QTP] = "etqs"; - gEnglishPitchNamesMap [kE_DoubleSharp_QTP] = "ex"; - - gEnglishPitchNamesMap [kF_DoubleFlat_QTP] = "fff"; - gEnglishPitchNamesMap [kF_SesquiFlat_QTP] = "ftqf"; - gEnglishPitchNamesMap [kF_Flat_QTP] = "ff"; - gEnglishPitchNamesMap [kF_SemiFlat_QTP] = "fqf"; - gEnglishPitchNamesMap [kF_Natural_QTP] = "f"; - gEnglishPitchNamesMap [kF_SemiSharp_QTP] = "fqs"; - gEnglishPitchNamesMap [kF_Sharp_QTP] = "fs"; - gEnglishPitchNamesMap [kF_SesquiSharp_QTP] = "ftqs"; - gEnglishPitchNamesMap [kF_DoubleSharp_QTP] = "fx"; - - gEnglishPitchNamesMap [kG_DoubleFlat_QTP] = "gff"; - gEnglishPitchNamesMap [kG_SesquiFlat_QTP] = "gtqf"; - gEnglishPitchNamesMap [kG_Flat_QTP] = "gf"; - gEnglishPitchNamesMap [kG_SemiFlat_QTP] = "gqf"; - gEnglishPitchNamesMap [kG_Natural_QTP] = "g"; - gEnglishPitchNamesMap [kG_SemiSharp_QTP] = "gqs"; - gEnglishPitchNamesMap [kG_Sharp_QTP] = "gs"; - gEnglishPitchNamesMap [kG_SesquiSharp_QTP] = "gtqs"; - gEnglishPitchNamesMap [kG_DoubleSharp_QTP] = "gx"; - - // espanol - gEspanolPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gEspanolPitchNamesMap [k_Rest_QTP] = "r"; - - gEspanolPitchNamesMap [kA_DoubleFlat_QTP] = "labb"; - gEspanolPitchNamesMap [kA_SesquiFlat_QTP] = "latcb"; - gEspanolPitchNamesMap [kA_Flat_QTP] = "lab"; - gEspanolPitchNamesMap [kA_SemiFlat_QTP] = "lacb"; - gEspanolPitchNamesMap [kA_Natural_QTP] = "la"; - gEspanolPitchNamesMap [kA_SemiSharp_QTP] = "lacs"; - gEspanolPitchNamesMap [kA_Sharp_QTP] = "las"; - gEspanolPitchNamesMap [kA_SesquiSharp_QTP] = "latcs"; - gEspanolPitchNamesMap [kA_DoubleSharp_QTP] = "lax"; - - gEspanolPitchNamesMap [kB_DoubleFlat_QTP] = "sibb"; - gEspanolPitchNamesMap [kB_SesquiFlat_QTP] = "sitcb"; - gEspanolPitchNamesMap [kB_Flat_QTP] = "sib"; - gEspanolPitchNamesMap [kB_SemiFlat_QTP] = "sicb"; - gEspanolPitchNamesMap [kB_Natural_QTP] = "si"; - gEspanolPitchNamesMap [kB_SemiSharp_QTP] = "sics"; - gEspanolPitchNamesMap [kB_Sharp_QTP] = "sis"; - gEspanolPitchNamesMap [kB_SesquiSharp_QTP] = "sitcs"; - gEspanolPitchNamesMap [kB_DoubleSharp_QTP] = "six"; - - gEspanolPitchNamesMap [kC_DoubleFlat_QTP] = "dobb"; - gEspanolPitchNamesMap [kC_SesquiFlat_QTP] = "dotcb"; - gEspanolPitchNamesMap [kC_Flat_QTP] = "dob"; - gEspanolPitchNamesMap [kC_SemiFlat_QTP] = "docb"; - gEspanolPitchNamesMap [kC_Natural_QTP] = "do"; - gEspanolPitchNamesMap [kC_SemiSharp_QTP] = "docs"; - gEspanolPitchNamesMap [kC_Sharp_QTP] = "dos"; - gEspanolPitchNamesMap [kC_SesquiSharp_QTP] = "dotcs"; - gEspanolPitchNamesMap [kC_DoubleSharp_QTP] = "dox"; - - gEspanolPitchNamesMap [kD_DoubleFlat_QTP] = "rebb"; - gEspanolPitchNamesMap [kD_SesquiFlat_QTP] = "retcb"; - gEspanolPitchNamesMap [kD_Flat_QTP] = "reb"; - gEspanolPitchNamesMap [kD_SemiFlat_QTP] = "recb"; - gEspanolPitchNamesMap [kD_Natural_QTP] = "re"; - gEspanolPitchNamesMap [kD_SemiSharp_QTP] = "recs"; - gEspanolPitchNamesMap [kD_Sharp_QTP] = "res"; - gEspanolPitchNamesMap [kD_SesquiSharp_QTP] = "retcs"; - gEspanolPitchNamesMap [kD_DoubleSharp_QTP] = "rex"; - - gEspanolPitchNamesMap [kE_DoubleFlat_QTP] = "mibb"; - gEspanolPitchNamesMap [kE_SesquiFlat_QTP] = "mitcb"; - gEspanolPitchNamesMap [kE_Flat_QTP] = "mib"; - gEspanolPitchNamesMap [kE_SemiFlat_QTP] = "micb"; - gEspanolPitchNamesMap [kE_Natural_QTP] = "mi"; - gEspanolPitchNamesMap [kE_SemiSharp_QTP] = "mics"; - gEspanolPitchNamesMap [kE_Sharp_QTP] = "mis"; - gEspanolPitchNamesMap [kE_SesquiSharp_QTP] = "mitcs"; - gEspanolPitchNamesMap [kE_DoubleSharp_QTP] = "mix"; - - gEspanolPitchNamesMap [kF_DoubleFlat_QTP] = "fabb"; - gEspanolPitchNamesMap [kF_SesquiFlat_QTP] = "fatcb"; - gEspanolPitchNamesMap [kF_Flat_QTP] = "fab"; - gEspanolPitchNamesMap [kF_SemiFlat_QTP] = "facb"; - gEspanolPitchNamesMap [kF_Natural_QTP] = "fa"; - gEspanolPitchNamesMap [kF_SemiSharp_QTP] = "facs"; - gEspanolPitchNamesMap [kF_Sharp_QTP] = "fas"; - gEspanolPitchNamesMap [kF_SesquiSharp_QTP] = "fatcs"; - gEspanolPitchNamesMap [kF_DoubleSharp_QTP] = "fax"; - - gEspanolPitchNamesMap [kG_DoubleFlat_QTP] = "solbb"; - gEspanolPitchNamesMap [kG_SesquiFlat_QTP] = "soltcb"; - gEspanolPitchNamesMap [kG_Flat_QTP] = "solb"; - gEspanolPitchNamesMap [kG_SemiFlat_QTP] = "solcb"; - gEspanolPitchNamesMap [kG_Natural_QTP] = "sol"; - gEspanolPitchNamesMap [kG_SemiSharp_QTP] = "solcs"; - gEspanolPitchNamesMap [kG_Sharp_QTP] = "sols"; - gEspanolPitchNamesMap [kG_SesquiSharp_QTP] = "soltcs"; - gEspanolPitchNamesMap [kG_DoubleSharp_QTP] = "solx"; - - // francais - gFrancaisPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gFrancaisPitchNamesMap [k_Rest_QTP] = "r"; - - gFrancaisPitchNamesMap [kA_DoubleFlat_QTP] = "labb"; - gFrancaisPitchNamesMap [kA_SesquiFlat_QTP] = "labtqt"; - gFrancaisPitchNamesMap [kA_Flat_QTP] = "lab"; - gFrancaisPitchNamesMap [kA_SemiFlat_QTP] = "labqt"; - gFrancaisPitchNamesMap [kA_Natural_QTP] = "la"; - gFrancaisPitchNamesMap [kA_SemiSharp_QTP] = "lasqt"; - gFrancaisPitchNamesMap [kA_Sharp_QTP] = "lad"; - gFrancaisPitchNamesMap [kA_SesquiSharp_QTP] = "lastqt"; - gFrancaisPitchNamesMap [kA_DoubleSharp_QTP] = "lass"; - - gFrancaisPitchNamesMap [kB_DoubleFlat_QTP] = "sibb"; - gFrancaisPitchNamesMap [kB_SesquiFlat_QTP] = "sibtqt"; - gFrancaisPitchNamesMap [kB_Flat_QTP] = "sib"; - gFrancaisPitchNamesMap [kB_SemiFlat_QTP] = "sibqt"; - gFrancaisPitchNamesMap [kB_Natural_QTP] = "si"; - gFrancaisPitchNamesMap [kB_SemiSharp_QTP] = "sisqt"; - gFrancaisPitchNamesMap [kB_Sharp_QTP] = "sid"; - gFrancaisPitchNamesMap [kB_SesquiSharp_QTP] = "sistqt"; - gFrancaisPitchNamesMap [kB_DoubleSharp_QTP] = "siss"; - - gFrancaisPitchNamesMap [kC_DoubleFlat_QTP] = "dobb"; - gFrancaisPitchNamesMap [kC_SesquiFlat_QTP] = "dobtqt"; - gFrancaisPitchNamesMap [kC_Flat_QTP] = "dob"; - gFrancaisPitchNamesMap [kC_SemiFlat_QTP] = "dobqt"; - gFrancaisPitchNamesMap [kC_Natural_QTP] = "do"; - gFrancaisPitchNamesMap [kC_SemiSharp_QTP] = "dosqt"; - gFrancaisPitchNamesMap [kC_Sharp_QTP] = "dod"; - gFrancaisPitchNamesMap [kC_SesquiSharp_QTP] = "dostqt"; - gFrancaisPitchNamesMap [kC_DoubleSharp_QTP] = "doss"; - - gFrancaisPitchNamesMap [kD_DoubleFlat_QTP] = "rebb"; - gFrancaisPitchNamesMap [kD_SesquiFlat_QTP] = "rebtqt"; - gFrancaisPitchNamesMap [kD_Flat_QTP] = "reb"; - gFrancaisPitchNamesMap [kD_SemiFlat_QTP] = "rebqt"; - gFrancaisPitchNamesMap [kD_Natural_QTP] = "re"; - gFrancaisPitchNamesMap [kD_SemiSharp_QTP] = "resqt"; - gFrancaisPitchNamesMap [kD_Sharp_QTP] = "red"; - gFrancaisPitchNamesMap [kD_SesquiSharp_QTP] = "restqt"; - gFrancaisPitchNamesMap [kD_DoubleSharp_QTP] = "ress"; - - gFrancaisPitchNamesMap [kE_DoubleFlat_QTP] = "mibb"; - gFrancaisPitchNamesMap [kE_SesquiFlat_QTP] = "mibtqt"; - gFrancaisPitchNamesMap [kE_Flat_QTP] = "mib"; - gFrancaisPitchNamesMap [kE_SemiFlat_QTP] = "mibqt"; - gFrancaisPitchNamesMap [kE_Natural_QTP] = "mi"; - gFrancaisPitchNamesMap [kE_SemiSharp_QTP] = "misqt"; - gFrancaisPitchNamesMap [kE_Sharp_QTP] = "mid"; - gFrancaisPitchNamesMap [kE_SesquiSharp_QTP] = "mistqt"; - gFrancaisPitchNamesMap [kE_DoubleSharp_QTP] = "miss"; - - gFrancaisPitchNamesMap [kF_DoubleFlat_QTP] = "fabb"; - gFrancaisPitchNamesMap [kF_SesquiFlat_QTP] = "fabtqt"; - gFrancaisPitchNamesMap [kF_Flat_QTP] = "fab"; - gFrancaisPitchNamesMap [kF_SemiFlat_QTP] = "fabqt"; - gFrancaisPitchNamesMap [kF_Natural_QTP] = "fa"; - gFrancaisPitchNamesMap [kF_SemiSharp_QTP] = "fasqt"; - gFrancaisPitchNamesMap [kF_Sharp_QTP] = "fad"; - gFrancaisPitchNamesMap [kF_SesquiSharp_QTP] = "fastqt"; - gFrancaisPitchNamesMap [kF_DoubleSharp_QTP] = "fass"; - - gFrancaisPitchNamesMap [kG_DoubleFlat_QTP] = "solbb"; - gFrancaisPitchNamesMap [kG_SesquiFlat_QTP] = "solbtqt"; - gFrancaisPitchNamesMap [kG_Flat_QTP] = "solb"; - gFrancaisPitchNamesMap [kG_SemiFlat_QTP] = "solbqt"; - gFrancaisPitchNamesMap [kG_Natural_QTP] = "sol"; - gFrancaisPitchNamesMap [kG_SemiSharp_QTP] = "solsqt"; - gFrancaisPitchNamesMap [kG_Sharp_QTP] = "sold"; - gFrancaisPitchNamesMap [kG_SesquiSharp_QTP] = "solstqt"; - gFrancaisPitchNamesMap [kG_DoubleSharp_QTP] = "solss"; - - // italiano - gItalianoPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gItalianoPitchNamesMap [k_Rest_QTP] = "r"; - - gItalianoPitchNamesMap [kA_DoubleFlat_QTP] = "labb"; - gItalianoPitchNamesMap [kA_SesquiFlat_QTP] = "labsb"; - gItalianoPitchNamesMap [kA_Flat_QTP] = "lab"; - gItalianoPitchNamesMap [kA_SemiFlat_QTP] = "lasb"; - gItalianoPitchNamesMap [kA_Natural_QTP] = "la"; - gItalianoPitchNamesMap [kA_SemiSharp_QTP] = "lasd"; - gItalianoPitchNamesMap [kA_Sharp_QTP] = "lad"; - gItalianoPitchNamesMap [kA_SesquiSharp_QTP] = "ladsd"; - gItalianoPitchNamesMap [kA_DoubleSharp_QTP] = "ladd"; - - gItalianoPitchNamesMap [kB_DoubleFlat_QTP] = "sibb"; - gItalianoPitchNamesMap [kB_SesquiFlat_QTP] = "sibsb"; - gItalianoPitchNamesMap [kB_Flat_QTP] = "sib"; - gItalianoPitchNamesMap [kB_SemiFlat_QTP] = "sisb"; - gItalianoPitchNamesMap [kB_Natural_QTP] = "si"; - gItalianoPitchNamesMap [kB_SemiSharp_QTP] = "sisd"; - gItalianoPitchNamesMap [kB_Sharp_QTP] = "sid"; - gItalianoPitchNamesMap [kB_SesquiSharp_QTP] = "sidsd"; - gItalianoPitchNamesMap [kB_DoubleSharp_QTP] = "sidd"; - - gItalianoPitchNamesMap [kC_DoubleFlat_QTP] = "dobb"; - gItalianoPitchNamesMap [kC_SesquiFlat_QTP] = "dobsb"; - gItalianoPitchNamesMap [kC_Flat_QTP] = "dob"; - gItalianoPitchNamesMap [kC_SemiFlat_QTP] = "dosb"; - gItalianoPitchNamesMap [kC_Natural_QTP] = "do"; - gItalianoPitchNamesMap [kC_SemiSharp_QTP] = "dosd"; - gItalianoPitchNamesMap [kC_Sharp_QTP] = "dod"; - gItalianoPitchNamesMap [kC_SesquiSharp_QTP] = "dodsd"; - gItalianoPitchNamesMap [kC_DoubleSharp_QTP] = "dodd"; - - gItalianoPitchNamesMap [kD_DoubleFlat_QTP] = "rebb"; - gItalianoPitchNamesMap [kD_SesquiFlat_QTP] = "rebsb"; - gItalianoPitchNamesMap [kD_Flat_QTP] = "reb"; - gItalianoPitchNamesMap [kD_SemiFlat_QTP] = "resb"; - gItalianoPitchNamesMap [kD_Natural_QTP] = "re"; - gItalianoPitchNamesMap [kD_SemiSharp_QTP] = "resd"; - gItalianoPitchNamesMap [kD_Sharp_QTP] = "red"; - gItalianoPitchNamesMap [kD_SesquiSharp_QTP] = "redsd"; - gItalianoPitchNamesMap [kD_DoubleSharp_QTP] = "redd"; - - gItalianoPitchNamesMap [kE_DoubleFlat_QTP] = "mibb"; - gItalianoPitchNamesMap [kE_SesquiFlat_QTP] = "mibsb"; - gItalianoPitchNamesMap [kE_Flat_QTP] = "mib"; - gItalianoPitchNamesMap [kE_SemiFlat_QTP] = "misb"; - gItalianoPitchNamesMap [kE_Natural_QTP] = "mi"; - gItalianoPitchNamesMap [kE_SemiSharp_QTP] = "misd"; - gItalianoPitchNamesMap [kE_Sharp_QTP] = "mid"; - gItalianoPitchNamesMap [kE_SesquiSharp_QTP] = "midsd"; - gItalianoPitchNamesMap [kE_DoubleSharp_QTP] = "midd"; - - gItalianoPitchNamesMap [kF_DoubleFlat_QTP] = "fabb"; - gItalianoPitchNamesMap [kF_SesquiFlat_QTP] = "fabsb"; - gItalianoPitchNamesMap [kF_Flat_QTP] = "fab"; - gItalianoPitchNamesMap [kF_SemiFlat_QTP] = "fasb"; - gItalianoPitchNamesMap [kF_Natural_QTP] = "fa"; - gItalianoPitchNamesMap [kF_SemiSharp_QTP] = "fasd"; - gItalianoPitchNamesMap [kF_Sharp_QTP] = "fad"; - gItalianoPitchNamesMap [kF_SesquiSharp_QTP] = "fadsd"; - gItalianoPitchNamesMap [kF_DoubleSharp_QTP] = "fadd"; - - gItalianoPitchNamesMap [kG_DoubleFlat_QTP] = "solbb"; - gItalianoPitchNamesMap [kG_SesquiFlat_QTP] = "solbsb"; - gItalianoPitchNamesMap [kG_Flat_QTP] = "solb"; - gItalianoPitchNamesMap [kG_SemiFlat_QTP] = "solsb"; - gItalianoPitchNamesMap [kG_Natural_QTP] = "sol"; - gItalianoPitchNamesMap [kG_SemiSharp_QTP] = "solsd"; - gItalianoPitchNamesMap [kG_Sharp_QTP] = "sold"; - gItalianoPitchNamesMap [kG_SesquiSharp_QTP] = "soldsd"; - gItalianoPitchNamesMap [kG_DoubleSharp_QTP] = "soldd"; - - // norsk - gNorskPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gNorskPitchNamesMap [k_Rest_QTP] = "r"; - - gNorskPitchNamesMap [kA_DoubleFlat_QTP] = "aeses"; - gNorskPitchNamesMap [kA_SesquiFlat_QTP] = "aSesquiFlat???"; - gNorskPitchNamesMap [kA_Flat_QTP] = "aes"; - gNorskPitchNamesMap [kA_SemiFlat_QTP] = "aSemiFlat???"; - gNorskPitchNamesMap [kA_Natural_QTP] = "a"; - gNorskPitchNamesMap [kA_SemiSharp_QTP] = "aSemiSharp???"; - gNorskPitchNamesMap [kA_Sharp_QTP] = "ais"; - gNorskPitchNamesMap [kA_SesquiSharp_QTP] = "aSesquiSharp???"; - gNorskPitchNamesMap [kA_DoubleSharp_QTP] = "aisis"; - - gNorskPitchNamesMap [kB_DoubleFlat_QTP] = "beses"; - gNorskPitchNamesMap [kB_SesquiFlat_QTP] = "bSesquiFlat???"; - gNorskPitchNamesMap [kB_Flat_QTP] = "bes"; - gNorskPitchNamesMap [kB_SemiFlat_QTP] = "bSemiFlat???"; - gNorskPitchNamesMap [kB_Natural_QTP] = "b"; - gNorskPitchNamesMap [kB_SemiSharp_QTP] = "bSemiSharp???"; - gNorskPitchNamesMap [kB_Sharp_QTP] = "bis"; - gNorskPitchNamesMap [kB_SesquiSharp_QTP] = "bSesquiSharp???"; - gNorskPitchNamesMap [kB_DoubleSharp_QTP] = "bisis"; - - gNorskPitchNamesMap [kC_DoubleFlat_QTP] = "ceses"; - gNorskPitchNamesMap [kC_SesquiFlat_QTP] = "cSesquiFlat???"; - gNorskPitchNamesMap [kC_Flat_QTP] = "ces"; - gNorskPitchNamesMap [kC_SemiFlat_QTP] = "cSemiFlat???"; - gNorskPitchNamesMap [kC_Natural_QTP] = "c"; - gNorskPitchNamesMap [kC_SemiSharp_QTP] = "cSemiSharp???"; - gNorskPitchNamesMap [kC_Sharp_QTP] = "cis"; - gNorskPitchNamesMap [kC_SesquiSharp_QTP] = "cSesquiSharp???"; - gNorskPitchNamesMap [kC_DoubleSharp_QTP] = "cisis"; - - gNorskPitchNamesMap [kD_DoubleFlat_QTP] = "deses"; - gNorskPitchNamesMap [kD_SesquiFlat_QTP] = "dSesquiFlat???"; - gNorskPitchNamesMap [kD_Flat_QTP] = "des"; - gNorskPitchNamesMap [kD_SemiFlat_QTP] = "dSemiFlat???"; - gNorskPitchNamesMap [kD_Natural_QTP] = "d"; - gNorskPitchNamesMap [kD_SemiSharp_QTP] = "dSemiSharp???"; - gNorskPitchNamesMap [kD_Sharp_QTP] = "dis"; - gNorskPitchNamesMap [kD_SesquiSharp_QTP] = "dSesquiSharp???"; - gNorskPitchNamesMap [kD_DoubleSharp_QTP] = "disis"; - - gNorskPitchNamesMap [kE_DoubleFlat_QTP] = "eeses"; - gNorskPitchNamesMap [kE_SesquiFlat_QTP] = "eSesquiFlat???"; - gNorskPitchNamesMap [kE_Flat_QTP] = "ees"; - gNorskPitchNamesMap [kE_SemiFlat_QTP] = "eSemiFlat???"; - gNorskPitchNamesMap [kE_Natural_QTP] = "e"; - gNorskPitchNamesMap [kE_SemiSharp_QTP] = "eSemiSharp???"; - gNorskPitchNamesMap [kE_Sharp_QTP] = "eis"; - gNorskPitchNamesMap [kE_SesquiSharp_QTP] = "eSesquiSharp???"; - gNorskPitchNamesMap [kE_DoubleSharp_QTP] = "eisis"; - - gNorskPitchNamesMap [kF_DoubleFlat_QTP] = "feses"; - gNorskPitchNamesMap [kF_SesquiFlat_QTP] = "fSesquiFlat???"; - gNorskPitchNamesMap [kF_Flat_QTP] = "fes"; - gNorskPitchNamesMap [kF_SemiFlat_QTP] = "fSemiFlat???"; - gNorskPitchNamesMap [kF_Natural_QTP] = "f"; - gNorskPitchNamesMap [kF_SemiSharp_QTP] = "fSemiSharp???"; - gNorskPitchNamesMap [kF_Sharp_QTP] = "fis"; - gNorskPitchNamesMap [kF_SesquiSharp_QTP] = "fSesquiSharp???"; - gNorskPitchNamesMap [kF_DoubleSharp_QTP] = "fisis"; - - gNorskPitchNamesMap [kG_DoubleFlat_QTP] = "geses"; - gNorskPitchNamesMap [kG_SesquiFlat_QTP] = "gSesquiFlat???"; - gNorskPitchNamesMap [kG_Flat_QTP] = "ges"; - gNorskPitchNamesMap [kG_SemiFlat_QTP] = "gSemiFlat???"; - gNorskPitchNamesMap [kG_Natural_QTP] = "g"; - gNorskPitchNamesMap [kG_SemiSharp_QTP] = "gSemiSharp???"; - gNorskPitchNamesMap [kG_Sharp_QTP] = "gis"; - gNorskPitchNamesMap [kG_SesquiSharp_QTP] = "gSesquiSharp???"; - gNorskPitchNamesMap [kG_DoubleSharp_QTP] = "gisis"; - - // portugues - gPortuguesPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gPortuguesPitchNamesMap [k_Rest_QTP] = "r"; - - gPortuguesPitchNamesMap [kA_DoubleFlat_QTP] = "labb"; - gPortuguesPitchNamesMap [kA_SesquiFlat_QTP] = "labtqt"; - gPortuguesPitchNamesMap [kA_Flat_QTP] = "lab"; - gPortuguesPitchNamesMap [kA_SemiFlat_QTP] = "lasb"; - gPortuguesPitchNamesMap [kA_Natural_QTP] = "la"; - gPortuguesPitchNamesMap [kA_SemiSharp_QTP] = "lasd"; - gPortuguesPitchNamesMap [kA_Sharp_QTP] = "lad"; - gPortuguesPitchNamesMap [kA_SesquiSharp_QTP] = "ladsd"; - gPortuguesPitchNamesMap [kA_DoubleSharp_QTP] = "ladd"; - - gPortuguesPitchNamesMap [kB_DoubleFlat_QTP] = "sibb"; - gPortuguesPitchNamesMap [kB_SesquiFlat_QTP] = "sibtqt"; - gPortuguesPitchNamesMap [kB_Flat_QTP] = "sib"; - gPortuguesPitchNamesMap [kB_SemiFlat_QTP] = "sisb"; - gPortuguesPitchNamesMap [kB_Natural_QTP] = "si"; - gPortuguesPitchNamesMap [kB_SemiSharp_QTP] = "sisd"; - gPortuguesPitchNamesMap [kB_Sharp_QTP] = "sid"; - gPortuguesPitchNamesMap [kB_SesquiSharp_QTP] = "sidsd"; - gPortuguesPitchNamesMap [kB_DoubleSharp_QTP] = "sidd"; - - gPortuguesPitchNamesMap [kC_DoubleFlat_QTP] = "dobb"; - gPortuguesPitchNamesMap [kC_SesquiFlat_QTP] = "dobtqt"; - gPortuguesPitchNamesMap [kC_Flat_QTP] = "dob"; - gPortuguesPitchNamesMap [kC_SemiFlat_QTP] = "dosb"; - gPortuguesPitchNamesMap [kC_Natural_QTP] = "do"; - gPortuguesPitchNamesMap [kC_SemiSharp_QTP] = "dosd"; - gPortuguesPitchNamesMap [kC_Sharp_QTP] = "dod"; - gPortuguesPitchNamesMap [kC_SesquiSharp_QTP] = "dodsd"; - gPortuguesPitchNamesMap [kC_DoubleSharp_QTP] = "dodd"; - - gPortuguesPitchNamesMap [kD_DoubleFlat_QTP] = "rebb"; - gPortuguesPitchNamesMap [kD_SesquiFlat_QTP] = "rebtqt"; - gPortuguesPitchNamesMap [kD_Flat_QTP] = "reb"; - gPortuguesPitchNamesMap [kD_SemiFlat_QTP] = "resb"; - gPortuguesPitchNamesMap [kD_Natural_QTP] = "re"; - gPortuguesPitchNamesMap [kD_SemiSharp_QTP] = "resd"; - gPortuguesPitchNamesMap [kD_Sharp_QTP] = "red"; - gPortuguesPitchNamesMap [kD_SesquiSharp_QTP] = "redsd"; - gPortuguesPitchNamesMap [kD_DoubleSharp_QTP] = "redd"; - - gPortuguesPitchNamesMap [kE_DoubleFlat_QTP] = "mibb"; - gPortuguesPitchNamesMap [kE_SesquiFlat_QTP] = "mibtqt"; - gPortuguesPitchNamesMap [kE_Flat_QTP] = "mib"; - gPortuguesPitchNamesMap [kE_SemiFlat_QTP] = "misb"; - gPortuguesPitchNamesMap [kE_Natural_QTP] = "mi"; - gPortuguesPitchNamesMap [kE_SemiSharp_QTP] = "misd"; - gPortuguesPitchNamesMap [kE_Sharp_QTP] = "mid"; - gPortuguesPitchNamesMap [kE_SesquiSharp_QTP] = "midsd"; - gPortuguesPitchNamesMap [kE_DoubleSharp_QTP] = "midd"; - - gPortuguesPitchNamesMap [kF_DoubleFlat_QTP] = "fabb"; - gPortuguesPitchNamesMap [kF_SesquiFlat_QTP] = "fabtqt"; - gPortuguesPitchNamesMap [kF_Flat_QTP] = "fab"; - gPortuguesPitchNamesMap [kF_SemiFlat_QTP] = "fasb"; - gPortuguesPitchNamesMap [kF_Natural_QTP] = "fa"; - gPortuguesPitchNamesMap [kF_SemiSharp_QTP] = "fasd"; - gPortuguesPitchNamesMap [kF_Sharp_QTP] = "fad"; - gPortuguesPitchNamesMap [kF_SesquiSharp_QTP] = "fadsd"; - gPortuguesPitchNamesMap [kF_DoubleSharp_QTP] = "fadd"; - - gPortuguesPitchNamesMap [kG_DoubleFlat_QTP] = "solbb"; - gPortuguesPitchNamesMap [kG_SesquiFlat_QTP] = "solbtqt"; - gPortuguesPitchNamesMap [kG_Flat_QTP] = "solb"; - gPortuguesPitchNamesMap [kG_SemiFlat_QTP] = "solsb"; - gPortuguesPitchNamesMap [kG_Natural_QTP] = "sol"; - gPortuguesPitchNamesMap [kG_SemiSharp_QTP] = "solsd"; - gPortuguesPitchNamesMap [kG_Sharp_QTP] = "sold"; - gPortuguesPitchNamesMap [kG_SesquiSharp_QTP] = "soldsd"; - gPortuguesPitchNamesMap [kG_DoubleSharp_QTP] = "soldd"; - - // suomi - gSuomiPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gSuomiPitchNamesMap [k_Rest_QTP] = "r"; - - gSuomiPitchNamesMap [kA_DoubleFlat_QTP] = "asas"; - gSuomiPitchNamesMap [kA_SesquiFlat_QTP] = "aSesquiFlat???"; - gSuomiPitchNamesMap [kA_Flat_QTP] = "as"; - gSuomiPitchNamesMap [kA_SemiFlat_QTP] = "aSemiFlat???"; - gSuomiPitchNamesMap [kA_Natural_QTP] = "a"; - gSuomiPitchNamesMap [kA_SemiSharp_QTP] = "aSemiSharp???"; - gSuomiPitchNamesMap [kA_Sharp_QTP] = "ais"; - gSuomiPitchNamesMap [kA_SesquiSharp_QTP] = "aSesquiSharp???"; - gSuomiPitchNamesMap [kA_DoubleSharp_QTP] = "aisis"; - - gSuomiPitchNamesMap [kB_DoubleFlat_QTP] = "bes"; - gSuomiPitchNamesMap [kB_SesquiFlat_QTP] = "bSesquiFlat???"; - gSuomiPitchNamesMap [kB_Flat_QTP] = "b"; - gSuomiPitchNamesMap [kB_SemiFlat_QTP] = "bSemiFlat???"; - gSuomiPitchNamesMap [kB_Natural_QTP] = "h"; - gSuomiPitchNamesMap [kB_SemiSharp_QTP] = "bSemiSharp???"; - gSuomiPitchNamesMap [kB_Sharp_QTP] = "his"; - gSuomiPitchNamesMap [kB_SesquiSharp_QTP] = "bSesquiSharp???"; - gSuomiPitchNamesMap [kB_DoubleSharp_QTP] = "hisis"; - - gSuomiPitchNamesMap [kC_DoubleFlat_QTP] = "ceses"; - gSuomiPitchNamesMap [kC_SesquiFlat_QTP] = "cSesquiFlat???"; - gSuomiPitchNamesMap [kC_Flat_QTP] = "ces"; - gSuomiPitchNamesMap [kC_SemiFlat_QTP] = "cSemiFlat???"; - gSuomiPitchNamesMap [kC_Natural_QTP] = "c"; - gSuomiPitchNamesMap [kC_SemiSharp_QTP] = "cSemiSharp???"; - gSuomiPitchNamesMap [kC_Sharp_QTP] = "cis"; - gSuomiPitchNamesMap [kC_SesquiSharp_QTP] = "cSesquiSharp???"; - gSuomiPitchNamesMap [kC_DoubleSharp_QTP] = "cisis"; - - gSuomiPitchNamesMap [kD_DoubleFlat_QTP] = "deses"; - gSuomiPitchNamesMap [kD_SesquiFlat_QTP] = "dSesquiFlat???"; - gSuomiPitchNamesMap [kD_Flat_QTP] = "des"; - gSuomiPitchNamesMap [kD_SemiFlat_QTP] = "dSemiFlat???"; - gSuomiPitchNamesMap [kD_Natural_QTP] = "d"; - gSuomiPitchNamesMap [kD_SemiSharp_QTP] = "dSemiSharp???"; - gSuomiPitchNamesMap [kD_Sharp_QTP] = "dis"; - gSuomiPitchNamesMap [kD_SesquiSharp_QTP] = "dSesquiSharp???"; - gSuomiPitchNamesMap [kD_DoubleSharp_QTP] = "disis"; - - gSuomiPitchNamesMap [kE_DoubleFlat_QTP] = "eses"; - gSuomiPitchNamesMap [kE_SesquiFlat_QTP] = "eSesquiFlat???"; - gSuomiPitchNamesMap [kE_Flat_QTP] = "es"; - gSuomiPitchNamesMap [kE_SemiFlat_QTP] = "eSemiFlat???"; - gSuomiPitchNamesMap [kE_Natural_QTP] = "e"; - gSuomiPitchNamesMap [kE_SemiSharp_QTP] = "eSemiSharp???"; - gSuomiPitchNamesMap [kE_Sharp_QTP] = "eis"; - gSuomiPitchNamesMap [kE_SesquiSharp_QTP] = "eSesquiSharp???"; - gSuomiPitchNamesMap [kE_DoubleSharp_QTP] = "eisis"; - - gSuomiPitchNamesMap [kF_DoubleFlat_QTP] = "feses"; - gSuomiPitchNamesMap [kF_SesquiFlat_QTP] = "fSesquiFlat???"; - gSuomiPitchNamesMap [kF_Flat_QTP] = "fes"; - gSuomiPitchNamesMap [kF_SemiFlat_QTP] = "fSemiFlat???"; - gSuomiPitchNamesMap [kF_Natural_QTP] = "f"; - gSuomiPitchNamesMap [kF_SemiSharp_QTP] = "fSemiSharp???"; - gSuomiPitchNamesMap [kF_Sharp_QTP] = "fis"; - gSuomiPitchNamesMap [kF_SesquiSharp_QTP] = "fSesquiSharp???"; - gSuomiPitchNamesMap [kF_DoubleSharp_QTP] = "fisis"; - - gSuomiPitchNamesMap [kG_DoubleFlat_QTP] = "geses"; - gSuomiPitchNamesMap [kG_SesquiFlat_QTP] = "gSesquiFlat???"; - gSuomiPitchNamesMap [kG_Flat_QTP] = "ges"; - gSuomiPitchNamesMap [kG_SemiFlat_QTP] = "gSemiFlat???"; - gSuomiPitchNamesMap [kG_Natural_QTP] = "g"; - gSuomiPitchNamesMap [kG_SemiSharp_QTP] = "gSemiSharp???"; - gSuomiPitchNamesMap [kG_Sharp_QTP] = "gis"; - gSuomiPitchNamesMap [kG_SesquiSharp_QTP] = "gSesquiSharp???"; - gSuomiPitchNamesMap [kG_DoubleSharp_QTP] = "gisis"; - - // svenska - gSvenskaPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gSvenskaPitchNamesMap [k_Rest_QTP] = "r"; - - gSvenskaPitchNamesMap [kA_DoubleFlat_QTP] = "assess"; - gSvenskaPitchNamesMap [kA_SesquiFlat_QTP] = "aSesquiFlat???"; - gSvenskaPitchNamesMap [kA_Flat_QTP] = "ass"; - gSvenskaPitchNamesMap [kA_SemiFlat_QTP] = "aSemiFlat???"; - gSvenskaPitchNamesMap [kA_Natural_QTP] = "a"; - gSvenskaPitchNamesMap [kA_SemiSharp_QTP] = "aSemiSharp???"; - gSvenskaPitchNamesMap [kA_Sharp_QTP] = "aiss"; - gSvenskaPitchNamesMap [kA_SesquiSharp_QTP] = "aSesquiSharp???"; - gSvenskaPitchNamesMap [kA_DoubleSharp_QTP] = "aississ"; - - gSvenskaPitchNamesMap [kB_DoubleFlat_QTP] = "hessess"; - gSvenskaPitchNamesMap [kB_SesquiFlat_QTP] = "bSesquiFlat???"; - gSvenskaPitchNamesMap [kB_Flat_QTP] = "b"; - gSvenskaPitchNamesMap [kB_SemiFlat_QTP] = "bSemiFlat???"; - gSvenskaPitchNamesMap [kB_Natural_QTP] = "h"; - gSvenskaPitchNamesMap [kB_SemiSharp_QTP] = "bSemiSharp???"; - gSvenskaPitchNamesMap [kB_Sharp_QTP] = "hiss"; - gSvenskaPitchNamesMap [kB_SesquiSharp_QTP] = "bSesquiSharp???"; - gSvenskaPitchNamesMap [kB_DoubleSharp_QTP] = "hississ"; - - gSvenskaPitchNamesMap [kC_DoubleFlat_QTP] = "cessess"; - gSvenskaPitchNamesMap [kC_SesquiFlat_QTP] = "cSesquiFlat???"; - gSvenskaPitchNamesMap [kC_Flat_QTP] = "cess"; - gSvenskaPitchNamesMap [kC_SemiFlat_QTP] = "cSemiFlat???"; - gSvenskaPitchNamesMap [kC_Natural_QTP] = "c"; - gSvenskaPitchNamesMap [kC_SemiSharp_QTP] = "cSemiSharp???"; - gSvenskaPitchNamesMap [kC_Sharp_QTP] = "ciss"; - gSvenskaPitchNamesMap [kC_SesquiSharp_QTP] = "cSesquiSharp???"; - gSvenskaPitchNamesMap [kC_DoubleSharp_QTP] = "cississ"; - - gSvenskaPitchNamesMap [kD_DoubleFlat_QTP] = "dessess"; - gSvenskaPitchNamesMap [kD_SesquiFlat_QTP] = "dSesquiFlat???"; - gSvenskaPitchNamesMap [kD_Flat_QTP] = "dess"; - gSvenskaPitchNamesMap [kD_SemiFlat_QTP] = "dSemiFlat???"; - gSvenskaPitchNamesMap [kD_Natural_QTP] = "d"; - gSvenskaPitchNamesMap [kD_SemiSharp_QTP] = "dSemiSharp???"; - gSvenskaPitchNamesMap [kD_Sharp_QTP] = "diss"; - gSvenskaPitchNamesMap [kD_SesquiSharp_QTP] = "dSesquiSharp???"; - gSvenskaPitchNamesMap [kD_DoubleSharp_QTP] = "dississ"; - - gSvenskaPitchNamesMap [kE_DoubleFlat_QTP] = "essess"; - gSvenskaPitchNamesMap [kE_SesquiFlat_QTP] = "eSesquiFlat???"; - gSvenskaPitchNamesMap [kE_Flat_QTP] = "ess"; - gSvenskaPitchNamesMap [kE_SemiFlat_QTP] = "eSemiFlat???"; - gSvenskaPitchNamesMap [kE_Natural_QTP] = "e"; - gSvenskaPitchNamesMap [kE_SemiSharp_QTP] = "eSemiSharp???"; - gSvenskaPitchNamesMap [kE_Sharp_QTP] = "eiss"; - gSvenskaPitchNamesMap [kE_SesquiSharp_QTP] = "eSesquiSharp???"; - gSvenskaPitchNamesMap [kE_DoubleSharp_QTP] = "eississ"; - - gSvenskaPitchNamesMap [kF_DoubleFlat_QTP] = "fessess"; - gSvenskaPitchNamesMap [kF_SesquiFlat_QTP] = "fSesquiFlat???"; - gSvenskaPitchNamesMap [kF_Flat_QTP] = "fess"; - gSvenskaPitchNamesMap [kF_SemiFlat_QTP] = "fSemiFlat???"; - gSvenskaPitchNamesMap [kF_Natural_QTP] = "f"; - gSvenskaPitchNamesMap [kF_SemiSharp_QTP] = "fSemiSharp???"; - gSvenskaPitchNamesMap [kF_Sharp_QTP] = "fiss"; - gSvenskaPitchNamesMap [kF_SesquiSharp_QTP] = "fSesquiSharp???"; - gSvenskaPitchNamesMap [kF_DoubleSharp_QTP] = "fississ"; - - gSvenskaPitchNamesMap [kG_DoubleFlat_QTP] = "gessess"; - gSvenskaPitchNamesMap [kG_SesquiFlat_QTP] = "gSesquiFlat???"; - gSvenskaPitchNamesMap [kG_Flat_QTP] = "gess"; - gSvenskaPitchNamesMap [kG_SemiFlat_QTP] = "gSemiFlat???"; - gSvenskaPitchNamesMap [kG_Natural_QTP] = "g"; - gSvenskaPitchNamesMap [kG_SemiSharp_QTP] = "gSemiSharp???"; - gSvenskaPitchNamesMap [kG_Sharp_QTP] = "giss"; - gSvenskaPitchNamesMap [kG_SesquiSharp_QTP] = "gSesquiSharp???"; - gSvenskaPitchNamesMap [kG_DoubleSharp_QTP] = "gississ"; - - // vlaams - gVlaamsPitchNamesMap [k_NoQuarterTonesPitch_QTP] = "noQuarterTonePitch"; - gVlaamsPitchNamesMap [k_Rest_QTP] = "r"; - - gVlaamsPitchNamesMap [kA_DoubleFlat_QTP] = "labb"; - gVlaamsPitchNamesMap [kA_SesquiFlat_QTP] = "laSesquiFlat???"; - gVlaamsPitchNamesMap [kA_Flat_QTP] = "lab"; - gVlaamsPitchNamesMap [kA_SemiFlat_QTP] = "laSemiFlat???"; - gVlaamsPitchNamesMap [kA_Natural_QTP] = "la"; - gVlaamsPitchNamesMap [kA_SemiSharp_QTP] = "laSemiSharp???"; - gVlaamsPitchNamesMap [kA_Sharp_QTP] = "lak"; - gVlaamsPitchNamesMap [kA_SesquiSharp_QTP] = "laSesquiSharp???"; - gVlaamsPitchNamesMap [kA_DoubleSharp_QTP] = "lakk"; - - gVlaamsPitchNamesMap [kB_DoubleFlat_QTP] = "sibb"; - gVlaamsPitchNamesMap [kB_SesquiFlat_QTP] = "siSesquiFlat???"; - gVlaamsPitchNamesMap [kB_Flat_QTP] = "sib"; - gVlaamsPitchNamesMap [kB_SemiFlat_QTP] = "siSemiFlat???"; - gVlaamsPitchNamesMap [kB_Natural_QTP] = "si"; - gVlaamsPitchNamesMap [kB_SemiSharp_QTP] = "siSemiSharp???"; - gVlaamsPitchNamesMap [kB_Sharp_QTP] = "sik"; - gVlaamsPitchNamesMap [kB_SesquiSharp_QTP] = "siSesquiSharp???"; - gVlaamsPitchNamesMap [kB_DoubleSharp_QTP] = "sikk"; - - gVlaamsPitchNamesMap [kC_DoubleFlat_QTP] = "dobb"; - gVlaamsPitchNamesMap [kC_SesquiFlat_QTP] = "doSesquiFlat???"; - gVlaamsPitchNamesMap [kC_Flat_QTP] = "dob"; - gVlaamsPitchNamesMap [kC_SemiFlat_QTP] = "doSemiFlat???"; - gVlaamsPitchNamesMap [kC_Natural_QTP] = "do"; - gVlaamsPitchNamesMap [kC_SemiSharp_QTP] = "doSemiSharp???"; - gVlaamsPitchNamesMap [kC_Sharp_QTP] = "dok"; - gVlaamsPitchNamesMap [kC_SesquiSharp_QTP] = "doSesquiSharp???"; - gVlaamsPitchNamesMap [kC_DoubleSharp_QTP] = "dokk"; - - gVlaamsPitchNamesMap [kD_DoubleFlat_QTP] = "rebb"; - gVlaamsPitchNamesMap [kD_SesquiFlat_QTP] = "reSesquiFlat???"; - gVlaamsPitchNamesMap [kD_Flat_QTP] = "reb"; - gVlaamsPitchNamesMap [kD_SemiFlat_QTP] = "reSemiFlat???"; - gVlaamsPitchNamesMap [kD_Natural_QTP] = "re"; - gVlaamsPitchNamesMap [kD_SemiSharp_QTP] = "reSemiSharp???"; - gVlaamsPitchNamesMap [kD_Sharp_QTP] = "rek"; - gVlaamsPitchNamesMap [kD_SesquiSharp_QTP] = "reSesquiSharp???"; - gVlaamsPitchNamesMap [kD_DoubleSharp_QTP] = "rekk"; - - gVlaamsPitchNamesMap [kE_DoubleFlat_QTP] = "mibb"; - gVlaamsPitchNamesMap [kE_SesquiFlat_QTP] = "miSesquiFlat???"; - gVlaamsPitchNamesMap [kE_Flat_QTP] = "mib"; - gVlaamsPitchNamesMap [kE_SemiFlat_QTP] = "miSemiFlat???"; - gVlaamsPitchNamesMap [kE_Natural_QTP] = "mi"; - gVlaamsPitchNamesMap [kE_SemiSharp_QTP] = "miSemiSharp???"; - gVlaamsPitchNamesMap [kE_Sharp_QTP] = "mik"; - gVlaamsPitchNamesMap [kE_SesquiSharp_QTP] = "miSesquiSharp???"; - gVlaamsPitchNamesMap [kE_DoubleSharp_QTP] = "mikk"; - - gVlaamsPitchNamesMap [kF_DoubleFlat_QTP] = "fabb"; - gVlaamsPitchNamesMap [kF_SesquiFlat_QTP] = "faSesquiFlat???"; - gVlaamsPitchNamesMap [kF_Flat_QTP] = "fab"; - gVlaamsPitchNamesMap [kF_SemiFlat_QTP] = "faSemiFlat???"; - gVlaamsPitchNamesMap [kF_Natural_QTP] = "fa"; - gVlaamsPitchNamesMap [kF_SemiSharp_QTP] = "faSemiSharp???"; - gVlaamsPitchNamesMap [kF_Sharp_QTP] = "fak"; - gVlaamsPitchNamesMap [kF_SesquiSharp_QTP] = "faSesquiSharp???"; - gVlaamsPitchNamesMap [kF_DoubleSharp_QTP] = "fakk"; - - gVlaamsPitchNamesMap [kG_DoubleFlat_QTP] = "solbb"; - gVlaamsPitchNamesMap [kG_SesquiFlat_QTP] = "solSesquiFlat???"; - gVlaamsPitchNamesMap [kG_Flat_QTP] = "solb"; - gVlaamsPitchNamesMap [kG_SemiFlat_QTP] = "solSemiFlat???"; - gVlaamsPitchNamesMap [kG_Natural_QTP] = "sol"; - gVlaamsPitchNamesMap [kG_SemiSharp_QTP] = "solSemiSharp???"; - gVlaamsPitchNamesMap [kG_Sharp_QTP] = "solk"; - gVlaamsPitchNamesMap [kG_SesquiSharp_QTP] = "solSesquiSharp???"; - gVlaamsPitchNamesMap [kG_DoubleSharp_QTP] = "solkk"; -} - -string msrDiatonicPitchKindAsString ( - msrDiatonicPitchKind diatonicPitchKind) -{ - string result; - - switch (diatonicPitchKind) { - case k_NoDiatonicPitch: - result = "k_NoDiatonicPitch"; - break; - - case kA: - result = "A"; - break; - case kB: - result = "B"; - break; - case kC: - result = "C"; - break; - case kD: - result = "D"; - break; - case kE: - result = "E"; - break; - case kF: - result = "F"; - break; - case kG: - result = "G"; - break; - } // switch - - return result; -} - -msrDiatonicPitchKind msrDiatonicPitchKindFromString ( - char diatonicNoteName) -{ - msrDiatonicPitchKind result = k_NoDiatonicPitch; - - switch (diatonicNoteName) { - case 'a': - case 'A': - result = kA; - break; - case 'b': - case 'B': - result = kB; - break; - case 'c': - case 'C': - result = kC; - break; - case 'd': - case 'D': - result = kD; - break; - case 'e': - case 'E': - result = kE; - break; - case 'f': - case 'F': - result = kF; - break; - case 'g': - case 'G': - result = kG; - break; - default: {} - } // switch - - return result; -} - -string msrDiatonicPitchKindAsString ( - msrQuarterTonesPitchesLanguageKind languageKind, // JMI - msrDiatonicPitchKind diatonicPitchKind) -{ - string result; - - switch (diatonicPitchKind) { - case k_NoDiatonicPitch: - result = "k_NoDiatonicPitch"; - break; - - case kA: - result = "a"; - break; - case kB: - result = "b"; - break; - case kC: - result = "c"; - break; - case kD: - result = "d"; - break; - case kE: - result = "e"; - break; - case kF: - result = "f"; - break; - case kG: - result = "g"; - break; - } // switch - - return result; -} - -string msrQuarterTonesPitchesLanguageKindAsString ( - msrQuarterTonesPitchesLanguageKind languageKind) -{ - string result; - - switch (languageKind) { - case kNederlands: - result = "nederlands"; - break; - case kCatalan: - result = "catalan"; - break; - case kDeutsch: - result = "deutsch"; - break; - case kEnglish: - result = "english"; - break; - case kEspanol: - result = "espanol"; - break; - case kFrancais: - result = "francais"; - break; - case kItaliano: - result = "italiano"; - break; - case kNorsk: - result = "norsk"; - break; - case kPortugues: - result = "portugues"; - break; - case kSuomi: - result = "suomi"; - break; - case kSvenska: - result = "svenska"; - break; - case kVlaams: - result = "vlaams"; - break; - } // switch - - return result; -} - -msrAlterationKind msrAlterationKindFromMusicXMLAlter ( - float alter) -{ - -/* - The alter element represents chromatic alteration - in number of semitones (e.g., -1 for flat, 1 for sharp). - Decimal values like 0.5 (quarter tone sharp) are used for microtones: - - semi-sharp semi-flat sesqui-sharp sesqui-flat double-sharp double-flat - +0.5 -0.5 +1.5 -1.5 +2.0 -2.0 -*/ - - msrAlterationKind result = k_NoAlteration; - - if (alter == 0 ) { - result = kNatural; - } - - else if (alter == -1 ) { - result = kFlat; - } - - else if (alter == 1 ) { - result = kSharp; - } - - else if (alter == -0.5 ) { - result = kSemiFlat; - } - - else if (alter == +0.5 ) { - result = kSemiSharp; - } - - else if (alter == -1.5 ) { - result = kSesquiFlat; - } - - else if (alter == +1.5 ) { - result = kSesquiSharp; - } - - else if (alter == -2 ) { - result = kDoubleFlat; - } - - else if (alter == +2 ) { - result = kDoubleSharp; - } - - else if (alter == -3 ) { - result = kTripleFlat; - } - - else if (alter == +3 ) { - result = kTripleSharp; - } - - return result; -} - -// alterations -//______________________________________________________________________________ -string msrAlterationKindAsString ( - msrAlterationKind alterationKind) -{ - string result; - - switch (alterationKind) { - case k_NoAlteration: - result = "noAlteration"; - break; - - case kTripleFlat: - result = "tripleFlat"; - break; - case kDoubleFlat: - result = "doubleFlat"; - break; - case kSesquiFlat: - result = "sesquiFlat"; - break; - case kFlat: - result = "flat"; - break; - case kSemiFlat: - result = "semiFlat"; - break; - case kNatural: - result = "natural"; - break; - case kSemiSharp: - result = "semiSharp"; - break; - case kSharp: - result = "sharp"; - break; - case kSesquiSharp: - result = "sesquiSharp"; - break; - case kDoubleSharp: - result = "doubleSharp"; - break; - case kTripleSharp: - result = "tripleSharp"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -void setDiatonicPitchAndAlterationKind ( - msrQuarterTonesPitchKind quarterTonesPitchKind, - msrDiatonicPitchKind& diatonicPitchKind, - msrAlterationKind& alterationKind) -{ - switch (quarterTonesPitchKind) { - case k_NoQuarterTonesPitch_QTP: - diatonicPitchKind = kA; // any value would fit - alterationKind = k_NoAlteration; - break; - - case kA_TripleFlat_QTP: - diatonicPitchKind = kA; - alterationKind = kTripleFlat; - break; - case kA_DoubleFlat_QTP: - diatonicPitchKind = kA; - alterationKind = kDoubleFlat; - break; - case kA_SesquiFlat_QTP: - diatonicPitchKind = kA; - alterationKind = kSesquiFlat; - break; - case kA_Flat_QTP: - diatonicPitchKind = kA; - alterationKind = kFlat; - break; - case kA_SemiFlat_QTP: - diatonicPitchKind = kA; - alterationKind = kSemiFlat; - break; - case kA_Natural_QTP: - diatonicPitchKind = kA; - alterationKind = kNatural; - break; - case kA_SemiSharp_QTP: - diatonicPitchKind = kA; - alterationKind = kSemiSharp; - break; - case kA_Sharp_QTP: - diatonicPitchKind = kA; - alterationKind = kSharp; - break; - case kA_SesquiSharp_QTP: - diatonicPitchKind = kA; - alterationKind = kSesquiSharp; - break; - case kA_DoubleSharp_QTP: - diatonicPitchKind = kA; - alterationKind = kDoubleSharp; - break; - case kA_TripleSharp_QTP: - diatonicPitchKind = kA; - alterationKind = kTripleSharp; - break; - - case kB_TripleFlat_QTP: - diatonicPitchKind = kB; - alterationKind = kTripleFlat; - break; - case kB_DoubleFlat_QTP: - diatonicPitchKind = kB; - alterationKind = kDoubleFlat; - break; - case kB_SesquiFlat_QTP: - diatonicPitchKind = kB; - alterationKind = kSesquiFlat; - break; - case kB_Flat_QTP: - diatonicPitchKind = kB; - alterationKind = kFlat; - break; - case kB_SemiFlat_QTP: - diatonicPitchKind = kB; - alterationKind = kSemiFlat; - break; - case kB_Natural_QTP: - diatonicPitchKind = kB; - alterationKind = kNatural; - break; - case kB_SemiSharp_QTP: - diatonicPitchKind = kB; - alterationKind = kSemiSharp; - break; - case kB_Sharp_QTP: - diatonicPitchKind = kB; - alterationKind = kSharp; - break; - case kB_SesquiSharp_QTP: - diatonicPitchKind = kB; - alterationKind = kSesquiSharp; - break; - case kB_DoubleSharp_QTP: - diatonicPitchKind = kB; - alterationKind = kDoubleSharp; - break; - case kB_TripleSharp_QTP: - diatonicPitchKind = kB; - alterationKind = kTripleSharp; - break; - - case kC_TripleFlat_QTP: - diatonicPitchKind = kC; - alterationKind = kTripleFlat; - break; - case kC_DoubleFlat_QTP: - diatonicPitchKind = kC; - alterationKind = kDoubleFlat; - break; - case kC_SesquiFlat_QTP: - diatonicPitchKind = kC; - alterationKind = kSesquiFlat; - break; - case kC_Flat_QTP: - diatonicPitchKind = kC; - alterationKind = kFlat; - break; - case kC_SemiFlat_QTP: - diatonicPitchKind = kC; - alterationKind = kSemiFlat; - break; - case kC_Natural_QTP: - diatonicPitchKind = kC; - alterationKind = kNatural; - break; - case kC_SemiSharp_QTP: - diatonicPitchKind = kC; - alterationKind = kSemiSharp; - break; - case kC_Sharp_QTP: - diatonicPitchKind = kC; - alterationKind = kSharp; - break; - case kC_SesquiSharp_QTP: - diatonicPitchKind = kC; - alterationKind = kSesquiSharp; - break; - case kC_DoubleSharp_QTP: - diatonicPitchKind = kC; - alterationKind = kDoubleSharp; - break; - case kC_TripleSharp_QTP: - diatonicPitchKind = kC; - alterationKind = kTripleSharp; - break; - - case kD_TripleFlat_QTP: - diatonicPitchKind = kD; - alterationKind = kTripleFlat; - break; - case kD_DoubleFlat_QTP: - diatonicPitchKind = kD; - alterationKind = kDoubleFlat; - break; - case kD_SesquiFlat_QTP: - diatonicPitchKind = kD; - alterationKind = kSesquiFlat; - break; - case kD_Flat_QTP: - diatonicPitchKind = kD; - alterationKind = kFlat; - break; - case kD_SemiFlat_QTP: - diatonicPitchKind = kD; - alterationKind = kSemiFlat; - break; - case kD_Natural_QTP: - diatonicPitchKind = kD; - alterationKind = kNatural; - break; - case kD_SemiSharp_QTP: - diatonicPitchKind = kD; - alterationKind = kSemiSharp; - break; - case kD_Sharp_QTP: - diatonicPitchKind = kD; - alterationKind = kSharp; - break; - case kD_SesquiSharp_QTP: - diatonicPitchKind = kD; - alterationKind = kSesquiSharp; - break; - case kD_DoubleSharp_QTP: - diatonicPitchKind = kD; - alterationKind = kDoubleSharp; - break; - case kD_TripleSharp_QTP: - diatonicPitchKind = kD; - alterationKind = kTripleSharp; - break; - - case kE_TripleFlat_QTP: - diatonicPitchKind = kE; - alterationKind = kTripleFlat; - break; - case kE_DoubleFlat_QTP: - diatonicPitchKind = kE; - alterationKind = kDoubleFlat; - break; - case kE_SesquiFlat_QTP: - diatonicPitchKind = kE; - alterationKind = kSesquiFlat; - break; - case kE_Flat_QTP: - diatonicPitchKind = kE; - alterationKind = kFlat; - break; - case kE_SemiFlat_QTP: - diatonicPitchKind = kE; - alterationKind = kSemiFlat; - break; - case kE_Natural_QTP: - diatonicPitchKind = kE; - alterationKind = kNatural; - break; - case kE_SemiSharp_QTP: - diatonicPitchKind = kE; - alterationKind = kSemiSharp; - break; - case kE_Sharp_QTP: - diatonicPitchKind = kE; - alterationKind = kSharp; - break; - case kE_SesquiSharp_QTP: - diatonicPitchKind = kE; - alterationKind = kSesquiSharp; - break; - case kE_DoubleSharp_QTP: - diatonicPitchKind = kE; - alterationKind = kDoubleSharp; - break; - case kE_TripleSharp_QTP: - diatonicPitchKind = kE; - alterationKind = kTripleSharp; - break; - - case kF_TripleFlat_QTP: - diatonicPitchKind = kF; - alterationKind = kTripleFlat; - break; - case kF_DoubleFlat_QTP: - diatonicPitchKind = kF; - alterationKind = kDoubleFlat; - break; - case kF_SesquiFlat_QTP: - diatonicPitchKind = kF; - alterationKind = kSesquiFlat; - break; - case kF_Flat_QTP: - diatonicPitchKind = kF; - alterationKind = kFlat; - break; - case kF_SemiFlat_QTP: - diatonicPitchKind = kF; - alterationKind = kSemiFlat; - break; - case kF_Natural_QTP: - diatonicPitchKind = kF; - alterationKind = kNatural; - break; - case kF_SemiSharp_QTP: - diatonicPitchKind = kF; - alterationKind = kSemiSharp; - break; - case kF_Sharp_QTP: - diatonicPitchKind = kF; - alterationKind = kSharp; - break; - case kF_SesquiSharp_QTP: - diatonicPitchKind = kF; - alterationKind = kSesquiSharp; - break; - case kF_DoubleSharp_QTP: - diatonicPitchKind = kF; - alterationKind = kDoubleSharp; - break; - case kF_TripleSharp_QTP: - diatonicPitchKind = kF; - alterationKind = kTripleSharp; - break; - - case kG_TripleFlat_QTP: - diatonicPitchKind = kG; - alterationKind = kTripleFlat; - break; - case kG_DoubleFlat_QTP: - diatonicPitchKind = kG; - alterationKind = kDoubleFlat; - break; - case kG_SesquiFlat_QTP: - diatonicPitchKind = kG; - alterationKind = kSesquiFlat; - break; - case kG_Flat_QTP: - diatonicPitchKind = kG; - break; - case kG_SemiFlat_QTP: - diatonicPitchKind = kG; - alterationKind = kSemiFlat; - break; - case kG_Natural_QTP: - diatonicPitchKind = kG; - alterationKind = kNatural; - break; - case kG_SemiSharp_QTP: - diatonicPitchKind = kG; - alterationKind = kSemiSharp; - break; - case kG_Sharp_QTP: - diatonicPitchKind = kG; - alterationKind = kSharp; - break; - case kG_SesquiSharp_QTP: - diatonicPitchKind = kG; - alterationKind = kSesquiSharp; - break; - case kG_DoubleSharp_QTP: - diatonicPitchKind = kG; - alterationKind = kDoubleSharp; - break; - case kG_TripleSharp_QTP: - diatonicPitchKind = kG; - alterationKind = kTripleSharp; - break; - - case k_Rest_QTP: - diatonicPitchKind = kA; // any value would fit JMI - alterationKind = k_NoAlteration; - - break; - } // switch -} - -msrQuarterTonesPitchKind quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - int inputLineNumber, - msrDiatonicPitchKind diatonicPitchKind, - msrAlterationKind alterationKind) -{ - msrQuarterTonesPitchKind - result = - k_NoQuarterTonesPitch_QTP; - - switch (diatonicPitchKind) { - case kA: - switch (alterationKind) { - case kTripleFlat: - result = kA_TripleFlat_QTP; - break; - case kDoubleFlat: - result = kA_DoubleFlat_QTP; - break; - case kSesquiFlat: - result = kA_SesquiFlat_QTP; - break; - case kFlat: - result = kA_Flat_QTP; - break; - case kSemiFlat: - result = kA_SemiFlat_QTP; - break; - case kNatural: - result = kA_Natural_QTP; - break; - case kSemiSharp: - result = kA_SemiSharp_QTP; - break; - case kSharp: - result = kA_Sharp_QTP; - break; - case kSesquiSharp: - result = kA_SesquiSharp_QTP; - break; - case kDoubleSharp: - result = kA_DoubleSharp_QTP; - break; - case kTripleSharp: - result = kA_TripleSharp_QTP; - break; - case k_NoAlteration: - { - stringstream s; - - s << - "'A' alteration has not been set" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - case kB: - switch (alterationKind) { - case kTripleFlat: - result = kB_TripleFlat_QTP; - break; - case kDoubleFlat: - result = kB_DoubleFlat_QTP; - break; - case kSesquiFlat: - result = kB_SesquiFlat_QTP; - break; - case kFlat: - result = kB_Flat_QTP; - break; - case kSemiFlat: - result = kB_SemiFlat_QTP; - break; - case kNatural: - result = kB_Natural_QTP; - break; - case kSemiSharp: - result = kB_SemiSharp_QTP; - break; - case kSharp: - result = kB_Sharp_QTP; - break; - case kSesquiSharp: - result = kB_SesquiSharp_QTP; - break; - case kDoubleSharp: - result = kB_DoubleSharp_QTP; - break; - case kTripleSharp: - result = kB_TripleSharp_QTP; - break; - case k_NoAlteration: - { - stringstream s; - - s << - "'B' alteration has not been set" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - break; - - case kC: - switch (alterationKind) { - case kTripleFlat: - result = kC_TripleFlat_QTP; - break; - case kDoubleFlat: - result = kC_DoubleFlat_QTP; - break; - case kSesquiFlat: - result = kC_SesquiFlat_QTP; - break; - case kFlat: - result = kC_Flat_QTP; - break; - case kSemiFlat: - result = kC_SemiFlat_QTP; - break; - case kNatural: - result = kC_Natural_QTP; - break; - case kSemiSharp: - result = kC_SemiSharp_QTP; - break; - case kSharp: - result = kC_Sharp_QTP; - break; - case kSesquiSharp: - result = kC_SesquiSharp_QTP; - break; - case kDoubleSharp: - result = kC_DoubleSharp_QTP; - break; - case kTripleSharp: - result = kC_TripleSharp_QTP; - break; - case k_NoAlteration: - { - stringstream s; - - s << - "'C' alteration has not been set" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - case kD: - switch (alterationKind) { - case kTripleFlat: - result = kD_TripleFlat_QTP; - break; - case kDoubleFlat: - result = kD_DoubleFlat_QTP; - break; - case kSesquiFlat: - result = kD_SesquiFlat_QTP; - break; - case kFlat: - result = kD_Flat_QTP; - break; - case kSemiFlat: - result = kD_SemiFlat_QTP; - break; - case kNatural: - result = kD_Natural_QTP; - break; - case kSemiSharp: - result = kD_SemiSharp_QTP; - break; - case kSharp: - result = kD_Sharp_QTP; - break; - case kSesquiSharp: - result = kD_SesquiSharp_QTP; - break; - case kDoubleSharp: - result = kD_DoubleSharp_QTP; - break; - case kTripleSharp: - result = kD_TripleSharp_QTP; - break; - case k_NoAlteration: - { - stringstream s; - - s << - "'D' alteration has not been set" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - case kE: - switch (alterationKind) { - case kTripleFlat: - result = kE_TripleFlat_QTP; - break; - case kDoubleFlat: - result = kE_DoubleFlat_QTP; - break; - case kSesquiFlat: - result = kE_SesquiFlat_QTP; - break; - case kFlat: - result = kE_Flat_QTP; - break; - case kSemiFlat: - result = kE_SemiFlat_QTP; - break; - case kNatural: - result = kE_Natural_QTP; - break; - case kSemiSharp: - result = kE_SemiSharp_QTP; - break; - case kSharp: - result = kE_Sharp_QTP; - break; - case kSesquiSharp: - result = kE_SesquiSharp_QTP; - break; - case kDoubleSharp: - result = kE_DoubleSharp_QTP; - break; - case kTripleSharp: - result = kE_TripleSharp_QTP; - break; - case k_NoAlteration: - { - stringstream s; - - s << - "'E' alteration has not been set" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - case kF: - switch (alterationKind) { - case kTripleFlat: - result = kF_TripleFlat_QTP; - break; - case kDoubleFlat: - result = kF_DoubleFlat_QTP; - break; - case kSesquiFlat: - result = kF_SesquiFlat_QTP; - break; - case kFlat: - result = kF_Flat_QTP; - break; - case kSemiFlat: - result = kF_SemiFlat_QTP; - break; - case kNatural: - result = kF_Natural_QTP; - break; - case kSemiSharp: - result = kF_SemiSharp_QTP; - break; - case kSharp: - result = kF_Sharp_QTP; - break; - case kSesquiSharp: - result = kF_SesquiSharp_QTP; - break; - case kDoubleSharp: - result = kF_DoubleSharp_QTP; - break; - case kTripleSharp: - result = kF_TripleSharp_QTP; - break; - case k_NoAlteration: - { - stringstream s; - - s << - "'F' alteration has not been set" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - case kG: - switch (alterationKind) { - case kTripleFlat: - result = kG_TripleFlat_QTP; - break; - case kDoubleFlat: - result = kG_DoubleFlat_QTP; - break; - case kSesquiFlat: - result = kG_SesquiFlat_QTP; - break; - case kFlat: - result = kG_Flat_QTP; - break; - case kSemiFlat: - result = kG_SemiFlat_QTP; - break; - case kNatural: - result = kG_Natural_QTP; - break; - case kSemiSharp: - result = kG_SemiSharp_QTP; - break; - case kSharp: - result = kG_Sharp_QTP; - break; - case kSesquiSharp: - result = kG_SesquiSharp_QTP; - break; - case kDoubleSharp: - result = kG_DoubleSharp_QTP; - break; - case kTripleSharp: - result = kG_TripleSharp_QTP; - break; - case k_NoAlteration: - { - stringstream s; - - s << - "'G' alteration has not been set" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - case k_NoDiatonicPitch: - { - result = k_NoQuarterTonesPitch_QTP; - /* JMI - stringstream s; - - s << - "cannot convert k_NoDiatonicPitch to a quarter tones pitch" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - break; - } // switch - - return result; -} - -msrDiatonicPitchKind diatonicPitchKindFromQuarterTonesPitchKind ( - int inputLineNumber, - msrQuarterTonesPitchKind quarterTonesPitchKind) -{ - msrDiatonicPitchKind result = k_NoDiatonicPitch; - - switch (quarterTonesPitchKind) { - case kA_TripleFlat_QTP: - case kA_DoubleFlat_QTP: - case kA_SesquiFlat_QTP: - case kA_Flat_QTP: - case kA_SemiFlat_QTP: - case kA_Natural_QTP: - case kA_SemiSharp_QTP: - case kA_Sharp_QTP: - case kA_SesquiSharp_QTP: - case kA_DoubleSharp_QTP: - case kA_TripleSharp_QTP: - result = kA; - break; - - case kB_TripleFlat_QTP: - case kB_DoubleFlat_QTP: - case kB_SesquiFlat_QTP: - case kB_Flat_QTP: - case kB_SemiFlat_QTP: - case kB_Natural_QTP: - case kB_SemiSharp_QTP: - case kB_Sharp_QTP: - case kB_SesquiSharp_QTP: - case kB_DoubleSharp_QTP: - case kB_TripleSharp_QTP: - result = kB; - break; - - case kC_TripleFlat_QTP: - case kC_DoubleFlat_QTP: - case kC_SesquiFlat_QTP: - case kC_Flat_QTP: - case kC_SemiFlat_QTP: - case kC_Natural_QTP: - case kC_SemiSharp_QTP: - case kC_Sharp_QTP: - case kC_SesquiSharp_QTP: - case kC_DoubleSharp_QTP: - case kC_TripleSharp_QTP: - result = kC; - break; - - case kD_TripleFlat_QTP: - case kD_DoubleFlat_QTP: - case kD_SesquiFlat_QTP: - case kD_Flat_QTP: - case kD_SemiFlat_QTP: - case kD_Natural_QTP: - case kD_SemiSharp_QTP: - case kD_Sharp_QTP: - case kD_SesquiSharp_QTP: - case kD_DoubleSharp_QTP: - case kD_TripleSharp_QTP: - result = kD; - break; - - case kE_TripleFlat_QTP: - case kE_DoubleFlat_QTP: - case kE_SesquiFlat_QTP: - case kE_Flat_QTP: - case kE_SemiFlat_QTP: - case kE_Natural_QTP: - case kE_SemiSharp_QTP: - case kE_Sharp_QTP: - case kE_SesquiSharp_QTP: - case kE_DoubleSharp_QTP: - case kE_TripleSharp_QTP: - result = kE; - break; - - case kF_TripleFlat_QTP: - case kF_DoubleFlat_QTP: - case kF_SesquiFlat_QTP: - case kF_Flat_QTP: - case kF_SemiFlat_QTP: - case kF_Natural_QTP: - case kF_SemiSharp_QTP: - case kF_Sharp_QTP: - case kF_SesquiSharp_QTP: - case kF_DoubleSharp_QTP: - case kF_TripleSharp_QTP: - result = kF; - break; - - case kG_TripleFlat_QTP: - case kG_DoubleFlat_QTP: - case kG_SesquiFlat_QTP: - case kG_Flat_QTP: - case kG_SemiFlat_QTP: - case kG_Natural_QTP: - case kG_SemiSharp_QTP: - case kG_Sharp_QTP: - case kG_SesquiSharp_QTP: - case kG_DoubleSharp_QTP: - case kG_TripleSharp_QTP: - result = kG; - break; - - case k_Rest_QTP: - { - stringstream s; - - s << - "cannot get the diatonic pitch of a rest" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - case k_NoQuarterTonesPitch_QTP: - { - result = k_NoDiatonicPitch; - - /* JMI - stringstream s; - - s << - "cannot get the diatonic pitch of a k_NoQuarterTonesPitch_QTP" - ", line = " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - } // switch - - return result; -} - -msrQuarterTonesPitchKind quarterTonesPitchKindFromSemiTonesPitchKind ( - msrSemiTonesPitchKind semiTonesPitchKind) -{ - msrQuarterTonesPitchKind result = k_NoQuarterTonesPitch_QTP; - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - break; - - case kC_TripleFlat_STP: - result = kC_TripleFlat_QTP; - break; - case kC_DoubleFlat_STP: - result = kC_DoubleFlat_QTP; - break; - case kC_Flat_STP: - result = kC_Flat_QTP; - break; - case kC_Natural_STP: - result = kC_Natural_QTP; - break; - case kC_Sharp_STP: - result = kC_Sharp_QTP; - break; - case kC_DoubleSharp_STP: - result = kC_DoubleSharp_QTP; - break; - case kC_TripleSharp_STP: - result = kC_TripleSharp_QTP; - break; - - case kD_TripleFlat_STP: - result = kD_TripleFlat_QTP; - break; - case kD_DoubleFlat_STP: - result = kD_DoubleFlat_QTP; - break; - case kD_Flat_STP: - result = kD_Flat_QTP; - break; - case kD_Natural_STP: - result = kD_Natural_QTP; - break; - case kD_Sharp_STP: - result = kD_Sharp_QTP; - break; - case kD_DoubleSharp_STP: - result = kD_DoubleSharp_QTP; - break; - case kD_TripleSharp_STP: - result = kD_TripleSharp_QTP; - break; - - case kE_TripleFlat_STP: - result = kE_TripleFlat_QTP; - break; - case kE_DoubleFlat_STP: - result = kE_DoubleFlat_QTP; - break; - case kE_Flat_STP: - result = kE_Flat_QTP; - break; - case kE_Natural_STP: - result = kE_Natural_QTP; - break; - case kE_Sharp_STP: - result = kE_Sharp_QTP; - break; - case kE_DoubleSharp_STP: - result = kE_DoubleSharp_QTP; - break; - case kE_TripleSharp_STP: - result = kE_TripleSharp_QTP; - break; - - case kF_TripleFlat_STP: - result = kF_TripleFlat_QTP; - break; - case kF_DoubleFlat_STP: - result = kF_DoubleFlat_QTP; - break; - case kF_Flat_STP: - result = kF_Flat_QTP; - break; - case kF_Natural_STP: - result = kF_Natural_QTP; - break; - case kF_Sharp_STP: - result = kF_Sharp_QTP; - break; - case kF_DoubleSharp_STP: - result = kF_DoubleSharp_QTP; - break; - case kF_TripleSharp_STP: - result = kF_TripleSharp_QTP; - break; - - case kG_TripleFlat_STP: - result = kG_TripleFlat_QTP; - break; - case kG_DoubleFlat_STP: - result = kG_DoubleFlat_QTP; - break; - case kG_Flat_STP: - result = kG_Flat_QTP; - break; - case kG_Natural_STP: - result = kG_Natural_QTP; - break; - case kG_Sharp_STP: - result = kG_Sharp_QTP; - break; - case kG_DoubleSharp_STP: - result = kG_DoubleSharp_QTP; - break; - case kG_TripleSharp_STP: - result = kG_TripleSharp_QTP; - break; - - case kA_TripleFlat_STP: - result = kA_TripleFlat_QTP; - break; - case kA_DoubleFlat_STP: - result = kA_DoubleFlat_QTP; - break; - case kA_Flat_STP: - result = kA_Flat_QTP; - break; - case kA_Natural_STP: - result = kA_Natural_QTP; - break; - case kA_Sharp_STP: - result = kA_Sharp_QTP; - break; - case kA_DoubleSharp_STP: - result = kA_DoubleSharp_QTP; - break; - case kA_TripleSharp_STP: - result = kA_TripleSharp_QTP; - break; - - case kB_TripleFlat_STP: - result = kB_TripleFlat_QTP; - break; - case kB_DoubleFlat_STP: - result = kB_DoubleFlat_QTP; - break; - case kB_Flat_STP: - result = kB_Flat_QTP; - break; - case kB_Natural_STP: - result = kB_Natural_QTP; - break; - case kB_Sharp_STP: - result = kB_Sharp_QTP; - break; - case kB_DoubleSharp_STP: - result = kB_DoubleSharp_QTP; - break; - case kB_TripleSharp_STP: - result = kB_TripleSharp_QTP; - break; - } // switch - - return result; -} - -msrSemiTonesPitchKind semiTonesPitchKindFromQuarterTonesPitchKind ( - msrQuarterTonesPitchKind quarterTonesPitchKind) -{ - msrSemiTonesPitchKind result = k_NoSemiTonesPitch_STP; - - switch (quarterTonesPitchKind) { - case k_NoQuarterTonesPitch_QTP: - break; - - case k_Rest_QTP: - break; - - case kA_Flat_QTP: - result = kA_Flat_STP; - break; - case kA_Natural_QTP: - result = kA_Flat_STP; - break; - case kA_Sharp_QTP: - result = kA_Sharp_STP; - break; - - case kB_Flat_QTP: - result = kB_Flat_STP; - break; - case kB_Natural_QTP: - result = kB_Natural_STP; - break; - case kB_Sharp_QTP: - result = kB_Sharp_STP; - break; - - case kC_Flat_QTP: - result = kC_Flat_STP; - break; - case kC_Natural_QTP: - result = kC_Natural_STP; - break; - case kC_Sharp_QTP: - result = kC_Sharp_STP; - break; - - case kD_Flat_QTP: - result = kD_Flat_STP; - break; - case kD_Natural_QTP: - result = kD_Natural_STP; - break; - case kD_Sharp_QTP: - result = kD_Sharp_STP; - break; - - case kE_Flat_QTP: - result = kE_Flat_STP; - break; - case kE_Natural_QTP: - result = kE_Natural_STP; - break; - case kE_Sharp_QTP: - result = kE_Sharp_STP; - break; - - case kF_Flat_QTP: - result = kF_Flat_STP; - break; - case kF_Natural_QTP: - result = kF_Natural_STP; - break; - case kF_Sharp_QTP: - result = kF_Sharp_STP; - break; - - case kG_Flat_QTP: - result = kG_Flat_STP; - break; - case kG_Natural_QTP: - result = kG_Natural_STP; - break; - case kG_Sharp_QTP: - result = kG_Sharp_STP; - break; - - default: - ; - } // switch - - return result; -} - -string msrQuarterTonesPitchKindAsString ( - msrQuarterTonesPitchesLanguageKind languageKind, - msrQuarterTonesPitchKind quarterTonesPitchKind) -{ - string result; - - switch (languageKind) { - case kNederlands: - result = gNederlandsPitchNamesMap [quarterTonesPitchKind]; - break; - case kCatalan: - result = gCatalanPitchNamesMap [quarterTonesPitchKind]; - break; - case kDeutsch: - result = gDeutschPitchNamesMap [quarterTonesPitchKind]; - break; - case kEnglish: - result = gEnglishPitchNamesMap [quarterTonesPitchKind]; - break; - case kEspanol: - result = gEspanolPitchNamesMap [quarterTonesPitchKind]; - break; - case kFrancais: - result = gFrancaisPitchNamesMap [quarterTonesPitchKind]; - break; - case kItaliano: - result = gItalianoPitchNamesMap [quarterTonesPitchKind]; - break; - case kNorsk: - result = gNorskPitchNamesMap [quarterTonesPitchKind]; - break; - case kPortugues: - result = gPortuguesPitchNamesMap [quarterTonesPitchKind]; - break; - case kSuomi: - result = gSuomiPitchNamesMap [quarterTonesPitchKind]; - break; - case kSvenska: - result = gSvenskaPitchNamesMap [quarterTonesPitchKind]; - break; - case kVlaams: - result = gVlaamsPitchNamesMap [quarterTonesPitchKind]; - break; - } // switch - - return result; -} - -msrQuarterTonesPitchKind msrQuarterTonesPitchKindFromString ( - msrQuarterTonesPitchesLanguageKind languageKind, - string quarterTonesPitchName) -{ - msrQuarterTonesPitchKind result = k_NoQuarterTonesPitch_QTP; - - map *pitchNamesMapPTR; - - // select the relevant pitch names map - switch (languageKind) { - case kNederlands: - pitchNamesMapPTR = &gNederlandsPitchNamesMap; - break; - case kCatalan: - pitchNamesMapPTR = &gCatalanPitchNamesMap; - break; - case kDeutsch: - pitchNamesMapPTR = &gDeutschPitchNamesMap; - break; - case kEnglish: - pitchNamesMapPTR = &gEnglishPitchNamesMap; - break; - case kEspanol: - pitchNamesMapPTR = &gEspanolPitchNamesMap; - break; - case kFrancais: - pitchNamesMapPTR = &gFrancaisPitchNamesMap; - break; - case kItaliano: - pitchNamesMapPTR = &gItalianoPitchNamesMap; - break; - case kNorsk: - pitchNamesMapPTR = &gNorskPitchNamesMap; - break; - case kPortugues: - pitchNamesMapPTR = &gPortuguesPitchNamesMap; - break; - case kSuomi: - pitchNamesMapPTR = &gSuomiPitchNamesMap; - break; - case kSvenska: - pitchNamesMapPTR = &gSvenskaPitchNamesMap; - break; - case kVlaams: - pitchNamesMapPTR = &gVlaamsPitchNamesMap; - break; - } // switch - - // is quarterTonesPitchName present in the map? - if (gQuarterTonesPitchesLanguageKindsMap.size ()) { - map::const_iterator - iBegin = (*pitchNamesMapPTR).begin (), - iEnd = (*pitchNamesMapPTR).end (), - i = iBegin; - for ( ; ; ) { - if ((*i).second == quarterTonesPitchName) { - result = (*i).first; - break; - } - if (++i == iEnd) break; - } // for - } - - return result; -} - -msrSemiTonesPitchKind semiTonesPitchKindFromString ( - string theString) -{ - msrSemiTonesPitchKind result; - - // fetch the quarternotes pitches kind - msrQuarterTonesPitchKind - quarterTonesPitchKindFromString = - msrQuarterTonesPitchKindFromString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - theString); - - // fetch the semitones pitches kind - result = - semiTonesPitchKindFromQuarterTonesPitchKind ( - quarterTonesPitchKindFromString); - - return result; -} - -string existingQuarterTonesPitchesLanguageKinds (int namesListMaxLength) -{ - stringstream s; - - if (gQuarterTonesPitchesLanguageKindsMap.size ()) { - map::const_iterator - iBegin = gQuarterTonesPitchesLanguageKindsMap.begin (), - iEnd = gQuarterTonesPitchesLanguageKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - - } // for - } - - return s.str (); -} - -// semi tones pitches -//______________________________________________________________________________ - -string msrSemiTonesPitchKindAsString ( - msrSemiTonesPitchKind semiTonesPitchKind) -{ - string result; - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - result = "k_NoSemiTonesPitch_STP"; - break; - - case kC_TripleFlat_STP: - result = "C_TripleFlat_STP"; - break; - case kC_DoubleFlat_STP: - result = "C_DoubleFlat_STP"; - break; - case kC_Flat_STP: - result = "C_Flat_STP"; - break; - case kC_Natural_STP: - result = "C_Natural_STP"; - break; - case kC_Sharp_STP: - result = "C_Sharp_STP"; - break; - case kC_DoubleSharp_STP: - result = "C_DoubleSharp_STP"; - break; - case kC_TripleSharp_STP: - result = "C_TripleSharp_STP"; - break; - - case kD_TripleFlat_STP: - result = "D_TripleFlat_STP"; - break; - case kD_DoubleFlat_STP: - result = "D_DoubleFlat_STP"; - break; - case kD_Flat_STP: - result = "D_Flat_STP"; - break; - case kD_Natural_STP: - result = "D_Natural_STP"; - break; - case kD_Sharp_STP: - result = "D_Sharp_STP"; - break; - case kD_DoubleSharp_STP: - result = "D_DoubleSharp_STP"; - break; - case kD_TripleSharp_STP: - result = "D_TripleSharp_STP"; - break; - - case kE_TripleFlat_STP: - result = "E_TripleFlat_STP"; - break; - case kE_DoubleFlat_STP: - result = "E_DoubleFlat_STP"; - break; - case kE_Flat_STP: - result = "E_Flat_STP"; - break; - case kE_Natural_STP: - result = "E_Natural_STP"; - break; - case kE_Sharp_STP: - result = "E_Sharp_STP"; - break; - case kE_DoubleSharp_STP: - result = "E_DoubleSharp_STP"; - break; - case kE_TripleSharp_STP: - result = "E_TripleSharp_STP"; - break; - - case kF_TripleFlat_STP: - result = "F_TripleFlat_STP"; - break; - case kF_DoubleFlat_STP: - result = "F_DoubleFlat_STP"; - break; - case kF_Flat_STP: - result = "F_Flat_STP"; - break; - case kF_Natural_STP: - result = "F_Natural_STP"; - break; - case kF_Sharp_STP: - result = "F_Sharp_STP"; - break; - case kF_DoubleSharp_STP: - result = "F_DoubleSharp_STP"; - break; - case kF_TripleSharp_STP: - result = "F_TripleSharp_STP"; - break; - - case kG_TripleFlat_STP: - result = "G_TripleFlat_STP"; - break; - case kG_DoubleFlat_STP: - result = "G_DoubleFlat_STP"; - break; - case kG_Flat_STP: - result = "G_Flat_STP"; - break; - case kG_Natural_STP: - result = "G_Natural_STP"; - break; - case kG_Sharp_STP: - result = "G_Sharp_STP"; - break; - case kG_DoubleSharp_STP: - result = "G_DoubleSharp_STP"; - break; - case kG_TripleSharp_STP: - result = "G_TripleSharp_STP"; - break; - - case kA_TripleFlat_STP: - result = "A_TripleFlat_STP"; - break; - case kA_DoubleFlat_STP: - result = "A_DoubleFlat_STP"; - break; - case kA_Flat_STP: - result = "A_Flat_STP"; - break; - case kA_Natural_STP: - result = "A_Natural_STP"; - break; - case kA_Sharp_STP: - result = "A_Sharp_STP"; - break; - case kA_DoubleSharp_STP: - result = "A_DoubleSharp_STP"; - break; - case kA_TripleSharp_STP: - result = "A_TripleSharp_STP"; - break; - - case kB_TripleFlat_STP: - result = "B_TripleFlat_STP"; - break; - case kB_DoubleFlat_STP: - result = "B_DoubleFlat_STP"; - break; - case kB_Flat_STP: - result = "B_Flat_STP"; - break; - case kB_Natural_STP: - result = "B_Natural_STP"; - break; - case kB_Sharp_STP: - result = "B_Sharp_STP"; - break; - case kB_DoubleSharp_STP: - result = "B_DoubleSharp_STP"; - break; - case kB_TripleSharp_STP: - result = "B_TripleSharp_STP"; - break; - } // switch - - return result; -} - -string msrSemiTonesPitchKindAsFlatsAndSharps ( - msrQuarterTonesPitchesLanguageKind languageKind, - msrSemiTonesPitchKind semiTonesPitchKind) -{ - string result; - -/* JMI - msrDiatonicPitchKind - diatonicPitchKind = - diatonicPitchKindFromQuarterTonesPitchKind ( - inputLineNumber, - quarterTonesPitchKind); - */ - - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - result = "k_NoSemiTonesPitch_STP"; - break; - - case kC_TripleFlat_STP: - result = "C_TripleFlat_STP"; - break; - case kC_DoubleFlat_STP: - result = "C_DoubleFlat_STP"; - break; - case kC_Flat_STP: - result = "C_Flat_STP"; - break; - case kC_Natural_STP: - result = "C_Natural_STP"; - break; - case kC_Sharp_STP: - result = "C_Sharp_STP"; - break; - case kC_DoubleSharp_STP: - result = "C_DoubleSharp_STP"; - break; - case kC_TripleSharp_STP: - result = "C_TripleSharp_STP"; - break; - - case kD_TripleFlat_STP: - result = "D_TripleFlat_STP"; - break; - case kD_DoubleFlat_STP: - result = "D_DoubleFlat_STP"; - break; - case kD_Flat_STP: - result = "D_Flat_STP"; - break; - case kD_Natural_STP: - result = "D_Natural_STP"; - break; - case kD_Sharp_STP: - result = "D_Sharp_STP"; - break; - case kD_DoubleSharp_STP: - result = "D_DoubleSharp_STP"; - break; - case kD_TripleSharp_STP: - result = "D_TripleSharp_STP"; - break; - - case kE_TripleFlat_STP: - result = "E_TripleFlat_STP"; - break; - case kE_DoubleFlat_STP: - result = "E_DoubleFlat_STP"; - break; - case kE_Flat_STP: - result = "E_Flat_STP"; - break; - case kE_Natural_STP: - result = "E_Natural_STP"; - break; - case kE_Sharp_STP: - result = "E_Sharp_STP"; - break; - case kE_DoubleSharp_STP: - result = "E_DoubleSharp_STP"; - break; - case kE_TripleSharp_STP: - result = "E_TripleSharp_STP"; - break; - - case kF_TripleFlat_STP: - result = "F_TripleFlat_STP"; - break; - case kF_DoubleFlat_STP: - result = "F_DoubleFlat_STP"; - break; - case kF_Flat_STP: - result = "F_Flat_STP"; - break; - case kF_Natural_STP: - result = "F_Natural_STP"; - break; - case kF_Sharp_STP: - result = "F_Sharp_STP"; - break; - case kF_DoubleSharp_STP: - result = "F_DoubleSharp_STP"; - break; - case kF_TripleSharp_STP: - result = "F_TripleSharp_STP"; - break; - - case kG_TripleFlat_STP: - result = "G_TripleFlat_STP"; - break; - case kG_DoubleFlat_STP: - result = "G_DoubleFlat_STP"; - break; - case kG_Flat_STP: - result = "G_Flat_STP"; - break; - case kG_Natural_STP: - result = "G_Natural_STP"; - break; - case kG_Sharp_STP: - result = "G_Sharp_STP"; - break; - case kG_DoubleSharp_STP: - result = "G_DoubleSharp_STP"; - break; - case kG_TripleSharp_STP: - result = "G_TripleSharp_STP"; - break; - - case kA_TripleFlat_STP: - result = "A_TripleFlat_STP"; - break; - case kA_DoubleFlat_STP: - result = "A_DoubleFlat_STP"; - break; - case kA_Flat_STP: - result = "A_Flat_STP"; - break; - case kA_Natural_STP: - result = "A_Natural_STP"; - break; - case kA_Sharp_STP: - result = "A_Sharp_STP"; - break; - case kA_DoubleSharp_STP: - result = "A_DoubleSharp_STP"; - break; - case kA_TripleSharp_STP: - result = "A_TripleSharp_STP"; - break; - - case kB_TripleFlat_STP: - result = "B_TripleFlat_STP"; - break; - case kB_DoubleFlat_STP: - result = "B_DoubleFlat_STP"; - break; - case kB_Flat_STP: - result = "B_Flat_STP"; - break; - case kB_Natural_STP: - result = "B_Natural_STP"; - break; - case kB_Sharp_STP: - result = "B_Sharp_STP"; - break; - case kB_DoubleSharp_STP: - result = "B_DoubleSharp_STP"; - break; - case kB_TripleSharp_STP: - result = "B_TripleSharp_STP"; - break; - } // switch - - return result; -} - -msrQuarterTonesPitchKind msrSemiTonesPitchKindAsQuarterTonesPitchKind ( - msrSemiTonesPitchKind semiTonesPitchKind, - msrAlterationPreferenceKind alterationPreferenceKind) -{ - msrQuarterTonesPitchKind result = k_NoQuarterTonesPitch_QTP; - - /* JMI - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - result = k_NoQuarterTonesPitch_QTP; - break; - - case kC_Natural_STP: // kB_Sharp_STP, kD_DoubleFlat_STP - result = kC_Natural; - break; - - case kC_Sharp_STP: // kB_DoubleSharp_STP, kD_Flat_STP - switch (alterationPreferenceKind) { - case kPreferSharp: - result = kC_Sharp; - break; - case kPreferFlat: - result = kD_Flat; - break; - } // switch - break; - - case kD_Natural_STP: // kC_DoubleSharp_STP, kE_DoubleFlat_STP - result = kD_Natural; - break; - - case kD_Sharp_STP: // kE_Flat_STP - switch (alterationPreferenceKind) { - case kPreferSharp: - result = kD_Sharp; - break; - case kPreferFlat: - result = kE_Flat; - break; - } // switch - break; - - case kE_Natural_STP: // kD_DoubleSharp_STP, kF_Flat_STP - result = kE_Natural; - break; - - case kF_Natural_STP: // kE_Sharp_STP, kG_DoubleFlat_STP - result = kF_Natural; - break; - - case kF_Sharp_STP: // kE_DoubleSharp_STP, kG_Flat_STP - switch (alterationPreferenceKind) { - case kPreferSharp: - result = kF_Sharp; - break; - case kPreferFlat: - result = kG_Flat; - break; - } // switch - break; - - case kG_Natural_STP: // kF_DoubleSharp_STP, kA_DoubleFlat_STP - result = kG_Natural; - break; - - case kG_Sharp_STP: // kA_Flat_STP - switch (alterationPreferenceKind) { - case kPreferSharp: - result = kG_Sharp; - break; - case kPreferFlat: - result = kA_Flat; - break; - } // switch - break; - - case kA_Natural_STP: // kG_DoubleSharp_STP, kB_DoubleFlat_STP - result = kA_Natural; - break; - - case kA_Sharp_STP: // kB_Flat_STP - switch (alterationPreferenceKind) { - case kPreferSharp: - result = kA_Sharp; - break; - case kPreferFlat: - result = kB_Flat; - break; - } // switch - break; - - case kB_Natural_STP: // kA_DoubleSharp_STP, kC_Flat_STP - result = kB_Natural; - break; - } // switch - */ - - - /* JMI - switch (semiTonesPitchKind) { - case k_NoSemiTonesPitch_STP: - result = k_NoQuarterTonesPitch_QTP; - break; - - case kC_Natural_STP: // kB_Sharp_STP, kD_DoubleFlat_STP - result = kC_Natural_QTP; - break; - - case kC_Sharp_STP: // kB_DoubleSharp_STP, kD_Flat_STP - switch (alterationPreferenceKind) { - case kPreferFlat: - result = kD_Flat_QTP; - break; - case kPreferSharp: - result = kC_Sharp_QTP; - break; - } // switch - break; - - case kD_Natural_STP: // kC_DoubleSharp_STP, kE_DoubleFlat_STP - result = kD_Natural_QTP; - break; - - case kD_Sharp_STP: // kE_Flat_STP - switch (alterationPreferenceKind) { - case kPreferFlat: - result = kE_Flat_QTP; - break; - case kPreferSharp: - result = kD_Sharp_QTP; - break; - } // switch - break; - - case kE_Natural_STP: // kD_DoubleSharp_STP, kF_Flat_STP - result = kE_Natural_QTP; - break; - - case kF_Natural_STP: // kE_Sharp_STP, kG_DoubleFlat_STP - result = kF_Natural_QTP; - break; - - case kF_Sharp_STP: // kE_DoubleSharp_STP, kG_Flat_STP - switch (alterationPreferenceKind) { - case kPreferFlat: - result = kG_Flat_QTP; - break; - case kPreferSharp: - result = kF_Sharp_QTP; - break; - } // switch - break; - - case kG_Natural_STP: // kF_DoubleSharp_STP, kA_DoubleFlat_STP - result = kG_Natural_QTP; - break; - - case kG_Sharp_STP: // kA_Flat_STP - switch (alterationPreferenceKind) { - case kPreferFlat: - result = kA_Flat_QTP; - break; - case kPreferSharp: - result = kG_Sharp_QTP; - break; - } // switch - break; - - case kA_Natural_STP: // kG_DoubleSharp_STP, kB_DoubleFlat_STP - result = kA_Natural_QTP; - break; - - case kA_Sharp_STP: // kB_Flat_STP - switch (alterationPreferenceKind) { - case kPreferFlat: - result = kB_Flat_QTP; - break; - case kPreferSharp: - result = kA_Sharp_QTP; - break; - } // switch - break; - - case kB_Natural_STP: // kA_DoubleSharp_STP, kC_Flat_STP - result = kB_Natural_QTP; - break; - } // switch - */ - - - - return result; -} - -// enharmonies -//______________________________________________________________________________ -msrSemiTonesPitchKind enharmonicSemiTonesPitch ( - msrSemiTonesPitchKind semiTonesPitchKind, - msrAlterationPreferenceKind alterationPreferenceKind) -{ - msrSemiTonesPitchKind result = semiTonesPitchKind; - - switch (semiTonesPitchKind) { - case kC_Flat_STP: - result = kB_Natural_STP; - break; - - case kC_Natural_STP: - break; - - case kC_Sharp_STP: - result = kD_Flat_STP; - break; - case kD_Flat_STP: - result = kC_Sharp_STP; - break; - - case kD_Natural_STP: - break; - - case kD_Sharp_STP: - result = kE_Flat_STP; - break; - case kE_Flat_STP: - result = kD_Sharp_STP; - break; - - case kE_Natural_STP: - break; - - case kF_Natural_STP: - break; - - case kF_Sharp_STP: - result = kG_Flat_STP; - break; - case kG_Flat_STP: - result = kF_Sharp_STP; - break; - - case kG_Natural_STP: - break; - - case kG_Sharp_STP: - result = kA_Flat_STP; - break; - case kA_Flat_STP: - result = kG_Sharp_STP; - break; - - case kA_Natural_STP: - break; - - case kA_Sharp_STP: - result = kB_Flat_STP; - break; - case kB_Flat_STP: - result = kA_Sharp_STP; - break; - - case kB_Natural_STP: - break; - - case kB_Sharp_STP: - result = kC_Natural_STP; - break; - - default: - ; - } // switch - - return result; -} - -// length units -//______________________________________________________________________________ - -map - gMsrLengthUnitKindsMap; - -string msrLengthUnitKindAsString ( - msrLengthUnitKind lengthUnitKind) -{ - string result; - - // no CamelCase here, these strings are used in the command line options - - switch (lengthUnitKind) { - case kInchUnit: - result = "in"; - break; - case kCentimeterUnit: - result = "cm"; - break; - case kMillimeterUnit: // default value - result = "mm"; - break; - } // switch - - return result; -} - -void initializeMsrLengthUnitKindsMap () -{ - // register the LilyPond score output kinds - // -------------------------------------- - - // no CamelCase here, these strings are used in the command line options - - gMsrLengthUnitKindsMap ["in"] = kInchUnit; - gMsrLengthUnitKindsMap ["cm"] = kCentimeterUnit; - gMsrLengthUnitKindsMap ["mm"] = kMillimeterUnit; -} - -string existingMsrLengthUnitKinds (int namesListMaxLength) -{ - stringstream s; - - if (gMsrLengthUnitKindsMap.size ()) { - map::const_iterator - iBegin = gMsrLengthUnitKindsMap.begin (), - iEnd = gMsrLengthUnitKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -// lengths -//______________________________________________________________________________ -S_msrLength msrLength::create ( - msrLengthUnitKind lengthUnitKind, - float lengthValue) -{ - msrLength * o = - new msrLength ( - lengthUnitKind, - lengthValue); - assert(o!=0); - - return o; -} - -msrLength::msrLength ( - msrLengthUnitKind lengthUnitKind, - float lengthValue) -{ - fLengthUnitKind = lengthUnitKind; - fLengthValue = lengthValue; -} - -msrLength::msrLength () -{ - fLengthUnitKind = kMillimeterUnit; - fLengthValue = 0.0; -} - -msrLength::~msrLength () -{} - -void msrLength::convertToLengthUnit ( - msrLengthUnitKind lengthUnitKind) -{ - if (fLengthUnitKind != lengthUnitKind) { - switch (lengthUnitKind) { - case kInchUnit: - switch (fLengthUnitKind) { - case kInchUnit: - break; - case kCentimeterUnit: - fLengthValue /= 2.54; - break; - case kMillimeterUnit: - fLengthValue /= 25.4; - break; - } // switch - break; - - case kCentimeterUnit: - switch (fLengthUnitKind) { - case kInchUnit: - fLengthValue *= 2.54; - break; - case kCentimeterUnit: - break; - case kMillimeterUnit: - fLengthValue /= 10; - break; - } // switch - break; - - case kMillimeterUnit: - switch (fLengthUnitKind) { - case kInchUnit: - fLengthValue *= 25.4; - break; - case kCentimeterUnit: - fLengthValue *= 10; - break; - case kMillimeterUnit: - break; - } // switch - break; - } // switch - - fLengthUnitKind = lengthUnitKind; - } -} - -string msrLength::asString () const -{ - stringstream s; - - s << - "'" << - setprecision (4) << - fLengthValue << - " " << - msrLengthUnitKindAsString (fLengthUnitKind) << - "'"; - - return s.str (); -} - -void msrLength::print (ostream& os) const -{ - os << - asString (); // JMI -}; - -ostream& operator<< (ostream& os, const S_msrLength& elt) -{ - elt->print (os); - return os; -} - -// margins types -//______________________________________________________________________________ - -map - gMsrMarginTypeKindsMap; - -string msrMarginTypeKindAsString ( - msrMarginTypeKind marginTypeKind) -{ - string result; - - // no CamelCase here, these strings are used in the command line options - - switch (marginTypeKind) { - case kOddMargin: - result = "odd"; - break; - case kEvenMargin: - result = "even"; - break; - case kBothMargins: // default value - result = "both"; - break; - } // switch - - return result; -} - -void initializeMsrMarginTypeKindsMap () -{ - // register the LilyPond score output kinds - // -------------------------------------- - - // no CamelCase here, these strings are used in the command line options - - gMsrMarginTypeKindsMap ["odd"] = kOddMargin; - gMsrMarginTypeKindsMap ["even"] = kEvenMargin; - gMsrMarginTypeKindsMap ["both"] = kBothMargins; -} - -string existingMsrMarginTypeKinds (int namesListMaxLength) -{ - stringstream s; - - if (gMsrMarginTypeKindsMap.size ()) { - map::const_iterator - iBegin = gMsrMarginTypeKindsMap.begin (), - iEnd = gMsrMarginTypeKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -// margins -//______________________________________________________________________________ -S_msrMargin msrMargin::create ( - msrMarginTypeKind marginTypeKind, - msrLength marginLength) -{ - msrMargin * o = - new msrMargin ( - marginTypeKind, - marginLength); - assert(o!=0); - - return o; -} - -msrMargin::msrMargin ( - msrMarginTypeKind marginTypeKind, - msrLength marginLength) -{ - fMarginTypeKind = marginTypeKind; - fMarginLength = marginLength; -} - -msrMargin::~msrMargin () -{} - -string msrMargin::asString () const -{ - stringstream s; - - s << - "'" << - setprecision (4) << - fMarginLength.asString () << - " " << - msrMarginTypeKindAsString (fMarginTypeKind) << - "'"; - - return s.str (); -} - -void msrMargin::print (ostream& os) const -{ - os << - asString (); -}; - -ostream& operator<< (ostream& os, const S_msrMargin& elt) -{ - elt->print (os); - return os; -} - -// font size -//______________________________________________________________________________ -S_msrFontSize msrFontSize::create ( - msrFontSizeKind fontSizeKind) -{ - msrFontSize * o = - new msrFontSize ( - fontSizeKind); - assert(o!=0); - - return o; -} - -S_msrFontSize msrFontSize::create ( - float numericFontSize) -{ - msrFontSize * o = - new msrFontSize ( - numericFontSize); - assert(o!=0); - - return o; -} - -msrFontSize::msrFontSize ( - msrFontSizeKind fontSizeKind) -{ - fFontSizeKind = fontSizeKind; -} - -msrFontSize::msrFontSize ( - float fontNumericSize) -{ - fFontSizeKind = kFontSizeNumeric; - fFontNumericSize = fontNumericSize; -} - -msrFontSize::~msrFontSize () -{} - -string msrFontSize::fontSizeKindAsString ( - msrFontSize::msrFontSizeKind fontSizeKind) -{ - string result; - - switch (fontSizeKind) { - case msrFontSize::kFontSizeNone: - result = "fontSizeNone"; - break; - case msrFontSize::kFontSizeXXSmall: - result = "fontSizeXXSmall"; - break; - case msrFontSize::kFontSizeXSmall: - result = "fontSizeXSmall"; - break; - case msrFontSize::kFontSizeSmall: - result = "fontSizeSmall"; - break; - case msrFontSize::kFontSizeMedium: - result = "fontSizeMedium"; - break; - case msrFontSize::kFontSizeLarge: - result = "fontSizeLarge"; - break; - case msrFontSize::kFontSizeXLarge: - result = "fontSizeXLarge"; - break; - case msrFontSize::kFontSizeXXLarge: - result = "fontSizeXXLarge"; - break; - case msrFontSize::kFontSizeNumeric: - result = "fontSizeNumeric"; - break; - } // switch - - return result; -} - -string msrFontSize::fontSizeKindAsString () const -{ - return - fontSizeKindAsString (fFontSizeKind); -} - -string msrFontSize::fontSizeAsString () const -{ - string result; - - switch (fFontSizeKind) { - case msrFontSize::kFontSizeNone: - case msrFontSize::kFontSizeXXSmall: - case msrFontSize::kFontSizeXSmall: - case msrFontSize::kFontSizeSmall: - case msrFontSize::kFontSizeMedium: - case msrFontSize::kFontSizeLarge: - case msrFontSize::kFontSizeXLarge: - case msrFontSize::kFontSizeXXLarge: - result = fontSizeKindAsString (fFontSizeKind); - break; - - case msrFontSize::kFontSizeNumeric: - result = - to_string (fFontNumericSize); - break; - } // switch - - return result; -} - -float msrFontSize::getFontNumericSize () -{ - float result = 12; // JMI - - switch (fFontSizeKind) { - case msrFontSize::kFontSizeNone: - case msrFontSize::kFontSizeXXSmall: - case msrFontSize::kFontSizeXSmall: - case msrFontSize::kFontSizeSmall: - case msrFontSize::kFontSizeMedium: - case msrFontSize::kFontSizeLarge: - case msrFontSize::kFontSizeXLarge: - case msrFontSize::kFontSizeXXLarge: - { - stringstream s; - - s << - "attempting to get font numeric size for a " << - fontSizeKindAsString (fFontSizeKind); - - msrInternalError ( - gOahOah->fInputSourceName, - K_NO_INPUT_LINE_NUMBER, // JMI - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrFontSize::kFontSizeNumeric: - result = fFontNumericSize; - break; - } // switch - - return result; -} - -void msrFontSize::print (ostream& os) const -{ - switch (fFontSizeKind) { - case msrFontSize::kFontSizeNone: - case msrFontSize::kFontSizeXXSmall: - case msrFontSize::kFontSizeXSmall: - case msrFontSize::kFontSizeSmall: - case msrFontSize::kFontSizeMedium: - case msrFontSize::kFontSizeLarge: - case msrFontSize::kFontSizeXLarge: - case msrFontSize::kFontSizeXXLarge: - os << - msrFontSize::fontSizeKindAsString (fFontSizeKind); - break; - - case msrFontSize::kFontSizeNumeric: - os << - fFontNumericSize; - break; - } // switch -} - -// font style -//______________________________________________________________________________ -msrFontStyleKind msrFontStyleKindFromString ( - int inputLineNumber, - string fontStyleString) -{ - msrFontStyleKind result = kFontStyleNone; // default value - - if (fontStyleString == "normal") - result = kFontStyleNormal; - else if (fontStyleString == "italic") - result = KFontStyleItalic; - else { - if (fontStyleString.size ()) { - stringstream s; - - s << - "style value " << fontStyleString << - " should be 'normal' or 'italic'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrFontStyleKindAsString ( - msrFontStyleKind fontStyleKind) -{ - string result; - - switch (fontStyleKind) { - case kFontStyleNone: - result = "fontStyleNone"; - break; - case kFontStyleNormal: - result = "fontStyleNormal"; - break; - case KFontStyleItalic: - result = "fontStyleItalic"; - break; - } // switch - - return result; -} - -// font weight -//______________________________________________________________________________ -msrFontWeightKind msrFontWeightKindFromString ( - int inputLineNumber, - string fontWeightString) -{ - msrFontWeightKind result = kFontWeightNone; // default value - - if (fontWeightString == "normal") - result = kFontWeightNormal; - else if (fontWeightString == "bold") - result = kFontWeightBold; - else { - if (fontWeightString.size ()) { - stringstream s; - - s << - "font weight value " << fontWeightString << - " should be 'normal' or 'bold'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrFontWeightKindAsString ( - msrFontWeightKind fontWeightKind) -{ - string result; - - switch (fontWeightKind) { - case kFontWeightNone: - result = "fontWeightNone"; - break; - case kFontWeightNormal: - result = "fontWeightNormal"; - break; - case kFontWeightBold: - result = "fontWeightBold"; - break; - } // switch - - return result; -} - -// alignement -//______________________________________________________________________________ -msrJustifyKind msrJustifyKindFromString ( - int inputLineNumber, - string justifyString) -{ - msrJustifyKind result = kJustifyNone; // default value - - if (justifyString == "left") - result = kJustifyLeft; - else if (justifyString == "center") - result = kJustifyCenter; - else if (justifyString == "right") - result = kJustifyRight; - else { - if (justifyString.size ()) { - stringstream s; - - s << - "justify value " << justifyString << - " should be 'left', 'center' or 'right'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrJustifyKindAsString ( - msrJustifyKind justifyKind) -{ - string result; - - switch (justifyKind) { - case kJustifyNone: - result = "justifyNone"; - break; - case kJustifyLeft: - result = "justifyLeft"; - break; - case kJustifyCenter: - result = "justifyCenter"; - break; - case kJustifyRight: - result = "justifyRight"; - break; - } // switch - - return result; -} - -msrHorizontalAlignmentKind msrHorizontalAlignmentKindFromString ( - int inputLineNumber, - string horizontalAlignmentString) -{ - msrHorizontalAlignmentKind - result = kHorizontalAlignmentNone; // default value - - if (horizontalAlignmentString == "left") - result = kHorizontalAlignmentLeft; - else if (horizontalAlignmentString == "center") - result = kHorizontalAlignmentCenter; - else if (horizontalAlignmentString == "right") - result = kHorizontalAlignmentRight; - else { - if (horizontalAlignmentString.size ()) { - stringstream s; - - s << - "halign value " << horizontalAlignmentString << - " should be 'left', 'center' or 'right'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrHorizontalAlignmentKindAsString ( - msrHorizontalAlignmentKind horizontalAlignmentKind) -{ - string result; - - switch (horizontalAlignmentKind) { - case kHorizontalAlignmentNone: - result = "horizontalAlignmentNone"; - break; - case kHorizontalAlignmentLeft: - result = "horizontalAlignmentLeft"; - break; - case kHorizontalAlignmentCenter: - result = "horizontalAlignmentCenter"; - break; - case kHorizontalAlignmentRight: - result = "horizontalAlignmentRight"; - break; - } // switch - - return result; -} - -msrVerticalAlignmentKind msrVerticalAlignmentKindFromString ( - int inputLineNumber, - string verticalAlignmentString) -{ - msrVerticalAlignmentKind - result = kVerticalAlignmentNone; // default value - - if (verticalAlignmentString == "top") - result = kVerticalAlignmentTop; - else if (verticalAlignmentString == "middle") - result = kVerticalAlignmentMiddle; - else if (verticalAlignmentString == "bottom") - result = kVerticalAlignmentBottom; - else { - if (verticalAlignmentString.size ()) { - stringstream s; - - s << - "valign value " << verticalAlignmentString << - " should be 'top', 'middle' or 'bottom'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrVerticalAlignmentKindAsString ( - msrVerticalAlignmentKind verticalAlignmentKind) -{ - string result; - - switch (verticalAlignmentKind) { - case kVerticalAlignmentNone: - result = "verticalAlignmentNone"; - break; - case kVerticalAlignmentTop: - result = "verticalAlignmentTop"; - break; - case kVerticalAlignmentMiddle: - result = "verticalAlignmentMiddle"; - break; - case kVerticalAlignmentBottom: - result = "verticalAlignmentBottom"; - break; - } // switch - - return result; -} - -// direction -//______________________________________________________________________________ -string msrDirectionKindAsString ( - msrDirectionKind directionKind) -{ - string result; - - switch (directionKind) { - case kDirectionNone: - result = "directionNone"; - break; - - case kDirectionUp: - result = "directionUp"; - break; - case kDirectionDown: - result = "directionDown"; - break; - } // switch - - return result; -} - - -// print object -//______________________________________________________________________________ -msrPrintObjectKind msrPrintObjectKindFromString ( - int inputLineNumber, - string printObjectString) -{ - msrPrintObjectKind result = kPrintObjectNone; // default value - - if (printObjectString == "yes") - result = kPrintObjectYes; - else if (printObjectString == "no") - result = kPrintObjectNo; - else { - if (printObjectString.size ()) { - stringstream s; - - s << - "printObject \"" << printObjectString << - "\" should be 'above' or 'below'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrPrintObjectKindAsString ( - msrPrintObjectKind printObjectKind) -{ - string result; - - switch (printObjectKind) { - case msrPrintObjectKind::kPrintObjectNone: - result = "printObjectNone"; - break; - case msrPrintObjectKind::kPrintObjectYes: - result = "printObjectAbove"; - break; - case msrPrintObjectKind::kPrintObjectNo: - result = "printObjectBelow"; - break; - } // switch - - return result; -} - -// placement -//______________________________________________________________________________ -msrPlacementKind msrPlacementKindFromString ( - int inputLineNumber, - string placementString) -{ - msrPlacementKind result = kPlacementNone; // default value - - if (placementString == "above") - result = kPlacementAbove; - else if (placementString == "below") - result = kPlacementBelow; - else { - if (placementString.size ()) { - stringstream s; - - s << - "placement \"" << placementString << - "\" should be 'above' or 'below'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrPlacementKindAsString ( - msrPlacementKind placementKind) -{ - string result; - - switch (placementKind) { - case msrPlacementKind::kPlacementNone: - result = "placementNone"; - break; - case msrPlacementKind::kPlacementAbove: - result = "placementAbove"; - break; - case msrPlacementKind::kPlacementBelow: - result = "placementBelow"; - break; - } // switch - - return result; -} - -// measure style -//______________________________________________________________________________ -msrUseDotsKind msrUseDotsFromString ( - int inputLineNumber, - string useDotsString) -{ - msrUseDotsKind result = kUseDotsNo; // default value - - if (useDotsString == "yes") - result = kUseDotsYes; - else if (useDotsString == "no") - result = kUseDotsNo; - else { - if (useDotsString.size ()) { - stringstream s; - - s << - "use-dots \"" << useDotsString << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - return result; -} - -string msrSlashTypeKindAsString ( - msrSlashTypeKind slashTypeKind) -{ - string result; - - switch (slashTypeKind) { - case k_NoSlashType: - result = "noSlashType"; - break; - case kSlashTypeStart: - result = "slashTypeStart"; - break; - case kSlashTypeStop: - result = "slashTypeStop"; - break; - } // switch - - return result; -} - -string msrUseDotsKindAsString ( - msrUseDotsKind useDotsKind) -{ - string result; - - switch (useDotsKind) { - case k_NoUseDots: - result = "noUseDots"; - break; - case kUseDotsYes: - result = "useDotsYes"; - break; - case kUseDotsNo: - result = "useDotsNo"; - break; - } // switch - - return result; -} - -string msrSlashUseStemsKindAsString ( - msrSlashUseStemsKind slashUseStemsKind) -{ - string result; - - switch (slashUseStemsKind) { - case k_NoSlashUseStems: - result = "noSlashUseStems"; - break; - case kSlashUseStemsYes: - result = "slashUseStemsYes"; - break; - case kSlashUseStemsNo: - result = "slashUseStemsNo"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -string msrLineTypeKindAsString ( - msrLineTypeKind lineTypeKind) -{ - string result; - - switch (lineTypeKind) { - case kLineTypeSolid: - result = "lineTypeSolid"; - break; - case kLineTypeDashed: - result = "lineTypeDashed"; - break; - case kLineTypeDotted: - result = "lineTypeDotted"; - break; - case kLineTypeWavy: - result = "lineTypeWavy"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -string msrTremoloTypeKindAsString ( - msrTremoloTypeKind tremoloTypeKind) -{ - string result; - - switch (tremoloTypeKind) { - case k_NoTremoloType: - result = "noTremoloType"; - break; - case kTremoloTypeSingle: - result = "tremoloTypeSingle"; - break; - case kTremoloTypeStart: - result = "tremoloTypeStart"; - break; - case kTremoloTypeStop: - result = "tremoloTypeStop"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -string msrTechnicalTypeKindAsString ( - msrTechnicalTypeKind technicalTypeKind) -{ - string result; - - switch (technicalTypeKind) { - case kTechnicalTypeStart: - result = "technicalTypeStart"; - break; - case kTechnicalTypeStop: - result = "technicalTypeStop"; - break; - case k_NoTechnicalType: - result = "noTechnicalType"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -string msrSpannerTypeKindAsString ( - msrSpannerTypeKind spannerTypeKind) -{ - string result; - - switch (spannerTypeKind) { - case kSpannerTypeStart: - result = "spannerTypeStart"; - break; - case kSpannerTypeStop: - result = "spannerTypeStop"; - break; - case kSpannerTypeContinue: - result = "spannerTypeContinue"; - break; - case k_NoSpannerType: - result = "noSpannerType"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -S_msrChordInterval msrChordInterval::create ( -// JMI int inputLineNumber, - msrIntervalKind chordIntervalIntervalKind, - int chordIntervalRelativeOctave) -{ - msrChordInterval* o = - new msrChordInterval ( - // inputLineNumber, - // chordIntervalNumber, - chordIntervalIntervalKind, - chordIntervalRelativeOctave); - assert(o!=0); - - return o; -} - -msrChordInterval::msrChordInterval ( -// JMI int inputLineNumber, - msrIntervalKind chordIntervalIntervalKind, - int chordIntervalRelativeOctave) - // JMI : msrElement (inputLineNumber) -{ - fChordIntervalIntervalKind = chordIntervalIntervalKind; - - fChordIntervalRelativeOctave = chordIntervalRelativeOctave; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> Creating chord item '" << - chordIntervalAsString () << - "'" << - endl; - } -#endif -} - -msrChordInterval::~msrChordInterval () -{} - -S_msrChordInterval msrChordInterval::createChordIntervalNewbornClone () -{ - S_msrChordInterval - newbornClone = - msrChordInterval::create ( - fChordIntervalIntervalKind, - fChordIntervalRelativeOctave); - - return newbornClone; -} - -string msrChordInterval::chordIntervalAsString () const -{ - stringstream s; - - const int fieldWidth = 19; - - s << left << - "ChordInterval" << - ": " << - setw (fieldWidth) << - msrIntervalKindAsString (fChordIntervalIntervalKind) << - "chordIntervalRelativeOctave: " << fChordIntervalRelativeOctave; - - return s.str (); -} - -string msrChordInterval::chordIntervalAsShortString () const -{ - return - msrIntervalKindAsString (fChordIntervalIntervalKind); -} - - -void msrChordInterval::normalizeInterval () -{ - // bring the interval below an octave - if (fChordIntervalIntervalKind > kAugmentedSeventh) { - fChordIntervalIntervalKind = - msrIntervalKind ( - fChordIntervalIntervalKind - kAugmentedSeventh); - - fChordIntervalRelativeOctave += 1; - } -} - -void msrChordInterval::deNormalizeInterval () -{ - // bring the interval above the octave if its relative octave is 1 - if ( - fChordIntervalRelativeOctave == 1 - && - fChordIntervalIntervalKind <= kAugmentedSeventh) { - fChordIntervalIntervalKind = - msrIntervalKind ( - fChordIntervalIntervalKind + kAugmentedSeventh); - - fChordIntervalRelativeOctave -= 1; - } -} - -S_msrChordInterval msrChordInterval::intervalDifference ( - S_msrChordInterval otherChordInterval) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceExtraChords) { - gLogOstream << - endl << - "--> computing intervalDifference betwwen '" << - asShortString () << - "' and '" << - otherChordInterval->asShortString () << - "'" << - endl; - } -#endif - - msrIntervalKind resultIntervalKind = k_NoIntervalKind; - - S_msrChordInterval - operand1 = - this->createChordIntervalNewbornClone (), - operand2 = - otherChordInterval->createChordIntervalNewbornClone (); - - // normalize both intervals - operand1-> - normalizeInterval (); - operand2-> - normalizeInterval (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceExtraChords) { - gLogOstream << - "--> normalized operands are '" << - operand1->asShortString () << - "' and '" << - operand2->asShortString () << - "'" << - endl; - } -#endif - - // fetch the relative octaves - int - relativeOctave1 = operand1->fChordIntervalRelativeOctave, - relativeOctave2 = operand2->fChordIntervalRelativeOctave; - - // fetch the interval kind - msrIntervalKind - intervalKind1 = - operand1->fChordIntervalIntervalKind, - intervalKind2 = - operand2->fChordIntervalIntervalKind; - - // order the operands so that - // relativeOctave1 is greater or equal to relativeOctave2 - bool permuteRelativeOctaves = false; - - if (relativeOctave1 < relativeOctave2) { - int saveRelativeOctave1 = relativeOctave1; - - relativeOctave1 = relativeOctave2; - relativeOctave2 = saveRelativeOctave1; - - permuteRelativeOctaves = true; - } - - // order the intervals so that - // intervalKind1 is greater or equal to intervalKind2 - // according to the enum type - bool invertInterval = false; - - if (intervalKind1 < intervalKind2) { - msrIntervalKind saveIntervalKind1 = intervalKind1; - - intervalKind1 = intervalKind2; - intervalKind2 = saveIntervalKind1; - - invertInterval = true; - } - - // compute the resulting relative octaves difference - int - resultRelativeOctave = - relativeOctave1 - relativeOctave2; - if (invertInterval) { - resultRelativeOctave--; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceExtraChords) { - gLogOstream << - "--> permuteRelativeOctaves = " << - booleanAsString (permuteRelativeOctaves) << - ", invertInterval = " << - booleanAsString (invertInterval) << - ", resultRelativeOctave = " << - resultRelativeOctave << - endl; - } -#endif - - // compute resulting interval Kind - switch (intervalKind1) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kPerfectUnison: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedUnison: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kAugmentedUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - - case kDiminishedSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - // JMI resultIntervalKind = kDiminishedSecond; - break; - case kAugmentedUnison: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kDiminishedSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kMajorSecond; - break; - case kPerfectUnison: - resultIntervalKind = kMinorSecond; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedSecond; - break; - case kDiminishedSecond: - resultIntervalKind = kAugmentedUnison; - break; - case kMinorSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedSecond; - break; - case kPerfectUnison: - resultIntervalKind = kMajorSecond; - break; - case kAugmentedUnison: - resultIntervalKind = kMinorSecond; - break; - case kDiminishedSecond: - resultIntervalKind = kDiminishedSecond; - break; - case kMinorSecond: - resultIntervalKind = kAugmentedUnison; - break; - case kMajorSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - // JMI resultIntervalKind = kAugmentedSecond; - break; - case kAugmentedUnison: - // JMI resultIntervalKind = kMajorSecond; - break; - case kDiminishedSecond: - resultIntervalKind = kAugmentedSecond; - break; - case kMinorSecond: - // JMI resultIntervalKind = kMajorSecond; - break; - case kMajorSecond: - resultIntervalKind = kAugmentedUnison; - break; - case kAugmentedSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - - case kDiminishedThird: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kDiminishedThird; - break; - case kAugmentedUnison: - // JMI resultIntervalKind = kDiminishedOctave; - break; - case kDiminishedSecond: - resultIntervalKind = kAugmentedSecond; - break; - case kMinorSecond: - resultIntervalKind = kMinorSecond; - break; - case kMajorSecond: - resultIntervalKind = kDiminishedSecond; - break; - case kAugmentedSecond: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kDiminishedThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorThird: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kMajorThird; - break; - case kPerfectUnison: - resultIntervalKind = kMinorThird; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedThird; - break; - case kDiminishedSecond: - resultIntervalKind = kAugmentedSecond; - break; - case kMinorSecond: - resultIntervalKind = kMajorSecond; - break; - case kMajorSecond: - resultIntervalKind = kMinorSecond; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSecond; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedUnison; - break; - case kMinorThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorThird: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedThird; - break; - case kPerfectUnison: - resultIntervalKind = kMajorThird; - break; - case kAugmentedUnison: - resultIntervalKind = kMinorThird; - break; - case kDiminishedSecond: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - resultIntervalKind = kAugmentedSecond; - break; - case kMajorSecond: - resultIntervalKind = kMajorSecond; - break; - case kAugmentedSecond: - resultIntervalKind = kMinorSecond; - break; - case kDiminishedThird: - // JMI resultIntervalKind = kMajorSecond; - break; - case kMinorThird: - resultIntervalKind = kAugmentedUnison; - break; - case kMajorThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedThird: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kAugmentedThird; - break; - case kAugmentedUnison: - resultIntervalKind = kMajorThird; - break; - case kDiminishedSecond: - // resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - // JMI resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kDiminishedSecond; - break; - case kAugmentedSecond: - resultIntervalKind = kMajorSecond; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSecond; - break; - case kMinorThird: - resultIntervalKind = kMajorSecond; - break; - case kMajorThird: - resultIntervalKind = kAugmentedUnison; - break; - case kAugmentedThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - - case kDiminishedFourth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kPerfectFourth; - break; - case kPerfectUnison: - resultIntervalKind = kDiminishedFourth; - break; - case kAugmentedUnison: - // JMI resultIntervalKind = kPerfectFourth; - break; - case kDiminishedSecond: - resultIntervalKind = kMajorThird; - break; - case kMinorSecond: - resultIntervalKind = kMinorThird; - break; - case kMajorSecond: - resultIntervalKind = kAugmentedThird; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSecond; - break; - case kMinorThird: - resultIntervalKind = kMinorSecond; - break; - case kMajorThird: - resultIntervalKind = kDiminishedSecond; - break; - case kAugmentedThird: - resultIntervalKind = kAugmentedUnison; - break; - case kDiminishedFourth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kPerfectFourth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedFourth; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectFourth; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedFourth; - break; - case kDiminishedSecond: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - resultIntervalKind = kMajorThird; - break; - case kMajorSecond: - resultIntervalKind = kMinorThird; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedThird; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSecond; - break; - case kMinorThird: - resultIntervalKind = kMajorSecond; - break; - case kMajorThird: - resultIntervalKind = kMinorSecond; - break; - case kAugmentedThird: - resultIntervalKind = kDiminishedSecond; - break; - case kDiminishedFourth: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectFourth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedFourth: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kAugmentedFourth; - break; - case kAugmentedUnison: - resultIntervalKind = kPerfectFourth; - break; - case kDiminishedSecond: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - resultIntervalKind = kAugmentedThird; - break; - case kMajorSecond: - resultIntervalKind = kMajorThird; - break; - case kAugmentedSecond: - resultIntervalKind = kMinorThird; - break; - case kDiminishedThird: - // JMI resultIntervalKind = kMinorThird; - break; - case kMinorThird: - resultIntervalKind = kAugmentedSecond; - break; - case kMajorThird: - resultIntervalKind = kMajorSecond; - break; - case kAugmentedThird: - resultIntervalKind = kMinorSecond; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kAugmentedUnison; - break; - case kAugmentedFourth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - - case kDiminishedFifth: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kDiminishedFifth; - break; - case kAugmentedUnison: - // JMI resultIntervalKind = kDiminishedOctave; - break; - case kDiminishedSecond: - resultIntervalKind = kAugmentedFourth; - break; - case kMinorSecond: - resultIntervalKind = kPerfectFourth; - break; - case kMajorSecond: - resultIntervalKind = kDiminishedFourth; - break; - case kAugmentedSecond: - // JMI resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kMajorThird; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kDiminishedThird; - break; - case kAugmentedThird: - // JMI resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMajorSecond; - break; - case kPerfectFourth: - resultIntervalKind = kDiminishedSecond; - break; - case kAugmentedFourth: - // JMI resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kPerfectFifth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedFifth; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectFifth; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedFifth; - break; - case kDiminishedSecond: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - resultIntervalKind = kAugmentedFourth; - break; - case kMajorSecond: - resultIntervalKind = kPerfectFourth; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedFourth; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedThird; - break; - case kMinorThird: - resultIntervalKind = kMajorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kDiminishedThird; - break; - case kDiminishedFourth: - resultIntervalKind = kAugmentedSecond; - break; - case kPerfectFourth: - resultIntervalKind = kMajorSecond; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorSecond; - break; - case kDiminishedFifth: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectFifth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedFifth: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kAugmentedFifth; - break; - case kAugmentedUnison: - resultIntervalKind = kPerfectFifth; - break; - case kDiminishedSecond: - resultIntervalKind = kDiminishedFifth; - break; - case kMinorSecond: - // JMI resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kAugmentedFifth; - break; - case kAugmentedSecond: - resultIntervalKind = kPerfectFifth; - break; - case kDiminishedThird: - // JMI resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kAugmentedThird; - break; - case kMajorThird: - resultIntervalKind = kMajorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - // JMI resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kAugmentedSecond; - break; - case kAugmentedFourth: - resultIntervalKind = kMajorSecond; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kAugmentedUnison; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - - case kDiminishedSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kMinorSixth; - break; - case kPerfectUnison: - resultIntervalKind = kDiminishedSixth; - break; - case kAugmentedUnison: - // JMI resultIntervalKind = kMinorSixth; - break; - case kDiminishedSecond: - resultIntervalKind = kMajorSecond; - break; - case kMinorSecond: - resultIntervalKind = kAugmentedSecond; - break; - case kMajorSecond: - // JMI resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kPerfectFourth; - break; - case kMinorThird: - resultIntervalKind = kAugmentedFourth; - break; - case kMajorThird: - // JMI resultIntervalKind = kDiminishedThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMajorThird; - break; - case kPerfectFourth: - resultIntervalKind = kAugmentedThird; - break; - case kAugmentedFourth: - // JMI resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMajorSecond; - break; - case kPerfectFifth: - resultIntervalKind = kAugmentedSecond; - break; - case kAugmentedFifth: - resultIntervalKind = kAugmentedUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kMajorSixth; - break; - case kPerfectUnison: - resultIntervalKind = kMinorSixth; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedSixth; - break; - case kDiminishedSecond: - resultIntervalKind = kAugmentedFifth; - break; - case kMinorSecond: - resultIntervalKind = kPerfectFifth; - break; - case kMajorSecond: - resultIntervalKind = kDiminishedFifth; - break; - case kAugmentedSecond: - // JMI resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedFourth; - break; - case kMinorThird: - resultIntervalKind = kPerfectFourth; - break; - case kMajorThird: - resultIntervalKind = kDiminishedFourth; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMajorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kDiminishedThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMajorSecond; - break; - case kPerfectFifth: - resultIntervalKind = kMinorSecond; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kAugmentedUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedSixth; - break; - case kPerfectUnison: - resultIntervalKind = kMajorSixth; - break; - case kAugmentedUnison: - resultIntervalKind = kMinorSixth; - break; - case kDiminishedSecond: - resultIntervalKind = kDiminishedSixth; - break; - case kMinorSecond: - resultIntervalKind = kAugmentedFifth; - break; - case kMajorSecond: - resultIntervalKind = kPerfectFifth; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedFifth; - break; - case kDiminishedThird: - // JMI resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kAugmentedFourth; - break; - case kMajorThird: - resultIntervalKind = kPerfectFourth; - break; - case kAugmentedThird: - resultIntervalKind = kDiminishedFourth; - break; - case kDiminishedFourth: - resultIntervalKind = kAugmentedThird; - break; - case kPerfectFourth: - resultIntervalKind = kMajorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kAugmentedSecond; - break; - case kPerfectFifth: - resultIntervalKind = kMajorSecond; - break; - case kAugmentedFifth: - resultIntervalKind = kDiminishedSecond; - break; - case kDiminishedSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kAugmentedUnison; - break; - case kMajorSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - // resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kAugmentedSixth; - break; - case kAugmentedUnison: - resultIntervalKind = kMajorSixth; - break; - case kDiminishedSecond: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - // JMI resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kAugmentedFifth; - break; - case kAugmentedSecond: - resultIntervalKind = kPerfectFifth; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kPerfectFourth; - break; - case kDiminishedFourth: - // JMI resultIntervalKind = kDiminishedFifth; - break; - case kPerfectFourth: - resultIntervalKind = kAugmentedThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMajorThird; - break; - case kDiminishedFifth: - // JMI resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kAugmentedSecond; - break; - case kAugmentedFifth: - resultIntervalKind = kMajorSecond; - break; - case kDiminishedSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kAugmentedUnison; - break; - case kAugmentedSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - - case kDiminishedSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kMinorSeventh; - break; - case kPerfectUnison: - resultIntervalKind = kDiminishedSeventh; - break; - case kAugmentedUnison: - // JMI resultIntervalKind = kDiminishedOctave; - break; - case kDiminishedSecond: - resultIntervalKind = kMajorSixth; - break; - case kMinorSecond: - resultIntervalKind = kMinorSixth; - break; - case kMajorSecond: - resultIntervalKind = kDiminishedSixth; - break; - case kAugmentedSecond: - // JMI resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kPerfectFifth; - break; - case kMinorThird: - resultIntervalKind = kDiminishedFifth; - break; - case kMajorThird: - // resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kPerfectFourth; - break; - case kPerfectFourth: - resultIntervalKind = kDiminishedFourth; - break; - case kAugmentedFourth: - // JMI resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMajorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kDiminishedThird; - break; - case kDiminishedSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kAugmentedSecond; - break; - case kAugmentedSixth: - resultIntervalKind = kMajorSecond; - break; - case kDiminishedSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kMajorSeventh; - break; - case kPerfectUnison: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedSecond: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - resultIntervalKind = kMajorSixth; - break; - case kMajorSecond: - resultIntervalKind = kMinorSixth; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSixth; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedFifth; - break; - case kMinorThird: - resultIntervalKind = kPerfectFifth; - break; - case kMajorThird: - resultIntervalKind = kDiminishedFifth; - break; - case kAugmentedThird: - // JMI resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kAugmentedFourth; - break; - case kPerfectFourth: - resultIntervalKind = kPerfectFourth; - break; - case kAugmentedFourth: - resultIntervalKind = kDiminishedFourth; - break; - case kDiminishedFifth: - resultIntervalKind = kMajorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kDiminishedThird; - break; - case kDiminishedSixth: - resultIntervalKind = kAugmentedSecond; - break; - case kMinorSixth: - resultIntervalKind = kMajorSecond; - break; - case kMajorSixth: - resultIntervalKind = kMinorSecond; - break; - case kAugmentedSixth: - resultIntervalKind = kDiminishedSecond; - break; - case kDiminishedSeventh: - resultIntervalKind = kAugmentedUnison; - break; - case kMinorSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedSeventh; - break; - case kPerfectUnison: - resultIntervalKind = kMajorSeventh; - break; - case kAugmentedUnison: - resultIntervalKind = kMinorSeventh; - break; - case kDiminishedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kMinorSecond: - resultIntervalKind = kAugmentedSixth; - break; - case kMajorSecond: - resultIntervalKind = kMajorSixth; - break; - case kAugmentedSecond: - resultIntervalKind = kMinorSixth; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kAugmentedFifth; - break; - case kMajorThird: - resultIntervalKind = kPerfectFifth; - break; - case kAugmentedThird: - resultIntervalKind = kDiminishedFifth; - break; - case kDiminishedFourth: - // JMI resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kAugmentedFourth; - break; - case kAugmentedFourth: - resultIntervalKind = kPerfectFourth; - break; - case kDiminishedFifth: - resultIntervalKind = kAugmentedThird; - break; - case kPerfectFifth: - resultIntervalKind = kMajorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kAugmentedSecond; - break; - case kMajorSixth: - resultIntervalKind = kMajorSecond; - break; - case kAugmentedSixth: - resultIntervalKind = kMinorSecond; - break; - case kDiminishedSeventh: - resultIntervalKind = kDiminishedSecond; - break; - case kMinorSeventh: - resultIntervalKind = kAugmentedUnison; - break; - case kMajorSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - // JMI resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - // JMI resultIntervalKind = kAugmentedSeventh; - break; - case kAugmentedUnison: - resultIntervalKind = kAugmentedSeventh; - break; - case kDiminishedSecond: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSecond: - // JMI resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kAugmentedSixth; - break; - case kAugmentedSecond: - resultIntervalKind = kMajorSixth; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - // JMI resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kAugmentedFifth; - break; - case kAugmentedThird: - resultIntervalKind = kPerfectFifth; - break; - case kDiminishedFourth: - // JMI resultIntervalKind = kDiminishedFifth; - break; - case kPerfectFourth: - // JMI resultIntervalKind = kAugmentedFourth; - break; - case kAugmentedFourth: - resultIntervalKind = kAugmentedFourth; - break; - case kDiminishedFifth: - // JMI resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kAugmentedFourth; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectFourth; - break; - case kDiminishedSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kAugmentedSecond; - break; - case kAugmentedSixth: - resultIntervalKind = kMajorSecond; - break; - case kDiminishedSeventh: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMinorSeventh: - // JMI resultIntervalKind = kPerfectUnison; - break; - case kMajorSeventh: - resultIntervalKind = kAugmentedUnison; - break; - case kAugmentedSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - default: - ; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceExtraChords) { - gLogOstream << - "--> base resultIntervalKind = '" << - msrIntervalKindAsString (resultIntervalKind) << - "'" << - endl; - } -#endif - - // take interval inversion into account if relevant - if (invertInterval) { - resultIntervalKind = - invertIntervalKind (resultIntervalKind); - } - - // take relative octabes permutation into account if relevant - if (permuteRelativeOctaves) { - resultIntervalKind = - invertIntervalKind (resultIntervalKind); - } - - // create the result - S_msrChordInterval - result = - msrChordInterval::create ( - resultIntervalKind, - resultRelativeOctave); - - // denormalize it, in order to get intervals - // greater than an augmented seventh if applicable - result->deNormalizeInterval (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceExtraChords) { - gLogOstream << - "--> result = '" << - result->asShortString () << - "'" << - endl << - endl; - } -#endif - - // return it; - return result; -} - -S_msrChordInterval msrChordInterval::intervalSum ( - S_msrChordInterval otherChordInterval) -{ - msrIntervalKind resultIntervalKind = k_NoIntervalKind; - int resultRelativeOctave = 0; - - msrIntervalKind - intervalKind1 = fChordIntervalIntervalKind, - intervalKind2 = otherChordInterval->fChordIntervalIntervalKind; - - int - relativeOctave1 = fChordIntervalRelativeOctave, - relativeOctave2 = otherChordInterval->fChordIntervalRelativeOctave; - - relativeOctave1 = relativeOctave2; // TEMP, JMI - relativeOctave2 = relativeOctave1; // TEMP, JMI - - // order the intervals so that - // intervalKind1 is greater or equal to intervalKind2 - // according to the enum type - bool invertInterval = false; - - if (intervalKind1 < intervalKind2) { - intervalKind1 = intervalKind2; - intervalKind2 = intervalKind1; - invertInterval = true; - } - - switch (intervalKind1) { - case k_NoIntervalKind: - break; - - case kDiminishedUnisson: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kPerfectUnison: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedUnison: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kDiminishedSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kDiminishedSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedSecond: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kDiminishedThird: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorThird: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorThird: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedThird: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kDiminishedFourth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kPerfectFourth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedFourth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kDiminishedFifth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kPerfectFifth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedFifth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kDiminishedSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedSixth: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedSixth: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kDiminishedSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMinorSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSeventh: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kMajorSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSeventh: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSeventh: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - case kAugmentedSeventh: - switch (intervalKind2) { - case kDiminishedUnisson: - resultIntervalKind = kAugmentedUnison; - break; - case kPerfectUnison: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedUnison: - resultIntervalKind = kDiminishedOctave; - break; - case kMinorSecond: - resultIntervalKind = kMajorSeventh; - break; - case kMajorSecond: - resultIntervalKind = kMinorSeventh; - break; - case kAugmentedSecond: - resultIntervalKind = kDiminishedSeventh; - break; - case kDiminishedThird: - resultIntervalKind = kAugmentedSixth; - break; - case kMinorThird: - resultIntervalKind = kMinorThird; - break; - case kMajorThird: - resultIntervalKind = kMinorThird; - break; - case kAugmentedThird: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFourth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFourth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFourth: - resultIntervalKind = kMinorThird; - break; - case kDiminishedFifth: - resultIntervalKind = kMinorThird; - break; - case kPerfectFifth: - resultIntervalKind = kMinorThird; - break; - case kAugmentedFifth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSixth: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedSixth: - resultIntervalKind = kPerfectUnison; - break; - case kDiminishedSeventh: - resultIntervalKind = kPerfectUnison; - break; - case kMinorSeventh: - resultIntervalKind = kPerfectUnison; - break; - case kMajorSeventh: - resultIntervalKind = kPerfectUnison; - break; - case kAugmentedSeventh: - resultIntervalKind = kPerfectUnison; - break; - default: - ; - } // switch - break; - - default: - ; - } // switch - - - if (invertInterval) { - resultIntervalKind = - invertIntervalKind (resultIntervalKind); - } - - return - msrChordInterval::create ( - resultIntervalKind, - resultRelativeOctave); -} - -/* JMI -void msrChordInterval::acceptIn (basevisitor* v) { - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChordInterval::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChordInterval elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChordInterval::visitStart ()" << - endl; - p->visitStart (elem); - } -} - -void msrChordInterval::acceptOut (basevisitor* v) { - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChordInterval::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChordInterval elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChordInterval::visitEnd ()" << - endl; - p->visitEnd (elem); - } -} - -void msrChordInterval::browseData (basevisitor* v) -{} -*/ - -string msrChordInterval::asString () const -{ - stringstream s; - - s << - "ChordInterval '" << - msrIntervalKindAsString (fChordIntervalIntervalKind) << - ", rel. oct. " << - fChordIntervalRelativeOctave << - "'"; - - return s.str (); -} - -string msrChordInterval::asShortString () const -{ - stringstream s; - - s << - "'" << - msrIntervalKindAsString (fChordIntervalIntervalKind) << - ", rel.oct. " << - fChordIntervalRelativeOctave << - "'"; - - return s.str (); -} - -void msrChordInterval::print (ostream& os) const -{ - os << - "ChordInterval" << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - /* JMI - setw (fieldWidth) << - "chordIntervalNumber" << " : " << fChordIntervalNumber << - endl << - */ - setw (fieldWidth) << - "chordIntervalIntervalKind" << " : " << - msrIntervalKindAsString (fChordIntervalIntervalKind) << - endl << - setw (fieldWidth) << - "chordIntervalRelativeOctave" << " : " << fChordIntervalRelativeOctave << - /* JMI - ", line: " << fInputLineNumber << - */ - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrChordInterval& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -map - gChordStructuresMap; - -S_msrChordStructure msrChordStructure::createBare ( - msrHarmonyKind chordStructureHarmonyKind) -{ - msrChordStructure* o = - new msrChordStructure ( - chordStructureHarmonyKind); - assert(o!=0); - - return o; -} - -S_msrChordStructure msrChordStructure::create ( - msrHarmonyKind chordStructureHarmonyKind) -{ - S_msrChordStructure o = - createBare ( - chordStructureHarmonyKind); - - o-> - populateChordStructure (); - - return o; -} - -msrChordStructure::msrChordStructure ( - msrHarmonyKind chordStructureHarmonyKind) -{ - fChordStructureHarmonyKind = chordStructureHarmonyKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> Creating chord intervals '" << - chordStructureAsString () << - "'" << - endl; - } -#endif -} - -S_msrChordStructure msrChordStructure::createChordStructureNewbornClone () -{ - S_msrChordStructure - newbornClone = - createBare ( - fChordStructureHarmonyKind); - - return newbornClone; -} - -void msrChordStructure::populateChordStructure () -{ - // append chord items to chord intervals - switch (fChordStructureHarmonyKind) { - case k_NoHarmony: - break; - - // MusicXML chords - - case kMajorHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - } - break; - - case kMinorHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - } - break; - - case kAugmentedHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedFifth) - ); - } - break; - - case kDiminishedHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kDiminishedFifth) - ); - } - break; - - case kDominantHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - } - break; - - case kMajorSeventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSeventh) - ); - } - break; - - case kMinorSeventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - } - break; - - case kDiminishedSeventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kDiminishedFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kDiminishedSeventh) - ); - } - break; - - case kAugmentedSeventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - } - break; - - case kHalfDiminishedHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kDiminishedFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - } - break; - - case kMinorMajorSeventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSeventh) - ); - } - break; - - case kMajorSixthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSixth) - ); - } - break; - - case kMinorSixthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSixth) - ); - } - break; - - case kDominantNinthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorNinth) - ); - } - break; - - case kMajorNinthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorNinth) - ); - } - break; - - case kMinorNinthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorNinth) - ); - } - break; - - case kDominantEleventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectEleventh) - ); - } - break; - - case kMajorEleventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectEleventh) - ); - } - break; - - case kMinorEleventhHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectEleventh) - ); - } - break; - - case kDominantThirteenthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThirteenth) - ); - } - break; - - case kMajorThirteenthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThirteenth) - ); - } - break; - - case kMinorThirteenthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThirteenth) - ); - } - break; - - case kSuspendedSecondHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSecond) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - } - break; - - case kSuspendedFourthHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFourth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - } - break; - -/* -* kNeapolitan f aes des' in: -* -* c e g c' -> f f aes des' -> d g d b -> c e g c' - -they are three different pre-dominant chords that are taught to American undergrads in a sophomore theory course. - -in E major: -Italian = C E A# -French = C E F# A# -German = C E G A# -Tristan = C D# F# A# - -in all of them, the C and A# in theory want to fan out to B (the dominant). This is, of course, in theory - Wagner’s use of the Tristan chord, which he clearly named his opera after, has the A# moving down to A, or the 7th of the dominant (I’m transposing to fit w/ the example above). Wagner obviously did not pay much attention during his sophomore music theory course… -*/ - - case kNeapolitanHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kDiminishedSixth) - ); - } - break; - - case kItalianHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedSixth) - ); - } - break; - - case kFrenchHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedFourth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedSixth) - ); - } - break; - - case kGermanHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedSixth) - ); - } - break; - - case kPedalHarmony: - break; - - case kPowerHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - } - break; - - case kTristanHarmony: - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedSecond) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedFourth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedSixth) - ); - } - break; - - // jazz-specific chords - - case kMinorMajorNinth: // -maj9, minmaj9 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorNinth) - ); - } - break; - - case kDominantSuspendedFourthHarmony: // 7sus4, domsus4 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFourth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - } - break; - - case kDominantAugmentedFifthHarmony: // 7#5, domaug5 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFourth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - } - break; - - case kDominantMinorNinthHarmony: // 7b9, dommin9 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorNinth) - ); - } - break; - - case kDominantAugmentedNinthDiminishedFifthHarmony: // 7#9b5, domaug9dim5 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kDiminishedFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedNinth) - ); - } - break; - - case kDominantAugmentedNinthAugmentedFifthHarmony: // 7#9#5, domaug9aug5 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorThird) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedNinth) - ); - } - break; - - case kDominantAugmentedEleventhHarmony: // 7#11, domaug11 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFourth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMinorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedEleventh) - ); - } - break; - - case kMajorSeventhAugmentedEleventhHarmony: // maj7#11, maj7aug11 - { - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectUnison) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFourth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kPerfectFifth) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kMajorSeventh) - ); - appendChordIntervalToChordStructure ( - msrChordInterval::create ( - kAugmentedEleventh) - ); - } - break; - - // other - - case kOtherHarmony: - break; - - case kNoneHarmony: - break; - } // switch - -/* JMI - // register chord intervals in map - gChordStructuresMap [fChordStructureHarmonyKind] = this; - */ -} - -msrChordStructure::~msrChordStructure () -{} - -void msrChordStructure::appendChordIntervalToChordStructure ( - S_msrChordInterval chordInterval) -{ - // set the input line number and chord item number // JMI - - // append the chord item - fChordStructureIntervals.push_back ( - chordInterval); -} - -/* JMI -void msrChordStructure::acceptIn (basevisitor* v) { - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChordStructure::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChordStructure elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChordStructure::visitStart ()" << - endl; - p->visitStart (elem); - } -} - -void msrChordStructure::acceptOut (basevisitor* v) { - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChordStructure::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChordStructure elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChordStructure::visitEnd ()" << - endl; - p->visitEnd (elem); - } -} - -void msrChordStructure::browseData (basevisitor* v) -{} -*/ - -S_msrChordInterval msrChordStructure::bassChordIntervalForChordInversion ( - int inputLineNumber, - int inversionNumber) -{ - /* - Inversion is a number indicating which inversion is used: - 0 for root position, 1 for first inversion, etc. - */ - - S_msrChordInterval result; - - if ( - inversionNumber < 0 - || - inversionNumber > int (fChordStructureIntervals.size ()) - 1 ) { - stringstream s; - - s << - "Sorry, inversion number '" << - inversionNumber << - "' does not exist for chord intevals '" << - msrHarmonyKindAsString (fChordStructureHarmonyKind) << - "', line " << inputLineNumber; - - msrLimitation ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return fChordStructureIntervals [inversionNumber]; -} - -S_msrChordStructure msrChordStructure::invertChordStructure (int inversion) -{ - if (inversion == 0) { - return this; - } - - // create an empty object - S_msrChordStructure - result = - this-> - createChordStructureNewbornClone (); - - unsigned int - chordStructureIntervalsSize = - fChordStructureIntervals.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> invertChordStructure (), inversion = " << inversion << - ", original chordStructureIntervalsSize = " << chordStructureIntervalsSize << - endl; - } -#endif - - if (chordStructureIntervalsSize) { - // add the first items - for (unsigned int i = inversion; i < chordStructureIntervalsSize; i++) { - S_msrChordInterval - chordIntervalClone = - fChordStructureIntervals [i]-> - createChordIntervalNewbornClone (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "--> adding first item to result:" << - endl; - gIndenter++; - gLogOstream << - chordIntervalClone << - endl; - gIndenter--; - } -#endif - - result-> - appendChordIntervalToChordStructure ( - chordIntervalClone); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> result chord structure after adding first item :" << - endl; - - gIndenter++; - gLogOstream << - result << - endl; - gIndenter--; - } -#endif - } // for - - // add the octaviate last items - for (int i = 0; i < inversion; i++) { - S_msrChordInterval - chordIntervalClone = - fChordStructureIntervals [i]-> - createChordIntervalNewbornClone (); - - chordIntervalClone-> - incrementChordIntervalRelativeOctave (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "--> adding last item to resultlast item :" << - endl; - gIndenter++; - gLogOstream << - chordIntervalClone << - endl; - gIndenter--; - } -#endif - - result-> - appendChordIntervalToChordStructure ( - chordIntervalClone); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> result chord structure after after adding last item:" << - endl; - - gIndenter++; - gLogOstream << - result << - endl; - gIndenter--; - } -#endif - } // for - } - - return result; -} - -list buildSemiTonesChord ( - msrHarmonyKind harmonyKind, - msrSemiTonesPitchKind rootNote) -{ - list result; - - // create the chord intervals - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - harmonyKind); - - // add the root to the chord - result.push_back (rootNote); - - // add the other notes to the chord - const vector& - chordStructureIntervals = - chordStructure-> - getChordStructureIntervals (); - - for (unsigned int i = 1; i << chordStructureIntervals.size (); i++) { - result.push_back (rootNote); - } // for - - return result; -} - -string msrChordStructure::chordStructureAsString () const -{ - stringstream s; - - s << - "ChordStructure" << - ", " << - msrHarmonyKindAsString (fChordStructureHarmonyKind) << - ", " << - singularOrPlural ( - fChordStructureIntervals.size (), "item", "items"); - - return s.str (); -} - -void msrChordStructure::print (ostream& os) const -{ - os << - "ChordStructure" << - ", chordStructureHarmonyKind: " << - msrHarmonyKindAsString (fChordStructureHarmonyKind) << - ", " << - singularOrPlural ( - fChordStructureIntervals.size (), "interval", "intervals") << - /* JMI - ", line: " << fInputLineNumber << - */ - endl; - - gIndenter++; - - if (fChordStructureIntervals.size ()) { - vector::const_reverse_iterator - iBegin = fChordStructureIntervals.crbegin (), - iEnd = fChordStructureIntervals.crend (), - i = iBegin; - - for ( ; ; ) { - S_msrChordInterval - chordInterval = (*i); - - gLogOstream << - chordInterval->chordIntervalAsShortString () << - endl; - - if (++i == iEnd) break; - } // for - } - else { - gLogOstream << - "no intervals" << - endl; - } - - gIndenter--; -} - -void msrChordStructure::printAllChordsStructures (ostream& os) -{ - os << - "All the known chords structures are:" << - endl << - endl; - - gIndenter++; - - for ( - msrHarmonyKind harmonyKind = kMajorHarmony; - harmonyKind <= kMajorSeventhAugmentedEleventhHarmony; - harmonyKind = msrHarmonyKind (harmonyKind + 1)) { - // create the chord intervals - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - harmonyKind); - - // print it - os << - chordStructure << - endl; - } // for - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrChordStructure& elt) -{ - elt->print (os); - return os; -} - -/* JMI -//______________________________________________________________________________ -S_msrSemiTonesPitchAndAbsoluteOctave msrSemiTonesPitchAndAbsoluteOctave::create ( - msrSemiTonesPitchKind semiTonesPitchKind, - int absoluteOctave) -{ - msrSemiTonesPitchAndAbsoluteOctave* o = - new msrSemiTonesPitchAndAbsoluteOctave ( - semiTonesPitchKind, - absoluteOctave); - assert(o!=0); - - return o; -} - -msrSemiTonesPitchAndAbsoluteOctave::msrSemiTonesPitchAndAbsoluteOctave ( - msrSemiTonesPitchKind semiTonesPitchKind, - int absoluteOctave) -{ - fSemiTonesPitchKind = semiTonesPitchKind; - - fAbsoluteOctave = absoluteOctave; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> Creating chord item '" << - asString () << - "'" << - endl; - } -#endif -} - -msrSemiTonesPitchAndAbsoluteOctave::~msrSemiTonesPitchAndAbsoluteOctave () -{} - -S_msrSemiTonesPitchAndAbsoluteOctave msrSemiTonesPitchAndAbsoluteOctave::createSemiTonesPitchAndAbsoluteOctaveNewbornClone () -{ - S_msrSemiTonesPitchAndAbsoluteOctave - newbornClone = - msrSemiTonesPitchAndAbsoluteOctave::create ( - fSemiTonesPitchKind, - fAbsoluteOctave); - - return newbornClone; -} - -string msrSemiTonesPitchAndAbsoluteOctave::asString () const -{ - stringstream s; - - const int fieldWidth = 19; - - s << left << - "SemiTonesPitchAndAbsoluteOctave" << - ": " << - setw (fieldWidth) << - msrSemiTonesPitchKindAsString (fSemiTonesPitchKind) << - ", absoluteOctave: " << fAbsoluteOctave; - - return s.str (); -} - -void msrSemiTonesPitchAndAbsoluteOctave::print (ostream& os) const -{ - os << - "SemiTonesPitchAndAbsoluteOctave" << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - setw (fieldWidth) << - "semiTonesPitchKind" << " : " << - msrSemiTonesPitchKindAsString (fSemiTonesPitchKind) << - endl << - setw (fieldWidth) << - "absoluteOctave" << " : " << fAbsoluteOctave << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSemiTonesPitchAndAbsoluteOctave& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrSemiTonesPitchAndRelativeOctave msrSemiTonesPitchAndRelativeOctave::create ( - msrSemiTonesPitchKind semiTonesPitchKind, - int relativeOctave) -{ - msrSemiTonesPitchAndRelativeOctave* o = - new msrSemiTonesPitchAndRelativeOctave ( - semiTonesPitchKind, - relativeOctave); - assert(o!=0); - - return o; -} - -msrSemiTonesPitchAndRelativeOctave::msrSemiTonesPitchAndRelativeOctave ( - msrSemiTonesPitchKind semiTonesPitchKind, - int relativeOctave) -{ - fSemiTonesPitchKind = semiTonesPitchKind; - - fRelativeOctave = relativeOctave; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> Creating chord item '" << - asString () << - "'" << - endl; - } -#endif -} - -msrSemiTonesPitchAndRelativeOctave::~msrSemiTonesPitchAndRelativeOctave () -{} - -S_msrSemiTonesPitchAndRelativeOctave msrSemiTonesPitchAndRelativeOctave::createSemiTonesPitchAndRelativeOctaveNewbornClone () -{ - S_msrSemiTonesPitchAndRelativeOctave - newbornClone = - msrSemiTonesPitchAndRelativeOctave::create ( - fSemiTonesPitchKind, - fRelativeOctave); - - return newbornClone; -} - -string msrSemiTonesPitchAndRelativeOctave::asString () const -{ - stringstream s; - - const int fieldWidth = 19; - - s << left << - "SemiTonesPitchAndRelativeOctave" << - ": " << - setw (fieldWidth) << - msrSemiTonesPitchKindAsString (fSemiTonesPitchKind) << - ", relativeOctave: " << fRelativeOctave; - - return s.str (); -} - -void msrSemiTonesPitchAndRelativeOctave::print (ostream& os) const -{ - os << - "SemiTonesPitchAndRelativeOctave" << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - setw (fieldWidth) << - "semiTonesPitchKind" << " : " << - msrSemiTonesPitchKindAsString (fSemiTonesPitchKind) << - endl << - setw (fieldWidth) << - "relativeOctave" << " : " << fRelativeOctave << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSemiTonesPitchAndRelativeOctave& elt) -{ - elt->print (os); - return os; -} -*/ - -//______________________________________________________________________________ -S_msrChordContents msrChordContents::create ( -// JMI int inputLineNumber, - msrSemiTonesPitchKind chordContentsRootNote, - msrHarmonyKind chordContentsHarmonyKind) -{ - msrChordContents* o = - new msrChordContents ( - // inputLineNumber, - chordContentsRootNote, - chordContentsHarmonyKind); - assert(o!=0); - - return o; -} - -msrChordContents::msrChordContents ( -// JMI int inputLineNumber, - msrSemiTonesPitchKind chordContentsRootNote, - msrHarmonyKind chordContentsHarmonyKind) -{ - fChordContentsRootNote = chordContentsRootNote; - fChordContentsHarmonyKind = chordContentsHarmonyKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - gLogOstream << - "==> Creating chordContents '" << - chordContentsAsString () << - "'" << - endl; - } -#endif - - // create the root chord element - S_msrSemiTonesPitchAndOctave - rootChordElement = - msrSemiTonesPitchAndOctave::create ( - fChordContentsRootNote, - 0); // relative octave - - // add it to the chord elements - fChordElementsVector.push_back (rootChordElement); - - // add the other notes to the chord elements - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - fChordContentsHarmonyKind); - - const vector& - chordIntervals = - chordStructure-> - getChordStructureIntervals (); - - for (unsigned int i = 1; i < chordIntervals.size (); i++) { - // get the interval - msrIntervalKind - intervalKind = - chordIntervals [i]-> - getChordIntervalIntervalKind (); - - // fetch the semitone pitch - msrSemiTonesPitchKind - semiTonePitch = - noteAtIntervalFromSemiTonesPitch ( - 0, // ??? JM inputLineNumber, - intervalKind, - fChordContentsRootNote); - - // create the chord element - S_msrSemiTonesPitchAndOctave - chordElement = - msrSemiTonesPitchAndOctave::create ( - semiTonePitch, - 0); // relative octave - - // add it to the chord elements - fChordElementsVector.push_back (chordElement); - } // for -} - -msrChordContents::~msrChordContents () -{} - -string msrChordContents::chordContentsAsString () const -{ - stringstream s; - - s << - "ChordContents" << - ", " << - msrHarmonyKindAsString (fChordContentsHarmonyKind) << - ", " << - singularOrPlural ( - fChordElementsVector.size (), "chord element", "chord elements"); - - return s.str (); -} - -msrSemiTonesPitchKind msrChordContents::bassSemiTonesPitchKindForChordInversion ( - int inputLineNumber, - int inversionNumber) -{ - /* - Inversion is a number indicating which inversion is used: - 0 for root position, 1 for first inversion, etc. - */ - - if ( - inversionNumber < 0 - || - inversionNumber > int (fChordElementsVector.size ()) - 1 ) { - stringstream s; - - s << - "Sorry, inversion number '" << - inversionNumber << - "' does not exist for chord notes '" << - msrHarmonyKindAsString (fChordContentsHarmonyKind) << - "', line " << inputLineNumber; - - msrLimitation ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return - fChordElementsVector [inversionNumber]-> - getSemiTonesPitchKind (); -} - -void msrChordContents::printAllChordsContents ( - ostream& os, - msrSemiTonesPitchKind rootSemiTonesPitchKind) -{ - // fetch the root quartertones pitch kind - msrQuarterTonesPitchKind - rootQuarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - rootSemiTonesPitchKind); - - os << - "All the known chords contents with diatonic root '" << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - rootQuarterTonesPitchKind) << - /* JMI - "' (" << - msrSemiTonesPitchKindAsString ( - rootSemiTonesPitchKind) << - ")" << - */ - "' in language '" << - msrQuarterTonesPitchesLanguageKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind) << - "' 'are:" << - endl << - endl; - - gIndenter++; - - for ( - msrHarmonyKind harmonyKind = kMajorHarmony; - harmonyKind <= kMajorSeventhAugmentedEleventhHarmony; - harmonyKind = msrHarmonyKind (harmonyKind + 1) - ) { - os << - msrHarmonyKindAsString (harmonyKind) << - ":" << - endl; - - gIndenter++; - - // create the chord intervals - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - harmonyKind); - - // fetch the intervals items for these intervals - // with rootSemiTonesPitchKind as root - const vector & - chordStructureIntervals = - chordStructure-> - getChordStructureIntervals (); - - if (chordStructureIntervals.size ()) { - // fetch the notes for these intervals - vector::const_reverse_iterator - iBegin = chordStructureIntervals.crbegin (), - iEnd = chordStructureIntervals.crend (), - i = iBegin; - - for ( ; ; ) { - S_msrChordInterval - chordInterval = (*i); - - msrIntervalKind - intervalKind = - chordInterval-> - getChordIntervalIntervalKind (); - - // fetch the semitones pitch kind - msrSemiTonesPitchKind - noteSemiTonesPitchKind = - noteAtIntervalFromSemiTonesPitch ( - K_NO_INPUT_LINE_NUMBER, - intervalKind, - rootSemiTonesPitchKind); - - // fetch the quartertones pitch kind - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - noteSemiTonesPitchKind); - - // print it - const int fieldWidth2 = 8; - - os << left << - setw (fieldWidth2) << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesPitchKind) << - " : " << - msrIntervalKindAsString (intervalKind) << - endl; - - if (++i == iEnd) break; - - // no endl here - } // for - } - - os << endl; - - gIndenter--; - } // for - - gIndenter--; -} - -/* JMI -void msrChordContents::acceptIn (basevisitor* v) { - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChordContents::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChordContents elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChordContents::visitStart ()" << - endl; - p->visitStart (elem); - } -} - -void msrChordContents::acceptOut (basevisitor* v) { - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChordContents::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChordContents elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChordContents::visitEnd ()" << - endl; - p->visitEnd (elem); - } -} - -void msrChordContents::browseData (basevisitor* v) -{} -*/ - -void msrChordContents::print (ostream& os) const -{ - os << - "ChordContents" << - /* JMI - ", line: " << fInputLineNumber << - */ - endl; - - gIndenter++; - - const int fieldWidth = 17; - - os << left << - setw (fieldWidth) << - "chordContentsRootNote" << " : " << - msrSemiTonesPitchKindAsString (fChordContentsRootNote) << - endl << - setw (fieldWidth) << - "chordContentsHarmonyKind" << " : " << - msrHarmonyKindAsString (fChordContentsHarmonyKind) << - endl; - - if (fChordElementsVector.size ()) { - os << - singularOrPlural ( - fChordElementsVector.size (), "chord element", "chord elements") << - ":" << - endl; - - gIndenter++; - - for (unsigned int i = 0; i < fChordElementsVector.size (); i++) { - S_msrSemiTonesPitchAndOctave - chordElement = - fChordElementsVector [i]; - - os << - chordElement << - endl; - } // for - - gIndenter--; - } - else { - os << - "no notes" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrChordContents& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void printChordDetails ( - ostream& os, - msrSemiTonesPitchKind rootSemiTonesPitchKind, - msrHarmonyKind harmonyKind) -{ - // fetch the quartertones pitch kind - msrQuarterTonesPitchKind - rootQuarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - rootSemiTonesPitchKind); - - string - rootQuarterTonesPitchKindAsString = - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - rootQuarterTonesPitchKind); - - string - harmonyKindShortName = - msrHarmonyKindShortName ( - harmonyKind); - - // print the deails - os << - "The details of chord '" << - rootQuarterTonesPitchKindAsString << - " " << - harmonyKindShortName << - "' are:" << - endl << - endl; - - gIndenter++; - - // create the chord intervals - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - harmonyKind); - - // fetch the intervals items for these intervals - // with rootSemiTonesPitchKind as root - const vector & - chordStructureIntervals = - chordStructure-> - getChordStructureIntervals (); - - // loop on all the inversion - int chordStructureIntervalsNumber = - chordStructureIntervals.size (); - - if (chordStructureIntervalsNumber) { - for (int inversion = 0; inversion < chordStructureIntervalsNumber; inversion++) { - // invert the chord structure - S_msrChordStructure - invertedChordStructure = - chordStructure-> - invertChordStructure (inversion); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - os << - "==> inversion = " << inversion << - ", initial invertedChordStructure:" << - endl; - - gIndenter++; - os << - invertedChordStructure << - endl; - gIndenter--; - } -#endif - - // get the inverted chord structure intervals - const vector & - invertedChordStructureIntervals = - invertedChordStructure-> - getChordStructureIntervals (); - - // fetch the notes for these intervals - /* JMI - vector::const_iterator - iBegin = invertedChordStructureIntervals.begin (), - iEnd = invertedChordStructureIntervals.end (), - i = iBegin; - */ - vector::const_reverse_iterator - iBegin = invertedChordStructureIntervals.crbegin (), - iEnd = invertedChordStructureIntervals.crend (), - i = iBegin; - - os << - "Chord '" << - rootQuarterTonesPitchKindAsString << - " " << - harmonyKindShortName << - "'"; - - if (inversion == 0) { - os << - " fundamental state"; - } - else { - os << - " inversion " << inversion; - } - - os << - " contents, "<< - invertedChordStructureIntervals.size () << - " intervals:" << - endl; - - gIndenter++; - - for ( ; ; ) { - S_msrChordInterval - chordInterval = (*i); - - msrIntervalKind - intervalKind = - chordInterval-> - getChordIntervalIntervalKind (); - - const int fieldWidth1 = 17; - - os << left << - setw (fieldWidth1) << - msrIntervalKindAsString (intervalKind) << - ": "; - - // fetch the semitones pitch kind - msrSemiTonesPitchKind - noteSemiTonesPitchKind = - noteAtIntervalFromSemiTonesPitch ( - K_NO_INPUT_LINE_NUMBER, - intervalKind, - rootSemiTonesPitchKind); - - // fetch the quartertones pitch kind - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - noteSemiTonesPitchKind); - - // print it - const int fieldWidth2 = 8; - - os << left << - setw (fieldWidth2) << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesPitchKind) << - /* JMI - ", octave " << relativeOctave << - " (" << - msrSemiTonesPitchKindAsString ( - noteSemiTonesPitchKind) << - ")" << - */ - endl; - - if (++i == iEnd) break; - - // no endl here - } // for - - gIndenter--; - - os << endl; - } // for - } - - gIndenter--; -} - -//______________________________________________________________________________ -void printChordAnalysis ( - ostream& os, - msrSemiTonesPitchKind rootSemiTonesPitchKind, - msrHarmonyKind harmonyKind, - int inversion) -{ - // fetch the quartertones pitch kind - msrQuarterTonesPitchKind - rootQuarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - rootSemiTonesPitchKind); - - string - rootQuarterTonesPitchKindAsString = - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - rootQuarterTonesPitchKind); - - string - harmonyKindShortName = - msrHarmonyKindShortName ( - harmonyKind); - - // print the deails - os << - "The analysis of chord '" << - rootQuarterTonesPitchKindAsString << - " " << - harmonyKindShortName << - "' inversion " << - inversion << - " is:" << - endl << - endl; - - gIndenter++; - - // create the chord intervals - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - harmonyKind); - - // fetch the intervals items for these intervals - // with rootSemiTonesPitchKind as root - const vector & - chordStructureIntervals = - chordStructure-> - getChordStructureIntervals (); - - // loop on all the inversion - int chordStructureIntervalsNumber = - chordStructureIntervals.size (); - - if (chordStructureIntervalsNumber) { - if (inversion < chordStructureIntervalsNumber) { - // invert the chord structure - S_msrChordStructure - invertedChordStructure = - chordStructure-> - invertChordStructure (inversion); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - os << - "==> inversion = " << inversion << - ", initial invertedChordStructure:" << - endl; - - gIndenter++; - os << - invertedChordStructure << - endl; - gIndenter--; - } -#endif - - // get the inverted chord structure intervals - const vector & - invertedChordStructureIntervals = - invertedChordStructure-> - getChordStructureIntervals (); - - // print the chord contents - { - os << - "Chord '" << - rootQuarterTonesPitchKindAsString << - " " << - harmonyKindShortName << - "'"; - - if (inversion == 0) { - os << - " fundamental state"; - } - else { - os << - " inversion " << inversion; - } - - os << - " contents, "<< - invertedChordStructureIntervals.size () << - " intervals:" << - endl; - - gIndenter++; - - vector::const_reverse_iterator - iBegin = invertedChordStructureIntervals.crbegin (), - iEnd = invertedChordStructureIntervals.crend (), - i = iBegin; - - for ( ; ; ) { - S_msrChordInterval - chordInterval = (*i); - - msrIntervalKind - intervalKind = - chordInterval-> - getChordIntervalIntervalKind (); - - // fetch the semitones pitch kind - msrSemiTonesPitchKind - noteSemiTonesPitchKind = - noteAtIntervalFromSemiTonesPitch ( - K_NO_INPUT_LINE_NUMBER, - intervalKind, - rootSemiTonesPitchKind); - - // fetch the quartertones pitch kind - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind = - quarterTonesPitchKindFromSemiTonesPitchKind ( - noteSemiTonesPitchKind); - - // print it - const int fieldWidth2 = 5; - - os << left << - setw (fieldWidth2) << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesPitchKind) << - " : " << - msrIntervalKindAsString (intervalKind) << - endl; - - if (++i == iEnd) break; - - // no endl here - } // for - - gIndenter--; - - os << endl; - } - - // print the chord's inner intervals - { - os << - "Chord '" << - rootQuarterTonesPitchKindAsString << - " " << - harmonyKindShortName << - "'"; - - if (inversion == 0) { - os << - " fundamental state"; - } - else { - os << - " inversion " << inversion; - } - - os << - " inner intervals:" << - endl; - - gIndenter++; - - int tritonsCounter = 0; - - vector::const_iterator - iBegin1 = invertedChordStructureIntervals.begin (), - iEnd1 = invertedChordStructureIntervals.end () - 1, - i1 = iBegin1; - - for ( ; ; ) { - S_msrChordInterval - chordInterval1 = (*i1); - - msrIntervalKind - intervalKind1 = - chordInterval1-> - getChordIntervalIntervalKind (); - - // fetch the semitones pitch kind - msrSemiTonesPitchKind - noteSemiTonesPitchKind1 = - noteAtIntervalFromSemiTonesPitch ( - K_NO_INPUT_LINE_NUMBER, - intervalKind1, - rootSemiTonesPitchKind); - - // fetch the quartertones pitch kind - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind1 = - quarterTonesPitchKindFromSemiTonesPitchKind ( - noteSemiTonesPitchKind1); - - // print the invervals - vector::const_iterator - iBegin2 = i1 + 1, - iEnd2 = invertedChordStructureIntervals.end (), - i2 = iBegin2; - - for ( ; ; ) { - S_msrChordInterval - chordInterval2 = (*i2); - - msrIntervalKind - intervalKind2 = - chordInterval2-> - getChordIntervalIntervalKind (); - - const int fieldWidth1 = 5; - - // fetch the semitones pitch kind - msrSemiTonesPitchKind - noteSemiTonesPitchKind2 = - noteAtIntervalFromSemiTonesPitch ( - K_NO_INPUT_LINE_NUMBER, - intervalKind2, - rootSemiTonesPitchKind); - - // fetch the quartertones pitch kind - msrQuarterTonesPitchKind - noteQuarterTonesPitchKind2 = - quarterTonesPitchKindFromSemiTonesPitchKind ( - noteSemiTonesPitchKind2); - - // compute the inner interval - S_msrChordInterval - interInterval = - chordInterval2-> - intervalDifference ( - chordInterval1); - - msrIntervalKind - innerIntervalKind = - interInterval-> - getChordIntervalIntervalKind (); - - // is this interval a triton? - switch (innerIntervalKind) { - case kAugmentedFourth: - case kDiminishedFifth: - tritonsCounter++; - break; - default: - ; - } // switch - - // print it - gIndenter++; - - const int fieldWidth2 = 20; - - os << left << - setw (fieldWidth1) << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesPitchKind1) << - - " -> " << - - setw (fieldWidth1) << - msrQuarterTonesPitchKindAsString ( - gLpsrOah-> - fLpsrQuarterTonesPitchesLanguageKind, - noteQuarterTonesPitchKind2) << - - " : " << - - setw (fieldWidth2) << // JMI - msrIntervalKindAsString (innerIntervalKind) << - - "(" << - setw (fieldWidth2) << - msrIntervalKindAsString (intervalKind1) << - " -> " << - msrIntervalKindAsString (intervalKind2) << - ")" << - - endl; - - gIndenter--; - - if (++i2 == iEnd2) break; - } // for - - if (++i1 == iEnd1) break; - - os << endl; - } // for - - gIndenter--; - - - if (tritonsCounter > 0) { - os << - "This chord contains " << - singularOrPlural ( - tritonsCounter, "triton", "tritons") << - endl; - } - - os << endl; - } - } - - else { - os << - "Chord '" << - rootQuarterTonesPitchKindAsString << - " " << - harmonyKindShortName << - "' has only " << - chordStructureIntervalsNumber << - " intervals, inversion " << - inversion << - " does not exist" << - endl << - endl; - } - } - - gIndenter--; -} - -// RGB colors -//______________________________________________________________________________ -msrRGBColor::msrRGBColor () -{ - // initializing to negative values for isEmpty() - fR = -1.0; - fG = -1.0; - fB = -1.0; -} - -msrRGBColor::msrRGBColor ( - float theR, - float theG, - float theB) -{ - fR = theR; - fG = theG; - fB = theB; -} - -msrRGBColor::msrRGBColor ( - std::string theString) -{ - string regularExpression ( - "([[:digit:]]*.[[:digit:]]*)" - "," - "([[:digit:]]*.[[:digit:]]*)" - "," - "([[:digit:]]*.[[:digit:]]*)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "There are " << smSize << " matches" << - " for RGB color string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - } -#endif - - if (smSize == 4) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - for (unsigned i = 0; i < smSize; ++i) { - gLogOstream << - "[" << sm [i] << "] "; - } // for - gLogOstream << endl; - } -#endif - } - - else { - stringstream s; - - s << - "msrRGBColor string '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string - RString = sm [1], - GString = sm [2], - BString = sm [3]; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "--> RString = \"" << RString << "\", " << - "--> GString = \"" << GString << "\"" << - "--> BString = \"" << BString << "\"" << - endl; - } -#endif - - // are these strings alright? - { - stringstream s; - - s << RString; - s >> fR; - - if (fR < 0.0 || fR > 1.0) { - gLogOstream << - "### ERROR: the R component " << fR << - " is not in the [0.0..1.0] interval in RGB color '" << theString << "'" << - endl; - } - } - { - stringstream s; - - s << GString; - s >> fG; - - if (fG < 0.0 || fG > 1.0) { - gLogOstream << - "### ERROR: the G component " << fG << - " is not in the [0.0..1.0] interval in RGB color '" << theString << "'" << - endl; - } - } - { - stringstream s; - - s << BString; - s >> fB; - - if (fB < 0.0 || fB > 1.0) { - gLogOstream << - "### ERROR: the B component " << fB << - " is not in the [0.0..1.0] interval in RGB color '" << theString << "'" << - endl; - } - } - -} - -string msrRGBColor::asString () const -{ - stringstream s; - - s << - setprecision (2) << - "'" << - fR << - "," << - fG << - "," << - fB << - "'"; - - return s.str (); -} - -void msrRGBColor::print (ostream& os) const -{ - os << - asString () << - endl; -}; - -ostream& operator<< (ostream& os, const msrRGBColor& elt) -{ - elt.print (os); - return os; -} - -// AlphaRGB colors -//______________________________________________________________________________ -msrAlphaRGBColor::msrAlphaRGBColor ( - string colorRGB, - string colorAlpha) -{ - fColorRGB = colorRGB; - fColorAlpha = colorAlpha; -} - -msrAlphaRGBColor::msrAlphaRGBColor ( - string colorRGB) -{ - fColorRGB = colorRGB; - fColorAlpha = "FF"; -} - -msrAlphaRGBColor::~msrAlphaRGBColor () -{} - -string msrAlphaRGBColor::asString () const -{ - stringstream s; - - s << "color: " << - "colorRGB = \"" << fColorRGB << - "\", colorAlpha = \"" << fColorAlpha << - "\""; - - return s.str (); -} - -void msrAlphaRGBColor::print (ostream& os) const -{ - os << - asString () << - endl; -}; - -ostream& operator<< (ostream& os, const msrAlphaRGBColor& elt) -{ - elt.print (os); - return os; -} - -//______________________________________________________________________________ -string msrScoreNotationKindAsString ( - msrScoreNotationKind scoreNotationKind) -{ - string result; - - switch (scoreNotationKind) { - case kScoreNotationWestern: - result = "scoreNotationWestern"; - case kScoreNotationJianpu: - result = "scoreNotationJianpu"; - case kScoreNotationDiatonicAccordion: - result = "scoreNotationDiatonicAccordion"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -void initializeMSRBasicTypes () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing MSR basic types handling" << - endl; - } -#endif - - // languages handling - // ------------------------------------------------------ - - initializeQuarterTonesPitchesLanguageKinds (); - - // harmonies handling - // ------------------------------------------------------ - - initializeHarmonyKinds (); - - // chord structures handling - // ------------------------------------------------------ - - initializeChordStructuresMap (); - - // MSR lengths handling - // ------------------------------------------------------ - - initializeMsrLengthUnitKindsMap (); - - // MSR margins types handling - // ------------------------------------------------------ - - initializeMsrMarginTypeKindsMap (); -} - - -} diff --git a/src/lilypond/msrBasicTypes.h b/src/lilypond/msrBasicTypes.h deleted file mode 100644 index b8f273b48..000000000 --- a/src/lilypond/msrBasicTypes.h +++ /dev/null @@ -1,1570 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrBasicTypes___ -#define ___msrBasicTypes___ - -#include -#include - -#include "smartpointer.h" - -#include "rational.h" - - -namespace MusicXML2 -{ - -// input line numbers -//______________________________________________________________________________ - -#define K_NO_INPUT_LINE_NUMBER 0 - -// names lists max length -// ------------------------------------------------------ - -#define K_NAMES_LIST_MAX_LENGTH 50 - -// XMLLang -//______________________________________________________________________________ -enum msrXMLLangKind { - kXMLLangIt, kXMLLangEn, kXMLLangDe, kXMLLangFr, kXMLLangJa, kXMLLangLa }; - -msrXMLLangKind msrXMLLangKindFromString ( - int inputLineNumber, - string XMLLangString); - -string msrXMLLangKindAsString ( - msrXMLLangKind XMLLangKind); - -// diatonic pitches -//______________________________________________________________________________ -enum msrDiatonicPitchKind { - // starting at C for LilyPond relative octave calculations - kC, kD, kE, kF, kG, kA, kB, - k_NoDiatonicPitch }; - -msrDiatonicPitchKind msrDiatonicPitchKindFromString ( - char diatonicNoteName); - -string msrDiatonicPitchKindAsString ( - msrDiatonicPitchKind diatonicPitchKind); - -// alterations -//______________________________________________________________________________ -enum msrAlterationKind { - k_NoAlteration, - - kTripleFlat, kDoubleFlat, kSesquiFlat, kFlat, kSemiFlat, - kNatural, - kSemiSharp, kSharp, kSesquiSharp, kDoubleSharp, kTripleSharp }; - -msrAlterationKind msrAlterationKindFromMusicXMLAlter ( - float alter); - -string msrAlterationKindAsString ( - msrAlterationKind alterationKind); - -// semi tones pitches -//______________________________________________________________________________ -enum msrSemiTonesPitchKind { - k_NoSemiTonesPitch_STP, - - kC_TripleFlat_STP, - kC_DoubleFlat_STP, kC_Flat_STP, - kC_Natural_STP, - kC_Sharp_STP, kC_DoubleSharp_STP, - kC_TripleSharp_STP, - - kD_TripleFlat_STP, - kD_DoubleFlat_STP, kD_Flat_STP, - kD_Natural_STP, - kD_Sharp_STP, kD_DoubleSharp_STP, - kD_TripleSharp_STP, - - kE_TripleFlat_STP, - kE_DoubleFlat_STP, kE_Flat_STP, - kE_Natural_STP, - kE_Sharp_STP, kE_DoubleSharp_STP, - kE_TripleSharp_STP, - - kF_TripleFlat_STP, - kF_DoubleFlat_STP, kF_Flat_STP, - kF_Natural_STP, - kF_Sharp_STP, kF_DoubleSharp_STP, - kF_TripleSharp_STP, - - kG_TripleFlat_STP, - kG_DoubleFlat_STP, kG_Flat_STP, - kG_Natural_STP, - kG_Sharp_STP, kG_DoubleSharp_STP, - kG_TripleSharp_STP, - - kA_TripleFlat_STP, - kA_DoubleFlat_STP, kA_Flat_STP, - kA_Natural_STP, - kA_Sharp_STP, kA_DoubleSharp_STP, - kA_TripleSharp_STP, - - kB_TripleFlat_STP, - kB_DoubleFlat_STP, kB_Flat_STP, - kB_Natural_STP, - kB_Sharp_STP, kB_DoubleSharp_STP, - kB_TripleSharp_STP }; - -string msrSemiTonesPitchKindAsString ( - msrSemiTonesPitchKind semiTonesPitchKind); - -// quarter tones pitches -//______________________________________________________________________________ -enum msrQuarterTonesPitchKind { - k_NoQuarterTonesPitch_QTP, - - k_Rest_QTP, - - kA_TripleFlat_QTP, - kA_DoubleFlat_QTP, kA_SesquiFlat_QTP, kA_Flat_QTP, kA_SemiFlat_QTP, - kA_Natural_QTP, - kA_SemiSharp_QTP, kA_Sharp_QTP, kA_SesquiSharp_QTP, kA_DoubleSharp_QTP, - kA_TripleSharp_QTP, - - kB_TripleFlat_QTP, - kB_DoubleFlat_QTP, kB_SesquiFlat_QTP, kB_Flat_QTP, kB_SemiFlat_QTP, - kB_Natural_QTP, - kB_SemiSharp_QTP, kB_Sharp_QTP, kB_SesquiSharp_QTP, kB_DoubleSharp_QTP, - kB_TripleSharp_QTP, - - kC_TripleFlat_QTP, - kC_DoubleFlat_QTP, kC_SesquiFlat_QTP, kC_Flat_QTP, kC_SemiFlat_QTP, - kC_Natural_QTP, - kC_SemiSharp_QTP, kC_Sharp_QTP, kC_SesquiSharp_QTP, kC_DoubleSharp_QTP, - kC_TripleSharp_QTP, - - kD_TripleFlat_QTP, - kD_DoubleFlat_QTP, kD_SesquiFlat_QTP, kD_Flat_QTP, kD_SemiFlat_QTP, - kD_Natural_QTP, - kD_SemiSharp_QTP, kD_Sharp_QTP, kD_SesquiSharp_QTP, kD_DoubleSharp_QTP, - kD_TripleSharp_QTP, - - kE_TripleFlat_QTP, - kE_DoubleFlat_QTP, kE_SesquiFlat_QTP, kE_Flat_QTP, kE_SemiFlat_QTP, - kE_Natural_QTP, - kE_SemiSharp_QTP, kE_Sharp_QTP, kE_SesquiSharp_QTP, kE_DoubleSharp_QTP, - kE_TripleSharp_QTP, - - kF_TripleFlat_QTP, - kF_DoubleFlat_QTP, kF_SesquiFlat_QTP, kF_Flat_QTP, kF_SemiFlat_QTP, - kF_Natural_QTP, - kF_SemiSharp_QTP, kF_Sharp_QTP, kF_SesquiSharp_QTP, kF_DoubleSharp_QTP, - kF_TripleSharp_QTP, - - kG_TripleFlat_QTP, - kG_DoubleFlat_QTP, kG_SesquiFlat_QTP, kG_Flat_QTP, kG_SemiFlat_QTP, - kG_Natural_QTP, - kG_SemiSharp_QTP, kG_Sharp_QTP, kG_SesquiSharp_QTP, kG_DoubleSharp_QTP, - kG_TripleSharp_QTP }; - -void setDiatonicPitchKindAndAlterationKind ( - msrQuarterTonesPitchKind quarterTonesPitchKind, - msrDiatonicPitchKind& diatonicPitchKind, - msrAlterationKind& alterationKind); - -msrQuarterTonesPitchKind quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - int inputLineNumber, - msrDiatonicPitchKind diatonicPitchKind, - msrAlterationKind alterationKind); - -msrDiatonicPitchKind diatonicPitchKindFromQuarterTonesPitchKind ( - int inputLineNumber, - msrQuarterTonesPitchKind quarterTonesPitchKind); - -msrQuarterTonesPitchKind quarterTonesPitchKindFromSemiTonesPitchKind ( - msrSemiTonesPitchKind semiTonesPitchKind); - -msrSemiTonesPitchKind semiTonesPitchKindFromQuarterTonesPitchKind ( - msrQuarterTonesPitchKind quarterTonesPitchKind); - -msrSemiTonesPitchKind semiTonesPitchKindFromString ( - string theString); - -// alterations preferences -//______________________________________________________________________________ -enum msrAlterationPreferenceKind { - kPreferFlat, kPreferNatural, kPreferSharp }; - -msrQuarterTonesPitchKind msrSemiTonesPitchKindAsQuarterTonesPitchKind ( - msrSemiTonesPitchKind semiTonesPitchKind, - msrAlterationPreferenceKind alterationPreferenceKind); - -// intervals -//______________________________________________________________________________ -enum msrIntervalKind { - k_NoIntervalKind, - - kDiminishedUnisson, kPerfectUnison, kAugmentedUnison, - - kDiminishedSecond, kMinorSecond, kMajorSecond, kAugmentedSecond, - - kDiminishedThird, kMinorThird, kMajorThird, kAugmentedThird, - - kDiminishedFourth, kPerfectFourth, kAugmentedFourth, - - kDiminishedFifth, kPerfectFifth, kAugmentedFifth, - - kDiminishedSixth, kMinorSixth, kMajorSixth, kAugmentedSixth, - - kDiminishedSeventh, kMinorSeventh, kMajorSeventh, kAugmentedSeventh, - - kDiminishedOctave, kPerfectOctave, kAugmentedOctave, - - kDiminishedNinth, kMinorNinth, kMajorNinth, kAugmentedNinth, - - kDiminishedTenth, kMinorTenth, kMajorTenth, kAugmentedTenth, - - kDiminishedEleventh, kPerfectEleventh, kAugmentedEleventh, - - kDiminishedTwelfth, kPerfectTwelfth, kAugmentedTwelfth, - - kDiminishedThirteenth, kMinorThirteenth, kMajorThirteenth, kAugmentedThirteenth }; - -int msrIntervalKindAsSemiTones ( - msrIntervalKind intervalKind); - -int msrIntervalKindAsQuarterTones ( - msrIntervalKind intervalKind); - -string msrIntervalKindAsString ( - msrIntervalKind intervaKindl); - -string msrIntervalKindAsShortString ( - msrIntervalKind intervalKind); - -msrIntervalKind invertIntervalKind ( - msrIntervalKind intervalKind); - -int intervalKindAsSemitones ( - msrIntervalKind intervalKind); - -/* JMI -msrSemiTonesPitchKind noteAtIntervalKindFromNote ( - msrIntervalKind intervalKind, - msrSemiTonesPitchKind semiTonesPitchKind, - msrAlterationPreferenceKind alterationPreferenceKind); -*/ - -msrSemiTonesPitchKind noteAtIntervalFromSemiTonesPitch ( - int inputLineNumber, - msrIntervalKind intervalKind, - msrSemiTonesPitchKind semiTonesPitchKind); - -msrQuarterTonesPitchKind noteAtIntervalFromQuarterTonesPitch ( - int inputLineNumber, - msrIntervalKind intervalKind, - msrQuarterTonesPitchKind quarterTonesPitchKind); - -msrIntervalKind intervalBetweenSemiTonesPitches ( - msrSemiTonesPitchKind semiTonesPitch1, - msrSemiTonesPitchKind semiTonesPitch2); - -// harmonies -//______________________________________________________________________________ -enum msrHarmonyKind { - k_NoHarmony, - - // MusicXML chords - - kMajorHarmony, kMinorHarmony, - kAugmentedHarmony, kDiminishedHarmony, - - kDominantHarmony, - kMajorSeventhHarmony, kMinorSeventhHarmony, - kDiminishedSeventhHarmony, kAugmentedSeventhHarmony, - kHalfDiminishedHarmony, - kMinorMajorSeventhHarmony, - - kMajorSixthHarmony, kMinorSixthHarmony, - - kDominantNinthHarmony, - kMajorNinthHarmony, kMinorNinthHarmony, - - kDominantEleventhHarmony, kMajorEleventhHarmony, kMinorEleventhHarmony, - - kDominantThirteenthHarmony, kMajorThirteenthHarmony, kMinorThirteenthHarmony, - - kSuspendedSecondHarmony, kSuspendedFourthHarmony, - - kNeapolitanHarmony, kItalianHarmony, kFrenchHarmony, kGermanHarmony, - - kPedalHarmony, kPowerHarmony, kTristanHarmony, - - // jazz-specific chords - - kMinorMajorNinth, // -maj9, minmaj9 - - kDominantSuspendedFourthHarmony, // 7sus4, domsus4 - kDominantAugmentedFifthHarmony, // 7#5, domaug5 - kDominantMinorNinthHarmony, // 7b9, dommin9 - kDominantAugmentedNinthDiminishedFifthHarmony, // 7#9b5, domaug9dim5 - kDominantAugmentedNinthAugmentedFifthHarmony, // 7#9#5, domaug9aug5 - kDominantAugmentedEleventhHarmony, // 7#11, domaug11 - - kMajorSeventhAugmentedEleventhHarmony, // maj7#11, maj7aug11 - - // other - - kOtherHarmony, - - kNoneHarmony }; - -string msrHarmonyKindAsString ( - msrHarmonyKind harmonyKind); - -string msrHarmonyKindAsShortString ( - msrHarmonyKind harmonyKind); - -string msrHarmonyKindShortName ( - msrHarmonyKind harmonyKind); - -msrHarmonyKind msrHarmonyKindFromString ( - string theString); - -string existingHarmonyKinds (int namesListMaxLength); -string existingHarmonyKindsNames (int namesListMaxLength); - -// constant -const int K_HARMONY_NO_INVERSION = -1; - -extern map - gHarmonyKindsMap; - -//extern list -// gHarmonyKindsNamesList; - -void initializeHarmonyKinds (); - -// quarter tones pitches languages -//______________________________________________________________________________ -enum msrQuarterTonesPitchesLanguageKind { - kNederlands, kCatalan, kDeutsch, kEnglish, kEspanol, kFrancais, - kItaliano, kNorsk, kPortugues, kSuomi, kSvenska, kVlaams }; - -string msrQuarterTonesPitchesLanguageKindAsString ( - msrQuarterTonesPitchesLanguageKind languageKind); - -string msrDiatonicPitchKindAsString ( // JMI - msrQuarterTonesPitchesLanguageKind languageKind, - msrDiatonicPitchKind diatonicPitchKind); - -string msrQuarterTonesPitchKindAsString ( - msrQuarterTonesPitchesLanguageKind languageKind, - msrQuarterTonesPitchKind quarterTonesPitchKind); - -msrQuarterTonesPitchKind msrQuarterTonesPitchKindFromString ( - msrQuarterTonesPitchesLanguageKind languageKind, - string quarterTonesPitchName); - -/* JMI -string msrSemiTonesPitchKindAsString ( - msrQuarterTonesPitchesLanguageKind languageKind, - msrSemiTonesPitchKind semiTonesPitchKind); - */ - -string msrSemiTonesPitchKindAsFlatsAndSharps ( - msrQuarterTonesPitchesLanguageKind languageKind, - msrSemiTonesPitchKind semiTonesPitchKind); - -/* JMI -string msrQuarterTonesPitchKindAsFlatsAndSharps ( - msrQuarterTonesPitchesLanguageKind languageKind, - msrQuarterTonesPitchKind quarterTonesPitchKind); -*/ - -// enharmonies -//______________________________________________________________________________ -msrSemiTonesPitchKind enharmonicSemiTonesPitch ( - msrSemiTonesPitchKind semiTonesPitchKind, - msrAlterationPreferenceKind alterationPreferenceKind); - -// durations -//______________________________________________________________________________ -enum msrDurationKind { - // from longest to shortest for the algorithms - kMaxima, kLong, kBreve, kWhole, kHalf, - kQuarter, - kEighth, k16th, k32nd, k64th, k128th, k256th, k512th, k1024th, - k_NoDuration }; - -msrDurationKind msrDurationKindFromString ( - int inputLineNumber, - string durationString); - -rational msrDurationKindAsWholeNotes ( - msrDurationKind durationKind); - -msrDurationKind wholeNotesAsDurationKind (rational wholeNotes); - -string msrDurationKindAsString (msrDurationKind durationKind); - -// whole notes -//______________________________________________________________________________ -string wholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes, - int& dotsNumber); - -string wholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes); - -string multipleRestMeasuresWholeNotesAsMsrString ( - int inputLineNumber, // JMI - rational wholeNotes); - -// dotted durations -//______________________________________________________________________________ -class msrDottedDuration -{ -// JMI protected: - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrDottedDuration (); - - msrDottedDuration ( - msrDurationKind durationKind, - int dotsNumber); - - virtual ~msrDottedDuration (); - - public: - - // set and get - // ------------------------------------------------------ - - msrDurationKind getDurationKind () const - { return fDurationKind; } - - int getDotsNumber () const - { return fDotsNumber; } - - // services - // ------------------------------------------------------ - - void incrDotsNumber () - { fDotsNumber++; } - - rational dottedDurationAsWholeNotes ( - int inputLineNumber) const; - - // visitors - // ------------------------------------------------------ - -/* JMI - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); -*/ - - public: - - // ------------------------------------------------------ - - //virtual - void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrDurationKind fDurationKind; - int fDotsNumber; -}; -EXP ostream& operator<< (ostream& os, const msrDottedDuration& elt); - -// semitone pitches and octave -// can be used as absolute, relative or fixed reference -//______________________________________________________________________________ -class msrSemiTonesPitchAndOctave : public smartable -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - msrSemiTonesPitchKind semiTonesPitchKind, - int octave); - - SMARTP createSemiTonesPitchAndOctaveNewbornClone (); - - // creation from a string - // ------------------------------------------------------ - - static SMARTP createFromString ( - int inputLineNumber, - string theString); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSemiTonesPitchAndOctave ( - msrSemiTonesPitchKind semiTonesPitchKind, - int octave); - - virtual ~msrSemiTonesPitchAndOctave (); - - public: - - // set and get - // ------------------------------------------------------ - - msrSemiTonesPitchKind getSemiTonesPitchKind () const - { return fSemiTonesPitchKind; } - - void incrementOctave () - { fOctave++; } - - void decrementOctave () - { fOctave--; } - - int getOctave () const - { return fOctave; } - - public: - - // services - // ------------------------------------------------------ - - string semiTonesPitchKindAsString () const; - string semiTonesPitchKindAsShortString () const; - - string asString () const; - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrSemiTonesPitchKind fSemiTonesPitchKind; - int fOctave; -}; -typedef SMARTP S_msrSemiTonesPitchAndOctave; -EXP ostream& operator<< (ostream& os, const S_msrSemiTonesPitchAndOctave& elt); - -// length units -//______________________________________________________________________________ - -enum msrLengthUnitKind { - kInchUnit, kCentimeterUnit, kMillimeterUnit }; - -string msrLengthUnitKindAsString ( - msrLengthUnitKind lengthUnitKind); - -string existingMsrLengthUnitKinds (int namesListMaxLength); - -extern map - gMsrLengthUnitKindsMap; - -void initializeMsrLengthUnitKindsMap (); - -// lengths -//______________________________________________________________________________ - -class msrLength : public smartable -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - msrLengthUnitKind lengthUnitKind, - float lengthValue); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrLength ( - msrLengthUnitKind lengthUnitKind, - float lengthValue); - - msrLength (); - - virtual ~msrLength (); - - public: - - // set and get - // ------------------------------------------------------ - - void setLengthUnitKind (msrLengthUnitKind value) - { fLengthUnitKind = value; } - - msrLengthUnitKind getLengthUnitKind () const - { return fLengthUnitKind; } - - void setLengthValue (float value) - { fLengthValue = value; } - - float getLengthValue () const - { return fLengthValue; }; - - public: - - // services - // ------------------------------------------------------ - - bool operator== ( - const msrLength& other) const - { - return - fLengthUnitKind == other.fLengthUnitKind - && - fLengthValue == other.fLengthValue; - } - - bool operator!= ( - const msrLength& other) const - { return ! ((*this) == other); } - - void convertToLengthUnit ( - msrLengthUnitKind lengthUnitKind); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrLengthUnitKind fLengthUnitKind; - - float fLengthValue; -}; -typedef SMARTP S_msrLength; -EXP ostream& operator<< (ostream& os, const S_msrLength& elt); - -// margins types -//______________________________________________________________________________ - -enum msrMarginTypeKind { - kOddMargin, kEvenMargin, kBothMargins }; - -string msrMarginTypeKindAsString ( - msrMarginTypeKind marginTypeKind); - -string existingMsrMarginTypeKinds (int namesListMaxLength); - -extern map - gMsrMarginTypeKindsMap; - -void initializeMsrMarginTypeKindsMap (); - -// margins -//______________________________________________________________________________ - -class msrMargin : public smartable -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - msrMarginTypeKind marginTypeKind, - msrLength marginLength); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrMargin ( - msrMarginTypeKind marginTypeKind, - msrLength marginLength); - - msrMargin (); - - virtual ~msrMargin (); - - public: - - // set and get - // ------------------------------------------------------ - - void setMarginTypeKind (msrMarginTypeKind& value) - { fMarginTypeKind = value; } - - msrMarginTypeKind getMarginTypeKind () const - { return fMarginTypeKind; } - - void setMarginLength (msrLength& value) - { fMarginLength = value; } - - msrLength getMarginLength () const - { return fMarginLength; }; - - public: - - // services - // ------------------------------------------------------ - - bool operator== ( - const msrMargin& other) const - { - return - fMarginTypeKind == other.fMarginTypeKind - && - fMarginLength == other.fMarginLength; - } - - bool operator!= ( - const msrMargin& other) const - { return ! ((*this) == other); } - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - - msrMarginTypeKind fMarginTypeKind; - msrLength fMarginLength; -}; -typedef SMARTP S_msrMargin; -EXP ostream& operator<< (ostream& os, const S_msrMargin& elt); - -// fonts -//______________________________________________________________________________ -class msrFontSize : public smartable -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrFontSizeKind { - kFontSizeNone, - kFontSizeXXSmall, kFontSizeXSmall, kFontSizeSmall, - kFontSizeMedium, - kFontSizeLarge, kFontSizeXLarge, kFontSizeXXLarge, - kFontSizeNumeric }; - - static string fontSizeKindAsString ( - msrFontSizeKind fontSizeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - msrFontSizeKind fontSizeKind); - - static SMARTP create ( - float fontNumericSize); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrFontSize ( - msrFontSizeKind fontSizeKind); - - msrFontSize ( - float numericFontSize); - - virtual ~msrFontSize (); - - public: - - // set and get - // ------------------------------------------------------ - - msrFontSizeKind getFontSizeKind () const - { return fFontSizeKind; } - - float getFontNumericSize (); - - // services - // ------------------------------------------------------ - - string fontSizeKindAsString () const; - - string fontSizeAsString () const; - - public: - - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrFontSizeKind fFontSizeKind; - - float fFontNumericSize; - // only relevant when - // fFontSizeKind == kNumericFontSize -}; -typedef SMARTP S_msrFontSize; -EXP ostream& operator<< (ostream& os, const S_msrFontSize& elt); - -enum msrFontStyleKind { - kFontStyleNone, - kFontStyleNormal, KFontStyleItalic }; - -msrFontStyleKind msrFontStyleKindFromString ( - int inputLineNumber, - string fontStyleString); - -string msrFontStyleKindAsString ( - msrFontStyleKind fontStyleKind); - -enum msrFontWeightKind { - kFontWeightNone, - kFontWeightNormal, kFontWeightBold }; - -msrFontWeightKind msrFontWeightKindFromString ( - int inputLineNumber, - string fontWeightString); - -string msrFontWeightKindAsString ( - msrFontWeightKind fontWeightKind); - -// alignement -//______________________________________________________________________________ -/* - The justify entity is used to indicate left, center, or - right justification. The default value varies for different - elements. For elements where the justify attribute is present - but the halign attribute is not, the justify attribute - indicates horizontal alignment as well as justification. -*/ - -enum msrJustifyKind { - kJustifyNone, - kJustifyLeft, kJustifyCenter, kJustifyRight }; - -msrJustifyKind msrJustifyKindFromString ( - int inputLineNumber, - string justifyString); - -string msrJustifyKindAsString ( - msrJustifyKind justifyKind); - -enum msrHorizontalAlignmentKind { - kHorizontalAlignmentNone, - kHorizontalAlignmentLeft, kHorizontalAlignmentCenter, kHorizontalAlignmentRight }; - -msrHorizontalAlignmentKind msrHorizontalAlignmentKindFromString ( - int inputLineNumber, - string horizontalAlignString); - -string msrHorizontalAlignmentKindAsString ( - msrHorizontalAlignmentKind horizontalAlignmentKind); - -enum msrVerticalAlignmentKind { - kVerticalAlignmentNone, - kVerticalAlignmentTop, kVerticalAlignmentMiddle, kVerticalAlignmentBottom }; - -msrVerticalAlignmentKind msrVerticalAlignmentKindFromString ( - int inputLineNumber, - string verticalAlignmentString); - -string msrVerticalAlignmentKindAsString ( - msrVerticalAlignmentKind verticalAlignmentKind); - -// direction -//______________________________________________________________________________ -enum msrDirectionKind { - kDirectionNone, - kDirectionUp, kDirectionDown }; - -string msrDirectionKindAsString ( - msrDirectionKind directionKind); - -// print object -//______________________________________________________________________________ -enum msrPrintObjectKind { - kPrintObjectNone, - kPrintObjectYes, kPrintObjectNo}; - -msrPrintObjectKind msrPrintObjectKindFromString ( - int inputLineNumber, - string printObjectString); - -string msrPrintObjectKindAsString ( - msrPrintObjectKind printObjectKind); - -// placement -//______________________________________________________________________________ -enum msrPlacementKind { - kPlacementNone, - kPlacementAbove, kPlacementBelow }; - -msrPlacementKind msrPlacementKindFromString ( - int inputLineNumber, - string placementString); - -string msrPlacementKindAsString ( - msrPlacementKind placementKind); - -// measure style -//______________________________________________________________________________ -enum msrSlashTypeKind { - k_NoSlashType, - kSlashTypeStart, kSlashTypeStop }; - -string msrSlashTypeKindAsString ( - msrSlashTypeKind slashTypeKind); - -enum msrUseDotsKind { - k_NoUseDots, - kUseDotsYes, kUseDotsNo }; - -msrUseDotsKind msrUseDotsFromString ( - int inputLineNumber, - string useDotsString); - -string msrUseDotsKindAsString ( - msrUseDotsKind useDotsKind); - -enum msrSlashUseStemsKind { - k_NoSlashUseStems, - kSlashUseStemsYes, kSlashUseStemsNo }; - -string msrSlashUseStemsKindAsString ( - msrSlashUseStemsKind slashUseStemsKind); - -// line types -//______________________________________________________________________________ -enum msrLineTypeKind { - kLineTypeSolid, kLineTypeDashed, - kLineTypeDotted, kLineTypeWavy }; - -string msrLineTypeKindAsString ( - msrLineTypeKind lineTypeKind); - -// tremolo types -//______________________________________________________________________________ -enum msrTremoloTypeKind { - k_NoTremoloType, - kTremoloTypeSingle, kTremoloTypeStart, kTremoloTypeStop }; - -string msrTremoloTypeKindAsString ( - msrTremoloTypeKind tremoloTypeKind); - -// technical types -//______________________________________________________________________________ -enum msrTechnicalTypeKind { // JMI ??? - k_NoTechnicalType, - kTechnicalTypeStart, kTechnicalTypeStop }; - -string msrTechnicalTypeKindAsString ( - msrTechnicalTypeKind technicalTypeKind); - -// spanner types -//______________________________________________________________________________ -enum msrSpannerTypeKind { - k_NoSpannerType, - kSpannerTypeStart, kSpannerTypeContinue, kSpannerTypeStop }; - -string msrSpannerTypeKindAsString ( - msrSpannerTypeKind spannerTypeKind); - -// tuplet factors -//______________________________________________________________________________ -class msrTupletFactor -{ - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrTupletFactor (); - - msrTupletFactor ( - int tupletActualNotes, - int tupletNormalNotes); - - msrTupletFactor ( - rational rationalTupletFactor); - - virtual ~msrTupletFactor (); - - public: - - // set and get - // ------------------------------------------------------ - - void setTupletActualNotes (int actualNotes) - { fTupletActualNotes = actualNotes; } - - int getTupletActualNotes () const - { return fTupletActualNotes; } - - void setTupletNormalNotes (int normalNotes) - { fTupletNormalNotes = normalNotes; } - - int getTupletNormalNotes () const - { return fTupletNormalNotes; } - - // services - // ------------------------------------------------------ - - bool isEqualToOne () const - { - return - fTupletActualNotes == fTupletNormalNotes; - } - - rational asRational () const - { - return - rational ( - fTupletActualNotes, - fTupletNormalNotes); - } - - // visitors - // ------------------------------------------------------ - -/* JMI - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); -*/ - - public: - - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fTupletActualNotes; - int fTupletNormalNotes; -}; -EXP ostream& operator<< (ostream& os, const msrTupletFactor& elt); - -// chords intervals -//______________________________________________________________________________ -class msrChordInterval; -typedef SMARTP S_msrChordInterval; - -class msrChordInterval : public smartable -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - msrIntervalKind chordIntervalIntervalKind, - int chordIntervalRelativeOctave = 0); - // 0: up to the thirteenth, - // no relative octave is needed - - SMARTP createChordIntervalNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrChordInterval ( - msrIntervalKind chordIntervalIntervalKind, - int chordIntervalRelativeOctave); - - virtual ~msrChordInterval (); - - public: - - // set and get - // ------------------------------------------------------ - - msrIntervalKind getChordIntervalIntervalKind () const - { return fChordIntervalIntervalKind; } - - void incrementChordIntervalRelativeOctave () - { fChordIntervalRelativeOctave++; } - - void decrementChordIntervalRelativeOctave () - { fChordIntervalRelativeOctave--; } - - int getChordIntervalRelativeOctave () const - { return fChordIntervalRelativeOctave; } - - // services - // ------------------------------------------------------ - - int chordIntervalAsSemitones () const - { - return - msrIntervalKindAsSemiTones ( - fChordIntervalIntervalKind); - } - - string chordIntervalIntervalKindAsString () const; - string chordIntervalIntervalKindAsShortString () const; - - string chordIntervalAsString () const; - string chordIntervalAsShortString () const; - - /* - we handle intervals up to the thirteenth in chords, - but operations on intervals are easier to compute - in a normal form limited to an octave, hence: - */ - void normalizeInterval (); - void deNormalizeInterval (); - - S_msrChordInterval intervalDifference ( - S_msrChordInterval otherChordInterval); - S_msrChordInterval intervalSum ( - S_msrChordInterval otherChordInterval); - - string asString () const; - string asShortString () const; - - // visitors - // ------------------------------------------------------ - -/* JMI - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); -*/ - - public: - - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrIntervalKind fChordIntervalIntervalKind; - - int fChordIntervalRelativeOctave; -}; -typedef SMARTP S_msrChordInterval; -EXP ostream& operator<< (ostream& os, const S_msrChordInterval& elt); - -// chords structure -//______________________________________________________________________________ -class msrChordStructure; -typedef SMARTP S_msrChordStructure; - -class msrChordStructure : public smartable -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP createBare ( - msrHarmonyKind chordStructureHarmonyKind); - - static SMARTP create ( - msrHarmonyKind chordStructureHarmonyKind); - - SMARTP createChordStructureNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrChordStructure ( - msrHarmonyKind chordStructureHarmonyKind); - - virtual ~msrChordStructure (); - - private: - - // initialization - // ------------------------------------------------------ - - public: - - // set and get - // ------------------------------------------------------ - - msrHarmonyKind getChordStructureHarmonyKind () const - { return fChordStructureHarmonyKind; } - - const vector & - getChordStructureIntervals () const - { return fChordStructureIntervals; } - - // services - // ------------------------------------------------------ - - void appendChordIntervalToChordStructure ( - S_msrChordInterval chordInterval); - - void populateChordStructure (); - - string chordStructureAsString () const; - string chordStructureAsShortString () const; - - S_msrChordInterval bassChordIntervalForChordInversion ( - int inputLineNumber, - int inversionNumber); - - S_msrChordStructure invertChordStructure (int inversion); - - static void printAllChordsStructures (ostream& os); - - // visitors - // ------------------------------------------------------ -/* JMI - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); -*/ - - public: - - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrHarmonyKind fChordStructureHarmonyKind; - vector - fChordStructureIntervals; -}; -typedef SMARTP S_msrChordStructure; -EXP ostream& operator<< (ostream& os, const S_msrChordStructure& elt); - -// chords contents -//______________________________________________________________________________ -class msrChordContents : public smartable -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - // JMI int inputLineNumber, - msrSemiTonesPitchKind chordContentsRootNote, - msrHarmonyKind chordContentsHarmonyKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrChordContents ( - // JMI int inputLineNumber, - msrSemiTonesPitchKind chordContentsRootNote, - msrHarmonyKind chordContentsHarmonyKind); - - virtual ~msrChordContents (); - - public: - - // set and get - // ------------------------------------------------------ - - msrSemiTonesPitchKind - getChordContentsRootNote () const - { return fChordContentsRootNote; } - - msrHarmonyKind getChordContentsHarmonyKind () const - { return fChordContentsHarmonyKind; } - - const vector& - getChordElementsVector () const - { return fChordElementsVector; } - - // services - // ------------------------------------------------------ - - string chordContentsAsString () const; - string chordContentsAsShortString () const; - - msrSemiTonesPitchKind bassSemiTonesPitchKindForChordInversion ( - int inputLineNumber, - int inversionNumber); - - static void printAllChordsContents ( - ostream& os, - msrSemiTonesPitchKind semiTonesPitchKind); - - // visitors - // ------------------------------------------------------ -/* JMI - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); -*/ - - public: - - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrSemiTonesPitchKind fChordContentsRootNote; - msrHarmonyKind fChordContentsHarmonyKind; - - vector - fChordElementsVector; -}; -typedef SMARTP S_msrChordContents; -EXP ostream& operator<< (ostream& os, const S_msrChordContents& elt); - -// chords details and analysis -//______________________________________________________________________________ -void printChordDetails ( - ostream& os, - msrSemiTonesPitchKind rootSemiTonesPitchKind, - msrHarmonyKind harmonyKind); - -void printChordAnalysis ( - ostream& os, - msrSemiTonesPitchKind rootSemiTonesPitchKind, - msrHarmonyKind harmonyKind, - int inversion); - -// RGB colors -//______________________________________________________________________________ -class msrRGBColor { - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrRGBColor (); - - msrRGBColor ( - float theR, - float theG, - float theB); - - msrRGBColor ( - std::string theString); - - // set and get - // ------------------------------------------------------ - - float getR () const - { return fR; } - - float getG () const - { return fG; } - - float getB () const - { return fB; } - - public: - - // services - // ------------------------------------------------------ - - bool isEmpty () const - { - return - fR < 0.0 - && - fG < 0.0 - && - fB < 0.0; - } - - public: - - // print - // ------------------------------------------------------ - - std::string asString () const; - - void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - float fR; - float fG; - float fB; -}; -EXP ostream& operator<< (ostream& os, const msrRGBColor& elt); - -// AlphaRGB colors -//______________________________________________________________________________ -class msrAlphaRGBColor -{ - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrAlphaRGBColor ( - string colorRGB, - string colorAlpha); - - msrAlphaRGBColor ( - string colorRGB); - - virtual ~msrAlphaRGBColor (); - - public: - - // set and get - // ------------------------------------------------------ - - string getColorRGB () const - { return fColorRGB; } - - string getColorAlpha () const - { return fColorAlpha; } - - // services - // ------------------------------------------------------ - - bool isEmpty () const - { - return - fColorRGB.size () == 0 - && - fColorAlpha.size () == 0; - } - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fColorRGB; // hexadecimal, 6 digits - string fColorAlpha; // hexadecimal, 2 digits -}; -EXP ostream& operator<< (ostream& os, const msrAlphaRGBColor& elt); - -// score notation kinds -//______________________________________________________________________________ -enum msrScoreNotationKind { - kScoreNotationWestern, - kScoreNotationJianpu, - kScoreNotationDiatonicAccordion }; - -string msrScoreNotationKindAsString ( - msrScoreNotationKind scoreNotationKind); - -// global variables -//______________________________________________________________________________ -extern map - gChordStructuresMap; - -void initializeChordStructuresMap (); - -void printChordStructuresMap (); - -extern map - gQuarterTonesPitchesLanguageKindsMap; - -extern map gNederlandsPitchNamesMap; -extern map gCatalanPitchNamesMap; -extern map gDeutschPitchNamesMap; -extern map gEnglishPitchNamesMap; -extern map gEspanolPitchNamesMap; -extern map gFrancaisPitchNamesMap; -extern map gItalianoPitchNamesMap; -extern map gNorskPitchNamesMap; -extern map gPortuguesPitchNamesMap; -extern map gSuomiPitchNamesMap; -extern map gSvenskaPitchNamesMap; -extern map gVlaamsPitchNamesMap; - -void initializeQuarterTonesPitchesLanguageKinds (); - -string existingQuarterTonesPitchesLanguageKinds (int namesListMaxLength); - -// initialization -//______________________________________________________________________________ -void initializeMSRBasicTypes (); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrBeams.cpp b/src/lilypond/msrBeams.cpp deleted file mode 100644 index 1cfb65cfd..000000000 --- a/src/lilypond/msrBeams.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrBeams.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrBeam msrBeam::create ( - int inputLineNumber, - int number, - msrBeamKind beamKind) -{ - msrBeam* o = - new msrBeam ( - inputLineNumber, number, beamKind); - assert(o!=0); - return o; -} - -msrBeam::msrBeam ( - int inputLineNumber, - int number, - msrBeamKind beamKind) - : msrElement (inputLineNumber) -{ - fBeamNumber = number; - fBeamKind = beamKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeams) { - gLogOstream << - "Creating beam '" << - this->asString () << - "'" << - endl; - } -#endif -} - -msrBeam::~msrBeam () -{} - -void msrBeam::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeam::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeam elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeam::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBeam::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeam::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeam elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeam::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBeam::browseData (basevisitor* v) -{} - -string msrBeam::beamKindAsString ( - msrBeamKind beamKind) -{ - string result; - - switch (beamKind) { - case kBeginBeam: - result = "begin"; - break; - case kContinueBeam: - result = "continue"; - break; - case kEndBeam: - result = "end"; - break; - case kForwardHookBeam: - result = "forward"; - break; - case kBackwardHookBeam: - result = "backward"; - break; - case k_NoBeam: - result = "### none ###"; - break; - } // switch - - return result; -} - -string msrBeam::asString () const -{ - stringstream s; - - s << - "Beam" << - " " << beamKindAsString (fBeamKind) << - ", number " << fBeamNumber << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrBeam::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrBeam& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrBeams.h b/src/lilypond/msrBeams.h deleted file mode 100644 index 54496ea6e..000000000 --- a/src/lilypond/msrBeams.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrBeams___ -#define ___msrBeams___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrBeam : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrBeamKind { - k_NoBeam, - kBeginBeam, kContinueBeam, kEndBeam, - kForwardHookBeam, kBackwardHookBeam}; - - static string beamKindAsString ( - msrBeamKind beamKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int number, - msrBeamKind beamKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrBeam ( - int inputLineNumber, - int number, - msrBeamKind beamKind); - - virtual ~msrBeam (); - - public: - - // set and get - // ------------------------------------------------------ - - msrBeamKind getBeamKind () const - { return fBeamKind; } - - int getBeamNumber () const - { return fBeamNumber; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fBeamNumber; - msrBeamKind fBeamKind; -}; -typedef SMARTP S_msrBeam; -EXP ostream& operator<< (ostream& os, const S_msrBeam& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrBeatsRepeats.cpp b/src/lilypond/msrBeatsRepeats.cpp deleted file mode 100644 index 399bd91c8..000000000 --- a/src/lilypond/msrBeatsRepeats.cpp +++ /dev/null @@ -1,1191 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -/* JMI -//______________________________________________________________________________ -S_msrBeatsRepeatElement msrBeatsRepeatElement::create ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink) -{ - msrBeatsRepeatElement* o = - new msrBeatsRepeatElement ( - inputLineNumber, - beatsRepeatUpLink); - assert(o!=0); - return o; -} - -msrBeatsRepeatElement::msrBeatsRepeatElement ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - beatsRepeatUpLink != nullptr, - "beatsRepeatUpLink is null"); - - fBeatsRepeatElementBeatsRepeatUpLink = beatsRepeatUpLink; -} - -msrBeatsRepeatElement::~msrBeatsRepeatElement () -{} - -void msrBeatsRepeatElement::appendSegmentToBeatsRepeatElementsList ( // JMI ??? - int inputLineNumber, - S_msrSegment segment, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending segment '" << segment << - "' to beatsRepeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - segment != nullptr, - "segment is null"); - - fBeatsRepeatElementElementsList.push_back (segment); -} - -void msrBeatsRepeatElement::appendBeatsRepeatToBeatsRepeatElementsList ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending beatsRepeat '" << beatsRepeat << - "' to beatsRepeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - beatsRepeat != nullptr, - "beatsRepeat is null"); - - fBeatsRepeatElementElementsList.push_back (beatsRepeat); -} - -void msrBeatsRepeatElement::appendVoiceElementToBeatsRepeatElementsList ( - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending voice element '" << voiceElement << - "' to beatsRepeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - voiceElement != nullptr, - "voiceElement is null"); - - fBeatsRepeatElementElementsList.push_back (voiceElement); -} - -S_msrNote msrBeatsRepeatElement::fetchBeatsRepeatElementFirstNonGraceNote () const -{ - - S_msrNote result; - - // fetch the first note in the first measure to which - // a grace notes group can be attached - // i.e. one not in a grace notes group itself, - // possibly inside a chord or tuplet - - if (fBeatsRepeatElementElementsList.size ()) { - list::const_iterator - iBegin = fBeatsRepeatElementElementsList.begin (), - iEnd = fBeatsRepeatElementElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrVoiceElement element = (*i); - - if ( - S_msrNote note = dynamic_cast(&(*element)) - ) { - result = note; - break; - } - - else if ( - S_msrChord chord = dynamic_cast(&(*element)) - ) { - // get the chord's first note - result = chord->fetchChordFirstNonGraceNote (); - break; - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*element)) - ) { - // get the tuplet's first note - result = tuplet->fetchTupletFirstNonGraceNote (); - break; - } - - else if ( - S_msrClef clef = dynamic_cast(&(*element)) - ) { - // ignore this clef - } - - else if ( - S_msrKey key = dynamic_cast(&(*element)) - ) { - // ignore this key - } - - else if ( - S_msrTime time = dynamic_cast(&(*element)) - ) { - // ignore this time - } - - else { - stringstream s; - - s << - "tuplet first element should be a note, a chord or another tuplet, found instead '" << - element->asShortString () << - "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (++i == iEnd) break; - } // for - } - - return result; -} - -void msrBeatsRepeatElement::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatElement::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeatElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeatElement::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBeatsRepeatElement::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatElement::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeatElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeatElement::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBeatsRepeatElement::browseData (basevisitor* v) -{ - // browse the elements - if (fBeatsRepeatElementElementsList.size ()) { - for ( - list::const_iterator i = fBeatsRepeatElementElementsList.begin (); - i != fBeatsRepeatElementElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrBeatsRepeatElement::asString () const -{ - stringstream s; - - s << - "BeatsRepeatElement" << - ", beatsRepeat upLink: '" << - fBeatsRepeatElementBeatsRepeatUpLink-> - asShortString () << - "', line " << fInputLineNumber << - endl; - - return s.str (); -} - -void msrBeatsRepeatElement::print (ostream& os) const -{ - os << - "BeatsRepeatElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << - "beatsRepeat upLink: '" << - fBeatsRepeatElementBeatsRepeatUpLink-> - asShortString () << - "'" << - endl << - endl; - - // print the elements - int elementsNumber = - fBeatsRepeatElementElementsList.size (); - - os << - "beatsRepeatElementElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fBeatsRepeatElementElementsList.begin (), - iEnd = fBeatsRepeatElementElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrBeatsRepeatElement::shortPrint (ostream& os) -{ - os << - "BeatsRepeatElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - -/ / * JMI - os << - "beatsRepeat upLink: '" << - fBeatsRepeatElementBeatsRepeatUpLink-> - asShortString () << - "'" << - endl; -* / - - // print the elements - int elementsNumber = - fBeatsRepeatElementElementsList.size (); - - os << - "repeatElementElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fBeatsRepeatElementElementsList.begin (), - iEnd = fBeatsRepeatElementElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - (*i)->shortPrint (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrBeatsRepeatElement& elt) -{ - elt->print (os); - return os; -} -*/ - -//______________________________________________________________________________ -S_msrBeatsRepeatPattern msrBeatsRepeatPattern::create ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink) -{ - msrBeatsRepeatPattern* o = - new msrBeatsRepeatPattern ( - inputLineNumber, - beatsRepeatUpLink); - assert(o!=0); - return o; -} - -msrBeatsRepeatPattern::msrBeatsRepeatPattern ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - beatsRepeatUpLink != nullptr, - "beatsRepeatUpLink is null"); - - fBeatsRepeatUpLink = beatsRepeatUpLink; -} - -msrBeatsRepeatPattern::~msrBeatsRepeatPattern () -{} - -void msrBeatsRepeatPattern::setBeatsRepeatPatternSegment ( - S_msrSegment beatsRepeatPatternSegment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeatsRepeats) { - gLogOstream << - "Setting measures repeat pattern segment containing " << - singularOrPlural ( - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - beatsRepeatPatternSegment != nullptr, - "beatsRepeatPatternSegment is null"); - - fBeatsRepeatPatternSegment = - beatsRepeatPatternSegment; -} - -int msrBeatsRepeatPattern::fetchMeasuresNumber () const -{ - int result; - - if (fBeatsRepeatPatternSegment) { - result = - fBeatsRepeatPatternSegment-> - getSegmentMeasuresList ().size (); - } - else { - result = 0; - } - - return result; -} - -void msrBeatsRepeatPattern::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatPattern::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeatPattern elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeatPattern::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBeatsRepeatPattern::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatPattern::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeatPattern elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeatPattern::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBeatsRepeatPattern::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatPattern::browseData ()" << - endl; - } - - if (fBeatsRepeatPatternSegment) { - // browse the pattern segment - msrBrowser browser (v); - browser.browse (*fBeatsRepeatPatternSegment); - } -} - -string msrBeatsRepeatPattern::asString () const -{ - stringstream s; - - s << - - "BeatsRepeatPattern" << - ", line " << fInputLineNumber << - " (" << - singularOrPlural ( - fetchMeasuresNumber (), - "repeated measure", - "repeated measures") << - ")"; - - return s.str (); -} - -void msrBeatsRepeatPattern::print (ostream& os) const -{ - os << - endl << - asString () << - endl << - endl; - - gIndenter++; - - // print the pattern segment - os << - "Pattern segment:"; - - if (! fBeatsRepeatPatternSegment) { - os << - " none" << - endl; - } - else { - os << endl; - - gIndenter++; - - os << - fBeatsRepeatPatternSegment; - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrBeatsRepeatPattern& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrBeatsRepeatReplicas msrBeatsRepeatReplicas::create ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink) -{ - msrBeatsRepeatReplicas* o = - new msrBeatsRepeatReplicas ( - inputLineNumber, - beatsRepeatUpLink); - assert(o!=0); - return o; -} - -msrBeatsRepeatReplicas::msrBeatsRepeatReplicas ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - beatsRepeatUpLink != nullptr, - "beatsRepeatUpLink is null"); - - fBeatsRepeatUpLink = beatsRepeatUpLink; -} - -msrBeatsRepeatReplicas::~msrBeatsRepeatReplicas () -{} - -void msrBeatsRepeatReplicas::setBeatsRepeatReplicasSegment ( - S_msrSegment beatsRepeatReplicasSegment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeatsRepeats) { - gLogOstream << - "Setting measures repeat replicas segment containing " << - singularOrPlural ( - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - beatsRepeatReplicasSegment != nullptr, - "beatsRepeatReplicasSegment is null"); - - fBeatsRepeatReplicasSegment = - beatsRepeatReplicasSegment; -} - -int msrBeatsRepeatReplicas::fetchMeasuresNumber () const -{ - int result; - - if (fBeatsRepeatReplicasSegment) { - result = - fBeatsRepeatReplicasSegment-> - getSegmentMeasuresList ().size (); - } - else { - result = 0; - } - - return result; -} - -void msrBeatsRepeatReplicas::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatReplicas::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeatReplicas elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeatReplicas::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBeatsRepeatReplicas::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatReplicas::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeatReplicas elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeatReplicas::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBeatsRepeatReplicas::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeatReplicas::browseData ()" << - endl; - } - - if (fBeatsRepeatReplicasSegment) { - // browse the replicas segment - msrBrowser browser (v); - browser.browse (*fBeatsRepeatReplicasSegment); - } -} - -string msrBeatsRepeatReplicas::asString () const -{ - stringstream s; - - s << - - "BeatsRepeatReplicas" << - ", line " << fInputLineNumber << - " (" << - singularOrPlural ( - fetchMeasuresNumber (), - "replicas measure", - "replicas measures") << - ")"; - - return s.str (); -} - -void msrBeatsRepeatReplicas::print (ostream& os) const -{ - os << - endl << - asString () << - endl << - endl; - - gIndenter++; - - // print the replicas segment - os << - "Replicas segment:"; - - if (! fBeatsRepeatReplicasSegment) { - os << - " none" << - endl; - } - else { - os << endl; - - gIndenter++; - - os << - fBeatsRepeatReplicasSegment; - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrBeatsRepeatReplicas& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrBeatsRepeat msrBeatsRepeat::create ( - int inputLineNumber, - int beatsRepeatMeasuresNumber, - int beatsRepeatSlashesNumber, - S_msrVoice voiceUpLink) -{ - msrBeatsRepeat* o = - new msrBeatsRepeat ( - inputLineNumber, - beatsRepeatMeasuresNumber, - beatsRepeatSlashesNumber, - voiceUpLink); - assert(o!=0); - return o; -} - -msrBeatsRepeat::msrBeatsRepeat ( - int inputLineNumber, - int beatsRepeatMeasuresNumber, - int beatsRepeatSlashesNumber, - S_msrVoice voiceUpLink) - : msrVoiceElement (inputLineNumber) -{ - // sanity check - msrAssert ( - beatsRepeatMeasuresNumber > 0, - "beatsRepeatMeasuresNumber is not positive"); - - fBeatsRepeatMeasuresNumber = beatsRepeatMeasuresNumber; - - // sanity check - msrAssert ( - beatsRepeatSlashesNumber > 0, - "beatsRepeatSlashesNumber is not positive"); - - fBeatsRepeatSlashesNumber = beatsRepeatSlashesNumber; - - fBeatsRepeatVoiceUpLink = voiceUpLink; - - // measures repeat build phase - fCurrentBeatsRepeatBuildPhaseKind = - msrBeatsRepeat::kBeatsRepeatBuildPhaseJustCreated; -} - -msrBeatsRepeat::~msrBeatsRepeat () -{} - -S_msrBeatsRepeat msrBeatsRepeat::createBeatsRepeatNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeatsRepeats) { - gLogOstream << - "Creating a newborn clone of measures repeat '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrBeatsRepeat - newbornClone = - msrBeatsRepeat::create ( - fInputLineNumber, - fBeatsRepeatMeasuresNumber, - fBeatsRepeatSlashesNumber, - containingVoice); - - return newbornClone; -} - -void msrBeatsRepeat::setBeatsRepeatPattern ( - S_msrBeatsRepeatPattern beatsRepeatPattern) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeatsRepeats) { - gLogOstream << - "Setting measures repeat pattern containing " << - singularOrPlural ( - beatsRepeatPattern-> - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - beatsRepeatPattern != nullptr, - "beatsRepeatPattern is null"); - - fBeatsRepeatPattern = beatsRepeatPattern; - - // set currentRepeat's build phase - fCurrentBeatsRepeatBuildPhaseKind = - msrBeatsRepeat::kBeatsRepeatBuildPhaseInPattern; -} - -void msrBeatsRepeat::setBeatsRepeatReplicas ( - S_msrBeatsRepeatReplicas beatsRepeatReplicas) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeatsRepeats) { - gLogOstream << - "Setting measures repeat replicas containing " << - singularOrPlural ( - beatsRepeatReplicas-> - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - beatsRepeatReplicas != nullptr, - "beatsRepeatReplicas is null"); - - fBeatsRepeatReplicas = beatsRepeatReplicas; - - // set currentRepeat's build phase - fCurrentBeatsRepeatBuildPhaseKind = - msrBeatsRepeat::kBeatsRepeatBuildPhaseInReplicas; -} - -int msrBeatsRepeat::fetchBeatsRepeatReplicasNumber () const -{ - int patternMeasuresNumber = - fetchBeatsRepeatPatternMeasuresNumber (); - - // sanity check - msrAssert ( - patternMeasuresNumber > 0, - "patternMeasuresNumber is not positive"); - - return - fetchBeatsRepeatReplicasMeasuresNumber () - / // JMI ??? - patternMeasuresNumber; -} - -int msrBeatsRepeat::fetchBeatsRepeatPatternMeasuresNumber () const -{ - // sanity check - msrAssert ( - fBeatsRepeatPattern != nullptr, - "fBeatsRepeatPattern is null"); - - return - fBeatsRepeatPattern-> - fetchMeasuresNumber (); -} - -int msrBeatsRepeat::fetchBeatsRepeatReplicasMeasuresNumber () const -{ - // sanity check - msrAssert ( - fBeatsRepeatReplicas != nullptr, - "fBeatsRepeatReplicas is null"); - - return - fBeatsRepeatReplicas-> - fetchMeasuresNumber (); -} - -void msrBeatsRepeat::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeat::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeat::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrBeatsRepeat::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeat::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrBeatsRepeat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrBeatsRepeat::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrBeatsRepeat::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrBeatsRepeat::browseData ()" << - endl; - } - - if (fBeatsRepeatPattern) { - // browse the measdure repeat pattern - msrBrowser browser (v); - browser.browse (*fBeatsRepeatPattern); - } - - // fetch the score - S_msrScore - score = - fBeatsRepeatVoiceUpLink-> - fetchVoicePartUpLink ()-> - getPartPartGroupUpLink ()-> - getPartGroupScoreUpLink (); - -/* JMI - bool inhibitBeatsRepeatReplicasBrowsing = - score->getInhibitBeatsRepeatReplicasBrowsing (); - - if (inhibitBeatsRepeatReplicasBrowsing) { -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors || gTraceOah->fTraceBeatsRepeats) { - gLogOstream << - "% ==> visiting measures repeat replicas is inhibited" << - endl; - } -#endif - } - - if (fBeatsRepeatReplicas) { - if (! inhibitBeatsRepeatReplicasBrowsing) { - // browse the measures repeat replicas - msrBrowser browser (v); - browser.browse (*fBeatsRepeatReplicas); - } - } - */ -} - -string msrBeatsRepeat::beatsRepeatBuildPhaseKindAsString ( - msrBeatsRepeatBuildPhaseKind beatsRepeatBuildPhaseKind) -{ - string result; - - switch (beatsRepeatBuildPhaseKind) { - case msrBeatsRepeat::kBeatsRepeatBuildPhaseJustCreated: - result = "beatsRepeatBuildPhaseJustCreated"; - break; - case msrBeatsRepeat::kBeatsRepeatBuildPhaseInPattern: - result = "beatsRepeatBuildPhaseInPattern"; - break; - case msrBeatsRepeat::kBeatsRepeatBuildPhaseInReplicas: - result = "beatsRepeatBuildPhaseInReplicas"; - break; - case msrBeatsRepeat::kBeatsRepeatBuildPhaseCompleted: - result = "beatsRepeatBuildPhaseCompleted"; - break; - } // switch - - return result; -} - -string msrBeatsRepeat::asString () const -{ - stringstream s; - - s << - - "BeatsRepeat" << - ", line " << fInputLineNumber << - " (" << - singularOrPlural ( - fetchBeatsRepeatPatternMeasuresNumber (), - "repeated measure", - "repeated measures") << - ", " << - singularOrPlural ( - fetchBeatsRepeatReplicasMeasuresNumber (), - "replicas measure", - "replicas measures") << - ", " << - fetchBeatsRepeatReplicasNumber () << " replicas" << - ")"; - - return s.str (); -} - -void msrBeatsRepeat::displayBeatsRepeat ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - "*********>> BeatsRepeat " << - ", beatsRepeatMeasuresNumber: '" << - fBeatsRepeatMeasuresNumber << - ", beatsRepeatSlashesNumber: '" << - fBeatsRepeatSlashesNumber << - "', voice:" << - endl << - fBeatsRepeatVoiceUpLink->getVoiceName () << - " (" << context << ")" << - ", line " << inputLineNumber << - " contains:" << - endl; - - gIndenter++; - print (gLogOstream); - gIndenter--; - - gLogOstream << - "<<*********" << - endl << - endl; -} - -void msrBeatsRepeat::print (ostream& os) const -{ - os << - "BeatsRepeat" << - " (" << - singularOrPlural ( - fBeatsRepeatPattern - ? fetchBeatsRepeatPatternMeasuresNumber () - : 0, - "pattern measure", - "pattern measures") << - ", " << - singularOrPlural ( - fBeatsRepeatReplicas - ? fetchBeatsRepeatReplicasMeasuresNumber () - : 0, - "replica measure", - "replicas measures") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeatsRepeats) { - // print the current measures repeat build phase - const int fieldWidth = 36; - - os << - setw (fieldWidth) << - "currentBeatsRepeatBuildPhaseKind" << " : " << - beatsRepeatBuildPhaseKindAsString ( - fCurrentBeatsRepeatBuildPhaseKind) << - endl; - } -#endif - - // print the measures repeat pattern - if (! fBeatsRepeatPattern) { - os << - "measures repeat pattern: none" << - endl; - } - - else { - os << - fBeatsRepeatPattern; - } - - // print the measures repeat replicas - if (! fBeatsRepeatReplicas) { - os << - "measures repeat replicas: none" << - endl; - } - - else { - os << - fBeatsRepeatReplicas; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrBeatsRepeat& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrBeatsRepeats_MUT_DEP.h b/src/lilypond/msrBeatsRepeats_MUT_DEP.h deleted file mode 100644 index 2b7c05ab0..000000000 --- a/src/lilypond/msrBeatsRepeats_MUT_DEP.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrBeatsRepeatPattern : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink); - - /* JMI - SMARTP createBeatsRepeatPatternNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createBeatsRepeatPatternDeepCopy ( - S_msrVoice containingVoice); -*/ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrBeatsRepeatPattern ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink); - - virtual ~msrBeatsRepeatPattern (); - - public: - - // set and get - // ------------------------------------------------------ - - // segment - void setBeatsRepeatPatternSegment ( - S_msrSegment beatsRepeatPatternSegment); - - S_msrSegment getBeatsRepeatPatternSegment () const - { return fBeatsRepeatPatternSegment; } - - // upLinks - S_msrBeatsRepeat getBeatsRepeatUpLink () const - { return fBeatsRepeatUpLink; } - - // services - // ------------------------------------------------------ - - int fetchMeasuresNumber () const; - - void collectRepeatPatternMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrBeatsRepeat fBeatsRepeatUpLink; - - // segment - S_msrSegment fBeatsRepeatPatternSegment; -}; -typedef SMARTP S_msrBeatsRepeatPattern; -EXP ostream& operator<< (ostream& os, const S_msrBeatsRepeatPattern& elt); - -//______________________________________________________________________________ -class msrBeatsRepeatReplicas : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink); - - /* JMI - SMARTP createBeatsRepeatReplicasNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createBeatsRepeatReplicasDeepCopy ( - S_msrVoice containingVoice); - */ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrBeatsRepeatReplicas ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeatUpLink); - - virtual ~msrBeatsRepeatReplicas (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrBeatsRepeat getBeatsRepeatUpLink () const - { return fBeatsRepeatUpLink; } - // segment - void setBeatsRepeatReplicasSegment ( - S_msrSegment beatsRepeatReplicasSegment); - - S_msrSegment getBeatsRepeatReplicasSegment () const - { return fBeatsRepeatReplicasSegment; } - - // services - // ------------------------------------------------------ - - int fetchMeasuresNumber () const; - - int fetchBeatsRepeatReplicasNumber () const; - - void collectRepeatReplicasMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrBeatsRepeat fBeatsRepeatUpLink; - - // segment - S_msrSegment fBeatsRepeatReplicasSegment; -}; -typedef SMARTP S_msrBeatsRepeatReplicas; -EXP ostream& operator<< (ostream& os, const S_msrBeatsRepeatReplicas& elt); - -//______________________________________________________________________________ -class msrBeatsRepeat : public msrVoiceElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrBeatsRepeatKind { - k_NoBeatsRepeat, - kStartBeatsRepeat, kStopBeatsRepeat }; - - static string beatsRepeatKindAsString ( - msrBeatsRepeatKind beatsRepeatKind); - - enum msrBeatsRepeatBuildPhaseKind { - kBeatsRepeatBuildPhaseJustCreated, - kBeatsRepeatBuildPhaseInPattern, - kBeatsRepeatBuildPhaseInReplicas, - kBeatsRepeatBuildPhaseCompleted}; - - static string beatsRepeatBuildPhaseKindAsString ( - msrBeatsRepeatBuildPhaseKind beatsRepeatBuildPhaseKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int beatsRepeatMeasuresNumber, - int beatsRepeatSlashesNumber, - S_msrVoice voiceUpLink); - - SMARTP createBeatsRepeatNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createBeatsRepeatDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrBeatsRepeat ( - int inputLineNumber, - int beatsRepeatMeasuresNumber, - int beatsRepeatSlashesNumber, - S_msrVoice voiceUpLink); - - virtual ~msrBeatsRepeat (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrVoice getBeatsRepeatVoiceUpLink () const - { return fBeatsRepeatVoiceUpLink; } - - // numbers - int getBeatsRepeatMeasuresNumber () const - { return fBeatsRepeatMeasuresNumber; } - - int getBeatsRepeatSlashesNumber () const - { return fBeatsRepeatSlashesNumber; } - - // beatsRepeat pattern - void setBeatsRepeatPattern ( - S_msrBeatsRepeatPattern - beatsRepeatPattern); - - S_msrBeatsRepeatPattern - getBeatsRepeatPattern () const - { return fBeatsRepeatPattern; } - - // measures repeat replicas - void setBeatsRepeatReplicas ( - S_msrBeatsRepeatReplicas - beatsRepeatReplicas); - - S_msrBeatsRepeatReplicas - getBeatsRepeatReplicas () const - { return fBeatsRepeatReplicas; } - - // measures repeat build phase - void setCurrentBeatsRepeatBuildPhaseKind ( - msrBeatsRepeatBuildPhaseKind - beatsRepeatBuildPhaseKind) - { - fCurrentBeatsRepeatBuildPhaseKind = - beatsRepeatBuildPhaseKind; - } - - msrBeatsRepeatBuildPhaseKind - getCurrentBeatsRepeatBuildPhaseKind () const - { return fCurrentBeatsRepeatBuildPhaseKind; } - - // services - // ------------------------------------------------------ - - int fetchBeatsRepeatReplicasNumber () const; - - int fetchBeatsRepeatPatternMeasuresNumber () const; - int fetchBeatsRepeatReplicasMeasuresNumber () const; - - void collectBeatsRepeatMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - void displayBeatsRepeat ( - int inputLineNumber, - string context); - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fBeatsRepeatVoiceUpLink; - - // numbers - int fBeatsRepeatMeasuresNumber; - int fBeatsRepeatSlashesNumber; - - // measures repeat pattern - S_msrBeatsRepeatPattern - fBeatsRepeatPattern; - - // measures repeat replicas - S_msrBeatsRepeatReplicas - fBeatsRepeatReplicas; - - // measures repeat build phase, used when building the measures repeat - msrBeatsRepeatBuildPhaseKind - fCurrentBeatsRepeatBuildPhaseKind; -}; -typedef SMARTP S_msrBeatsRepeat; -EXP ostream& operator<< (ostream& os, const S_msrBeatsRepeat& elt); - diff --git a/src/lilypond/msrBreaks.cpp b/src/lilypond/msrBreaks.cpp deleted file mode 100644 index 312b1ef2a..000000000 --- a/src/lilypond/msrBreaks.cpp +++ /dev/null @@ -1,231 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrBreaks.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrLineBreak msrLineBreak::create ( - int inputLineNumber, - string nextBarNumber) -{ - msrLineBreak* o = - new msrLineBreak ( - inputLineNumber, nextBarNumber); - assert(o!=0); - return o; -} - -msrLineBreak::msrLineBreak ( - int inputLineNumber, - string nextBarNumber) - : msrMeasureElement (inputLineNumber) -{ - fNextBarNumber = nextBarNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating a break before measure " << fNextBarNumber << - endl; - } -#endif -} - -msrLineBreak::~msrLineBreak () -{} - -string msrLineBreak::asString () const -{ - stringstream s; - - s << - "Line break" << - ", nextBarNumber = \"" << fNextBarNumber << "\""; - - return s.str (); -} - -void msrLineBreak::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrLineBreak::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrLineBreak elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrLineBreak::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrLineBreak::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrLineBreak::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrLineBreak elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrLineBreak::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrLineBreak::browseData (basevisitor* v) -{} - -void msrLineBreak::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrLineBreak& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrPageBreak msrPageBreak::create ( - int inputLineNumber) -{ - msrPageBreak* o = - new msrPageBreak ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrPageBreak::msrPageBreak ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating a page break" << - endl; - } -#endif -} - -msrPageBreak::~msrPageBreak () -{} - -string msrPageBreak::asString () const -{ - stringstream s; - - s << - "Page break"; - - return s.str (); -} - -void msrPageBreak::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPageBreak::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPageBreak elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPageBreak::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPageBreak::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPageBreak::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPageBreak elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPageBreak::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrPageBreak::browseData (basevisitor* v) -{} - -void msrPageBreak::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrPageBreak& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrBreaks.h b/src/lilypond/msrBreaks.h deleted file mode 100644 index 07c8d16e9..000000000 --- a/src/lilypond/msrBreaks.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrBreaks___ -#define ___msrBreaks___ - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrLineBreak : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string nextBarNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrLineBreak ( - int inputLineNumber, - string nextBarNumber); - - virtual ~msrLineBreak (); - - public: - - // set and get - // ------------------------------------------------------ - - string getNextBarNumber () const - { return fNextBarNumber; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fNextBarNumber; -}; -typedef SMARTP S_msrLineBreak; -EXP ostream& operator<< (ostream& os, const S_msrLineBreak& elt); - -//______________________________________________________________________________ -class msrPageBreak : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPageBreak ( - int inputLineNumber); - - virtual ~msrPageBreak (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_msrPageBreak; -EXP ostream& operator<< (ostream& os, const S_msrPageBreak& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrChords.cpp b/src/lilypond/msrChords.cpp deleted file mode 100644 index e20f30a53..000000000 --- a/src/lilypond/msrChords.cpp +++ /dev/null @@ -1,1606 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrChord msrChord::create ( - int inputLineNumber, - rational chordSoundingWholeNotes, - rational chordDisplayWholeNotes, - msrDurationKind chordGraphicDurationKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Creating a chord" << - ", chordSoundingWholeNotes = " << chordSoundingWholeNotes << - ", chordDisplayWholeNotes = " << chordDisplayWholeNotes << - ", chordGraphicDuration = " << - msrDurationKindAsString (chordGraphicDurationKind) << - endl; - } -#endif - - msrChord* o = - new msrChord ( - inputLineNumber, - chordSoundingWholeNotes, chordDisplayWholeNotes, - chordGraphicDurationKind); - assert(o!=0); - - return o; -} - -msrChord::msrChord ( - int inputLineNumber, - rational chordSoundingWholeNotes, - rational chordDisplayWholeNotes, - msrDurationKind chordGraphicDurationKind) - : msrTupletElement (inputLineNumber) -{ -// JMI fChordSoundingWholeNotes = chordSoundingWholeNotes; - fMeasureElementSoundingWholeNotes = chordSoundingWholeNotes; - - fChordDisplayWholeNotes = chordDisplayWholeNotes; - - fChordGraphicDurationKind = chordGraphicDurationKind; - - fChordIsFirstChordInADoubleTremolo = false; - fChordIsSecondChordInADoubleTremolo = false; -} - -msrChord::~msrChord () -{} - -S_msrChord msrChord::createChordNewbornClone ( - S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Creating a newborn clone of chord '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - - S_msrChord - newbornClone = - msrChord::create ( - fInputLineNumber, - // JMI fChordSoundingWholeNotes, - fMeasureElementSoundingWholeNotes, - fChordDisplayWholeNotes, - fChordGraphicDurationKind); - -/* - newbornClone-> - fChordPositionInMeasure = - fChordPositionInMeasure; - - newbornClone-> - fChordIsFirstChordInADoubleTremolo = - fChordIsFirstChordInADoubleTremolo; - - newbornClone-> - fChordIsSecondChordInADoubleTremolo = - fChordIsSecondChordInADoubleTremolo; -*/ - - return newbornClone; -} - -void msrChord::setChordSoundingWholeNotes ( - rational wholeNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Setting chord sounding whole notes to '" << - wholeNotes << - "' for chord '" << - asString () << - "'" << - endl; - } -#endif - -// JMI fChordSoundingWholeNotes = wholeNotes; - fMeasureElementSoundingWholeNotes = wholeNotes; -} - -void msrChord::setChordDisplayWholeNotes ( - rational wholeNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Setting chord displayed whole notes to '" << - wholeNotes << - "' for chord '" << - asString () << - "'" << - endl; - } -#endif - - fChordDisplayWholeNotes = wholeNotes; -} - -void msrChord::setChordMembersPositionInMeasure ( - S_msrMeasure measure, - rational positionInMeasure) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Setting chord members position in measure of " << asString () << - " to '" << - positionInMeasure << - "'" << - endl; - } -#endif - - msrMeasureElement::setMeasureElementPositionInMeasure ( - positionInMeasure, - "setChordMembersPositionInMeasure()"); - - // set the chord's elements' position in measure - if (fChordNotesVector.size ()) { - vector::const_iterator - iBegin = fChordNotesVector.begin (), - iEnd = fChordNotesVector.end (), - i = iBegin; - for ( ; ; ) { - S_msrNote - note = (*i); - - note-> - setNoteMeasureUpLink ( - measure); - - note-> - setNotePositionInMeasure ( - positionInMeasure); // they all share the same one - - if (++i == iEnd) break; - } // for - } -} - -void msrChord::addFirstNoteToChord ( - S_msrNote note, - S_msrVoice voice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Adding first note '" << - note->asString () << - "' to chord '" << - asString () << - "'" << - endl; - } -#endif - - // append note to chord notes - fChordNotesVector.push_back (note); - - // register note's chord upLink - note-> - setNoteChordUpLink (this); - - // mark note as belonging to a chord - note->setNoteBelongsToAChord (); - - // mark note as being the first one in the chord - note->setNoteIsAChordsFirstMemberNote (); - - // is this note the shortest one in this voice? - voice-> - registerShortestNoteIfRelevant (note); - - // register note as the last appended one into this voice - /* JMI - voice-> - registerNoteAsVoiceLastAppendedNote (note); - */ -} - -void msrChord::addAnotherNoteToChord ( - S_msrNote note, - S_msrVoice voice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Adding another note '" << - note->asShortString () << - "' to chord '" << - asString () << - "'" << - endl; - } -#endif - - fChordNotesVector.push_back (note); - - // register note's chord upLink - note-> - setNoteChordUpLink (this); - - // mark note as belonging to a chord - note->setNoteBelongsToAChord (); - -/* JMI - // register note as the last appended one into this voice - voice-> - registerNoteAsVoiceLastAppendedNote (note); - */ -} - -S_msrNote msrChord::fetchChordFirstNonGraceNote () const -{ - S_msrNote result; - - if (fChordNotesVector.size ()) { - result = fChordNotesVector.front (); - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "cannot access the first note of an empty chord"); - } - - return result; -} - -void msrChord::appendArticulationToChord (S_msrArticulation art) -{ - msrArticulation::msrArticulationKind - articulationKind = - art-> - getArticulationKind (); - - // don't append the same articulation several times - for ( - list::const_iterator i = fChordArticulations.begin (); - i!=fChordArticulations.end (); - i++ - ) { - if ((*i)->getArticulationKind () == articulationKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceArticulations) { - gLogOstream << - "Appending articulation '" << - art->articulationKindAsString () << - "' to chord" << - endl; - } -#endif - - fChordArticulations.push_back (art); -} - -void msrChord::appendSpannerToChord (S_msrSpanner span) -{ - msrSpanner::msrSpannerKind - spannerKind = - span-> - getSpannerKind (); - - // don't append the same spanner several times - for ( - list::const_iterator i = fChordSpanners.begin (); - i!=fChordSpanners.end (); - i++ - ) { - if ((*i)->getSpannerKind () == spannerKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSpanners) { - gLogOstream << - "Appending spanner '" << - span->spannerKindAsString () << - "' to chord '" << - asString () << - "'" << - endl; - } -#endif - - fChordSpanners.push_back (span); -} - -void msrChord::setChordSingleTremolo (S_msrSingleTremolo trem) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Adding singleTremolo '" << - trem->asString () << - "' to chord" << - endl; - } -#endif - - fChordSingleTremolo = trem; -} - -void msrChord::appendTechnicalToChord (S_msrTechnical tech) -{ - msrTechnical::msrTechnicalKind - technicalKind = - tech-> - getTechnicalKind (); - - // don't append the same technical several times - for ( - list::const_iterator i = - fChordTechnicals.begin (); - i!=fChordTechnicals.end (); - i++ - ) { - if ((*i)->getTechnicalKind () == technicalKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending technical '" << - tech->asString () << - "' to chord" << - endl; - } -#endif - - fChordTechnicals.push_back (tech); -} - -void msrChord::appendTechnicalWithIntegerToChord ( - S_msrTechnicalWithInteger tech) -{ - msrTechnicalWithInteger::msrTechnicalWithIntegerKind - technicalWithIntegerKind = - tech-> - getTechnicalWithIntegerKind (); - - // don't append the same technical several times - for ( - list::const_iterator i = - fChordTechnicalWithIntegers.begin (); - i!=fChordTechnicalWithIntegers.end (); - i++ - ) { - if ((*i)->getTechnicalWithIntegerKind () == technicalWithIntegerKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending technical with integer '" << - tech->asString () << - "' to chord" << - endl; - } -#endif - - fChordTechnicalWithIntegers.push_back (tech); -} - -void msrChord::appendTechnicalWithFloatToChord ( - S_msrTechnicalWithFloat tech) -{ - msrTechnicalWithFloat::msrTechnicalWithFloatKind - technicalWithFloatKind = - tech-> - getTechnicalWithFloatKind (); - - // don't append the same technical several times - for ( - list::const_iterator i = - fChordTechnicalWithFloats.begin (); - i!=fChordTechnicalWithFloats.end (); - i++ - ) { - if ((*i)->getTechnicalWithFloatKind () == technicalWithFloatKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending technical with integer '" << - tech->asString () << - "' to chord" << - endl; - } -#endif - - fChordTechnicalWithFloats.push_back (tech); -} - -void msrChord::appendTechnicalWithStringToChord ( - S_msrTechnicalWithString tech) -{ - msrTechnicalWithString::msrTechnicalWithStringKind - technicalWithStringKind = - tech-> - getTechnicalWithStringKind (); - - // don't append the same technical several times - for ( - list::const_iterator i = - fChordTechnicalWithStrings.begin (); - i!=fChordTechnicalWithStrings.end (); - i++ - ) { - if ((*i)->getTechnicalWithStringKind () == technicalWithStringKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending technical with string '" << - tech->asString () << - "' to chord" << - endl; - } -#endif - - fChordTechnicalWithStrings.push_back (tech); -} - -void msrChord::appendOrnamentToChord (S_msrOrnament orn) -{ - msrOrnament::msrOrnamentKind - ornamentKind = - orn-> - getOrnamentKind (); - - // don't append the same ornament several times - for ( - list::const_iterator i = fChordOrnaments.begin (); - i!=fChordOrnaments.end (); - i++ - ) { - if ((*i)->getOrnamentKind () == ornamentKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending ornament '" << - orn->ornamentKindAsString () << - "' to chord" << - endl; - } -#endif - - fChordOrnaments.push_back (orn); -} - -void msrChord::appendGlissandoToChord (S_msrGlissando gliss) -{ - msrGlissando::msrGlissandoTypeKind - glissandoTypeKind = - gliss-> - getGlissandoTypeKind (); - - // don't append the same slissando several times - for ( - list::const_iterator i = fChordGlissandos.begin (); - i!=fChordGlissandos.end (); - i++ - ) { - if ((*i)->getGlissandoTypeKind () == glissandoTypeKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending glissando '" << - gliss->asString () << - "' to chord" << - endl; - } -#endif - - fChordGlissandos.push_back (gliss); -} - -void msrChord::appendSlideToChord (S_msrSlide slide) -{ - msrSlide::msrSlideTypeKind - slideTypeKind = - slide-> - getSlideTypeKind (); - - // don't append the same slide several times - for ( - list::const_iterator i = fChordSlides.begin (); - i!=fChordSlides.end (); - i++ - ) { - if ((*i)->getSlideTypeKind () == slideTypeKind) - return; - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending slide '" << - slide->asString () << - "' to chord" << - endl; - } -#endif - - fChordSlides.push_back (slide); -} - -void msrChord::appendBeamToChord (S_msrBeam beam) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeams) { - gLogOstream << - "Appending beam '" << - beam->asString () << - "' to chord" << - endl; - } -#endif - - fChordBeams.push_back (beam); -} - -/* JMI ??? -void msrChord::finalizeChord ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Finalizing chord '" << - asString () << - "', line " << inputLineNumber << - endl; - } -#endif - - gLogOstream << - "fMeasureElementPositionInMeasure = " << - endl << - fMeasureElementPositionInMeasure << - endl; - - // we can now set the position in measures for all the chord members - setChordMembersPositionInMeasure ( - fMeasureElementPositionInMeasure); -} -*/ - -void msrChord::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChord::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChord elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChord::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrChord::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrChord::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrChord elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrChord::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrChord::browseData (basevisitor* v) -{ - for ( - vector::const_iterator i = fChordNotesVector.begin (); - i != fChordNotesVector.end (); - i++ ) { - // browse chord note - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordArticulations.begin (); - i != fChordArticulations.end (); - i++ ) { - // browse the articulation - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordSpanners.begin (); - i != fChordSpanners.end (); - i++ ) { - // browse the spanner - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordTechnicals.begin (); - i != fChordTechnicals.end (); - i++ ) { - // browse the technical - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordOrnaments.begin (); - i != fChordOrnaments.end (); - i++ ) { - // browse the ornament - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordGlissandos.begin (); - i != fChordGlissandos.end (); - i++ ) { - // browse the glissando - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordSlides.begin (); - i != fChordSlides.end (); - i++ ) { - // browse the slide - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordDynamics.begin (); - i != fChordDynamics.end (); - i++ ) { - // browse the dynamics - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordOtherDynamics.begin (); - i != fChordOtherDynamics.end (); - i++ ) { - // browse the other dynamics - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordWords.begin (); - i != fChordWords.end (); - i++ ) { - // browse the words - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordTies.begin (); - i != fChordTies.end (); - i++ ) { - // browse the tie - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordSlurs.begin (); - i != fChordSlurs.end (); - i++ ) { - // browse the slur - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordLigatures.begin (); - i != fChordLigatures.end (); - i++ ) { - // browse the ligature - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordSlashes.begin (); - i != fChordSlashes.end (); - i++ ) { - // browse the slash - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fChordWedges.begin (); - i != fChordWedges.end (); - i++ ) { - // browse the wedge - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - if (fChordOctaveShift) { - // browse the octave shift - msrBrowser browser (v); - browser.browse (*fChordOctaveShift); - } - - if (fChordGraceNotesGroupBefore) { - // browse the grace notes group before - msrBrowser browser (v); - browser.browse (*fChordGraceNotesGroupBefore); - } - if (fChordGraceNotesGroupAfter) { - // browse the grace notes group after - msrBrowser browser (v); - browser.browse (*fChordGraceNotesGroupAfter); - } - - // browse the harmonies if any - if (fChordHarmoniesList.size ()) { - list::const_iterator i; - for (i=fChordHarmoniesList.begin (); i!=fChordHarmoniesList.end (); i++) { - // browse the harmony - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } - - if (fChordFiguredBass) { - // browse the figured bass - msrBrowser browser (v); - browser.browse (*fChordFiguredBass); - } -} - -/* JMI -void msrChord::applyTupletMemberDisplayFactorToChordMembers ( - int actualNotes, int normalNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Applying tuplet member sounding factor '" << - actualNotes << "/" << normalNotes << - "' to the members of chord '" << asStringwithRawDivisions () << - "', line " << fInputLineNumber << - endl; - - for ( - vector::const_iterator i = fChordNotesVector.begin (); - i != fChordNotesVector.end (); - ++i) { - (*i)-> - applyTupletMemberSoundingFactorToNote ( - actualNotes, normalNotes); - } // for -} -#endif -*/ - -string msrChord::asStringwithRawDivisions () const -{ - stringstream s; - - s << "[<"; - - if (fChordNotesVector.size ()) { - vector::const_iterator - iBegin = fChordNotesVector.begin (), - iEnd = fChordNotesVector.end (), - i = iBegin; - for ( ; ; ) { - S_msrNote - note = (*i); - - s << - /* JMI - note->notePitchAsString () << - note->noteSoundingWholeNotesAsMsrString () << - "[" << note->getNoteOctave () << "]" - */ - - note->asShortStringWithRawWholeNotes (); - - if (++i == iEnd) break; - s << " "; - } // for - } - - s << ">]"; - - return s.str (); -} - -string msrChord::asString () const -{ - stringstream s; - - s << "<"; - - if (fChordNotesVector.size ()) { - vector::const_iterator - iBegin = fChordNotesVector.begin (), - iEnd = fChordNotesVector.end (), - i = iBegin; - for ( ; ; ) { - S_msrNote - note = (*i); - - s << - note->notePitchAsString () << - ", whole notes: " << - note->getNoteSoundingWholeNotes () << - " sounding, " << - note->getNoteDisplayWholeNotes () << - " displayed," << - "[" << note->getNoteOctave () << "]"; - - if (++i == iEnd) break; - s << " "; - } // for - } - - s << ">"; - - return s.str (); -} - -string msrChord::asShortString () const -{ - stringstream s; - - s << "<"; - - if (fChordNotesVector.size ()) { - vector::const_iterator - iBegin = fChordNotesVector.begin (), - iEnd = fChordNotesVector.end (), - i = iBegin; - for ( ; ; ) { - S_msrNote - note = (*i); - - s << - "'" << - note->notePitchAsString () << - "', whole notes: " << - note->getNoteSoundingWholeNotes () << - " sounding, " << - note->getNoteDisplayWholeNotes () << - " displayed," << - "[" << note->getNoteOctave () << "]"; - - if (++i == iEnd) break; - s << " "; - } // for - } - - s << ">"; - - return s.str (); -} - -void msrChord::print (ostream& os) const -{ - rational - chordMeasureFullLength = - fChordMeasureUpLink - ? - fChordMeasureUpLink-> - getFullMeasureWholeNotesDuration () - : rational (0, 1); // JMI - - os << - "Chord, " << - singularOrPlural ( - fChordNotesVector.size (), "note", "notes") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 35; - - os << left << - setw (fieldWidth) << - // JMI "chordSoundingWholeNotes" << " : " << fChordSoundingWholeNotes << - "chordSoundingWholeNotes" << " : " << fMeasureElementSoundingWholeNotes << - endl << - setw (fieldWidth) << - "chordDisplayWholeNotes" << " : " << fChordDisplayWholeNotes << - endl << - setw (fieldWidth) << - "measureNumber" << " : " << fMeasureElementMeasureNumber << - endl << - setw (fieldWidth) << - "positionInMeasure" << " : " << fMeasureElementPositionInMeasure << - endl << - setw (fieldWidth) << - "chordMeasureFullLength" << " : " << chordMeasureFullLength << - endl; - - // print simplified position in measure if relevant -// JMI if (fChordMeasureUpLink) { - // the chord measure upLink may not have been set yet - rational - chordPositionBis = - fMeasureElementPositionInMeasure; - chordPositionBis.rationalise (); - - if ( - chordPositionBis.getNumerator () - != - fMeasureElementPositionInMeasure.getNumerator () - ) { - // print rationalized rational view - os << left << - setw (fieldWidth) << - "chordPositionBis" << " : " << chordPositionBis << - endl; - } - - os << left << - setw (fieldWidth) << - "chordIsFirstChordInADoubleTremolo" << " : " << - booleanAsString (fChordIsFirstChordInADoubleTremolo) << - endl << - setw (fieldWidth) << - "chordIsSecondChordInADoubleTremolo" << " : " << - booleanAsString (fChordIsSecondChordInADoubleTremolo) << - endl; - - // print the articulations if any - int chordArticulationsSize = fChordArticulations.size (); - - if (chordArticulationsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordArticulations"; - if (chordArticulationsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordArticulations.begin (); i!=fChordArticulations.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the spanners if any - int chordSpannersSize = fChordSpanners.size (); - - if (chordSpannersSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordSpanners"; - if (chordSpannersSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordSpanners.begin (); i!=fChordSpanners.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the technicals if any - int chordTechnicalsSize = fChordTechnicals.size (); - - if (chordTechnicalsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordTechnicals"; - if (chordTechnicalsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordTechnicals.begin (); i!=fChordTechnicals.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the ornaments if any - int chordOrnamentsSize = fChordOrnaments.size (); - - if (chordOrnamentsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordOrnaments"; - if (chordOrnamentsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordOrnaments.begin (); i!=fChordOrnaments.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the glissandos if any - int chordGlissandosSize = fChordGlissandos.size (); - - if (chordGlissandosSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordGlissandos"; - if (chordGlissandosSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordGlissandos.begin (); i!=fChordGlissandos.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the slides if any - int chordSlidesSize = fChordSlides.size (); - - if (chordSlidesSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordSlides"; - if (chordSlidesSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordSlides.begin (); i!=fChordSlides.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the dynamics if any - int chordDynamicsSize = fChordDynamics.size (); - - if (chordDynamicsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordDynamics"; - if (chordDynamicsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordDynamics.begin (); i!=fChordDynamics.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the other dynamics if any - int chordOtherDynamicsSize = fChordOtherDynamics.size (); - - if (chordOtherDynamicsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordOtherDynamics"; - if (chordOtherDynamicsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordOtherDynamics.begin (); i!=fChordOtherDynamics.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the stems if any - int chordStemsSize = fChordStems.size (); - - if (chordStemsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordStems"; - if (chordStemsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordStems.begin (); i!=fChordStems.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the beams if any - int chordBeamsSize = fChordBeams.size (); - - if (chordBeamsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordBeams"; - if (chordBeamsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordBeams.begin (); i!=fChordBeams.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the words if any - int chordWordsSize = fChordWords.size (); - - if (chordWordsSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordWords"; - if (chordWordsSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordWords.begin (); i!=fChordWords.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the ties if any - int chordTiesSize = fChordTies.size (); - - if (chordTiesSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordTies"; - if (chordTiesSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordTies.begin (); i!=fChordTies.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the slurs if any - int chordSlursSize = fChordSlurs.size (); - - if (chordSlursSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordSlurs"; - if (chordSlursSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordSlurs.begin (); i!=fChordSlurs.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the ligatures if any - int chordLigaturesSize = fChordLigatures.size (); - - if (chordLigaturesSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordLigatures"; - if (chordLigaturesSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordLigatures.begin (); i!=fChordLigatures.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the slashes if any - int chordSlashesSize = fChordSlashes.size (); - - if (chordSlashesSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordSlashes"; - if (chordSlashesSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordSlashes.begin (); i!=fChordSlashes.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the wedges if any - int chordWedgesSize = fChordWedges.size (); - - if (chordWedgesSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordWedges"; - if (chordWedgesSize) { - os << endl; - gIndenter++; - - list::const_iterator i; - for (i=fChordWedges.begin (); i!=fChordWedges.end (); i++) { - os << (*i); - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the octave shift if any - if (fChordOctaveShift || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordOctaveShift"; - if (fChordOctaveShift) { - os << endl; - gIndenter++; - os << fChordOctaveShift; - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - } - - // print the grace notes groups if any - if (fChordGraceNotesGroupBefore || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordGraceNotesGroupBefore" << " : " << - endl; - - gIndenter++; - - if (fChordGraceNotesGroupBefore) { - os << - fChordGraceNotesGroupBefore->asString () << - endl; - } - else { - os << - "none"; - } - - gIndenter--; - } - if (fChordGraceNotesGroupAfter || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordGraceNotesGroupAfter" << " : " << - endl; - - gIndenter++; - - if (fChordGraceNotesGroupAfter) { - os << - fChordGraceNotesGroupAfter->asString () << - endl; - } - else { - os << - "none"; - } - - gIndenter--; - } - - // print the harmonies associated to this chord if any - int chordHarmoniesListSize = fChordHarmoniesList.size (); - - if (chordHarmoniesListSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordHarmonies"; - if (chordHarmoniesListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fChordHarmoniesList.begin (), - iEnd = fChordHarmoniesList.end (), - i = iBegin; - for ( ; ; ) { - S_msrHarmony - harmony = (*i); - - os << harmony->asString (); - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the figured bass if any - if (fChordFiguredBass || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordFiguredBass" << " : " << - endl; - - gIndenter++; - - if (fChordFiguredBass) { - os << - fChordFiguredBass->asString () << - endl; - } - else { - os << - "none"; - } - - gIndenter--; - } - - os << endl; - - // print the chord notes if any - int chordNotesVectorSize = fChordNotesVector.size (); - - if (chordNotesVectorSize || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "chordNotes"; - if (chordNotesVectorSize) { - os << endl; - gIndenter++; - - vector::const_iterator - iBegin = fChordNotesVector.begin (), - iEnd = fChordNotesVector.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << ":" << "none" << - endl; - } - } - - // print the chord position in measure - os << - setw (fieldWidth) << - "positionInMeasure" << " : " << fMeasureElementPositionInMeasure << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrChord& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrChords_MUT_DEP.h b/src/lilypond/msrChords_MUT_DEP.h deleted file mode 100644 index 5cb4de9ab..000000000 --- a/src/lilypond/msrChords_MUT_DEP.h +++ /dev/null @@ -1,467 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrChord : public msrTupletElement -{ - public: - - static SMARTP create ( - int inputLineNumber, - rational chordSoundingWholeNotes, - rational chordDisplayWholeNotes, - msrDurationKind chordGraphicDurationKind); - - // creation from MusicXML - // ------------------------------------------------------ - - SMARTP createChordNewbornClone ( - S_msrPart containingPart); - - SMARTP createChordDeepCopy ( - S_msrPart containingPart); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrChord ( - int inputLineNumber, - rational chordSoundingWholeNotes, - rational chordDisplayWholeNotes, - msrDurationKind chordGraphicDurationKind); - - virtual ~msrChord (); - - public: - - // set and get - // ------------------------------------------------------ - - // whole notes - void setChordSoundingWholeNotes ( - rational wholeNotes); - - rational getChordSoundingWholeNotes () const - // JMI { return fChordSoundingWholeNotes; } - { return fMeasureElementSoundingWholeNotes; } - - void setChordDisplayWholeNotes ( - rational wholeNotes); - - rational getChordDisplayWholeNotes () const - { return fChordDisplayWholeNotes; } - - // graphic duration - msrDurationKind getChordGraphicDurationKind () const - { return fChordGraphicDurationKind; } - - // chord notes - const vector& - getChordNotesVector () const - { return fChordNotesVector; } - - // stems - const list& - getChordStems () const - { return fChordStems; } - - // beams - const list& - getChordBeams () const - { return fChordBeams; } - - // articulations - const list& - getChordArticulations () const - { return fChordArticulations; } - - // spanners - const list& - getChordSpanners () const - { return fChordSpanners; } - - // technicals - const list& - getChordTechnicals () const - { return fChordTechnicals; } - - const list& - getChordTechnicalWithIntegers () const - { return fChordTechnicalWithIntegers; } - - const list& - getChordTechnicalWithFloats () const - { return fChordTechnicalWithFloats; } - - const list& - getChordTechnicalWithStrings () const - { return fChordTechnicalWithStrings; } - - // ornaments - const list& - getChordOrnaments () const - { return fChordOrnaments; } - - // glissandos - const list& - getChordGlissandos () const - { return fChordGlissandos; } - - // slides - const list& - getChordSlides () const - { return fChordSlides; } - - // singleTremolo - void setChordSingleTremolo ( - S_msrSingleTremolo trem); - - S_msrSingleTremolo getChordSingleTremolo () const - { return fChordSingleTremolo; } - - // dynamics - const list& - getChordDynamics () const - { return fChordDynamics; } - const list& - getChordOtherDynamics () const - { return fChordOtherDynamics; } - - const list& - getChordWedges () const - { return fChordWedges; } - - // words - const list& - getChordWords () const - { return fChordWords; } - - // ties - const list& - getChordTies () const - { return fChordTies; } - - // slurs - const list& - getChordSlurs () const - { return fChordSlurs; } - - // ligatures - const list& - getChordLigatures () const - { return fChordLigatures; } - - // pedals - const list& - getChordPedals () const - { return fChordPedals; } - - // double tremolo - void setChordIsFirstChordInADoubleTremolo () - { fChordIsFirstChordInADoubleTremolo = true; } - - bool getChordIsFirstChordInADoubleTremolo () const - { return fChordIsFirstChordInADoubleTremolo; } - - void setChordIsSecondChordInADoubleTremolo () - { fChordIsSecondChordInADoubleTremolo = true; } - - bool getChordIsSecondChordInADoubleTremolo () const - { return fChordIsSecondChordInADoubleTremolo; } - - // grace notes - void setChordGraceNotesGroupBefore ( - S_msrGraceNotesGroup graceNotesGroupBefore) - { - fChordGraceNotesGroupBefore = - graceNotesGroupBefore; - } - - S_msrGraceNotesGroup getChordGraceNotesGroupBefore () const - { return fChordGraceNotesGroupBefore; } - - void setChordGraceNotesGroupAfter ( - S_msrGraceNotesGroup graceNotesGroupAfter) - { - fChordGraceNotesGroupAfter = - graceNotesGroupAfter; - } - - S_msrGraceNotesGroup getChordGraceNotesGroupAfter () const - { return fChordGraceNotesGroupAfter; } - - - // harmony - void appendHarmonyToChord ( - S_msrHarmony harmony) - { fChordHarmoniesList.push_back (harmony); } - - // figured bass - void setChordFiguredBass ( - S_msrFiguredBass figuredBass) - { fChordFiguredBass = figuredBass; } - - const S_msrFiguredBass& - getChordFiguredBass () const - { return fChordFiguredBass; } - - // octave shift - void setChordOctaveShift ( - S_msrOctaveShift octaveShift) - { fChordOctaveShift = octaveShift; } - - S_msrOctaveShift getChordOctaveShift () const - { return fChordOctaveShift; } - - // measure upLink - void setChordMeasureUpLink ( - const S_msrMeasure& measure) - { fChordMeasureUpLink = measure; } - - S_msrMeasure getChordMeasureUpLink () const - { return fChordMeasureUpLink; } - - // positions in measures - void setChordMembersPositionInMeasure ( - S_msrMeasure measure, - rational positionInMeasure); - - // services - // ------------------------------------------------------ - - // notes - void addFirstNoteToChord ( - S_msrNote note, - S_msrVoice voice); - - void addAnotherNoteToChord ( - S_msrNote note, - S_msrVoice voice); - - S_msrNote fetchChordFirstNonGraceNote () const; - - // articulations - void appendArticulationToChord (S_msrArticulation art); - - // spanners - void appendSpannerToChord (S_msrSpanner span); - - // technicals - void appendTechnicalToChord (S_msrTechnical tech); - - void appendTechnicalWithIntegerToChord ( - S_msrTechnicalWithInteger tech); - - void appendTechnicalWithFloatToChord ( - S_msrTechnicalWithFloat tech); - - void appendTechnicalWithStringToChord ( - S_msrTechnicalWithString tech); - - // ornaments - void appendOrnamentToChord (S_msrOrnament orn); - - // glissandos - void appendGlissandoToChord (S_msrGlissando gliss); - - // slides - void appendSlideToChord (S_msrSlide slide); - - // dynamics - void appendDynamicsToChord (S_msrDynamics dynamic) - { - fChordDynamics.push_back (dynamic); - } - void appendOtherDynamicsToChord ( - S_msrOtherDynamics otherDynamic) - { - fChordOtherDynamics.push_back (otherDynamic); - } - - // slashes - void appendSlashToChord (S_msrSlash slash) - { - fChordSlashes.push_back (slash); - } - - // wedges - void appendWedgeToChord (S_msrWedge wedge) - { - fChordWedges.push_back (wedge); - } - - // words - void appendWordsToChord (S_msrWords dynamic) - { - fChordWords.push_back (dynamic); - } - - // ties - void appendTieToChord (S_msrTie tie) - { - fChordTies.push_back (tie); - } - - // slurs - void appendSlurToChord (S_msrSlur slur) - { - fChordSlurs.push_back (slur); - } - - // stems - void appendStemToChord (S_msrStem stem) - { - fChordStems.push_back (stem); - } - - // beams - void appendBeamToChord (S_msrBeam beam); - - // ligatures - void appendLigatureToChord (S_msrLigature ligature) - { - fChordLigatures.push_back (ligature); - } - - // pedals - void appendPedalToChord (S_msrPedal pedal) - { - fChordPedals.push_back (pedal); - } - - // tuplet members - /* JMI - void applyTupletMemberDisplayedFactorToChordMembers ( - int actualNotes, int normalNotes); -*/ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asStringwithRawDivisions () const; - - string asString () const; - - string asShortString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // measure upLink - S_msrMeasure fChordMeasureUpLink; - - // sounding divisions -// JMI rational fChordSoundingWholeNotes; - - // display divisions - rational fChordDisplayWholeNotes; - - // graphic duration is needed for grace notes, - // since they don't have any note (sounding) duration - msrDurationKind fChordGraphicDurationKind; - - vector fChordNotesVector; - - // stems - list fChordStems; - - // beams - list fChordBeams; - - // articulations - list - fChordArticulations; - - // spanners - list fChordSpanners; - - // single tremolo - S_msrSingleTremolo fChordSingleTremolo; - - // double tremolo - bool fChordIsFirstChordInADoubleTremolo; - bool fChordIsSecondChordInADoubleTremolo; - - // technicals - list fChordTechnicals; - - list - fChordTechnicalWithIntegers; - - list - fChordTechnicalWithFloats; - - list - fChordTechnicalWithStrings; - - // ornaments - list fChordOrnaments; - - // glissandos - list fChordGlissandos; - - // slides - list fChordSlides; - - // dynamics - list fChordDynamics; - list - fChordOtherDynamics; - - // slashes - list fChordSlashes; - - // wedges - list fChordWedges; - - // octave shift - S_msrOctaveShift fChordOctaveShift; - - // words - list fChordWords; - - // ties - list fChordTies; - - // slurs - list fChordSlurs; - - // ligatures - list fChordLigatures; - - // pedals - list fChordPedals; - - // grace notes - S_msrGraceNotesGroup fChordGraceNotesGroupBefore; - S_msrGraceNotesGroup fChordGraceNotesGroupAfter; - - // harmony - list fChordHarmoniesList; - - // figured bass - S_msrFiguredBass fChordFiguredBass; -}; -typedef SMARTP S_msrChord; -EXP ostream& operator<< (ostream& os, const S_msrChord& elt); - diff --git a/src/lilypond/msrClefs.cpp b/src/lilypond/msrClefs.cpp deleted file mode 100644 index ed188b4e4..000000000 --- a/src/lilypond/msrClefs.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrClefs.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrClef msrClef::create ( - int inputLineNumber, - msrClefKind clefKind) -{ - msrClef* o = - new msrClef ( - inputLineNumber, clefKind); - assert(o!=0); - return o; -} - -msrClef::msrClef ( - int inputLineNumber, - msrClefKind clefKind) - : msrMeasureElement (inputLineNumber) -{ - fClefKind = clefKind; -} - -msrClef::~msrClef () -{} - -bool msrClef::clefIsATablatureClef () const -{ - switch (fClefKind) { - case msrClef::kTablature4Clef: - case msrClef::kTablature5Clef: - case msrClef::kTablature6Clef: - case msrClef::kTablature7Clef: - return true; - break; - default: - return false; - } // switch -} - -bool msrClef::clefIsAPercussionClef () const -{ - switch (fClefKind) { - case msrClef::kPercussionClef: - return true; - break; - default: - return false; - } // switch -} - -bool msrClef::isEqualTo (S_msrClef otherClef) const -{ - if (! otherClef) { - return false; - } - - return fClefKind == otherClef->fClefKind; -} - -void msrClef::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrClef::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrClef elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrClef::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrClef::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrClef::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrClef elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrClef::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrClef::browseData (basevisitor* v) -{} - -string msrClef::clefKindAsString ( - msrClefKind clefKind) -{ - string result; - - switch (clefKind) { - case msrClef::k_NoClef: - result = "none"; - break; - case msrClef::kTrebleClef: - result = "treble"; - break; - case msrClef::kSopranoClef: - result = "soprano"; - break; - case msrClef::kMezzoSopranoClef: - result = "mezzo soprano"; - break; - case msrClef::kAltoClef: - result = "alto"; - break; - case msrClef::kTenorClef: - result = "tenor"; - break; - case msrClef::kBaritoneClef: - result = "baritone"; - break; - case msrClef::kBassClef: - result = "bass"; - break; - case msrClef::kTrebleLine1Clef: - result = "treble line 1"; - break; - case msrClef::kTrebleMinus15Clef: - result = "treble -15"; - break; - case msrClef::kTrebleMinus8Clef: - result = "treble -8"; - break; - case msrClef::kTreblePlus8Clef: - result = "treble +8"; - break; - case msrClef::kTreblePlus15Clef: - result = "treble +15"; - break; - case msrClef::kBassMinus15Clef: - result = "bass -15"; - break; - case msrClef::kBassMinus8Clef: - result = "bass -8"; - break; - case msrClef::kBassPlus8Clef: - result = "bass +8"; - break; - case msrClef::kBassPlus15Clef: - result = "bass +15"; - break; - case msrClef::kVarbaritoneClef: - result = "varbaritone"; - break; - case msrClef::kTablature4Clef: - result = "tablature 4 lines"; - break; - case msrClef::kTablature5Clef: - result = "tablature 5 lines"; - break; - case msrClef::kTablature6Clef: - result = "tablature 6 lines"; - break; - case msrClef::kTablature7Clef: - result = "tablature 7 lines"; - break; - case msrClef::kPercussionClef: - result = "percussion"; - break; - case msrClef::kJianpuClef: - result = "jianpu"; - break; - } // switch - - return result; -} - -msrClef::msrClefKind msrClef::clefKindFromString ( - string theString) -{ - msrClef::msrClefKind result = msrClef::k_NoClef; - - if (theString == "treble") - result = msrClef::kTrebleClef; - else if (theString == "bass") - result = msrClef::kBassClef; - else if (theString == "alto") - result = msrClef::kAltoClef; - else if (theString == "tenor") - result = msrClef::kTenorClef; - else if (theString == "soprano") - result = msrClef::kSopranoClef; - else if (theString == "mezzosoprano") - result = msrClef::kMezzoSopranoClef; - else if (theString == "baritone") - result = msrClef::kBaritoneClef; - else if (theString == "treble^8") - result = msrClef::kTreblePlus8Clef; - else if (theString == "treble_8") - result = msrClef::kTrebleMinus8Clef; - else if (theString == "bass_8") - result = msrClef::kBassMinus8Clef; - else if (theString == "bass^8") - result = msrClef::kBassPlus8Clef; - else if (theString == "varbaritone") - result = msrClef::kVarbaritoneClef; - else if (theString == "treble^15") - result = msrClef::kTreblePlus15Clef; - else if (theString == "treble_15") - result = msrClef::kTrebleMinus15Clef; - else if (theString == "bass^15") - result = msrClef::kBassPlus15Clef; - else if (theString == "bass_15") - result = msrClef::kBassMinus15Clef; - else if (theString == "tab4") - result = msrClef::kTablature4Clef; - else if (theString == "tab5") - result = msrClef::kTablature5Clef; - else if (theString == "tab6") - result = msrClef::kTablature6Clef; - else if (theString == "tab7") - result = msrClef::kTablature7Clef; - else if (theString == "percussion") - result = msrClef::kPercussionClef; - else if (theString == "jianpu") - result = msrClef::kJianpuClef; - - return result; -} - -string msrClef::asString () const -{ - stringstream s; - - s << - "Clef" " \"" << - clefKindAsString (fClefKind) << - "\", line " << fInputLineNumber; - - return s.str (); -} - -void msrClef::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrClef& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrClefs.h b/src/lilypond/msrClefs.h deleted file mode 100644 index 8c8b93a9e..000000000 --- a/src/lilypond/msrClefs.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrClefs___ -#define ___msrClefs___ - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrClef; -typedef SMARTP S_msrClef; - -//______________________________________________________________________________ -class msrClef : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrClefKind { - k_NoClef, - kTrebleClef, - kSopranoClef, kMezzoSopranoClef, kAltoClef, kTenorClef, kBaritoneClef, - kBassClef, - kTrebleLine1Clef, - kTrebleMinus15Clef, kTrebleMinus8Clef, - kTreblePlus8Clef, kTreblePlus15Clef, - kBassMinus15Clef, kBassMinus8Clef, - kBassPlus8Clef, kBassPlus15Clef, - kVarbaritoneClef, - kTablature4Clef, kTablature5Clef, kTablature6Clef, kTablature7Clef, - kPercussionClef, - kJianpuClef}; - - static string clefKindAsString ( - msrClefKind clefKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrClefKind clefKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrClef ( - int inputLineNumber, - msrClefKind clefKind); - - virtual ~msrClef (); - - public: - - // set and get - // ------------------------------------------------------ - - msrClefKind getClefKind () const - { return fClefKind; } - - // services - // ------------------------------------------------------ - - bool isEqualTo (S_msrClef otherClef) const; - - bool clefIsATablatureClef () const; - - bool clefIsAPercussionClef () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // services - // ------------------------------------------------------ - - static msrClefKind clefKindFromString ( - string theString); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrClefKind fClefKind; -}; -typedef SMARTP S_msrClef; -EXP ostream& operator<< (ostream& os, const S_msrClef& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrCredits.cpp b/src/lilypond/msrCredits.cpp deleted file mode 100644 index e6e1b43fd..000000000 --- a/src/lilypond/msrCredits.cpp +++ /dev/null @@ -1,347 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrCredits.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrCreditWords msrCreditWords::create ( - int inputLineNumber, - string creditWordsContents, - string creditWordsFontFamily, - float creditWordsFontSize, - msrFontWeightKind creditWordsFontWeightKind, - msrFontStyleKind creditWordsFontStyleKind, - msrJustifyKind creditWordsJustifyKind, - msrHorizontalAlignmentKind creditWordsHorizontalAlignmentKind, - msrVerticalAlignmentKind creditWordsVerticalAlignmentKind, - msrXMLLangKind creditWordsXMLLang) -{ - msrCreditWords* o = - new msrCreditWords ( - inputLineNumber, - creditWordsContents, - creditWordsFontFamily, - creditWordsFontSize, - creditWordsFontWeightKind, - creditWordsFontStyleKind, - creditWordsJustifyKind, - creditWordsHorizontalAlignmentKind, - creditWordsVerticalAlignmentKind, - creditWordsXMLLang); - assert(o!=0); - return o; -} - -msrCreditWords::msrCreditWords ( - int inputLineNumber, - string creditWordsContents, - string creditWordsFontFamily, - float creditWordsFontSize, - msrFontWeightKind creditWordsFontWeightKind, - msrFontStyleKind creditWordsFontStyleKind, - msrJustifyKind creditWordsJustifyKind, - msrHorizontalAlignmentKind creditWordsHorizontalAlignmentKind, - msrVerticalAlignmentKind creditWordsVerticalAlignmentKind, - msrXMLLangKind creditWordsXMLLang) - : msrElement (inputLineNumber) -{ - fCreditWordsContents = creditWordsContents; - - fCreditWordsFontFamily = creditWordsFontFamily; - fCreditWordsFontSize = creditWordsFontSize; - fCreditWordsFontWeightKind = creditWordsFontWeightKind; - fCreditWordsFontStyleKind = creditWordsFontStyleKind; - - fCreditWordsJustifyKind = creditWordsJustifyKind; - - fCreditWordsHorizontalAlignmentKind = creditWordsHorizontalAlignmentKind; - fCreditWordsVerticalAlignmentKind = creditWordsVerticalAlignmentKind; - - fCreditWordsXMLLang = creditWordsXMLLang; -} - -msrCreditWords::~msrCreditWords () -{} - -void msrCreditWords::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrCreditWords::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrCreditWords elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrCreditWords::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrCreditWords::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrCreditWords::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrCreditWords elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrCreditWords::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrCreditWords::browseData (basevisitor* v) -{} - -void msrCreditWords::print (ostream& os) const -{ - os << - "CreditWords" << - endl; - - gIndenter++; - - const int fieldWidth = 35; - - os << - setw (fieldWidth) << - "creditWordsContents" << " : \"" << - fCreditWordsContents << - "\"" << - endl << - setw (fieldWidth) << - "creditWordsFontFamily" << " : \"" << - fCreditWordsFontFamily << - "\"" << - endl << - setw (fieldWidth) << - "creditWordsFontSize" << " : " << - fCreditWordsFontSize << - endl << - setw (fieldWidth) << - "creditWordsFontWeightKind" << " : " << - msrFontWeightKindAsString ( - fCreditWordsFontWeightKind) << - endl << - setw (fieldWidth) << - "creditWordsFontStyleKind" << " : " << - msrFontStyleKindAsString (fCreditWordsFontStyleKind) << - endl << - setw (fieldWidth) << - "creditWordsJustifyKind" << " : " << - msrJustifyKindAsString (fCreditWordsJustifyKind) << - endl << - setw (fieldWidth) << - "creditWordsHorizontalAlignmentKind" << " : " << - msrHorizontalAlignmentKindAsString ( - fCreditWordsHorizontalAlignmentKind) << - endl << - setw (fieldWidth) << - "creditWordsVerticalAlignmentKind" << " : " << - msrVerticalAlignmentKindAsString ( - fCreditWordsVerticalAlignmentKind) << - endl << - setw (fieldWidth) << - "creditWordsXMLLang" << " : \"" << - fCreditWordsXMLLang << - "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrCreditWords& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrCredit msrCredit::create ( - int inputLineNumber, - int creditPageNumber) -{ - msrCredit* o = - new msrCredit ( - inputLineNumber, creditPageNumber); - assert(o!=0); - return o; -} - -msrCredit::msrCredit ( - int inputLineNumber, - int creditPageNumber) - : msrElement (inputLineNumber) -{ - fCreditPageNumber = creditPageNumber; -} - -msrCredit::~msrCredit () -{} - -void msrCredit::appendCreditWordsToCredit ( - S_msrCreditWords creditWords) -{ - fCreditWordsList.push_back (creditWords); -} - -void msrCredit::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrCredit::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrCredit elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrCredit::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrCredit::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrCredit::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrCredit elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrCredit::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrCredit::browseData (basevisitor* v) -{ - int n1 = fCreditWordsList.size (); - - for (int i = 0; i < n1; i++ ) { - // browse the credit words - msrBrowser browser (v); - browser.browse (*fCreditWordsList [i]); - } // for -} - -string msrCredit::asString () const -{ - stringstream s; - - s << - "Credit" << - ", fCreditPageNumber" << " = " << fCreditPageNumber << ", "; - - if (fCreditWordsList.size ()) { - s << "["; - - vector::const_iterator - iBegin = fCreditWordsList.begin (), - iEnd = fCreditWordsList.end (), - i = iBegin; - - for ( ; ; ) { - s << "\"" << (*i)->getCreditWordsContents () << "\""; - if (++i == iEnd) break; - s << ", "; - } // for - - s << "]"; - } - - else - s << "no credit words"; - - return s.str (); -} - -void msrCredit::print (ostream& os) const -{ - os << - "Credit" << - endl; - - gIndenter++; - - os << - "fCreditPageNumber" << " : " << fCreditPageNumber << - endl; - - if (fCreditWordsList.size ()) { - vector::const_iterator - iBegin = fCreditWordsList.begin (), - iEnd = fCreditWordsList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrCredit& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrCredits.h b/src/lilypond/msrCredits.h deleted file mode 100644 index 36d491cdd..000000000 --- a/src/lilypond/msrCredits.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrCredits___ -#define ___msrCredits___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrCreditWords : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string creditWordsContents, - string creditWordsFontFamily, - float creditWordsFontSize, - msrFontWeightKind creditWordsFontWeightKind, - msrFontStyleKind creditWordsFontStyleKind, - msrJustifyKind creditWordsJustifyKind, - msrHorizontalAlignmentKind creditWordsHorizontalAlignmentKind, - msrVerticalAlignmentKind creditWordsVerticalAlignmentKind, - msrXMLLangKind creditWordsXMLLang); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrCreditWords ( - int inputLineNumber, - string creditWordsContents, - string creditWordsFontFamily, - float creditWordsFontSize, - msrFontWeightKind creditWordsFontWeightKind, - msrFontStyleKind creditWordsFontStyleKind, - msrJustifyKind creditWordsJustifyKind, - msrHorizontalAlignmentKind creditWordsHorizontalAlignmentKind, - msrVerticalAlignmentKind creditWordsVerticalAlignmentKind, - msrXMLLangKind creditWordsXMLLang); - - virtual ~msrCreditWords (); - - public: - - // set and get - // ------------------------------------------------------ - string getCreditWordsContents () const - { return fCreditWordsContents; } - - string getCreditWordsFontFamily () const - { return fCreditWordsFontFamily; } - - float getCreditWordsFontSize () const - { return fCreditWordsFontSize; } - - msrFontWeightKind getCreditWordsFontWeightKind () const - { return fCreditWordsFontWeightKind; } - - msrFontStyleKind getCreditWordsFontStyleKind () const - { return fCreditWordsFontStyleKind; } - - msrJustifyKind getCreditWordsJustifyKind () const - { return fCreditWordsJustifyKind; } - - msrHorizontalAlignmentKind - getCreditWordsHorizontalAlignmentKind () const - { return fCreditWordsHorizontalAlignmentKind; } - - msrVerticalAlignmentKind - getCreditWordsVerticalAlignmentKind () const - { return fCreditWordsVerticalAlignmentKind; } - - msrXMLLangKind getCreditWordsXMLLang () const - { return fCreditWordsXMLLang; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - -/* - 越後獅子 -*/ - - string fCreditWordsContents; - - string fCreditWordsFontFamily; - float fCreditWordsFontSize; - msrFontWeightKind fCreditWordsFontWeightKind; - msrFontStyleKind fCreditWordsFontStyleKind; - msrJustifyKind fCreditWordsJustifyKind; - msrHorizontalAlignmentKind - fCreditWordsHorizontalAlignmentKind; - msrVerticalAlignmentKind - fCreditWordsVerticalAlignmentKind; - msrXMLLangKind fCreditWordsXMLLang; -}; -typedef SMARTP S_msrCreditWords; -EXP ostream& operator<< (ostream& os, const S_msrCreditWords& elt); - -//______________________________________________________________________________ -class msrCredit : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int creditPageNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrCredit ( - int inputLineNumber, - int creditPageNumber); - - virtual ~msrCredit (); - - public: - - // set and get - // ------------------------------------------------------ - - int getCreditPageNumber () const - { return fCreditPageNumber; } - - const vector& - getCreditWordsList () const - { return fCreditWordsList; } - - // services - // ------------------------------------------------------ - - void appendCreditWordsToCredit ( - S_msrCreditWords creditWords); - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fCreditPageNumber; - - vector - fCreditWordsList; -}; -typedef SMARTP S_msrCredit; -EXP ostream& operator<< (ostream& os, const S_msrCredit& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrDivisions.cpp b/src/lilypond/msrDivisions.cpp deleted file mode 100644 index 8ece23fb5..000000000 --- a/src/lilypond/msrDivisions.cpp +++ /dev/null @@ -1,589 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrDivisions.h" - -#include "generalOah.h" -#include "musicXMLOah.h" -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrDivisions msrDivisions::create ( - int inputLineNumber, - int divisionsPerQuarterNote) -{ - msrDivisions* o = - new msrDivisions ( - inputLineNumber, divisionsPerQuarterNote); - assert(o!=0); - return o; -} - -S_msrDivisions msrDivisions::createDivisionsNewbornClone () -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - gLogOstream << - "Creating a newborn clone of divisions '" << - divisionsAsString () << - "'" << - endl; - } -#endif - - S_msrDivisions - newbornClone = - msrDivisions::create ( - fInputLineNumber, - fDivisionsPerQuarterNote); - - return newbornClone; -} - -msrDivisions::msrDivisions ( - int inputLineNumber, - int divisionsPerQuarterNote) - : msrElement (inputLineNumber) -{ - // set divisions per quarter note - fDivisionsPerQuarterNote = divisionsPerQuarterNote; - - // initialize the divisions - initializeDivisions (); -} - -void msrDivisions::initializeDivisions () -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing divisions" << - ", divisionsPerQuarterNote = " << fDivisionsPerQuarterNote << - ", line " << fInputLineNumber << - endl; - } -#endif - - gIndenter++; - - // forget fDurationsToDivisions's contents - fDurationKindsToDivisions.clear (); - - // positive powers of 2 of a quarter note - int bigDivisions = fDivisionsPerQuarterNote; - - for (int i = kQuarter; i >= kMaxima; i--) { - /* - gLogOstream << - msrDurationAsString (msrDuration (i)) << - " -> " << - bigDivisions << - endl; - */ - - fDurationKindsToDivisions.push_front ( - make_pair ( - msrDurationKind (i), bigDivisions)); - - bigDivisions *= 2; - } // for - - if (fDivisionsPerQuarterNote > 1) { - // negative powers of 2 of a quarter note - int - smallDivisions = - fDivisionsPerQuarterNote / 2; - msrDurationKind - currentDurationKind = - kEighth; - - while (smallDivisions >= 1) { - /* - gLogOstream << - msrDurationAsString (currentDuration) << - " % --> " << - smallDivisions << - endl; - */ - - fDurationKindsToDivisions.push_back ( - make_pair (currentDurationKind, smallDivisions)); - - currentDurationKind = - msrDurationKind ( - currentDurationKind + 1); - smallDivisions /= 2; - } // while - } - - // print the durations divisions if needed -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - printDurationKindsDivisions (gLogOstream); - } -#endif - - gIndenter--; -} - -int msrDivisions::durationKindAsDivisions ( - int inputLineNumber, - msrDurationKind durationKind) -{ - for ( - list >::const_iterator i = - fDurationKindsToDivisions.begin (); - i != fDurationKindsToDivisions.end (); - i++ - ) { - if ((*i).first == durationKind) - return - (*i).second; - } // for - - stringstream s; - - s << - "duration " << durationKind << - " cannot be converted to divisions with " << - fDivisionsPerQuarterNote << " divisions per quarter note" << - endl; - - printDurationKindsDivisions (s); - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - - return -1; // never reached -} - -void msrDivisions::printDurationKindsDivisions (ostream& os) -{ - os << - "The mapping of durations to divisions with " << - fDivisionsPerQuarterNote << " divisions per quarter note" << - " is:" << - endl; - - gIndenter++; - - if (fDurationKindsToDivisions.size ()) { - list >::const_iterator - iBegin = fDurationKindsToDivisions.begin (), - iEnd = fDurationKindsToDivisions.end (), - i = iBegin; - - for ( ; ; ) { - os << - setw (6) << left << - msrDurationKindAsString ( - msrDurationKind ((*i).first)) << - ": " << - setw (5) << right << - (*i).second; - - if (++i == iEnd) break; - - os << endl; - } // for - -/* JMI - - for ( - list >::const_iterator i = - fDurationsToDivisions.begin (); - i != fDurationsToDivisions.end (); - i++ - ) { - os << - setw (6) << left << - msrDurationAsString (msrDuration((*i).first)) << - ": " << - setw (4) << right << - (*i).second << - endl; - } // for -*/ - } - - else - os << - "an empty list"; - - os << endl; - - gIndenter--; -} - -string msrDivisions::divisionsAsMsrString ( - int inputLineNumber, - int divisions, - int& numberOfDotsNeeded) -{ - string result; - - // the result is a base duration, followed by a suffix made of - // either a sequence of dots or a multiplication factor - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - const int fieldWidth = 16; - - gLogOstream << - "--> divisionsAsMsrString ():" << - endl << - gTab << setw (fieldWidth) << - "inputLineNumber" << " = " << inputLineNumber << - endl << - gTab << setw (fieldWidth) << - "divisions" << " = " << divisions << - endl; - } -#endif - - msrDurationKind baseDurationKind = k1024th; - int baseDurationDivisions = -1; - - // search fDurationsToDivisions in longer to shortest order - list >::const_iterator - iBegin = fDurationKindsToDivisions.begin (), - iEnd = fDurationKindsToDivisions.end (), - i = iBegin; - - for ( ; ; ) { - if (i == iEnd) { - stringstream s; - - s << - "divisions " << divisions << - " could not be handled by divisionsAsMsrString () with:" << - endl; - - printDurationKindsDivisions (gLogOstream); - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - break; - } - - if ((*i).second <= divisions) { - // found base duration in list - baseDurationKind = (*i).first; - baseDurationDivisions = (*i).second; - - result = - msrDurationKindAsString (baseDurationKind); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - const int fieldWidth = 22; - - gLogOstream << - gTab << setw (fieldWidth) << - "divisions" << " = " << divisions << - endl << - endl << - gTab << setw (fieldWidth) << - "baseDurationDivisions" << " = " << baseDurationDivisions << - endl << - gTab << setw (fieldWidth) << - "result" << " = " << result << - endl << - endl; - } -#endif - - break; - } - - // next please! - i++; - } // for - - int dotsNumber = 0; - - if (divisions > baseDurationDivisions) { - // divisions is not a power of 2 of a quarter note - - // the next element in the list is half as long as (*i) - int remainingDivisions = - divisions - baseDurationDivisions; - int nextDivisionsInList = - baseDurationDivisions / 2; - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - const int fieldWidth = 22; - - gLogOstream << - gTab << setw (fieldWidth) << - "divisions" << " = " << divisions << - endl << - gTab << setw (fieldWidth) << - "baseDurationDivisions" << " = " << baseDurationDivisions << - endl << - gTab << setw (fieldWidth) << - "nextDivisionsInList" << " = " << nextDivisionsInList << - endl << - gTab << setw (fieldWidth) << - "remainingDivisions" << " = " << remainingDivisions << - endl << - endl; - } -#endif - - if (remainingDivisions < nextDivisionsInList) { - // the suffix is a multiplication factor - rational r ( - divisions, - baseDurationDivisions); - r.rationalise (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { // JMI - const int fieldWidth = 22; - - gLogOstream << - gTab << setw (fieldWidth) << - "divisions" << " = " << divisions << - endl << - gTab << setw (fieldWidth) << - "baseDurationDivisions" << " = " << baseDurationDivisions << - endl << - gTab << setw (fieldWidth) << - "r" << " = " << r << - endl << - endl; - } -#endif - - result += - "*" + r.toString (); - } - - else { - dotsNumber = 1; // account for next element in the list - - while (remainingDivisions > nextDivisionsInList) { - dotsNumber++; - remainingDivisions -= nextDivisionsInList; - nextDivisionsInList /= 2; - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - const int fieldWidth = 22; - - gLogOstream << - gTab << setw (fieldWidth) << - "divisions" << " = " << divisions << - endl << - gTab << setw (fieldWidth) << - "baseDurationDivisions" << " = " << baseDurationDivisions << - endl << - gTab << setw (fieldWidth) << - "nextDivisionsInList" << " = " << nextDivisionsInList << - endl << - gTab << setw (fieldWidth) << - "remainingDivisions" << " = " << remainingDivisions << - endl << - gTab << setw (fieldWidth) << - "dotsNumber" << " = " << dotsNumber << - endl << - endl; - } -#endif - - if (dotsNumber > 5 ) { - break; // JMI - } - } // while - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - const int fieldWidth = 24; - - gLogOstream << - gTab << setw (fieldWidth) << - "divisions" << " = " << divisions << - endl << - gTab << setw (fieldWidth) << - "baseDurationDivisions" << " = " << baseDurationDivisions << - endl << - gTab << setw (fieldWidth) << - "nextDivisionsInList" << " = " << nextDivisionsInList << - endl << - gTab << setw (fieldWidth) << - "remainingDivisions" << " = " << remainingDivisions << - endl << - gTab << setw (fieldWidth) << - "dotsNumber" << " = " << dotsNumber << - endl << - endl; - } -#endif - - if (remainingDivisions - nextDivisionsInList == 0) { - // the suffix is composed of dots - for (int k = 0; k < dotsNumber; k++) - result += "."; - } - } - } - - numberOfDotsNeeded = dotsNumber; - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - gLogOstream << - "<-- divisionsAsMsrString (): returns " << result << - endl << - endl; - } -#endif - - return result; -} - -string msrDivisions::divisionsAsMsrString ( - int inputLineNumber, - int divisions) -{ - int numberOfDots; // to be ignored - - return - divisionsAsMsrString ( - inputLineNumber, - divisions, - numberOfDots); -} - -string msrDivisions::tupletDivisionsAsMsrString ( - int inputLineNumber, - int divisions, - int actualNotes, - int normalNotes) -{ - return - divisionsAsMsrString ( - inputLineNumber, - divisions * actualNotes / normalNotes); -} - -string msrDivisions::tupletWholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes, - int actualNotes, - int normalNotes) -{ - return - wholeNotesAsMsrString ( - inputLineNumber, - wholeNotes - * - rational (actualNotes, normalNotes)); -} - -msrDivisions::~msrDivisions () -{} - -void msrDivisions::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDivisions::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDivisions elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDivisions::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrDivisions::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDivisions::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDivisions elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDivisions::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrDivisions::browseData (basevisitor* v) -{} - -string msrDivisions::divisionsAsString () const -{ - stringstream s; - - s << - "Divisions" << - ", " << fDivisionsPerQuarterNote << - " per quarter note"; - - return s.str (); -} - -void msrDivisions::print (ostream& os) const -{ - os << - divisionsAsString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrDivisions& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrDivisions.h b/src/lilypond/msrDivisions.h deleted file mode 100644 index fba78a829..000000000 --- a/src/lilypond/msrDivisions.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrDivisions___ -#define ___msrDivisions___ - -#include - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrDivisions : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int divisionsPerQuarterNote); - - SMARTP createDivisionsNewbornClone (); // JMI - - private: - - // initialisation - // ------------------------------------------------------ - - void initializeDivisions (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrDivisions ( - int inputLineNumber, - int divisionsPerQuarterNote); - - virtual ~msrDivisions (); - - public: - - // set and get - // ------------------------------------------------------ - - void setDivisionsPerQuarterNote ( // JMI - int divisionsPerQuarterNote) - { - fDivisionsPerQuarterNote = - divisionsPerQuarterNote; - } - - int getDivisionsPerQuarterNote () const - { return fDivisionsPerQuarterNote; } - - // services - // ------------------------------------------------------ - - string divisionsAsString () const; - - // durations - int durationKindAsDivisions ( - int inputLineNumber, - msrDurationKind durationKind); - - void printDurationKindsDivisions (ostream& os); - - // MSR strings - string divisionsAsMsrString ( - int inputLineNumber, - int divisions, - int& numberOfDotsNeeded); - - string divisionsAsMsrString ( - int inputLineNumber, - int divisions); -/* JMI - string wholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes, - int& numberOfDotsNeeded); - - string wholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes); -*/ - string tupletDivisionsAsMsrString ( - int inputLineNumber, - int divisions, - int actualNotes, - int normalNotes); - - string tupletWholeNotesAsMsrString ( - int inputLineNumber, - rational wholeNotes, - int actualNotes, - int normalNotes); - -/* JMI - void testDivisionsAndDurations (); // JMI - void testTupletSoundingWholeNotesAndDurations (); -*/ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fDivisionsPerQuarterNote; - - list > - fDurationKindsToDivisions; -}; -typedef SMARTP S_msrDivisions; -EXP ostream& operator<< (ostream& os, const S_msrDivisions& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrDoubleTremolos.cpp b/src/lilypond/msrDoubleTremolos.cpp deleted file mode 100644 index b3bf92376..000000000 --- a/src/lilypond/msrDoubleTremolos.cpp +++ /dev/null @@ -1,731 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrDoubleTremolo msrDoubleTremolo::create ( - int inputLineNumber, - msrDoubleTremoloKind doubleTremoloKind, - msrTremoloTypeKind doubleTremoloTypeKind, - int doubleTremoloMarksNumber, - msrPlacementKind doubleTremoloPlacementKind) -{ - msrDoubleTremolo* o = - new msrDoubleTremolo ( - inputLineNumber, - doubleTremoloKind, - doubleTremoloTypeKind, - doubleTremoloMarksNumber, - doubleTremoloPlacementKind); - assert (o!=0); - return o; -} - -msrDoubleTremolo::msrDoubleTremolo ( - int inputLineNumber, - msrDoubleTremoloKind doubleTremoloKind, - msrTremoloTypeKind doubleTremoloTypeKind, - int doubleTremoloMarksNumber, - msrPlacementKind doubleTremoloPlacementKind) - : msrMeasureElement (inputLineNumber) -{ - fDoubleTremoloKind = doubleTremoloKind; - fDoubleTremoloTypeKind = doubleTremoloTypeKind; - fDoubleTremoloMarksNumber = doubleTremoloMarksNumber; - fDoubleTremoloPlacementKind = doubleTremoloPlacementKind; - - fDoubleTremoloSoundingWholeNotes = - rational (-1, 1); // will be set later - - fDoubleTremoloNumberOfRepeats = -1; // will be set later -} - -S_msrDoubleTremolo msrDoubleTremolo::createDoubleTremoloNewbornClone ( - S_msrElement doubleTremoloFirstElement, - S_msrElement doubleTremoloSecondElement) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Creating a newborn clone of a double tremolo" << - endl; - } -#endif - - // sanity check - msrAssert( - doubleTremoloFirstElement != nullptr, - "doubleTremoloFirstElement is null"); - msrAssert( - doubleTremoloSecondElement != nullptr, - "doubleTremoloSecondElement is null"); - - S_msrDoubleTremolo - newbornClone = - msrDoubleTremolo::create ( - fInputLineNumber, - fDoubleTremoloKind, - fDoubleTremoloTypeKind, - fDoubleTremoloMarksNumber, - fDoubleTremoloPlacementKind); - - newbornClone->fDoubleTremoloFirstElement = - doubleTremoloFirstElement; - newbornClone->fDoubleTremoloSecondElement = - doubleTremoloSecondElement; - - newbornClone->fDoubleTremoloSoundingWholeNotes = - fDoubleTremoloSoundingWholeNotes; - - newbornClone->fDoubleTremoloElementsDuration = - fDoubleTremoloElementsDuration; - - newbornClone->fDoubleTremoloNumberOfRepeats = - fDoubleTremoloNumberOfRepeats; - - newbornClone->fDoubleTremoloPlacementKind = - fDoubleTremoloPlacementKind; - - return newbornClone; -} - -msrDoubleTremolo::~msrDoubleTremolo () -{} - -void msrDoubleTremolo::setDoubleTremoloNoteFirstElement (S_msrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Setting note " << note->asShortString () << - " as first element of double tremolo " << - asShortString () << - endl; - } -#endif - - int inputLineNumber = - note->getInputLineNumber (); - - // register note as first element of this double tremolo - fDoubleTremoloFirstElement = note; - - // mark it as being a double tremolo first element - note-> - setNoteIsFirstNoteInADoubleTremolo (); - - // fetch note display whole notes - rational - noteDisplayWholeNotes = - note-> - getNoteDisplayWholeNotes (); - - // set double tremolo sounding whole notes - // to the note's display whole notes, - // i.e. the duration of each of the two notes - fDoubleTremoloSoundingWholeNotes = - noteDisplayWholeNotes; - fDoubleTremoloSoundingWholeNotes.rationalise (); - - // compute double tremolo elements duration - // the marks number determines the duration of the two elements: - // '8' for 1, '16' for 2, etc - fDoubleTremoloElementsDuration = - rational ( - 1, - /* JMI - int ( - pow ( - 2, - fDoubleTremoloMarksNumber + 2))); - */ - 1 << (fDoubleTremoloMarksNumber + 2)); - - // set note's sounding whole notes - note-> - setNoteSoundingWholeNotes ( - fDoubleTremoloElementsDuration); - - // setting number of repeats - rational - numberOfRepeatsAsRational = - fDoubleTremoloSoundingWholeNotes - / - fDoubleTremoloElementsDuration - / - 2; // there are two repeated notes - numberOfRepeatsAsRational.rationalise (); - - if (numberOfRepeatsAsRational.getDenominator () != 1) { - stringstream s; - - s << - "cannot handle numberOfRepeatsAsRational.getDenominator () != 1" << - endl << - "numberOfRepeatsAsRational = " << - numberOfRepeatsAsRational << - endl << - "fDoubleTremoloSoundingWholeNotes = '" << - fDoubleTremoloSoundingWholeNotes << "'" << - endl << - "fDoubleTremoloElementsDuration = '" << - fDoubleTremoloElementsDuration << "'" << - endl << - "line " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fDoubleTremoloNumberOfRepeats = - numberOfRepeatsAsRational.getNumerator (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Setting notes double tremolo number of repeats to '" << - fDoubleTremoloNumberOfRepeats << - "', fDoubleTremoloSoundingWholeNotes = '" << - fDoubleTremoloSoundingWholeNotes << "'" << - ", fDoubleTremoloElementsDuration = '" << - fDoubleTremoloElementsDuration << "'" << - "', line " << inputLineNumber << - endl; - } -#endif -} - -void msrDoubleTremolo::setDoubleTremoloNoteSecondElement ( - S_msrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Setting note " << note->asShortString () << - " as second element of double tremolo " << - asShortString () << - endl; - } -#endif - - int inputLineNumber = - note->getInputLineNumber (); - - // register note as second element of this double tremolo - fDoubleTremoloSecondElement = note; - - // mark it as being a double tremolo second element - note-> - setNoteIsSecondNoteInADoubleTremolo (); - - // fetch note display whole notes - rational - noteDisplayWholeNotes = - note-> - getNoteDisplayWholeNotes (); - - // compute expected double tremolo sounding whole notes - rational - expectedDoubleTremoloSoundingWholeNotes = - noteDisplayWholeNotes; - expectedDoubleTremoloSoundingWholeNotes.rationalise (); - - // check that expected double tremolo sounding whole notes - // match the known double tremolo sounding whole notes -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Checking notes double tremolo second note duration"<< - ", doubleTremoloNumberOfRepeats = '" << - fDoubleTremoloNumberOfRepeats << - "', doubleTremoloSoundingWholeNotes = '" << - fDoubleTremoloSoundingWholeNotes << - "', doubleTremoloElementsDuration = '" << - fDoubleTremoloElementsDuration << "'" << - "', line " << inputLineNumber << - endl; - } -#endif - - if ( - expectedDoubleTremoloSoundingWholeNotes - != - fDoubleTremoloSoundingWholeNotes) { - stringstream s; - - s << - "attempt to set notes double tremolo whole notes both to " << - fDoubleTremoloSoundingWholeNotes << " (existing)" << - " and " << - expectedDoubleTremoloSoundingWholeNotes << - " on note second element:" << - endl; - - gIndenter++; - - s << - note << - endl; - - gIndenter--; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // set note's sounding whole notes - note-> - setNoteSoundingWholeNotes ( - fDoubleTremoloElementsDuration); -} - -void msrDoubleTremolo::setDoubleTremoloChordFirstElement ( - S_msrChord chord) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Setting chord " << chord->asString () << - " as first element of double tremolo " << - asShortString () << - endl; - } -#endif - - // register chord as first element of this double tremolo - fDoubleTremoloFirstElement = chord; - - // mark it as being a double tremolo first element - chord-> - setChordIsFirstChordInADoubleTremolo (); - - // fetch chord displayed whole notes - rational - chordDisplayWholeNotes = - chord-> - getChordDisplayWholeNotes (); - - // compute expected double tremolo sounding whole notes - rational - expectedDoubleTremoloSoundingWholeNotes = - chordDisplayWholeNotes * 2; - expectedDoubleTremoloSoundingWholeNotes.rationalise (); - - // set double tremolo whole notes to the chords's displayed whole notes - if (fDoubleTremoloSoundingWholeNotes.getNumerator () != 0) { - if ( - expectedDoubleTremoloSoundingWholeNotes - != - fDoubleTremoloSoundingWholeNotes) { - stringstream s; - - s << - "attempt to set chord double tremolo sounding whole notes both to " << - fDoubleTremoloSoundingWholeNotes << " (existing)" << - " and " << - expectedDoubleTremoloSoundingWholeNotes << - " on chord first element:" << - endl; - - gIndenter++; - - s << - chord << - endl; - - gIndenter--; - - msrInternalError ( - gOahOah->fInputSourceName, - chord->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - } - - fDoubleTremoloSoundingWholeNotes = - chordDisplayWholeNotes * 2; // taking the second note into account - fDoubleTremoloSoundingWholeNotes.rationalise (); -} - -void msrDoubleTremolo::setDoubleTremoloChordSecondElement (S_msrChord chord) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Setting chord " << chord->asString () << - " as second element of double tremolo " << - asShortString () << - endl; - } -#endif - - // register chord as second element of this double tremolo - fDoubleTremoloSecondElement = chord; - - // mark it as being a double tremolo second element - chord-> - setChordIsSecondChordInADoubleTremolo (); - - // fetch chord displayed whole notes - rational - chordDisplayWholeNotes = - chord-> - getChordDisplayWholeNotes (); - - // set double tremolo whole notes to the chords's displayed whole notes - if (fDoubleTremoloSoundingWholeNotes.getNumerator () != 0) { - if (chordDisplayWholeNotes != fDoubleTremoloSoundingWholeNotes) { // JMI - stringstream s; - - s << - "attempt to set double tremolo whole notes both to " << - fDoubleTremoloSoundingWholeNotes << " (existing)" << - " and " << - chordDisplayWholeNotes << - " on chord second element:" << " (chord)" << - endl; - - gIndenter++; - - s << - chord << - endl; - - gIndenter--; - - msrInternalError ( - gOahOah->fInputSourceName, - chord->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - } - - else { - fDoubleTremoloSoundingWholeNotes = - chordDisplayWholeNotes; - } -} - -void msrDoubleTremolo::setDoubleTremoloPositionInMeasure ( - rational positionInMeasure) -{ - msrMeasureElement::setMeasureElementPositionInMeasure ( - positionInMeasure, - "setDoubleTremoloPositionInMeasure()"); -} - -void msrDoubleTremolo::setDoubleTremoloMeasureNumber ( - string measureNumber) -{ - fMeasureElementMeasureNumber = measureNumber; -} - -void msrDoubleTremolo::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDoubleTremolo::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDoubleTremolo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDoubleTremolo::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrDoubleTremolo::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDoubleTremolo::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDoubleTremolo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDoubleTremolo::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrDoubleTremolo::browseData (basevisitor* v) -{ - if (fDoubleTremoloFirstElement) { - // browse the first element - msrBrowser browser (v); - browser.browse (*fDoubleTremoloFirstElement); - } - - if (fDoubleTremoloSecondElement) { - // browse the second element - msrBrowser browser (v); - browser.browse (*fDoubleTremoloSecondElement); - } -} - -string msrDoubleTremolo::msrDoubleTremoloKindAsString ( - msrDoubleTremolo::msrDoubleTremoloKind doubleTremolotKind) -{ - string result; - - switch (doubleTremolotKind) { - case msrDoubleTremolo::kNotesDoubleTremolo: - result = "Notes"; - break; - case msrDoubleTremolo::kChordsDoubleTremolo: - result = "Chords"; - break; - } // switch - - return result; -} - -string msrDoubleTremolo::doubleTremoloPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fDoubleTremoloPlacementKind); -} - -string msrDoubleTremolo::asShortString () const -{ - stringstream s; - - s << - "DoubleTremolo"<< - ", " << msrTremoloTypeKindAsString (fDoubleTremoloTypeKind) << - ", line " << fInputLineNumber << - ", " << - singularOrPlural ( - fDoubleTremoloMarksNumber, "mark", "marks") << - ", placement" << " = " << doubleTremoloPlacementKindAsString (); - - return s.str (); -} - -string msrDoubleTremolo::asString () const -{ - stringstream s; - - s << - "DoubleTremolo" " " << - ", " << msrTremoloTypeKindAsString (fDoubleTremoloTypeKind) << - ", line " << fInputLineNumber << - fDoubleTremoloMarksNumber << " marks" << - ", placement" << " = " << doubleTremoloPlacementKindAsString () << - ", " << fDoubleTremoloSoundingWholeNotes << " sounding whole notes"; - - if (fDoubleTremoloFirstElement) { // it may not be set yet - s << - ", first element " << " = "; - - switch (fDoubleTremoloKind) { - case msrDoubleTremolo::kNotesDoubleTremolo: - if ( - S_msrNote - note = - dynamic_cast(&(*fDoubleTremoloFirstElement)) - ) { - note->asShortString (); - } - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "notes double tremolo first element should be a note"); - } - break; - - case msrDoubleTremolo::kChordsDoubleTremolo: - if ( - S_msrChord - chord = - dynamic_cast(&(*fDoubleTremoloFirstElement)) - ) { - chord->asString (); - } - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "chords double tremolo first element should be a chord"); - } - break; - } // switch - } - - if (fDoubleTremoloSecondElement) { // it may not be set yet - s << - ", second element " << " = "; - - switch (fDoubleTremoloKind) { - case msrDoubleTremolo::kNotesDoubleTremolo: - if ( - S_msrNote - note = - dynamic_cast(&(*fDoubleTremoloSecondElement)) - ) { - note->asShortString (); - } - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "notes double tremolo second element should be a note"); - } - break; - - case msrDoubleTremolo::kChordsDoubleTremolo: - if ( - S_msrChord - chord = - dynamic_cast(&(*fDoubleTremoloSecondElement)) - ) { - chord->asString (); - } - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "chords double tremolo second element should be a chord"); - } - break; - } // switch - } - - return s.str (); -} - -void msrDoubleTremolo::print (ostream& os) const -{ - os << - "DoubleTremolo" << - ", " << msrTremoloTypeKindAsString (fDoubleTremoloTypeKind) << - ", on " << msrDoubleTremoloKindAsString (fDoubleTremoloKind) << - ", line " << fInputLineNumber << - endl; - - const int fieldWidth = 32; - - gIndenter++; - - os << left << - setw (fieldWidth) << - "doubleTremoloSoundingWholeNotes" << " : " << - fDoubleTremoloSoundingWholeNotes << - endl << - - setw (fieldWidth) << - "doubleTremoloMarksNumber" << " : " << - fDoubleTremoloMarksNumber << - endl << - - setw (fieldWidth) << - "doubleTremoloElementsDuration" << " : " << - fDoubleTremoloElementsDuration << - endl << - - setw (fieldWidth) << - "numberOfRepeats" << " : " << - fDoubleTremoloNumberOfRepeats << - endl << - - setw (fieldWidth) << - "placement" << " : " << - doubleTremoloPlacementKindAsString () << - endl; - - os << - "First element:"; - if (fDoubleTremoloFirstElement) { // it may not yet be set - os << endl; - - gIndenter++; - os << - fDoubleTremoloFirstElement; - gIndenter--; - } - else { - os << - " none" << - endl; - } - - os << - "Second element:"; - if (fDoubleTremoloSecondElement) { // it may not yet be set - os << endl; - - gIndenter++; - os << - fDoubleTremoloSecondElement; - gIndenter--; - } - else { - os << - " none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrDoubleTremolo& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrDoubleTremolos_MUT_DEP.h b/src/lilypond/msrDoubleTremolos_MUT_DEP.h deleted file mode 100644 index f4317ddb4..000000000 --- a/src/lilypond/msrDoubleTremolos_MUT_DEP.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrDoubleTremolo : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrDoubleTremoloKind { - kNotesDoubleTremolo, kChordsDoubleTremolo}; - - static string msrDoubleTremoloKindAsString ( - msrDoubleTremoloKind doubleTremolotKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrDoubleTremoloKind doubleTremoloKind, - msrTremoloTypeKind doubleTremoloTypeKind, - int doubleTremoloMarksNumber, - msrPlacementKind doubleTremoloPlacementKind); - - - SMARTP createDoubleTremoloNewbornClone ( - S_msrElement doubleTremoloFirstElement, - S_msrElement doubleTremoloSecondElement); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrDoubleTremolo ( - int inputLineNumber, - msrDoubleTremoloKind doubleTremoloKind, - msrTremoloTypeKind doubleTremoloTypeKind, - int doubleTremoloMarksNumber, - msrPlacementKind doubleTremoloPlacementKind); - - virtual ~msrDoubleTremolo (); - - public: - - // set and get - // ------------------------------------------------------ - - // double tremolo kind - - void setDoubleTremoloKind ( - msrDoubleTremoloKind doubleTremoloKind) - { fDoubleTremoloKind = doubleTremoloKind; } - - msrDoubleTremoloKind getDoubleTremoloKind () const - { return fDoubleTremoloKind; } - - // double tremolo type kind - - void setDoubleTremoloTypeKind ( - msrTremoloTypeKind doubleTremoloTypeKind) - { fDoubleTremoloTypeKind = doubleTremoloTypeKind; } - - msrTremoloTypeKind getDoubleTremoloTypeKind () const - { return fDoubleTremoloTypeKind; } - - // double tremolo placement - - void setDoubleTremoloPlacementKind ( - msrPlacementKind - doubleTremoloPlacementKind) - { - fDoubleTremoloPlacementKind = - doubleTremoloPlacementKind; - } - - msrPlacementKind getDoubleTremoloPlacementKind () const - { return fDoubleTremoloPlacementKind; } - - // double tremolo marks number - - int getDoubleTremoloMarksNumber () const - { return fDoubleTremoloMarksNumber; } - - // double tremolo elements duration - - rational getDoubleTremoloElementsDuration () const - { return fDoubleTremoloElementsDuration; } - - // double tremolo number of repeats - - void setDoubleTremoloNumberOfRepeats ( - int doubleTremoloNumberOfRepeats) - { - fDoubleTremoloNumberOfRepeats = - doubleTremoloNumberOfRepeats; - } - - int getDoubleTremoloNumberOfRepeats () const - { - return - fDoubleTremoloNumberOfRepeats; - } - - - // double tremolo placement - - void setDoubleTremoloNoteFirstElement ( - S_msrNote note); - - void setDoubleTremoloChordFirstElement ( - S_msrChord chord); - - // double tremolo first element - - S_msrElement getDoubleTremoloFirstElement () const - { return fDoubleTremoloFirstElement; } - - // double tremolo second element - - void setDoubleTremoloNoteSecondElement ( - S_msrNote note); - - void setDoubleTremoloChordSecondElement ( - S_msrChord chord); - - S_msrElement getDoubleTremoloSecondElement () const - { return fDoubleTremoloSecondElement; } - - // sounding whole notes - - void setDoubleTremoloSoundingWholeNotes ( - rational wholeNotes) - { - // JMI fDoubleTremoloSoundingWholeNotes = - fMeasureElementSoundingWholeNotes = - wholeNotes; - } - - rational getDoubleTremoloSoundingWholeNotes () const - { - return - // JMI fDoubleTremoloSoundingWholeNotes; - fMeasureElementSoundingWholeNotes; - } - - // measure number - - void setDoubleTremoloMeasureNumber ( - string measureNumber); - - // position in measure - - void setDoubleTremoloPositionInMeasure ( - rational positionInMeasure); - - // services - // ------------------------------------------------------ - - // tremolo first note - - void setDoubleTremoloFirstNotePositionInMeasure ( - rational positionInMeasure); - - void setDoubleTremoloFirstNoteMeasureNumber ( - string measureNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string doubleTremoloPlacementKindAsString () const; - - string asShortString () const; - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // sounding whole notes JMI - // the same as the displayed divisions of both members -// JMI rational fDoubleTremoloSoundingWholeNotes; - rational fDoubleTremoloSoundingWholeNotes; - - msrDoubleTremoloKind fDoubleTremoloKind; - - msrTremoloTypeKind fDoubleTremoloTypeKind; - - int fDoubleTremoloMarksNumber; - - rational fDoubleTremoloElementsDuration; - - int fDoubleTremoloNumberOfRepeats; - - msrPlacementKind fDoubleTremoloPlacementKind; - - // the two elements of a double tremole are notes or chords - S_msrElement fDoubleTremoloFirstElement; - S_msrElement fDoubleTremoloSecondElement; -}; -typedef SMARTP S_msrDoubleTremolo; -EXP ostream& operator<< (ostream& os, const S_msrDoubleTremolo& elt); - diff --git a/src/lilypond/msrDynamics.cpp b/src/lilypond/msrDynamics.cpp deleted file mode 100644 index 399a01773..000000000 --- a/src/lilypond/msrDynamics.cpp +++ /dev/null @@ -1,491 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrDynamics.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrDynamics msrDynamics::create ( - int inputLineNumber, - msrDynamicsKind dynamicsKind, - msrPlacementKind dynamicsPlacementKind) -{ - msrDynamics* o = - new msrDynamics ( - inputLineNumber, - dynamicsKind, - dynamicsPlacementKind); - assert(o!=0); - return o; -} - -msrDynamics::msrDynamics ( - int inputLineNumber, - msrDynamicsKind dynamicsKind, - msrPlacementKind dynamicsPlacementKind) - : msrElement (inputLineNumber) -{ - fDynamicsKind = dynamicsKind; - - fDynamicsPlacementKind = dynamicsPlacementKind; -} - -msrDynamics::~msrDynamics () -{} - -string msrDynamics::dynamicsKindAsString ( - msrDynamicsKind dynamicsKind) -{ - string result; - - switch (dynamicsKind) { - case msrDynamics::kF: - result = "f"; - break; - case msrDynamics::kFF: - result = "ff"; - break; - case msrDynamics::kFFF: - result = "fff"; - break; - case msrDynamics::kFFFF: - result = "ffff"; - break; - case msrDynamics::kFFFFF: - result = "fffff"; - break; - case msrDynamics::kFFFFFF: - result = "ffffff"; - break; - - case msrDynamics::kP: - result = "p"; - break; - case msrDynamics::kPP: - result = "pp"; - break; - case msrDynamics::kPPP: - result = "ppp"; - break; - case msrDynamics::kPPPP: - result = "pppp"; - break; - case msrDynamics::kPPPPP: - result = "ppppp"; - break; - case msrDynamics::kPPPPPP: - result = "pppppp"; - break; - - case msrDynamics::kMF: - result = "mf"; - break; - case msrDynamics::kMP: - result = "mp"; - break; - case msrDynamics::kFP: - result = "fp"; - break; - case msrDynamics::kFZ: - result = "fz"; - break; - case msrDynamics::kRF: - result = "rf"; - break; - case msrDynamics::kSF: - result = "sf"; - break; - - case msrDynamics::kRFZ: - result = "rfz"; - break; - case msrDynamics::kSFZ: - result = "sfz"; - break; - case msrDynamics::kSFP: - result = "sfp"; - break; - case msrDynamics::kSFPP: - result = "sfpp"; - break; - case msrDynamics::kSFFZ: - result = "sffz"; - break; - case msrDynamics::k_NoDynamics: - result = "k_NoDynamics???"; - } // switch - - return result; -} - -string msrDynamics::dynamicsKindAsString () const -{ - return - dynamicsKindAsString (fDynamicsKind); -} - -string msrDynamics::dynamicsPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fDynamicsPlacementKind); -} - -void msrDynamics::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDynamics::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDynamics elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDynamics::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrDynamics::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDynamics::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDynamics elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDynamics::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - - -void msrDynamics::browseData (basevisitor* v) -{} - -void msrDynamics::print (ostream& os) const -{ - os << - "Dynamics" " " << - dynamicsKindAsString () << - ", dynamicsPlacementKind: " << - dynamicsPlacementKindAsString () << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrDynamics& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrOtherDynamics msrOtherDynamics::create ( - int inputLineNumber, - string otherDynamicsString, - msrPlacementKind otherDynamicsPlacementKind) -{ - msrOtherDynamics* o = - new msrOtherDynamics ( - inputLineNumber, - otherDynamicsString, - otherDynamicsPlacementKind); - assert(o!=0); - return o; -} - -msrOtherDynamics::msrOtherDynamics ( - int inputLineNumber, - string otherDynamicsString, - msrPlacementKind otherDynamicsPlacementKind) - : msrElement (inputLineNumber) -{ - fOtherDynamicsString = otherDynamicsString; - - fOtherDynamicsPlacementKind = otherDynamicsPlacementKind; -} - -msrOtherDynamics::~msrOtherDynamics () -{} - -string msrOtherDynamics::otherDynamicsPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fOtherDynamicsPlacementKind); -} - -void msrOtherDynamics::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrOtherDynamics::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOtherDynamics elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrOtherDynamics::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrOtherDynamics::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrOtherDynamics::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOtherDynamics elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrOtherDynamics::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - - -void msrOtherDynamics::browseData (basevisitor* v) -{} - -string msrOtherDynamics::asString () const -{ - stringstream s; - - s << - "OtherDynamics '" << - ", otherDynamicsString: " << - fOtherDynamicsString << - ", otherDynamicsPlacementKind: " << - otherDynamicsPlacementKindAsString () << - "', line " << fInputLineNumber; - - return s.str (); -} - -void msrOtherDynamics::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrOtherDynamics& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrWedge msrWedge::create ( - int inputLineNumber, - msrWedgeKind wedgeKind, - msrWedgeNienteKind wedgeNienteKind, - msrLineTypeKind wedgeLineTypeKind, - msrPlacementKind wedgePlacementKind) -{ - msrWedge* o = - new msrWedge ( - inputLineNumber, - wedgeKind, - wedgeNienteKind, - wedgeLineTypeKind, - wedgePlacementKind); - assert(o!=0); - return o; -} - -msrWedge::msrWedge ( - int inputLineNumber, - msrWedgeKind wedgeKind, - msrWedgeNienteKind wedgeNienteKind, - msrLineTypeKind wedgeLineTypeKind, - msrPlacementKind wedgePlacementKind) - : msrElement (inputLineNumber) -{ - fWedgeKind = wedgeKind; - fWedgeNienteKind = wedgeNienteKind; - fWedgeLineTypeKind = wedgeLineTypeKind; - fWedgePlacementKind = wedgePlacementKind; -} - -msrWedge::~msrWedge () -{} - -string msrWedge::wedgeKindAsString () const -{ - string result; - - switch (fWedgeKind) { - case msrWedge::kWedgeKindNone: - result = "wedgeKindNone"; - break; - case msrWedge::kWedgeCrescendo: - result = "wedgeCrescendo"; - break; - case msrWedge::kWedgeDecrescendo: - result = "wedgeDecrescendo"; - break; - case msrWedge::kWedgeStop: - result = "wedgeStop"; - break; - } // switch - - return result; -} - -string msrWedge::wedgeNienteKindAsString ( - msrWedgeNienteKind wedgeNienteKind) -{ - string result; - - switch (wedgeNienteKind) { - case msrWedge::kWedgeNienteYes: - result = "kWedgeNienteYes"; - break; - case msrWedge::kWedgeNienteNo: - result = "kWedgeNienteNo"; - break; - } // switch - - return result; -} - -void msrWedge::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrWedge::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrWedge elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrWedge::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrWedge::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrWedge::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrWedge elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrWedge::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrWedge::browseData (basevisitor* v) -{} - -void msrWedge::print (ostream& os) const -{ - os << - "Wedge" " " << wedgeKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 19; - - os << left << - setw (fieldWidth) << - "wedgeNienteKind" << " : " << - wedgeNienteKindAsString ( - fWedgeNienteKind) << - endl << - setw (fieldWidth) << - "wedgeLineTypeKind" << " : " << - msrLineTypeKindAsString ( - fWedgeLineTypeKind) << - endl << - setw (fieldWidth) << - "wedgePlacementKind" << " : " << - msrPlacementKindAsString ( - fWedgePlacementKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrWedge& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrDynamics.h b/src/lilypond/msrDynamics.h deleted file mode 100644 index 9823362bc..000000000 --- a/src/lilypond/msrDynamics.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrDynamics___ -#define ___msrDynamics___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrDynamics : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrDynamicsKind { - kF, kFF, kFFF, kFFFF, kFFFFF, kFFFFFF, - kP, kPP, kPPP, kPPPP, kPPPPP, kPPPPPP, - kMF, kMP, kFP, kFZ, kRF, kSF, kRFZ, kSFZ, kSFP, kSFPP, kSFFZ, - k_NoDynamics }; - - static string dynamicsKindAsString ( - msrDynamicsKind dynamicsKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrDynamicsKind dynamicsKind, - msrPlacementKind dynamicsPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrDynamics ( - int inputLineNumber, - msrDynamicsKind dynamicsKind, - msrPlacementKind dynamicsPlacementKind); - - virtual ~msrDynamics (); - - public: - - // set and get - // ------------------------------------------------------ - - msrDynamicsKind getDynamicsKind () const - { return fDynamicsKind; } - - msrPlacementKind getDynamicsPlacementKind () const - { return fDynamicsPlacementKind; } - - public: - - // public services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string dynamicsKindAsString () const; - - string dynamicsPlacementKindAsString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrDynamicsKind fDynamicsKind; - - msrPlacementKind fDynamicsPlacementKind; -}; -typedef SMARTP S_msrDynamics; -EXP ostream& operator<< (ostream& os, const S_msrDynamics& elt); - -//______________________________________________________________________________ -class msrOtherDynamics : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string otherDynamicsString, - msrPlacementKind otherDynamicsPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrOtherDynamics ( - int inputLineNumber, - string otherDynamicsString, - msrPlacementKind otherDynamicsPlacementKind); - - virtual ~msrOtherDynamics (); - - public: - - // set and get - // ------------------------------------------------------ - - string getOtherDynamicsString () const - { return fOtherDynamicsString; } - - msrPlacementKind getOtherDynamicsPlacementKind () const - { return fOtherDynamicsPlacementKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string otherDynamicsPlacementKindAsString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fOtherDynamicsString; - - msrPlacementKind fOtherDynamicsPlacementKind; -}; -typedef SMARTP S_msrOtherDynamics; -EXP ostream& operator<< (ostream& os, const S_msrOtherDynamics& elt); - -//______________________________________________________________________________ -class msrWedge : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrWedgeKind { - kWedgeKindNone, - kWedgeCrescendo, kWedgeDecrescendo, kWedgeStop }; - - static string wedgeKindAsString ( - msrWedgeKind wedgeKind); - - enum msrWedgeNienteKind { - kWedgeNienteYes, kWedgeNienteNo }; - - static string wedgeNienteKindAsString ( - msrWedgeNienteKind wedgeNienteKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrWedgeKind wedgeKind, - msrWedgeNienteKind wedgeNienteKind, - msrLineTypeKind wedgeLineTypeKind, - msrPlacementKind wedgePlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrWedge ( - int inputLineNumber, - msrWedgeKind wedgeKind, - msrWedgeNienteKind wedgeNienteKind, - msrLineTypeKind wedgeLineTypeKind, - msrPlacementKind wedgePlacementKind); - - virtual ~msrWedge (); - - public: - - // set and get - // ------------------------------------------------------ - - msrWedgeKind getWedgeKind () const - { return fWedgeKind; } - - msrWedgeNienteKind getWedgeNienteKind () const - { return fWedgeNienteKind; } - - msrLineTypeKind getWedgeLineTypeKind () const - { return fWedgeLineTypeKind; } - - msrPlacementKind getWedgePlacementKind () const - { return fWedgePlacementKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string wedgeKindAsString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrWedgeKind fWedgeKind; - - msrWedgeNienteKind fWedgeNienteKind; - - msrLineTypeKind fWedgeLineTypeKind; - - msrPlacementKind fWedgePlacementKind; -}; -typedef SMARTP S_msrWedge; -EXP ostream& operator<< (ostream& os, const S_msrWedge& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrElements.cpp b/src/lilypond/msrElements.cpp deleted file mode 100644 index c51c85864..000000000 --- a/src/lilypond/msrElements.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // INT_MIN, INT_MAX - -#include "msrElements.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -msrElement::msrElement ( - int inputLineNumber) -{ - fInputLineNumber = inputLineNumber; -} - -msrElement::~msrElement () -{} - -void msrElement::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrElement::msrElement ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrElement::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrElement::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrElement::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrElement::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -string msrElement::asString () const -{ - // this is overriden all in actual elements - return "??? msrElement::asString () ???"; -} - -string msrElement::asShortString () const -{ - // this can be overriden in actual elements - return asString (); -} - -void msrElement::print (ostream& os) const -{ - os << asString () << endl; -} - -void msrElement::shortPrint (ostream& os) const -{ - print (os); -} - -ostream& operator<< (ostream& os, const S_msrElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrElements.h b/src/lilypond/msrElements.h deleted file mode 100644 index 8a49a70ae..000000000 --- a/src/lilypond/msrElements.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrElements___ -#define ___msrElements___ - -#include "typedefs.h" -#include "tree_browser.h" -#include "rational.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrElement : public smartable -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - // cloning - // ------------------------------------------------------ - - protected: - - msrElement ( - int inputLineNumber); - - virtual ~msrElement (); - - public: - - // set and get - // ------------------------------------------------------ - - int getInputLineNumber () - { return fInputLineNumber; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v) = 0; - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asShortString () const; - virtual std::string asString () const; - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - virtual void printSummary (ostream& os) {} - - protected: - - // fields - // ------------------------------------------------------ - - int fInputLineNumber; -}; -typedef SMARTP S_msrElement; -EXP ostream& operator<< (ostream& os, const S_msrElement& elt); - -//______________________________________________________________________________ -template class msrBrowser : public browser -{ - public: - - msrBrowser (basevisitor* v) : fVisitor (v) {} - - virtual ~msrBrowser () {} - - public: - - virtual void set (basevisitor* v) { fVisitor = v; } - - virtual void browse (T& t) { - enter (t); - - t.browseData (fVisitor); - - leave (t); - } - - protected: - - basevisitor* fVisitor; - - virtual void enter (T& t) { t.acceptIn (fVisitor); } - virtual void leave (T& t) { t.acceptOut (fVisitor); } -}; - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrFiguredBasses.cpp b/src/lilypond/msrFiguredBasses.cpp deleted file mode 100644 index 9c714cff4..000000000 --- a/src/lilypond/msrFiguredBasses.cpp +++ /dev/null @@ -1,736 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrFigure msrFigure::create ( - int inputLineNumber, - S_msrPart figurePartUpLink, - msrFigurePrefixKind figurePrefixKind, - int figureNumber, - msrFigureSuffixKind figureSuffixKind) -{ - msrFigure* o = - new msrFigure ( - inputLineNumber, - figurePartUpLink, - figurePrefixKind, - figureNumber, - figureSuffixKind); - assert(o!=0); - - return o; -} - -msrFigure::msrFigure ( - int inputLineNumber, - S_msrPart figurePartUpLink, - msrFigurePrefixKind figurePrefixKind, - int figureNumber, - msrFigureSuffixKind figureSuffixKind) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert( - figurePartUpLink != nullptr, - "figurePartUpLink is null"); - - // set figured's part upLink - fFigurePartUpLink = - figurePartUpLink; - - fFigurePrefixKind = figurePrefixKind; - fFigureNumber = figureNumber; - fFigureSuffixKind = figureSuffixKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Creating figure '" << - asString () << - "'" << - endl; - } -#endif -} - -msrFigure::~msrFigure () -{} - -S_msrFigure msrFigure::createFigureNewbornClone ( - S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Creating a newborn clone of figure '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - - S_msrFigure - newbornClone = - msrFigure::create ( - fInputLineNumber, - containingPart, - fFigurePrefixKind, - fFigureNumber, - fFigureSuffixKind); - - return newbornClone; -} - -S_msrFigure msrFigure::createFigureDeepCopy ( - S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Creating a deep copy of figure '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - - S_msrFigure - figureDeepCopy = - msrFigure::create ( - fInputLineNumber, - containingPart, - fFigurePrefixKind, - fFigureNumber, - fFigureSuffixKind); - - return figureDeepCopy; -} - -string msrFigure::figurePrefixKindAsString ( - msrFigurePrefixKind figurePrefixKind) -{ - string result; - - switch (figurePrefixKind) { - case msrFigure::k_NoFigurePrefix: - result = "none"; - break; - case msrFigure::kDoubleFlatPrefix: - result = "double flat"; - break; - case msrFigure::kFlatPrefix: - result = "flat"; - break; - case msrFigure::kFlatFlatPrefix: - result = "flat flat"; - break; - case msrFigure::kNaturalPrefix: - result = "natural"; - break; - case msrFigure::kSharpSharpPrefix: - result = "sharp sharp"; - break; - case msrFigure::kSharpPrefix: - result = "sharp"; - break; - case msrFigure::kDoubleSharpPrefix: - result = "souble sharp"; - break; - } // switch - - return result; -} - -string msrFigure::figureSuffixKindAsString ( - msrFigureSuffixKind figureSuffixKind) -{ - string result; - - switch (figureSuffixKind) { - case msrFigure::k_NoFigureSuffix: - result = "none"; - break; - case msrFigure::kDoubleFlatSuffix: - result = "double flat"; - break; - case msrFigure::kFlatSuffix: - result = "flat"; - break; - case msrFigure::kFlatFlatSuffix: - result = "flat flat"; - break; - case msrFigure::kNaturalSuffix: - result = "natural"; - break; - case msrFigure::kSharpSharpSuffix: - result = "sharp sharp"; - break; - case msrFigure::kSharpSuffix: - result = "sharp"; - break; - case msrFigure::kDoubleSharpSuffix: - result = "souble sharp"; - break; - case msrFigure::kSlashSuffix: - result = "slash"; - break; - } // switch - - return result; -} - -string msrFigure::asString () const -{ - stringstream s; - - s << - "Figure" << - "'" << fFigureNumber << - "', prefix: " << - figurePrefixKindAsString ( - fFigurePrefixKind) << - ", suffix: " << - figureSuffixKindAsString ( - fFigureSuffixKind); - -/* JMI - if (fFigurePartUpLink) { // JMI ??? - s << - ":" << - wholeNotesAsMsrString ( - fInputLineNumber, - fFigureSoundingWholeNotes); - } -*/ - - return s.str (); -} - -void msrFigure::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFigure::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFigure elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFigure::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrFigure::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFigure::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFigure elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFigure::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrFigure::browseData (basevisitor* v) -{} - -void msrFigure::print (ostream& os) const -{ - os << - "Figure" << - " '" << fFigureNumber << - "', prefix: " << - figurePrefixKindAsString ( - fFigurePrefixKind) << - ", suffix: " << - figureSuffixKindAsString ( - fFigureSuffixKind) << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrFigure& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrFiguredBass msrFiguredBass::create ( - // no figuredBassVoiceUpLink yet - int inputLineNumber) // , -// JMI S_msrPart figuredBassPartUpLink) -{ - msrFiguredBass* o = - new msrFiguredBass ( - inputLineNumber, -// figuredBassPartUpLink, - rational (0, 1), // figuredBassSoundingWholeNotes - rational (0, 1), // figuredBassDisplayWholeNotes - kFiguredBassParenthesesNo, - msrTupletFactor (1, 1)); - assert(o!=0); - - return o; -} - -S_msrFiguredBass msrFiguredBass::create ( - int inputLineNumber, -// S_msrPart figuredBassPartUpLink, - rational figuredBassSoundingWholeNotes, - rational figuredBassDisplayWholeNotes, - msrFiguredBassParenthesesKind figuredBassParenthesesKind, - msrTupletFactor figuredBassTupletFactor) -{ - msrFiguredBass* o = - new msrFiguredBass ( - inputLineNumber, - // figuredBassPartUpLink, - figuredBassSoundingWholeNotes, - figuredBassDisplayWholeNotes, - figuredBassParenthesesKind, - figuredBassTupletFactor); - assert(o!=0); - - return o; -} - -msrFiguredBass::msrFiguredBass ( - int inputLineNumber, -// S_msrPart figuredBassPartUpLink, - rational figuredBassSoundingWholeNotes, - rational figuredBassDisplayWholeNotes, - msrFiguredBassParenthesesKind figuredBassParenthesesKind, - msrTupletFactor figuredBassTupletFactor) - : msrMeasureElement (inputLineNumber), - fFiguredBassTupletFactor (figuredBassTupletFactor) -{ - /* JMI - // sanity check - msrAssert( - figuredBassPartUpLink != nullptr, - "figuredBassPartUpLink is null"); - - // set figuredBass's part upLink - fFiguredBassPartUpLink = - figuredBassPartUpLink; - */ - -// JMI fFiguredBassSoundingWholeNotes = -// JMI figuredBassSoundingWholeNotes; - fMeasureElementSoundingWholeNotes = - fMeasureElementSoundingWholeNotes; - fFiguredBassDisplayWholeNotes = - figuredBassDisplayWholeNotes; - - fFiguredBassParenthesesKind = - figuredBassParenthesesKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Creating figuredBass " << - asString () << - endl; - } -#endif -} - -msrFiguredBass::~msrFiguredBass () -{} - -S_msrFiguredBass msrFiguredBass::createFiguredBassNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Creating a newborn clone of figured bass '" << - asShortString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrFiguredBass - newbornClone = - msrFiguredBass::create ( - fInputLineNumber, - // containingPart, -// JMI fFiguredBassSoundingWholeNotes, - fMeasureElementSoundingWholeNotes, - fFiguredBassDisplayWholeNotes, - fFiguredBassParenthesesKind, - fFiguredBassTupletFactor); - - return newbornClone; -} - -S_msrFiguredBass msrFiguredBass::createFiguredBassDeepCopy () - // S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Creating a deep copy of figuredBass '" << - asString () << - "'" << - endl; - } -#endif - -/* JMi - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - */ - - S_msrFiguredBass - figuredBassDeepCopy = - msrFiguredBass::create ( - fInputLineNumber, - // containingPart, -// JMI fFiguredBassSoundingWholeNotes, - fMeasureElementSoundingWholeNotes, - fFiguredBassDisplayWholeNotes, - fFiguredBassParenthesesKind, - fFiguredBassTupletFactor); - - return figuredBassDeepCopy; -} - -void msrFiguredBass::setFiguredBassPositionInMeasure ( - rational positionInMeasure) -{ - // set the figured bass position in measure, taking it's offset into account - -/* JMI - // the offset can negative, merely add it - // this overwrites it with the same value if fHarmonyWholeNotesOffset is null - rational - actualPositionInMeasure = - positionInMeasure - + - fFiguredBassWholeNotesOffset; - actualPositionInMeasure.rationalise (); -*/ - -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Setting figured bass position in measure of " << asString () << - " to '" << - positionInMeasure << -// "', figuredBassWholeNotesOffset = " << -// fFiguredBassWholeNotesOffset << -// "', actualPositionInMeasure = " << -// actualPositionInMeasure << - endl; - } -#endif - -/* JMI - msrMeasureElement::setMeasureElementPositionInMeasure ( - actualPositionInMeasure, - "setHarmonyPositionInMeasure()"); - */ -} - -void msrFiguredBass::appendFigureToFiguredBass ( - S_msrFigure figure) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figure '" << figure->asString () << - "' to figuredBass '" << - asString () << - "'" << - endl; - } -#endif - - fFiguredBassFiguresList.push_back (figure); -} - -void msrFiguredBass::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFiguredBass::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFiguredBass elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFiguredBass::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrFiguredBass::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFiguredBass::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFiguredBass elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFiguredBass::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrFiguredBass::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fFiguredBassFiguresList.begin (); - i != fFiguredBassFiguresList.end (); - i++ - ) { - // browse the figure - msrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string msrFiguredBass::figuredBassParenthesesKindAsString ( - msrFiguredBassParenthesesKind figuredBassParenthesesKind) -{ - string result; - - switch (figuredBassParenthesesKind) { - case msrFiguredBass::kFiguredBassParenthesesYes: - result = "figuredBassParenthesesYes"; - break; - case msrFiguredBass::kFiguredBassParenthesesNo: - result = "figuredBassParenthesesNo"; - break; - } // switch - - return result; -} - -string msrFiguredBass::asString () const -{ - stringstream s; - - s << - "[Figured bass" << - ", measureElementSoundingWholeNotes: " << - wholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes) << - ", figuredBassDisplayWholeNotes: " << - wholeNotesAsMsrString ( - fInputLineNumber, - fFiguredBassDisplayWholeNotes) << - - ", figuredBassParenthesesKind: " << - figuredBassParenthesesKindAsString ( - fFiguredBassParenthesesKind) << - - ", figuredBassTupletFactor: " << - fFiguredBassTupletFactor.asString (); - - if (fFiguredBassFiguresList.size ()) { - s << ", figuredBassFiguresList: ["; - - list::const_iterator - iBegin = fFiguredBassFiguresList.begin (), - iEnd = fFiguredBassFiguresList.end (), - i = iBegin; - - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << " "; - } // for - s << "]"; - } - - // print the figured bass position in measure - s << - ", positionInMeasure: " << fMeasureElementPositionInMeasure; - -/* JMI - if (fFiguredBassPartUpLink) { // JMI ??? - s << - ":" << - wholeNotesAsMsrString ( - fInputLineNumber, - fFiguredBassSoundingWholeNotes); - } -*/ - - s << - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -void msrFiguredBass::print (ostream& os) const -{ - os << - "FiguredBass" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 30; - - os << - setw (fieldWidth) << - "figuredBassNoteUpLink" << " : "; - if (fFiguredBassNoteUpLink) { - os << fFiguredBassNoteUpLink->asString (); - } - else { - os << "none"; - } - os << endl; - - os << - setw (fieldWidth) << - "figuredBassVoiceUpLink" << " : "; - if (fFiguredBassVoiceUpLink) { - os << fFiguredBassVoiceUpLink->asString (); - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "measureElementSoundingWholeNotes" << " : " << - fMeasureElementSoundingWholeNotes << - endl << - - setw (fieldWidth) << - "figuredBassDisplayWholeNotes" << " : " << - fFiguredBassDisplayWholeNotes << - endl << - - setw (fieldWidth) << - "figuredBassParenthesesKind" << " : " << - figuredBassParenthesesKindAsString ( - fFiguredBassParenthesesKind) << - endl << - - setw (fieldWidth) << - "figuredBassTupletFactor" << " : " << - fFiguredBassTupletFactor.asString () << - endl; - - if (fFiguredBassFiguresList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fFiguredBassFiguresList.begin (), - iEnd = fFiguredBassFiguresList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - // print the figured bass position in measure - os << - setw (fieldWidth) << - "positionInMeasure" << " : " << fMeasureElementPositionInMeasure << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrFiguredBass& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrFiguredBasses_MUT_DEP.h b/src/lilypond/msrFiguredBasses_MUT_DEP.h deleted file mode 100644 index beeec0806..000000000 --- a/src/lilypond/msrFiguredBasses_MUT_DEP.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrFigure : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrFigurePrefixKind { - k_NoFigurePrefix, - kDoubleFlatPrefix, kFlatPrefix, kFlatFlatPrefix, - kNaturalPrefix, - kSharpSharpPrefix, kSharpPrefix, kDoubleSharpPrefix }; - - static string figurePrefixKindAsString ( - msrFigurePrefixKind figurePrefixKind); - - enum msrFigureSuffixKind { - k_NoFigureSuffix, - kDoubleFlatSuffix, kFlatSuffix, kFlatFlatSuffix, - kNaturalSuffix, - kSharpSharpSuffix, kSharpSuffix, kDoubleSharpSuffix, - kSlashSuffix }; - - static string figureSuffixKindAsString ( - msrFigureSuffixKind figureSuffixKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrPart figurePartUpLink, - msrFigurePrefixKind figurePrefixKind, - int figureNumber, - msrFigureSuffixKind figureSuffixKind); - - SMARTP createFigureNewbornClone ( - S_msrPart containingPart); - - SMARTP createFigureDeepCopy ( // JMI ??? - S_msrPart containingPart); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrFigure ( - int inputLineNumber, - S_msrPart figurePartUpLink, - msrFigurePrefixKind figurePrefixKind, - int figureNumber, - msrFigureSuffixKind figureSuffixKind); - - virtual ~msrFigure (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrPart getFigurePartUpLink () const - { return fFigurePartUpLink; } - - msrFigurePrefixKind - getFigurePrefixKind () const - { return fFigurePrefixKind; } - - int getFigureNumber () const - { return fFigureNumber; } - - msrFigureSuffixKind - getFigureSuffixKind () const - { return fFigureSuffixKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string figurePrefixKindAsString () const; - string figureSuffixKindAsShortString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrPart fFigurePartUpLink; - - msrFigurePrefixKind - fFigurePrefixKind; - int fFigureNumber; - msrFigureSuffixKind - fFigureSuffixKind; -}; -typedef SMARTP S_msrFigure; -EXP ostream& operator<< (ostream& os, const S_msrFigure& elt); - -//______________________________________________________________________________ -class msrFiguredBass : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrFiguredBassParenthesesKind { - kFiguredBassParenthesesYes, kFiguredBassParenthesesNo }; - - static string figuredBassParenthesesKindAsString ( - msrFiguredBassParenthesesKind figuredBassParenthesesKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); // JMI ??? - - static SMARTP create ( - int inputLineNumber, - // S_msrPart figuredBassPartUpLink, - rational figuredBassSoundingWholeNotes, - rational figuredBassDisplayWholeNotes, - msrFiguredBassParenthesesKind figuredBassParenthesesKind, - msrTupletFactor figuredBassTupletFactor); - - SMARTP createFiguredBassNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createFiguredBassDeepCopy (); // JMI ??? - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrFiguredBass ( - int inputLineNumber, - // S_msrPart figuredBassPartUpLink, - rational figuredBassSoundingWholeNotes, - rational figuredBassDisplayWholeNotes, - msrFiguredBassParenthesesKind figuredBassParenthesesKind, - msrTupletFactor figuredBassTupletFactor); - - virtual ~msrFiguredBass (); - - public: - - // set and get - // ------------------------------------------------------ - void setFiguredBassNoteUpLink ( - S_msrNote note) - { fFiguredBassNoteUpLink = note; } - - S_msrNote getFiguredBassNoteUpLink () const - { return fFiguredBassNoteUpLink; } - - void setFiguredBassVoiceUpLink ( - S_msrVoice voice) - { fFiguredBassVoiceUpLink = voice; } - - S_msrVoice getFiguredBassVoiceUpLink () const - { return fFiguredBassVoiceUpLink; } - -/* JMI - S_msrPart getFiguredBassPartUpLink () const - { return fFiguredBassPartUpLink; } -*/ - - void setFiguredBassSoundingWholeNotes ( - rational wholeNotes) - { - fMeasureElementSoundingWholeNotes = - wholeNotes; - } - - rational getFiguredBassSoundingWholeNotes () const - { return fMeasureElementSoundingWholeNotes; } - - void setFiguredBassDisplayWholeNotes ( - rational wholeNotes) - { fFiguredBassDisplayWholeNotes = wholeNotes; } - - rational getFiguredBassDisplayWholeNotes () const - { return fFiguredBassDisplayWholeNotes; } - - msrFiguredBassParenthesesKind - getFiguredBassParenthesesKind () const - { return fFiguredBassParenthesesKind; } - - const list& - getFiguredBassFiguresList () - { return fFiguredBassFiguresList; } - - void setFiguredBassTupletFactor ( - msrTupletFactor tupletFactor) - { fFiguredBassTupletFactor = tupletFactor; } - - msrTupletFactor getFiguredBassTupletFactor () const - { return fFiguredBassTupletFactor; } - - void setFiguredBassPositionInMeasure ( - rational positionInMeasure); - - // services - // ------------------------------------------------------ - - void appendFigureToFiguredBass ( - S_msrFigure figure); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - // JMI S_msrPart fFiguredBassPartUpLink; - S_msrNote fFiguredBassNoteUpLink; - S_msrVoice fFiguredBassVoiceUpLink; - - rational fFiguredBassDisplayWholeNotes; // JMI useless??? - - msrFiguredBassParenthesesKind - fFiguredBassParenthesesKind; - - list fFiguredBassFiguresList; - - msrTupletFactor fFiguredBassTupletFactor; -}; -typedef SMARTP S_msrFiguredBass; -EXP ostream& operator<< (ostream& os, const S_msrFiguredBass& elt); - diff --git a/src/lilypond/msrGlissandos.cpp b/src/lilypond/msrGlissandos.cpp deleted file mode 100644 index e4c9d1cca..000000000 --- a/src/lilypond/msrGlissandos.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrGlissando msrGlissando::create ( - int inputLineNumber, - int glissandoNumber, - msrGlissandoTypeKind glissandoTypeKind, - msrLineTypeKind glissandoLineTypeKind, - string glissandoTextValue) -{ - msrGlissando* o = - new msrGlissando ( - inputLineNumber, - glissandoNumber, - glissandoTypeKind, - glissandoLineTypeKind, - glissandoTextValue); - assert(o!=0); - return o; -} - -msrGlissando::msrGlissando ( - int inputLineNumber, - int glissandoNumber, - msrGlissandoTypeKind glissandoTypeKind, - msrLineTypeKind glissandoLineTypeKind, - string glissandoTextValue) - : msrElement (inputLineNumber) -{ - fGlissandoNumber = glissandoNumber; - - fGlissandoTypeKind = glissandoTypeKind; - fGlissandoLineTypeKind = glissandoLineTypeKind; - - fGlissandoTextValue = glissandoTextValue; -} - -msrGlissando::~msrGlissando () -{} - -S_msrGlissando msrGlissando::createGlissandoNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGlissandos) { - gLogOstream << - "Creating a newborn clone of glissando '" << - asString () << - "'" << - endl; - } -#endif - - S_msrGlissando - newbornClone = - msrGlissando::create ( - fInputLineNumber, - fGlissandoNumber, - fGlissandoTypeKind, - fGlissandoLineTypeKind, - fGlissandoTextValue); - - return newbornClone; -} - -string msrGlissando::glissandoTypeKindAsString ( - msrGlissandoTypeKind glissandoTypeKind) -{ - string result; - - switch (glissandoTypeKind) { - case msrGlissando::kGlissandoTypeNone: - result = "glissandoTypeNone"; - break; - case msrGlissando::kGlissandoTypeStart: - result = "glissandoTypeStart"; - break; - case msrGlissando::kGlissandoTypeStop: - result = "glissandoTypeStop"; - break; - } // switch - - return result; -} - -void msrGlissando::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrGlissando::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrGlissando elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrGlissando::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrGlissando::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrGlissando::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrGlissando elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrGlissando::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrGlissando::browseData (basevisitor* v) -{} - -string msrGlissando::asString () const -{ - stringstream s; - - s << - "Glissando" << - ", fGlissandoNumber " << fGlissandoNumber << - ", " << glissandoTypeKindAsString ( - fGlissandoTypeKind) << - ", " << msrLineTypeKindAsString ( - fGlissandoLineTypeKind) << - ", \"" << fGlissandoTextValue << - "\", line " << fInputLineNumber; - - return s.str (); -} - -void msrGlissando::print (ostream& os) const -{ - os << - "Glissando" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - setw (fieldWidth) << - "glissandoNumber " << - fGlissandoNumber << - endl << - setw (fieldWidth) << - "glissandoTypeKind" << - glissandoTypeKindAsString ( - fGlissandoTypeKind) << - endl << - setw (fieldWidth) << - "glissandoLineTypeKind" << - msrLineTypeKindAsString ( - fGlissandoLineTypeKind) << - endl << - setw (fieldWidth) << - "fGlissandoTextValue" << " : \"" << - fGlissandoTextValue << - "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrGlissando& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrGlissandos_MUT_DEP.h b/src/lilypond/msrGlissandos_MUT_DEP.h deleted file mode 100644 index 364f4cbac..000000000 --- a/src/lilypond/msrGlissandos_MUT_DEP.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrGlissando : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrGlissandoTypeKind { - kGlissandoTypeNone, - kGlissandoTypeStart, kGlissandoTypeStop }; - - static string glissandoTypeKindAsString ( - msrGlissandoTypeKind glissandoTypeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int glissandoNumber, - msrGlissandoTypeKind glissandoTypeKind, - msrLineTypeKind glissandoLineTypeKind, - string glissandoTextValue); - - SMARTP createGlissandoNewbornClone (); - - SMARTP createGlissandoDeepCopy (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrGlissando ( - int inputLineNumber, - int glissandoNumber, - msrGlissandoTypeKind glissandoTypeKind, - msrLineTypeKind glissandoLineTypeKind, - string glissandoTextValue); - - virtual ~msrGlissando (); - - public: - - // set and get - // ------------------------------------------------------ - - int getGlissandoNumber () const - { return fGlissandoNumber; } - - msrGlissandoTypeKind getGlissandoTypeKind () const - { return fGlissandoTypeKind; } - - msrLineTypeKind getGlissandoLineTypeKind () const - { return fGlissandoLineTypeKind; } - - string getGlissandoTextValue () const - { return fGlissandoTextValue; } - - // measure upLink - void setGlissandoMeasureUpLink ( - const S_msrMeasure& measure) - { fGlissandoMeasureUpLink = measure; } - - S_msrMeasure getGlissandoMeasureUpLink () const - { return fGlissandoMeasureUpLink; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLink - S_msrMeasure fGlissandoMeasureUpLink; - - int fGlissandoNumber; - - msrGlissandoTypeKind fGlissandoTypeKind; - - msrLineTypeKind fGlissandoLineTypeKind; - - string fGlissandoTextValue; -}; -typedef SMARTP S_msrGlissando; -EXP ostream& operator<< (ostream& os, const S_msrGlissando& elt); - diff --git a/src/lilypond/msrGraceNotes.cpp b/src/lilypond/msrGraceNotes.cpp deleted file mode 100644 index 41aa60e24..000000000 --- a/src/lilypond/msrGraceNotes.cpp +++ /dev/null @@ -1,555 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrGraceNotesGroup msrGraceNotesGroup::create ( - int inputLineNumber, - msrGraceNotesGroupKind graceNotesGroupKind, - bool graceNotesGroupIsSlashed, - S_msrVoice graceNotesGroupVoiceUpLink) -{ - msrGraceNotesGroup* o = - new msrGraceNotesGroup ( - inputLineNumber, - graceNotesGroupKind, - graceNotesGroupIsSlashed, - graceNotesGroupVoiceUpLink); - assert(o!=0); - - return o; -} - -msrGraceNotesGroup::msrGraceNotesGroup ( - int inputLineNumber, - msrGraceNotesGroupKind graceNotesGroupKind, - bool graceNotesGroupIsSlashed, - S_msrVoice graceNotesGroupVoiceUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert( - graceNotesGroupVoiceUpLink != nullptr, - "graceNotesGroupVoiceUpLink is null"); - - fGraceNotesGroupVoiceUpLink = - graceNotesGroupVoiceUpLink; - - fGraceNotesGroupKind = graceNotesGroupKind; - - fGraceNotesGroupIsSlashed = graceNotesGroupIsSlashed; - - fGraceNotesGroupIsTied = false; - - // grace notes are followed by notes - // unless they are last in a measure - fGraceNotesGroupIsFollowedByNotes = true; -} - -msrGraceNotesGroup::~msrGraceNotesGroup () -{} - -S_msrGraceNotesGroup msrGraceNotesGroup::createGraceNotesGroupNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Creating a newborn clone of grace notes group '" << - asShortString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrGraceNotesGroup - newbornClone = - msrGraceNotesGroup::create ( - fInputLineNumber, - fGraceNotesGroupKind, - fGraceNotesGroupIsSlashed, - containingVoice); - - newbornClone->fGraceNotesGroupIsTied = - fGraceNotesGroupIsTied; - - newbornClone->fGraceNotesGroupIsFollowedByNotes = - fGraceNotesGroupIsFollowedByNotes; - - return newbornClone; -} - -S_msrPart msrGraceNotesGroup::fetchGraceNotesGroupPartUpLink () const -{ - return - fGraceNotesGroupVoiceUpLink-> - fetchVoicePartUpLink (); -} - -string msrGraceNotesGroup::graceNotesGroupKindAsString ( - msrGraceNotesGroupKind graceNotesGroupKind) -{ - string result; - - switch (graceNotesGroupKind) { - case msrGraceNotesGroup::kGraceNotesGroupBefore: - result = "graceNotesGroupBefore"; - break; - case msrGraceNotesGroup::kGraceNotesGroupAfter: - result = "graceNotesGroupAfter"; - break; - } // switch - - return result; -} - -S_msrGraceNotesGroup msrGraceNotesGroup::createSkipGraceNotesGroupClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Creating a skip clone of grace notes group '" << - asShortString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert ( - containingVoice != nullptr, - "containingVoice is null"); - - // create the grace notes group - S_msrGraceNotesGroup - clone = - msrGraceNotesGroup::create ( - fInputLineNumber, - fGraceNotesGroupKind, - fGraceNotesGroupIsSlashed, - containingVoice); - - clone->fGraceNotesGroupIsTied = - fGraceNotesGroupIsTied; - - clone->fGraceNotesGroupIsFollowedByNotes = - fGraceNotesGroupIsFollowedByNotes; - - // populating the clone with skips - for ( - list::const_iterator i=fGraceNotesGroupElementsList.begin (); - i!=fGraceNotesGroupElementsList.end (); - i++ - ) { - if ( - S_msrNote note = dynamic_cast(&(*(*i))) - ) { - // create skip with same duration as note - S_msrNote - skip = - msrNote::createSkipNote ( - note-> getInputLineNumber (), - note-> getMeasureElementMeasureNumber (), - note-> getNoteDisplayWholeNotes (), // would be 0/1 otherwise JMI - note-> getNoteDisplayWholeNotes (), - note-> getNoteDotsNumber (), - containingVoice-> getRegularVoiceStaffSequentialNumber (), // JMI - containingVoice-> getVoiceNumber ()); - - // append it to the grace notes - clone-> - appendNoteToGraceNotesGroup (skip); - } - - else if ( - S_msrChord chord = dynamic_cast(&(*(*i))) - ) { - // fetch the chord's first note - S_msrNote - chordFirstNote = - chord->getChordNotesVector () [0]; - - // create skip with same duration as chord - S_msrNote - skip = - msrNote::createSkipNote ( - chordFirstNote-> getInputLineNumber (), - chordFirstNote-> getMeasureElementMeasureNumber (), - chordFirstNote-> getNoteDisplayWholeNotes (), // would be 0/1 otherwise JMI - chordFirstNote-> getNoteDisplayWholeNotes (), - chordFirstNote-> getNoteDotsNumber (), - containingVoice-> getRegularVoiceStaffSequentialNumber (), // JMI - containingVoice-> getVoiceNumber ()); - - // append it to the grace notes - clone-> - appendNoteToGraceNotesGroup (skip); - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "grace notes element should be a note or a chord"); - } - } // for - - return clone; -} - -void msrGraceNotesGroup::appendNoteToGraceNotesGroup (S_msrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Appending note '" << - note->asShortString () << - "' to grace notes group" << - asShortString () << - " in voice \"" << - fGraceNotesGroupVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - fGraceNotesGroupElementsList.push_back (note); - - // register note's grace notes groups upLink - note-> - setNoteGraceNotesGroupUpLink (this); - - // is this grace note tied? - if (note->getNoteTie ()) { - fGraceNotesGroupIsTied = true; - } -} - -void msrGraceNotesGroup::appendChordToGraceNotesGroup (S_msrChord chord) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Appending chord '" << - chord->asShortString () << - "' to grace notes group '" << - asShortString () << - "' in voice \"" << - fGraceNotesGroupVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - fGraceNotesGroupElementsList.push_back (chord); -} - -S_msrNote msrGraceNotesGroup::removeLastNoteFromGraceNotesGroup ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Removing last note from grace notes group '" << - asShortString () << - "' in voice \"" << - fGraceNotesGroupVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert ( - fGraceNotesGroupElementsList.size () != 0, - "fGraceNotesGroupElementsList.size () == 0"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Removing last note from grace notes '" << - asString () << - "'" << - endl; - } -#endif - - S_msrNote result; - - if ( - S_msrNote note = dynamic_cast(&(*fGraceNotesGroupElementsList.back ())) - ) { - result = note; - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "removeLastNoteFromGraceNotesGroup (): grace notes group element should be a note"); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "This last note from grace notes '" << - asString () << - "' turns out to be '" << - result->asShortString () << - "'" << - endl; - } -#endif - - fGraceNotesGroupElementsList.pop_back (); - - return result; -} - -void msrGraceNotesGroup::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrGraceNotesGroup::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrGraceNotesGroup elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrGraceNotesGroup::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrGraceNotesGroup::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrGraceNotesGroup::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrGraceNotesGroup elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrGraceNotesGroup::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrGraceNotesGroup::browseData (basevisitor* v) -{ - list::const_iterator i; - - for ( - i=fGraceNotesGroupElementsList.begin (); - i!=fGraceNotesGroupElementsList.end (); - i++ - ) { - // browse the element (note or chord) - msrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string msrGraceNotesGroup::asShortString () const -{ - stringstream s; - - s << - "GraceNotesGroup" << - ", graceNotesGroupKind \"" << - graceNotesGroupKindAsString ( - fGraceNotesGroupKind) << - ", graceNotesGroupMeasureNumber \"" << fGraceNotesGroupMeasureNumber << - "\", line " << fInputLineNumber << " "; - - if (fGraceNotesGroupElementsList.size ()) { - list::const_iterator - iBegin = fGraceNotesGroupElementsList.begin (), - iEnd = fGraceNotesGroupElementsList.end (), - i = iBegin; - for ( ; ; ) { - s << (*i)->asShortString (); - if (++i == iEnd) break; - s << ", "; - } // for - } - - return s.str (); -} - -string msrGraceNotesGroup::asString () const -{ - stringstream s; - - s << - "GraceNotesGroup" << - ", graceNotesGroupMeasureNumber \"" << fGraceNotesGroupMeasureNumber << - ", graceNotesGroupMeasureNumber \"" << fGraceNotesGroupMeasureNumber << - "\", line " << fInputLineNumber << " "; - - if (fGraceNotesGroupElementsList.size ()) { - list::const_iterator - iBegin = fGraceNotesGroupElementsList.begin (), - iEnd = fGraceNotesGroupElementsList.end (), - i = iBegin; - for ( ; ; ) { - s << (*i)->asString (); - if (++i == iEnd) break; - s << ", "; - } // for - } - - return s.str (); -} - -void msrGraceNotesGroup::print (ostream& os) const -{ - os << - "GraceNotesGroup" << - ", line " << fInputLineNumber << - ", " << - singularOrPlural ( - fGraceNotesGroupElementsList.size (), "element", "elements") << - endl; - - gIndenter++; - - const int fieldWidth = 33; - - os << - setw (fieldWidth) << - "graceNotesGroupVoiceUpLink" << " : "; - if (fGraceNotesGroupVoiceUpLink) { - os << - fGraceNotesGroupVoiceUpLink->asShortString (); - } - else { - os << - "none"; - } - os << endl; - - os << - setw (fieldWidth) << - "graceNotesGroupNoteUpLink" << " : "; - if (fGraceNotesGroupNoteUpLink) { - os << - fGraceNotesGroupNoteUpLink->asShortString (); - } - else { - os << - "none"; - } - os << endl; - - os << - setw (fieldWidth) << - "graceNotesGroupIsSlashed" << " : " << - booleanAsString (fGraceNotesGroupIsSlashed) << - endl << - - setw (fieldWidth) << - "graceNotesGroupIsSlashed" << " : " << - booleanAsString (fGraceNotesGroupIsSlashed) << - endl << - - setw (fieldWidth) << - "graceNotesGroupIsTied" << " : " << - booleanAsString (fGraceNotesGroupIsTied) << - endl << - - setw (fieldWidth) << - "graceNotesGroupIsFollowedByNotes" << " : " << - booleanAsString (fGraceNotesGroupIsFollowedByNotes) << - endl << - - setw (fieldWidth) << - "graceNotesGroupMeasureNumber" << " : " << - fGraceNotesGroupMeasureNumber << - endl; - - os << - setw (fieldWidth) << - "graceNotesGroupElementsList"; - if (fGraceNotesGroupElementsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fGraceNotesGroupElementsList.begin (), - iEnd = fGraceNotesGroupElementsList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << - "none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrGraceNotesGroup& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrGraceNotes_MUT_DEP.h b/src/lilypond/msrGraceNotes_MUT_DEP.h deleted file mode 100644 index 0f6559e6b..000000000 --- a/src/lilypond/msrGraceNotes_MUT_DEP.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrGraceNotesGroup : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrGraceNotesGroupKind { - kGraceNotesGroupBefore, - kGraceNotesGroupAfter }; - - static string graceNotesGroupKindAsString ( - msrGraceNotesGroupKind graceNotesGroupKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrGraceNotesGroupKind graceNotesGroupKind, - bool graceNotesGroupIsSlashed, - S_msrVoice graceNotesGroupVoiceUpLink); - - SMARTP createGraceNotesGroupNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createSkipGraceNotesGroupClone ( - S_msrVoice containingVoice); - - SMARTP createGraceNotesGroupDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrGraceNotesGroup ( - int inputLineNumber, - msrGraceNotesGroupKind graceNotesGroupKind, - bool graceNotesGroupIsSlashed, - S_msrVoice graceNotesGroupVoiceUpLink); - - virtual ~msrGraceNotesGroup (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrVoice getGraceNotesGroupVoiceUpLink () const - { return fGraceNotesGroupVoiceUpLink; } - - void setGraceNotesGroupNoteUpLink ( - S_msrNote note) - { fGraceNotesGroupNoteUpLink = note; } - - S_msrNote getGraceNotesGroupNoteUpLink () const - { return fGraceNotesGroupNoteUpLink; } - - msrGraceNotesGroupKind - getGraceNotesGroupKind () const - { return fGraceNotesGroupKind; } - - void setGraceNotesGroupKind ( - msrGraceNotesGroupKind graceNotesGroupKind) - { fGraceNotesGroupKind = graceNotesGroupKind; } - - list& - getGraceNotesGroupElementsList () - { return fGraceNotesGroupElementsList; } - - bool getGraceNotesGroupIsSlashed () const - { return fGraceNotesGroupIsSlashed; } - - void setGraceNotesGroupIsTied () - { fGraceNotesGroupIsTied = true; } - - bool getGraceNotesGroupIsTied () const - { return fGraceNotesGroupIsTied; } - - void setGraceNotesGroupIsFollowedByNotes (bool value) - { fGraceNotesGroupIsFollowedByNotes = value; } - - bool getGraceNotesGroupIsFollowedByNotes () const - { return fGraceNotesGroupIsFollowedByNotes; } - - void setGraceNotesGroupMeasureNumber ( - string graceNotesGroupMeasureNumber) - { - fGraceNotesGroupMeasureNumber = - graceNotesGroupMeasureNumber; - } - - string getGraceNotesGroupMeasureNumber () const - { return fGraceNotesGroupMeasureNumber; } - - // services - // ------------------------------------------------------ - - S_msrPart fetchGraceNotesGroupPartUpLink () const; - - void appendNoteToGraceNotesGroup (S_msrNote note); - void appendChordToGraceNotesGroup (S_msrChord chord); - - S_msrNote removeLastNoteFromGraceNotesGroup ( - int inputLineNumber); - - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortString () const; - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fGraceNotesGroupVoiceUpLink; - S_msrNote fGraceNotesGroupNoteUpLink; - - msrGraceNotesGroupKind - fGraceNotesGroupKind; - - list - fGraceNotesGroupElementsList; - - bool fGraceNotesGroupIsSlashed; - bool fGraceNotesGroupIsTied; - - bool fGraceNotesGroupIsFollowedByNotes; - - // LilyPond issue 34 may lead to add skip grace notes to voices - // other than the one containing these grace notes: - // the measure number is needed to create the first measure - // in case the grace notes are at the beginning of the voice - string fGraceNotesGroupMeasureNumber; // JMI ??? -}; -typedef SMARTP S_msrGraceNotesGroup; -EXP ostream& operator<< (ostream& os, const S_msrGraceNotesGroup& elt); - diff --git a/src/lilypond/msrHarmonies.cpp b/src/lilypond/msrHarmonies.cpp deleted file mode 100644 index bcbaf5261..000000000 --- a/src/lilypond/msrHarmonies.cpp +++ /dev/null @@ -1,858 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrHarmonyDegree msrHarmonyDegree::create ( - int inputLineNumber, - int harmonyDegreeValue, - msrAlterationKind harmonyDegreeAlterationKind, - msrHarmonyDegreeTypeKind harmonyDegreeTypeKind) -{ - msrHarmonyDegree* o = - new msrHarmonyDegree ( - inputLineNumber, - harmonyDegreeValue, - harmonyDegreeAlterationKind, - harmonyDegreeTypeKind); - assert(o!=0); - - return o; -} - -msrHarmonyDegree::msrHarmonyDegree ( - int inputLineNumber, - int harmonyDegreeValue, - msrAlterationKind harmonyDegreeAlterationKind, - msrHarmonyDegreeTypeKind harmonyDegreeTypeKind) - : msrElement (inputLineNumber) -{ - fHarmonyDegreeValue = harmonyDegreeValue; - fHarmonyDegreeAlterationKind = harmonyDegreeAlterationKind; - fHarmonyDegreeTypeKind = harmonyDegreeTypeKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Creating harmony degree '" << - asString () << - "', line " << inputLineNumber << - endl; - } -#endif -} - -msrHarmonyDegree::~msrHarmonyDegree () -{} - -void msrHarmonyDegree::setHarmonyDegreeHarmonyUpLink ( - S_msrHarmony harmonyUpLink) -{ - // sanity check - msrAssert( - harmonyUpLink != nullptr, - "harmonyUpLink is null"); - - fHarmonyDegreeHarmonyUpLink = - harmonyUpLink; -} - -int msrHarmonyDegree::harmonyDegreeAsSemitones () const -{ -/* - Kind indicates the type of chord. Degree elements - can then add, subtract, or alter from these - starting points. -*/ - - int result = -1; - - // determine the value for an unaltered degree value - switch (fHarmonyDegreeValue) { - case 0: - result = 0; - break; - case 1: - result = 0; - break; - case 2: - result = 0; - break; - case 3: - result = 0; - break; - case 4: - result = 0; - break; - case 5: - result = 0; - break; - case 6: - result = 0; - break; - case 7: - result = 0; - break; - case 8: - result = 0; - break; - case 9: - result = 0; - break; - case 10: - result = 0; - break; - case 11: - result = 0; - break; - case 12: - result = 0; - break; - case 13: - result = 0; - break; - } // switch - - return result; -} - -void msrHarmonyDegree::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHarmonyDegree::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHarmonyDegree elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHarmonyDegree::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrHarmonyDegree::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHarmonyDegree::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHarmonyDegree elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHarmonyDegree::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrHarmonyDegree::browseData (basevisitor* v) -{} - -string msrHarmonyDegree::harmonyDegreeTypeKindAsString ( - msrHarmonyDegreeTypeKind harmonyDegreeTypeKind) -{ - string result; - - switch (harmonyDegreeTypeKind) { - case msrHarmonyDegree::kHarmonyDegreeTypeAdd: - result = "harmonyDegreeTypeAdd"; - break; - case msrHarmonyDegree::kHarmonyDegreeTypeAlter: - result = "harmonyDegreeTypeAlter"; - break; - case msrHarmonyDegree::kHarmonyDegreeTypeSubstract: - result = "harmonyDegreeTypeSubstract"; - break; - } // switch - - return result; -} - -string msrHarmonyDegree::harmonyDegreeKindAsShortString () const -{ - string result; - - switch (fHarmonyDegreeTypeKind) { - case msrHarmonyDegree::kHarmonyDegreeTypeAdd: - result = "degreeAdd"; - break; - case msrHarmonyDegree::kHarmonyDegreeTypeAlter: - result = "degreeAlter"; - break; - case msrHarmonyDegree::kHarmonyDegreeTypeSubstract: - result = "degreeSubtract"; - break; - } // switch - - return result; -} - -string msrHarmonyDegree::asString () const -{ - stringstream s; - - s << - "HarmonyDegree" << - ", type: " << harmonyDegreeKindAsShortString () << - ", value: " << fHarmonyDegreeValue << - ", alteration: " << - msrAlterationKindAsString ( - fHarmonyDegreeAlterationKind) << - ", line: " << fInputLineNumber; - - return s.str (); -} - -void msrHarmonyDegree::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrHarmonyDegree& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrHarmony msrHarmony::createWithoutVoiceUplink ( - int inputLineNumber, - // no harmonyVoiceUpLink yet - msrQuarterTonesPitchKind harmonyRootQuarterTonesPitchKind, - msrHarmonyKind harmonyKind, - string harmonyKindText, - int harmonyInversion, - msrQuarterTonesPitchKind harmonyBassQuarterTonesPitchKind, - rational harmonySoundingWholeNotes, - rational harmonyDisplayWholeNotes, - int harmonyStaffNumber, - msrTupletFactor harmonyTupletFactor, - rational harmonyWholeNotesOffset) -{ - msrHarmony* o = - new msrHarmony ( - inputLineNumber, - nullptr, - harmonyRootQuarterTonesPitchKind, - harmonyKind, - harmonyKindText, - harmonyInversion, - harmonyBassQuarterTonesPitchKind, - harmonySoundingWholeNotes, - harmonyDisplayWholeNotes, - harmonyStaffNumber, - harmonyTupletFactor, - harmonyWholeNotesOffset); - assert(o!=0); - - return o; -} - -S_msrHarmony msrHarmony::createWithVoiceUplink ( - int inputLineNumber, - S_msrVoice harmonyVoiceUpLink, - msrQuarterTonesPitchKind harmonyRootQuarterTonesPitchKind, - msrHarmonyKind harmonyKind, - string harmonyKindText, - int harmonyInversion, - msrQuarterTonesPitchKind harmonyBassQuarterTonesPitchKind, - rational harmonySoundingWholeNotes, - rational harmonyDisplayWholeNotes, - int harmonyStaffNumber, - msrTupletFactor harmonyTupletFactor, - rational harmonyWholeNotesOffset) -{ - msrHarmony* o = - new msrHarmony ( - inputLineNumber, - harmonyVoiceUpLink, - harmonyRootQuarterTonesPitchKind, - harmonyKind, - harmonyKindText, - harmonyInversion, - harmonyBassQuarterTonesPitchKind, - harmonySoundingWholeNotes, - harmonyDisplayWholeNotes, - harmonyStaffNumber, - harmonyTupletFactor, - harmonyWholeNotesOffset); - assert(o!=0); - - return o; -} - -msrHarmony::msrHarmony ( - int inputLineNumber, - S_msrVoice harmonyVoiceUpLink, - msrQuarterTonesPitchKind harmonyRootQuarterTonesPitchKind, - msrHarmonyKind harmonyKind, - string harmonyKindText, - int harmonyInversion, - msrQuarterTonesPitchKind harmonyBassQuarterTonesPitchKind, - rational harmonySoundingWholeNotes, - rational harmonyDisplayWholeNotes, - int harmonyStaffNumber, - msrTupletFactor harmonyTupletFactor, - rational harmonyWholeNotesOffset) - : msrMeasureElement ( - inputLineNumber), - fHarmonyTupletFactor ( - harmonyTupletFactor) -{ - /* JMI - // sanity check - msrAssert( - harmonyVoiceUpLink != nullptr, - "harmonyVoiceUpLink is null"); - */ - - // set harmony's voice upLink - fHarmonyVoiceUpLink = - harmonyVoiceUpLink; - - fHarmonyRootQuarterTonesPitchKind = - harmonyRootQuarterTonesPitchKind; - - fHarmonyKind = harmonyKind; - fHarmonyKindText = harmonyKindText; - - fHarmonyInversion = harmonyInversion; - - fHarmonyBassQuarterTonesPitchKind = - harmonyBassQuarterTonesPitchKind; - -// JMI fHarmonySoundingWholeNotes = - fMeasureElementSoundingWholeNotes = - harmonySoundingWholeNotes; - fHarmonyDisplayWholeNotes = - harmonyDisplayWholeNotes; - - fHarmonyStaffNumber = harmonyStaffNumber; - - fHarmonyWholeNotesOffset = harmonyWholeNotesOffset; - - // handle harmony inversion if any - /* - Inversion is a number indicating which inversion is used: - 0 for root position, 1 for first inversion, etc. - */ - if (fHarmonyInversion > 0) { - // fetch the chord intervals - S_msrChordStructure - chordStructure = - msrChordStructure::create ( - // JMI inputLineNumber, - fHarmonyKind); - - // fetch the bass chord item for the inversion - S_msrChordInterval - bassChordInterval = - chordStructure-> - bassChordIntervalForChordInversion ( - inputLineNumber, - fHarmonyInversion); - - // fetch the inverted chord bass semitones pitch - msrQuarterTonesPitchKind - invertedChordBassQuarterTonesPitchKind = - noteAtIntervalFromQuarterTonesPitch ( - inputLineNumber, - bassChordInterval->getChordIntervalIntervalKind (), - fHarmonyRootQuarterTonesPitchKind); - - // is this compatible with bass quartertones pitch if specified? - if (fHarmonyBassQuarterTonesPitchKind != k_NoQuarterTonesPitch_QTP) { - if ( - invertedChordBassQuarterTonesPitchKind - != - fHarmonyBassQuarterTonesPitchKind - ) { - stringstream s; - - s << - "inversion '" << - fHarmonyInversion << - "' is not compatible with bass quaternotes pitch '" << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fHarmonyBassQuarterTonesPitchKind) << - "'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // set the bass quartertones pitch according to the inversion - fHarmonyBassQuarterTonesPitchKind = - invertedChordBassQuarterTonesPitchKind; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Creating harmony " << - asString () << - endl; - } -#endif -} - -msrHarmony::~msrHarmony () -{} - -S_msrHarmony msrHarmony::createHarmonyNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Creating a newborn clone of harmony " << - asShortString () << - ", line " << fInputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrHarmony - newbornClone = - msrHarmony::createWithVoiceUplink ( - fInputLineNumber, - containingVoice, - fHarmonyRootQuarterTonesPitchKind, - fHarmonyKind, - fHarmonyKindText, - fHarmonyInversion, - fHarmonyBassQuarterTonesPitchKind, -// JMI fHarmonySoundingWholeNotes, - fMeasureElementSoundingWholeNotes, - fHarmonyDisplayWholeNotes, - fHarmonyStaffNumber, - fHarmonyTupletFactor, - fHarmonyWholeNotesOffset); - - return newbornClone; -} - -S_msrHarmony msrHarmony::createHarmonyDeepCopy ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Creating a deep copy of harmony " << - asShortString () << - ", line " << fInputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrHarmony - harmonyDeepCopy = - msrHarmony::createWithVoiceUplink ( - fInputLineNumber, - containingVoice, - fHarmonyRootQuarterTonesPitchKind, - fHarmonyKind, fHarmonyKindText, - fHarmonyInversion, - fHarmonyBassQuarterTonesPitchKind, -// JMI fHarmonySoundingWholeNotes, - fMeasureElementSoundingWholeNotes, - fHarmonyDisplayWholeNotes, - fHarmonyStaffNumber, - fHarmonyTupletFactor, - fHarmonyWholeNotesOffset); - - return harmonyDeepCopy; -} - -void msrHarmony::setHarmonyTupletFactor ( - msrTupletFactor tupletFactor) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Setting the tuplet factor of harmony " << - asShortString () << - " to " << - tupletFactor.asString () << - ", line " << fInputLineNumber << - endl; - } -#endif - - fHarmonyTupletFactor = tupletFactor; -} - -void msrHarmony::setHarmonyPositionInMeasure ( - rational positionInMeasure) -{ - // set the harmony position in measure, taking it's offset into account - - // the offset can negative, merely add it - // this overwrites it with the same value if fHarmonyWholeNotesOffset is null - rational - actualPositionInMeasure = - positionInMeasure - + - fHarmonyWholeNotesOffset; - actualPositionInMeasure.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Setting harmony position in measure of " << asString () << - " to '" << - positionInMeasure << - "', harmonyWholeNotesOffset = " << - fHarmonyWholeNotesOffset << - "', actualPositionInMeasure = " << - actualPositionInMeasure << - endl; - } -#endif - - msrMeasureElement::setMeasureElementPositionInMeasure ( - actualPositionInMeasure, - "setHarmonyPositionInMeasure()"); -} - -void msrHarmony::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHarmony::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHarmony elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHarmony::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrHarmony::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHarmony::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHarmony elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHarmony::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrHarmony::browseData (basevisitor* v) -{ - // browse harmony degrees if any - if (fHarmonyDegreesList.size ()) { - for ( - list::const_iterator i = fHarmonyDegreesList.begin (); - i != fHarmonyDegreesList.end (); - i++ - ) { - // browse the harmony degree - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrHarmony::asString () const -{ - stringstream s; - - s << - "[" - "Harmony" << - ", harmonyRootQuarterTonesPitchKind: " << - msrQuarterTonesPitchKindAsString ( // JMI XXL - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fHarmonyRootQuarterTonesPitchKind) << - ", harmonyKind: " << - msrHarmonyKindAsShortString (fHarmonyKind) << - - ", harmonySoundingWholeNotes: " << - fMeasureElementSoundingWholeNotes << - ", harmonyDisplayWholeNotes: " << - fHarmonyDisplayWholeNotes << - - ", harmonyWholeNotesOffset: " << - fHarmonyWholeNotesOffset << - ", positionInMeasure: " << - fMeasureElementPositionInMeasure << - - ", harmonyKindText: \"" << - fHarmonyKindText << "\""; - - s << ", inversion: "; - if (fHarmonyInversion == K_HARMONY_NO_INVERSION) { - s << "none"; - } - else { - s << fHarmonyInversion; - } - - if (fHarmonyBassQuarterTonesPitchKind != k_NoQuarterTonesPitch_QTP) { - s << - ", harmonyBassQuarterTonesPitchKind: " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fHarmonyBassQuarterTonesPitchKind); - } - - if (fHarmonyDegreesList.size ()) { - s << - ", harmonyDegreesList: ["; - - list::const_iterator - iBegin = fHarmonyDegreesList.begin (), - iEnd = fHarmonyDegreesList.end (), - i = iBegin; - - for ( ; ; ) { - s << (*i)->asString (); - if (++i == iEnd) break; - s << " "; - } // for - - s << - "]"; - } - - // print the harmony staff number - s << - ", harmonyStaffNumber: "; - if (fHarmonyStaffNumber == K_NO_STAFF_NUMBER) - s << "none"; - else - s << fHarmonyStaffNumber; - - // print the harmony tuplet factor - s << - ", harmonyTupletFactor: " << - fHarmonyTupletFactor.asString (); - - s << - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -void msrHarmony::print (ostream& os) const -{ - os << - "Harmony" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 26; - - os << left << - setw (fieldWidth) << - "harmonyRoot" << " : " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fHarmonyRootQuarterTonesPitchKind) << - endl << - setw (fieldWidth) << - "harmonyKind" << " : " << - msrHarmonyKindAsString (fHarmonyKind) << - endl << - - setw (fieldWidth) << - "harmonySoundingWholeNotes" << " : " << - fMeasureElementSoundingWholeNotes << - endl << - setw (fieldWidth) << - "harmonyDisplayWholeNotes" << " : " << - fHarmonyDisplayWholeNotes << - endl; - - // print the harmony whole notes offset - os << - setw (fieldWidth) << - "harmonyWholeNotesOffset" << " : " << fHarmonyWholeNotesOffset << - endl; - - // print the harmony position in measure - os << - setw (fieldWidth) << - "positionInMeasure" << " : " << fMeasureElementPositionInMeasure << - endl; - - os << - setw (fieldWidth) << - "harmonyKindText" << " : \"" << - fHarmonyKindText << - "\"" << - endl << - - setw (fieldWidth) << - "harmonyBass" << " : " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fHarmonyBassQuarterTonesPitchKind) << - endl; - - os << - setw (fieldWidth) << - "harmonyInversion" << " : "; - if (fHarmonyInversion == K_HARMONY_NO_INVERSION) { - os << "none"; - } - else { - os << fHarmonyInversion; - } - os << endl; - - // print harmony degrees if any - os << - setw (fieldWidth) << - "harmonyDegrees"; - - if (fHarmonyDegreesList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fHarmonyDegreesList.begin (), - iEnd = fHarmonyDegreesList.end (), - i = iBegin; - - for ( ; ; ) { - os << - (*i)->asString (); - if (++i == iEnd) break; - os << endl; - } // for - - os << endl; - - gIndenter--; - } - else { - os << - " : " << - "none" << - endl; - } - - // print the harmony staff number - os << - setw (fieldWidth) << - "harmonyStaffNumber" << " : "; - if (fHarmonyStaffNumber == K_NO_STAFF_NUMBER) - os << "none"; - else - os << fHarmonyStaffNumber; - os << endl; - - // print the harmony tuplet factor - os << - setw (fieldWidth) << - "harmonyTupletFactor" << " : " << fHarmonyTupletFactor.asString () << - endl; - - os << - setw (fieldWidth) << - "harmonyNoteUpLink" << " : "; - if (fHarmonyNoteUpLink) { - os << - endl << - gTab << fHarmonyNoteUpLink->asString (); - } - else { - os << "none"; - } - os << endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrHarmony& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrHarmonies_MUT_DEP.h b/src/lilypond/msrHarmonies_MUT_DEP.h deleted file mode 100644 index 84770a6c9..000000000 --- a/src/lilypond/msrHarmonies_MUT_DEP.h +++ /dev/null @@ -1,341 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrHarmonyDegree : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - -/* -Degree elements - can then add, subtract, or alter from these - starting points. - - - - B - - dominant - - 5 - 1 - alter - - - 9 - 1 - add - - -*/ - - enum msrHarmonyDegreeTypeKind { - kHarmonyDegreeTypeAdd, - kHarmonyDegreeTypeAlter, - kHarmonyDegreeTypeSubstract }; - - static string harmonyDegreeTypeKindAsString ( - msrHarmonyDegreeTypeKind harmonyDegreeTypeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int harmonyDegreeValue, - msrAlterationKind harmonyDegreeAlterationKind, - msrHarmonyDegreeTypeKind harmonyDegreeTypeKind); - - /* JMI - SMARTP createHarmonyDegreeNewbornClone ( - S_msrPart containingPart); - - SMARTP createHarmonyDegreeDeepCopy ( // JMI ??? - S_msrPart containingPart); - */ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrHarmonyDegree ( - int inputLineNumber, - int harmonyDegreeValue, - msrAlterationKind harmonyDegreeAlterationKind, - msrHarmonyDegreeTypeKind harmonyDegreeTypeKind); - - virtual ~msrHarmonyDegree (); - - public: - - // set and get - // ------------------------------------------------------ - - void setHarmonyDegreeHarmonyUpLink ( - S_msrHarmony harmonyUpLink); - - S_msrHarmony getHarmonyDegreeHarmonyUpLink () const - { return fHarmonyDegreeHarmonyUpLink; } - - int getHarmonyDegreeValue () const - { return fHarmonyDegreeValue; } - - msrAlterationKind getHarmonyDegreeAlterationKind () const - { return fHarmonyDegreeAlterationKind; } - - msrHarmonyDegreeTypeKind - getHarmonyDegreeTypeKind () const - { return fHarmonyDegreeTypeKind; } - - // services - // ------------------------------------------------------ - - int harmonyDegreeAsSemitones () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string harmonyDegreeKindAsString () const; - string harmonyDegreeKindAsShortString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrHarmony fHarmonyDegreeHarmonyUpLink; - - int fHarmonyDegreeValue; - msrAlterationKind fHarmonyDegreeAlterationKind; - msrHarmonyDegreeTypeKind - fHarmonyDegreeTypeKind; -}; -typedef SMARTP S_msrHarmonyDegree; -EXP ostream& operator<< (ostream& os, const S_msrHarmonyDegree& elt); - -//______________________________________________________________________________ -class msrHarmony : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP createWithoutVoiceUplink ( - int inputLineNumber, - // no harmonyVoiceUpLink yet - msrQuarterTonesPitchKind harmonyRootQuarterTonesPitchKind, - msrHarmonyKind harmonyKind, - string harmonyKindText, - int harmonyInversion, - msrQuarterTonesPitchKind harmonyBassQuarterTonesPitchKind, - rational harmonySoundingWholeNotes, - rational harmonyDisplayWholeNotes, - int harmonyStaffNumber, - msrTupletFactor harmonyTupletFactor, - rational harmonyWholeNotesOffset); - - SMARTP createHarmonyNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createHarmonyDeepCopy ( // JMI ??? - S_msrVoice containingVoice); - - // applications API - // ------------------------------------------------------ - - static SMARTP createWithVoiceUplink ( - int inputLineNumber, - S_msrVoice harmonyVoiceUpLink, - msrQuarterTonesPitchKind harmonyRootQuarterTonesPitchKind, - msrHarmonyKind harmonyKind, - string harmonyKindText, - int harmonyInversion, - msrQuarterTonesPitchKind harmonyBassQuarterTonesPitchKind, - rational harmonySoundingWholeNotes, - rational harmonyDisplayWholeNotes, - int harmonyStaffNumber, - msrTupletFactor harmonyTupletFactor, - rational harmonyWholeNotesOffset); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrHarmony ( - int inputLineNumber, - S_msrVoice harmonyVoiceUpLink, - msrQuarterTonesPitchKind harmonyRootQuarterTonesPitchKind, - msrHarmonyKind harmonyKind, - string harmonyKindText, - int harmonyInversion, - msrQuarterTonesPitchKind harmonyBassQuarterTonesPitchKind, - rational harmonySoundingWholeNotes, - rational harmonyDisplayWholeNotes, - int harmonyStaffNumber, - msrTupletFactor harmonyTupletFactor, - rational harmonyWholeNotesOffset); - - virtual ~msrHarmony (); - - public: - - // set and get - // ------------------------------------------------------ - - // uplinks - void setHarmonyNoteUpLink ( - S_msrNote note) - { fHarmonyNoteUpLink = note; } - - S_msrNote getHarmonyNoteUpLink () const - { return fHarmonyNoteUpLink; } - - void setHarmonyVoiceUpLink ( - S_msrVoice voice) - { fHarmonyVoiceUpLink = voice; } - - S_msrVoice getHarmonyVoiceUpLink () const - { return fHarmonyVoiceUpLink; } - - void setHarmonySoundingWholeNotes ( - rational wholeNotes) - { fMeasureElementSoundingWholeNotes = wholeNotes; } - - rational getHarmonySoundingWholeNotes () const - { return fMeasureElementSoundingWholeNotes; } - - void setHarmonyDisplayWholeNotes ( - rational wholeNotes) - { fHarmonyDisplayWholeNotes = wholeNotes; } - - rational getHarmonyDisplayWholeNotes () const - { return fHarmonyDisplayWholeNotes; } - - msrQuarterTonesPitchKind - getHarmonyRootQuarterTonesPitchKind () const - { return fHarmonyRootQuarterTonesPitchKind; } - - msrHarmonyKind getHarmonyKind () const - { return fHarmonyKind; } - - string getHarmonyKindText () const - { return fHarmonyKindText; } - - const list& - getHarmonyDegreesList () - { return fHarmonyDegreesList; } - - int getHarmonyInversion () const - { return fHarmonyInversion; } - - msrQuarterTonesPitchKind - getHarmonyBassQuarterTonesPitchKind () const - { return fHarmonyBassQuarterTonesPitchKind; } - - void setHarmonyStaffNumber ( - int staffNumber) - { fHarmonyStaffNumber = staffNumber; } - - int getHarmonyStaffNumber () const - { return fHarmonyStaffNumber; } - - void setHarmonyTupletFactor ( - msrTupletFactor tupletFactor); - - msrTupletFactor getHarmonyTupletFactor () const - { return fHarmonyTupletFactor; } - - rational getHarmonyWholeNotesOffset () const - { return fHarmonyWholeNotesOffset; } - - void setHarmonyPositionInMeasure ( - rational positionInMeasure); - - // services - // ------------------------------------------------------ - - void appendHarmonyDegreeToHarmony ( - S_msrHarmonyDegree harmonyDegree) - { - fHarmonyDegreesList.push_back ( - harmonyDegree); - } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrNote fHarmonyNoteUpLink; - S_msrVoice fHarmonyVoiceUpLink; - - rational fHarmonyDisplayWholeNotes; - - msrQuarterTonesPitchKind - fHarmonyRootQuarterTonesPitchKind; - - msrHarmonyKind fHarmonyKind; - string fHarmonyKindText; - - int fHarmonyInversion; - - msrQuarterTonesPitchKind - fHarmonyBassQuarterTonesPitchKind; - - list - fHarmonyDegreesList; - - int fHarmonyStaffNumber; - - msrTupletFactor fHarmonyTupletFactor; - - rational fHarmonyWholeNotesOffset; -}; -typedef SMARTP S_msrHarmony; -EXP ostream& operator<< (ostream& os, const S_msrHarmony& elt); - diff --git a/src/lilypond/msrIdentification.cpp b/src/lilypond/msrIdentification.cpp deleted file mode 100644 index c8cd21a30..000000000 --- a/src/lilypond/msrIdentification.cpp +++ /dev/null @@ -1,609 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrIdentification.h" - -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrIdentification msrIdentification::create ( - int inputLineNumber) -{ - msrIdentification* o = - new msrIdentification ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrIdentification::msrIdentification ( - int inputLineNumber) - : msrElement (inputLineNumber) -{} - -msrIdentification::~msrIdentification () -{} - -void msrIdentification::setWorkNumber ( - int inputLineNumber, - string val) - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting workNumber to \"" << val << "\"" << - endl; - } -#endif - - fWorkNumber = - msrVarValAssoc::create ( - inputLineNumber, - msrVarValAssoc::kWorkNumber, val); - } - -void msrIdentification::setWorkTitle ( - int inputLineNumber, - string val) - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting workTitle to \"" << val << "\"" << - endl; - } -#endif - - fWorkTitle = - msrVarValAssoc::create ( - inputLineNumber, - msrVarValAssoc::kWorkTitle, val); - } - -void msrIdentification::setMovementNumber ( - int inputLineNumber, - string val) - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting movementNumber to \"" << val << "\"" << - endl; - } -#endif - - fMovementNumber = - msrVarValAssoc::create ( - inputLineNumber, - msrVarValAssoc::kMovementNumber, val); - } - -void msrIdentification::setMovementTitle ( - int inputLineNumber, - string val) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting movementTitle to \"" << val << "\"" << - endl; - } -#endif - - fMovementTitle = - msrVarValAssoc::create ( - inputLineNumber, - msrVarValAssoc::kMovementTitle, val); -} - -void msrIdentification::setEncodingDate ( - int inputLineNumber, - string val) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting encodingDate to \"" << val << "\"" << - endl; - } -#endif - - fEncodingDate = - msrVarValAssoc::create ( - inputLineNumber, - msrVarValAssoc::kEncodingDate, val); -} - -void msrIdentification::setScoreInstrument ( - int inputLineNumber, - string val) -{ - #ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting scoreInstrument to \"" << val << "\"" << - endl; - } -#endif - - fScoreInstrumentAssoc = - msrVarValAssoc::create ( - inputLineNumber, - msrVarValAssoc::kScoreInstrument, val); -} - -void msrIdentification::setMiscellaneousField ( - int inputLineNumber, - string val) -{ - #ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting workTitle to \"" << val << "\"" << - endl; - } -#endif - - fEncodingDate = - msrVarValAssoc::create ( - inputLineNumber, - msrVarValAssoc::kMiscellaneousField, val); -} - -void msrIdentification::addRights ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding right \"" << value << "\"" << - endl; - } -#endif - - if (! fRights) { - fRights = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kRights); - } - - fRights-> - addAssocVariableValue (value); -} - -void msrIdentification::addComposer ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding composer \"" << value << "\"" << - endl; - } -#endif - - if (! fComposers) { - fComposers = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kComposer); - } - - fComposers-> - addAssocVariableValue (value); -} - -void msrIdentification::addArranger ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding arranger \"" << value << "\"" << - endl; - } -#endif - - if (! fArrangers) { - fArrangers = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kArranger); - } - - fArrangers-> - addAssocVariableValue (value); -} - -void msrIdentification::addLyricist ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding lyricist \"" << value << "\"" << - endl; - } -#endif - - if (! fLyricists) { - fLyricists = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kLyricist); - } - - fLyricists-> - addAssocVariableValue (value); -} - -void msrIdentification::addPoet ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding poet \"" << value << "\"" << - endl; - } -#endif - - if (! fPoets) { - fPoets = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kPoet); - } - - fPoets-> - addAssocVariableValue (value); -} - -void msrIdentification::addTranslator ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding translator \"" << value << "\"" << - endl; - } -#endif - - if (! fTranslators) { - fTranslators = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kTranslator); - } - - fTranslators-> - addAssocVariableValue (value); -} - -void msrIdentification::addArtist ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding artist \"" << value << "\"" << - endl; - } -#endif - - if (! fArtists) { - fArtists = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kArtist); - } - - fArtists-> - addAssocVariableValue (value); -} - -void msrIdentification::addSoftware ( - int inputLineNumber, - string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Adding software \"" << value << "\"" << - endl; - } -#endif - - if (! fSoftwares) { - fSoftwares = - msrVarValsListAssoc::create ( - inputLineNumber, - msrVarValsListAssoc::kSoftware); - } - - fSoftwares-> - addAssocVariableValue (value); -} - -void msrIdentification::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrIdentification::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrIdentification elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrIdentification::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrIdentification::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrIdentification::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrIdentification elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrIdentification::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrIdentification::browseData (basevisitor* v) -{ - if (fWorkNumber) { - // browse fWorkNumber - msrBrowser browser (v); - browser.browse (*fWorkNumber); - } - - if (fWorkTitle) { - // browse fWorkTitle - msrBrowser browser (v); - browser.browse (*fWorkTitle); - } - - if (fMovementNumber) { - // browse fMovementNumber - msrBrowser browser (v); - browser.browse (*fMovementNumber); - } - - if (fMovementTitle) { - // browse fMovementTitle - msrBrowser browser (v); - browser.browse (*fMovementTitle); - } - - if (fComposers) { - // browse fComposers - msrBrowser browser (v); - browser.browse (*fComposers); - } - - if (fArrangers) { - // browse fArrangers - msrBrowser browser (v); - browser.browse (*fArrangers); - } - - if (fLyricists) { - // browse fLyricists - msrBrowser browser (v); - browser.browse (*fLyricists); - } - - if (fPoets) { - // browse fPoets - msrBrowser browser (v); - browser.browse (*fPoets); - } - - if (fTranslators) { - // browse fTranslators - msrBrowser browser (v); - browser.browse (*fTranslators); - } - - if (fRights) { - // browse fRights - msrBrowser browser (v); - browser.browse (*fRights); - } - - if (fSoftwares) { - // browse fSoftwares - msrBrowser browser (v); - browser.browse (*fSoftwares); - } - - if (fEncodingDate) { - // browse encoding date - msrBrowser browser (v); - browser.browse (*fEncodingDate); - } - - if (fScoreInstrumentAssoc) { - // browse score instrument - msrBrowser browser (v); - browser.browse (*fScoreInstrumentAssoc); - } -} - -void msrIdentification::print (ostream& os) const -{ - os << - "Identification" << - endl; - - bool emptyIdentification = true; - - gIndenter++; - - if (fWorkNumber) { - os << - fWorkNumber << - endl; - - emptyIdentification = false; - } - - if (fWorkTitle) { - os << - fWorkTitle << - endl; - - emptyIdentification = false; - } - - if (fMovementNumber) { - os << - fMovementNumber << - endl; - - emptyIdentification = false; - } - - if (fMovementTitle) { - os << - fMovementTitle << - endl; - - emptyIdentification = false; - } - - if (fRights) { - os << - fRights << - endl; - - emptyIdentification = false; - } - - if (fComposers) { - os << - fComposers << - endl; - - emptyIdentification = false; - } - - if (fArrangers) { - os << - fArrangers << - endl; - - emptyIdentification = false; - } - - if (fLyricists) { - os << - fLyricists << - endl; - - emptyIdentification = false; - } - - if (fPoets) { - os << - fPoets << - endl; - - emptyIdentification = false; - } - - if (fTranslators) { - os << - fTranslators << - endl; - - emptyIdentification = false; - } - - if (fSoftwares) { - os << - fSoftwares << - endl; - emptyIdentification = false; - } - - if (fEncodingDate) { - os << - fEncodingDate << - endl; - - emptyIdentification = false; - } - - if (emptyIdentification) { - os << - " " << "nothing specified" << - endl << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrIdentification& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrIdentification.h b/src/lilypond/msrIdentification.h deleted file mode 100644 index 61faead8f..000000000 --- a/src/lilypond/msrIdentification.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrIdentification___ -#define ___msrIdentification___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - -#include "msrVarValAssocs.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrIdentification : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrIdentification ( - int inputLineNumber); - - virtual ~msrIdentification (); - - public: - - // set and get - // ------------------------------------------------------ - - void setWorkNumber ( - int inputLineNumber, - string val); - - void setWorkTitle ( - int inputLineNumber, - string val); - - void setMovementNumber ( - int inputLineNumber, - string val); - - void setMovementTitle ( - int inputLineNumber, - string val); - - void setEncodingDate ( - int inputLineNumber, - string val); - - void setMiscellaneousField ( - int inputLineNumber, - string val); - - void setScoreInstrument ( - int inputLineNumber, - string val); - - S_msrVarValsListAssoc getRights () const - { return fRights; } - - S_msrVarValAssoc getWorkNumber () const - { return fWorkNumber; } - - S_msrVarValAssoc getWorkTitle () const - { return fWorkTitle; } - - S_msrVarValAssoc getMovementNumber () const - { return fMovementNumber; } - - S_msrVarValAssoc getMovementTitle () const - { return fMovementTitle; } - - S_msrVarValsListAssoc getComposers () const - { return fComposers; } - - S_msrVarValsListAssoc getArrangers () const - { return fArrangers; } - - S_msrVarValsListAssoc getLyricists () const - { return fLyricists; } - - S_msrVarValsListAssoc getPoets () const - { return fPoets; } - - S_msrVarValsListAssoc getTranslators () const - { return fTranslators; } - - S_msrVarValsListAssoc getSoftwares () const - { return fSoftwares; } - - S_msrVarValAssoc getEncodingDate () const - { return fEncodingDate; } - - S_msrVarValAssoc getScoreInstrumentAssoc () const - { return fScoreInstrumentAssoc; } - - // services - // ------------------------------------------------------ - - void addRights ( - int inputLineNumber, - string value); - - void addComposer ( - int inputLineNumber, - string value); - - void addArranger ( - int inputLineNumber, - string value); - - void addLyricist ( - int inputLineNumber, - string value); - - void addPoet ( - int inputLineNumber, - string value); - - void addTranslator ( - int inputLineNumber, - string value); - - void addArtist ( - int inputLineNumber, - string value); - - void addSoftware ( - int inputLineNumber, - string value); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrVarValsListAssoc fRights; - - S_msrVarValAssoc fWorkNumber; - S_msrVarValAssoc fWorkTitle; - - S_msrVarValAssoc fMovementNumber; - S_msrVarValAssoc fMovementTitle; - - S_msrVarValsListAssoc fComposers; - S_msrVarValsListAssoc fArrangers; - S_msrVarValsListAssoc fLyricists; - S_msrVarValsListAssoc fPoets; - S_msrVarValsListAssoc fTranslators; - S_msrVarValsListAssoc fArtists; - - S_msrVarValsListAssoc fSoftwares; - - S_msrVarValAssoc fEncodingDate; - - S_msrVarValAssoc fScoreInstrumentAssoc; -}; -typedef SMARTP S_msrIdentification; -EXP ostream& operator<< (ostream& os, const S_msrIdentification& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrInstruments.cpp b/src/lilypond/msrInstruments.cpp deleted file mode 100644 index 68e4056b3..000000000 --- a/src/lilypond/msrInstruments.cpp +++ /dev/null @@ -1,905 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrInstruments.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrStringTuning msrStringTuning::create ( - int inputLineNumber, - int stringTuningNumber, - msrDiatonicPitchKind stringTuningDiatonicPitchKind, - msrAlterationKind stringTuningAlterationKind, - int stringTuningOctave) -{ - msrStringTuning* o = - new msrStringTuning ( - inputLineNumber, - stringTuningNumber, - stringTuningDiatonicPitchKind, - stringTuningAlterationKind, - stringTuningOctave); - assert(o!=0); - return o; -} - -msrStringTuning::msrStringTuning ( - int inputLineNumber, - int stringTuningNumber, - msrDiatonicPitchKind stringTuningDiatonicPitchKind, - msrAlterationKind stringTuningAlterationKind, - int stringTuningOctave) - : msrElement (inputLineNumber) -{ - fStringTuningNumber = stringTuningNumber; - - fStringTuningDiatonicPitchKind = stringTuningDiatonicPitchKind; - fStringTuningAlterationKind = stringTuningAlterationKind; - fStringTuningOctave = stringTuningOctave; -} - -msrStringTuning::~msrStringTuning () -{} - -void msrStringTuning::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStringTuning::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStringTuning elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStringTuning::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrStringTuning::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStringTuning::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStringTuning elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStringTuning::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrStringTuning::browseData (basevisitor* v) -{} - -void msrStringTuning::print (ostream& os) const -{ - gIndenter++; - - const int fieldWidth = 30; - - os << left << - setw (fieldWidth) << - "stringTuningNumber" << " : " << fStringTuningNumber << - endl << - setw (fieldWidth) << - "stringTuningDiatonicPitchKind" << " : " << - msrDiatonicPitchKindAsString ( - fStringTuningDiatonicPitchKind) << - endl << - setw (fieldWidth) << - "stringTuningAlterationKind" << " : " << - msrAlterationKindAsString ( - fStringTuningAlterationKind) << - endl << - setw (fieldWidth) << - "stringTuningOctave" << " : " << fStringTuningOctave << - endl << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrStringTuning& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrScordatura msrScordatura::create ( - int inputLineNumber) -{ - msrScordatura* o = - new msrScordatura ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrScordatura::msrScordatura ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{} - -msrScordatura::~msrScordatura () -{} - -void msrScordatura::addStringTuningToScordatura ( - S_msrStringTuning stringTuning) -{ - fScordaturaStringTuningsList.push_back ( - stringTuning); -} - -void msrScordatura::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrScordatura::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrScordatura elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrScordatura::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrScordatura::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrScordatura::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrScordatura elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrScordatura::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrScordatura::browseData (basevisitor* v) -{} - -void msrScordatura::print (ostream& os) const -{ - gIndenter++; - - os << - "Scordatura"; - - if (fScordaturaStringTuningsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fScordaturaStringTuningsList.begin (), - iEnd = fScordaturaStringTuningsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : no string tunings" << - endl; - } -} - -ostream& operator<< (ostream& os, const S_msrScordatura& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrAccordionRegistration msrAccordionRegistration::create ( - int inputLineNumber, - int highDotsNumber, - int middleDotsNumber, - int lowDotsNumber) -{ - msrAccordionRegistration* o = - new msrAccordionRegistration ( - inputLineNumber, - highDotsNumber, middleDotsNumber, lowDotsNumber); - assert(o!=0); - return o; -} - -msrAccordionRegistration::msrAccordionRegistration ( - int inputLineNumber, - int highDotsNumber, - int middleDotsNumber, - int lowDotsNumber) - : msrMeasureElement (inputLineNumber) -{ - fHighDotsNumber = highDotsNumber; - fMiddleDotsNumber = middleDotsNumber; - fLowDotsNumber = lowDotsNumber; -} - -msrAccordionRegistration::~msrAccordionRegistration () -{} - -void msrAccordionRegistration::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrAccordionRegistration::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrAccordionRegistration elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrAccordionRegistration::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrAccordionRegistration::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrAccordionRegistration::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrAccordionRegistration elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrAccordionRegistration::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrAccordionRegistration::browseData (basevisitor* v) -{} - -string msrAccordionRegistration::asString () const -{ - stringstream s; - - s << - "AccordionRegistration" << - ", highDotsNumber: " << fHighDotsNumber << - ", middleDotsNumber: " << fMiddleDotsNumber << - ", lowDotsNumber: " << fLowDotsNumber << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrAccordionRegistration::print (ostream& os) const -{ - gIndenter++; - - os << - asString () << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrAccordionRegistration& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrHarpPedalsTuning msrHarpPedalsTuning::create ( - int inputLineNumber) -{ - msrHarpPedalsTuning* o = - new msrHarpPedalsTuning ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrHarpPedalsTuning::msrHarpPedalsTuning ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{ -} - -msrHarpPedalsTuning::~msrHarpPedalsTuning () -{} - -S_msrHarpPedalsTuning msrHarpPedalsTuning::createHarpPedalsTuningNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a newborn clone of a " << - asString () << - endl; - } -#endif - - S_msrHarpPedalsTuning - newbornClone = 0; // JMI - - return newbornClone; -} - -S_msrHarpPedalsTuning msrHarpPedalsTuning::createHarpPedalsTuningDeepCopy () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a newborn clone of a " << - asString () << - endl; - } -#endif - - S_msrHarpPedalsTuning - harpPedalsTuningDeepCopy = 0; // JMI - - return harpPedalsTuningDeepCopy; -} - -void msrHarpPedalsTuning::addPedalTuning ( - int inputLineNumber, - msrDiatonicPitchKind diatonicPitchKind, - msrAlterationKind alterationKind) -{ - // is diatonicPitch in the part renaming map? - map::const_iterator - it = - fHarpPedalsAlterationKindsMap.find (diatonicPitchKind); - - if (it != fHarpPedalsAlterationKindsMap.end ()) { - stringstream s; - - s << - "pedal tuning '" << - msrDiatonicPitchKindAsString ( - diatonicPitchKind) << - msrAlterationKindAsString ( - alterationKind) << - "' has already been specified"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fHarpPedalsAlterationKindsMap [diatonicPitchKind] = alterationKind; -} - -void msrHarpPedalsTuning::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHarpPedalsTuning::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHarpPedalsTuning elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHarpPedalsTuning::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrHarpPedalsTuning::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHarpPedalsTuning::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHarpPedalsTuning elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHarpPedalsTuning::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrHarpPedalsTuning::browseData (basevisitor* v) -{} - -string msrHarpPedalsTuning::asString () const -{ - stringstream s; - - s << - "HarpPedalsTuning" << - ", line " << fInputLineNumber << - ", "; - - if (fHarpPedalsAlterationKindsMap.size ()) { - gIndenter++; - - map::const_iterator - iBegin = fHarpPedalsAlterationKindsMap.begin (), - iEnd = fHarpPedalsAlterationKindsMap.end (), - i = iBegin; - - for ( ; ; ) { - // print the pedal and its alteration - s << - msrDiatonicPitchKindAsString ( - (*i).first) << - " " << - msrAlterationKindAsString ( - (*i).second); - if (++i == iEnd) break; - s << ", "; - } // for - - gIndenter--; - } - - else { - s << - "empty"; - } - - return s.str (); -} - -void msrHarpPedalsTuning::print (ostream& os) const -{ - os << - "HarpPedalsTuning" << - ", line " << fInputLineNumber; - - if (fHarpPedalsAlterationKindsMap.size ()) { - gIndenter++; - - os << endl; - - map::const_iterator - iBegin = fHarpPedalsAlterationKindsMap.begin (), - iEnd = fHarpPedalsAlterationKindsMap.end (), - i = iBegin; - - for ( ; ; ) { - // print the pedal and its alteration - os << - msrDiatonicPitchKindAsString ( - (*i).first) << - " " << - msrAlterationKindAsString ( - (*i).second); - if (++i == iEnd) break; - os << ", "; - } // for - - gIndenter--; - } - - else { - os << - " empty" << - endl; - } - - os << endl; -} - -ostream& operator<< (ostream& os, const S_msrHarpPedalsTuning& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrPedal msrPedal::create ( - int inputLineNumber, - msrPedalTypeKind pedalTypeKind, - msrPedalLineKind pedalLineKind, - msrPedalSignKind pedalSignKind) -{ - msrPedal* o = - new msrPedal ( - inputLineNumber, - pedalTypeKind, pedalLineKind, pedalSignKind); - assert(o!=0); - return o; -} - -msrPedal::msrPedal ( - int inputLineNumber, - msrPedalTypeKind pedalTypeKind, - msrPedalLineKind pedalLineKind, - msrPedalSignKind pedalSignKind) - : msrMeasureElement (inputLineNumber) -{ - fPedalTypeKind = pedalTypeKind; - fPedalLineKind = pedalLineKind; - fPedalSignKind = pedalSignKind; -} - -msrPedal::~msrPedal () -{} - -void msrPedal::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPedal::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPedal elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPedal::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPedal::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPedal::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPedal elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPedal::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrPedal::browseData (basevisitor* v) -{} - -string msrPedal::pedalTypeAsString () const -{ - string result; - - switch (fPedalTypeKind) { - case kPedalStart: - result = "pedalStart"; - break; - case kPedalContinue: - result = "pedalContinue"; - break; - case kPedalChange: - result = "pedalChange"; - break; - case kPedalStop: - result = "pedalStop"; - break; - case k_NoPedalType: - result = "noPedalType"; - break; - } // switch - - return result; -} - -string msrPedal::pedalLineAsString () const -{ - string result; - - switch (fPedalLineKind) { - case msrPedal::kPedalLineYes: - result = "pedalLineYes"; - break; - case msrPedal::kPedalLineNo: - result = "pedalLineNo"; - break; - } // switch - - return result; -} - -string msrPedal::pedalSignAsString () const -{ - string result; - - switch (fPedalSignKind) { - case msrPedal::kPedalSignYes: - result = "pedalSignYes"; - break; - case msrPedal::kPedalSignNo: - result = "pedalSignNo"; - break; - } // switch - - return result; -} - -void msrPedal::print (ostream& os) const -{ - os << - "Pedal" << - ", pedalType: " << - pedalTypeAsString () << - ", pedalLine: " << - pedalLineAsString () << - ", pedalSign: " << - pedalSignAsString () << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrPedal& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrDamp msrDamp::create ( - int inputLineNumber) -{ - msrDamp* o = - new msrDamp ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrDamp::msrDamp ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{} - -msrDamp::~msrDamp () -{} - -void msrDamp::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDamp::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDamp elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDamp::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrDamp::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDamp::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDamp elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDamp::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrDamp::browseData (basevisitor* v) -{} - -void msrDamp::print (ostream& os) const -{ - os << - "Damp" << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrDamp& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrDampAll msrDampAll::create ( - int inputLineNumber) -{ - msrDampAll* o = - new msrDampAll ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrDampAll::msrDampAll ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{} - -msrDampAll::~msrDampAll () -{} - -void msrDampAll::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDampAll::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDampAll elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDampAll::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrDampAll::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrDampAll::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrDampAll elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrDampAll::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrDampAll::browseData (basevisitor* v) -{} - -void msrDampAll::print (ostream& os) const -{ - os << - "DampAll" << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrDampAll& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrInstruments.h b/src/lilypond/msrInstruments.h deleted file mode 100644 index 9e3911346..000000000 --- a/src/lilypond/msrInstruments.h +++ /dev/null @@ -1,546 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrInstruments___ -#define ___msrInstruments___ - -#include - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrStringTuning : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int stringTuningNumber, - msrDiatonicPitchKind stringTuningDiatonicPitchKind, - msrAlterationKind stringTuningAlterationKind, - int stringTuningOctave); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrStringTuning ( - int inputLineNumber, - int stringTuningNumber, - msrDiatonicPitchKind stringTuningDiatonicPitchKind, - msrAlterationKind stringTuningAlterationKind, - int stringTuningOctave); - - virtual ~msrStringTuning (); - - public: - - // set and get - // ------------------------------------------------------ - - int getStringTuningNumber () const - { return fStringTuningNumber; } - - msrDiatonicPitchKind getStringTuningDiatonicPitchKind () const - { return fStringTuningDiatonicPitchKind; } - - msrAlterationKind getStringTuningAlterationKind () const - { return fStringTuningAlterationKind; } - - int getStringTuningOctave () const - { return fStringTuningOctave; } - - // services - // ------------------------------------------------------ - - string stringTuningKindAsString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fStringTuningNumber; - - msrDiatonicPitchKind fStringTuningDiatonicPitchKind; - msrAlterationKind fStringTuningAlterationKind; - int fStringTuningOctave; -}; -typedef SMARTP S_msrStringTuning; -EXP ostream& operator<< (ostream& os, const S_msrStringTuning& elt); - -//______________________________________________________________________________ -class msrScordatura : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrScordaturaKind { - kScordaturaNone, - kScordaturaUp, kScordaturaDown, - kScordaturaStop, kScordaturaContinue }; - - static string scordaturaKindAsString ( - msrScordaturaKind scordaturaKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrScordatura ( - int inputLineNumber); - - virtual ~msrScordatura (); - - public: - - // set and get - // ------------------------------------------------------ - - const list& - getScordaturaStringTuningsList () - { return fScordaturaStringTuningsList; } - - // services - // ------------------------------------------------------ - - void addStringTuningToScordatura ( - S_msrStringTuning stringTuning); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - list - fScordaturaStringTuningsList; -}; -typedef SMARTP S_msrScordatura; -EXP ostream& operator<< (ostream& os, const S_msrScordatura& elt); - -//______________________________________________________________________________ -class msrAccordionRegistration : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int highDotsNumber, - int middleDotsNumber, - int lowDotsNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrAccordionRegistration ( - int inputLineNumber, - int highDotsNumber, - int middleDotsNumber, - int lowDotsNumber); - - virtual ~msrAccordionRegistration (); - - public: - - // set and get - // ------------------------------------------------------ - - int getHighDotsNumber () const - { return fHighDotsNumber; } - - int getMiddleDotsNumber () const - { return fMiddleDotsNumber; } - - int getLowDotsNumber () const - { return fLowDotsNumber; } - - // services - // ------------------------------------------------------ - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // see https://de.wikipedia.org/wiki/Register_%28Akkordeon%29 - // for the meaning of the dots numbers - - int fHighDotsNumber; - int fMiddleDotsNumber; - int fLowDotsNumber; -}; -typedef SMARTP S_msrAccordionRegistration; -EXP ostream& operator<< (ostream& os, const S_msrAccordionRegistration& elt); - -//______________________________________________________________________________ -class msrHarpPedalsTuning : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - SMARTP createHarpPedalsTuningNewbornClone (); - - SMARTP createHarpPedalsTuningDeepCopy (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrHarpPedalsTuning ( - int inputLineNumber); - - ~ msrHarpPedalsTuning (); - - public: - - // set and get - // ------------------------------------------------------ - - const map& - getHarpPedalsAlterationKindsMap () - { return fHarpPedalsAlterationKindsMap; } - - // services - // ------------------------------------------------------ - - void addPedalTuning ( - int intputLineNumber, - msrDiatonicPitchKind diatonicPitchKind, - msrAlterationKind alterationKind); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - public: - - // fields - // ------------------------------------------------------ - - map - fHarpPedalsAlterationKindsMap; -}; -typedef SMARTP S_msrHarpPedalsTuning; -EXP ostream& operator<< (ostream& os, const S_msrHarpPedalsTuning& elt); - -//______________________________________________________________________________ -class msrPedal : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrPedalTypeKind { - kPedalStart, kPedalContinue, kPedalChange, kPedalStop, - k_NoPedalType }; - - static string pedalTypeKindAsString ( - msrPedalTypeKind pedalTypeKind); - - enum msrPedalLineKind { - kPedalLineYes, kPedalLineNo}; - - static string pedalLineKindAsString ( - msrPedalLineKind pedalLineKind); - - enum msrPedalSignKind { - kPedalSignYes, kPedalSignNo}; - - static string pedalSignKindAsString ( - msrPedalSignKind pedalSignKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrPedalTypeKind pedalTypeKind, - msrPedalLineKind pedalLineKind, - msrPedalSignKind pedalSignKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPedal ( - int inputLineNumber, - msrPedalTypeKind pedalTypeKind, - msrPedalLineKind pedalLineKind, - msrPedalSignKind pedalSignKind); - - virtual ~msrPedal (); - - public: - - // set and get - // ------------------------------------------------------ - - msrPedalTypeKind getPedalTypeKind () const - { return fPedalTypeKind; } - - msrPedalLineKind getPedalLineKind () const - { return fPedalLineKind; } - - msrPedalSignKind getPedalSignKind () const - { return fPedalSignKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string pedalTypeAsString () const; - - string pedalLineAsString () const; - - string pedalSignAsString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrPedalTypeKind fPedalTypeKind; - msrPedalLineKind fPedalLineKind; - msrPedalSignKind fPedalSignKind; -}; -typedef SMARTP S_msrPedal; -EXP ostream& operator<< (ostream& os, const S_msrPedal& elt); - -//______________________________________________________________________________ -class msrDamp : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrDamp ( - int inputLineNumber); - - virtual ~msrDamp (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_msrDamp; -EXP ostream& operator<< (ostream& os, const S_msrDamp& elt); - -//______________________________________________________________________________ -class msrDampAll : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrDampAll ( - int inputLineNumber); - - virtual ~msrDampAll (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_msrDampAll; -EXP ostream& operator<< (ostream& os, const S_msrDampAll& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrKeys.cpp b/src/lilypond/msrKeys.cpp deleted file mode 100644 index be69bfc88..000000000 --- a/src/lilypond/msrKeys.cpp +++ /dev/null @@ -1,606 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrKeys.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrHumdrumScotKeyItem msrHumdrumScotKeyItem::create ( - int inputLineNumber) -{ - msrHumdrumScotKeyItem* o = - new msrHumdrumScotKeyItem ( - inputLineNumber); - assert (o!=0); - - return o; -} - -msrHumdrumScotKeyItem::msrHumdrumScotKeyItem ( - int inputLineNumber) - : msrElement (inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Creating Humdrum/Scot key item" << - ", line = " << inputLineNumber << - endl; - } -#endif - - fKeyDiatonicPitchKind = k_NoDiatonicPitch; - fKeyAlterationKind = k_NoAlteration; - fKeyOctave = -1; // actual MusicXML octaves are non-negative -} - -msrHumdrumScotKeyItem::~msrHumdrumScotKeyItem () -{} - -bool msrHumdrumScotKeyItem::isEqualTo ( - S_msrHumdrumScotKeyItem - otherHumdrumScotKeyItem) const -{ - if (! otherHumdrumScotKeyItem) { - return false; - } - - return - fKeyDiatonicPitchKind == otherHumdrumScotKeyItem->fKeyDiatonicPitchKind - && - fKeyAlterationKind == otherHumdrumScotKeyItem->fKeyAlterationKind - && - fKeyOctave == otherHumdrumScotKeyItem->fKeyOctave; -} - -void msrHumdrumScotKeyItem::setKeyItemDiatonicPitchKind ( - msrDiatonicPitchKind diatonicPitchKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Setting Humdrum/Scot key item diatonic pitch to '" << - msrDiatonicPitchKindAsString (diatonicPitchKind) << - "'" << - endl; - } -#endif - - fKeyDiatonicPitchKind = diatonicPitchKind; -} - -void msrHumdrumScotKeyItem::setKeyItemAlterationKind ( - msrAlterationKind alterationKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Setting Humdrum/Scot key item alteration to '" << - msrAlterationKindAsString (alterationKind) << - "'" << - endl; - } -#endif - - fKeyAlterationKind = alterationKind; -} - -void msrHumdrumScotKeyItem::setKeyItemOctave (int keyOctave) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Setting Humdrum/Scot key item octave to '" << - keyOctave << - "'" << - endl; - } -#endif - - fKeyOctave = keyOctave; -} - -void msrHumdrumScotKeyItem::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHumdrumScotKeyItem::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHumdrumScotKeyItem elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHumdrumScotKeyItem::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrHumdrumScotKeyItem::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrHumdrumScotKeyItem::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrHumdrumScotKeyItem elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrHumdrumScotKeyItem::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrHumdrumScotKeyItem::browseData (basevisitor* v) -{} - -string msrHumdrumScotKeyItem::asString () const -{ - stringstream s; - - s << - "HumdrumScotKeyItem" << - ", KeyDiatonicPitch" << ": " << - msrDiatonicPitchKindAsString (fKeyDiatonicPitchKind) << - ", KeyAlteration" << ": " << - msrAlterationKindAsString (fKeyAlterationKind) << - ", KeyOctave" << ": " << fKeyOctave << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrHumdrumScotKeyItem::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrHumdrumScotKeyItem& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrKey msrKey::createTraditional ( - int inputLineNumber, - msrQuarterTonesPitchKind keyTonicQuarterTonesPitchKind, - msrKeyModeKind keyModeKind, - int keyCancel) -{ - msrKey* o = - new msrKey ( - inputLineNumber, - keyTonicQuarterTonesPitchKind, keyModeKind, - keyCancel); - assert (o!=0); - - return o; -} - -S_msrKey msrKey::createHumdrumScot ( - int inputLineNumber) -{ - msrKey* o = - new msrKey ( - inputLineNumber); - assert (o!=0); - - return o; -} - -msrKey::msrKey ( // for traditional keys - int inputLineNumber, - msrQuarterTonesPitchKind keyTonicQuarterTonesPitchKind, - msrKeyModeKind keyModeKind, - int keyCancel) - : msrMeasureElement (inputLineNumber) -{ - // this is a traditional key - fKeyKind = kTraditionalKind; - - fKeyModeKind = keyModeKind; - - /* caution: - - 0 - minor - - is A minor actually, not C minor! - */ - - fKeyTonicQuarterTonesPitchKind = keyTonicQuarterTonesPitchKind; - - switch (fKeyModeKind) { - case msrKey::kMajorMode: - break; - case msrKey::kMinorMode: - fKeyTonicQuarterTonesPitchKind = - noteAtIntervalFromQuarterTonesPitch ( - inputLineNumber, - kMajorSixth, // a minor third below actually - fKeyTonicQuarterTonesPitchKind); - break; - case msrKey::kIonianMode: - break; - case msrKey::kDorianMode: - break; - case msrKey::kPhrygianMode: - break; - case msrKey::kLydianMode: - break; - case msrKey::kMixolydianMode: - break; - case msrKey::kAeolianMode: - break; - case msrKey::kLocrianMode: - break; - } // switch - - fKeyCancel = keyCancel; - - // initialization in all cases - fKeyItemsOctavesAreSpecified = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Creating traditional key '" << - this->asString () << - "'" << - endl; - } -#endif -} - -msrKey::msrKey ( // for Humdrum/Scot keys - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{ - // this is a Humdrum/Scot key - fKeyKind = kHumdrumScotKind; - - // initialization in all cases - fKeyItemsOctavesAreSpecified = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Creating Humdrum/Scot key '" << - this->asString () << - "'" << - endl; - } -#endif -} - -msrKey::~msrKey () -{} - -bool msrKey::isEqualTo (S_msrKey otherKey) const -{ - if (! otherKey) { - return false; - } - - if ( - ! ( - fKeyKind == otherKey->fKeyKind - && - fKeyTonicQuarterTonesPitchKind - == - otherKey->fKeyTonicQuarterTonesPitchKind - && - fKeyModeKind == otherKey->fKeyModeKind - && - fKeyCancel == otherKey->fKeyCancel - ) - ) { - return false; - } - - switch (fKeyKind) { - case msrKey::kTraditionalKind: - break; - case msrKey::kHumdrumScotKind: - { - if ( - ! ( - fKeyItemsOctavesAreSpecified - == - otherKey->fKeyItemsOctavesAreSpecified - && - fHumdrumScotKeyItemsVector.size () - == - otherKey->fHumdrumScotKeyItemsVector.size () - ) - ) { - return false; - } - - for (unsigned int i = 0; i < fHumdrumScotKeyItemsVector.size (); i++) { - if ( - ! ( - fHumdrumScotKeyItemsVector [i]->isEqualTo ( - otherKey->fHumdrumScotKeyItemsVector [i]) - ) - ) { - return false; - } - } // for - } - break; - } // switch - - return true; -} - -void msrKey::appendHumdrumScotKeyItem ( - S_msrHumdrumScotKeyItem item) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Append item '" << - item->asString () << - "' to key '" << - "'" << - endl; - } -#endif - - // have key items octaves been specified? - if (item->getKeyItemOctave () >= 0) { - fKeyItemsOctavesAreSpecified = true; - } - - // append the item to the vector - fHumdrumScotKeyItemsVector.insert ( - fHumdrumScotKeyItemsVector.end (), item); -} - -void msrKey::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrKey::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrKey elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrKey::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrKey::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrKey::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrKey elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrKey::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrKey::browseData (basevisitor* v) -{} - -string msrKey::keyKindAsString ( - msrKeyKind keyKind) -{ - string result; - - switch (keyKind) { - case msrKey::kTraditionalKind: - result = "traditional"; - break; - case msrKey::kHumdrumScotKind: - result = "Humdrum/Scot"; - break; - } // switch - - return result; -} - -string msrKey::keyModeKindAsString ( - msrKeyModeKind keyModeKind) -{ - string result; - - switch (keyModeKind) { - case msrKey::kMajorMode: - result = "major"; - break; - case msrKey::kMinorMode: - result = "minor"; - break; - case msrKey::kIonianMode: - result = "ionian"; - break; - case msrKey::kDorianMode: - result = "dorian"; - break; - case msrKey::kPhrygianMode: - result = "phrygian"; - break; - case msrKey::kLydianMode: - result = "lydian"; - break; - case msrKey::kMixolydianMode: - result = "mixolydian"; - break; - case msrKey::kAeolianMode: - result = "aeolian"; - break; - case msrKey::kLocrianMode: - result = "locrian"; - break; - } // switch - - return result; -} - -string msrKey::asString () const -{ - stringstream s; - - s << - "Key" << - ", " << keyKindAsString (fKeyKind) << - ", "; - - switch (fKeyKind) { - case msrKey::kTraditionalKind: - s << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fKeyTonicQuarterTonesPitchKind) << - " " << - keyModeKindAsString (fKeyModeKind); - break; - - case msrKey::kHumdrumScotKind: - s << - fHumdrumScotKeyItemsVector.size () << "items" << - ", keyItemsOctavesAreSpecified: " << - booleanAsString ( - fKeyItemsOctavesAreSpecified); - break; - } // switch - - s << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrKey::print (ostream& os) const -{ - os << - "Key" << - ", " << keyKindAsString (fKeyKind) << - ","; - - switch (fKeyKind) { - case msrKey::kTraditionalKind: - os << - " " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fKeyTonicQuarterTonesPitchKind) << - " " << - keyModeKindAsString (fKeyModeKind) << - ", line " << fInputLineNumber << - endl; - break; - - case msrKey::kHumdrumScotKind: - os << - ", keyItemsOctavesAreSpecified: " << - booleanAsString ( - fKeyItemsOctavesAreSpecified) << - ", " << - fHumdrumScotKeyItemsVector.size () << - " items" << - ", line " << fInputLineNumber << - endl; - - if (fHumdrumScotKeyItemsVector.size ()) { - os << endl; - - gIndenter++; - - vector::const_iterator - iBegin = fHumdrumScotKeyItemsVector.begin (), - iEnd = fHumdrumScotKeyItemsVector.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - else - { - os << - " none" << - endl; - } - break; - } // switch -} - -ostream& operator<< (ostream& os, const S_msrKey& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrKeys.h b/src/lilypond/msrKeys.h deleted file mode 100644 index f5c5b76cd..000000000 --- a/src/lilypond/msrKeys.h +++ /dev/null @@ -1,267 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrKeys___ -#define ___msrKeys___ - -#include - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrHumdrumScotKeyItem; -typedef SMARTP S_msrHumdrumScotKeyItem; - -//______________________________________________________________________________ -class msrHumdrumScotKeyItem : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrHumdrumScotKeyItemKind { - kTraditionalKind, kHumdrumScotKind }; - - static string HumdrumScotKeyItemKindAsString ( - msrHumdrumScotKeyItemKind HumdrumScotKeyItemKind); - - enum msrHumdrumScotKeyItemModeKind { - kMajorMode, kMinorMode, - kIonianMode, kDorianMode, kPhrygianMode, kLydianMode, - kMixolydianMode, kAeolianMode, kLocrianMode }; - - static string HumdrumScotKeyItemModeKindAsString ( - msrHumdrumScotKeyItemModeKind HumdrumScotKeyItemModeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrHumdrumScotKeyItem ( - int inputLineNumber); - - virtual ~msrHumdrumScotKeyItem (); - - public: - - // set and get - // ------------------------------------------------------ - - void setKeyItemDiatonicPitchKind ( - msrDiatonicPitchKind diatonicPitchKind); - - msrDiatonicPitchKind getKeyItemDiatonicPitchKind () const - { return fKeyDiatonicPitchKind; } - - void setKeyItemAlterationKind ( - msrAlterationKind alterationKind); - - msrAlterationKind getKeyItemAlterationKind () const - { return fKeyAlterationKind; } - - void setKeyItemOctave (int keyOctave); - - int getKeyItemOctave () const - { return fKeyOctave; } - - // services - // ------------------------------------------------------ - - bool isEqualTo ( - S_msrHumdrumScotKeyItem - otherHumdrumScotKeyItem) const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrDiatonicPitchKind fKeyDiatonicPitchKind; - msrAlterationKind fKeyAlterationKind; - int fKeyOctave; -}; -typedef SMARTP S_msrHumdrumScotKeyItem; -EXP ostream& operator<< (ostream& os, const S_msrHumdrumScotKeyItem& elt); - -//______________________________________________________________________________ -class msrKey; -typedef SMARTP S_msrKey; - -class msrKey : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrKeyKind { - kTraditionalKind, kHumdrumScotKind }; - - static string keyKindAsString ( - msrKeyKind keyKind); - - enum msrKeyModeKind { - kMajorMode, kMinorMode, - kIonianMode, kDorianMode, kPhrygianMode, kLydianMode, - kMixolydianMode, kAeolianMode, kLocrianMode }; - - static string keyModeKindAsString ( - msrKeyModeKind keyModeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP createTraditional ( - int inputLineNumber, - msrQuarterTonesPitchKind keyTonicPitchKind, - msrKeyModeKind keyModeKind, - int keyCancel); - - static SMARTP createHumdrumScot ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrKey ( // for traditional keys - int inputLineNumber, - msrQuarterTonesPitchKind keyTonicPitchKind, - msrKeyModeKind keyModeKind, - int keyCancel); - - msrKey ( // for Humdrum/Scot keys - int inputLineNumber); - - virtual ~msrKey (); - - public: - - // set and get - // ------------------------------------------------------ - - msrKeyKind getKeyKind () const - { return fKeyKind; } - - // traditional keys - - msrQuarterTonesPitchKind - getKeyTonicQuarterTonesPitchKind () const - { return fKeyTonicQuarterTonesPitchKind; } - - msrKeyModeKind getKeyModeKind () const - { return fKeyModeKind; } - - int getKeyCancel () const - { return fKeyCancel; } - - // Humdrum/Scot keys - - // void setKeyItemsOctavesAreSpecified () - // { fKeyItemsOctavesAreSpecified = true; } - - bool getKeyItemsOctavesAreSpecified () const - { return fKeyItemsOctavesAreSpecified; } - - const vector& - getHumdrumScotKeyItemsVector () - { return fHumdrumScotKeyItemsVector; } - - - // services - // ------------------------------------------------------ - - bool isEqualTo (S_msrKey otherKey) const; - - void appendHumdrumScotKeyItem ( - S_msrHumdrumScotKeyItem item); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrKeyKind fKeyKind; - - // traditional keys - - msrQuarterTonesPitchKind - fKeyTonicQuarterTonesPitchKind; - msrKeyModeKind fKeyModeKind; - int fKeyCancel; - - // Humdrum/Scot keys - vector - fHumdrumScotKeyItemsVector; - bool fKeyItemsOctavesAreSpecified; -}; -typedef SMARTP S_msrKey; -EXP ostream& operator<< (ostream& os, const S_msrKey& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrLayouts.cpp b/src/lilypond/msrLayouts.cpp deleted file mode 100644 index 65805e5c7..000000000 --- a/src/lilypond/msrLayouts.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrLayouts.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrPageLayout msrPageLayout::create ( - int inputLineNumber) -{ - msrPageLayout* o = - new msrPageLayout ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrPageLayout::msrPageLayout ( - int inputLineNumber) - : msrElement (inputLineNumber) -{} - -msrPageLayout::~msrPageLayout () -{} - -void msrPageLayout::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPageLayout::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPageLayout elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPageLayout::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPageLayout::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPageLayout::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPageLayout elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPageLayout::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrPageLayout::browseData (basevisitor* v) -{ -/* JMI ??? - int n1 = fVarValAssocs.size (); - - for (int i = 0; i < n1; i++ ) { - // browse the stanza - msrBrowser browser (v); - browser.browse (*fVarValAssocs [i]); - } // for - */ -} - -void msrPageLayout::print (ostream& os) const -{ - os << "PageLayout" << endl; - - const int fieldWidth = 13; - - gIndenter++; - - // page size - os << left << - setw (fieldWidth) << - "pageHeight" << " : "; - if (fPageHeight) { - os << fPageHeight; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "pageWidth" << " : "; - if (fPageWidth) { - os << fPageWidth; - } - else { - os << "none"; - } - os << endl; - - // margins - os << left << - setw (fieldWidth) << - "leftMargin" << " : "; - if (fLeftMargin) { - os << fLeftMargin; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "rightMargin" << " : "; - if (fRightMargin) { - os << fRightMargin; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "topMargin" << " : "; - if (fTopMargin) { - os << fTopMargin; - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "bottomMargin" << " : "; - if (fBottomMargin) { - os << fBottomMargin; - } - else { - os << "none"; - } - os << endl; - - /* JMI - int n1 = fVarValAssocs.size (); - - for (int i = 0; i < n1; i++ ) { - os << fVarValAssocs [i]; - } // for - - int n2 = fMsrSchemeVarValAssocs.size (); - for (int i = 0; i < n2; i++ ) { - os << fMsrSchemeVarValAssocs[i]; - } // for - */ - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrPageLayout& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrLayouts.h b/src/lilypond/msrLayouts.h deleted file mode 100644 index 153dfa0d7..000000000 --- a/src/lilypond/msrLayouts.h +++ /dev/null @@ -1,552 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrLayout___ -#define ___msrLayout___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrPageLayout : public msrElement -{ -/* - - - - - - -*/ - - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPageLayout ( - int inputLineNumber); - - virtual ~msrPageLayout (); - - public: - - // set and get - // ------------------------------------------------------ - - // page size - void setPageHeight (S_msrLength val) - { fPageHeight = val; } - S_msrLength getPageHeight () const - { return fPageHeight; } - - void setPageWidth (S_msrLength val) - { fPageWidth = val; } - S_msrLength getPageWidth () const - { return fPageWidth; } - - // margins - void setLeftMargin (S_msrMargin val) - { fLeftMargin = val; } - S_msrMargin getLeftMargin () const - { return fLeftMargin; } - - void setRightMargin (S_msrMargin val) - { fRightMargin = val; } - S_msrMargin getRightMargin () const - { return fRightMargin; } - - void setTopMargin (S_msrMargin val) - { fTopMargin = val; } - S_msrMargin getTopMargin () const - { return fTopMargin; } - - void setBottomMargin (S_msrMargin val) - { fBottomMargin = val; } - S_msrMargin getBottomMargin () const - { return fBottomMargin; } - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // page size - S_msrLength fPageHeight; - S_msrLength fPageWidth; - - // margins - S_msrMargin fLeftMargin; - S_msrMargin fRightMargin; - S_msrMargin fTopMargin; - S_msrMargin fBottomMargin; -}; -typedef SMARTP S_msrPageLayout; -EXP ostream& operator<< (ostream& os, const S_msrPageLayout& elt); - -//______________________________________________________________________________ -class msrSystemLayout : public msrElement -{ -/* - - - - - -*/ - - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSystemLayout ( - int inputLineNumber); - - virtual ~msrSystemLayout (); - - public: - - // set and get - // ------------------------------------------------------ - - // margins - void setLeftMargin (S_msrMargin val) - { fLeftMargin = val; } - S_msrMargin getLeftMargin () const - { return fLeftMargin; } - - void setRightMargin (S_msrMargin val) - { fRightMargin = val; } - S_msrMargin getRightMargin () const - { return fRightMargin; } - - // distances - void setSystemDistance (S_msrLength val) - { fSystemDistance = val; } - S_msrLength getSystemDistance () const - { return fSystemDistance; } - - void setTopSystemDistance (S_msrLength val) - { fTopSystemDistance = val; } - S_msrLength getTopSystemDistance () const - { return fTopSystemDistance; } - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // margins - S_msrMargin fLeftMargin; - S_msrMargin fRightMargin; - - // distances - S_msrLength fSystemDistance; - S_msrLength fTopSystemDistance; -}; -typedef SMARTP S_msrSystemLayout; -EXP ostream& operator<< (ostream& os, const S_msrSystemLayout& elt); - -//______________________________________________________________________________ -class msrSystemDividers : public msrElement -{ -/* - - - - - - - - - - 0 - 0 - - 39 - 39 - - - - - -*/ - - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSystemDividers ( - int inputLineNumber); - - virtual ~msrSystemDividers (); - - public: - - // set and get - // ------------------------------------------------------ - - void setPrintLeftDivider (bool val) - { fPrintLeftDivider = val; } - bool getPrintLeftDivider () const - { return fPrintLeftDivider; } - - void setPrintRightDivider (bool val) - { fPrintRightDivider = val; } - bool getPrintRightDivider () const - { return fPrintRightDivider; } - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // staff number - bool fPrintLeftDivider; - bool fPrintRightDivider; -}; -typedef SMARTP S_msrSystemDividers; -EXP ostream& operator<< (ostream& os, const S_msrSystemDividers& elt); - -//______________________________________________________________________________ -class msrStaffLayout : public msrElement -{ -/* - - - - -*/ - - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrStaffLayout ( - int inputLineNumber); - - virtual ~msrStaffLayout (); - - public: - - // set and get - // ------------------------------------------------------ - - // staff number - void setStaffNumber (int val) - { fStaffNumber = val; } - int getStaffNumber () const - { return fStaffNumber; } - - // staff distance - void setStaffDistance (S_msrLength val) - { fStaffDistance = val; } - S_msrLength getStaffDistance () const - { return fStaffDistance; } - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // staff number - int fStaffNumber; - - // staff distance - S_msrLength fStaffDistance; -}; -typedef SMARTP S_msrStaffLayout; -EXP ostream& operator<< (ostream& os, const S_msrStaffLayout& elt); - -//______________________________________________________________________________ -class msrMeasureLayout : public msrElement -{ -/* - - - -*/ - - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrMeasureLayout ( - int inputLineNumber); - - virtual ~msrMeasureLayout (); - - public: - - // set and get - // ------------------------------------------------------ - - // measure distance - void setMeasureDistance (S_msrLength val) - { fMeasureDistance = val; } - S_msrLength getMeasureDistance () const - { return fMeasureDistance; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // measure distance - S_msrLength fMeasureDistance; -}; -typedef SMARTP S_msrMeasureLayout; -EXP ostream& operator<< (ostream& os, const S_msrMeasureLayout& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrLigatures.cpp b/src/lilypond/msrLigatures.cpp deleted file mode 100644 index f1aae5567..000000000 --- a/src/lilypond/msrLigatures.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrLigatures.h" - -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrLigature msrLigature::create ( - int inputLineNumber, - int ligatureNumber, - msrLigatureKind ligatureKind, - msrLigatureLineEndKind ligatureLineEndKind, - msrLineTypeKind ligatureLineTypeKind, - msrPlacementKind ligaturePlacementKind) -{ - msrLigature* o = - new msrLigature ( - inputLineNumber, - ligatureNumber, - ligatureKind, - ligatureLineEndKind, - ligatureLineTypeKind, - ligaturePlacementKind); - assert(o!=0); - return o; -} - -msrLigature::msrLigature ( - int inputLineNumber, - int ligatureNumber, - msrLigatureKind ligatureKind, - msrLigatureLineEndKind ligatureLineEndKind, - msrLineTypeKind ligatureLineTypeKind, - msrPlacementKind ligaturePlacementKind) - : msrElement (inputLineNumber) -{ - fLigatureNumber = ligatureNumber; - fLigatureKind = ligatureKind; - fLigatureLineEndKind = ligatureLineEndKind; - fLigatureLineTypeKind = ligatureLineTypeKind; - fLigaturePlacementKind = ligaturePlacementKind; -} - -msrLigature::~msrLigature () -{} - -void msrLigature::setLigatureOtherEndSideLink ( - S_msrLigature otherEndSideLink) -{ - // sanity check - msrAssert ( - otherEndSideLink != nullptr, - "otherEndSideLink is null"); - - // set the two-way sideLink between both ends of the spanner - fLigatureOtherEndSideLink = - otherEndSideLink; - - otherEndSideLink->fLigatureOtherEndSideLink = - this; -} - -void msrLigature::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrLigature::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrLigature elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrLigature::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrLigature::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrLigature::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrLigature elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrLigature::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - - -void msrLigature::browseData (basevisitor* v) -{} - -string msrLigature::ligatureKindAsString ( - msrLigatureKind ligatureKind) -{ - stringstream s; - - switch (ligatureKind) { - case msrLigature::kLigatureStart: - s << "ligatureStart"; - break; - case msrLigature::kLigatureContinue: - s << "ligatureContinue"; - break; - case msrLigature::kLigatureStop: - s << "ligatureStop"; - break; - case kLigatureNone: - s << "ligatureNone"; - } // switch - - return s.str (); - -} - -string msrLigature::ligatureLineEndKindAsString ( - msrLigatureLineEndKind ligatureLineEndKind) -{ - stringstream s; - - switch (ligatureLineEndKind) { - case msrLigature::kLigatureLineEndUp: - s << "ligatureLineEndUp"; - break; - case msrLigature::kLigatureLineEndDown: - s << "ligatureLineEndDown"; - break; - case msrLigature::kLigatureLineEndBoth: - s << "ligatureLineEndBoth"; - break; - case msrLigature::kLigatureLineEndArrow: - s << "ligatureLineEndArrow"; - break; - case msrLigature::kLigatureLineEndNone: - s << "ligatureLineEndNone"; - break; - } // switch - - return s.str (); - -} - -string msrLigature::ligatureKindAsString () const -{ - return ligatureKindAsString (fLigatureKind); -} - -void msrLigature::print (ostream& os) const -{ - os << - "Ligature " << ligatureKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - setw (fieldWidth) << - "ligatureLineEndKind" << " : " << - ligatureLineEndKindAsString ( - fLigatureLineEndKind) << - endl << - setw (fieldWidth) << - "ligatureLineTypeKind" << " : " << - msrLineTypeKindAsString ( - fLigatureLineTypeKind) << - endl << - setw (fieldWidth) << - "ligaturePlacementKind" << " : " << - msrPlacementKindAsString ( - fLigaturePlacementKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrLigature& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrLigatures.h b/src/lilypond/msrLigatures.h deleted file mode 100644 index 704387837..000000000 --- a/src/lilypond/msrLigatures.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrLigatures___ -#define ___msrLigatures___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrLigature; -typedef SMARTP S_msrLigature; - -class msrLigature : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrLigatureKind { - kLigatureNone, - kLigatureStart, kLigatureContinue, kLigatureStop}; - - static string ligatureKindAsString ( - msrLigatureKind ligatureKind); - - enum msrLigatureLineEndKind { - kLigatureLineEndNone, - kLigatureLineEndUp, kLigatureLineEndDown, - kLigatureLineEndBoth, kLigatureLineEndArrow }; - - static string ligatureLineEndKindAsString ( - msrLigatureLineEndKind ligatureLineEndKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int ligatureNumber, - msrLigatureKind ligatureKind, - msrLigatureLineEndKind ligatureLineEndKind, - msrLineTypeKind ligatureLineTypeKind, - msrPlacementKind ligaturePlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrLigature ( - int inputLineNumber, - int ligatureNumber, - msrLigatureKind ligatureKind, - msrLigatureLineEndKind ligatureLineEndKind, - msrLineTypeKind ligatureLineTypeKind, - msrPlacementKind ligaturePlacementKind); - - virtual ~msrLigature (); - - public: - - // set and get - // ------------------------------------------------------ - - // sideLinks - void setLigatureOtherEndSideLink ( - S_msrLigature otherEndSideLink); - - S_msrLigature getLigatureOtherEndSideLink () const - { return fLigatureOtherEndSideLink; } - - int getLigatureNumber () const - { return fLigatureNumber; } - - msrLigatureKind getLigatureKind () const - { return fLigatureKind; } - - msrLigatureLineEndKind - getLigatureLineEndKind () const - { return fLigatureLineEndKind; } - - msrLineTypeKind getLigatureLineTypeKind () const - { return fLigatureLineTypeKind; } - - msrPlacementKind getLigaturePlacementKind () const - { return fLigaturePlacementKind; } - - void setLigaturePlacementKind ( - msrPlacementKind placementKind) - { fLigaturePlacementKind = placementKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string ligatureKindAsString () const; - - virtual void print (ostream& os) const; - - private: - - // sideLinks - // ------------------------------------------------------ - S_msrLigature fLigatureOtherEndSideLink; // two-way - - // fields - // ------------------------------------------------------ - - int fLigatureNumber; - - msrLigatureKind fLigatureKind; - - msrLigatureLineEndKind - fLigatureLineEndKind; - - msrLineTypeKind fLigatureLineTypeKind; - - msrPlacementKind fLigaturePlacementKind; -}; -typedef SMARTP S_msrLigature; -EXP ostream& operator<< (ostream& os, const S_msrLigature& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrMeasureElements.cpp b/src/lilypond/msrMeasureElements.cpp deleted file mode 100644 index 59ce87b4e..000000000 --- a/src/lilypond/msrMeasureElements.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX - -#include "msrMeasureElements.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -msrMeasureElement::msrMeasureElement ( - int inputLineNumber) - : msrElement (inputLineNumber) -{ - fMeasureElementMeasureNumber = K_NO_MEASURE_NUMBER; - fMeasureElementPositionInMeasure = K_NO_POSITION_MEASURE_NUMBER; - fMeasureElementSoundingWholeNotes = rational (0, 1); // JMI K_NO_WHOLE_NOTES ??? -} - -msrMeasureElement::~msrMeasureElement () -{} - -void msrMeasureElement::setMeasureElementPositionInMeasure ( - rational positionInMeasure, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures || gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting measure element position in measure of " << - asString () << - " to '" << positionInMeasure << - "' in measure '" << - fMeasureElementMeasureNumber << - "', context: \"" << - context << - "\"" << - endl; - } -#endif - - // JMI ??? if (fMeasureElementPositionInMeasure == rational (3, 4) && positionInMeasure == rational (1, 2)) abort (); - - // sanity check - msrAssert ( - positionInMeasure != K_NO_POSITION_MEASURE_NUMBER, - "positionInMeasure == K_NO_POSITION_MEASURE_NUMBER"); - - fMeasureElementPositionInMeasure = positionInMeasure; -} - -void msrMeasureElement::setMeasureElementSoundingWholeNotes ( - rational wholeNotes, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures || gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting measure element sounding whole notes of " << - asString () << - " to '" << wholeNotes << - "' in measure '" << - fMeasureElementMeasureNumber << - "', context: \"" << - context << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert ( - wholeNotes != K_NO_WHOLE_NOTES, - "wholeNotes == K_NO_WHOLE_NOTES"); - - fMeasureElementSoundingWholeNotes = wholeNotes; -} - -bool msrMeasureElement::compareMeasureElementsByIncreasingPositionInMeasure ( - const SMARTP& first, - const SMARTP& second) -{ - return - first->getMeasureElementPositionInMeasure () - < - second->getMeasureElementPositionInMeasure (); -} - -void msrMeasureElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasureElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasureElement elem = this; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasureElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void msrMeasureElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasureElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasureElement elem = this; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasureElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -string msrMeasureElement::asString () const -{ - // this is overriden all in actual elements - return "??? msrMeasureElement::asString () ???"; -} - -string msrMeasureElement::asShortString () const -{ - // this can be overriden in actual elements - return asString (); -} - -void msrMeasureElement::print (ostream& os) const -{ - os << asString () << endl; -} - -ostream& operator<< (ostream& os, const S_msrMeasureElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrMeasureElements.h b/src/lilypond/msrMeasureElements.h deleted file mode 100644 index 9c61d9449..000000000 --- a/src/lilypond/msrMeasureElements.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrMeasureElements___ -#define ___msrMeasureElements___ - -#include "msrElements.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrMeasureElement : public msrElement -{ - public: - - // constants - // ------------------------------------------------------ - - #define K_NO_MEASURE_NUMBER "*unknown*" - - #define K_NO_POSITION_MEASURE_NUMBER rational (-222222, 1) - - #define K_NO_WHOLE_NOTES rational (-444444, 1) - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrMeasureElement ( - int inputLineNumber); - - virtual ~msrMeasureElement (); - - public: - - // set and get - // ------------------------------------------------------ - - void setMeasureElementMeasureNumber ( - string positionInMeasure) - { - fMeasureElementMeasureNumber = - positionInMeasure; - } - - string getMeasureElementMeasureNumber () - { return fMeasureElementMeasureNumber; } - - void setMeasureElementPositionInMeasure ( - rational positionInMeasure, - string context); - - rational getMeasureElementPositionInMeasure () - { return fMeasureElementPositionInMeasure; } - - void setMeasureElementSoundingWholeNotes ( - rational wholeNotes, - string context); - - rational getMeasureElementSoundingWholeNotes () const - { return fMeasureElementSoundingWholeNotes; } - - public: - - // services - // ------------------------------------------------------ - - static bool compareMeasureElementsByIncreasingPositionInMeasure ( - const SMARTP& first, - const SMARTP& second); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v) = 0; - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asShortString () const; - virtual std::string asString () const; - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os) {} - - protected: - - // fields - // ------------------------------------------------------ - - string fMeasureElementMeasureNumber; - rational fMeasureElementPositionInMeasure; - rational fMeasureElementSoundingWholeNotes; -}; -typedef SMARTP S_msrMeasureElement; -EXP ostream& operator<< (ostream& os, const S_msrMeasureElement& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrMeasures.cpp b/src/lilypond/msrMeasures.cpp deleted file mode 100644 index 24de7ed03..000000000 --- a/src/lilypond/msrMeasures.cpp +++ /dev/null @@ -1,5514 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -int msrMeasure::gMeasureDebugNumber = 0; - -S_msrMeasure msrMeasure::create ( - int inputLineNumber, - string measureNumber, - S_msrSegment measureSegmentUpLink) -{ - msrMeasure* o = - new msrMeasure ( - inputLineNumber, - measureNumber, - measureSegmentUpLink); - assert(o!=0); - - return o; -} - -msrMeasure::msrMeasure ( - int inputLineNumber, - string measureNumber, - S_msrSegment measureSegmentUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert( - measureSegmentUpLink != nullptr, - "measureSegmentUpLink is null"); - - // set measure's segment upLink - fMeasureSegmentUpLink = - measureSegmentUpLink; - - // set measure numbers - fMeasureElementMeasureNumber = measureNumber; - fMeasurePuristNumber = -1; // default irrealist value - fNextMeasureNumber = ""; - - // set debug number - fMeasureDebugNumber = ++gMeasureDebugNumber; - - // do other initializations - initializeMeasure (); -} - -void msrMeasure::initializeMeasure () -{ - S_msrVoice - voiceUpLink = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Initializing measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voiceUpLink->getVoiceName () << - "\"" << - ", line " << fInputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - if (false && fMeasureDebugNumber == 3) { // JMI - gLogOstream << - endl << - "======================= initializeMeasure()" << - endl << - - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () << - - "=======================" << - endl << - endl; - - abort (); - } - } -#endif - - // measure kind - fMeasureKind = kMeasureKindUnknown; - - // measure 'first in segment' kind - fMeasureFirstInSegmentKind = kMeasureFirstInSegmentKindUnknown; - - // measure 'first in voice' - fMeasureFirstInVoice = false; // default value - - // single-measure rest? - fMeasureIsAFullMeasureRest = false; - - // initialize measure whole notes - setCurrentMeasureWholeNotesDuration ( - fInputLineNumber, - rational (0, 1)); // ready to receive the first note - - // fetch the staff - S_msrStaff - staffUpLink = - voiceUpLink-> - getVoiceStaffUpLink (); - - // get the staff time - S_msrTime - staffCurrentTime = - staffUpLink-> - getStaffCurrentTime (); - - // set the measure full length if relevant - if (staffCurrentTime) { - setFullMeasureWholeNotesDurationFromTime ( - staffCurrentTime); - } - - // measure doesn't contain music yet - fMeasureContainsMusic = false; - - // regular measure ends detection - fMeasureEndRegularKind = kMeasureEndRegularKindUnknown; - - // repeat context - fMeasuresRepeatContextKind = msrMeasure::kMeasuresRepeatContextKindUnknown; - - // measure finalization - fMeasureHasBeenFinalized = false; - fMeasureKindAndPuristNumberHaveBeenDetermined = false; -} - -msrMeasure::~msrMeasure () -{} - -S_msrMeasure msrMeasure::createMeasureNewbornClone ( - S_msrSegment containingSegment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating a newborn clone of measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - containingSegment->asString () << - " in voice \"" << - containingSegment-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert( - containingSegment != nullptr, - "containingSegment is null"); - - // create newborn clone - S_msrMeasure - newbornClone = - msrMeasure::create ( - fInputLineNumber, - fMeasureElementMeasureNumber, - containingSegment); - - // next measure number - newbornClone->fNextMeasureNumber = - fNextMeasureNumber; - - /* JMI - // lengthes - newbornClone->fFullMeasureWholeNotesDuration = - fFullMeasureWholeNotesDuration; - - // measure purist number - newbornClone->fMeasurePuristNumber = // JMI don't compute that again for clones ??? - fMeasurePuristNumber; - - // measure 'first in segment' kind - newbornClone->fMeasureFirstInSegmentKind = - fMeasureFirstInSegmentKind; - */ - -/* JMI - // single-measure rest? - newbornClone->fMeasureIsAFullMeasureRest = - fMeasureIsAFullMeasureRest; - - // regular measure ends detection // JMI TEMP - newbornClone->fMeasureEndRegularKind = - fMeasureEndRegularKind; -*/ - - /* - // fCurrentMeasureWholeNotesDuration and fFullMeasureWholeNotesDuration - // will be computed on the fly - // when appending notes to the measure newborn clone - - // measure kind - newbornClone->fMeasureKind = - fMeasureKind; -*/ - - // chords handling - - // elements - - // upLinks - - return newbornClone; -} - -S_msrMeasure msrMeasure::createMeasureDeepCopy ( - S_msrSegment containingSegment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating a deep copy of measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - containingSegment->asString () << - " in voice \"" << - containingSegment-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert( - containingSegment != nullptr, - "containingSegment is null"); - - // create deep copy - S_msrMeasure - measureDeepCopy = - msrMeasure::create ( - fInputLineNumber, - fMeasureElementMeasureNumber, - containingSegment); - - // lengthes - measureDeepCopy->fFullMeasureWholeNotesDuration = - fFullMeasureWholeNotesDuration; - - measureDeepCopy->fCurrentMeasureWholeNotesDuration = - fCurrentMeasureWholeNotesDuration; - - // measure kind - measureDeepCopy->fMeasureKind = - fMeasureKind; - - // next measure number - measureDeepCopy->fNextMeasureNumber = - fNextMeasureNumber; - - // measure 'first in segment' kind - measureDeepCopy->fMeasureFirstInSegmentKind = - fMeasureFirstInSegmentKind; - - // elements - - int numberOfMeasureElements = - fMeasureElementsList.size (); - - if (numberOfMeasureElements) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - singularOrPluralWithoutNumber ( - numberOfMeasureElements, "There is", "There are") << - " " << - singularOrPlural ( - numberOfMeasureElements, "element", "elements") << - " to be deep copied in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - containingSegment->asString () << - " in voice \"" << - containingSegment-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - for ( - list::const_iterator i = fMeasureElementsList.begin (); - i != fMeasureElementsList.end (); - i++ ) { - S_msrMeasureElement element = (*i); - - // handlle deep copying - S_msrMeasureElement - elementDeepCopy; - - if ( - S_msrNote note = dynamic_cast(&(*element)) - ) { - // create the note deep copy - elementDeepCopy = - note->createNoteDeepCopy ( - fetchMeasureVoiceUpLink ()); - -/* JMI - // append the element deep copy to the measure deep copy - measureDeepCopy-> - appendElementToMeasure ( - elementDeepCopy); -*/ - } - - else if ( - S_msrTime time = dynamic_cast(&(*element)) - ) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Sharing time " << - time->asShortString () << - " in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "'deep copy" << - ", line " << fInputLineNumber << - endl; - } -#endif - - // share the element with the original measure - elementDeepCopy = time; - } - - else { - // share the element with the original measure - elementDeepCopy = element; - } - - // append the element deep copy to the measure deep copy - measureDeepCopy-> - appendElementToMeasure ( - elementDeepCopy); - } // for - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "There are no elements in measure to be deep copied" << - " in segment " << - containingSegment->asString () << - " in voice \"" << - containingSegment-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - } - - // upLinks - - // fMeasureSegmentUpLink JMI ??? - - return measureDeepCopy; -} - -S_msrPart msrMeasure::fetchMeasurePartUpLink () const -{ - return - fMeasureSegmentUpLink-> - fetchSegmentPartUpLink (); -} - -S_msrVoice msrMeasure::fetchMeasureVoiceUpLink () const -{ - return - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); -} - -void msrMeasure::setMeasureEndRegularKind ( - msrMeasureEndRegularKind measureEndRegularKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting regular kind of measure '" << - fMeasureElementMeasureNumber << - "' to '" << - measureEndRegularKindAsString (measureEndRegularKind) << - "' in segment " << - fMeasureSegmentUpLink->asString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << fInputLineNumber << - endl; - } -#endif - - fMeasureEndRegularKind = measureEndRegularKind; -} - -void msrMeasure::setMeasuresRepeatContextKind ( - msrMeasuresRepeatContextKind measuresRepeatContextKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting repeat context kind of measure '" << - fMeasureElementMeasureNumber << - "' to '" << - measuresRepeatContextKindAsString (measuresRepeatContextKind) << - "' in segment " << - fMeasureSegmentUpLink->asString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << fInputLineNumber << - endl; - } -#endif - - fMeasuresRepeatContextKind = measuresRepeatContextKind; -} - -void msrMeasure::setMeasurePuristNumber ( - int measurePuristNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting purist number of measure '" << - fMeasureElementMeasureNumber << - "' to '" << - measurePuristNumber << - "' in segment " << - fMeasureSegmentUpLink->asString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << fInputLineNumber << - endl; - } -#endif - - fMeasurePuristNumber = measurePuristNumber; -} - -void msrMeasure::appendElementToMeasure (S_msrMeasureElement elem) -{ -#ifdef TRACE_OAH - int inputLineNumber = - elem->getInputLineNumber (); -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Appending element " << - elem->asShortString () << - " to measure " << - asShortString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()->getVoiceName () << - "\", currentMeasureWholeNotesDuration = " << - fCurrentMeasureWholeNotesDuration << - ", line " << inputLineNumber << - endl; - } -#endif - - // set elem's measure number - elem-> - setMeasureElementMeasureNumber ( - fMeasureElementMeasureNumber); - - // set elem's position in measure - elem-> - setMeasureElementPositionInMeasure ( - fCurrentMeasureWholeNotesDuration, - "appendElementToMeasure()"); - - fMeasureElementsList.push_back (elem); -} - -void msrMeasure::insertElementInMeasureBeforeIterator ( - int inputLineNumber, - list::iterator iter, - S_msrMeasureElement elem) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Inserting element " << - elem->asShortString () << - /* JMI ??? - " before element " << - (*iter)->asShortString () << - */ - " in measure " << - asShortString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () - ->getVoiceName () << - "\", currentMeasureWholeNotesDuration = " << - fCurrentMeasureWholeNotesDuration << - ", line " << inputLineNumber << - endl; - } -#endif - - // set elem's measure number - elem-> - setMeasureElementMeasureNumber ( - fMeasureElementMeasureNumber); - - // set elem's position in measure - elem-> - setMeasureElementPositionInMeasure ( - fCurrentMeasureWholeNotesDuration, - "insertElementInMeasureBeforeIterator()"); - - // insert elem in the measure elements list before (*iter) - fMeasureElementsList.insert ( - iter, elem); - - // account for elem's duration in current measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - elem->getMeasureElementSoundingWholeNotes ()); -} - -void msrMeasure::appendElementAtTheEndOfMeasure (S_msrMeasureElement elem) -{ - int inputLineNumber = - elem->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Appending element " << - elem->asShortString () << - " at the end of measure " << - asShortString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () - ->getVoiceName () << - "\", has position in measure '" << - elem->getMeasureElementPositionInMeasure () << - ", currentMeasureWholeNotesDuration = " << - fCurrentMeasureWholeNotesDuration << - ", line " << inputLineNumber << - endl; - } - - if (gTraceOah->fTraceMeasuresDetails || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "appendElementAtTheEndOfMeasure() 1"); - } -#endif - -/* JMI - if (fMeasurePendingMeasureElementsList.size ()) { - // pad measure up to the elements positions in measure, - // and then append them - - list::iterator - iBegin = fMeasurePendingMeasureElementsList.begin (), - iEnd = fMeasurePendingMeasureElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrMeasureElement - measureElement = (*i); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Considering delayed " << - measureElement->asShortString () << - " in measure " << - asShortString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () - ->getVoiceName () << - "\", line " << inputLineNumber << - ", has position in measure '" << - measureElement->getMeasureElementPositionInMeasure () << - ", currentMeasureWholeNotesDuration = " << fCurrentMeasureWholeNotesDuration << - endl; - } -#endif - - if (measureElement->getMeasureElementPositionInMeasure () == fCurrentMeasureWholeNotesDuration) { // JMI - // this is where measureElement should be appended - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Appending delayed " << - measureElement->asShortString () << - " in measure " << - asShortString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () - ->getVoiceName () << - "\", line " << inputLineNumber << - ", has position in measure '" << - measureElement->getMeasureElementPositionInMeasure () << - ", currentMeasureWholeNotesDuration = " << fCurrentMeasureWholeNotesDuration << - endl; - } -#endif - - // set measureElement's position in measure - measureElement-> - setMeasureElementPositionInMeasure ( - fCurrentMeasureWholeNotesDuration, - "appendElementAtTheEndOfMeasure(), delayed element"); - - fMeasureElementsList.push_back (measureElement); - - // remove it from the pending measure elements list - i = fMeasurePendingMeasureElementsList.erase (i); - } - - if (++i == iEnd) break; - } // for - } -*/ - - if (! fMeasureElementsList.size ()) { - fMeasureElementsList.push_back (elem); - } - - else { - // append elem to the measure elements lists, - // but place it before barlines if any, - // to avoid the latter appearing too early in harmony and figured bass measures, - list::reverse_iterator - iBegin = fMeasureElementsList.rbegin (), - iEnd = fMeasureElementsList.rend (), - i = iBegin; - for ( ; ; ) { - S_msrMeasureElement - measureElement = (*i); - - // sanity check - msrAssert ( - measureElement != nullptr, - "measureElement is null"); - - #ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Reverse iteration on measure element:" << - endl; - gIndenter++; - gLogOstream << - measureElement; - gIndenter--; - } - #endif - - if ( - // barline? - S_msrBarline - barline = - dynamic_cast(&(*measureElement)) - ) { - #ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTraceBarlines) { - gLogOstream << - "Element is a barline actually" << - endl; - } - #endif - } - else { - #ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { // JMI ??? - gLogOstream << - "Element is no barline" << - endl; - } - #endif - break; - } - - if (++i == iEnd) break; - } // for - - // get iterator base - list::iterator - reverseIteratorBase = - (i).base (); - - // insert elem in the measure elements list before (*i) -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Inserting measure element " << - elem->asString (); - - if (reverseIteratorBase == fMeasureElementsList.end ()) { - gLogOstream << - " at the end of the measure"; - } - else { - gLogOstream << - " before " << - (*reverseIteratorBase)->asString (); - } - - gLogOstream << - endl; - } -#endif - - insertElementInMeasureBeforeIterator ( - inputLineNumber, - reverseIteratorBase, - elem); -} - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "appendElementAtTheEndOfMeasure() 2"); - } -#endif -} - -void msrMeasure::setNextMeasureNumber (string nextMeasureNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting next measure number to '" << - nextMeasureNumber << - "' in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - fMeasureSegmentUpLink-> asString () << - /* JMI - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - */ - ", line " << fInputLineNumber << - endl; - } -#endif - - fNextMeasureNumber = nextMeasureNumber; -} - -void msrMeasure::setMeasureFirstInVoice () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' as first measure in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - "' in segment " << - fMeasureSegmentUpLink-> asString () << - ", line " << fInputLineNumber << - endl; - } -#endif - - fMeasureFirstInVoice = true; -} - -string msrMeasure::fullMeasureWholeNotesDurationAsMSRString () -{ - return - wholeNotesAsMsrString ( - fInputLineNumber, - fFullMeasureWholeNotesDuration); -} - -void msrMeasure::setCurrentMeasureWholeNotesDuration ( - int inputLineNumber, - rational wholeNotes) -{ - // rationalise the measure whole notes - rational - rationalisedCurrentMeasureWholeNotesDuration = - wholeNotes; - rationalisedCurrentMeasureWholeNotesDuration.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Setting current whole notes of measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' to '" << - rationalisedCurrentMeasureWholeNotesDuration << - "'"; - - if ( - rationalisedCurrentMeasureWholeNotesDuration.getDenominator () - != - wholeNotes.getDenominator () - ) { - gLogOstream << - " (rationalised from '" << wholeNotes << "')"; - } - - gLogOstream << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - -// if (rationalisedCurrentMeasureWholeNotesDuration.getNumerator () == 29) abort (); // JMI - - // set measure whole notes - fCurrentMeasureWholeNotesDuration = - rationalisedCurrentMeasureWholeNotesDuration; -} - -void msrMeasure::incrementCurrentMeasureWholeNotesDuration ( - int inputLineNumber, - rational delta) -{ - // sanity check - msrAssert ( - fCurrentMeasureWholeNotesDuration != K_NO_POSITION_MEASURE_NUMBER, - "currentMeasureWholeNotesDuration == K_NO_POSITION_MEASURE_NUMBER"); - - // compute the new measure whole notes duration - rational - newMeasureWholeNotesDuration = - fCurrentMeasureWholeNotesDuration + delta; - newMeasureWholeNotesDuration.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWholeNotes || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Incrementing current whole notes of measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' from '" << - fCurrentMeasureWholeNotesDuration << - "' by '" << - delta << - "' to '" << - newMeasureWholeNotesDuration << - "'"; - -/* JMI - if ( - newMeasureWholeNotesDuration.getDenominator () - != - wholeNotes.getDenominator () - ) { - gLogOstream << - " (rationalised from '" << wholeNotes << "')"; - } -*/ - - gLogOstream << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - // set new measure whole notes duration - fCurrentMeasureWholeNotesDuration = - newMeasureWholeNotesDuration; -} - -string msrMeasure::currentMeasureWholeNotesDurationAsMSRString () -{ - return - wholeNotesAsMsrString ( - fInputLineNumber, - fCurrentMeasureWholeNotesDuration); -} - -void msrMeasure::setMeasureKind ( - msrMeasureKind measureKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting measure kind of measure '" << - fMeasureElementMeasureNumber << - "' to '" << - measureKindAsString (measureKind) << - "' in segment " << - fMeasureSegmentUpLink->asString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << fInputLineNumber << - endl; - } -#endif - - fMeasureKind = measureKind; -} - -void msrMeasure::appendClefToMeasure (S_msrClef clef) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Appending clef '" << clef->asString () << - "' to measure " << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - ", in voice \"" << - fetchMeasureVoiceUpLink ()->getVoiceName () << - "\"" << - endl; - } -#endif - - // append it to the measure elements list - appendElementToMeasure (clef); -} - -void msrMeasure::appendKeyToMeasure (S_msrKey key) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Appending key '" << key->asString () << - "' to measure " << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - ", in voice \"" << - fetchMeasureVoiceUpLink ()->getVoiceName () << - "\"" << - endl; - } -#endif - - // append it to the measure elements list - appendElementToMeasure (key); -} - -void msrMeasure::appendTimeToMeasure (S_msrTime time) -{ - // sanity check - msrAssert( - time != nullptr, - "time is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time '" << - endl; - - gIndenter++; - - gLogOstream << - time; - - gIndenter--; - - gLogOstream << - "' to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - // append time to the measure elements list - appendElementToMeasure (time); - - // set the measure whole notes per full measure - setFullMeasureWholeNotesDurationFromTime ( - time); - - gIndenter--; -} - -void msrMeasure::appendTimeToMeasureClone (S_msrTime time) -{ - // sanity check - msrAssert( - time != nullptr, - "time is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time:" << - endl; - - gIndenter++; - - gLogOstream << - time; - - gIndenter--; - - S_msrVoice - voiceUpLink = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - - gLogOstream << - "to measure clone '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment clone '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // append time to the measure elements list - appendElementToMeasure (time); -} - -void msrMeasure::setFullMeasureWholeNotesDurationFromTime ( - S_msrTime time) -{ - // sanity check - msrAssert( - time != nullptr, - "time is null"); - -#ifdef TRACE_OAH - if ( // JMI - gTraceOah->fTraceWholeNotes - || - gTraceOah->fTraceTimes - || - gTraceOah->fTraceMeasures - ) { - gLogOstream << - "Setting measure full measure whole notes from time:" << - endl; - - gIndenter++; - - gLogOstream << - time; - - gIndenter--; - - gLogOstream << - "for measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << fInputLineNumber << - endl; - } -#endif - - gIndenter++; - - switch (time->getTimeSymbolKind ()) { - case msrTime::kTimeSymbolCommon: - case msrTime::kTimeSymbolCut: - case msrTime::kTimeSymbolNote: - case msrTime::kTimeSymbolDottedNote: - case msrTime::kTimeSymbolSingleNumber: - case msrTime::kTimeSymbolNone: - { - // this measure is con misura - - rational - wholeNotesPerMeasure = - time-> - wholeNotesPerMeasure (); - -#ifdef TRACE_OAH - if ( - gMusicXMLOah->fTraceDivisions - || - gTraceOah->fTraceTimes - || - gTraceOah->fTraceMeasures) { - gLogOstream << - "There are " << - wholeNotesPerMeasure << - " whole note(s) per measure in time:" << - endl; - - gIndenter++; - - gLogOstream << - time; - - gIndenter--; - - gLogOstream << - "in measure '" << - fMeasureElementMeasureNumber << "'" << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - ", line " << fInputLineNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - // set full measure whole notes - fFullMeasureWholeNotesDuration = - wholeNotesPerMeasure; - -#ifdef TRACE_OAH - if ( - gMusicXMLOah->fTraceDivisions - || - gTraceOah->fTraceTimes - || - gTraceOah->fTraceMeasures) { - gLogOstream << - "Measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - " has " << - fFullMeasureWholeNotesDuration << - " full measure whole notes " << - endl; - } -#endif - } - break; - - case msrTime::kTimeSymbolSenzaMisura: - - // this measure is senza misura - -#ifdef TRACE_OAH - if ( - gMusicXMLOah->fTraceDivisions - || - gTraceOah->fTraceTimes - || - gTraceOah->fTraceMeasures - ) { - gLogOstream << - "Measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - " is senza misura" << - endl; - } -#endif - - setMeasureKind (kMeasureKindCadenza); - - fFullMeasureWholeNotesDuration = - rational (INT_MAX, 1); - break; - } // switch - - gIndenter--; -} - -void msrMeasure::appendTransposeToMeasure ( - S_msrTranspose transpose) -{ - // append it to the measure elements list - appendElementToMeasure (transpose); -} - -void msrMeasure::appendPartNameDisplayToMeasure ( - S_msrPartNameDisplay partNameDisplay) -{ - // append it to the measure elements list - appendElementToMeasure (partNameDisplay); -} - -void msrMeasure::appendPartAbbreviationDisplayToMeasure ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay) -{ - // append it to the measure elements list - appendElementToMeasure (partAbbreviationDisplay); -} - -void msrMeasure::printMeasurePendingMeasureElementsList () -{ - gLogOstream << - endl << - "===> printMeasurePendingMeasureElementsList ()" << - endl; - - gIndenter++; - - if (fMeasurePendingMeasureElementsList.size ()) { - list::const_iterator - iBegin = fMeasurePendingMeasureElementsList.begin (), - iEnd = fMeasurePendingMeasureElementsList.end (), - i = iBegin; - for ( ; ; ) { - gLogOstream << (*i)->asShortString (); - if (++i == iEnd) break; - gLogOstream << endl; - } // for - } - else { - gLogOstream << - "none" << - endl; - } - - gIndenter--; - - gLogOstream << - "<===" << - endl << - endl; -} - -void msrMeasure::appendBarlineToMeasure (S_msrBarline barline) -{ - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - gLogOstream << - "Appending barline " << - barline->asShortString () << - " to measure " << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - voice->getVoiceName () << - "\"" << - endl; - } -#endif - - // register barline's measure number - barline-> - setMeasureElementMeasureNumber ( - fMeasureElementMeasureNumber); - - // set barline's position in measure if relevant - switch (voice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - // register barline position in measure - barline-> - setMeasureElementPositionInMeasure ( - fCurrentMeasureWholeNotesDuration, - "appendBarlineToMeasure()"); - break; - - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: // JMI - // DON'T set barline's position in measure here: - // we need to keep the one set when this same barline - // has been appended to the regular voice (just above), - // so as not to change its relative place in the measure - // (there are holes in the harmony voice until - // they are filled with skips in handleHarmoniesInHarmonyMeasureFinalization() - break; - } // switch - - fMeasureElementsList.push_back (barline); -} - -void msrMeasure::prependBarlineToMeasure (S_msrBarline barline) -{ - // append it to the measure elements list - fMeasureElementsList.push_front (barline); -} - -void msrMeasure::appendSegnoToMeasure (S_msrSegno segno) -{ - // append it to the measure elements list - appendElementToMeasure (segno); -} - -void msrMeasure::appendCodaToMeasure (S_msrCoda coda) -{ - // append it to the measure elements list - appendElementToMeasure (coda); -} - -void msrMeasure::appendEyeGlassesToMeasure ( - S_msrEyeGlasses eyeGlasses) -{ - // append it to the measure elements list - appendElementToMeasure (eyeGlasses); -} - -void msrMeasure::appendPedalToMeasure (S_msrPedal pedal) -{ - // append it to the measure elements list - appendElementToMeasure (pedal); -} - -void msrMeasure::appendDampToMeasure (S_msrDamp damp) -{ - // append it to the measure elements list - appendElementToMeasure (damp); -} - -void msrMeasure::appendDampAllToMeasure (S_msrDampAll dampAll) -{ - // append it to the measure elements list - appendElementToMeasure (dampAll); -} - -void msrMeasure::appendBarCheckToMeasure (S_msrBarCheck barCheck) -{ - // append it to the measure elements list - appendElementToMeasure (barCheck); -} - -void msrMeasure::appendVoiceStaffChangeToMeasure ( - S_msrVoiceStaffChange voiceStaffChange) -{ - // append it to the measure elements list - appendElementToMeasure (voiceStaffChange); -} - -void msrMeasure::appendNoteToMeasure ( - S_msrNote note, - rational partCurrentPositionInMeasure) -{ - int inputLineNumber = - note->getInputLineNumber (); - - rational - positionsDelta = - partCurrentPositionInMeasure - - - fCurrentMeasureWholeNotesDuration; - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceNotes - || - gTraceOah->fTraceMeasures - || - gTraceOah->fTracePositionsInMeasures - ) { - gLogOstream << - "Appending note '" << note->asShortString () << - "' to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", partCurrentPositionInMeasure: " << - partCurrentPositionInMeasure << - ", fCurrentMeasureWholeNotesDuration: " << - fCurrentMeasureWholeNotesDuration << - ", positionsDelta: " << - positionsDelta << - ", line " << inputLineNumber << - endl; - } -#endif - - // should a skip/rest note be appended before note? - if (positionsDelta.getNumerator () > 0) { - // fetch the voice - S_msrVoice - voice = - fetchMeasureVoiceUpLink (); - - // create a skip note of duration delta - S_msrNote - paddingNote = - msrNote::createSkipNote ( - inputLineNumber, - fMeasureElementMeasureNumber, - positionsDelta, - positionsDelta, - 0, // dots number JMI ??? - voice-> - getVoiceStaffUpLink ()->getStaffNumber (), - voice-> - getVoiceNumber ()); - - // append it to the measure - appendNoteOrPaddingToMeasure ( - paddingNote); - } - - else if (positionsDelta.getNumerator () < 0) { - stringstream s; - - s << - "partCurrentPositionInMeasure " << - partCurrentPositionInMeasure << - " is smaller than fCurrentMeasureWholeNotesDuration " << - fCurrentMeasureWholeNotesDuration << - "' in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "', cannot padup in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()->getVoiceName () << - "\"" << - ", fCurrentMeasureWholeNotesDuration " << - fCurrentMeasureWholeNotesDuration << - ", partCurrentPositionInMeasure " << - partCurrentPositionInMeasure << - ", positionsDelta " << positionsDelta << - ", line " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - else { - // this measure is already at the part current position in measure, - // nothing to do - } - - // append note to measure - appendNoteOrPaddingToMeasure (note); -} - -void msrMeasure::appendNoteOrPaddingToMeasure ( - S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceNotes - || - gTraceOah->fTraceMeasures - || - gTraceOah->fTracePositionsInMeasures - ) { - gLogOstream << - "Appending note or padding '" << note->asShortString () << - "' to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // populate measure upLink - note-> - setNoteMeasureUpLink (this); - - // set note's measure number - note-> - setMeasureElementMeasureNumber ( - fMeasureElementMeasureNumber); - - // set the note's position in measure, - // this can lead to set the position in measure of the harmonies - // attached to the note - note-> - setNotePositionInMeasure ( - fCurrentMeasureWholeNotesDuration); - - // append it to the measure elements list -// JMI appendElementToMeasure (note); ??? - fMeasureElementsList.push_back (note); - - // fetch note sounding whole notes - rational - noteSoundingWholeNotes = - note->getNoteSoundingWholeNotes (); - - string - noteSoundingWholeNotesAsMsrString = - note->noteSoundingWholeNotesAsMsrString (); - - // account for note duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - noteSoundingWholeNotes); - - // register note as the last one in this measure - fMeasureLastHandledNote = note; - - // is this note the longest one in this measure? - if (! fMeasureLongestNote) { - fMeasureLongestNote = note; - } - else { - // register note as measure longest sounding and/or display note if relevant - // JMI ??? - if ( - note->getNoteSoundingWholeNotes () - > - fMeasureLongestNote->getNoteSoundingWholeNotes () - ) { - fMeasureLongestNote = note; - } - - if ( - note->getNoteDisplayWholeNotes () - > - fMeasureLongestNote->getNoteDisplayWholeNotes () - ) { - fMeasureLongestNote = note; - } - } - - // this measure contains music - fMeasureContainsMusic = true; - - gIndenter--; -} - -void msrMeasure::accountForTupletMemberNoteDurationInMeasure ( - S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceNotes - || - gTraceOah->fTraceMeasures - || - gTraceOah->fTracePositionsInMeasures - ) { - gLogOstream << - "Accounting for the duration of tuplet member note '" << - note->asShortString () << - "' in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - // set note's position in measure - note-> - setNotePositionInMeasure ( - fCurrentMeasureWholeNotesDuration); - - // fetch note sounding whole notes - rational - noteSoundingWholeNotes = - note->getNoteSoundingWholeNotes (); - - // account for note duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - noteSoundingWholeNotes); -} - -void msrMeasure::appendPaddingNoteAtTheEndOfMeasure (S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Appending padding note '" << note->asShortString () << - "' at the end of measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // populate measure upLink - note-> - setNoteMeasureUpLink (this); - - // append the note to the measure elements list -// JMI // only now to make it possible to remove it afterwards - // if it happens to be the first note of a chord - appendElementAtTheEndOfMeasure (note); - - // fetch note sounding whole notes as string - string noteSoundingWholeNotesAsMsrString = - note->noteSoundingWholeNotesAsMsrString (); - - // register note as the last one in this measure - fMeasureLastHandledNote = note; - - // is this note the longest one in this measure? - if (! fMeasureLongestNote) { - fMeasureLongestNote = note; - } - else { - if ( - note->getNoteSoundingWholeNotes () - > - fMeasureLongestNote->getNoteSoundingWholeNotes () - ) { - fMeasureLongestNote = note; - } - - if ( - note->getNoteDisplayWholeNotes () - > - fMeasureLongestNote->getNoteSoundingWholeNotes () - ) { - fMeasureLongestNote = note; - } - } - - // this measure contains music - fMeasureContainsMusic = true; - - gIndenter--; -} - -void msrMeasure::appendNoteToMeasureClone (S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Appending note '" << note->asShortString () << - "' to measure clone '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment clone '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice clone \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - /* JMI - if (appendMeasureIfOverflow (inputLineNumber)) { - // a new measure has been appended to the segment - // append note to it via the segment - fMeasureSegmentUpLink-> - appendNoteToSegment (note); - } - - else { - */ - // regular insertion in current measure - - // populate measure upLink - note->setNoteMeasureUpLink ( - this); - - // append the note to the measure elements list - // JMI // only now to make it possible to remove it afterwards - // if it happens to be the first note of a chord - appendElementToMeasure (note); - - // fetch note sounding whole notes - rational - noteSoundingWholeNotes = - note->getNoteSoundingWholeNotes (); - - // account for note duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - noteSoundingWholeNotes); - - /* JMI - // determine whether the note occupies a full measure - if (noteSoundingWholeNotes == fFullMeasureWholeNotesDuration) - note-> - setNoteOccupiesAFullMeasure (); - */ - - // register note as the last one in this measure - fMeasureLastHandledNote = note; - - // this measure contains music - fMeasureContainsMusic = true; - // JMI } - - gIndenter--; -} - -void msrMeasure::appendDoubleTremoloToMeasure ( - S_msrDoubleTremolo doubleTremolo) -{ - int inputLineNumber = - doubleTremolo->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Appending double tremolo '" << - doubleTremolo->asShortString () << - "' to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - // register doubleTremolo measure number - doubleTremolo-> - setDoubleTremoloMeasureNumber ( - fMeasureElementMeasureNumber); - - // register doubleTremolo measure position in measure - doubleTremolo-> - setDoubleTremoloPositionInMeasure ( - fCurrentMeasureWholeNotesDuration); - - // copy measure number to first note, that was created beforehand - doubleTremolo-> - setDoubleTremoloMeasureNumber ( - fMeasureElementMeasureNumber); - - // copy measure position to first note, that was created beforehand - doubleTremolo-> - setDoubleTremoloPositionInMeasure ( - fCurrentMeasureWholeNotesDuration); - - // append the doubleTremolo to the measure elements list - appendElementToMeasure (doubleTremolo); - - // fetch doubleTremolo sounding whole notes - rational - doubleTremoloSoundingWholeNotes = - doubleTremolo-> - getDoubleTremoloSoundingWholeNotes (); - - // account for doubleTremolo duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - doubleTremoloSoundingWholeNotes); - - // determine if the doubleTremolo occupies a full measure -// XXL JMI if (doubleTremoloSoundingWholeNotes == fMeasureDivisionsPerWholeMeasure) - // doubleTremolo->setDoubleTremoloOccupiesAFullMeasure (); - - // this measure contains music - fMeasureContainsMusic = true; - - gIndenter--; -} - -void msrMeasure::appendChordToMeasure (S_msrChord chord) // JMI XXL -{ - int inputLineNumber = - chord->getInputLineNumber (); - - // populate measure upLink - chord->setChordMeasureUpLink (this); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending chord '" << chord->asString () << - "' to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - // append the chord to the measure elements list - appendElementToMeasure (chord); - - // fetch chord sounding whole notes - rational - chordSoundingWholeNotes = - chord-> - getChordSoundingWholeNotes (); - - // account for chord duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - chordSoundingWholeNotes); - - // determine if the chord occupies a full measure -// XXL JMI if (chordSoundingWholeNotes == fMeasureDivisionsPerWholeMeasure) - // chord->setChordOccupiesAFullMeasure (); - - // this measure contains music - fMeasureContainsMusic = true; -} - -void msrMeasure::appendTupletToMeasure (S_msrTuplet tuplet) -{ - int inputLineNumber = - tuplet->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Appending tuplet " << tuplet->asString () << - " to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // populate measure upLink - tuplet->setTupletMeasureUpLink (this); - - // append the tuplet to the measure elements list - appendElementToMeasure (tuplet); - - // the duration of the individual members of the tuplet - // have already been accounted for in current measure's whole notes - - // this measure contains music - fMeasureContainsMusic = true; - - gIndenter--; -} - -void msrMeasure::appendHarmonyToMeasure (S_msrHarmony harmony) -{ - int inputLineNumber = - harmony->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending harmony " << harmony->asString () << - " to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\", currentMeasureWholeNotesDuration = " << - fCurrentMeasureWholeNotesDuration << - ", line " << inputLineNumber << - endl; - } -#endif - - // set harmony's measure number - harmony-> - setMeasureElementMeasureNumber ( - fMeasureElementMeasureNumber); - - // append the harmony to the measure elements list - // DON'T call 'appendElementToMeasure (harmony)': - // that would override harmony's position in measure, - // which already has the correct value, thus: - fMeasureElementsList.push_back (harmony); - - // fetch harmony sounding whole notes - rational - harmonySoundingWholeNotes = - harmony-> - getHarmonySoundingWholeNotes (); - - // account for harmony duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - harmonySoundingWholeNotes); - - // this measure contains music - fMeasureContainsMusic = true; -} - -void msrMeasure::appendHarmonyToMeasureClone (S_msrHarmony harmony) -{ - int inputLineNumber = - harmony->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending harmony " << harmony->asString () << - " to measure clone '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment clone '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice clone \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\", currentMeasureWholeNotesDuration = " << - fCurrentMeasureWholeNotesDuration << - ", line " << inputLineNumber << - endl; - } -#endif - - // append the harmony to the measure elements list - appendElementToMeasure (harmony); - - // fetch harmony sounding whole notes - rational - harmonySoundingWholeNotes = - harmony-> - getHarmonySoundingWholeNotes (); - - // account for harmony duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - harmonySoundingWholeNotes); - - // this measure contains music - fMeasureContainsMusic = true; -} - -void msrMeasure::appendFiguredBassToMeasure ( - S_msrFiguredBass figuredBass) -{ - int inputLineNumber = - figuredBass->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << figuredBass->asString () << - " to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\", currentMeasureWholeNotesDuration = " << - fCurrentMeasureWholeNotesDuration << - ", line " << inputLineNumber << - endl; - } -#endif - - // set figuredBass's measure number - figuredBass-> - setMeasureElementMeasureNumber ( - fMeasureElementMeasureNumber); - -/* JMI - // append the harmony to the measure elements list - appendElementToMeasure (figuredBass); -*/ - - // append the figuredBass to the measure elements list - // DON'T call 'appendElementToMeasure (figuredBass)': // JMI - // that would override harmony's position in measure, - // which already has the correct value, thus: - fMeasureElementsList.push_back (figuredBass); - - // fetch harmony sounding whole notes - rational - figuredBassSoundingWholeNotes = - figuredBass-> - getFiguredBassSoundingWholeNotes (); - - // account for figuredBass duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - figuredBassSoundingWholeNotes); - - // this measure contains music - fMeasureContainsMusic = true; -} - -void msrMeasure::appendFiguredBassToMeasureClone ( - S_msrFiguredBass figuredBass) -{ - int inputLineNumber = - figuredBass->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << figuredBass->asString () << - " to measure clone '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment clone '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice clone \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\", currentMeasureWholeNotesDuration = " << - fCurrentMeasureWholeNotesDuration << - ", line " << inputLineNumber << - endl; - } -#endif - - // append the figuredBass to the measure elements list - appendElementToMeasure (figuredBass); - - // fetch figuredBass sounding whole notes - rational - figuredBassSoundingWholeNotes = - figuredBass-> - getFiguredBassSoundingWholeNotes (); - - // account for figuredBass duration in measure whole notes - incrementCurrentMeasureWholeNotesDuration ( - inputLineNumber, - figuredBassSoundingWholeNotes); - - // this measure contains music - fMeasureContainsMusic = true; -} - -S_msrNote msrMeasure::createPaddingNoteForVoice ( - int inputLineNumber, - rational duration, - S_msrVoice voice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures || gTraceOah->fTraceVoices) { - gLogOstream << - "Creating a padding note for voice \"" << - voice->getVoiceName () << - "', duration = '" << - duration << - "\" in measure '" << - asShortString () << - "', line " << inputLineNumber << - endl; - } -#endif - - // create a skip note - S_msrNote - paddingNote = - msrNote::createSkipNote ( - inputLineNumber, - fMeasureElementMeasureNumber, - duration, - duration, - 0, // dots number JMI ??? - voice-> - getVoiceStaffUpLink ()->getStaffNumber (), - voice-> - getVoiceNumber ()); - - return paddingNote; -} - -void msrMeasure::padUpToPositionInMeasureInMeasure ( - int inputLineNumber, - rational wholeNotes) -{ - // fetch the measure voice - S_msrVoice - measureVoice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceMeasures - || - gTraceOah->fTracePositionsInMeasures - || - gMusicXMLOah->fTraceBackup - || - gTraceOah->fTraceWholeNotes - ) { - this->print (gLogOstream); - - gLogOstream << - "Padding from current measure whole notes '" << - fCurrentMeasureWholeNotesDuration << - "' to '" << wholeNotes << - "' in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - " in voice \"" << - measureVoice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - wholeNotes.getNumerator () >= 0, - "wholeNotes.getNumerator () is negative in padUpToPositionInMeasureInMeasure()"); - - if (fCurrentMeasureWholeNotesDuration < wholeNotes) { - gIndenter++; - - // appending a padding rest or skip to this measure to reach wholeNotes - rational - missingDuration = - wholeNotes - fCurrentMeasureWholeNotesDuration; - missingDuration.rationalise (); - - // create a rest or a skip depending on measureVoice kind - S_msrNote - paddingNote = - createPaddingNoteForVoice ( - inputLineNumber, - missingDuration, - measureVoice); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gMusicXMLOah->fTraceDivisions) { - gLogOstream << - "Appending rest" << paddingNote->asString () << - " (missingDuration " << missingDuration << - " whole notes) to skip from length '" << - fCurrentMeasureWholeNotesDuration << - " to length '" << wholeNotes << "'" - " in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "in voice \"" << - measureVoice->getVoiceName () << - endl; - } -#endif - - // append the paddingNote to the measure - appendNoteOrPaddingToMeasure (paddingNote); - -/* JMI - // set this measure as being padded // JMI - this-> - setMeasureCreatedForARepeatKind ( - msrMeasure::kMeasureKindCreatedForARepeatPadded); - */ - - // this measure contains music - fMeasureContainsMusic = true; - - gIndenter--; - } - - else if (fCurrentMeasureWholeNotesDuration == wholeNotes) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "No need to pad from current measure whole notes '" << - fCurrentMeasureWholeNotesDuration << - "' to '" << - wholeNotes << - "' since they are equal in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - " in voice \"" << - measureVoice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - } - - else { - measureVoice->print (gLogOstream); // JMI - this->print (gLogOstream); - - stringstream s; - - s << - "Cannot pad from current measure whole notes '" << - fCurrentMeasureWholeNotesDuration << - "' to '" << - wholeNotes << - "' since the former is larger than the latter in measure '" << - fMeasureElementMeasureNumber << - "', measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - " in voice \"" << - measureVoice->getVoiceName () << - "\", line " << inputLineNumber; - -// msrMusicXMLError ( JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } -} - -void msrMeasure::backupByWholeNotesStepLengthInMeasure ( // JMI USELESS ??? - int inputLineNumber, - rational backupTargetMeasureElementPositionInMeasure) -{ - // sanity check - msrAssert ( - backupTargetMeasureElementPositionInMeasure.getNumerator () >= 0, - "backupTargetMeasureElementPositionInMeasure.getNumerator () is negative"); - - // fetch the measure voice - S_msrVoice - measureVoice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceMeasures - || - gTraceOah->fTracePositionsInMeasures - || - gMusicXMLOah->fTraceBackup - || - gTraceOah->fTraceWholeNotes - ) { - this->print (gLogOstream); - - gLogOstream << - "Backup by a '" << - backupTargetMeasureElementPositionInMeasure << - "' whole notes step length in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - ", currentMeasureWholeNotesDuration: '" << - fCurrentMeasureWholeNotesDuration << - ", fullMeasureWholeNotesDuration: '" << - fFullMeasureWholeNotesDuration << - "' in segment " << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - " in voice \"" << - measureVoice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - // determine the measure position 'backupTargetMeasureElementPositionInMeasure' backward - rational - positionInMeasure = - fFullMeasureWholeNotesDuration - backupTargetMeasureElementPositionInMeasure; - positionInMeasure.rationalise (); - - // pad up to it - padUpToPositionInMeasureInMeasure ( - inputLineNumber, - positionInMeasure); -} - -void msrMeasure::appendPaddingNoteToMeasure ( - int inputLineNumber, - rational forwardStepLength) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Appending padding note" << - ", forwardStepLength: " << - forwardStepLength << - ", to measure " << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // fetch the measure voice - S_msrVoice - measureVoice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - - // create a rest or a skip depending on measureVoice kind - S_msrNote - paddingNote = - createPaddingNoteForVoice ( - inputLineNumber, - forwardStepLength, - measureVoice); - - // append the paddingNote to the measure - appendNoteOrPaddingToMeasure (paddingNote); - - gIndenter--; -} - - -void msrMeasure::appendTempoToMeasure ( - S_msrTempo tempo) -{ - appendElementToMeasure (tempo); -} - -void msrMeasure::appendRehearsalToMeasure ( - S_msrRehearsal rehearsal) -{ - appendElementToMeasure (rehearsal); -} - -void msrMeasure::appendOctaveShiftToMeasure ( - S_msrOctaveShift octaveShift) -{ - appendElementToMeasure (octaveShift); -} - -void msrMeasure::appendScordaturaToMeasure ( - S_msrScordatura scordatura) -{ - appendElementToMeasure (scordatura); -} - -void msrMeasure::appendAccordionRegistrationToMeasure ( - S_msrAccordionRegistration - accordionRegistration) -{ - appendElementToMeasure (accordionRegistration); -} - -void msrMeasure::appendHarpPedalsTuningToMeasure ( - S_msrHarpPedalsTuning - harpPedalsTuning) -{ - appendElementToMeasure (harpPedalsTuning); -} - -void msrMeasure::appendLineBreakToMeasure (S_msrLineBreak lineBreak) -{ - appendElementToMeasure (lineBreak); -} - -void msrMeasure::appendPageBreakToMeasure (S_msrPageBreak pageBreak) -{ - appendElementToMeasure (pageBreak); -} - -void msrMeasure::appendStaffDetailsToMeasure ( - S_msrStaffDetails staffDetails) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Appending staff details '" << staffDetails->asShortString () << - "' to measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"" << - endl; - } -#endif - - appendElementToMeasure (staffDetails); -} - -void msrMeasure::appendBarNumberCheckToMeasure ( - S_msrBarNumberCheck barNumberCheck) -{ - appendElementToMeasure (barNumberCheck); -} - -void msrMeasure::prependOtherElementToMeasure (S_msrMeasureElement elem) -{ - fMeasureElementsList.push_front (elem); // JMI - - // this measure contains music - fMeasureContainsMusic = true; -} - -void msrMeasure::appendOtherElementToMeasure (S_msrMeasureElement elem) -{ - appendElementToMeasure (elem); - - // this measure contains music - fMeasureContainsMusic = true; -} - -void msrMeasure::removeNoteFromMeasure ( - int inputLineNumber, - S_msrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Removing note '" << - note->asShortString () << - "' from measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"," << - "fMeasureLastHandledNote:" << - endl << - fMeasureLastHandledNote->asShortString () << - endl; - } -#endif - - for ( - list::iterator i=fMeasureElementsList.begin (); - i!=fMeasureElementsList.end (); - ++i) { - if ((*i) == note) { - // found note, erase it - fMeasureElementsList.erase (i); - - // update measure whole notes - setCurrentMeasureWholeNotesDuration ( - inputLineNumber, - fCurrentMeasureWholeNotesDuration - - - fMeasureLastHandledNote->getNoteSoundingWholeNotes ()); - - // return from function - return; - } - } // for - - S_msrVoice - segmentVoiceUpLink = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - - S_msrPart - segmentVoicePart = - segmentVoiceUpLink-> - getVoiceStaffUpLink ()-> - getStaffPartUpLink (); - - gLogOstream << - endl << - endl << - "@@@@@@@@@@@@@@@@@ segmentVoicePart" << - endl << - segmentVoicePart << - endl << - "@@@@@@@@@@@@@@@@@" << - endl << - endl; - - gLogOstream << - endl << - endl << - "@@@@@@@@@@@@@@@@@ segmentVoiceUpLink" << - endl << - segmentVoiceUpLink << - endl << - "@@@@@@@@@@@@@@@@@" << - endl << - endl; - - stringstream s; - - s << - "cannot remove note " << - note << - " from measure " << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - segmentVoiceUpLink->getVoiceName () << - "\"," << - " since it has not been found"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); -} - -void msrMeasure::removeElementFromMeasure ( - int inputLineNumber, - S_msrElement element) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Removing element:" << - endl; - - gIndenter++; - gLogOstream << - " JMI ??? element->elementAsString ()" << endl; - gIndenter--; - - gLogOstream << - endl << - " from measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"," << - endl; - - gIndenter++; - gLogOstream << - "fMeasureLastHandledNote:" << - endl << - fMeasureLastHandledNote << - endl; - gIndenter--; - } -#endif - - for ( - list::iterator i=fMeasureElementsList.begin (); - i!=fMeasureElementsList.end (); - ++i) { - if ((*i) == element) { - // found element, erase it - fMeasureElementsList.erase (i); - - // update measure whole notes - setCurrentMeasureWholeNotesDuration ( - inputLineNumber, - fCurrentMeasureWholeNotesDuration - - - fMeasureLastHandledNote->getNoteSoundingWholeNotes ()); - - // return from function - return; - } - } // for - - stringstream s; - - s << - "cannot remove element " << - element << - " from measure " << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"," << - " since it has not been found"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); -} - -void msrMeasure::determineMeasureKindAndPuristNumber ( - int inputLineNumber, - msrMeasure::msrMeasuresRepeatContextKind - measuresRepeatContextKind) -{ - if (fMeasureKindAndPuristNumberHaveBeenDetermined) { - stringstream s; - - s << - "Attempting to determine kind and purist number for measure \"" << - asShortString () << - "\" more than once"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - -/* - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - fInputLineNumber, - // __FILE__, __LINE__, - s.str ()); - - return; - */ - } - - // register measuresRepeatContextKind -// JMI ??? - setMeasuresRepeatContextKind (measuresRepeatContextKind); - - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - - // get voice after repeat component phase kind - msrVoice::msrVoiceRepeatPhaseKind - currentVoiceRepeatPhaseKind = - voice-> - getCurrentVoiceRepeatPhaseKind (); - - // regular measure ends detection - rational - wholeNotesSinceLastRegularMeasureEnd = - voice-> - getWholeNotesSinceLastRegularMeasureEnd (); - - rational - newWholeNotesSinceLastRegularMeasureEnd = - wholeNotesSinceLastRegularMeasureEnd - + - fCurrentMeasureWholeNotesDuration; - newWholeNotesSinceLastRegularMeasureEnd.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Determining the measure kind and purist number of measure '" << - fMeasureElementMeasureNumber << - "', measureDebugNumber: '" << - fMeasureDebugNumber << - "', fullMeasureWholeNotesDuration: " << - fFullMeasureWholeNotesDuration << - "', currentMeasureWholeNotesDuration: " << - fCurrentMeasureWholeNotesDuration << - ", wholeNotesSinceLastRegularMeasureEnd: " << - wholeNotesSinceLastRegularMeasureEnd << - ", newWholeNotesSinceLastRegularMeasureEnd: " << - newWholeNotesSinceLastRegularMeasureEnd << - ", currentVoiceRepeatPhaseKind: " << - msrVoice::voiceRepeatPhaseKindAsString ( - currentVoiceRepeatPhaseKind) << - "' in voice \"" << voice->getVoiceName () << - ", line " << inputLineNumber << - endl; - } - - if (gTraceOah->fTraceMeasuresDetails || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 1"); - } -#endif - - gIndenter++; - - // set measure purist number - setMeasurePuristNumber ( - voice-> - getVoiceCurrentMeasurePuristNumber ()); - - if (fCurrentMeasureWholeNotesDuration.getNumerator () == 0) { - // empty measure - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - voice-> - displayVoiceRepeatsStackRestMeasuresMeasuresRepeatAndVoice ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 2 measure has 0 current measure whole notes"); - - stringstream s; - - s << - "measure '" << - fMeasureElementMeasureNumber << - "' has 0 current measure whole notes" << - ", " << - asString () << - ", line " << inputLineNumber; - - if (false) // JMI - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - else - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - // set it's measure kind - setMeasureKind (kMeasureKindMusicallyEmpty); - - // increment voice's current measure purist number - voice-> - incrementVoiceCurrentMeasurePuristNumber ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 3 kMeasureKindMusicallyEmpty"); - - // reset voice whole notes since last regular measure end // JMI ??? - voice-> - setWholeNotesSinceLastRegularMeasureEnd ( - inputLineNumber, - 0); - } - - else if (fCurrentMeasureWholeNotesDuration == fFullMeasureWholeNotesDuration) { - // this is a regular measure - - // this is a regular measure end - setMeasureEndRegularKind (kMeasureEndRegularKindYes); - - // set it's measure kind - setMeasureKind (kMeasureKindRegular); - - // this is a regular measure end - setMeasureEndRegularKind (kMeasureEndRegularKindYes); - - // increment voice's current measure purist number - voice-> - incrementVoiceCurrentMeasurePuristNumber ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 4 kMeasureEndRegularKindYes"); - - // reset voice whole notes since last regular measure end - voice-> - setWholeNotesSinceLastRegularMeasureEnd ( - inputLineNumber, - 0); - } - - else { - // this measure is incomplete or overfull - - // increment voice whole notes since last regular measure end - voice-> - setWholeNotesSinceLastRegularMeasureEnd ( - inputLineNumber, - newWholeNotesSinceLastRegularMeasureEnd); - - if (fCurrentMeasureWholeNotesDuration < fFullMeasureWholeNotesDuration) { - // this is an incomplete measure - - if (fMeasureFirstInVoice) { - // this is an anacrusis - - // set it's measure kind - setMeasureKind (kMeasureKindAnacrusis); - - // this is a regular measure end - setMeasureEndRegularKind (kMeasureEndRegularKindYes); - - // fix measure purist number - setMeasurePuristNumber (0); - - // voice current measure purist number remains at 1 - } - - else { - // this is an incomplete measure within the voice - - if ( - newWholeNotesSinceLastRegularMeasureEnd == fFullMeasureWholeNotesDuration - ) { - // this is a regular measure end - setMeasureEndRegularKind (kMeasureEndRegularKindYes); - - // increment voice's current measure purist number - voice-> - incrementVoiceCurrentMeasurePuristNumber ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 5 kMeasureEndRegularKindYes"); - - // reset voice whole notes since last regular measure end - voice-> - setWholeNotesSinceLastRegularMeasureEnd ( - inputLineNumber, - 0); - } - else { - // this is no regular measure end - setMeasureEndRegularKind (kMeasureEndRegularKindNo); - } - - // set measure's kind according to measuresRepeatContextKind - switch (measuresRepeatContextKind) { - case msrMeasure::kMeasuresRepeatContextKindUnknown: // JMI ??? - { - stringstream s; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 6 kMeasuresRepeatContextKindUnknown"); - } -#endif - - s << - "measure '" << - fMeasureElementMeasureNumber << - "' is kMeasuresRepeatContextKindUnknown " << - asShortString () << - ", line " << inputLineNumber; - - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - - // set it's measure kind - setMeasureKind (kMeasureKindIncompleteStandalone); // JMI - break; - - case msrMeasure::kMeasuresRepeatContextKindNone: - // update the voice current measure purist number if relevant - switch (fMeasureEndRegularKind) { - case msrMeasure::kMeasureEndRegularKindUnknown: - // JMI ??? - break; - - case msrMeasure::kMeasureEndRegularKindYes: - // set it's measure kind - setMeasureKind (kMeasureKindIncompleteStandalone); - - // don't increment the voice current measure purist number, - // this has already been done for the 'first part' of the measure - break; - - case msrMeasure::kMeasureEndRegularKindNo: - // set it's measure kind - setMeasureKind (kMeasureKindIncompleteStandalone); - break; - } // switch - break; - - case msrMeasure::kMeasuresRepeatContextKindCommonPartLastMeasure: - setMeasureKind ( - kMeasureKindIncompleteLastInRepeatCommonPart); - break; - case msrMeasure::kMeasuresRepeatContextKindHookedEndingLastMeasure: - setMeasureKind ( - kMeasureKindIncompleteLastInRepeatHookedEnding); - break; - case msrMeasure::kMeasuresRepeatContextKindHooklessEndingLastMeasure: - setMeasureKind ( - kMeasureKindIncompleteLastInRepeatHooklessEnding); - break; - - case msrMeasure::kMeasuresRepeatContextKindNextMeasureAfterCommonPart: - setMeasureKind ( - kMeasureKindIncompleteNextMeasureAfterCommonPart); - break; - case msrMeasure::kMeasuresRepeatContextKindNextMeasureAfterHookedEnding: - setMeasureKind ( - kMeasureKindIncompleteNextMeasureAfterHookedEnding); - break; - case msrMeasure::kMeasuresRepeatContextKindNextMeasureAfterHooklessEnding: - setMeasureKind ( - kMeasureKindIncompleteNextMeasureAfterHooklessEnding); - break; - } // switch - } - } - - else { // fCurrentMeasureWholeNotesDuration > fFullMeasureWholeNotesDuration - // this is an overfull measure - - // set it's measure kind - setMeasureKind (kMeasureKindOvercomplete); - - // this is a regular measure end - setMeasureEndRegularKind (kMeasureEndRegularKindYes); - - // increment voice's current measure purist number - voice-> - incrementVoiceCurrentMeasurePuristNumber ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 7 kMeasureKindOvercomplete"); - - // reset voice whole notes since last regular measure end - voice-> - setWholeNotesSinceLastRegularMeasureEnd ( - inputLineNumber, - 0); - } - } - - // forget about voice after repeat component phase kind if relevant - switch (currentVoiceRepeatPhaseKind) { - case msrVoice::kVoiceRepeatPhaseNone: - break; - - case msrVoice::kVoiceRepeatPhaseAfterCommonPart: - case msrVoice::kVoiceRepeatPhaseAfterHookedEnding: - case msrVoice::kVoiceRepeatPhaseAfterHooklessEnding: - // reset incomplete measures after repeats detection - voice-> - setCurrentVoiceRepeatPhaseKind ( - inputLineNumber, - msrVoice::kVoiceRepeatPhaseNone); - break; - } // switch - - fMeasureKindAndPuristNumberHaveBeenDetermined = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayMeasure ( - inputLineNumber, - "determineMeasureKindAndPuristNumber() 8"); - } -#endif - - gIndenter--; -} - -void msrMeasure::padUpToPositionInMeasure ( - int inputLineNumber, - rational positionInMeasureToPadUpTo) -{ - // fetch the voice - S_msrVoice - measureVoice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Padding up to position '" << - positionInMeasureToPadUpTo << - "' in measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - " in voice \"" << - measureVoice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "padUpToPositionInMeasure() 1"); - } -#endif - - gIndenter++; - - if (fCurrentMeasureWholeNotesDuration < positionInMeasureToPadUpTo) { - // appending a rest to this measure to reach positionInMeasureToPadUpTo - rational - missingDuration = - positionInMeasureToPadUpTo - fCurrentMeasureWholeNotesDuration; - missingDuration.rationalise (); - - // create a rest or a skip depending on measureVoice kind - S_msrNote - paddingNote = - createPaddingNoteForVoice ( - inputLineNumber, - missingDuration, - measureVoice); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending '" << paddingNote->asString () << - " (" << missingDuration << " whole notes)'" << - " to finalize \"" << measureVoice->getVoiceName () << - "\" measure: @" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - ", currentMeasureWholeNotesDuration: " << - fCurrentMeasureWholeNotesDuration << - " % --> @" << fMeasureElementMeasureNumber << // JMI - ", measureDebugNumber: '" << - fMeasureDebugNumber << - ", missingDuration = " << missingDuration << - endl; - } -#endif - - // append the paddingNote to the measure - appendNoteOrPaddingToMeasure (paddingNote); - - // this measure contains music - fMeasureContainsMusic = true; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayMeasure ( - inputLineNumber, - "padUpToPositionInMeasure() 2"); - } -#endif - - gIndenter--; -} - -void msrMeasure::padUpToPositionAtTheEndOfTheMeasure ( - int inputLineNumber, - rational positionInMeasureToPadUpTo) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Padding up to position '" << - positionInMeasureToPadUpTo << - "' at the end of measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment " << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () << - "\", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "padUpToPositionAtTheEndOfTheMeasure() 1"); - } -#endif - - gIndenter++; - - if (fCurrentMeasureWholeNotesDuration < positionInMeasureToPadUpTo) { - // appending a rest to this measure to reach positionInMeasureToPadUpTo - rational - duration = - positionInMeasureToPadUpTo - fCurrentMeasureWholeNotesDuration; - duration.rationalise (); - - // fetch the voice - S_msrVoice - measureVoice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Creating a padding note '" << - ", duration: " << duration << - " at the end of voice \"" << measureVoice->getVoiceName () << - "\", measure: '" << - fMeasureElementMeasureNumber << - "', measureDebugNumber: '" << - fMeasureDebugNumber << - ", currentMeasureWholeNotesDuration: " << - fCurrentMeasureWholeNotesDuration << - endl; - } -#endif - - // create a rest or a skip depending on measureVoice kind - S_msrNote - paddingNote = - createPaddingNoteForVoice ( - inputLineNumber, - duration, - measureVoice); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Appending '" << paddingNote->asString () << - " to finalize \"" << measureVoice->getVoiceName () << - "\" measure: '" << - fMeasureElementMeasureNumber << - "', measureDebugNumber: '" << - fMeasureDebugNumber << - ", currentMeasureWholeNotesDuration: " << - fCurrentMeasureWholeNotesDuration << - endl; - } -#endif - - // append the rest to the measure elements list - // only now to make it possible to remove it afterwards - // if it happens to be the first note of a chord JMI - appendPaddingNoteAtTheEndOfMeasure (paddingNote); - - // this measure contains music - fMeasureContainsMusic = true; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "padUpToPositionAtTheEndOfTheMeasure() 2"); - } -#endif - - gIndenter--; -} - -void msrMeasure::finalizeRegularMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context) -{ - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Finalizing regular measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayMeasure ( - inputLineNumber, - "finalizeRegularMeasure() 1"); - } -#endif - - // fetch the voice's time - S_msrTime - voiceCurrentTime = - voice->getVoiceCurrentTime (); - - if (! voiceCurrentTime) { - // take the implicit 4/4 measure whole notes into account - fFullMeasureWholeNotesDuration = rational (1, 1); - } - else { - // set the full length from time - setFullMeasureWholeNotesDurationFromTime ( - voiceCurrentTime); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - if (fCurrentMeasureWholeNotesDuration.getNumerator () == 0) { - stringstream s; - - s << - "Measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - ", doesn't contain any music" << - endl; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - } -#endif - - // fetch the part current position in measure - rational - partCurrentPositionInMeasure = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink ()-> - getVoiceStaffUpLink ()-> - getStaffPartUpLink ()-> - getPartCurrentPositionInMeasure (); - - // pad the measure up to the part current position in measure - padUpToPositionAtTheEndOfTheMeasure ( - inputLineNumber, - partCurrentPositionInMeasure); - - // determine the measure kind and purist number - determineMeasureKindAndPuristNumber ( - inputLineNumber, - measuresRepeatContextKind); - - // pad measure up to whole measure whole notes high tide - switch (fMeasureKind) { - case msrMeasure::kMeasureKindCadenza: - break; - - case msrMeasure::kMeasureKindOvercomplete: - case msrMeasure::kMeasureKindAnacrusis: - case msrMeasure::kMeasureKindRegular: - case msrMeasure::kMeasureKindIncompleteStandalone: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: // JMI - break; - - case msrMeasure::kMeasureKindUnknown: - // JMI ??? - break; - - case msrMeasure::kMeasureKindMusicallyEmpty: - { - /* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - stringstream s; - - s << - "measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\" (" << context << context << ")" << - ", line " << inputLineNumber << - " IS MUSICALLY EMPTY"; - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - // pad up to fFullMeasureWholeNotesDuration - padUpToPositionInMeasure ( - inputLineNumber, - fFullMeasureWholeNotesDuration); - */ - } - break; - } // switch - - // is there a single note or rest occupying the full measure? - if (fMeasureLongestNote) { - if ( - fMeasureLongestNote-> getNoteSoundingWholeNotes () - == - fFullMeasureWholeNotesDuration - ) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Note '" << - fMeasureLongestNote->asShortString () << - "' occupies measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' fully in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - fMeasureLongestNote-> - setNoteOccupiesAFullMeasure (); - } - } - - fMeasureHasBeenFinalized = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayMeasure ( - inputLineNumber, - "finalizeRegularMeasure() 2"); - } -#endif - - gIndenter--; -} - -void msrMeasure::handleFirstHarmonyInHarmonyMeasure ( - int inputLineNumber, - S_msrVoice voice, - list::iterator& - i, - S_msrHarmony previousHarmony, - S_msrHarmony currentHarmony, - rational currentHarmonyPositionInMeasure) -{ - // currentHarmony is the first harmony in the measure - - // the position to pad up to is the minimum - // of those of the currentHarmony and currentHarmonyNoteUpLink, - // to keep comparison points between the regular voice and its harmony voice - rational - positionInMeasureToPadUpTo = -// JMI currentHarmonyNoteUpLinkPositionInMeasure; - currentHarmonyPositionInMeasure; - -/* JMI - if ( - currentHarmonyPositionInMeasure - < - currentHarmonyNoteUpLinkPositionInMeasure - ) { - positionInMeasureToPadUpTo = - currentHarmonyPositionInMeasure; - } -*/ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "handleHarmoniesInHarmonyMeasureFinalization() 5" << - ", previousHarmony is null, positionInMeasureToPadUpTo: " << - positionInMeasureToPadUpTo << - endl; - } -#endif - - // create a padding note - if (positionInMeasureToPadUpTo.getNumerator () != 0) { - // a padding note is necessary - S_msrNote - paddingNote = - createPaddingNoteForVoice ( - inputLineNumber, - positionInMeasureToPadUpTo, - voice); - - // insert paddingNote before currentHarmony in the measure's elements list -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Inserting first padding note " << - paddingNote->asString () << - " before currentHarmony " << - currentHarmony->asString () << - " in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - // insert paddingNote in the measure elements list before (*i) - insertElementInMeasureBeforeIterator ( - inputLineNumber, - i, - paddingNote); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "handleHarmoniesInHarmonyMeasureFinalization() 6"); - } -#endif - } -} - -void msrMeasure::handleSubsequentHarmonyInHarmonyMeasure ( - int inputLineNumber, - S_msrVoice voice, - list::iterator& - i, - S_msrHarmony previousHarmony, - S_msrHarmony currentHarmony, - rational currentHarmonyPositionInMeasure) -{ - // this is a subsequent harmony in the measure - - // get the previousHarmony's position in the measure - rational - previousHarmonyPositionInMeasure = - previousHarmony->getMeasureElementPositionInMeasure (); - - // get the previousHarmony's duration - rational - previousHarmonySoundingWholeNotes = - previousHarmony->getHarmonySoundingWholeNotes (); - - // compute the position in measure following previousHarmony - rational - positionInMeasureFollowingPreviousHarmony = - previousHarmonyPositionInMeasure - + - previousHarmonySoundingWholeNotes; - positionInMeasureFollowingPreviousHarmony.rationalise (); - - // compute the positions in measure delta - rational - positionsInMeasureDelta = - currentHarmonyPositionInMeasure - - - positionInMeasureFollowingPreviousHarmony; - positionsInMeasureDelta.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "handleHarmoniesInHarmonyMeasureFinalization() 7" << - ", previousHarmony: "; - - if (previousHarmony) { - gLogOstream << - previousHarmony->asString (); - } - else { - gLogOstream << "none"; - } - - gLogOstream << - ", currentHarmony: " << - currentHarmony->asString () << - ", previousHarmonyPositionInMeasure: " << - previousHarmonyPositionInMeasure << - ", currentHarmonyPositionInMeasure: " << - currentHarmonyPositionInMeasure << - ", positionInMeasureFollowingPreviousHarmony: " << - positionInMeasureFollowingPreviousHarmony << - ", positionsInMeasureDelta: " << - positionsInMeasureDelta << - endl; - } -#endif - - // is a padding note needed? - if (positionsInMeasureDelta.getNumerator () > 0) { - // create a padding note - S_msrNote - paddingNote = - createPaddingNoteForVoice ( - inputLineNumber, - positionsInMeasureDelta, - voice); - - // set its position in measure - paddingNote-> - setMeasureElementPositionInMeasure ( - fCurrentMeasureWholeNotesDuration, - "handleHarmoniesInHarmonyMeasureFinalization() 8"); - - // insert paddingNote before currentHarmony in the measure's elements list -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Inserting subsequent padding note " << - paddingNote->asString () << - " before currentHarmony " << - currentHarmony->asString () << - " in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - // insert paddingNote in the measure elements list before (*i) - insertElementInMeasureBeforeIterator ( - inputLineNumber, - i, - paddingNote); - } - - else if (positionsInMeasureDelta.getNumerator () < 0) { - // the two harmonies overlap in time - stringstream s; - - s << - "Previous harmony " << - previousHarmony->asString () << - " overlaps current harmony " << - currentHarmony->asString (); - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - // compute previousHarmony's future sounding whole notes - rational - reducedSoundingWholeNotes = - previousHarmonySoundingWholeNotes - + // the delta is negative - positionsInMeasureDelta; - reducedSoundingWholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Reducing the sounding whole notes of harmony FOO " << - previousHarmony->asString () << - " from " << - previousHarmonySoundingWholeNotes << - " to " << - reducedSoundingWholeNotes << - " in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - if (reducedSoundingWholeNotes.getNumerator () == 0) { - stringstream s; - - s << - "Cannot reduce the duration of harmony " << - previousHarmony->asShortString () << - " to 0 : leaving it as it is"; - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, -// JMI __FILE__, __LINE__, - s.str ()); - } - else { - // set previousHarmony's duration to the reduced value - previousHarmony-> - setHarmonySoundingWholeNotes ( - reducedSoundingWholeNotes); - } - } -} - -void msrMeasure::postHandleCurrentHarmonyInHarmonyMeasure ( - int inputLineNumber, - S_msrVoice voice, - S_msrHarmony currentHarmony) -{ - // does currentHarmony overflow the measure? - - // get the currentHarmony's position in the measure - rational - currentHarmonyPositionInMeasure = - currentHarmony->getMeasureElementPositionInMeasure (); - - // get the currentHarmony's sounding whole notes - rational - currentHarmonySoundingWholeNotes = - currentHarmony-> - getHarmonySoundingWholeNotes (); - - // compute the position in measure following currentHarmony - rational - positionInMeasureFollowingCurrentHarmony = - currentHarmonyPositionInMeasure - + - currentHarmonySoundingWholeNotes; - positionInMeasureFollowingCurrentHarmony.rationalise (); - - // get the currentHarmony's note uplink - S_msrNote - currentHarmonyNoteUpLink = - currentHarmony-> - getHarmonyNoteUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "handleHarmoniesInHarmonyMeasureFinalization() 8888 " << - "currentHarmonyNoteUpLink:" << - endl; - gIndenter++; - gLogOstream << - currentHarmonyNoteUpLink << - endl; - gIndenter--; - } -#endif - - // compute the measure overflow whole notes - rational - measureOverflowWholeNotes = - positionInMeasureFollowingCurrentHarmony - - - fFullMeasureWholeNotesDuration; - measureOverflowWholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "handleHarmoniesInHarmonyMeasureFinalization() 9" << - ", currentHarmony: "; - - if (currentHarmony) { - gLogOstream << - currentHarmony->asString (); - } - else { - gLogOstream << "none"; - } - - gLogOstream << - ", currentHarmonyPositionInMeasure: " << - currentHarmonyPositionInMeasure << - ", currentHarmonySoundingWholeNotes: " << - currentHarmonySoundingWholeNotes << - ", positionInMeasureFollowingCurrentHarmony: " << - positionInMeasureFollowingCurrentHarmony << - /* JMI - ", positionInMeasureFollowingCurrentHarmonyNoteUpLink: " << - positionInMeasureFollowingCurrentHarmonyNoteUpLink << - ", currentHarmonyNoteUpLinkSoundingWholeNotes: " << - currentHarmonyNoteUpLinkSoundingWholeNotes << - ", positionInMeasureFollowingCurrentHarmonyNoteUpLink: " << - positionInMeasureFollowingCurrentHarmonyNoteUpLink << - */ - ", currentHarmonySoundingWholeNotes: " << - currentHarmonySoundingWholeNotes << - ", measureOverflowWholeNotes: " << - measureOverflowWholeNotes << - endl; - } -#endif - - if (measureOverflowWholeNotes.getNumerator () > 0) { - // the currentHarmony's duration is too large - stringstream s; - - s << - "The current harmony " << - currentHarmony->asString () << - " overflows the current measure " << - asString (); - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - // compute currentHarmony's future sounding whole notes - rational - reducedSoundingWholeNotes = - currentHarmonySoundingWholeNotes - - // the delta is positive - measureOverflowWholeNotes; - reducedSoundingWholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Reducing the sounding whole notes of harmony FII " << - currentHarmony->asString () << - " from " << - currentHarmonySoundingWholeNotes << - " to " << - reducedSoundingWholeNotes << - " in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - if (reducedSoundingWholeNotes.getNumerator () == 0) { - stringstream s; - - s << - "Cannot reduce the duration of harmony " << - currentHarmony->asShortString () << - " to 0 : leaving it as it is"; - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, -// JMI __FILE__, __LINE__, - s.str ()); - } - else { - // set currentHarmony's duration to the reduced value - currentHarmony-> - setHarmonySoundingWholeNotes ( - reducedSoundingWholeNotes); - } - } -} - -void msrMeasure::handleHarmoniesInHarmonyMeasureFinalization ( - int inputLineNumber, - string context) -{ - // running this method for each and every measure in turn - // in harmony voices is actually a partial sixth pass - - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceHarmonies - || - gTraceOah->fTracePositionsInMeasures - || - gTraceOah->fTraceForTests - ) { - gLogOstream << - "Finalizing harmonies in harmony measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fMeasureElementsList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "handleHarmoniesInHarmonyMeasureFinalization() 1"); - } -#endif - - // in MusicXML, harmonies don't have their own duration - // and may have a non-null offset: - // we thus have to sort them in the measure by increasing position, - // taking their offset into account - fMeasureElementsList.sort ( - msrMeasureElement::compareMeasureElementsByIncreasingPositionInMeasure); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "handleHarmoniesInHarmonyMeasureFinalization() 2"); - } -#endif - - // consider each measure element (a harmony in fact) in turn, - // updating their duration and adding skips if needed - list::iterator - iBegin = fMeasureElementsList.begin (), - iEnd = fMeasureElementsList.end (), - i = iBegin; - - S_msrHarmony - previousHarmony = nullptr, - currentHarmony = nullptr; - - while (true) { - S_msrMeasureElement - measureElement = (*i); - - int inputLineNumber = - measureElement->getInputLineNumber (); - - if ( - // harmony? - // don't assign currentHarmony here yet, - // this would set it to nullptr if there's anything else - // after the last harmony in the voice - S_msrHarmony - harmony = - dynamic_cast(&(*measureElement)) - ) { - currentHarmony = harmony; - - // handle the currentHarmony -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "handleHarmoniesInHarmonyMeasureFinalization() 3" << - ", currentHarmony: "; - gIndenter++; - gLogOstream << - currentHarmony->asString () << - endl; - gIndenter--; - } -#endif - - // its position in the measure should take it's offset into account - rational - currentHarmonyPositionInMeasure = - currentHarmony-> - getMeasureElementPositionInMeasure (); - - // get the currentHarmony's note uplink - S_msrNote - currentHarmonyNoteUpLink = - currentHarmony-> - getHarmonyNoteUpLink (); - - // get the currentHarmony's note uplink position in the measure - rational - currentHarmonyNoteUpLinkPositionInMeasure = - currentHarmonyNoteUpLink-> - getMeasureElementPositionInMeasure (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "handleHarmoniesInHarmonyMeasureFinalization() 4" << - ", previousHarmony: "; - - if (previousHarmony) { - gLogOstream << - previousHarmony->asString (); - } - else { - gLogOstream << "none"; - } - - gLogOstream << - ", currentHarmonyPositionInMeasure: " << - currentHarmonyPositionInMeasure << - ", currentHarmonyNoteUpLinkPositionInMeasure: " << - currentHarmonyNoteUpLinkPositionInMeasure << - endl; - } -#endif - - if (! previousHarmony) { - handleFirstHarmonyInHarmonyMeasure ( - inputLineNumber, - voice, - i, - previousHarmony, - currentHarmony, - currentHarmonyPositionInMeasure); - } - - else { - handleSubsequentHarmonyInHarmonyMeasure ( - inputLineNumber, - voice, - i, - previousHarmony, - currentHarmony, - currentHarmonyPositionInMeasure); - } - - previousHarmony = currentHarmony; - } - - if (++i == iEnd) break; - } // while - - if (currentHarmony) { - postHandleCurrentHarmonyInHarmonyMeasure ( - inputLineNumber, - voice, - currentHarmony); - } -/* JMI - else { - gLogOstream << - "*** currentHarmony is null ***" << // JMI - endl; - } - */ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - displayMeasure ( - inputLineNumber, - "handleHarmoniesInHarmonyMeasureFinalization() 10"); - } -#endif - } -} - -void msrMeasure::finalizeHarmonyMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context) -{ - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Finalizing harmony measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - displayMeasure ( - inputLineNumber, - "finalizeHarmonyMeasure() 1"); - } -#endif - - // fetch the voice's time - S_msrTime - voiceCurrentTime = - voice->getVoiceCurrentTime (); - - if (! voiceCurrentTime) { - // take the implicit 4/4 measure whole notes into account - fFullMeasureWholeNotesDuration = rational (1, 1); - } - else { - // set the full length from time - setFullMeasureWholeNotesDurationFromTime ( - voiceCurrentTime); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTraceMeasures) { // JMI ??? - if (fCurrentMeasureWholeNotesDuration.getNumerator () == 0) { - stringstream s; - - s << - "Measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - ", doesn't contain any music" << - endl; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - } -#endif - - // handle the harmonies in this measure - handleHarmoniesInHarmonyMeasureFinalization ( - inputLineNumber, - context); - - // pad the measure up to fFullMeasureWholeNotesDuration - padUpToPositionAtTheEndOfTheMeasure ( - inputLineNumber, - fFullMeasureWholeNotesDuration); - - // determine the measure kind and purist number - determineMeasureKindAndPuristNumber ( - inputLineNumber, - measuresRepeatContextKind); - - // pad measure up to part measure whole notes high tide - switch (fMeasureKind) { - case msrMeasure::kMeasureKindCadenza: - break; - - case msrMeasure::kMeasureKindOvercomplete: - case msrMeasure::kMeasureKindAnacrusis: - case msrMeasure::kMeasureKindRegular: - case msrMeasure::kMeasureKindIncompleteStandalone: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: // JMI - break; - - case msrMeasure::kMeasureKindUnknown: - // JMI ??? - break; - - case msrMeasure::kMeasureKindMusicallyEmpty: - { -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTraceMeasures) { - stringstream s; - - s << - "measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\" (" << context << context << ")" << - ", line " << inputLineNumber << - " IS MUSICALLY EMPTY"; - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - // pad up to fFullMeasureWholeNotesDuration - padUpToPositionInMeasure ( - inputLineNumber, - fFullMeasureWholeNotesDuration); - */ - } - break; - } // switch - - // is there a single note or rest occupying the full measure? - if (fMeasureLongestNote) { - if ( - fMeasureLongestNote-> getNoteSoundingWholeNotes () - == - fFullMeasureWholeNotesDuration - ) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Note '" << - fMeasureLongestNote->asShortString () << - "' occupies measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' fully in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - fMeasureLongestNote-> - setNoteOccupiesAFullMeasure (); - } - } - - fMeasureHasBeenFinalized = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - displayMeasure ( - inputLineNumber, - "finalizeHarmonyMeasure() 2"); - } -#endif - - gIndenter--; -} - -void msrMeasure::finalizeFiguredBassMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context) -{ - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Finalizing figured bass measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - displayMeasure ( - inputLineNumber, - "finalizeFiguredBassMeasure() 1"); - } -#endif - - // fetch the voice's time - S_msrTime - voiceCurrentTime = - voice->getVoiceCurrentTime (); - - if (! voiceCurrentTime) { - // take the implicit 4/4 measure whole notes into account - fFullMeasureWholeNotesDuration = rational (1, 1); - } - else { - // set the full length from time - setFullMeasureWholeNotesDurationFromTime ( - voiceCurrentTime); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses || gTraceOah->fTraceMeasures) { // JMI ??? - if (fCurrentMeasureWholeNotesDuration.getNumerator () == 0) { - stringstream s; - - s << - "Measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - ", doesn't contain any music" << - endl; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - } -#endif - - // handle the harmonies in this measure - handleHarmoniesInHarmonyMeasureFinalization ( - inputLineNumber, - context); - - // pad the measure up to fFullMeasureWholeNotesDuration - padUpToPositionAtTheEndOfTheMeasure ( - inputLineNumber, - fFullMeasureWholeNotesDuration); - - // determine the measure kind and purist number - determineMeasureKindAndPuristNumber ( - inputLineNumber, - measuresRepeatContextKind); - - // pad measure up to part measure whole notes high tide - switch (fMeasureKind) { - case msrMeasure::kMeasureKindCadenza: - break; - - case msrMeasure::kMeasureKindOvercomplete: - case msrMeasure::kMeasureKindAnacrusis: - case msrMeasure::kMeasureKindRegular: - case msrMeasure::kMeasureKindIncompleteStandalone: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: // JMI - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: // JMI - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: // JMI - break; - - case msrMeasure::kMeasureKindUnknown: - // JMI ??? - break; - - case msrMeasure::kMeasureKindMusicallyEmpty: - { - /* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses || gTraceOah->fTraceMeasures) { - stringstream s; - - s << - "measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\" (" << context << context << ")" << - ", line " << inputLineNumber << - " IS MUSICALLY EMPTY"; - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - // pad up to fFullMeasureWholeNotesDuration - padUpToPositionInMeasure ( - inputLineNumber, - fFullMeasureWholeNotesDuration); - */ - } - break; - } // switch - - // is there a single note or rest occupying the full measure? - if (fMeasureLongestNote) { - if ( - fMeasureLongestNote-> getNoteSoundingWholeNotes () - == - fFullMeasureWholeNotesDuration - ) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Note '" << - fMeasureLongestNote->asShortString () << - "' occupies measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' fully in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - fMeasureLongestNote-> - setNoteOccupiesAFullMeasure (); - } - } - - fMeasureHasBeenFinalized = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - displayMeasure ( - inputLineNumber, - "finalizeFiguredBassMeasure() 2"); - } -#endif - - gIndenter--; -} - -void msrMeasure::finalizeMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context) -{ - if (fMeasureHasBeenFinalized) { - stringstream s; - - s << - "Attempting to finalize measure " << - asShortString () << - " more than once"; - - msrInternalWarning ( - gOahOah->fInputSourceName, - fInputLineNumber, - s.str ()); - } - - else { - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Finalizing measure '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << - fMeasureSegmentUpLink->getSegmentVoiceUpLink ()->getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - switch (voice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - finalizeRegularMeasure ( - inputLineNumber, - measuresRepeatContextKind, - context); - break; - case msrVoice::kVoiceHarmony: - finalizeHarmonyMeasure ( - inputLineNumber, - measuresRepeatContextKind, - context); - break; - case msrVoice::kVoiceFiguredBass: - finalizeFiguredBassMeasure ( // JMI to be seen - inputLineNumber, - measuresRepeatContextKind, - context); - break; - } // switch - } -} - -void msrMeasure::finalizeMeasureClone ( - int inputLineNumber, - S_msrMeasure originalMeasure, - S_msrVoice voiceClone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Finalizing measure clone '" << - fMeasureElementMeasureNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "' in segment '" << - fMeasureSegmentUpLink->getSegmentAbsoluteNumber () << - "' in voice \"" << -// JMI fMeasureSegmentUpLink->getSegmentVoiceUpLink ()->getVoiceName () << - voiceClone->getVoiceName () << -// JMI "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - displayMeasure ( - inputLineNumber, - "finalizeMeasureClone() 1"); - } -#endif - - if (fMeasureHasBeenFinalized) { - stringstream s; - - s << - "Attempting to finalize measure clone \"" << - asShortString () << - "\" more than once"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - gIndenter++; - - // fetch the voiceClone's time - S_msrTime - voiceCurrentTime = - voiceClone->getVoiceCurrentTime (); - - if (! voiceCurrentTime) { - // take the implicit 4/4 measure whole notes into account - fFullMeasureWholeNotesDuration = rational (1, 1); - } - else { - // set the full length from time - setFullMeasureWholeNotesDurationFromTime ( - voiceCurrentTime); - } - - // determine the measure kind and purist number - determineMeasureKindAndPuristNumber ( - inputLineNumber, - originalMeasure->getMeasuresRepeatContextKind ()); - - // consistency check - msrMeasure::msrMeasureKind - originalMeasureMeasureKind = - originalMeasure->getMeasureKind (); - - if (fMeasureKind != originalMeasureMeasureKind) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - this-> - displayMeasure ( - inputLineNumber, - "finalizeMeasureClone() 2 - cloneMeasure"); - - originalMeasure-> - displayMeasure ( - inputLineNumber, - "finalizeMeasureClone() 3 - originalMeasure"); - } -#endif - - stringstream s; - - s << - "*********>> measure clone '" << - fMeasureElementMeasureNumber << - "': measure kind '"<< - msrMeasure::measureKindAsString ( - fMeasureKind) << - "' differs from original measure measure kind '" << - msrMeasure::measureKindAsString ( - originalMeasureMeasureKind) << - "' in voice \"" << - voiceClone->getVoiceName () << - "', line " << inputLineNumber; - - // msrInternalError ( // JMI - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - - if (fFullMeasureWholeNotesDuration.getNumerator () == 0) { // JMI - stringstream s; - - s << - "*********>> measure clone '" << - fMeasureElementMeasureNumber << - "' full measure whole notes is 0" << - ", line " << inputLineNumber; - - // msrInternalError ( // JMI - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - } - - fMeasureHasBeenFinalized = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - displayMeasure ( - inputLineNumber, - "finalizeMeasureClone() 4"); - } -#endif - - gIndenter--; -} - -void msrMeasure::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasure::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasure elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasure::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrMeasure::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasure::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasure elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasure::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrMeasure::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasure::browseData ()" << - endl; - } - - for ( - list::const_iterator i = fMeasureElementsList.begin (); - i != fMeasureElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% <== msrMeasure::browseData ()" << - endl; - } -} - -string msrMeasure::measureKindAsString ( - msrMeasureKind measureKind) -{ - string result; - - switch (measureKind) { - case msrMeasure::kMeasureKindUnknown: - result = "***measureKindUnknown***"; - break; - case msrMeasure::kMeasureKindRegular: - result = "measureKindRegular"; - break; - case msrMeasure::kMeasureKindAnacrusis: - result = "measureKindAnacrusis"; - break; - case msrMeasure::kMeasureKindIncompleteStandalone: - result = "measureKindIncompleteStandalone"; - break; - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: - result = "measureKindIncompleteLastInRepeatCommonPart"; - break; - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: - result = "measureKindIncompleteLastInRepeatHookedEnding"; - break; - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: - result = "measureKindIncompleteLastInRepeatHooklessEnding"; - break; - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: - result = "measureKindIncompleteNextMeasureAfterCommonPart"; - break; - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: - result = "measureKindIncompleteNextMeasureAfterHookedEnding"; - break; - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: - result = "measureKindIncompleteNextMeasureAfterHooklessEnding"; - break; - case msrMeasure::kMeasureKindOvercomplete: - result = "measureKindOvercomplete"; - break; - case msrMeasure::kMeasureKindCadenza: - result = "measureKindCadenza"; - break; - case msrMeasure::kMeasureKindMusicallyEmpty: - result = "measureKindMusicallyEmpty"; - break; - } // switch - - return result; -} - -string msrMeasure::measureImplicitKindAsString ( - msrMeasureImplicitKind measureImplicitKind) -{ - string result; - - switch (measureImplicitKind) { - case msrMeasure::kMeasureImplicitKindYes: - result = "measureImplicitKindYes"; - break; - case msrMeasure::kMeasureImplicitKindNo: - result = "measureImplicitKindNo"; - break; - } // switch - - return result; -} - -string msrMeasure::measureFirstInSegmentKindAsString ( - msrMeasureFirstInSegmentKind measureFirstInSegmentKind) -{ - string result; - - switch (measureFirstInSegmentKind) { - case msrMeasure::kMeasureFirstInSegmentKindUnknown: - result = "***measureFirstInSegmentKindUnknown***"; - break; - case msrMeasure::kMeasureFirstInSegmentKindYes: - result = "measureFirstInSegmentKindYes"; - break; - case msrMeasure::kMeasureFirstInSegmentKindNo: - result = "measureFirstInSegmentKindNo"; - break; - } // switch - - return result; -} - -string msrMeasure::measuresRepeatContextKindAsString ( - msrMeasuresRepeatContextKind measuresRepeatContextKind) -{ - string result; - - switch (measuresRepeatContextKind) { - case msrMeasure::kMeasuresRepeatContextKindUnknown: - result = "***measureRepeatContextUnknown***"; - break; - case msrMeasure::kMeasuresRepeatContextKindNone: - result = "measureRepeatContextNone"; - break; - case msrMeasure::kMeasuresRepeatContextKindCommonPartLastMeasure: - result = "measureRepeatContextCommonPartLastMeasure"; - break; - case msrMeasure::kMeasuresRepeatContextKindHookedEndingLastMeasure: - result = "measureRepeatContextHookedEndingLastMeasure"; - break; - case msrMeasure::kMeasuresRepeatContextKindHooklessEndingLastMeasure: - result = "measureRepeatContextHooklessEndingLastMeasure"; - break; - case msrMeasure::kMeasuresRepeatContextKindNextMeasureAfterCommonPart: - result = "measureRepeatContextNextMeasureAfterCommonPart"; - break; - case msrMeasure::kMeasuresRepeatContextKindNextMeasureAfterHookedEnding: - result = "measureRepeatContextNextMeasureAfterHookedEnding"; - break; - case msrMeasure::kMeasuresRepeatContextKindNextMeasureAfterHooklessEnding: - result = "measureRepeatContextNextMeasureAfterHooklessEnding"; - break; - } // switch - - return result; -} - -string msrMeasure::measureEndRegularKindAsString ( - msrMeasureEndRegularKind measureEndRegularKind) -{ - string result; - - switch (measureEndRegularKind) { - case msrMeasure::kMeasureEndRegularKindUnknown: - result = "***measureEndRegularUnknown***"; - break; - case msrMeasure::kMeasureEndRegularKindYes: - result = "measureEndRegularYes"; - break; - case msrMeasure::kMeasureEndRegularKindNo: - result = "measureEndRegularNo"; - break; - } // switch - - return result; -} - -string msrMeasure::measureKindAsString () const -{ - return - measureKindAsString (fMeasureKind); -} - -string msrMeasure::asShortString () const -{ - stringstream s; - - s << - "[" - "Measure '" << - fMeasureElementMeasureNumber << - ", measurePuristNumber: " << - fMeasurePuristNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "', " << measureKindAsString () << -/* JMI - ", currentMeasureWholeNotesDuration: " << fCurrentMeasureWholeNotesDuration << - ", fullMeasureWholeNotesDuration: " << fFullMeasureWholeNotesDuration << - */ - ", " << - singularOrPlural ( - fMeasureElementsList.size (), "element", "elements") << - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -string msrMeasure::asString () const -{ - stringstream s; - - s << - "[" - "Measure '" << - fMeasureElementMeasureNumber << - ", measurePuristNumber: " << - fMeasurePuristNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - "', " << measureKindAsString () << - ", currentMeasureWholeNotesDuration: " << fCurrentMeasureWholeNotesDuration << - ", fullMeasureWholeNotesDuration: " << fFullMeasureWholeNotesDuration << - ", " << - singularOrPlural ( - fMeasureElementsList.size (), "element", "elements") << - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -void msrMeasure::displayMeasure ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - "*********>> Measure '" << - fMeasureElementMeasureNumber << - /* JMI - "', measurePuristNumber: " << - fMeasurePuristNumber << - ", measureDebugNumber: '" << - fMeasureDebugNumber << - */ - " (" << context << ")" << - ", line " << inputLineNumber << - " contains:" << - endl; - - gIndenter++; - print (gLogOstream); - gIndenter--; - - gLogOstream << - "<<*********" << - endl << - endl; -} - -void msrMeasure::print (ostream& os) const -{ - os << - "Measure '" << - fMeasureElementMeasureNumber << - "', " << measureKindAsString () << - ", " << - singularOrPlural ( - fMeasureElementsList.size (), "element", "elements") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 45; - - os << left << - setw (fieldWidth) << - "currentMeasureWholeNotesDuration" << " : " << - fCurrentMeasureWholeNotesDuration << - endl << - setw (fieldWidth) << - "fullMeasureWholeNotesDuration" << " : " << - fFullMeasureWholeNotesDuration << - endl << - - setw (fieldWidth) << - "measurePuristNumber" << " : " << - fMeasurePuristNumber << - endl << - setw (fieldWidth) << - "measureDebugNumber" << " : " << - fMeasureDebugNumber << - endl << - - setw (fieldWidth) << - "measureEndRegularKind" << " : " << - measureEndRegularKindAsString ( - fMeasureEndRegularKind) << - endl << - setw (fieldWidth) << - "measuresRepeatContextKind" << " : " << - measuresRepeatContextKindAsString ( - fMeasuresRepeatContextKind) << - endl << - - setw (fieldWidth) << - "measureFirstInVoice" << " : " << - booleanAsString ( - fMeasureFirstInVoice) << - endl << - setw (fieldWidth) << - "measureFirstInSegmentKind" << " : " << - msrMeasure::measureFirstInSegmentKindAsString ( - fMeasureFirstInSegmentKind) << - endl << - - setw (fieldWidth) << - "segmentUpLink" << " : " << - fMeasureSegmentUpLink->asShortString () << - endl; - - -#ifdef TRACE_OAH - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - - // fetch voice's clef, key and time - S_msrClef - voiceCurrentClef = - voice->getVoiceCurrentClef (); - S_msrKey - voiceCurrentKey = - voice->getVoiceCurrentKey (); - S_msrTime - voiceCurrentTime = - voice->getVoiceCurrentTime (); - - // print the voice current clef, key and time - os << left << - setw (fieldWidth) << "voiceCurrentClef" << " : "; - if (voiceCurrentClef) { - os << - voiceCurrentClef; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << "voiceCurrentKey" << " : "; - if (voiceCurrentKey) { - os << - voiceCurrentKey; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << "voiceCurrentTime" << " : "; - if (voiceCurrentTime) { - os << - voiceCurrentTime; - } - else { - os << "null" << endl; - } -#endif - - /* JMI - - setw (fieldWidth) << - "currentMeasureWholeNotesDurationAsMSRString" << " : " << - currentMeasureWholeNotesDurationAsMSRString () << - endl << - setw (fieldWidth) << - "fullMeasureWholeNotesDurationAsMSRString" << " : " << - fullMeasureWholeNotesDurationAsMSRString () << - endl << - */ - - os << left << - setw (fieldWidth) << - "measureLongestNote" << " : "; - if (fMeasureLongestNote) { - os << - fMeasureLongestNote->asShortString (); - } - else { - os << - "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "measureContainsMusic" << " : " << - booleanAsString ( - fMeasureContainsMusic) << - endl << - - setw (fieldWidth) << - "measureHasBeenFinalized" << " : " << - booleanAsString ( - fMeasureHasBeenFinalized) << - endl << - setw (fieldWidth) << - "measureKindAndPuristNumberHaveBeenDetermined" << " : " << - booleanAsString ( - fMeasureKindAndPuristNumberHaveBeenDetermined) << - endl << - - setw (fieldWidth) << - "measureIsAFullMeasureRest" << " : " << - booleanAsString (fMeasureIsAFullMeasureRest) << - endl; - - os << - setw (fieldWidth) << - "nextMeasureNumber" << " : \"" << - fNextMeasureNumber << - "\"" << - endl; - - int - measureElementsListSize = - fMeasureElementsList.size (); - - os << - setw (fieldWidth) << - "measureElementsList" << " : " << - singularOrPlural ( - measureElementsListSize, "element", "elements") << - endl; - - if (measureElementsListSize) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fMeasureElementsList.begin (), - iEnd = fMeasureElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrMeasure::shortPrint (ostream& os) const -{ - os << - "Measure '" << - fMeasureElementMeasureNumber << - "', " << measureKindAsString () << - ", " << - singularOrPlural ( - fMeasureElementsList.size (), "element", "elements") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 28; - - os << left << - setw (fieldWidth) << - "measurePuristNumber" << " : " << - fMeasurePuristNumber << - endl << - setw (fieldWidth) << - "measureDebugNumber" << " : " << - fMeasureDebugNumber << - endl << - - setw (fieldWidth) << - "measureEndRegularKind" << " : " << - measureEndRegularKindAsString ( - fMeasureEndRegularKind) << - endl << - setw (fieldWidth) << - "measuresRepeatContextKind" << " : " << - measuresRepeatContextKindAsString ( - fMeasuresRepeatContextKind) << - endl << - - setw (fieldWidth) << - "measureFirstInVoice" << " : " << - booleanAsString ( - fMeasureFirstInVoice) << - endl << - - setw (fieldWidth) << - "measureFirstInSegmentKind" << " : " << - msrMeasure::measureFirstInSegmentKindAsString ( - fMeasureFirstInSegmentKind) << - endl << - - setw (fieldWidth) << - "measureImplicitKind" << " : " << - booleanAsString ( - fMeasureImplicitKind) << - endl << - - setw (fieldWidth) << - "measureContainsMusic" << " : " << - booleanAsString ( - fMeasureContainsMusic) << - endl << - - setw (fieldWidth) << - "measureIsAFullMeasureRest" << " : " << - booleanAsString (fMeasureIsAFullMeasureRest) << - endl << - - setw (fieldWidth) << - "currentMeasureWholeNotesDuration" << " : " << - fCurrentMeasureWholeNotesDuration << - endl << - - setw (fieldWidth) << - "fullMeasureWholeNotesDuration" << " : " << - fFullMeasureWholeNotesDuration << - endl; - -#ifdef TRACE_OAH - // fetch the voice - S_msrVoice - voice = - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink (); - - // fetch voice's clef, key and time - S_msrClef - voiceCurrentClef = - voice->getVoiceCurrentClef (); - S_msrKey - voiceCurrentKey = - voice->getVoiceCurrentKey (); - S_msrTime - voiceCurrentTime = - voice->getVoiceCurrentTime (); - - // print the voice current clef, key and time - os << left << - setw (fieldWidth) << "voiceCurrentClef" << " : "; - if (voiceCurrentClef) { - os << - voiceCurrentClef; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << "voiceCurrentKey" << " : "; - if (voiceCurrentKey) { - os << - voiceCurrentKey; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << "voiceCurrentTime" << " : "; - if (voiceCurrentTime) { - os << - voiceCurrentTime; - } - else { - os << "null" << endl; - } -#endif - - os << - setw (fieldWidth) << - "measureContainsMusic" << " : " << - booleanAsString ( - fMeasureContainsMusic) << - endl << - - setw (fieldWidth) << - "measureHasBeenFinalized" << " : " << - booleanAsString ( - fMeasureHasBeenFinalized) << - endl << - setw (fieldWidth) << - "measureKindAndPuristNumberHaveBeenDetermined" << " : " << - booleanAsString ( - fMeasureKindAndPuristNumberHaveBeenDetermined) << - endl << - - setw (fieldWidth) << - "nextMeasureNumber" << " : \"" << - fNextMeasureNumber << - "\"" << - endl; - - int - measureElementsListSize = - fMeasureElementsList.size (); - - os << - setw (fieldWidth) << - "measureElementsList" << " : " << - singularOrPlural ( - measureElementsListSize, "element", "elements") << - endl; - - if (measureElementsListSize) { - gIndenter++; - - list::const_iterator - iBegin = fMeasureElementsList.begin (), - iEnd = fMeasureElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i)->asShortString (); - if (++i == iEnd) break; - os << endl; - } // for - os << endl; - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrMeasure& elt) -{ - elt->print (os); - return os; -} - - -} - -/* JMI - // get the currentHarmonyNoteUpLink's sounding whole notes - rational - currentHarmonyNoteUpLinkSoundingWholeNotes = - currentHarmonyNoteUpLink-> - getNoteSoundingWholeNotes (); - - // get the currentHarmony's note uplink position in the measure - rational - currentHarmonyNoteUpLinkPositionInMeasure = - currentHarmonyNoteUpLink-> - getMeasureElementPositionInMeasure (); - - // compute the position in measure following currentHarmonyNoteUpLink - rational - positionInMeasureFollowingCurrentHarmonyNoteUpLink = - currentHarmonyNoteUpLinkPositionInMeasure - + - currentHarmonyNoteUpLinkSoundingWholeNotes; - positionInMeasureFollowingCurrentHarmonyNoteUpLink.rationalise (); -*/ - -/* JMI - // get the currentHarmonyNoteUpLink's measure - S_msrMeasure - currentHarmonyNoteUpLinkMeasure = - currentHarmonyNoteUpLink-> - getNoteMeasureUpLink (); - - gLogOstream << - "inputLineNumber = " << inputLineNumber << - endl; - - // sanity check - msrAssert ( - currentHarmonyNoteUpLinkMeasure != nullptr, - "currentHarmonyNoteUpLinkMeasure is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "handleHarmoniesInHarmonyMeasureFinalization() 9999 " << - "currentHarmonyNoteUpLinkMeasure: " << - currentHarmonyNoteUpLinkMeasure->asString () << - endl; - } -#endif - - // get the currentHarmonyNoteUpLink's measure sounding whole notes - rational - currentHarmonyNoteUpLinkMeasureSoundingWholeNotes = - currentHarmonyNoteUpLinkMeasure-> - getCurrentMeasureWholeNotesDuration (); -*/ - - -/* JMI - if (fMeasurePendingMeasureElementsList.size ()) { - // pad measure up to the elements positions in measure, - // and then append them - - list::iterator - iBegin = fMeasurePendingMeasureElementsList.begin (), - iEnd = fMeasurePendingMeasureElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrMeasureElement - measureElement = (*i); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures || gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Considering delayed " << - measureElement->asShortString () << - " in measure " << - asShortString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () - ->getVoiceName () << - "\", line " << inputLineNumber << - ", has position in measure '" << - measureElement->getMeasureElementPositionInMeasure () << - ", currentMeasureWholeNotesDuration = " << fCurrentMeasureWholeNotesDuration << - endl; - } -#endif - - if (measureElement->getMeasureElementPositionInMeasure () == fCurrentMeasureWholeNotesDuration) { // JMI - // this is where measureElement should be appended - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending delayed " << - measureElement->asShortString () << - " in measure " << - asShortString () << - " in voice \"" << - fMeasureSegmentUpLink-> - getSegmentVoiceUpLink () - ->getVoiceName () << - "\", line " << inputLineNumber << - ", has position in measure '" << - measureElement->getMeasureElementPositionInMeasure () << - ", currentMeasureWholeNotesDuration = " << fCurrentMeasureWholeNotesDuration << - endl; - } -#endif - - // set measureElement's position in measure - measureElement-> - setMeasureElementPositionInMeasure ( - fCurrentMeasureWholeNotesDuration, - "appendElementToMeasure(), delayed element"); - - fMeasureElementsList.push_back (measureElement); - - // remove it from the pending measure elements list - i = fMeasurePendingMeasureElementsList.erase (i); - } - - if (++i == iEnd) break; - } // for - } -*/ diff --git a/src/lilypond/msrMeasuresRepeats.cpp b/src/lilypond/msrMeasuresRepeats.cpp deleted file mode 100644 index e5e73de81..000000000 --- a/src/lilypond/msrMeasuresRepeats.cpp +++ /dev/null @@ -1,1189 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -/* JMI -//______________________________________________________________________________ -S_msrMeasuresRepeatElement msrMeasuresRepeatElement::create ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink) -{ - msrMeasuresRepeatElement* o = - new msrMeasuresRepeatElement ( - inputLineNumber, - measuresRepeatUpLink); - assert(o!=0); - return o; -} - -msrMeasuresRepeatElement::msrMeasuresRepeatElement ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - measuresRepeatUpLink != nullptr, - "measuresRepeatUpLink is null"); - - fMeasuresRepeatElementMeasuresRepeatUpLink = measuresRepeatUpLink; -} - -msrMeasuresRepeatElement::~msrMeasuresRepeatElement () -{} - -void msrMeasuresRepeatElement::appendSegmentToMeasuresRepeatElementsList ( // JMI ??? - int inputLineNumber, - S_msrSegment segment, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending segment '" << segment << - "' to measuresRepeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - segment != nullptr, - "segment is null"); - - fMeasuresRepeatElementElementsList.push_back (segment); -} - -void msrMeasuresRepeatElement::appendMeasuresRepeatToMeasuresRepeatElementsList ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending measuresRepeat '" << measuresRepeat << - "' to measuresRepeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeat != nullptr, - "measuresRepeat is null"); - - fMeasuresRepeatElementElementsList.push_back (measuresRepeat); -} - -void msrMeasuresRepeatElement::appendVoiceElementToMeasuresRepeatElementsList ( - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending voice element '" << voiceElement << - "' to measuresRepeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - voiceElement != nullptr, - "voiceElement is null"); - - fMeasuresRepeatElementElementsList.push_back (voiceElement); -} - -S_msrNote msrMeasuresRepeatElement::fetchMeasuresRepeatElementFirstNonGraceNote () const -{ - - S_msrNote result; - - // fetch the first note in the first measure to which - // a grace notes group can be attached - // i.e. one not in a grace notes group itself, - // possibly inside a chord or tuplet - - if (fMeasuresRepeatElementElementsList.size ()) { - list::const_iterator - iBegin = fMeasuresRepeatElementElementsList.begin (), - iEnd = fMeasuresRepeatElementElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrVoiceElement element = (*i); - - if ( - S_msrNote note = dynamic_cast(&(*element)) - ) { - result = note; - break; - } - - else if ( - S_msrChord chord = dynamic_cast(&(*element)) - ) { - // get the chord's first note - result = chord->fetchChordFirstNonGraceNote (); - break; - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*element)) - ) { - // get the tuplet's first note - result = tuplet->fetchTupletFirstNonGraceNote (); - break; - } - - else if ( - S_msrClef clef = dynamic_cast(&(*element)) - ) { - // ignore this clef - } - - else if ( - S_msrKey key = dynamic_cast(&(*element)) - ) { - // ignore this key - } - - else if ( - S_msrTime time = dynamic_cast(&(*element)) - ) { - // ignore this time - } - - else { - stringstream s; - - s << - "tuplet first element should be a note, a chord or another tuplet, found instead '" << - element->asShortString () << - "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (++i == iEnd) break; - } // for - } - - return result; -} - -void msrMeasuresRepeatElement::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatElement::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeatElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeatElement::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrMeasuresRepeatElement::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatElement::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeatElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeatElement::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrMeasuresRepeatElement::browseData (basevisitor* v) -{ - // browse the elements - if (fMeasuresRepeatElementElementsList.size ()) { - for ( - list::const_iterator i = fMeasuresRepeatElementElementsList.begin (); - i != fMeasuresRepeatElementElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrMeasuresRepeatElement::asString () const -{ - stringstream s; - - s << - "MeasuresRepeatElement" << - ", measuresRepeat upLink: '" << - fMeasuresRepeatElementMeasuresRepeatUpLink-> - asShortString () << - "', line " << fInputLineNumber << - endl; - - return s.str (); -} - -void msrMeasuresRepeatElement::print (ostream& os) const -{ - os << - "MeasuresRepeatElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << - "measuresRepeat upLink: '" << - fMeasuresRepeatElementMeasuresRepeatUpLink-> - asShortString () << - "'" << - endl << - endl; - - // print the elements - int elementsNumber = - fMeasuresRepeatElementElementsList.size (); - - os << - "measuresRepeatElementElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fMeasuresRepeatElementElementsList.begin (), - iEnd = fMeasuresRepeatElementElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrMeasuresRepeatElement::shortPrint (ostream& os) const -{ - os << - "MeasuresRepeatElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - -/ / * JMI - os << - "measuresRepeat upLink: '" << - fMeasuresRepeatElementMeasuresRepeatUpLink-> - asShortString () << - "'" << - endl; -* / - - // print the elements - int elementsNumber = - fMeasuresRepeatElementElementsList.size (); - - os << - "repeatElementElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fMeasuresRepeatElementElementsList.begin (), - iEnd = fMeasuresRepeatElementElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - (*i)->shortPrint (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrMeasuresRepeatElement& elt) -{ - elt->print (os); - return os; -} -*/ - -//______________________________________________________________________________ -S_msrMeasuresRepeatPattern msrMeasuresRepeatPattern::create ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink) -{ - msrMeasuresRepeatPattern* o = - new msrMeasuresRepeatPattern ( - inputLineNumber, - measuresRepeatUpLink); - assert(o!=0); - return o; -} - -msrMeasuresRepeatPattern::msrMeasuresRepeatPattern ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - measuresRepeatUpLink != nullptr, - "measuresRepeatUpLink is null"); - - fMeasuresRepeatUpLink = measuresRepeatUpLink; -} - -msrMeasuresRepeatPattern::~msrMeasuresRepeatPattern () -{} - -void msrMeasuresRepeatPattern::setMeasuresRepeatPatternSegment ( - S_msrSegment measuresRepeatPatternSegment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Setting measures repeat pattern segment containing " << - singularOrPlural ( - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeatPatternSegment != nullptr, - "measuresRepeatPatternSegment is null"); - - fMeasuresRepeatPatternSegment = - measuresRepeatPatternSegment; -} - -int msrMeasuresRepeatPattern::fetchMeasuresNumber () const -{ - int result; - - if (fMeasuresRepeatPatternSegment) { - result = - fMeasuresRepeatPatternSegment-> - getSegmentMeasuresList ().size (); - } - else { - result = 0; - } - - return result; -} - -void msrMeasuresRepeatPattern::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatPattern::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeatPattern elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeatPattern::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrMeasuresRepeatPattern::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatPattern::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeatPattern elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeatPattern::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrMeasuresRepeatPattern::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatPattern::browseData ()" << - endl; - } - - if (fMeasuresRepeatPatternSegment) { - // browse the pattern segment - msrBrowser browser (v); - browser.browse (*fMeasuresRepeatPatternSegment); - } -} - -string msrMeasuresRepeatPattern::asString () const -{ - stringstream s; - - s << - - "MeasuresRepeatPattern" << - ", line " << fInputLineNumber << - " (" << - singularOrPlural ( - fetchMeasuresNumber (), - "repeated measure", - "repeated measures") << - ")"; - - return s.str (); -} - -void msrMeasuresRepeatPattern::print (ostream& os) const -{ - os << - endl << - asString () << - endl << - endl; - - gIndenter++; - - // print the pattern segment - os << - "Pattern segment:"; - - if (! fMeasuresRepeatPatternSegment) { - os << - " none" << - endl; - } - else { - os << endl; - - gIndenter++; - - os << - fMeasuresRepeatPatternSegment; - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrMeasuresRepeatPattern& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrMeasuresRepeatReplicas msrMeasuresRepeatReplicas::create ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink) -{ - msrMeasuresRepeatReplicas* o = - new msrMeasuresRepeatReplicas ( - inputLineNumber, - measuresRepeatUpLink); - assert(o!=0); - return o; -} - -msrMeasuresRepeatReplicas::msrMeasuresRepeatReplicas ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - measuresRepeatUpLink != nullptr, - "measuresRepeatUpLink is null"); - - fMeasuresRepeatUpLink = measuresRepeatUpLink; -} - -msrMeasuresRepeatReplicas::~msrMeasuresRepeatReplicas () -{} - -void msrMeasuresRepeatReplicas::setMeasuresRepeatReplicasSegment ( - S_msrSegment measuresRepeatReplicasSegment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Setting measures repeat replicas segment containing " << - singularOrPlural ( - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeatReplicasSegment != nullptr, - "measuresRepeatReplicasSegment is null"); - - fMeasuresRepeatReplicasSegment = - measuresRepeatReplicasSegment; -} - -int msrMeasuresRepeatReplicas::fetchMeasuresNumber () const -{ - int result; - - if (fMeasuresRepeatReplicasSegment) { - result = - fMeasuresRepeatReplicasSegment-> - getSegmentMeasuresList ().size (); - } - else { - result = 0; - } - - return result; -} - -void msrMeasuresRepeatReplicas::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatReplicas::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeatReplicas elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeatReplicas::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrMeasuresRepeatReplicas::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatReplicas::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeatReplicas elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeatReplicas::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrMeasuresRepeatReplicas::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeatReplicas::browseData ()" << - endl; - } - - if (fMeasuresRepeatReplicasSegment) { - // browse the replicas segment - msrBrowser browser (v); - browser.browse (*fMeasuresRepeatReplicasSegment); - } -} - -string msrMeasuresRepeatReplicas::asString () const -{ - stringstream s; - - s << - - "MeasuresRepeatReplicas" << - ", line " << fInputLineNumber << - " (" << - singularOrPlural ( - fetchMeasuresNumber (), - "replicas measure", - "replicas measures") << - ")"; - - return s.str (); -} - -void msrMeasuresRepeatReplicas::print (ostream& os) const -{ - os << - endl << - asString () << - endl << - endl; - - gIndenter++; - - // print the replicas segment - os << - "Replicas segment:"; - - if (! fMeasuresRepeatReplicasSegment) { - os << - " none" << - endl; - } - else { - os << endl; - - gIndenter++; - - os << - fMeasuresRepeatReplicasSegment; - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrMeasuresRepeatReplicas& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrMeasuresRepeat msrMeasuresRepeat::create ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber, - S_msrVoice voiceUpLink) -{ - msrMeasuresRepeat* o = - new msrMeasuresRepeat ( - inputLineNumber, - measuresRepeatMeasuresNumber, - measuresRepeatSlashesNumber, - voiceUpLink); - assert(o!=0); - return o; -} - -msrMeasuresRepeat::msrMeasuresRepeat ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber, - S_msrVoice voiceUpLink) - : msrVoiceElement (inputLineNumber) -{ - // sanity check - msrAssert ( - measuresRepeatMeasuresNumber > 0, - "measuresRepeatMeasuresNumber is not positive"); - - fMeasuresRepeatMeasuresNumber = measuresRepeatMeasuresNumber; - - // sanity check - msrAssert ( - measuresRepeatSlashesNumber > 0, - "measuresRepeatSlashesNumber is not positive"); - - fMeasuresRepeatSlashesNumber = measuresRepeatSlashesNumber; - - fMeasuresRepeatVoiceUpLink = voiceUpLink; - - // measures repeat build phase - fCurrentMeasuresRepeatBuildPhaseKind = - msrMeasuresRepeat::kMeasuresRepeatBuildPhaseJustCreated; -} - -msrMeasuresRepeat::~msrMeasuresRepeat () -{} - -S_msrMeasuresRepeat msrMeasuresRepeat::createMeasuresRepeatNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a newborn clone of measures repeat '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrMeasuresRepeat - newbornClone = - msrMeasuresRepeat::create ( - fInputLineNumber, - fMeasuresRepeatMeasuresNumber, - fMeasuresRepeatSlashesNumber, - containingVoice); - - return newbornClone; -} - -void msrMeasuresRepeat::setMeasuresRepeatPattern ( - S_msrMeasuresRepeatPattern measuresRepeatPattern) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Setting measures repeat pattern containing " << - singularOrPlural ( - measuresRepeatPattern-> - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeatPattern != nullptr, - "measuresRepeatPattern is null"); - - fMeasuresRepeatPattern = measuresRepeatPattern; - - // set currentRepeat's build phase - fCurrentMeasuresRepeatBuildPhaseKind = - msrMeasuresRepeat::kMeasuresRepeatBuildPhaseInPattern; -} - -void msrMeasuresRepeat::setMeasuresRepeatReplicas ( - S_msrMeasuresRepeatReplicas measuresRepeatReplicas) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Setting measures repeat replicas containing " << - singularOrPlural ( - measuresRepeatReplicas-> - fetchMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeatReplicas != nullptr, - "measuresRepeatReplicas is null"); - - fMeasuresRepeatReplicas = measuresRepeatReplicas; - - // set currentRepeat's build phase - fCurrentMeasuresRepeatBuildPhaseKind = - msrMeasuresRepeat::kMeasuresRepeatBuildPhaseInReplicas; -} - -int msrMeasuresRepeat::fetchMeasuresRepeatReplicasNumber () const -{ - int patternMeasuresNumber = - fetchMeasuresRepeatPatternMeasuresNumber (); - - // sanity check - msrAssert ( - patternMeasuresNumber > 0, - "patternMeasuresNumber is not positive"); - - return - fetchMeasuresRepeatReplicasMeasuresNumber () - / // JMI ??? - patternMeasuresNumber; -} - -int msrMeasuresRepeat::fetchMeasuresRepeatPatternMeasuresNumber () const -{ - // sanity check - msrAssert ( - fMeasuresRepeatPattern != nullptr, - "fMeasuresRepeatPattern is null"); - - return - fMeasuresRepeatPattern-> - fetchMeasuresNumber (); -} - -int msrMeasuresRepeat::fetchMeasuresRepeatReplicasMeasuresNumber () const -{ - // sanity check - msrAssert ( - fMeasuresRepeatReplicas != nullptr, - "fMeasuresRepeatReplicas is null"); - - return - fMeasuresRepeatReplicas-> - fetchMeasuresNumber (); -} - -void msrMeasuresRepeat::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeat::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeat::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrMeasuresRepeat::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeat::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMeasuresRepeat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMeasuresRepeat::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrMeasuresRepeat::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMeasuresRepeat::browseData ()" << - endl; - } - - if (fMeasuresRepeatPattern) { - // browse the measdure repeat pattern - msrBrowser browser (v); - browser.browse (*fMeasuresRepeatPattern); - } - - // fetch the score - S_msrScore - score = - fMeasuresRepeatVoiceUpLink-> - fetchVoicePartUpLink ()-> - getPartPartGroupUpLink ()-> - getPartGroupScoreUpLink (); - - bool inhibitMeasuresRepeatReplicasBrowsing = - score->getInhibitMeasuresRepeatReplicasBrowsing (); - - if (inhibitMeasuresRepeatReplicasBrowsing) { -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors || gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "% ==> visiting measures repeat replicas is inhibited" << - endl; - } -#endif - } - - if (fMeasuresRepeatReplicas) { - if (! inhibitMeasuresRepeatReplicasBrowsing) { - // browse the measures repeat replicas - msrBrowser browser (v); - browser.browse (*fMeasuresRepeatReplicas); - } - } -} - -string msrMeasuresRepeat::measuresRepeatBuildPhaseKindAsString ( - msrMeasuresRepeatBuildPhaseKind measuresRepeatBuildPhaseKind) -{ - string result; - - switch (measuresRepeatBuildPhaseKind) { - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseJustCreated: - result = "measuresRepeatBuildPhaseJustCreated"; - break; - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseInPattern: - result = "measuresRepeatBuildPhaseInPattern"; - break; - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseInReplicas: - result = "measuresRepeatBuildPhaseInReplicas"; - break; - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseCompleted: - result = "measuresRepeatBuildPhaseCompleted"; - break; - } // switch - - return result; -} - -string msrMeasuresRepeat::asString () const -{ - stringstream s; - - s << - - "MeasuresRepeat" << - ", line " << fInputLineNumber << - " (" << - singularOrPlural ( - fetchMeasuresRepeatPatternMeasuresNumber (), - "repeated measure", - "repeated measures") << - ", " << - singularOrPlural ( - fetchMeasuresRepeatReplicasMeasuresNumber (), - "replicas measure", - "replicas measures") << - ", " << - fetchMeasuresRepeatReplicasNumber () << " replicas" << - ")"; - - return s.str (); -} - -void msrMeasuresRepeat::displayMeasuresRepeat ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - "*********>> MeasuresRepeat " << - ", measuresRepeatMeasuresNumber: '" << - fMeasuresRepeatMeasuresNumber << - ", measuresRepeatSlashesNumber: '" << - fMeasuresRepeatSlashesNumber << - "', voice:" << - endl << - fMeasuresRepeatVoiceUpLink->getVoiceName () << - " (" << context << ")" << - ", line " << inputLineNumber << - " contains:" << - endl; - - gIndenter++; - print (gLogOstream); - gIndenter--; - - gLogOstream << - "<<*********" << - endl << - endl; -} - -void msrMeasuresRepeat::print (ostream& os) const -{ - os << - "MeasuresRepeat" << - " (" << - singularOrPlural ( - fMeasuresRepeatPattern - ? fetchMeasuresRepeatPatternMeasuresNumber () - : 0, - "pattern measure", - "pattern measures") << - ", " << - singularOrPlural ( - fMeasuresRepeatReplicas - ? fetchMeasuresRepeatReplicasMeasuresNumber () - : 0, - "replica measure", - "replicas measures") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - // print the current measures repeat build phase - const int fieldWidth = 36; - - os << - setw (fieldWidth) << - "currentMeasuresRepeatBuildPhaseKind" << " : " << - measuresRepeatBuildPhaseKindAsString ( - fCurrentMeasuresRepeatBuildPhaseKind) << - endl; - } -#endif - - // print the measures repeat pattern - if (! fMeasuresRepeatPattern) { - os << - "measures repeat pattern: none" << - endl; - } - - else { - os << - fMeasuresRepeatPattern; - } - - // print the measures repeat replicas - if (! fMeasuresRepeatReplicas) { - os << - "measures repeat replicas: none" << - endl; - } - - else { - os << - fMeasuresRepeatReplicas; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrMeasuresRepeat& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrMeasuresRepeats_MUT_DEP.h b/src/lilypond/msrMeasuresRepeats_MUT_DEP.h deleted file mode 100644 index 52024cdff..000000000 --- a/src/lilypond/msrMeasuresRepeats_MUT_DEP.h +++ /dev/null @@ -1,453 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -/* JMI -class msrMeasuresRepeatElement : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrMeasuresRepeatElement ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink); - - virtual ~msrMeasuresRepeatElement (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrMeasuresRepeat getMeasuresRepeatElementMeasuresRepeatUpLink () const - { return fMeasuresRepeatElementMeasuresRepeatUpLink; } - - // elements - const list& - getMeasuresRepeatElementElementsList () - { return fMeasuresRepeatElementElementsList; } - - public: - - // public services - // ------------------------------------------------------ - - void appendSegmentToMeasuresRepeatElementsList ( - int inputLineNumber, - S_msrSegment segment, - string context); - - void appendMeasuresRepeatToMeasuresRepeatElementsList ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - - void appendRestMeasuresToMeasuresRepeatElementsList ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - S_msrNote fetchMeasuresRepeatElementFirstNonGraceNote () const; - - void collectMeasuresRepeatElementMeasuresIntoFlatList ( - int inputLineNumber); - - private: - - // private services - // ------------------------------------------------------ - - void appendVoiceElementToMeasuresRepeatElementsList ( // JMI - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrMeasuresRepeat fMeasuresRepeatElementMeasuresRepeatUpLink; - - // elements list - list - fMeasuresRepeatElementElementsList; -}; -typedef SMARTP S_msrMeasuresRepeatElement; -EXP ostream& operator<< (ostream& os, const S_msrMeasuresRepeatElement& elt); -*/ - -//______________________________________________________________________________ -class msrMeasuresRepeatPattern : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink); - - /* JMI - SMARTP createMeasuresRepeatPatternNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createMeasuresRepeatPatternDeepCopy ( - S_msrVoice containingVoice); -*/ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrMeasuresRepeatPattern ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink); - - virtual ~msrMeasuresRepeatPattern (); - - public: - - // set and get - // ------------------------------------------------------ - - // segment - void setMeasuresRepeatPatternSegment ( - S_msrSegment measuresRepeatPatternSegment); - - S_msrSegment getMeasuresRepeatPatternSegment () const - { return fMeasuresRepeatPatternSegment; } - - // upLinks - S_msrMeasuresRepeat getMeasuresRepeatUpLink () const - { return fMeasuresRepeatUpLink; } - - // services - // ------------------------------------------------------ - - int fetchMeasuresNumber () const; - - void collectRepeatPatternMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrMeasuresRepeat fMeasuresRepeatUpLink; - - // segment - S_msrSegment fMeasuresRepeatPatternSegment; -}; -typedef SMARTP S_msrMeasuresRepeatPattern; -EXP ostream& operator<< (ostream& os, const S_msrMeasuresRepeatPattern& elt); - -//______________________________________________________________________________ -class msrMeasuresRepeatReplicas : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink); - - /* JMI - SMARTP createMeasuresRepeatReplicasNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createMeasuresRepeatReplicasDeepCopy ( - S_msrVoice containingVoice); - */ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrMeasuresRepeatReplicas ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatUpLink); - - virtual ~msrMeasuresRepeatReplicas (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrMeasuresRepeat getMeasuresRepeatUpLink () const - { return fMeasuresRepeatUpLink; } - // segment - void setMeasuresRepeatReplicasSegment ( - S_msrSegment measuresRepeatReplicasSegment); - - S_msrSegment getMeasuresRepeatReplicasSegment () const - { return fMeasuresRepeatReplicasSegment; } - - // services - // ------------------------------------------------------ - - int fetchMeasuresNumber () const; - - int fetchMeasuresRepeatReplicasNumber () const; - - void collectRepeatReplicasMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrMeasuresRepeat fMeasuresRepeatUpLink; - - // segment - S_msrSegment fMeasuresRepeatReplicasSegment; -}; -typedef SMARTP S_msrMeasuresRepeatReplicas; -EXP ostream& operator<< (ostream& os, const S_msrMeasuresRepeatReplicas& elt); - -//______________________________________________________________________________ -class msrMeasuresRepeat : public msrVoiceElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrMeasuresRepeatKind { - k_NoMeasuresRepeat, - kStartMeasuresRepeat, kStopMeasuresRepeat }; - - static string measuresRepeatKindAsString ( - msrMeasuresRepeatKind measuresRepeatKind); - - enum msrMeasuresRepeatBuildPhaseKind { - kMeasuresRepeatBuildPhaseJustCreated, - kMeasuresRepeatBuildPhaseInPattern, - kMeasuresRepeatBuildPhaseInReplicas, - kMeasuresRepeatBuildPhaseCompleted}; - - static string measuresRepeatBuildPhaseKindAsString ( - msrMeasuresRepeatBuildPhaseKind measuresRepeatBuildPhaseKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber, - S_msrVoice voiceUpLink); - - SMARTP createMeasuresRepeatNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createMeasuresRepeatDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrMeasuresRepeat ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber, - S_msrVoice voiceUpLink); - - virtual ~msrMeasuresRepeat (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrVoice getMeasuresRepeatVoiceUpLink () const - { return fMeasuresRepeatVoiceUpLink; } - - // numbers - int getMeasuresRepeatMeasuresNumber () const - { return fMeasuresRepeatMeasuresNumber; } - - int getMeasuresRepeatSlashesNumber () const - { return fMeasuresRepeatSlashesNumber; } - - // measuresRepeat pattern - void setMeasuresRepeatPattern ( - S_msrMeasuresRepeatPattern - measuresRepeatPattern); - - S_msrMeasuresRepeatPattern - getMeasuresRepeatPattern () const - { return fMeasuresRepeatPattern; } - - // measures repeat replicas - void setMeasuresRepeatReplicas ( - S_msrMeasuresRepeatReplicas - measuresRepeatReplicas); - - S_msrMeasuresRepeatReplicas - getMeasuresRepeatReplicas () const - { return fMeasuresRepeatReplicas; } - - // measures repeat build phase - void setCurrentMeasuresRepeatBuildPhaseKind ( - msrMeasuresRepeatBuildPhaseKind - measuresRepeatBuildPhaseKind) - { - fCurrentMeasuresRepeatBuildPhaseKind = - measuresRepeatBuildPhaseKind; - } - - msrMeasuresRepeatBuildPhaseKind - getCurrentMeasuresRepeatBuildPhaseKind () const - { return fCurrentMeasuresRepeatBuildPhaseKind; } - - // services - // ------------------------------------------------------ - - int fetchMeasuresRepeatReplicasNumber () const; - - int fetchMeasuresRepeatPatternMeasuresNumber () const; - int fetchMeasuresRepeatReplicasMeasuresNumber () const; - - void collectMeasuresRepeatMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - void displayMeasuresRepeat ( - int inputLineNumber, - string context); - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fMeasuresRepeatVoiceUpLink; - - // numbers - int fMeasuresRepeatMeasuresNumber; - int fMeasuresRepeatSlashesNumber; - - // measures repeat pattern - S_msrMeasuresRepeatPattern - fMeasuresRepeatPattern; - - // measures repeat replicas - S_msrMeasuresRepeatReplicas - fMeasuresRepeatReplicas; - - // measures repeat build phase, used when building the measures repeat - msrMeasuresRepeatBuildPhaseKind - fCurrentMeasuresRepeatBuildPhaseKind; -}; -typedef SMARTP S_msrMeasuresRepeat; -EXP ostream& operator<< (ostream& os, const S_msrMeasuresRepeat& elt); - diff --git a/src/lilypond/msrMeasures_MUT_DEP.h b/src/lilypond/msrMeasures_MUT_DEP.h deleted file mode 100644 index b1ebd63f0..000000000 --- a/src/lilypond/msrMeasures_MUT_DEP.h +++ /dev/null @@ -1,710 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrMeasure : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrMeasureKind { - kMeasureKindUnknown, - kMeasureKindRegular, - kMeasureKindAnacrusis, - kMeasureKindIncompleteStandalone, - kMeasureKindIncompleteLastInRepeatCommonPart, - kMeasureKindIncompleteLastInRepeatHookedEnding, - kMeasureKindIncompleteLastInRepeatHooklessEnding, - kMeasureKindIncompleteNextMeasureAfterCommonPart, - kMeasureKindIncompleteNextMeasureAfterHookedEnding, - kMeasureKindIncompleteNextMeasureAfterHooklessEnding, - kMeasureKindOvercomplete, - kMeasureKindCadenza, - kMeasureKindMusicallyEmpty}; - - static string measureKindAsString ( - msrMeasureKind measureKind); - - enum msrMeasureImplicitKind { - kMeasureImplicitKindYes, - kMeasureImplicitKindNo }; - - static string measureImplicitKindAsString ( - msrMeasureImplicitKind measureImplicitKind); - - enum msrMeasureFirstInSegmentKind { - kMeasureFirstInSegmentKindUnknown, - kMeasureFirstInSegmentKindYes, - kMeasureFirstInSegmentKindNo }; - - static string measureFirstInSegmentKindAsString ( - msrMeasureFirstInSegmentKind measureFirstInSegmentKind); - - enum msrMeasuresRepeatContextKind { - kMeasuresRepeatContextKindUnknown, - kMeasuresRepeatContextKindNone, - kMeasuresRepeatContextKindCommonPartLastMeasure, - kMeasuresRepeatContextKindHookedEndingLastMeasure, - kMeasuresRepeatContextKindHooklessEndingLastMeasure, - kMeasuresRepeatContextKindNextMeasureAfterCommonPart, - kMeasuresRepeatContextKindNextMeasureAfterHookedEnding, - kMeasuresRepeatContextKindNextMeasureAfterHooklessEnding }; - - static string measuresRepeatContextKindAsString ( - msrMeasuresRepeatContextKind measuresRepeatContextKind); - - enum msrMeasureEndRegularKind { - kMeasureEndRegularKindUnknown, - kMeasureEndRegularKindYes, - kMeasureEndRegularKindNo }; - - static string measureEndRegularKindAsString ( - msrMeasureEndRegularKind measureEndRegularKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string measureNumber, - S_msrSegment measureSegmentUpLink); - - SMARTP createMeasureNewbornClone ( - S_msrSegment containingSegment); - - SMARTP createMeasureDeepCopy ( - S_msrSegment containingSegment); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrMeasure ( - int inputLineNumber, - string measureNumber, - S_msrSegment measureSegmentUpLink); - - virtual ~msrMeasure (); - - private: - - // initialization - // ------------------------------------------------------ - - void initializeMeasure (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - - S_msrSegment getMeasureSegmentUpLink () const - { return fMeasureSegmentUpLink; } - - // measure numbers - - void setMeasureElementMeasureNumber (string measureNumber) - { fMeasureElementMeasureNumber = measureNumber; } - - string getMeasureElementMeasureNumber () const - { return fMeasureElementMeasureNumber; } - - void setMeasurePuristNumber ( - int measurePuristNumber); - - int getMeasurePuristNumber () const - { return fMeasurePuristNumber; } - - void setNextMeasureNumber (string nextMeasureNumber); - - string getNextMeasureNumber () const - { return fNextMeasureNumber; } - - void setMeasureFirstInVoice (); - - bool getMeasureFirstInVoice () const - { return fMeasureFirstInVoice; } - - // measure lengthes, in whole notes - - void setFullMeasureWholeNotesDuration ( - rational wholeNotes) - { fFullMeasureWholeNotesDuration = wholeNotes; } - - rational getFullMeasureWholeNotesDuration () const - { return fFullMeasureWholeNotesDuration; } - - void setCurrentMeasureWholeNotesDuration ( - int inputLineNumber, - rational wholeNotes); - void incrementCurrentMeasureWholeNotesDuration ( - int inputLineNumber, - rational delta); - - rational getCurrentMeasureWholeNotesDuration () const - { return fCurrentMeasureWholeNotesDuration; } - - // measure kind - - void setMeasureKind ( - msrMeasureKind measureKind); - - msrMeasureKind - getMeasureKind () const - { return fMeasureKind; } - - // measure implicit kind - - void setMeasureImplicitKind ( - msrMeasureImplicitKind measureImplicitKind) - { - fMeasureImplicitKind = - measureImplicitKind; - } - - msrMeasureImplicitKind - getMeasureImplicitKind () const - { return fMeasureImplicitKind; } - - - // measure 'first in segment' kind - - void setMeasureFirstInSegmentKind ( - msrMeasureFirstInSegmentKind - measureFirstInSegmentKind) - { - fMeasureFirstInSegmentKind = - measureFirstInSegmentKind; - } - - msrMeasureFirstInSegmentKind - getMeasureFirstInSegmentKind () const - { return fMeasureFirstInSegmentKind; } - - // single-measure rest? - - - void setMeasureIsAFullMeasureRest () - { fMeasureIsAFullMeasureRest = true; } - - bool getMeasureIsAFullMeasureRest () const - { return fMeasureIsAFullMeasureRest; } - - // measure longest note - - S_msrNote getMeasureLongestNote () const - { return fMeasureLongestNote; } - - // chords handling - - S_msrNote getMeasureLastHandledNote () const - { return fMeasureLastHandledNote; } - - // elements list - - const list& - getMeasureElementsList () const - { return fMeasureElementsList; } - - bool getMeasureContainsMusic () const - { return fMeasureContainsMusic; } - - // regular measure ends detection - - void setMeasureEndRegularKind ( - msrMeasureEndRegularKind measureEndRegularKind); - - msrMeasureEndRegularKind - getMeasureEndRegularKind () const - { return fMeasureEndRegularKind; } - - // repeat context - - void setMeasuresRepeatContextKind ( - msrMeasuresRepeatContextKind measuresRepeatContextKind); - - msrMeasuresRepeatContextKind - getMeasuresRepeatContextKind () const - { return fMeasuresRepeatContextKind; } - - public: - - // public services - // ------------------------------------------------------ - - // upLinks - - S_msrPart fetchMeasurePartUpLink () const; // JMI ??? - - S_msrVoice fetchMeasureVoiceUpLink () const; - - // lengthes - - string fullMeasureWholeNotesDurationAsMSRString (); - - string currentMeasureWholeNotesDurationAsMSRString (); - - // backup and padding - - S_msrNote createPaddingNoteForVoice ( - int inputLineNumber, - rational duration, - S_msrVoice voice); - - void padUpToPositionInMeasureInMeasure ( - int inputLineNumber, - rational wholeNotes); - - void backupByWholeNotesStepLengthInMeasure ( - int inputLineNumber, - rational backupTargetMeasureElementPositionInMeasure); - - void appendPaddingNoteToMeasure ( - int inputLineNumber, - rational forwardStepLength); - - // rest measures - - bool measureIsARestMeasure () const; - - // clefs - - void appendClefToMeasure (S_msrClef clef); - - // keys - - void appendKeyToMeasure (S_msrKey key); - - // times - - void appendTimeToMeasure (S_msrTime time); - - void setFullMeasureWholeNotesDurationFromTime ( - S_msrTime time); - - void appendTimeToMeasureClone (S_msrTime time); - - // transpose - - void appendTransposeToMeasure ( - S_msrTranspose transpose); - - // part name display - - void appendPartNameDisplayToMeasure ( - S_msrPartNameDisplay partNameDisplay); - - // part abbreviation display - - void appendPartAbbreviationDisplayToMeasure ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay); - - // staff details - - void appendStaffDetailsToMeasure ( - S_msrStaffDetails staffDetails); - - // bar number checks - - void appendBarNumberCheckToMeasure ( - S_msrBarNumberCheck barNumberCheck); - - // breaks - - void appendLineBreakToMeasure (S_msrLineBreak lineBreak); - void appendPageBreakToMeasure (S_msrPageBreak pageBreak); - - // tempo - - void appendTempoToMeasure (S_msrTempo tempo); - - // rehearsals - - void appendRehearsalToMeasure ( - S_msrRehearsal rehearsal); - - // octave shifts - - void appendOctaveShiftToMeasure ( - S_msrOctaveShift octaveShift); - - // scordaturas - - void appendScordaturaToMeasure ( - S_msrScordatura scordatura); - - // accordion registration - - void appendAccordionRegistrationToMeasure ( - S_msrAccordionRegistration - accordionRegistration); - - // harp pedals tuning - - void appendHarpPedalsTuningToMeasure ( - S_msrHarpPedalsTuning - harpPedalsTuning); - - // bar lines - - void appendBarlineToMeasure (S_msrBarline barline); - void prependBarlineToMeasure (S_msrBarline barline); - - // bar checks - - void appendBarCheckToMeasure (S_msrBarCheck barCheck); - - // staff change - - void appendVoiceStaffChangeToMeasure ( - S_msrVoiceStaffChange voiceStaffChange); - - // notes - - void appendNoteToMeasure ( - S_msrNote note, - rational partCurrentPositionInMeasure); - - void appendNoteOrPaddingToMeasure ( - S_msrNote note); - - void accountForTupletMemberNoteDurationInMeasure ( - S_msrNote note); - - void appendPaddingNoteAtTheEndOfMeasure (S_msrNote note); - - void appendNoteToMeasureClone (S_msrNote note); - - // tremolos - - void appendDoubleTremoloToMeasure ( - S_msrDoubleTremolo doubleTremolo); - - // chords - - void appendChordToMeasure ( - S_msrChord chord); - - // tuplets - - void appendTupletToMeasure ( - S_msrTuplet tuplet); - - // harmonies - - void appendHarmonyToMeasure ( - S_msrHarmony harmony); - - void appendHarmonyToMeasureClone ( - S_msrHarmony harmony); - - // frames - - void appendFrameToMeasure ( - S_msrFrame frame); - - void appendFrameToMeasureClone ( - S_msrFrame frame); - - // figured bass - - void appendFiguredBassToMeasure ( - S_msrFiguredBass figuredBass); - - void appendFiguredBassToMeasureClone ( - S_msrFiguredBass figuredBass); - - // grace notes - - /* JMI - void addGraceNotesGroupAheadOfMeasure ( - S_msrGraceNotesGroup graceNotesGroup); - - void appendGraceNotesToMeasure ( - S_msrGraceNotes graceNotes); - - void appendAfterGraceNotesToMeasure ( - S_msrAfterGraceNotes afterGraceNotes); - - void prependAfterGraceNotesToMeasure ( - S_msrAfterGraceNotes afterGraceNotes); - */ - - // segno - - void appendSegnoToMeasure (S_msrSegno segno); - - // coda - - void appendCodaToMeasure (S_msrCoda coda); - - // eyeglasses - - void appendEyeGlassesToMeasure ( - S_msrEyeGlasses eyeGlasses); - - // pedal - - void appendPedalToMeasure (S_msrPedal pedal); - - // damp - - void appendDampToMeasure (S_msrDamp damp); - - // damp all - - void appendDampAllToMeasure (S_msrDampAll dampAll); - - // other elements - - void prependOtherElementToMeasure ( - S_msrMeasureElement elem); - void appendOtherElementToMeasure ( - S_msrMeasureElement elem); - - // last element of measure - - S_msrElement getLastElementOfMeasure () const - { return fMeasureElementsList.back (); } - - /* JMI - S_msrElement removeLastElementFromMeasure ( - int inputLineNumber); -*/ - - // removing elements from measure - - void removeNoteFromMeasure ( - int inputLineNumber, - S_msrNote note); - - void removeElementFromMeasure ( - int inputLineNumber, - S_msrElement elem); - - // finalization - - void determineMeasureKindAndPuristNumber ( - int inputLineNumber, - msrMeasuresRepeatContextKind - measuresRepeatContextKind); - - void padUpToPositionInMeasure ( - int inputLineNumber, - rational positionInMeasureToPadUpTo); - - void padUpToPositionAtTheEndOfTheMeasure ( - int inputLineNumber, - rational positionInMeasureToPadUpTo); - - void finalizeMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context); - - void finalizeRegularMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context); - - void finalizeHarmonyMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context); - - void finalizeFiguredBassMeasure ( - int inputLineNumber, - msrMeasuresRepeatContextKind measuresRepeatContextKind, - string context); - - void finalizeMeasureClone ( - int inputLineNumber, - S_msrMeasure originalMeasure, - S_msrVoice voiceClone); - - private: - - // private services - // ------------------------------------------------------ - - void appendElementToMeasure ( - S_msrMeasureElement elem); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string measureKindAsString () const; - - string asShortString () const; - string asString () const; - - void displayMeasure ( - int inputLineNumber, - string context); - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - - S_msrSegment fMeasureSegmentUpLink; - - // measure lengthes, in whole notes - - rational fFullMeasureWholeNotesDuration; - // meaningfull only - // when there is a time signature, - // but not for cadenzas - - rational fCurrentMeasureWholeNotesDuration; - // this increases when musical elements - // are appended to the measure - - // measure numbers, shared by newborn clones and deep copies - - string fMeasureElementMeasureNumber; - string fNextMeasureNumber; - - // first measure in voice? - - bool fMeasureFirstInVoice; - - // measure longest note - - S_msrNote fMeasureLongestNote; - - // measure kind - - msrMeasureKind fMeasureKind; - - // measure implicit kind - - msrMeasureImplicitKind - fMeasureImplicitKind; - - // measure 'first in segment' kind - - msrMeasureFirstInSegmentKind - fMeasureFirstInSegmentKind; - - // single-measure rest? - - bool fMeasureIsAFullMeasureRest; - - // chords handling - - S_msrNote fMeasureLastHandledNote; - - // elements - - list - fMeasureElementsList; - - bool fMeasureContainsMusic; - - // purist measure number, forcing anacruses to start at '0' if it's not the case - // and not shared among repeats components - int fMeasurePuristNumber; - - // debug number, unique for every msrMeasure instance - static int gMeasureDebugNumber; - int fMeasureDebugNumber; - - // regular measure ends detection - msrMeasureEndRegularKind - fMeasureEndRegularKind; - - // repeat context - msrMeasuresRepeatContextKind - fMeasuresRepeatContextKind; - - public: - - // public work services - // ------------------------------------------------------ - - private: - - // private work services - // ------------------------------------------------------ - - void handleFirstHarmonyInHarmonyMeasure ( - int inputLineNumber, - S_msrVoice voice, - list::iterator& - i, - S_msrHarmony previousHarmony, - S_msrHarmony currentHarmony, - rational currentHarmonyPositionInMeasure); - - void handleSubsequentHarmonyInHarmonyMeasure ( - int inputLineNumber, - S_msrVoice voice, - list::iterator& - i, - S_msrHarmony previousHarmony, - S_msrHarmony currentHarmony, - rational currentHarmonyPositionInMeasure); - - void postHandleCurrentHarmonyInHarmonyMeasure ( - int inputLineNumber, - S_msrVoice voice, - S_msrHarmony currentHarmony); - - void handleHarmoniesInHarmonyMeasureFinalization ( - int inputLineNumber, - string context); - - void insertElementInMeasureBeforeIterator ( - int inputLineNumber, - list::iterator iter, - S_msrMeasureElement elem); - - void appendElementAtTheEndOfMeasure ( - S_msrMeasureElement elem); - - void printMeasurePendingMeasureElementsList (); - - private: - - // work fields - // ------------------------------------------------------ - - // pending measure elements, which may have to be delayed - // because of - - list - fMeasurePendingMeasureElementsList; - - // measure finalization - bool fMeasureHasBeenFinalized; - bool fMeasureKindAndPuristNumberHaveBeenDetermined; -}; -typedef SMARTP S_msrMeasure; -EXP ostream& operator<< (ostream& os, const S_msrMeasure& elt); - diff --git a/src/lilypond/msrMidi.cpp b/src/lilypond/msrMidi.cpp deleted file mode 100644 index 1a612618d..000000000 --- a/src/lilypond/msrMidi.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrMidi.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrMidiTempo msrMidiTempo::create ( - int inputLineNumber, - string midiTempoDuration, - int midiTempoPerSecond) -{ - msrMidiTempo* o = - new msrMidiTempo ( - inputLineNumber, - midiTempoDuration, - midiTempoPerSecond); - assert(o!=0); - return o; -} - -msrMidiTempo::msrMidiTempo ( - int inputLineNumber, - string midiTempoDuration, - int midiTempoPerSecond) - : msrElement (inputLineNumber) -{ - fMidiTempoDuration = midiTempoDuration; - fMidiTempoPerSecond = midiTempoPerSecond; -} - -msrMidiTempo::msrMidiTempo () - : msrElement (0) -{ - fMidiTempoDuration = "4"; - fMidiTempoPerSecond = 90; -} - -msrMidiTempo::~msrMidiTempo () -{} - -S_msrMidiTempo msrMidiTempo::createMsrMidiTempoNewbornClone () -{ - S_msrMidiTempo - newbornClone = - msrMidiTempo::create ( - fInputLineNumber, - fMidiTempoDuration, - fMidiTempoPerSecond); - - return newbornClone; -} - -void msrMidiTempo::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMidiTempo::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMidiTempo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMidiTempo::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrMidiTempo::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrMidiTempo::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrMidiTempo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrMidiTempo::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrMidiTempo::browseData (basevisitor* v) -{} - -void msrMidiTempo::print (ostream& os) const -{ - os << "Midi" << endl; - - gIndenter++; - - const int fieldWidth = 18; - - os << left << - setw (fieldWidth) << - "MidiTempoDuration" << " = " << fMidiTempoDuration << - endl << - setw (fieldWidth) << - "MidiTempoPerSecond" << " = " << fMidiTempoPerSecond << - endl << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrMidiTempo& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrMidi.h b/src/lilypond/msrMidi.h deleted file mode 100644 index 3efb20b87..000000000 --- a/src/lilypond/msrMidi.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrMidi___ -#define ___msrMidi___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrMidiTempo : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string midiTempoDuration, - int midiTempoPerSecond); - - SMARTP createMsrMidiTempoNewbornClone (); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrMidiTempo ( - int inputLineNumber, - string midiTempoDuration, - int midiTempoPerSecond); - - msrMidiTempo (); - - virtual ~msrMidiTempo (); - - public: - - // set and get - // ------------------------------------------------------ - void setMidiTempoDuration (string value) - { fMidiTempoDuration = value; } - - string getMidiTempoDuration () const - { return fMidiTempoDuration; } - - void setMidiTempoPerSecond (int value) - { fMidiTempoPerSecond = value; } - - int getMidiTempoPerSecond () const - { return fMidiTempoPerSecond; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fMidiTempoDuration; - int fMidiTempoPerSecond; -}; -typedef SMARTP S_msrMidiTempo; -EXP ostream& operator<< (ostream& os, const S_msrMidiTempo& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrMutualDependencies.h b/src/lilypond/msrMutualDependencies.h deleted file mode 100644 index ae118d08b..000000000 --- a/src/lilypond/msrMutualDependencies.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrMutualDependencies___ -#define ___msrMutualDependencies___ - -#include "typedefs.h" -#include "tree_browser.h" -#include "exports.h" - -#include "utilities.h" -#include "messagesHandling.h" - -#include "msrElements.h" - -#include "msrTupletElements.h" - -#include "msrVoiceElements.h" - -#include "msrVarValAssocs.h" - -#include "msrIdentification.h" - -#include "msrLayouts.h" // JMI ??? -#include "msrScaling.h" - -#include "msrCredits.h" - -#include "msrDivisions.h" - -#include "msrPartNamesDisplays.h" - -#include "msrStavesDetails.h" - -#include "msrClefs.h" -#include "msrKeys.h" -#include "msrTimes.h" - -#include "msrTempos.h" - -#include "msrRehearsals.h" - -#include "msrWords.h" - -#include "msrTranspositions.h" - -#include "msrBreaks.h" - -#include "msrStems.h" -#include "msrBeams.h" - -#include "msrTechnicals.h" - -#include "msrBars.h" - -#include "msrDynamics.h" -#include "msrArticulations.h" - -#include "msrTablatures.h" -#include "msrInstruments.h" -#include "msrOtherElements.h" - -#include "msrTies.h" -#include "msrSlurs.h" -#include "msrLigatures.h" - -#include "msrSingleTremolos.h" - -#include "msrSlashes.h" - -#include "msrPartGroups.h" - -#include "msrScores.h" - -#include "msrMidi.h" - -#include "generalOah.h" - - -namespace MusicXML2 -{ - -/* - This file declares classes that cannot be placed in 'individual' headers - due to mutual dependencies, which C++ requires to be in one and the same file. - - It includes the corresponding msr*_MUT_DEP.h files, - which are meant to be included only in this one. -*/ - -//______________________________________________________________________________ -// PRE-declarations for class mutual dependencies - -class msrNote; -typedef SMARTP S_msrNote; - -class msrChord; -typedef SMARTP S_msrChord; - -class msrTuplet; -typedef SMARTP S_msrTuplet; - -class msrGraceNotesGroup; -typedef SMARTP S_msrGraceNotesGroup; - -class msrAfterGraceNotesGroup; -typedef SMARTP S_msrAfterGraceNotesGroup; - -class msrHarmony; -typedef SMARTP S_msrHarmony; - -class msrFiguredBass; -typedef SMARTP S_msrFiguredBass; - -class msrRestMeasures; -typedef SMARTP S_msrRestMeasures; - -class msrMeasuresRepeat; -typedef SMARTP S_msrMeasuresRepeat; - -class msrBeatsRepeat; -typedef SMARTP S_msrBeatsRepeat; - -class msrRepeat; -typedef SMARTP S_msrRepeat; - -class msrMeasure; -typedef SMARTP S_msrMeasure; - -class msrSegment; -typedef SMARTP S_msrSegment; - -class msrVoice; -typedef SMARTP S_msrVoice; - -class msrVoiceStaffChange; -typedef SMARTP S_msrVoiceStaffChange; - -class msrPart; -typedef SMARTP S_msrPart; - -class msrStanza; -typedef SMARTP S_msrStanza; - - -//______________________________________________________________________________ - -#include "msrOrnaments_MUT_DEP.h" - -#include "msrDoubleTremolos_MUT_DEP.h" - -#include "msrSpanners_MUT_DEP.h" - -#include "msrMeasures_MUT_DEP.h" - -#include "msrSegments_MUT_DEP.h" - -#include "msrGraceNotes_MUT_DEP.h" - -#include "msrAfterGraceNotes_MUT_DEP.h" - -#include "msrSyllables_MUT_DEP.h" - -#include "msrHarmonies_MUT_DEP.h" - -#include "msrFiguredBasses_MUT_DEP.h" - -#include "msrGlissandos_MUT_DEP.h" - -#include "msrSlides_MUT_DEP.h" - -#include "msrNotes_MUT_DEP.h" - -#include "msrChords_MUT_DEP.h" - -#include "msrTuplets_MUT_DEP.h" - -#include "msrStanzas_MUT_DEP.h" - -#include "msrRepeats_MUT_DEP.h" - -#include "msrMeasuresRepeats_MUT_DEP.h" - -#include "msrRestMeasures_MUT_DEP.h" - -#include "msrBeatsRepeats_MUT_DEP.h" - -#include "msrRepeatCodas_MUT_DEP.h" - -//______________________________________________________________________________ -// PRE-declarations for class mutual dependencies -class msrStaff; -typedef SMARTP S_msrStaff; - - -#include "msrVoices_MUT_DEP.h" - -#include "msrStaves_MUT_DEP.h" - - -//______________________________________________________________________________ -// PRE-declarations for class mutual dependencies -class msrPartGroup; -typedef SMARTP S_msrPartGroup; - -class msrScore; -typedef SMARTP S_msrScore; - - -#include "msrParts_MUT_DEP.h" - -} - -#endif diff --git a/src/lilypond/msrNotes.cpp b/src/lilypond/msrNotes.cpp deleted file mode 100644 index d9dacdc20..000000000 --- a/src/lilypond/msrNotes.cpp +++ /dev/null @@ -1,5220 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrNote msrNote::create ( - int inputLineNumber, - string noteMeasureNumber, - - msrNoteKind noteKind, - - msrQuarterTonesPitchKind noteQuarterTonesPitchKind, - - rational noteSoundingWholeNotes, - rational noteDisplayWholeNotes, - - int noteDotsNumber, - - msrDurationKind noteGraphicDurationKind, - - int noteOctave, - - msrQuarterTonesPitchKind noteQuarterTonesDisplayPitchKind, - int noteDisplayOctave, - - bool noteIsARest, - bool noteIsUnpitched, - - bool noteIsACueNote, - bool noteIsAGraceNote, - - msrPrintObjectKind notePrintObjectKind, - - msrNoteHeadKind noteHeadKind, - msrNoteHeadFilledKind noteHeadFilledKind, - msrNoteHeadParenthesesKind noteHeadParenthesesKind) -{ - msrNote * o = - new msrNote ( - inputLineNumber, - noteMeasureNumber, - - noteKind, - - noteQuarterTonesPitchKind, - - noteSoundingWholeNotes, - noteDisplayWholeNotes, - - noteDotsNumber, - - noteGraphicDurationKind, - - noteOctave, - - noteQuarterTonesDisplayPitchKind, - noteDisplayOctave, - - noteIsARest, - noteIsUnpitched, - - noteIsACueNote, - noteIsAGraceNote, - - notePrintObjectKind, - - noteHeadKind, - noteHeadFilledKind, - noteHeadParenthesesKind); - assert(o!=0); - - return o; -} - -msrNote::msrNote ( - int inputLineNumber, - string noteMeasureNumber, - - msrNoteKind noteKind, - - msrQuarterTonesPitchKind noteQuarterTonesPitchKind, - - rational noteSoundingWholeNotes, - rational noteDisplayWholeNotes, - - int noteDotsNumber, - - msrDurationKind noteGraphicDurationKind, - - int noteOctave, - - msrQuarterTonesPitchKind noteQuarterTonesDisplayPitchKind, - int noteDisplayOctave, - - bool noteIsARest, - bool noteIsUnpitched, - - bool noteIsACueNote, - bool noteIsAGraceNote, - - msrPrintObjectKind notePrintObjectKind, - - msrNoteHeadKind noteHeadKind, - msrNoteHeadFilledKind noteHeadFilledKind, - msrNoteHeadParenthesesKind noteHeadParenthesesKind) - : msrTupletElement (inputLineNumber), - fNoteColor ("", "") -{ - fMeasureElementMeasureNumber = noteMeasureNumber; - - // basic note description - fNoteKind = noteKind; - - fNoteQuarterTonesPitchKind = noteQuarterTonesPitchKind; - - fMeasureElementSoundingWholeNotes = noteSoundingWholeNotes; - fNoteDisplayWholeNotes = noteDisplayWholeNotes; - - fNoteDotsNumber = noteDotsNumber; - - fNoteGraphicDurationKind = noteGraphicDurationKind; - - fNoteOctave = noteOctave; - - fNoteQuarterTonesDisplayPitchKind = noteQuarterTonesDisplayPitchKind; - fNoteDisplayOctave = noteDisplayOctave; - - fNoteIsARest = noteIsARest; - fNoteIsUnpitched = noteIsUnpitched; - - fNoteIsACueNote = noteIsACueNote; - fNoteIsAGraceNote = noteIsAGraceNote; - - fNotePrintObjectKind = notePrintObjectKind; - - fNoteHeadKind = noteHeadKind; - fNoteHeadFilledKind = noteHeadFilledKind; - fNoteHeadParenthesesKind = noteHeadParenthesesKind; - - // do other initializations - initializeNote (); -} - -void msrNote::initializeNote () -{ - // rests handling - // ------------------------------------------------------ - - if (fNoteIsARest && fNoteDisplayOctave != K_NO_OCTAVE) { - // this note is a pitched rest: - // copy the display octave to the the note octave, // JMI - // to be used in octave relative code generation - fNoteQuarterTonesPitchKind = fNoteQuarterTonesDisplayPitchKind; - fNoteOctave = fNoteDisplayOctave; - } - - // note accidentals - // ------------------------------------------------------ - - fNoteAccidentalKind = - msrNote::kNoteAccidentalNone; // default value - - fNoteEditorialAccidentalKind = - msrNote::kNoteEditorialAccidentalNo; // default value - - fNoteCautionaryAccidentalKind = - msrNote::kNoteCautionaryAccidentalNo; // default value - - // note context - // ------------------------------------------------------ - - fNoteStaffNumber = 0; - fNoteVoiceNumber = 0; - - fNoteBelongsToAChord = false; - fNoteBelongsToATuplet = false; - fNoteOccupiesAFullMeasure = false; - - // note lyrics - // ------------------------------------------------------ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - gLogOstream << - endl << - "Initializing a note" << - ", kind: "; - if (fNoteKind == k_NoNoteKind) - gLogOstream << - "not yet known"; - else - gLogOstream << - noteKindAsString (fNoteKind); - gLogOstream << - ", line " << fInputLineNumber << ":" << - endl; - - gIndenter++; - - const int fieldWidth = 30; - - gLogOstream << - left << - setw (fieldWidth) << - "fNoteQuarterTonesPitch" << " = " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fNoteQuarterTonesPitchKind) << - endl; - - gLogOstream << - left << - setw (fieldWidth) << - "fMeasureElementSoundingWholeNotes" << " = " << - fMeasureElementSoundingWholeNotes << - endl; - - gLogOstream << - left << - setw (fieldWidth) << - "fNoteDisplayWholeNotes" << " = " << - fNoteDisplayWholeNotes << - endl; - - gLogOstream << - left << - setw (fieldWidth) << - "fNoteDotsNumber" << " = " << - fNoteDotsNumber << - endl << - - left << - setw (fieldWidth) << - "fNoteGraphicDuration" << " = "; - if (fNoteGraphicDurationKind != k_NoDuration) { - gLogOstream << - msrDurationKindAsString ( - fNoteGraphicDurationKind); - } - else { - gLogOstream << "none"; - } - - gLogOstream << - endl << - - left << - setw (fieldWidth) << - "fNoteOctave" << " = " << - fNoteOctave << - endl << - - left << - setw (fieldWidth) << - "fNoteDisplayOctave" << " = " << - fNoteDisplayOctave << - endl << - - left << - setw (fieldWidth) << - "fNoteIsARest" << " = " << - booleanAsString (fNoteIsARest) << - endl << - left << - setw (fieldWidth) << - "fNoteIsUnpitched" << " = " << - booleanAsString (fNoteIsUnpitched) << - endl << - - left << - setw (fieldWidth) << - "fNoteIsACueNote" << " = " << - booleanAsString (fNoteIsACueNote) << - endl << - left << - setw (fieldWidth) << - "fNoteIsAGraceNote" << " = " << - booleanAsString (fNoteIsAGraceNote) << - endl << - - left << - setw (fieldWidth) << - "fNotePrintObjectKind" << " = " << - msrPrintObjectKindAsString (fNotePrintObjectKind) << - endl << - - left << - setw (fieldWidth) << - "fNoteHeadKind" << " = " << - noteHeadKindAsString (fNoteHeadKind) << - endl << - left << - setw (fieldWidth) << - "fNoteHeadFilledKind" << " = " << - noteHeadFilledKindAsString (fNoteHeadFilledKind) << - endl << - left << - setw (fieldWidth) << - "fNoteHeadParenthesesKind" << " = " << - noteHeadParenthesesKindAsString (fNoteHeadParenthesesKind) << - endl << - - left << - setw (fieldWidth) << - "fNoteAccidentalKind" << " = " << - noteAccidentalKindAsString ( - fNoteAccidentalKind) << - endl << - left << - setw (fieldWidth) << - "fNoteEditorialAccidentalKind" << " = " << - noteEditorialAccidentalKindAsString ( - fNoteEditorialAccidentalKind) << - endl << - left << - setw (fieldWidth) << - "fNoteCautionaryAccidentalKind" << " = " << - noteCautionaryAccidentalKindAsString ( - fNoteCautionaryAccidentalKind) << - endl << - - left << - setw (fieldWidth) << - "fStaffNumber" << " = " << - fNoteStaffNumber << - endl << - left << - setw (fieldWidth) << - "fNoteVoiceNumber" << " = " << - fNoteVoiceNumber << - endl << - - left << - setw (fieldWidth) << - "fNoteBelongsToAChord" << " = " << - booleanAsString (fNoteBelongsToAChord) << - endl << - - left << - setw (fieldWidth) << - "fNoteBelongsToATuplet" << " = " << - booleanAsString (fNoteBelongsToATuplet) << - endl << - endl << - - left << - setw (fieldWidth) << - "fNoteOccupiesAFullMeasure" << " = " << - booleanAsString (fNoteOccupiesAFullMeasure) << - endl << - endl; - - gIndenter--; - } -#endif - - // note measure information - // ------------------------------------------------------ - - fNoteOccupiesAFullMeasure = false; - - // note redundant information (for speed) - // ------------------------------------------------------ - - fNoteIsStemless = false; - - fNoteIsAChordsFirstMemberNote = false; - - fNoteIsAChordsFirstMemberNote = false; - - fNoteIsFirstNoteInADoubleTremolo = false; - fNoteIsSecondNoteInADoubleTremolo = false; - - fNoteIsFollowedByGraceNotesGroup = false; -} - -msrNote::~msrNote () -{} - -void msrNote::setNoteKind (msrNoteKind noteKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Setting the kind of note '" << - asString () << - "' to '" << - noteKindAsString (noteKind) << - "'" << - endl; - } -#endif - - fNoteKind = noteKind; -} - -void msrNote::setNoteSoundingWholeNotes ( - rational wholeNotes) -{ -// JMI fNoteSoundingWholeNotes = wholeNotes; - fMeasureElementSoundingWholeNotes = wholeNotes; - - // is wholeNotes the shortest one in this voice? -/* JMI - if (fNoteSoundingWholeNotes < fVoiceShortestNoteDuration) { - fVoiceShortestNoteDuration = fNoteSoundingWholeNotes; - } - */ -} - -void msrNote::setNoteDisplayWholeNotes ( - rational wholeNotes) -{ - fNoteDisplayWholeNotes = wholeNotes; - -/* JMI - // is wholeNotes the shortest one in this voice? - if (fNoteDisplayWholeNotes < fVoiceShortestNoteDuration) { - fVoiceShortestNoteDuration = fNoteDisplayWholeNotes; - } - */ -} - -S_msrNote msrNote::createNoteNewbornClone ( - S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Creating a newborn clone of note '" << - asString () << - "' in part " << - containingPart-> - getPartCombinedName () << - endl; - } -#endif - - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - - S_msrNote - newbornClone = - msrNote::create ( - fInputLineNumber, - fMeasureElementMeasureNumber, - - fNoteKind, - - fNoteQuarterTonesPitchKind, - - fMeasureElementSoundingWholeNotes, - fNoteDisplayWholeNotes, - - fNoteDotsNumber, - - fNoteGraphicDurationKind, - - fNoteOctave, - - fNoteQuarterTonesDisplayPitchKind, - fNoteDisplayOctave, - - fNoteIsARest, - fNoteIsUnpitched, - - fNoteIsACueNote, - fNoteIsAGraceNote, - - fNotePrintObjectKind, - - fNoteHeadKind, - fNoteHeadFilledKind, - fNoteHeadParenthesesKind); - - // basic note description - // ------------------------------------------------------ - - newbornClone->fNoteOctaveShift = - fNoteOctaveShift; - - // note print kind - // ------------------------------------------------------ - - newbornClone->fNotePrintObjectKind = - fNotePrintObjectKind; - - // note head - // ------------------------------------------------------ - - newbornClone->fNoteHeadKind = - fNoteHeadKind; - newbornClone->fNoteHeadFilledKind = - fNoteHeadFilledKind; - newbornClone->fNoteHeadParenthesesKind = - fNoteHeadParenthesesKind; - - // accidentals - // ------------------------------------------------------ - - newbornClone->fNoteAccidentalKind = - fNoteAccidentalKind; - - newbornClone->fNoteEditorialAccidentalKind = - fNoteEditorialAccidentalKind; - - newbornClone->fNoteCautionaryAccidentalKind = - fNoteCautionaryAccidentalKind; - - // staff and voice context - // ------------------------------------------------------ - - newbornClone-> - fNoteStaffNumber = - fNoteStaffNumber; - newbornClone-> - fNoteVoiceNumber = - fNoteVoiceNumber; - - // chord member? - // ------------------------------------------------------ - - newbornClone-> - fNoteBelongsToAChord = - fNoteBelongsToAChord; - - // tuplet member? - // ------------------------------------------------------ - - newbornClone-> - fNoteBelongsToATuplet = - fNoteBelongsToATuplet; - - // note measure information - // ------------------------------------------------------ - - newbornClone-> - fNoteOccupiesAFullMeasure = - fNoteOccupiesAFullMeasure; - - // multiple rest member? - // ------------------------------------------------------ - - newbornClone-> - fNoteBelongsToARestMeasures = - fNoteBelongsToARestMeasures; - - newbornClone-> - fNoteRestMeasuresSequenceNumber = - fNoteRestMeasuresSequenceNumber; - - // note lyrics - // ------------------------------------------------------ - - // stem - // ------------------------------------------------------ - - newbornClone->fNoteStem = // JMI - // share this data - fNoteStem; - - // beams - // ------------------------------------------------------ - - // articulations - // ------------------------------------------------------ - - // technicals - // ------------------------------------------------------ - - // ornaments - // ------------------------------------------------------ - - // single tremolo - // ------------------------------------------------------ - - // tie - // ------------------------------------------------------ - - newbornClone->fNoteTie = // JMI - // share this data - fNoteTie; - - // dynamics - // ------------------------------------------------------ - - // words - // ------------------------------------------------------ - - // slurs - // ------------------------------------------------------ - - // ligatures - // ------------------------------------------------------ - - // harmony - // ------------------------------------------------------ - -/* JMI - newbornClone->fNoteHarmony = // JMI - fNoteHarmony; - - // frame - // ------------------------------------------------------ - - newbornClone->fNoteFrame = // JMI - fNoteFrame; - - // figured bass - // ------------------------------------------------------ - - newbornClone->fNoteFiguredBass = // JMI - fNoteFiguredBass; - - // note measure information - // ------------------------------------------------------ - - newbornClone-> - fNoteOccupiesAFullMeasure = - fNoteOccupiesAFullMeasure; -*/ - - // note redundant information (for speed) - // ------------------------------------------------------ - - newbornClone->fNoteIsStemless = - fNoteIsStemless; - - newbornClone->fNoteIsAChordsFirstMemberNote = - fNoteIsAChordsFirstMemberNote; - - newbornClone->fNoteIsFirstNoteInADoubleTremolo = - fNoteIsFirstNoteInADoubleTremolo; - newbornClone->fNoteIsSecondNoteInADoubleTremolo = - fNoteIsSecondNoteInADoubleTremolo; - - newbornClone->fNoteTrillOrnament = - fNoteTrillOrnament; - newbornClone->fNoteIsFollowedByGraceNotesGroup = - fNoteIsFollowedByGraceNotesGroup; - - newbornClone->fNoteDashesOrnament = - fNoteDashesOrnament; - - newbornClone->fNoteWavyLineSpannerStart = - fNoteWavyLineSpannerStart; - newbornClone->fNoteWavyLineSpannerStop = - fNoteWavyLineSpannerStop; - - newbornClone->fNoteDelayedTurnOrnament = - fNoteDelayedTurnOrnament; - newbornClone->fNoteDelayedInvertedTurnOrnament = - fNoteDelayedInvertedTurnOrnament; - - // note color - // ------------------------------------------------------ - - newbornClone->fNoteColor = - fNoteColor; - - // upLinks - // ------------------------------------------------------ - - /* JMI - S_msrTuplet fNoteTupletUpLink; - - S_msrMeasure fNoteMeasureUpLink; -*/ - - return newbornClone; -} - -S_msrNote msrNote::createNoteDeepCopy ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Creating a deep copy of note " << - asString () << - /* JMI - " in part " << - containingPart-> - getPartCombinedName () << - */ - endl; - } -#endif - -/* JMI - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - */ - - S_msrNote - noteDeepCopy = - msrNote::create ( - fInputLineNumber, - fMeasureElementMeasureNumber, - - fNoteKind, - - fNoteQuarterTonesPitchKind, - - fMeasureElementSoundingWholeNotes, - fNoteDisplayWholeNotes, - - fNoteDotsNumber, - - fNoteGraphicDurationKind, - - fNoteOctave, - - fNoteQuarterTonesDisplayPitchKind, - fNoteDisplayOctave, - - fNoteIsARest, - fNoteIsUnpitched, - - fNoteIsACueNote, - fNoteIsAGraceNote, - - fNotePrintObjectKind, - - fNoteHeadKind, - fNoteHeadFilledKind, - fNoteHeadParenthesesKind); - - // basic note description - // ------------------------------------------------------ - - noteDeepCopy->fNoteOctaveShift = // JMI - fNoteOctaveShift; - - // note print kind - // ------------------------------------------------------ - - noteDeepCopy->fNotePrintObjectKind = - fNotePrintObjectKind; - - // note head - // ------------------------------------------------------ - - noteDeepCopy->fNoteHeadKind = - fNoteHeadKind; - noteDeepCopy->fNoteHeadFilledKind = - fNoteHeadFilledKind; - noteDeepCopy->fNoteHeadParenthesesKind = - fNoteHeadParenthesesKind; - - // accidentals - // ------------------------------------------------------ - - noteDeepCopy->fNoteAccidentalKind = - fNoteAccidentalKind; - - noteDeepCopy->fNoteEditorialAccidentalKind = - fNoteEditorialAccidentalKind; - - noteDeepCopy->fNoteCautionaryAccidentalKind = - fNoteCautionaryAccidentalKind; - - // staff and voice context - // ------------------------------------------------------ - - noteDeepCopy-> - fNoteStaffNumber = - fNoteStaffNumber; - noteDeepCopy-> - fNoteVoiceNumber = - fNoteVoiceNumber; - - // chord member? - // ------------------------------------------------------ - - noteDeepCopy-> - fNoteBelongsToAChord = - fNoteBelongsToAChord; - - // tuplet member? - // ------------------------------------------------------ - - noteDeepCopy-> - fNoteBelongsToATuplet = - fNoteBelongsToATuplet; - - // note measure information - // ------------------------------------------------------ - - noteDeepCopy-> - fNoteOccupiesAFullMeasure = - fNoteOccupiesAFullMeasure; - - // multiple rest member? - // ------------------------------------------------------ - - noteDeepCopy-> - fNoteBelongsToARestMeasures = - fNoteBelongsToARestMeasures; - - noteDeepCopy-> - fNoteRestMeasuresSequenceNumber = - fNoteRestMeasuresSequenceNumber; - - // note lyrics - // ------------------------------------------------------ - -/* JMI - { - list::const_iterator i; - for (i=fNoteSyllables.begin (); i!=fNoteSyllables.end (); i++) { - // share this data - noteDeepCopy-> - fNoteSyllables.push_back ((*i)); - } // for - } -*/ - - // stem - // ------------------------------------------------------ - - noteDeepCopy->fNoteStem = // JMI - // share this data - fNoteStem; - - // beams - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteBeams.begin (); i!=fNoteBeams.end (); i++) { - // share this data - noteDeepCopy-> - fNoteBeams.push_back ((*i)); - } // for - } - - // articulations - // ------------------------------------------------------ - - for ( - list::const_iterator i= - fNoteArticulations.begin (); - i!=fNoteArticulations.end (); - i++ - ) { - // share this data - noteDeepCopy-> - fNoteArticulations.push_back ((*i)); - } // for - - // spanners - // ------------------------------------------------------ - - for ( - list::const_iterator i= - fNoteSpanners.begin (); - i!=fNoteSpanners.end (); - i++ - ) { - // share this data - noteDeepCopy-> - fNoteSpanners.push_back ((*i)); - } // for - - // technicals - // ------------------------------------------------------ - - { - list::const_iterator i; - for ( - i=fNoteTechnicals.begin (); - i!=fNoteTechnicals.end (); - i++ - ) { - // share this data - noteDeepCopy-> - fNoteTechnicals.push_back ((*i)); - } // for - } - - { - list::const_iterator i; - for ( - i=fNoteTechnicalWithIntegers.begin (); - i!=fNoteTechnicalWithIntegers.end (); - i++ - ) { - // share this data - noteDeepCopy-> - fNoteTechnicalWithIntegers.push_back ((*i)); - } // for - } - - { - list::const_iterator i; - for ( - i=fNoteTechnicalWithStrings.begin (); - i!=fNoteTechnicalWithStrings.end (); - i++ - ) { - // share this data - noteDeepCopy-> - fNoteTechnicalWithStrings.push_back ((*i)); - } // for - } - - // ornaments - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteOrnaments.begin (); i!=fNoteOrnaments.end (); i++) { - // share this data - noteDeepCopy-> - fNoteOrnaments.push_back ((*i)); - } // for - } - - // glissandos - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteGlissandos.begin (); i!=fNoteGlissandos.end (); i++) { - // share this data - noteDeepCopy-> - fNoteGlissandos.push_back ((*i)); - } // for - } - - // slides - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteSlides.begin (); i!=fNoteSlides.end (); i++) { - // share this data - noteDeepCopy-> - fNoteSlides.push_back ((*i)); - } // for - } - - // grace notes - // ------------------------------------------------------ - - noteDeepCopy->fNoteGraceNotesGroupBefore = - fNoteGraceNotesGroupBefore; - noteDeepCopy->fNoteGraceNotesGroupAfter = - fNoteGraceNotesGroupAfter; - -/* JMI - // after grace notes - // ------------------------------------------------------ - - noteDeepCopy->fNoteAfterGraceNotesGroup = - fNoteAfterGraceNotesGroup; -*/ - - // single tremolo - // ------------------------------------------------------ - - noteDeepCopy->fNoteSingleTremolo = - fNoteSingleTremolo; - - // tie - // ------------------------------------------------------ - - noteDeepCopy->fNoteTie = // JMI - // share this data - fNoteTie; - - // dynamics - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteDynamics.begin (); i!=fNoteDynamics.end (); i++) { - // share this data - noteDeepCopy-> - fNoteDynamics.push_back ((*i)); - } // for - } - - { - list::const_iterator i; - for (i=fNoteOtherDynamics.begin (); i!=fNoteOtherDynamics.end (); i++) { - // share this data - noteDeepCopy-> - fNoteOtherDynamics.push_back ((*i)); - } // for - } - - // slashes - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteSlashes.begin (); i!=fNoteSlashes.end (); i++) { - // share this data - noteDeepCopy-> - fNoteSlashes.push_back ((*i)); - } // for - } - - // wedges - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteWedges.begin (); i!=fNoteWedges.end (); i++) { - // share this data - noteDeepCopy-> - fNoteWedges.push_back ((*i)); - } // for - } - - // eyeglasses - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteEyeGlasses.begin (); i!=fNoteEyeGlasses.end (); i++) { - // share this data - noteDeepCopy-> - fNoteEyeGlasses.push_back ((*i)); - } // for - } - - // damps - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteDamps.begin (); i!=fNoteDamps.end (); i++) { - // share this data - noteDeepCopy-> - fNoteDamps.push_back ((*i)); - } // for - } - - // damp alls - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteDampAlls.begin (); i!=fNoteDampAlls.end (); i++) { - // share this data - noteDeepCopy-> - fNoteDampAlls.push_back ((*i)); - } // for - } - - // scordaturas - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteScordaturas.begin (); i!=fNoteScordaturas.end (); i++) { - // share this data - noteDeepCopy-> - fNoteScordaturas.push_back ((*i)); - } // for - } - - // words - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteWords.begin (); i!=fNoteWords.end (); i++) { - // share this data - noteDeepCopy-> - fNoteWords.push_back ((*i)); - } // for - } - - // slurs - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteSlurs.begin (); i!=fNoteSlurs.end (); i++) { - // share this data - noteDeepCopy-> - fNoteSlurs.push_back ((*i)); - } // for - } - - // ligatures - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNoteLigatures.begin (); i!=fNoteLigatures.end (); i++) { - // share this data - noteDeepCopy-> - fNoteLigatures.push_back ((*i)); - } // for - } - - // pedals - // ------------------------------------------------------ - - { - list::const_iterator i; - for (i=fNotePedals.begin (); i!=fNotePedals.end (); i++) { - // share this data - noteDeepCopy-> - fNotePedals.push_back ((*i)); - } // for - } - - // harmony - // ------------------------------------------------------ - -// if (fNoteHarmony) { - noteDeepCopy->fNoteHarmoniesList = // JMI ??? - fNoteHarmoniesList; -// } - - // harmony - // ------------------------------------------------------ - - if (fNoteFrame) { - noteDeepCopy->fNoteFrame = - fNoteFrame; - } - - // figured bass - // ------------------------------------------------------ - - if (fNoteFiguredBass) { - noteDeepCopy->fNoteFiguredBass = - fNoteFiguredBass-> - createFiguredBassDeepCopy (); - // containingVoice->fetchVoicePartUpLink ()); // JMI - } - - // note measure information - // ------------------------------------------------------ - - noteDeepCopy-> - fMeasureElementMeasureNumber = - fMeasureElementMeasureNumber; - noteDeepCopy-> - fMeasureElementPositionInMeasure = - fMeasureElementPositionInMeasure; - - noteDeepCopy-> - fNoteOccupiesAFullMeasure = - fNoteOccupiesAFullMeasure; - - // note redundant information (for speed) - // ------------------------------------------------------ - - noteDeepCopy->fNoteIsStemless = - fNoteIsStemless; - - noteDeepCopy->fNoteIsAChordsFirstMemberNote = - fNoteIsAChordsFirstMemberNote; - - noteDeepCopy->fNoteIsFirstNoteInADoubleTremolo = - fNoteIsFirstNoteInADoubleTremolo; - noteDeepCopy->fNoteIsSecondNoteInADoubleTremolo = - fNoteIsSecondNoteInADoubleTremolo; - - noteDeepCopy->fNoteTrillOrnament = - fNoteTrillOrnament; - noteDeepCopy->fNoteIsFollowedByGraceNotesGroup = - fNoteIsFollowedByGraceNotesGroup; - - noteDeepCopy->fNoteDashesOrnament = - fNoteDashesOrnament; - - noteDeepCopy->fNoteWavyLineSpannerStart = - fNoteWavyLineSpannerStart; - noteDeepCopy->fNoteWavyLineSpannerStop = - fNoteWavyLineSpannerStop; - - noteDeepCopy->fNoteDelayedTurnOrnament = - fNoteDelayedTurnOrnament; - noteDeepCopy->fNoteDelayedInvertedTurnOrnament = - fNoteDelayedInvertedTurnOrnament; - - // note color - // ------------------------------------------------------ - - noteDeepCopy->fNoteColor = - fNoteColor; - - // upLinks - // ------------------------------------------------------ - - /* JMI - - S_msrTuplet fNoteChordUpLink; - - S_msrGraceNotesGroup fNoteGraceNoteGroupUpLink; - - S_msrTuplet fNoteTupletUpLink; - - S_msrMeasure fNoteMeasureUpLink; -*/ - - return noteDeepCopy; -} - -S_msrNote msrNote::createRestNote ( - int inputLineNumber, - string noteMeasureNumber, - rational soundingWholeNotes, - rational displayWholeNotes, - int dotsNumber, - int staffNumber, - int voiceNumber) -{ - msrNote * o = - new msrNote ( - inputLineNumber, - noteMeasureNumber, - - kRestNote, // noteKind - - k_NoQuarterTonesPitch_QTP, - - soundingWholeNotes, - displayWholeNotes, - - dotsNumber, - - k_NoDuration, // noteGraphicDuration - - K_NO_OCTAVE, // noteOctave, - - k_NoQuarterTonesPitch_QTP, // noteDisplayQuarterTonesPitch - K_NO_OCTAVE, // noteDisplayOctave, - - false, // noteIsARest - false, // noteIsUnpitched - - false, // noteIsACueNote - false, // noteIsAGraceNote - - kPrintObjectYes, // JMI - - kNoteHeadNormal, // JMI - kNoteHeadFilledYes, // JMI - kNoteHeadParenthesesNo); // JMI - assert(o!=0); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestNotes) { - gLogOstream << - "Creating rest note '" << - o->asShortString () << - ", line " << inputLineNumber << - endl; - } -#endif - - return o; -} - -S_msrNote msrNote::createSkipNote ( - int inputLineNumber, - string noteMeasureNumber, - rational soundingWholeNotes, - rational displayWholeNotes, - int dotsNumber, - int staffNumber, - int voiceNumber) -{ - msrNote * o = - new msrNote ( - inputLineNumber, - noteMeasureNumber, - - kSkipNote, // noteKind - - k_NoQuarterTonesPitch_QTP, - - soundingWholeNotes, - displayWholeNotes, - - dotsNumber, - - k_NoDuration, // noteGraphicDuration - - K_NO_OCTAVE, // noteOctave, - - k_NoQuarterTonesPitch_QTP, // noteDisplayQuarterTonesPitch - K_NO_OCTAVE, // noteDisplayOctave, - - false, // noteIsARest - false, // noteIsUnpitched - - false, // noteIsACueNote - false, // noteIsAGraceNote - - kPrintObjectYes, // JMI - - kNoteHeadNormal, // JMI - kNoteHeadFilledYes, // JMI - kNoteHeadParenthesesNo); // JMI - assert(o!=0); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSkipNotes) { - gLogOstream << - "Creating skip note '" << - o->asShortString () << - ", line " << inputLineNumber << - endl; - } -#endif - - return o; -} - -//________________________________________________________________________ -S_msrNote msrNote::createNoteFromSemiTonesPitchAndOctave ( - int inputLineNumber, - S_msrSemiTonesPitchAndOctave semiTonesPitchAndOctave) -{ - // sanity check - msrAssert ( - semiTonesPitchAndOctave != nullptr, - "semiTonesPitchAndOctave is null"); - - msrNote * o = - new msrNote ( - inputLineNumber, - K_NO_MEASURE_NUMBER, - - kStandaloneNote, // noteKind - - quarterTonesPitchKindFromSemiTonesPitchKind ( - semiTonesPitchAndOctave->getSemiTonesPitchKind ()), - - rational (0, 1), // soundingWholeNotes, - rational (0, 1), // displayWholeNotes, - - 0, // dotsNumber, - - k_NoDuration, // noteGraphicDuration - - semiTonesPitchAndOctave->getOctave (), // noteOctave, - - k_NoQuarterTonesPitch_QTP, // noteDisplayQuarterTonesPitch - K_NO_OCTAVE, // noteDisplayOctave, - - false, // noteIsARest - false, // noteIsUnpitched - - false, // noteIsACueNote - false, // noteIsAGraceNote - - kPrintObjectNo, // JMI - - kNoteHeadNormal, // JMI - kNoteHeadFilledYes, // JMI - kNoteHeadParenthesesNo); // JMI - assert(o!=0); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesOctaveEntry) { - gLogOstream << - "Creating note '" << - o->asShortString () << - "' from semitones pitch and octave '" << - semiTonesPitchAndOctave->asString () << - "', line " << inputLineNumber << - endl; - } -#endif - - return o; -} - -void msrNote::setNotePositionInMeasure ( - rational positionInMeasure) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Setting note position in measure of " << asString () << - " to '" << - positionInMeasure << - "'" << - endl; - } -#endif - - // JMI if (positionInMeasure.getNumerator () == 60) abort (); - - positionInMeasure.rationalise (); // TEMP ? JMI - - msrMeasureElement::setMeasureElementPositionInMeasure ( - positionInMeasure, - "setNotePositionInMeasure()"); - - // are there harmonies attached to this note? - if (fNoteHarmoniesList.size ()) { - list::const_iterator i; - for (i=fNoteHarmoniesList.begin (); i!=fNoteHarmoniesList.end (); i++) { - // set the harmony position in measure, taking it's offset into account - (*i)-> - setHarmonyPositionInMeasure ( - positionInMeasure); - } // for - } -} - -void msrNote::setNoteOccupiesAFullMeasure () -{ - fNoteOccupiesAFullMeasure = true; - - if (fNoteIsARest) { - // the measure it belongs to is a single-measure rest - fNoteMeasureUpLink-> - setMeasureIsAFullMeasureRest (); - } -} - -string msrNote::noteSoundingWholeNotesAsMsrString () const -{ - string result; - - if (fMeasureElementSoundingWholeNotes.getNumerator () == 0) - result = " (no sounding whole notes)"; - else - result = - wholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes); - - return result; - } - -string msrNote::noteDisplayWholeNotesAsMsrString () const -{ - string result; - - if (fNoteDisplayWholeNotes.getNumerator () == 0) { - result = "(no display whole notes)"; - } - else { - result = - wholeNotesAsMsrString ( - fInputLineNumber, - fNoteDisplayWholeNotes); - } - - return result; -} - -string msrNote::noteKindAsString ( - msrNoteKind noteKind) -{ - string result; - - switch (noteKind) { - case msrNote::k_NoNoteKind: - result = "noNoteKind???"; - break; - - case msrNote::kRestNote: - result = "restNote"; - break; - - case msrNote::kSkipNote: - result = "skipNote"; - break; - - case msrNote::kUnpitchedNote: - result = "unpitchedNote"; - break; - - case msrNote::kStandaloneNote: - result = "standaloneNote"; - break; - - case msrNote::kDoubleTremoloMemberNote: - result = "doubleTremoloMemberNote"; - break; - - case msrNote::kGraceNote: - result = "graceNote"; - break; - - case msrNote::kGraceChordMemberNote: - result = "graceChordMemberNote"; - break; - - case msrNote::kChordMemberNote: - result = "chordMemberNote"; - break; - - case msrNote::kTupletMemberNote: - result = "tupletMemberNote"; - break; - - case msrNote::kGraceTupletMemberNote: - result = "graceTupletMemberNote"; - break; - - case msrNote::kTupletMemberUnpitchedNote: - result = "tupletMemberUnpitchedNote"; - break; - } // switch - - return result; -} - -// accidentals -//______________________________________________________________________________ -string msrNote::noteAccidentalKindAsString ( - msrNoteAccidentalKind noteAccidentalKind) -{ - string result; - - switch (noteAccidentalKind) { - case msrNote::kNoteAccidentalNone: - result = "noteAccidentalNone"; - break; - - case msrNote::kNoteAccidentalSharp: - result = "noteAccidentalSharp"; - break; - case msrNote::kNoteAccidentalNatural: - result = "noteAccidentalNatural"; - break; - case msrNote::kNoteAccidentalFlat: - result = "noteAccidentalFlat"; - break; - case msrNote::kNoteAccidentalDoubleSharp: - result = "noteAccidentalDoubleSharp"; - break; - case msrNote::kNoteAccidentalSharpSharp: - result = "noteAccidentalSharpSharp"; - break; - case msrNote::kNoteAccidentalFlatFlat: - result = "noteAccidentalFlatFlat"; - break; - case msrNote::kNoteAccidentalNaturalSharp: - result = "noteAccidentalNaturalSharp"; - break; - case msrNote::kNoteAccidentalNaturalFlat: - result = "noteAccidentalNaturalFlat"; - break; - case msrNote::kNoteAccidentalQuarterFlat: - result = "noteAccidentalQuarterFlat"; - break; - case msrNote::kNoteAccidentalQuarterSharp: - result = "noteAccidentalQuarterSharp"; - break; - case msrNote::kNoteAccidentalThreeQuartersFlat: - result = "noteAccidentalThreeQuartersFlat"; - break; - case msrNote::kNoteAccidentalThreeQuartersSharp: - result = "noteAccidentalThreeQuartersSharp"; - break; - - case msrNote::kNoteAccidentalSharpDown: - result = "noteAccidentalSharpDown"; - break; - case msrNote::kNoteAccidentalSharpUp: - result = "noteAccidentalSharpUp"; - break; - case msrNote::kNoteAccidentalNaturalDown: - result = "noteAccidentalNaturalDown"; - break; - case msrNote::kNoteAccidentalNaturalUp: - result = "noteAccidentalNaturalUp"; - break; - case msrNote::kNoteAccidentalFlatDown: - result = "noteAccidentalFlatDown"; - break; - case msrNote::kNoteAccidentalFlatUp: - result = "noteAccidentalFlatUp"; - break; - case msrNote::kNoteAccidentalTripleSharp: - result = "noteAccidentalTripleSharp"; - break; - case msrNote::kNoteAccidentalTripleFlat: - result = "noteAccidentalTripleFlat"; - break; - case msrNote::kNoteAccidentalSlashQuarterSharp: - result = "noteAccidentalSlashQuarterSharp"; - break; - case msrNote::kNoteAccidentalSlashSharp: - result = "noteAccidentalSlashSharp"; - break; - case msrNote::kNoteAccidentalSlashFlat: - result = "noteAccidentalSlashFlat"; - break; - case msrNote::kNoteAccidentaldoubleSlashFlat: - result = "noteAccidentaldoubleSlashFlat"; - break; - case msrNote::kNoteAccidentalSharp_1: - result = "noteAccidentalSharp_1"; - break; - case msrNote::kNoteAccidentalSharp_2: - result = "noteAccidentalSharp_2"; - break; - case msrNote::kNoteAccidentalSharp_3: - result = "noteAccidentalSharp_3"; - break; - case msrNote::kNoteAccidentalSharp_5: - result = "noteAccidentalSharp_5"; - break; - case msrNote::kNoteAccidentalFlat_1: - result = "noteAccidentalFlat_1"; - break; - case msrNote::kNoteAccidentalFlat_2: - result = "noteAccidentalFlat_2"; - break; - case msrNote::kNoteAccidentalFlat_3: - result = "noteAccidentalFlat_3"; - break; - case msrNote::kNoteAccidentalFlat_4: - result = "noteAccidentalFlat_4"; - break; - case msrNote::kNoteAccidentalSori: - result = "noteAccidentalSori"; - break; - case msrNote::kNoteAccidentalKoron: - result = "noteAccidentalKoron"; - break; - } // switch - - return result; -} - -string msrNote::noteEditorialAccidentalKindAsString ( - msrNoteEditorialAccidentalKind noteEditorialAccidentalKind) -{ - string result; - - switch (noteEditorialAccidentalKind) { - case msrNote::kNoteEditorialAccidentalYes: - result = "noteEditorialAccidentalYes"; - break; - case msrNote::kNoteEditorialAccidentalNo: - result = "noteEditorialAccidentalNo"; - break; - } // switch - - return result; -} - -string msrNote::noteCautionaryAccidentalKindAsString ( - msrNoteCautionaryAccidentalKind noteCautionaryAccidentalKind) -{ - string result; - - switch (noteCautionaryAccidentalKind) { - case msrNote::kNoteCautionaryAccidentalYes: - result = "noteCautionaryAccidentalYes"; - break; - case msrNote::kNoteCautionaryAccidentalNo: - result = "noteCautionaryAccidentalNo"; - break; - } // switch - - return result; -} - -string msrNote::noteHeadKindAsString ( - msrNoteHeadKind noteHeadKind) -{ - string result; - - switch (noteHeadKind) { - case msrNote::kNoteHeadSlash: - result = "noteHeadSlash"; - break; - case msrNote::kNoteHeadTriangle: - result = "noteHeadTriangle"; - break; - case msrNote::kNoteHeadDiamond: - result = "noteHeadDiamond"; - break; - case msrNote::kNoteHeadSquare: - result = "noteHeadSquare"; - break; - case msrNote::kNoteHeadCross: - result = "noteHeadCross"; - break; - case msrNote::kNoteHeadX: - result = "noteHeadX"; - break; - case msrNote::kNoteHeadCircleX: - result = "noteHeadCircleX"; - break; - case msrNote::kNoteHeadInvertedTriangle: - result = "noteHeadInvertedTriangle"; - break; - case msrNote::kNoteHeadArrowDown: - result = "noteHeadArrowDown"; - break; - case msrNote::kNoteHeadArrowUp: - result = "noteHeadArrowUp"; - break; - case msrNote::kNoteHeadSlashed: - result = "noteHeadSlashed"; - break; - case msrNote::kNoteHeadBackSlashed: - result = "noteHeadBackSlashed"; - break; - case msrNote::kNoteHeadNormal: - result = "noteHeadNormal"; - break; - case msrNote::kNoteHeadCluster: - result = "noteHeadCluster"; - break; - case msrNote::kNoteHeadCircleDot: - result = "noteHeadCircleDot"; - break; - case msrNote::kNoteHeadLeftTriangle: - result = "noteHeadLeftTriangle"; - break; - case msrNote::kNoteHeadRectangle: - result = "noteHeadRectangle"; - break; - case msrNote::kNoteHeadNone: - result = "noteHeadNone"; - break; - case msrNote::kNoteHeadDo: - result = "noteHeadDo"; - break; - case msrNote::kNoteHeadRe: - result = "noteHeadRe"; - break; - case msrNote::kNoteHeadMi: - result = "noteHeadMi"; - break; - case msrNote::kNoteHeadFa: - result = "noteHeadFa"; - break; - case msrNote::kNoteHeadFaUp: - result = "noteHeadFaUp"; - break; - case msrNote::kNoteHeadSo: - result = "noteHeadSo"; - break; - case msrNote::kNoteHeadLa: - result = "noteHeadLa"; - break; - case msrNote::kNoteHeadTi: - result = "noteHeadTi"; - break; - } // switch - - return result; -} - -string msrNote::noteHeadFilledKindAsString ( - msrNoteHeadFilledKind noteHeadFilledKind) -{ - string result; - - switch (noteHeadFilledKind) { - case msrNote::kNoteHeadFilledYes: - result = "noteHeadFilledYes"; - break; - case msrNote::kNoteHeadFilledNo: - result = "noteHeadFilledNo"; - break; - } // switch - - return result; -} - -string msrNote::noteHeadParenthesesKindAsString ( - msrNoteHeadParenthesesKind noteHeadParenthesesKind) -{ - string result; - - switch (noteHeadParenthesesKind) { - case msrNote::kNoteHeadParenthesesYes: - result = "noteHeadParenthesesYes"; - break; - case msrNote::kNoteHeadParenthesesNo: - result = "noteHeadParenthesesNo"; - break; - } // switch - - return result; -} - -string msrNote::notePrintObjectKindAsString () const -{ - return - msrPrintObjectKindAsString ( - fNotePrintObjectKind); -} - -string msrNote::noteHeadKindAsString () const -{ - return - noteHeadKindAsString ( - fNoteHeadKind); -} - -string msrNote::noteHeadFilledKindAsString () const -{ - return - noteHeadFilledKindAsString ( - fNoteHeadFilledKind); -} - -string msrNote::noteHeadParenthesesKindAsString () const -{ - return - noteHeadParenthesesKindAsString ( - fNoteHeadParenthesesKind); -} - -msrDiatonicPitchKind msrNote::noteDiatonicPitchKind ( - int inputLineNumber) const -{ - return - diatonicPitchKindFromQuarterTonesPitchKind ( - inputLineNumber, - fNoteQuarterTonesPitchKind); -} - -string msrNote::noteDisplayOctaveAsString () const -{ - return - fNoteDisplayOctave == K_NO_OCTAVE - ? "no display octave" - : to_string (fNoteDisplayOctave); -} - -bool msrNote::noteIsAPitchedRest () const -{ - return - fNoteIsARest && fNoteDisplayOctave != K_NO_OCTAVE; -} - -void msrNote::setNoteStem (S_msrStem stem) -{ - // register note stem - fNoteStem = stem; - - // mark note as stemless if relevant - if (stem->getStemKind () == msrStem::kStemNone) - fNoteIsStemless = true; -} - -void msrNote::setNoteBelongsToAChord () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Setting note '" << - asShortString () << - "' to belong to a chord" - ", line " << fInputLineNumber << - endl; - } -#endif - - fNoteBelongsToAChord = true; -} - -void msrNote::determineTupletMemberSoundingFromDisplayWholeNotes ( - int actualNotes, int normalNotes) -{ - /* - Type indicates the graphic note type, Valid values (from shortest to longest) are 1024th, 512th, 256th, 128th, 64th, 32nd, 16th, eighth, quarter, half, whole, breve, long, and maxima. The size attribute indicates full, cue, or large size, with full the default for regular notes and cue the default for cue and grace notes. - - Quarter note in a triplet, sounds 2/3 of a quarter: - - - B - 4 - - 20 - 1 - quarter - - 3 - 2 - - - - - - */ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Determining tuplet sounding from display whole notes" << - " for note '" << - asShortString () << - ", factor is '" << - actualNotes << "/" << normalNotes << - "', line " << fInputLineNumber << - endl; - } -#endif - - // the display whole notes are known, compute the sounding ones - fMeasureElementSoundingWholeNotes = - fNoteDisplayWholeNotes - * - normalNotes - / - actualNotes; - fMeasureElementSoundingWholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "The result is: '" << - asShortString () << - endl; - } -#endif -} - -void msrNote::appendBeamToNote (S_msrBeam beam) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeams) { - gLogOstream << - "Adding beam '" << - beam->asShortString () << - "' to note '" << - asString () << - "'" << - endl; - } -#endif - - fNoteBeams.push_back (beam); -} - -void msrNote::appendArticulationToNote (S_msrArticulation art) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceArticulations) { - gLogOstream << - "Adding articulation '" << - art->asShortString () << - "' to note '" << - asString () << - "'" << - endl; - } -#endif - - fNoteArticulations.push_back (art); -} - -void msrNote::appendSpannerToNote (S_msrSpanner spanner) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSpanners) { - gLogOstream << - "Adding spanner '" << - spanner->spannerKindAsString () << - "' to note '" << - asString () << - "'" << - endl; - } -#endif - - // register note has having a wavy line start - switch (spanner->getSpannerKind ()) { - case msrSpanner::kSpannerDashes: - break; - - case msrSpanner::kSpannerWavyLine: - switch (spanner->getSpannerTypeKind ()) { - case kSpannerTypeStart: - fNoteWavyLineSpannerStart = spanner; - break; - case kSpannerTypeStop: - fNoteWavyLineSpannerStop = spanner; - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - // JMI ??? - break; - } // switch - break; - } // switch - - // append spanner to note spanners - fNoteSpanners.push_back (spanner); -} - -void msrNote::appendTechnicalToNote (S_msrTechnical technical) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - gLogOstream << - "Adding technical '" << - technical->asString () << - "' to note '" << asString () << - "', line " << fInputLineNumber << - endl; - } -#endif - - // append the technical to the note technicals list - fNoteTechnicals.push_back (technical); -} - -void msrNote::appendTechnicalWithIntegerToNote ( - S_msrTechnicalWithInteger technicalWithInteger) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - gLogOstream << - "Adding technical with integer '" << - technicalWithInteger->asString () << - "' to note '" << asString () << - "', line " << fInputLineNumber << - endl; - } -#endif - - // append the technical with integer to the note technicals with integers list - fNoteTechnicalWithIntegers.push_back ( - technicalWithInteger); -} - -void msrNote::appendTechnicalWithFloatToNote ( - S_msrTechnicalWithFloat technicalWithFloat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - gLogOstream << - "Adding technical with float '" << - technicalWithFloat->asString () << - "' to note '" << asString () << - "', line " << fInputLineNumber << - endl; - } -#endif - - // append the technical with float to the note technicals with floats list - fNoteTechnicalWithFloats.push_back ( - technicalWithFloat); -} - -void msrNote::appendTechnicalWithStringToNote ( - S_msrTechnicalWithString technicalWithString) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - gLogOstream << - "Adding technical with string'" << - technicalWithString->asString () << - "' to note '" << asString () << - "', line " << fInputLineNumber << - endl; - } -#endif - - // append the technical with string to the note technicals with strings list - fNoteTechnicalWithStrings.push_back ( - technicalWithString); -} - -void msrNote::appendOrnamentToNote (S_msrOrnament ornament) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOrnaments) { - gLogOstream << - "Adding ornament '" << - ornament->asString () << - "' to note '" << - asString () << - "'" << - endl; - } -#endif - - // append the ornament to the note ornaments list - fNoteOrnaments.push_back (ornament); - - switch (ornament->getOrnamentKind ()) { - case msrOrnament::kOrnamentTrill: - fNoteTrillOrnament = ornament; - break; - - case msrOrnament::kOrnamentDashes: - fNoteDashesOrnament = ornament; - break; - - case msrOrnament::kOrnamentDelayedTurn: - fNoteDelayedTurnOrnament = ornament; - break; - - case msrOrnament::kOrnamentDelayedInvertedTurn: - fNoteDelayedInvertedTurnOrnament = ornament; - break; - - default: - {} - } // switch - - // set ornament's note upLink - ornament-> - setOrnamentNoteUpLink (this); -} - -void msrNote::appendGlissandoToNote (S_msrGlissando glissando) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGlissandos) { - gLogOstream << - "Adding glissando '" << - glissando->asShortString () << - "' to note '" << - asString () << - "'" << - endl; - } -#endif - - // append the glissando to the note glissandos list - fNoteGlissandos.push_back (glissando); -} - -void msrNote::appendSlideToNote (S_msrSlide slide) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlides) { - gLogOstream << - "Adding slide '" << - slide->asShortString () << - "' to note '" << - asString () << - "'" << - endl; - } -#endif - - // append the slide to the note glissandos list - fNoteSlides.push_back (slide); -} - -void msrNote::setNoteGraceNotesGroupBefore ( - S_msrGraceNotesGroup graceNotesGroupBefore) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Attaching grace notes group '" << - graceNotesGroupBefore->asString () << - "' before note '" << - asString () << - "', line " << graceNotesGroupBefore->getInputLineNumber () << - endl; - } -#endif - - // register the before grace notes group in the note - fNoteGraceNotesGroupBefore = graceNotesGroupBefore; - - // setup the grace notes group's note upLink - graceNotesGroupBefore-> - setGraceNotesGroupNoteUpLink ( - this); -} - -void msrNote::setNoteGraceNotesGroupAfter ( - S_msrGraceNotesGroup graceNotesGroupAfter) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Attaching grace notes group '" << - graceNotesGroupAfter->asString () << - "' after note '" << - asString () << - "', line " << graceNotesGroupAfter->getInputLineNumber () << - endl; - } -#endif - - // register the after grace notes group in the note - fNoteGraceNotesGroupAfter = graceNotesGroupAfter; - - // setup the grace notes group's note upLink - graceNotesGroupAfter-> - setGraceNotesGroupNoteUpLink ( - this); -} - -/* JMI -void msrNote::setNoteAfterGraceNotesGroup (S_msrGraceNotesGroup afterGraceNotesGroup) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Attaching afterGraceNotesGroup '" << afterGraceNotesGroup->asString () << - "' to note '" << asShortString () << - "', line " << afterGraceNotesGroup->getInputLineNumber () << - endl; - } -#endif - - // register the grace notes in the note - fNoteAfterGraceNotesGroup = afterGraceNotesGroup; -} -*/ - -void msrNote::setNoteSingleTremolo (S_msrSingleTremolo trem) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Adding singleTremolo '" << trem->asString () << - "' to note '" << asString () << - "', line " << trem->getInputLineNumber () << - endl; - } -#endif - - // register the singleTremolo in the note - fNoteSingleTremolo = trem; -} - -void msrNote::appendDynamicsToNote (S_msrDynamics dynamics) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceDynamics) { - gLogOstream << - "Attaching dynamics '" << - dynamics->asString () << - "' to note '" << - asString () << - "', line " << dynamics->getInputLineNumber () << - endl; - } -#endif - - fNoteDynamics.push_back (dynamics); -} -void msrNote::appendOtherDynamicsToNote (S_msrOtherDynamics otherDynamics) -{ - fNoteOtherDynamics.push_back (otherDynamics); -} - -void msrNote::appendWordsToNote (S_msrWords words) -{ - fNoteWords.push_back (words); -} - -void msrNote::appendSlurToNote (S_msrSlur slur) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlurs) { - gLogOstream << - "Adding slur '" << slur << - "' to note '" << asString () << "'" << - endl; - } -#endif - - fNoteSlurs.push_back (slur); -} - -void msrNote::appendLigatureToNote (S_msrLigature ligature) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - gLogOstream << - "Appending ligature " << ligature << " to note " << asString () << - endl; - } -#endif - - if (fNoteLigatures.size ()) { - if ( - fNoteLigatures.back ()->getLigatureKind () == msrLigature::kLigatureStart - && - ligature->getLigatureKind () == msrLigature::kLigatureStop - && - fNoteLigatures.back ()->getLigatureNumber () == ligature->getLigatureNumber () - ) { - // it may happen that a given note has a 'ligature start' - // and a 'ligature stop' in sequence, ignore both - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - stringstream s; - - s << - "a 'ligature start' is immediately followed by a 'ligature stop'" << - endl << - "with the same number, ignoring both of them at line " << - ligature->getInputLineNumber (); - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - ligature->getInputLineNumber (), - s.str ()); - } -#endif - - // remove 'ligature start' -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - gLogOstream << - "Removing last ligature (start) for note '" << - asShortString () << - "'" << - endl; - } -#endif - - fNoteLigatures.pop_back (); - - // don't register 'ligature stop' - } - - else - fNoteLigatures.push_back (ligature); - } - - else - fNoteLigatures.push_back (ligature); -} - -void msrNote::appendPedalToNote (S_msrPedal pedal) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePedals) { - gLogOstream << - "Appending pedal " << pedal << " to note " << asString () << - endl; - } -#endif - - if (fNotePedals.size ()) { - if ( - fNotePedals.back ()->getPedalTypeKind () == msrPedal::kPedalStart - && - pedal->getPedalTypeKind () == msrPedal::kPedalStop - ) { - // it may happen that a given note has a 'pedal start' - // and a 'pedal stop' in sequence, ignore both // JMI ??? - -#ifdef TRACE_OAH - if (gTraceOah->fTracePedals) { - stringstream s; - - s << - "a 'pedal start' is immediately followed by a 'pedal stop'" << - endl << - "with the same number, ignoring both of them at line " << - pedal->getInputLineNumber (); - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - pedal->getInputLineNumber (), - s.str ()); - } -#endif - - // rmeove 'pedal start' -#ifdef TRACE_OAH - if (gTraceOah->fTracePedals) { - gLogOstream << - "Removing last pedal (start) for note '" << - asShortString () << - "'" << - endl; - } -#endif - fNotePedals.pop_back (); - - // don't register 'pedal stop' - } - - else - fNotePedals.push_back (pedal); - } - - else - fNotePedals.push_back (pedal); -} - -void msrNote::appendSlashToNote (S_msrSlash slash) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlashes) { - gLogOstream << - "Appending slash '" << - slash << - "' to note '" << - asShortString () << - "'" << - endl; - } -#endif - - fNoteSlashes.push_back (slash); -} - -void msrNote::appendWedgeToNote (S_msrWedge wedge) -{ - fNoteWedges.push_back (wedge); -} - -void msrNote::appendSegnoToNote (S_msrSegno segno) -{ - fNoteSegnos.push_back (segno); -} - -void msrNote::appendCodaToNote (S_msrCoda coda) -{ - fNoteCodas.push_back (coda); -} - -void msrNote::appendEyeGlassesToNote (S_msrEyeGlasses eyeGlasses) -{ - fNoteEyeGlasses.push_back (eyeGlasses); -} - -void msrNote::appendDampToNote (S_msrDamp damp) -{ - fNoteDamps.push_back (damp); -} - -void msrNote::appendDampAllToNote (S_msrDampAll dampAll) -{ - fNoteDampAlls.push_back (dampAll); -} - -void msrNote::appendScordaturaToNote (S_msrScordatura scordatura) -{ - fNoteScordaturas.push_back (scordatura); -} - -S_msrDynamics msrNote::removeFirstDynamics () // JMI -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceDynamics) { - gLogOstream << - "Removing first dynamics from note '" << - asShortString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert ( - fNoteDynamics.size () > 0, - "fNoteDynamics is empty"); - - S_msrDynamics dyn = fNoteDynamics.front (); - fNoteDynamics.pop_front (); - - return dyn; -} - -S_msrWedge msrNote::removeFirstWedge () // JMI -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceWedges) { - gLogOstream << - "Removing first wedge from note '" << - asShortString () << - endl; - } -#endif - - // sanity check - msrAssert ( - fNoteDynamics.size () > 0, - "fNoteDynamics is empty"); - - S_msrWedge wedge = fNoteWedges.front (); - fNoteWedges.pop_front (); - return wedge; -} - -void msrNote::appendSyllableToNote (S_msrSyllable syllable) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending syllable '" << - syllable->asString () << - "' to note '" << asString () << - "'" << - endl; - } -#endif - - fNoteSyllables.push_back (syllable); -} - -void msrNote::appendNoteToNoteHarmoniesList (S_msrHarmony harmony) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Append harmony " << - harmony->asString () << - " to the harmonies list of " << - asString () << - ", line " << fInputLineNumber << - endl; - } -#endif - - // update the harmony whole notes if it belongs to a tuplet ??? utf8.xml - - fNoteHarmoniesList.push_back (harmony); - - // register this note as the harmony upLink - harmony-> - setHarmonyNoteUpLink (this); -} - -void msrNote::setNoteFrame (S_msrFrame frame) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFrames) { - gLogOstream << - "Setting note '" << asShortString () << "'" << - " frame to '" << frame->asString () << "'" << - endl; - } -#endif - - fNoteFrame = frame; -} - -void msrNote::setNoteFiguredBass (S_msrFiguredBass figuredBass) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Setting note '" << asShortString () << "'" << - " figured bass to '" << figuredBass->asString () << "'" << - endl; - } -#endif - - fNoteFiguredBass = figuredBass; - - // register this note as the figured bass upLink - figuredBass-> - setFiguredBassNoteUpLink (this); -} - -void msrNote::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrNote::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrNote elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrNote::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrNote::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrNote::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrNote elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrNote::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrNote::browseData (basevisitor* v) -{ - if (fNoteOctaveShift) { - // browse the octave shift - msrBrowser browser (v); - browser.browse (*fNoteOctaveShift); - } - - if (fNoteStem) { - // browse the stem - msrBrowser browser (v); - browser.browse (*fNoteStem); - } - - // browse the beams if any - if (fNoteBeams.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteBeams.begin (); i!=fNoteBeams.end (); i++) { - // browse the beam - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the articulations if any - if (fNoteArticulations.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteArticulations.begin (); i!=fNoteArticulations.end (); i++) { - // browse the articulation - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the spanners if any - if (fNoteSpanners.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteSpanners.begin (); i!=fNoteSpanners.end (); i++) { - // browse the spanner - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the technicals if any - if (fNoteTechnicals.size ()) { - gIndenter++; - list::const_iterator i; - for ( - i=fNoteTechnicals.begin (); - i!=fNoteTechnicals.end (); - i++ - ) { - // browse the technical - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the technicals with integer if any - if (fNoteTechnicalWithIntegers.size ()) { - gIndenter++; - list::const_iterator i; - for ( - i=fNoteTechnicalWithIntegers.begin (); - i!=fNoteTechnicalWithIntegers.end (); - i++ - ) { - // browse the technical - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the technicals with float if any - if (fNoteTechnicalWithFloats.size ()) { - gIndenter++; - list::const_iterator i; - for ( - i=fNoteTechnicalWithFloats.begin (); - i!=fNoteTechnicalWithFloats.end (); - i++ - ) { - // browse the technical - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the technicals with string if any - if (fNoteTechnicalWithStrings.size ()) { - gIndenter++; - list::const_iterator i; - for ( - i=fNoteTechnicalWithStrings.begin (); - i!=fNoteTechnicalWithStrings.end (); - i++ - ) { - // browse the technical - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the ornaments if any - if (fNoteOrnaments.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteOrnaments.begin (); i!=fNoteOrnaments.end (); i++) { - // browse the ornament - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the glissandos if any - if (fNoteGlissandos.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteGlissandos.begin (); i!=fNoteGlissandos.end (); i++) { - // browse the glissando - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the slides if any - if (fNoteSlides.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteSlides.begin (); i!=fNoteSlides.end (); i++) { - // browse the glissando - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the grace notes group before if any - if (fNoteGraceNotesGroupBefore) { - // browse the grace notes group - msrBrowser browser (v); - browser.browse (*fNoteGraceNotesGroupBefore); - } - - // browse the after grace notes group after if any - if (fNoteGraceNotesGroupAfter) { - // browse the after grace notes grup - msrBrowser browser (v); - browser.browse (*fNoteGraceNotesGroupAfter); - } - - // browse the single tremolo if any - if (fNoteSingleTremolo) { - // browse the singleTremolo - msrBrowser browser (v); - browser.browse (*fNoteSingleTremolo); - } - - if (fNoteTie) { - // browse the tie - msrBrowser browser (v); - browser.browse (*fNoteTie); - } - - // browse the dynamics if any - if (fNoteDynamics.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteDynamics.begin (); i!=fNoteDynamics.end (); i++) { - // browse the dynamics - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the other dynamics if any - if (fNoteOtherDynamics.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteOtherDynamics.begin (); i!=fNoteOtherDynamics.end (); i++) { - // browse the other dynamics - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the words if any - if (fNoteWords.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteWords.begin (); i!=fNoteWords.end (); i++) { - // browse the words - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the slurs if any - if (fNoteSlurs.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteSlurs.begin (); i!=fNoteSlurs.end (); i++) { - // browse the slur - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the ligatures if any - if (fNoteLigatures.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteLigatures.begin (); i!=fNoteLigatures.end (); i++) { - // browse the ligature - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the pedals if any - if (fNotePedals.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNotePedals.begin (); i!=fNotePedals.end (); i++) { - // browse the pedal - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the wedges if any - if (fNoteSlashes.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteSlashes.begin (); i!=fNoteSlashes.end (); i++) { - // browse the wedge - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the wedges if any - if (fNoteWedges.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteWedges.begin (); i!=fNoteWedges.end (); i++) { - // browse the wedge - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the segnos if any - if (fNoteSegnos.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteSegnos.begin (); i!=fNoteSegnos.end (); i++) { - // browse the segno - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the codas if any - if (fNoteCodas.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteCodas.begin (); i!=fNoteCodas.end (); i++) { - // browse the coda - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the eyeglasses if any - if (fNoteEyeGlasses.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteEyeGlasses.begin (); i!=fNoteEyeGlasses.end (); i++) { - // browse the eyeglasses - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the damps if any - if (fNoteDamps.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteDamps.begin (); i!=fNoteDamps.end (); i++) { - // browse the damp - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the damp alls if any - if (fNoteDampAlls.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteDampAlls.begin (); i!=fNoteDampAlls.end (); i++) { - // browse the damp all - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the scordaturas if any - if (fNoteScordaturas.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteScordaturas.begin (); i!=fNoteScordaturas.end (); i++) { - // browse the scordatura - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } - - // browse the harmonies if any - if (fNoteHarmoniesList.size ()) { - list::const_iterator i; - for (i=fNoteHarmoniesList.begin (); i!=fNoteHarmoniesList.end (); i++) { - // browse the harmony - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } - - if (fNoteFrame) { - // browse the frame - msrBrowser browser (v); - browser.browse (*fNoteFrame); - } - - if (fNoteFiguredBass) { - // browse the figured bass - msrBrowser browser (v); - browser.browse (*fNoteFiguredBass); - } - - // browse the syllables if any - if (fNoteSyllables.size ()) { - gIndenter++; - list::const_iterator i; - for (i=fNoteSyllables.begin (); i!=fNoteSyllables.end (); i++) { - // browse the syllable - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - gIndenter--; - } -} - -string msrNote::notePitchAsString () const -{ - stringstream s; - - if (fNoteIsUnpitched) { - s << "unpitched "; - } - else { - s << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fNoteQuarterTonesPitchKind); - } - - return s.str (); -} - -string msrNote::noteDisplayPitchKindAsString () const -{ - stringstream s; - - s << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fNoteQuarterTonesDisplayPitchKind); - - return s.str (); -} - -string msrNote::noteGraphicDurationAsMsrString () const -{ - string - result = - msrDurationKindAsString ( - fNoteGraphicDurationKind); - - return result; -} - -string msrNote::tupletNoteGraphicDurationAsMsrString ( // JMI - int actualNotes, int normalNotes) const -{ - return - wholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes - * - rational (actualNotes, normalNotes)); -} - -string msrNote::noteDiatonicPitchKindAsString ( - int inputLineNumber) const -{ - return - msrDiatonicPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - noteDiatonicPitchKind ( - fInputLineNumber)); -} - -string msrNote::asShortStringWithRawWholeNotes () const -{ - stringstream s; - - s << "["; - - switch (fNoteKind) { - case msrNote::k_NoNoteKind: - s << - "noNoteKind"; - break; - - case msrNote::kRestNote: - s << - "Rest note" << - " [octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]" << - ":" << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kSkipNote: - s << - "Skip note" << - ":" << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kUnpitchedNote: - s << - notePitchAsString () << - "Unpitched note" << - ":" << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kStandaloneNote: - s << - "Standalone note '" << - notePitchAsString () << - "' " << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]" << - ":" << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kDoubleTremoloMemberNote: - s << - "DoubleTremoloMember note '" << - notePitchAsString () << - "' " << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]" << - ":" << - " whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kGraceNote: - s << - "Grace note '" << - notePitchAsString () << - "' " << - noteGraphicDurationAsMsrString () << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - - for (int i = 0; i < fNoteDotsNumber; i++) { - s << "."; // JMI - } // for - break; - - case msrNote::kGraceChordMemberNote: - s << - "GraceChordMember note '" << - notePitchAsString () << - "' " << - noteGraphicDurationAsMsrString () << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - - for (int i = 0; i < fNoteDotsNumber; i++) { - s << "."; // JMI - } // for - break; - - case msrNote::kChordMemberNote: - s << - "ChordMember note '" << - notePitchAsString () << - "' " << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]" << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kTupletMemberNote: - s << - "TupletMember note '" << - notePitchAsString () << - "' " << - noteGraphicDurationAsMsrString (); - - if (! fNoteIsARest) { - s << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - } - - s << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kGraceTupletMemberNote: - s << - "GraceTupletMember note '" << - notePitchAsString () << - "' " << - noteGraphicDurationAsMsrString (); - - if (! fNoteIsARest) { - s << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - } - - s << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - - case msrNote::kTupletMemberUnpitchedNote: - s << - "TupletMemberUnpitched note " << - noteGraphicDurationAsMsrString () << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - break; - } // switch - - s << - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -string msrNote::asShortString () const -{ - stringstream s; - - s << "["; - - switch (fNoteKind) { - case msrNote::k_NoNoteKind: - s << - "noNoteKind" << - ":" << - noteSoundingWholeNotesAsMsrString (); - break; - - case msrNote::kRestNote: - s << - "RestNote" << - ":" << - noteSoundingWholeNotesAsMsrString (); - break; - - case msrNote::kSkipNote: - s << - "SkipNote" << - ":" << - noteSoundingWholeNotesAsMsrString (); - break; - - case msrNote::kUnpitchedNote: - s << - "UnpitchedNote" << - ":" << - noteSoundingWholeNotesAsMsrString (); - break; - - case msrNote::kStandaloneNote: - s << - "StandaloneNote '" << - notePitchAsString () << - noteSoundingWholeNotesAsMsrString () << - "' [octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - break; - - case msrNote::kDoubleTremoloMemberNote: - s << - "DoubleTremoloMemberNote '" << - notePitchAsString () << - noteSoundingWholeNotesAsMsrString () << - "' [octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - break; - - case msrNote::kGraceNote: - s << - "GraceNote '" << - notePitchAsString () << - noteGraphicDurationAsMsrString () << - "' [octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - - for (int i = 0; i < fNoteDotsNumber; i++) { - s << "."; // JMI - } // for - break; - - case msrNote::kGraceChordMemberNote: - s << - "TraceChordMemberNote '" << - notePitchAsString () << - noteGraphicDurationAsMsrString () << - "' [octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - - for (int i = 0; i < fNoteDotsNumber; i++) { - s << "."; // JMI - } // for - break; - - case msrNote::kChordMemberNote: - s << - "ChordMemberNote '" << - notePitchAsString () << - noteSoundingWholeNotesAsMsrString () << - "' [octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - break; - - case msrNote::kTupletMemberNote: - s << - "TupletMemberNote" << - ":" << - notePitchAsString () << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " display"; - /* JMI - notePartUpLink ()-> - tupletSoundingWholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes, - fNoteTupletUpLink->getTupletActualNotes (), - fNoteTupletUpLink->getTupletNormalNotes ()); - */ - - if (! fNoteIsARest) { - s << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - } - break; - case msrNote::kGraceTupletMemberNote: - s << - "GraceTupletMemberNote" << - ":" << - notePitchAsString () << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " display"; - /* JMI - notePartUpLink ()-> - tupletSoundingWholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes, - fNoteTupletUpLink->getTupletActualNotes (), - fNoteTupletUpLink->getTupletNormalNotes ()); - */ - - if (! fNoteIsARest) { - s << - "[octave: " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - } - break; - - case msrNote::kTupletMemberUnpitchedNote: - s << - "TupletMemberUnpitchedNote" << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; - /* JMI - notePartUpLink ()-> - tupletSoundingWholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes, - fNoteTupletUpLink->getTupletActualNotes (), - fNoteTupletUpLink->getTupletNormalNotes ()); - */ - break; - } // switch - - s << - ", line " << fInputLineNumber << - "]"; - - return s.str (); -} - -string msrNote::asString () const -{ - stringstream s; - - s << - "[=== "; - - switch (fNoteKind) { - case msrNote::k_NoNoteKind: - s << - "noNoteKind???"; - break; - - case msrNote::kRestNote: - s << - "restNote, "; - if (fNoteOccupiesAFullMeasure) { - s << - "R" << - /* JMI - multipleRestMeasuresWholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes); - */ - noteSoundingWholeNotesAsMsrString (); - } - else { - s << - "r" << - noteSoundingWholeNotesAsMsrString (); - } - - s << - " (" << - noteDisplayPitchKindAsString () << - noteSoundingWholeNotesAsMsrString () << - ", octave" " "<< noteDisplayOctaveAsString () << - ")" << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed" << - ":" << - noteSoundingWholeNotesAsMsrString (); - break; - - case msrNote::kSkipNote: - s << - "skipNote:" << - noteSoundingWholeNotesAsMsrString (); - break; - - case msrNote::kUnpitchedNote: - s << - "unpitchedNote"<< - " " << - noteSoundingWholeNotesAsMsrString (); - break; - - case msrNote::kStandaloneNote: - s << - "standaloneNote '"<< - notePitchAsString () << - /* JMI - "', " << - noteDiatonicPitchKindAsString ( - noteDiatonicPitchKind (fInputLineNumber)) << - "', " << - */ - noteSoundingWholeNotesAsMsrString () << - "', [octave " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - break; - - case msrNote::kDoubleTremoloMemberNote: - s << - "doubleTremoloMemberNote '"<< - notePitchAsString () << - noteSoundingWholeNotesAsMsrString () << - "' [octave" " " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - break; - - case msrNote::kGraceNote: - s << - "graceNote '"<< - notePitchAsString () << - // JMI noteGraphicDurationAsMsrString () << - noteDisplayWholeNotesAsMsrString () << - "' [octave" " " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - - for (int i = 0; i < fNoteDotsNumber; i++) { - s << "."; // JMI - } // for - break; - - case msrNote::kGraceChordMemberNote: - s << - "graceChordMemberNote '"<< - notePitchAsString () << -// " " << - // JMI noteGraphicDurationAsMsrString () << - noteDisplayWholeNotesAsMsrString () << - "' [octave" " " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - - for (int i = 0; i < fNoteDotsNumber; i++) { - s << "."; // JMI - } // for - break; - - case msrNote::kChordMemberNote: - s << - "chordMemberNote '"<< - notePitchAsString () << - noteSoundingWholeNotesAsMsrString () << - // JMI ", " << fMeasureElementSoundingWholeNotes << " sounding whole notes, " << - "' [octave" " " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - break; - - case msrNote::kTupletMemberNote: - s << - "tupletMemberNote '"<< - notePitchAsString () << - fMeasureElementSoundingWholeNotes << - "' sounding, " << - fNoteDisplayWholeNotes << - " displayed"; -/* JMI - notePartUpLink ()-> - tupletSoundingWholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes, - fNoteTupletUpLink->getTupletActualNotes (), - fNoteTupletUpLink->getTupletNormalNotes ()) - */ - - if (! fNoteIsARest) { - s << - " [octave" " " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - } - break; - - case msrNote::kGraceTupletMemberNote: - s << - "graceTupletMemberNote '"<< - notePitchAsString () << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; -/* JMI - notePartUpLink ()-> - tupletSoundingWholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes, - fNoteTupletUpLink->getTupletActualNotes (), - fNoteTupletUpLink->getTupletNormalNotes ()) - */ - - if (! fNoteIsARest) { - s << - " [octave" " " << fNoteOctave << ", " << noteDisplayOctaveAsString () << "]"; - } - break; - - case msrNote::kTupletMemberUnpitchedNote: - s << - "tupletMemberUnpitchedNote "<< - ", whole notes: " << - fMeasureElementSoundingWholeNotes << - " sounding, " << - fNoteDisplayWholeNotes << - " displayed"; -/* JMI - notePartUpLink ()-> - tupletSoundingWholeNotesAsMsrString ( - fInputLineNumber, - fMeasureElementSoundingWholeNotes, - fNoteTupletUpLink->getTupletActualNotes (), - fNoteTupletUpLink->getTupletNormalNotes ()) - */ - break; - } // switch - - s << left << - ", measureNumber: "; - if (fMeasureElementMeasureNumber == K_NO_MEASURE_NUMBER) { - s << "unknown"; - } - else { - s << fMeasureElementMeasureNumber; - } - - s << left << - ", positionInMeasure: "; - /* JMI - if (fMeasureElementPositionInMeasure == K_NO_POSITION_MEASURE_NUMBER) { - s << "unknown (" << fMeasureElementPositionInMeasure << ")"; - } - else { - s << fMeasureElementPositionInMeasure; - } - */ - s << fMeasureElementPositionInMeasure; - - if (fNoteOccupiesAFullMeasure) { - s << - ", full measure"; - } - - if (fNoteTrillOrnament) { - s << - ", has a trill ornament"; - } - - if (fNoteDashesOrnament) { - s << - ", has a dashes ornament"; - } - - if (fNoteWavyLineSpannerStart) { - s << - ", has a wavy line spanner start"; - } - - if (fNoteWavyLineSpannerStop) { - s << - ", has a wavy line spanner stop"; - } - - if (fNoteIsFollowedByGraceNotesGroup) { - s << - ", followed by grace notes group"; - } - - if (fNoteTie) { - s << - ", " << fNoteTie->tieKindAsString (); - } - - if (fNoteIsACueNote) { - s << - ", " << "cue note"; - } - - s << - ", line " << fInputLineNumber << - " ===]"; - - return s.str (); -} - -void msrNote::print (ostream& os) const -{ - rational - measureFullLength = - fNoteMeasureUpLink - ? - fNoteMeasureUpLink-> - getFullMeasureWholeNotesDuration () - : rational (0, 1); // JMI - - // print the note itself - os << - asString () << - endl; - - gIndenter++; - - const int fieldWidth = 34; - - // print measure number - os << left << - setw (fieldWidth) << - "noteMeasureNumber" << " : "; - if (fMeasureElementMeasureNumber == K_NO_MEASURE_NUMBER) { - os << - "unknown"; - } - else if (fMeasureElementMeasureNumber.size ()) { - os << - fMeasureElementMeasureNumber; - } - else { - stringstream s; - - s << - "noteMeasureNumber is empty in note '" << - this->asString () << - "'"; - -// JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - fInputLineNumber, - s.str ()); - } - os << endl; - - // print position in measure - os << left << - setw (fieldWidth) << - "positionInMeasure" << " : "; - /* JMI - if (fMeasureElementPositionInMeasure == K_NO_POSITION_MEASURE_NUMBER) { - os << "unknown (" << fMeasureElementPositionInMeasure << ")"; - } - else { - os << fMeasureElementPositionInMeasure; - } - */ - os << fMeasureElementPositionInMeasure; - os << endl; - - // print note measure uplink - if (fNoteMeasureUpLink || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteMeasureUpLink" << " : "; - - if (fNoteMeasureUpLink) { - os << endl; - - gIndenter++; - - os << - fNoteMeasureUpLink->asShortString () << - endl; - - gIndenter--; - } - else { - os << - "none"; - } - - os << endl; - } - - // print note chord uplink - if (fNoteChordUpLink || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteChordUpLink" << " : "; - - if (fNoteChordUpLink) { - os << - fNoteChordUpLink->asShortString (); - } - else { - os << - " : " << "none"; - } - - os << endl; - } - - // print note grace notes group uplink - if (fNoteGraceNotesGroupUpLink || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteGraceNoteGroupUpLink" << " : "; - - if (fNoteGraceNotesGroupUpLink) { - os << - fNoteGraceNotesGroupUpLink->asShortString (); - } - else { - os << - " : " << "none"; - } - - os << endl; - } - - // print note tuplet uplink - if (fNoteTupletUpLink || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteTupletUpLink" << " : "; - - if (fNoteTupletUpLink) { - os << - fNoteTupletUpLink->asShortString (); - } - else { - os << - " : " << "none"; - } - - os << endl; - } - - // print sounding and displayed whole notes - switch (fNoteKind) { - case msrNote::k_NoNoteKind: - case msrNote::kRestNote: - case msrNote::kSkipNote: - case msrNote::kUnpitchedNote: - case msrNote::kStandaloneNote: - case msrNote::kDoubleTremoloMemberNote: - case msrNote::kChordMemberNote: - os << left << - setw (fieldWidth) << - "noteSoundingWholeNotes" << " : " << - fMeasureElementSoundingWholeNotes << - endl << - setw (fieldWidth) << - "noteDisplayWholeNotes" << " : " << - fNoteDisplayWholeNotes << - endl; - break; - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - os << - setw (fieldWidth) << - "noteDisplayWholeNotes" << " : " << - fNoteDisplayWholeNotes << - endl; - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - os << - setw (fieldWidth) << - "noteSoundingWholeNotes" << " : " << - fMeasureElementSoundingWholeNotes << - endl << - setw (fieldWidth) << - "noteDisplayWholeNotes" << " : " << - fNoteDisplayWholeNotes << - endl << - setw (fieldWidth) << - "tupletSoundingWholeNotes" << " : "; - - if (fNoteTupletUpLink) { - os << - wholeNotesAsMsrString ( - fInputLineNumber, - getNoteTupletUpLink ()-> - getTupletSoundingWholeNotes ()); - } - else { - os << - "*** unknown yet ***"; - } - os << endl; - break; - } // switch - - // print note full measure length - // may be unknown if there is no time signature - os << left << - setw (fieldWidth) << - "measureFullLength" << " : "; - if (measureFullLength.getNumerator () == 0) { - os << - "unknown, there's no time signature"; - } - else { - os << - measureFullLength; - } - os << endl; - - // chord member? - os << left << - setw (fieldWidth) << - "noteBelongsToAChord" << " : " << - booleanAsString (fNoteBelongsToAChord) << - endl; - - // tuplet member? - os << left << - setw (fieldWidth) << - "noteBelongsToATuplet" << " : " << - booleanAsString (fNoteBelongsToATuplet) << - endl; - - // note occupied a full measure? - os << left << - setw (fieldWidth) << - "noteOccupiesAFullMeasure" << " : " << - booleanAsString (fNoteOccupiesAFullMeasure) << - endl; - - // multiple rest member? - os << left << - setw (fieldWidth) << - "noteBelongsToARestMeasures" << " : " << - booleanAsString (fNoteBelongsToARestMeasures) << - endl; - os << left << - setw (fieldWidth) << - "noteRestMeasuresSequenceNumber" << " : " << - fNoteRestMeasuresSequenceNumber << - endl; - - // note print kind - os << left << - setw (fieldWidth) << - "notePrintObjectKind" << " : " << - notePrintObjectKindAsString () << - endl; - - // note head - os << left << - setw (fieldWidth) << - "noteHeadKind" << " : " << - noteHeadKindAsString () << - endl << - setw (fieldWidth) << - "noteHeadFilledKind" << " : " << - noteHeadFilledKindAsString () << - endl << - setw (fieldWidth) << - "noteHeadParentheses" << " : " << - noteHeadParenthesesKindAsString () << - endl; - - // accidentals - os << left << - setw (fieldWidth) << - "noteAccidentalKind" << " : " << - noteAccidentalKindAsString ( - fNoteAccidentalKind) << - endl; - - os << left << - setw (fieldWidth) << - "noteEditorialAccidentalKind" << " : " << - noteEditorialAccidentalKindAsString ( - fNoteEditorialAccidentalKind) << - endl << - setw (fieldWidth) << - "noteCautionaryAccidentalKind" << " : " << - noteCautionaryAccidentalKindAsString ( - fNoteCautionaryAccidentalKind) << - endl; - - // short cuts for efficiency - os << left << - setw (fieldWidth) << - "noteIsARest" << " : " << - booleanAsString (fNoteIsARest) << - endl << - setw (fieldWidth) << - "noteIsUnpitched" << " : " << - booleanAsString (fNoteIsUnpitched) << - endl << - setw (fieldWidth) << - "noteIsACueNote" << " : " << - booleanAsString (fNoteIsACueNote) << - endl << - setw (fieldWidth) << - "noteIsAGraceNote" << " : " << - booleanAsString (fNoteIsAGraceNote) << - endl; - - // note redundant information (for speed) - - stringstream s; - - if (fNoteIsStemless || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteIsStemless" << - " : " << - booleanAsString ( - fNoteIsStemless) << - endl; - } - - if (fNoteIsFirstNoteInADoubleTremolo || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteIsFirstNoteInADoubleTremolo" << - " : " << - booleanAsString ( - fNoteIsFirstNoteInADoubleTremolo) << - endl; - } - if (fNoteIsSecondNoteInADoubleTremolo || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteIsSecondNoteInADoubleTremolo" << - " : " << - booleanAsString ( - fNoteIsSecondNoteInADoubleTremolo) << - endl; - } - - if (fNoteTrillOrnament || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteTrillOrnament" << - " : " << - booleanAsString ( - fNoteTrillOrnament) << - endl; - } - - if (fNoteDashesOrnament || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteDashesOrnament" << - " : " << - booleanAsString ( - fNoteDashesOrnament) << - endl; - } - - if (fNoteDelayedTurnOrnament || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteDelayedTurnOrnament" << - " : " << - booleanAsString ( - fNoteDelayedTurnOrnament) << - endl; - } - if (fNoteDelayedInvertedTurnOrnament || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteDelayedInvertedTurnOrnament" << - " : " << - booleanAsString ( - fNoteDelayedInvertedTurnOrnament) << - endl; - } - - if (fNoteWavyLineSpannerStart || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteWavyLineSpannerStart" << - " : " << - fNoteWavyLineSpannerStart->asShortString () << - endl; - } - if (fNoteWavyLineSpannerStop || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteWavyLineSpannerStop" << - " : " << - fNoteWavyLineSpannerStop->asShortString () << - endl; - } - - if (fNoteIsFollowedByGraceNotesGroup || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteIsFollowedByGraceNotesGroup" << - " : " << - booleanAsString ( - fNoteIsFollowedByGraceNotesGroup) << - endl; - } - - // print whole notes durations as MSR strings - switch (fNoteKind) { - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: - { - os << left << - setw (fieldWidth) << - "noteSoundingWholeNotesAsMsrString" << " : \"" << - noteSoundingWholeNotesAsMsrString () << - "\"" << - endl; - } - break; - - case msrNote::kSkipNote: - { - os << left << - setw (fieldWidth) << - "noteSoundingWholeNotesAsMsrString" << " : \"" << - noteSoundingWholeNotesAsMsrString () << - "\"" << - endl; - } - break; - - case msrNote::kUnpitchedNote: - { - os << left << - setw (fieldWidth) << - "noteSoundingWholeNotesAsMsrString" << " : \"" << - noteSoundingWholeNotesAsMsrString () << - "\"" << - endl << - setw (fieldWidth) << - "noteDisplayWholeNotesAsMsrString" << " : \"" << - noteDisplayWholeNotesAsMsrString () << - "\"" << - endl << - setw (fieldWidth) << - "noteGraphicDurationAsMsrString" << " : \"" << - noteGraphicDurationAsMsrString () << - "\"" << - endl; - } - break; - - case msrNote::kStandaloneNote: - { - os << left << - setw (fieldWidth) << - "noteSoundingWholeNotesAsMsrString" << " : \"" << - noteSoundingWholeNotesAsMsrString () << - "\"" << - endl << - setw (fieldWidth) << - "noteDisplayWholeNotesAsMsrString" << " : \"" << - noteDisplayWholeNotesAsMsrString () << - "\"" << - endl << - setw (fieldWidth) << - "noteGraphicDurationAsMsrString" << " : \"" << - noteGraphicDurationAsMsrString () << - "\"" << - endl; - } - break; - - case msrNote::kDoubleTremoloMemberNote: - { - // JMI - } - break; - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - { - os << left << - setw (fieldWidth) << - "noteGraphicDurationAsMsrString" << " : \"" << - noteGraphicDurationAsMsrString () << - "\"" << - endl; - } - break; - - case msrNote::kChordMemberNote: - { - // JMI - } - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - { - /* JMI - os << left << - setw (fieldWidth) << - "noteTupletNoteGraphicDurationAsMsrString" << " : \"" << - fNoteTupletNoteGraphicDurationAsMsrString << - "\"" << - endl << - setw (fieldWidth) << - "noteTupletNoteSoundingWholeNotesAsMsrString" << " : "; - */ - - if (fNoteTupletUpLink) { - os << - "\"" << - wholeNotesAsMsrString ( - fInputLineNumber, - getNoteTupletUpLink ()-> - getTupletSoundingWholeNotes ()) << - "\""; - } - else { - os << - "*** unknown yet ***"; - } - os << endl; - - os << - setw (fieldWidth) << - "noteGraphicDurationAsMsrString" << " : \"" << - noteGraphicDurationAsMsrString () << - "\"" << - endl; - } - break; - } // switch - - // print the octave shift if any - if (fNoteOctaveShift || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteOctaveShift"; - if (fNoteOctaveShift) { - os << endl; - - gIndenter++; - - os << - fNoteOctaveShift; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the stem if any - if (fNoteStem || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteStem"; - if (fNoteStem) { - os << endl; - - gIndenter++; - - os << - fNoteStem; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the note color - os << - setw (fieldWidth) << - "noteColor" << " : " << - fNoteColor.asString () << - endl; - - // print the tie if any - if (fNoteTie || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteTie"; - if (fNoteTie) { - os << endl; - - gIndenter++; - - os << - fNoteTie; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the beams if any - int noteBeamsSize = fNoteBeams.size (); - - if (noteBeamsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteBeams"; - if (fNoteBeams.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteBeams.begin (), - iEnd = fNoteBeams.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the articulations if any - int noteArticulationsSize = fNoteArticulations.size (); - - if (noteArticulationsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteArticulations"; - if (fNoteArticulations.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteArticulations.begin (), - iEnd = fNoteArticulations.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the spanners if any - int noteSpannersSize = fNoteSpanners.size (); - - if (noteSpannersSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteSpanners"; - if (fNoteSpanners.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteSpanners.begin (), - iEnd = fNoteSpanners.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the technicals if any - int noteTechnicalsSize = fNoteTechnicals.size (); - - if (noteTechnicalsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteTechnicals"; - if (fNoteTechnicals.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteTechnicals.begin (), - iEnd = fNoteTechnicals.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the technicals with integer if any - int noteTechnicalWithIntegersSize = fNoteTechnicalWithIntegers.size (); - - if (noteTechnicalWithIntegersSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteTechnicalWithIntegers"; - if (fNoteTechnicalWithIntegers.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteTechnicalWithIntegers.begin (), - iEnd = fNoteTechnicalWithIntegers.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the technicals with float if any - int noteTechnicalWithFloatsSize = fNoteTechnicalWithFloats.size (); - - if (noteTechnicalWithFloatsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteTechnicalWithFloats"; - if (fNoteTechnicalWithFloats.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteTechnicalWithFloats.begin (), - iEnd = fNoteTechnicalWithFloats.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the technicals with string if any - int noteTechnicalWithStringsSize = fNoteTechnicalWithStrings.size (); - - if (noteTechnicalWithStringsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteTechnicalWithStrings"; - if (fNoteTechnicalWithStrings.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteTechnicalWithStrings.begin (), - iEnd = fNoteTechnicalWithStrings.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the ornaments if any - int noteOrnamentsSize = fNoteOrnaments.size (); - - if (noteOrnamentsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteOrnaments"; - if (fNoteOrnaments.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteOrnaments.begin (), - iEnd = fNoteOrnaments.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the glissandos if any - int noteGlissandosSize = fNoteGlissandos.size (); - - if (noteGlissandosSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteGlissandos"; - if (fNoteGlissandos.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteGlissandos.begin (), - iEnd = fNoteGlissandos.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the slides if any - int noteSlidesSize = fNoteSlides.size (); - - if (noteSlidesSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteSlides"; - if (fNoteSlides.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteSlides.begin (), - iEnd = fNoteSlides.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the grace notes group before if any - if (fNoteGraceNotesGroupBefore || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteGraceNotesGroupBefore"; - if (fNoteGraceNotesGroupBefore) { - os << endl; - - gIndenter++; - - os << fNoteGraceNotesGroupBefore; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the after grace group notes after if any - if (fNoteGraceNotesGroupAfter || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteGraceNotesGroupAfter"; - if (fNoteGraceNotesGroupAfter) { - os << endl; - - gIndenter++; - - os << fNoteGraceNotesGroupAfter; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the singleTremolo if any - if (fNoteSingleTremolo || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteSingleTremolo"; - if (fNoteSingleTremolo) { - os << endl; - - gIndenter++; - - os << fNoteSingleTremolo; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the dynamics if any - int noteDynamicsSize = fNoteDynamics.size (); - - if (noteDynamicsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteDynamics"; - if (fNoteDynamics.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteDynamics.begin (), - iEnd = fNoteDynamics.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the other dynamics if any - int noteOtherDynamicsSize = fNoteOtherDynamics.size (); - - if (noteOtherDynamicsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteOtherDynamics"; - if (fNoteOtherDynamics.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteOtherDynamics.begin (), - iEnd = fNoteOtherDynamics.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the words if any - int noteWordsSize = fNoteWords.size (); - - if (noteWordsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteWords"; - if (fNoteWords.size ()) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fNoteWords.begin (), - iEnd = fNoteWords.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the slurs if any - int noteSlursSize = fNoteSlurs.size (); - - if (noteSlursSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteSlurs"; - if (fNoteSlurs.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteSlurs.begin (), - iEnd = fNoteSlurs.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the ligatures if any - int noteLigaturesSize = fNoteLigatures.size (); - - if (noteLigaturesSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteLigatures"; - if (fNoteLigatures.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteLigatures.begin (), - iEnd = fNoteLigatures.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the pedals if any - int notePedalsSize = fNotePedals.size (); - - if (notePedalsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "notePedals"; - if (fNotePedals.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNotePedals.begin (), - iEnd = fNotePedals.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the slashes if any - int noteSlashesSize = fNoteSlashes.size (); - - if (noteSlashesSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteSlashes"; - if (fNoteSlashes.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteSlashes.begin (), - iEnd = fNoteSlashes.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the wedges if any - int noteWedgesSize = fNoteWedges.size (); - - if (noteWedgesSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteWedges"; - if (fNoteWedges.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteWedges.begin (), - iEnd = fNoteWedges.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the segnos if any - int noteSegnosSize = fNoteSegnos.size (); - - if (noteSegnosSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteSegnos"; - if (fNoteSegnos.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteSegnos.begin (), - iEnd = fNoteSegnos.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the codas if any - int noteCodasSize = fNoteCodas.size (); - - if (noteCodasSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteCodas"; - if (fNoteCodas.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteCodas.begin (), - iEnd = fNoteCodas.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the eyeglasses if any - int noteEyeGlassesSize = fNoteEyeGlasses.size (); - - if (noteEyeGlassesSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteEyeGlasses"; - if (fNoteEyeGlasses.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteEyeGlasses.begin (), - iEnd = fNoteEyeGlasses.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the damps if any - int noteDampsSize = fNoteDamps.size (); - - if (noteDampsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteDamps"; - if (fNoteDamps.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteDamps.begin (), - iEnd = fNoteDamps.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the dampAlls if any - int noteDampAllsSize = fNoteDampAlls.size (); - - if (noteDampAllsSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteDampAlls"; - if (fNoteDampAlls.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteDampAlls.begin (), - iEnd = fNoteDampAlls.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the scordaturas if any - int noteScordaturasSize = fNoteScordaturas.size (); - - if (noteScordaturasSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteScordaturas"; - if (fNoteScordaturas.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteScordaturas.begin (), - iEnd = fNoteScordaturas.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the harmonies associated to this note if any - int noteHarmoniesListSize = fNoteHarmoniesList.size (); - - if (noteHarmoniesListSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteHarmonies"; - if (noteHarmoniesListSize) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteHarmoniesList.begin (), - iEnd = fNoteHarmoniesList.end (), - i = iBegin; - for ( ; ; ) { - S_msrHarmony - harmony = (*i); - - os << harmony; - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the figured bass if any - if (fNoteFiguredBass || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteFiguredBass"; - if (fNoteFiguredBass) { - os << endl; - gIndenter++; - - os << fNoteFiguredBass; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the note frame if any - if (fNoteFrame || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteFrame"; - if (fNoteFrame) { - os << endl; - gIndenter++; - - os << fNoteFrame; - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - // print the syllables associated to this note if any - int noteSyllablesSize = fNoteSyllables.size (); - - if (noteSyllablesSize > 0 || gMsrOah->fDisplayMsrDetails) { - os << - setw (fieldWidth) << - "noteSyllables"; - if (noteSyllablesSize) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fNoteSyllables.begin (), - iEnd = fNoteSyllables.end (), - i = iBegin; - for ( ; ; ) { - S_msrSyllable - syllable = (*i); - - os << syllable; - - /* JMI - os << - syllable->syllableKindAsString () << - ", " << - syllable->syllableExtendKindAsString () << - " : "; - - msrSyllable::writeTextsList ( - syllable->getSyllableTextsList (), - os); - - os << - ", stanza " << - syllable-> - getSyllableStanzaUpLink ()-> - getStanzaNumber () << - ", line " << syllable->getInputLineNumber () << - ", noteUpLink: " << - syllable-> - getSyllableNoteUpLink ()-> - asShortString () const; - */ - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - else { - os << " : " << - "none" << - endl; - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrNote& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrNotes_MUT_DEP.h b/src/lilypond/msrNotes_MUT_DEP.h deleted file mode 100644 index 6c8768c45..000000000 --- a/src/lilypond/msrNotes_MUT_DEP.h +++ /dev/null @@ -1,1122 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrNote : public msrTupletElement -{ - public: - - // constants - // ------------------------------------------------------ - - #define K_NO_OCTAVE -1 - - // data types - // ------------------------------------------------------ - - enum msrNoteKind { - k_NoNoteKind, - kRestNote, kSkipNote, - kUnpitchedNote, - kStandaloneNote, - kDoubleTremoloMemberNote, - kGraceNote, - kChordMemberNote, - kGraceChordMemberNote, - kTupletMemberNote, - kGraceTupletMemberNote, - kTupletMemberUnpitchedNote }; - - static string noteKindAsString ( - msrNoteKind noteKind); - - enum msrNoteAccidentalKind { - kNoteAccidentalNone, - - kNoteAccidentalSharp, kNoteAccidentalNatural, - kNoteAccidentalFlat, kNoteAccidentalDoubleSharp, - kNoteAccidentalSharpSharp, - kNoteAccidentalFlatFlat, kNoteAccidentalNaturalSharp, - kNoteAccidentalNaturalFlat, kNoteAccidentalQuarterFlat, - kNoteAccidentalQuarterSharp,kNoteAccidentalThreeQuartersFlat, - kNoteAccidentalThreeQuartersSharp, - - kNoteAccidentalSharpDown, kNoteAccidentalSharpUp, - kNoteAccidentalNaturalDown, kNoteAccidentalNaturalUp, - kNoteAccidentalFlatDown, kNoteAccidentalFlatUp, - kNoteAccidentalTripleSharp, kNoteAccidentalTripleFlat, - kNoteAccidentalSlashQuarterSharp, kNoteAccidentalSlashSharp, - kNoteAccidentalSlashFlat,kNoteAccidentaldoubleSlashFlat, - kNoteAccidentalSharp_1, kNoteAccidentalSharp_2, - kNoteAccidentalSharp_3, kNoteAccidentalSharp_5, - kNoteAccidentalFlat_1, kNoteAccidentalFlat_2, - kNoteAccidentalFlat_3, kNoteAccidentalFlat_4, - kNoteAccidentalSori, kNoteAccidentalKoron }; - - static string noteAccidentalKindAsString ( - msrNoteAccidentalKind noteAccidentalKind); - - enum msrNoteEditorialAccidentalKind { - kNoteEditorialAccidentalYes, kNoteEditorialAccidentalNo }; - - static string noteEditorialAccidentalKindAsString ( - msrNoteEditorialAccidentalKind noteEditorialAccidentalKind); - - enum msrNoteCautionaryAccidentalKind { - kNoteCautionaryAccidentalYes, kNoteCautionaryAccidentalNo }; - - static string noteCautionaryAccidentalKindAsString ( - msrNoteCautionaryAccidentalKind noteCautionaryAccidentalKind); - - enum msrNoteHeadKind { - kNoteHeadSlash, - kNoteHeadTriangle, kNoteHeadDiamond, kNoteHeadSquare, - kNoteHeadCross,kNoteHeadX, - kNoteHeadCircleX, kNoteHeadInvertedTriangle, - kNoteHeadArrowDown, kNoteHeadArrowUp, - kNoteHeadSlashed, kNoteHeadBackSlashed, - kNoteHeadNormal, kNoteHeadCluster, - kNoteHeadCircleDot, - kNoteHeadLeftTriangle, - kNoteHeadRectangle, - kNoteHeadNone, - kNoteHeadDo, kNoteHeadRe, kNoteHeadMi, kNoteHeadFa, kNoteHeadFaUp, - kNoteHeadSo, kNoteHeadLa, kNoteHeadTi }; - - static string noteHeadKindAsString ( - msrNoteHeadKind noteHeadKind); - - enum msrNoteHeadFilledKind { - kNoteHeadFilledYes, kNoteHeadFilledNo }; - - static string noteHeadFilledKindAsString ( - msrNoteHeadFilledKind noteHeadFilledKind); - - enum msrNoteHeadParenthesesKind { - kNoteHeadParenthesesYes, kNoteHeadParenthesesNo }; - - static string noteHeadParenthesesKindAsString ( - msrNoteHeadParenthesesKind noteHeadParenthesesKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string noteMeasureNumber, - - msrNoteKind noteKind, - - msrQuarterTonesPitchKind noteQuarterTonesPitchKind, - - rational noteSoundingWholeNotes, - rational noteDisplayWholeNotes, - - int noteDotsNumber, - - msrDurationKind noteGraphicDurationKind, - - int noteOctave, - - msrQuarterTonesPitchKind noteQuarterTonesDisplayPitchKind, - int noteDisplayOctave, - - bool noteIsARest, - bool noteIsUnpitched, - - bool noteIsACueNote, - bool noteIsAGraceNote, - - msrPrintObjectKind notePrintObjectKind, - - msrNoteHeadKind noteHeadKind, - msrNoteHeadFilledKind noteHeadFilledKind, - msrNoteHeadParenthesesKind noteHeadParenthesesKind); - - SMARTP createNoteNewbornClone ( - S_msrPart containingPart); - - SMARTP createNoteDeepCopy ( - S_msrVoice containingVoice); - - // creation from xml2Msr - // ------------------------------------------------------ - - static SMARTP createRestNote ( - int inputLineNumber, - string noteMeasureNumber, - rational soundingWholeNotes, - rational displayWholeNotes, - int dotsNumber, - int staffNumber, - int voiceNumber); - - static SMARTP createSkipNote ( - int inputLineNumber, - string noteMeasureNumber, - rational soundingWholeNotes, - rational displayWholeNotes, - int dotsNumber, - int staffNumber, - int voiceNumber); - - // creation from the options - // ------------------------------------------------------ - - static SMARTP createNoteFromSemiTonesPitchAndOctave ( - int inputLineNumber, - S_msrSemiTonesPitchAndOctave semiTonesPitchAndOctave); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrNote ( - int inputLineNumber, - string noteMeasureNumber, - - msrNoteKind noteKind, - - msrQuarterTonesPitchKind noteQuarterTonesPitchKind, - - rational noteSoundingWholeNotes, - rational noteDisplayWholeNotes, - - int noteDotsNumber, - - msrDurationKind noteGraphicDurationKind, - - int noteOctave, - - msrQuarterTonesPitchKind noteQuarterTonesDisplayPitchKind, - int noteDisplayOctave, - - bool noteIsARest, - bool noteIsUnpitched, - - bool noteIsACueNote, - bool noteIsAGraceNote, - - msrPrintObjectKind notePrintObjectKind, - - msrNoteHeadKind noteHeadKind, - msrNoteHeadFilledKind noteHeadFilledKind, - msrNoteHeadParenthesesKind noteHeadParenthesesKind); - - virtual ~msrNote (); - - private: - - // initialisation - // ------------------------------------------------------ - - void initializeNote (); - - public: - - // set and get - // ------------------------------------------------------ - - // measure upLink - void setNoteMeasureUpLink ( - const S_msrMeasure& measure) - { fNoteMeasureUpLink = measure; } - - S_msrMeasure getNoteMeasureUpLink () const - { return fNoteMeasureUpLink; } - - // chord upLink - void setNoteChordUpLink ( - const S_msrChord& chord) - { fNoteChordUpLink = chord; } - - S_msrChord getNoteChordUpLink () const - { return fNoteChordUpLink; } - - // grace notes group upLink - void setNoteGraceNotesGroupUpLink ( - const S_msrGraceNotesGroup& graceNotesGroup) - { fNoteGraceNotesGroupUpLink = graceNotesGroup; } - - S_msrGraceNotesGroup getNoteGraceNotesGroupUpLink () const - { return fNoteGraceNotesGroupUpLink; } - - // tuplet upLink - void setNoteTupletUpLink ( - const S_msrTuplet& tuplet) - { fNoteTupletUpLink = tuplet; } - - S_msrTuplet getNoteTupletUpLink () const - { return fNoteTupletUpLink; } - - // note kind - - void setNoteKind (msrNoteKind noteKind); - - msrNoteKind getNoteKind () const - { return fNoteKind; } - - // note pitch - - msrQuarterTonesPitchKind - getNoteQuarterTonesPitchKind () const - { return fNoteQuarterTonesPitchKind; } - - // note print kind - - void setNotePrintObjectKind ( - msrPrintObjectKind notePrintObjectKind) - { fNotePrintObjectKind = notePrintObjectKind; } - msrPrintObjectKind getNotePrintObjectKind () const - { return fNotePrintObjectKind; } - - // note head - - void setNoteHeadKind ( - msrNoteHeadKind noteHeadKind) - { fNoteHeadKind = noteHeadKind; } - - msrNoteHeadKind getNoteHeadKind () const - { return fNoteHeadKind; } - - void setNoteHeadFilledKind ( - msrNoteHeadFilledKind - noteHeadFilledKind) - { - fNoteHeadFilledKind = - noteHeadFilledKind; - } - - msrNoteHeadFilledKind getNoteHeadFilledKind () const - { return fNoteHeadFilledKind; } - - void setNoteHeadParenthesesKind ( - msrNoteHeadParenthesesKind - noteHeadParenthesesKind) - { - fNoteHeadParenthesesKind = - noteHeadParenthesesKind; - } - - msrNoteHeadParenthesesKind - getNoteHeadParenthesesKind () const - { return fNoteHeadParenthesesKind; } - - // accidentals - - void setNoteAccidentalKind ( - msrNoteAccidentalKind - noteAccidentalKind) - { - fNoteAccidentalKind = - noteAccidentalKind; - } - - msrNoteAccidentalKind - getNoteAccidentalKind () - { - return - fNoteAccidentalKind; - } - - void setNoteEditorialAccidentalKind ( - msrNoteEditorialAccidentalKind - noteEditorialAccidentalKind) - { - fNoteEditorialAccidentalKind = - noteEditorialAccidentalKind; - } - - msrNoteEditorialAccidentalKind - getNoteEditorialAccidentalKind () - { - return - fNoteEditorialAccidentalKind; - } - - void setNoteCautionaryAccidentalKind ( - msrNoteCautionaryAccidentalKind - noteCautionaryAccidentalKind) - { - fNoteCautionaryAccidentalKind = - noteCautionaryAccidentalKind; - } - - msrNoteCautionaryAccidentalKind - getNoteCautionaryAccidentalKind () - { - return - fNoteCautionaryAccidentalKind; - } - - // note whole notes - - void setNoteSoundingWholeNotes ( - rational wholeNotes); - - rational getNoteSoundingWholeNotes () - { - return - fMeasureElementSoundingWholeNotes; // JMI fNoteSoundingWholeNotes - } - - // note display - - msrQuarterTonesPitchKind - getNoteQuarterTonesDisplayPitchKind () const - { - return - fNoteQuarterTonesDisplayPitchKind; - } - - void setNoteDisplayWholeNotes ( - rational wholeNotes); - - rational getNoteDisplayWholeNotes () - { return fNoteDisplayWholeNotes; } - - // dots - - int getNoteDotsNumber () const - { return fNoteDotsNumber; } - - msrDurationKind getNoteGraphicDurationKind () const - { return fNoteGraphicDurationKind; } - - int getNoteOctave () const - { return fNoteOctave; } - - int getNoteDisplayOctave () const - { return fNoteDisplayOctave; } - - bool getNoteIsARest () const - // useful for rest tuplet members - { return fNoteIsARest; } - - bool getNoteIsUnpitched () const - { return fNoteIsUnpitched; } - - bool getNoteIsACueNote () const - { return fNoteIsACueNote; } - - // octave shifts - void setNoteOctaveShift ( - S_msrOctaveShift octaveShift) - { fNoteOctaveShift = octaveShift; } - - S_msrOctaveShift getNoteOctaveShift () const - { return fNoteOctaveShift; } - - // note context - // ------------------------------- - - // chord members - void setNoteBelongsToAChord (); - - bool getNoteBelongsToAChord () const - { return fNoteBelongsToAChord; } - - // grace notes - bool getNoteIsAGraceNote () const - { return fNoteIsAGraceNote; } - - // harmonies - void appendNoteToNoteHarmoniesList ( - S_msrHarmony harmony); - - const list& - getNoteHarmoniesList () const - { return fNoteHarmoniesList; } - - // frame - void setNoteFrame ( - S_msrFrame frame); - - const S_msrFrame& getNoteFrame () const - { return fNoteFrame; } - - // figured bass - void setNoteFiguredBass ( - S_msrFiguredBass figuredBass); - - const S_msrFiguredBass& - getNoteFiguredBass () const - { return fNoteFiguredBass; } - - // note lyrics - // ------------------------------- - - list getNoteSyllables () const - { return fNoteSyllables; } - - // elements attached to the note - // ------------------------------- - - // stems - void setNoteStem (S_msrStem stem); - - S_msrStem getNoteStem () const - { return fNoteStem; } - - // beams - const list& - getNoteBeams () const - { return fNoteBeams; } - - // articulations - const list& - getNoteArticulations () const - { return fNoteArticulations; } - - list& - getNoteArticulationsToModify () - { return fNoteArticulations; } - - // spanners - const list& - getNoteSpanners () const - { return fNoteSpanners; } - - list& - getNoteSpannersToModify () - { return fNoteSpanners; } - - // technicals - const list& - getNoteTechnicals () const - { return fNoteTechnicals; } - - const list& - getNoteTechnicalWithIntegers () const - { return fNoteTechnicalWithIntegers; } - - const list& - getNoteTechnicalWithFloats () const - { return fNoteTechnicalWithFloats; } - - const list& - getNoteTechnicalWithStrings () const - { return fNoteTechnicalWithStrings; } - - // ornaments - const list& - getNoteOrnaments () const - { return fNoteOrnaments; } - - // glissandos - const list& - getNoteGlissandos () const - { return fNoteGlissandos; } - - // slides - const list& - getNoteSlides () const - { return fNoteSlides; } - - // grace notes - void setNoteGraceNotesGroupBefore ( - S_msrGraceNotesGroup graceNotesGroupBefore); - - S_msrGraceNotesGroup getNoteGraceNotesGroupBefore () const - { return fNoteGraceNotesGroupBefore; } - - void setNoteGraceNotesGroupAfter ( - S_msrGraceNotesGroup graceNotesGroupAfter); - - S_msrGraceNotesGroup getNoteGraceNotesGroupAfter () const - { return fNoteGraceNotesGroupAfter; } - - // after grace notes - /* JMI - void setNoteAfterGraceNotesGroup ( - S_msrAfterGraceNotesGroup afterGraceNotesGroup); - - S_msrAfterGraceNotesGroup - getNoteAfterGraceNotesGroup () const - { return fNoteAfterGraceNotesGroup; } - */ - - // singleTremolo - void setNoteSingleTremolo ( - S_msrSingleTremolo trem); - - S_msrSingleTremolo getNoteSingleTremolo () const - { return fNoteSingleTremolo; } - - // ties - void setNoteTie (S_msrTie tie) - { fNoteTie = tie; } - S_msrTie getNoteTie () const - { return fNoteTie; } - - // dynamics - const list& - getNoteDynamics () const - { return fNoteDynamics; } - const list& - getNoteOtherDynamics () const - { return fNoteOtherDynamics; } - - // words - const list& - getNoteWords () const - { return fNoteWords; } - - list& getNoteWordsToModify () - { return fNoteWords; } - - // slashes - const list& - getNoteSlashes () const - { return fNoteSlashes; } - - // wedges - const list& - getNoteWedges () const - { return fNoteWedges; } - - list& - getNoteWedgesToModify () - { return fNoteWedges; } - - // eyeglasses - const list& - getNoteEyeGlasses () const - { return fNoteEyeGlasses; } - - // damps - const list& - getNoteDamps () const - { return fNoteDamps; } - - // damp alls - const list& - getNoteDampAlls () const - { return fNoteDampAlls; } - - // scordaturas - const list& - getNoteScordaturas () const - { return fNoteScordaturas; } - - // slurs - const list& - getNoteSlurs () const - { return fNoteSlurs; } - - // ligatures - const list& - getNoteLigatures () const - { return fNoteLigatures; } - - // pedals - const list& - getNotePedals () const - { return fNotePedals; } - - // note measure information - // ------------------------------- - - // position in measure - void setNotePositionInMeasure ( - rational positionInMeasure); - - void setNoteOccupiesAFullMeasure (); - - bool getNoteOccupiesAFullMeasure () const - { return fNoteOccupiesAFullMeasure; } - - // note redundant information (for speed) - bool getNoteIsStemless () const - { return fNoteIsStemless; } - - void setNoteIsAChordsFirstMemberNote () - { - fNoteIsAChordsFirstMemberNote = true; - } - - bool getNoteIsAChordsFirstMemberNote () const - { return fNoteIsAChordsFirstMemberNote; } - - void setNoteIsFirstNoteInADoubleTremolo () - { fNoteIsFirstNoteInADoubleTremolo = true; } - - bool getNoteIsFirstNoteInADoubleTremolo () const - { return fNoteIsFirstNoteInADoubleTremolo; } - - void setNoteIsSecondNoteInADoubleTremolo () - { fNoteIsSecondNoteInADoubleTremolo = true; } - - bool getNoteIsSecondNoteInADoubleTremolo () const - { return fNoteIsSecondNoteInADoubleTremolo; } - - S_msrOrnament getNoteTrillOrnament () const - { return fNoteTrillOrnament; } - - S_msrOrnament getNoteDashesOrnament () const - { return fNoteDashesOrnament; } - - S_msrOrnament getNoteDelayedTurnOrnament () const - { return fNoteDelayedTurnOrnament; } - - S_msrOrnament getNoteDelayedInvertedTurnOrnament () const - { return fNoteDelayedInvertedTurnOrnament; } - - S_msrSpanner getNoteWavyLineSpannerStart () const - { return fNoteWavyLineSpannerStart; } - - S_msrSpanner getNoteWavyLineSpannerStop () const - { return fNoteWavyLineSpannerStop; } - - void setNoteIsFollowedByGraceNotesGroup () - { fNoteIsFollowedByGraceNotesGroup = true; } - - bool getNoteIsFollowedByGraceNotesGroup () const - { return fNoteIsFollowedByGraceNotesGroup; } - - void setNoteColor ( - msrAlphaRGBColor noteColor) - { fNoteColor = noteColor; } - - msrAlphaRGBColor getNoteColor () const - { return fNoteColor; } - - // services - // ------------------------------------------------------ - - bool noteIsAPitchedRest () const; - - string asShortStringWithRawWholeNotes () const; - - // diatonic pitch - msrDiatonicPitchKind noteDiatonicPitchKind ( - int inputLineNumber) const; - - // tuplet members - void determineTupletMemberSoundingFromDisplayWholeNotes ( - int actualNotes, int normalNotes); - - // lyrics - void appendSyllableToNote (S_msrSyllable syllable); - - // beams - void appendBeamToNote (S_msrBeam beam); - - // articulations - void appendArticulationToNote (S_msrArticulation art); - - // spanners - void appendSpannerToNote (S_msrSpanner span); - - // technicals - void appendTechnicalToNote (S_msrTechnical tech); - - void appendTechnicalWithIntegerToNote ( - S_msrTechnicalWithInteger tech); - - void appendTechnicalWithFloatToNote ( - S_msrTechnicalWithFloat tech); - - void appendTechnicalWithStringToNote ( - S_msrTechnicalWithString tech); - - // ornaments - void appendOrnamentToNote (S_msrOrnament orn); - - // glissandos - void appendGlissandoToNote (S_msrGlissando glissando); - - // slides - void appendSlideToNote (S_msrSlide slide); - - // dynamics - void appendDynamicsToNote ( - S_msrDynamics dynamics); - void appendOtherDynamicsToNote ( - S_msrOtherDynamics otherDynamics); - - S_msrDynamics removeFirstDynamics (); // ??? - - // words - void appendWordsToNote (S_msrWords words); - - // slurs - void appendSlurToNote (S_msrSlur slur); - - // ligatures - void appendLigatureToNote (S_msrLigature ligature); - - // pedals - void appendPedalToNote (S_msrPedal pedal); - - // slashes - void appendSlashToNote (S_msrSlash slash); - - // wedges - void appendWedgeToNote (S_msrWedge wedge); - - S_msrWedge removeFirstWedge (); // JMI - - // segnos - void appendSegnoToNote (S_msrSegno segno); - - // codas - void appendCodaToNote (S_msrCoda coda); - - // eyeglasses - void appendEyeGlassesToNote (S_msrEyeGlasses eyeGlasses); - - // damps - void appendDampToNote (S_msrDamp damp); - - // damp alls - void appendDampAllToNote (S_msrDampAll dampAll); - - // scordaturas - void appendScordaturaToNote (S_msrScordatura scordatura); - - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - // note kind - string noteKindAsString () const; - - string notePitchAsString () const; - string noteDisplayPitchKindAsString () const; - - string noteDisplayOctaveAsString () const; - - // note print kind - string notePrintObjectKindAsString () const; - - // note head - string noteHeadKindAsString () const; - - string noteHeadFilledKindAsString () const; - string noteHeadParenthesesKindAsString () const; - - string noteDiatonicPitchKindAsString ( - int inputLineNumber) const; - - // whole notes - string noteSoundingWholeNotesAsMsrString () const; - string noteDisplayWholeNotesAsMsrString () const; - - // graphic duration - string noteGraphicDurationAsMsrString () const; - string tupletNoteGraphicDurationAsMsrString ( // JMI - int actualNotes, int normalNotes) const; - - // note as string - string asString () const; - - string asShortString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - // ------------------------------------------------------ - - S_msrChord fNoteChordUpLink; - - S_msrGraceNotesGroup fNoteGraceNotesGroupUpLink; - - S_msrTuplet fNoteTupletUpLink; - - S_msrMeasure fNoteMeasureUpLink; - - // basic note description - // ------------------------------------------------------ - - // note kind - msrNoteKind fNoteKind; - - // note quarter tones pitch - msrQuarterTonesPitchKind - fNoteQuarterTonesPitchKind; - - // whole notes -// rational fNoteSoundingWholeNotes; - rational fNoteDisplayWholeNotes; - - int fNoteDotsNumber; - - msrDurationKind fNoteGraphicDurationKind; - - int fNoteOctave; - - msrQuarterTonesPitchKind - fNoteQuarterTonesDisplayPitchKind; - int fNoteDisplayOctave; - // for unpitched notes - // and pitched rests - - // short cuts for efficiency - bool fNoteIsARest; - bool fNoteIsUnpitched; - - bool fNoteIsACueNote; - bool fNoteIsAGraceNote; - - // note octave shift - S_msrOctaveShift fNoteOctaveShift; - - // note print kind - msrPrintObjectKind fNotePrintObjectKind; - - // note head - msrNoteHeadKind fNoteHeadKind; - msrNoteHeadFilledKind fNoteHeadFilledKind; - msrNoteHeadParenthesesKind - fNoteHeadParenthesesKind; - - // accidentals - // ------------------------------------------------------ - - msrNoteAccidentalKind fNoteAccidentalKind; - - msrNoteEditorialAccidentalKind - fNoteEditorialAccidentalKind; - msrNoteCautionaryAccidentalKind - fNoteCautionaryAccidentalKind; - - // staff and voice context - // ------------------------------------------------------ - - int fNoteStaffNumber; - int fNoteVoiceNumber; - - // chord member? - // ------------------------------------------------------ - - bool fNoteBelongsToAChord; - - // tuplet member? - // ------------------------------------------------------ - - bool fNoteBelongsToATuplet; - - // note measure information - // ------------------------------------------------------ - - bool fNoteOccupiesAFullMeasure; - - // multiple rest member? - // ------------------------------------------------------ - - bool fNoteBelongsToARestMeasures; // JMI - int fNoteRestMeasuresSequenceNumber; // JMI - - // note lyrics - // ------------------------------------------------------ - - list fNoteSyllables; - - // stem - // ------------------------------------------------------ - - S_msrStem fNoteStem; - - // beams - // ------------------------------------------------------ - - list fNoteBeams; - - // articulations - // ------------------------------------------------------ - - list - fNoteArticulations; - - // spanners - // ------------------------------------------------------ - - list fNoteSpanners; - - // technicals - // ------------------------------------------------------ - - list fNoteTechnicals; - - list - fNoteTechnicalWithIntegers; - - list - fNoteTechnicalWithFloats; - - list - fNoteTechnicalWithStrings; - - // ornaments - // ------------------------------------------------------ - - list fNoteOrnaments; - - // glissandos - // ------------------------------------------------------ - - list fNoteGlissandos; - - // slides - // ------------------------------------------------------ - - list fNoteSlides; - - // grace notes - // ------------------------------------------------------ - - S_msrGraceNotesGroup fNoteGraceNotesGroupBefore; - // JMI S_msrAfterGraceNotesGroup - S_msrGraceNotesGroup - fNoteGraceNotesGroupAfter; - - // single tremolo - // ------------------------------------------------------ - - S_msrSingleTremolo fNoteSingleTremolo; - - // tie - // ------------------------------------------------------ - - S_msrTie fNoteTie; - - // dynamics - // ------------------------------------------------------ - - list fNoteDynamics; - list - fNoteOtherDynamics; - - // slashes - // ------------------------------------------------------ - - list fNoteSlashes; - - // wedges - // ------------------------------------------------------ - - list fNoteWedges; - - // segnos - // ------------------------------------------------------ - - list fNoteSegnos; - - // coda - // ------------------------------------------------------ - - list fNoteCodas; - - // eyeglasses - // ------------------------------------------------------ - - list fNoteEyeGlasses; - - // damps - // ------------------------------------------------------ - - list fNoteDamps; - - // damp alls - // ------------------------------------------------------ - - list fNoteDampAlls; - - // scordaturas - // ------------------------------------------------------ - - list fNoteScordaturas; - - // words - // ------------------------------------------------------ - - list fNoteWords; - - // slurs - // ------------------------------------------------------ - - list fNoteSlurs; - - // ligatures - // ------------------------------------------------------ - - list fNoteLigatures; - - // pedals - // ------------------------------------------------------ - - list fNotePedals; - - // harmonies - // ------------------------------------------------------ - - list fNoteHarmoniesList; - - // frame - // ------------------------------------------------------ - - S_msrFrame fNoteFrame; - - // figured bass - // ------------------------------------------------------ - - S_msrFiguredBass fNoteFiguredBass; - - // note redundant information (for speed) - // ------------------------------------------------------ - - // this is needed to handle stemless notes, - // because the is visited after 'visitorStart ( S_msrNote )' - bool fNoteIsStemless; - - // this is to distinguish the first chord member note - // from the other ones, since only it should get the slur if any - bool fNoteIsAChordsFirstMemberNote; - - // this is needed to handle double tremolos - bool fNoteIsFirstNoteInADoubleTremolo; - bool fNoteIsSecondNoteInADoubleTremolo; - - // this is useful - // as well as to produce a nice \aftergrace in LilyPond - S_msrOrnament fNoteTrillOrnament; - bool fNoteIsFollowedByGraceNotesGroup; - - // this is useful to produce a text spanner in LilyPond - S_msrOrnament fNoteDashesOrnament; - - // this is needed to produce a delayed turn/inverted-turn in LilyPond - S_msrOrnament fNoteDelayedTurnOrnament; - S_msrOrnament fNoteDelayedInvertedTurnOrnament; - - // this is useful to to combine a trill and a wavy line in LilyPond - S_msrSpanner fNoteWavyLineSpannerStart; - S_msrSpanner fNoteWavyLineSpannerStop; - - // color - msrAlphaRGBColor fNoteColor; -}; -typedef SMARTP S_msrNote; -EXP ostream& operator<< (ostream& os, const S_msrNote& elt); - diff --git a/src/lilypond/msrOah.cpp b/src/lilypond/msrOah.cpp deleted file mode 100644 index 2ad22be3c..000000000 --- a/src/lilypond/msrOah.cpp +++ /dev/null @@ -1,3432 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX -#include // setw, setprecision, ... -#include - -#include - -#include "utilities.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrRenamePartAtom msrRenamePartAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringStringMapVariable) -{ - msrRenamePartAtom* o = new - msrRenamePartAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringStringMapVariable); - assert(o!=0); - return o; -} - -msrRenamePartAtom::msrRenamePartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringStringMapVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringStringMapVariable ( - stringStringMapVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -msrRenamePartAtom::~msrRenamePartAtom () -{} - -S_oahValuedAtom msrRenamePartAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a msrRenamePartAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void msrRenamePartAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'msrRenamePartAtom'" << - endl; - } -#endif - - // theString contains the part rename specification - // decipher it to extract the old and new part names - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'msrRenamePartAtom'" << - endl; - } -#endif - - string regularExpression ( - "[[:space:]]*([^[:space:]]*)[[:space:]]*" - "=" - "[[:space:]]*([^[:space:]]*)[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for part rename string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - } -#endif - - if (smSize == 3) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - os << endl; - } -#endif - } - - else { - stringstream s; - - s << - "-msrPartRename argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string - oldPartName = sm [1], - newPartName = sm [2]; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "--> oldPartName = \"" << oldPartName << "\", " << - "--> newPartName = \"" << newPartName << "\"" << - endl; - } -#endif - - // is this part name in the part renaming map? - map::iterator - it = - fStringStringMapVariable.find (oldPartName); - - if (it != fStringStringMapVariable.end ()) { - // yes, issue error message - stringstream s; - - s << - "Part \"" << oldPartName << "\" occurs more that once" << - "in the '--partName' option"; - - oahError (s.str ()); - } - - else { - fStringStringMapVariable [oldPartName] = newPartName; - } -} - -void msrRenamePartAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrRenamePartAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRenamePartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrRenamePartAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void msrRenamePartAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrRenamePartAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRenamePartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrRenamePartAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void msrRenamePartAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrRenamePartAtom::browseData ()" << - endl; - } -#endif -} - -string msrRenamePartAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - if (! fStringStringMapVariable.size ()) { - s << "none"; - } - else { - map::const_iterator - iBegin = fStringStringMapVariable.begin (), - iEnd = fStringStringMapVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -string msrRenamePartAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - if (! fStringStringMapVariable.size ()) { - s << "none"; - } - else { - map::const_iterator - iBegin = fStringStringMapVariable.begin (), - iEnd = fStringStringMapVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -void msrRenamePartAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "msrRenamePartAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringStringMapVariable" << " : " << - endl; - - if (! fStringStringMapVariable.size ()) { - os << "none"; - } - else { - map::const_iterator - iBegin = fStringStringMapVariable.begin (), - iEnd = fStringStringMapVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i).first << " --> " << (*i).second; - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; -} - -void msrRenamePartAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fStringStringMapVariable.size ()) { - os << - "none" << - endl; - } - else { - os << endl; - gIndenter++; - - map::const_iterator - iBegin = fStringStringMapVariable.begin (), - iEnd = fStringStringMapVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - "\"" << - (*i).first << - "\" --> \"" << - (*i).second << - "\"" << - endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_msrRenamePartAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTransposePartAtom msrTransposePartAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& - stringMsrSemiTonesPitchAndOctaveVariable) -{ - msrTransposePartAtom* o = new - msrTransposePartAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringMsrSemiTonesPitchAndOctaveVariable); - assert(o!=0); - return o; -} - -msrTransposePartAtom::msrTransposePartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& - stringMsrSemiTonesPitchAndOctaveVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringMsrSemiTonesPitchAndOctaveVariable ( - stringMsrSemiTonesPitchAndOctaveVariable) -{} - -msrTransposePartAtom::~msrTransposePartAtom () -{} - -S_oahValuedAtom msrTransposePartAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a msrTransposePartAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void msrTransposePartAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'msrTransposePartAtom'" << - endl; - } -#endif - - // theString contains the part transpose specification - // decipher it to extract the old and new part names - - string regularExpression ( - "[[:space:]]*(.*)[[:space:]]*" - "=" - "[[:space:]]*(.*)[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for part transpose string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - } -#endif - - if (smSize == 3) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - os << endl; - } -#endif - } - - else { - stringstream s; - - s << - "-marTransposePart argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string - originalPitchName = sm [1], - destinationPitchName = sm [2]; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "--> originalPitchName = \"" << originalPitchName << "\", " << - "--> destinationPitchName = \"" << destinationPitchName << "\"" << - endl; - } -#endif - - // is this part name in the part renaming map? - map::iterator - it = - fStringMsrSemiTonesPitchAndOctaveVariable.find (originalPitchName); - - if (it != fStringMsrSemiTonesPitchAndOctaveVariable.end ()) { - // yes, issue error message - stringstream s; - - s << - "Part \"" << originalPitchName << "\" occurs more that once" << - "in the '--transpose-part' option"; - - oahError (s.str ()); - } - - else { - fStringMsrSemiTonesPitchAndOctaveVariable [originalPitchName] = - msrSemiTonesPitchAndOctave::createFromString ( - K_NO_INPUT_LINE_NUMBER, - destinationPitchName); - } -} - -void msrTransposePartAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrTransposePartAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTransposePartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrTransposePartAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void msrTransposePartAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrTransposePartAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTransposePartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrTransposePartAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void msrTransposePartAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrTransposePartAtom::browseData ()" << - endl; - } -#endif -} - -string msrTransposePartAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - if (! fStringMsrSemiTonesPitchAndOctaveVariable.size ()) { - s << "none"; - } - else { - map::const_iterator - iBegin = fStringMsrSemiTonesPitchAndOctaveVariable.begin (), - iEnd = fStringMsrSemiTonesPitchAndOctaveVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -string msrTransposePartAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - if (! fStringMsrSemiTonesPitchAndOctaveVariable.size ()) { - s << "none"; - } - else { - map::const_iterator - iBegin = fStringMsrSemiTonesPitchAndOctaveVariable.begin (), - iEnd = fStringMsrSemiTonesPitchAndOctaveVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -void msrTransposePartAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "msrTransposePartAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringMsrSemiTonesPitchAndOctaveVariable" << " : " << - endl; - - if (! fStringMsrSemiTonesPitchAndOctaveVariable.size ()) { - os << "none"; - } - else { - map::const_iterator - iBegin = fStringMsrSemiTonesPitchAndOctaveVariable.begin (), - iEnd = fStringMsrSemiTonesPitchAndOctaveVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i).first << " --> " << (*i).second; - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; -} - -void msrTransposePartAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fStringMsrSemiTonesPitchAndOctaveVariable.size ()) { - os << - "none" << - endl; - } - else { - os << endl; - - gIndenter++; - - map::const_iterator - iBegin = fStringMsrSemiTonesPitchAndOctaveVariable.begin (), - iEnd = fStringMsrSemiTonesPitchAndOctaveVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - "\"" << - (*i).first << - "\" --> \"" << - (*i).second << - "\"" << - endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_msrTransposePartAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrOmitPartAtom msrOmitPartAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable) -{ - msrOmitPartAtom* o = new - msrOmitPartAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringSetVariable); - assert(o!=0); - return o; -} - -msrOmitPartAtom::msrOmitPartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringSetVariable ( - stringSetVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -msrOmitPartAtom::~msrOmitPartAtom () -{} - -S_oahValuedAtom msrOmitPartAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a msrOmitPartAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void msrOmitPartAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'msrOmitPartAtom'" << - endl; - } -#endif - - // theString contains the name of the part to be omitted - - string partName = theString; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "--> partName = \"" << partName << "\", " << - endl; - } -#endif - - // is this part name in the part renaming map? - set::iterator - it = - fStringSetVariable.find (partName); - - if (it != fStringSetVariable.end ()) { - // yes, issue error message - stringstream s; - - s << - "Part \"" << partName << "\" occurs more that once" << - "in the '--msr-omit-part' option"; - - oahError (s.str ()); - } - - else { - fStringSetVariable.insert (partName); - } -} - -void msrOmitPartAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrOmitPartAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOmitPartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrOmitPartAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void msrOmitPartAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrOmitPartAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOmitPartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrOmitPartAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void msrOmitPartAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrOmitPartAtom::browseData ()" << - endl; - } -#endif -} - -string msrOmitPartAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - if (! fStringSetVariable.size ()) { - s << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -string msrOmitPartAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - if (! fStringSetVariable.size ()) { - s << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -void msrOmitPartAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "msrOmitPartAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringSetVariable" << " : " << - endl; - - if (! fStringSetVariable.size ()) { - os << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; -} - -void msrOmitPartAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fStringSetVariable.size ()) { - os << - "none" << - endl; - } - else { - os << endl; - - gIndenter++; - - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - "\"" << (*i) << "\"" << - endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_msrOmitPartAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrKeepPartAtom msrKeepPartAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable) -{ - msrKeepPartAtom* o = new - msrKeepPartAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringSetVariable); - assert(o!=0); - return o; -} - -msrKeepPartAtom::msrKeepPartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringSetVariable ( - stringSetVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -msrKeepPartAtom::~msrKeepPartAtom () -{} - -S_oahValuedAtom msrKeepPartAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a msrKeepPartAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void msrKeepPartAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'msrKeepPartAtom'" << - endl; - } -#endif - - // theString contains the name of the part to be kept - - string partName = theString; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "--> partName = \"" << partName << "\", " << - endl; - } -#endif - - // is this part name in the part renaming map? - set::iterator - it = - fStringSetVariable.find (partName); - - if (it != fStringSetVariable.end ()) { - // yes, issue error message - stringstream s; - - s << - "Part \"" << partName << "\" occurs more that once" << - "in the '--msr-keep-part' option"; - - oahError (s.str ()); - } - - else { - fStringSetVariable.insert (partName); - } -} - -void msrKeepPartAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrKeepPartAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrKeepPartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrKeepPartAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void msrKeepPartAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrKeepPartAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrKeepPartAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrKeepPartAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void msrKeepPartAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrKeepPartAtom::browseData ()" << - endl; - } -#endif -} - -string msrKeepPartAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - if (! fStringSetVariable.size ()) { - s << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -string msrKeepPartAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - if (! fStringSetVariable.size ()) { - s << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -void msrKeepPartAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "msrKeepPartAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringSetVariable" << " : " << - endl; - - if (! fStringSetVariable.size ()) { - os << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; -} - -void msrKeepPartAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fStringSetVariable.size ()) { - os << - "none" << - endl; - } - else { - os << endl; - - gIndenter++; - - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - "\"" << (*i) << "\"" << - endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_msrKeepPartAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrPitchesLanguageAtom msrPitchesLanguageAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - optionsMsrPitchesLanguageKindVariable) -{ - msrPitchesLanguageAtom* o = new - msrPitchesLanguageAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - optionsMsrPitchesLanguageKindVariable); - assert(o!=0); - return o; -} - -msrPitchesLanguageAtom::msrPitchesLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - optionsMsrPitchesLanguageKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fMsrQuarterTonesPitchesLanguageKindVariable ( - optionsMsrPitchesLanguageKindVariable) -{} - -msrPitchesLanguageAtom::~msrPitchesLanguageAtom () -{} - -S_oahValuedAtom msrPitchesLanguageAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a msrPitchesLanguageAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void msrPitchesLanguageAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'msrPitchesLanguageAtom'" << - endl; - } -#endif - - // theString contains the language name: - // is it in the pitches languages map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'msrPitchesLanguageAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gQuarterTonesPitchesLanguageKindsMap.find ( - theString); - - if (it == gQuarterTonesPitchesLanguageKindsMap.end ()) { - // no, language is unknown in the map - - stringstream s; - - s << - "MSR pitches language '" << theString << - "' is unknown" << - endl << - "The " << - gQuarterTonesPitchesLanguageKindsMap.size () << - " known MSR pitches languages are:" << - endl; - - gIndenter++; - - s << - existingQuarterTonesPitchesLanguageKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setMsrQuarterTonesPitchesLanguageKindVariable ( - (*it).second); -} - -void msrPitchesLanguageAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrPitchesLanguageAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPitchesLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrPitchesLanguageAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void msrPitchesLanguageAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrPitchesLanguageAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPitchesLanguageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrPitchesLanguageAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void msrPitchesLanguageAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrPitchesLanguageAtom::browseData ()" << - endl; - } -#endif -} - -string msrPitchesLanguageAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable); - - return s.str (); -} - -string msrPitchesLanguageAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable); - - return s.str (); -} - -void msrPitchesLanguageAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "msrPitchesLanguageAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fmsrPitchesLanguageVariable" << " : \"" << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable) << - "\"" << - endl; -} - -void msrPitchesLanguageAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_msrPitchesLanguageAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_msrOah gMsrOah; -S_msrOah gMsrOahUserChoices; -S_msrOah gMsrOahWithDetailedTrace; - -S_msrOah msrOah::create ( - S_oahHandler handlerUpLink) -{ - msrOah* o = new msrOah( - handlerUpLink); - assert(o!=0); - return o; -} - -msrOah::msrOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "MSR", - "hmsr", "help-msr", -R"(These options control the way MSR data is handled.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this options group to the options handler - // if relevant // JMI ??? - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeMsrOah (false); -} - -msrOah::~msrOah () -{} - -#ifdef TRACE_OAH -void msrOah::initializeMsrTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Trace", - "hmsrt", "help-msr-trace", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // MSR - - fTraceMsr = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tmsr", "trace-msr", -R"(Write a trace of the LPSR graphs visiting activity to standard error.)", - "traceMsr", - fTraceMsr)); - - // MSR visitors - - fTraceMsrVisitors = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tmsrv", "trace-msr-visitors", -R"(Write a trace of the MSR graphs visiting activity to standard error.)", - "traceMsrVisitors", - fTraceMsrVisitors)); -} -#endif - -void msrOah::initializeMsrDisplayOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Display", - "hmsrtd", "help-msr-trace-and-display", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // partgroups - - fDisplayPartGroups = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dpg", "display-partgroups", -R"(Write the structure of the part groups to standard error.)", - "displayPartGroups", - fDisplayPartGroups)); - - // MSR - - fDisplayMsr = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dmsr", "display-msr", -R"(Write the contents of the MSR data to standard error.)", - "displayMsr", - fDisplayMsr)); - - // MSR details - - fDisplayMsrDetails = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahTwoBooleansAtom::create ( - "dmsrd", "display-msr-details", -R"(Write the contents of the MSR data with more details to standard error.)", - "displayMsrDetails", - fDisplayMsrDetails, - fDisplayMsr)); - - // MSR names - - fDisplayMsrNames = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "names", "display-msr-names", -R"(Only write a view of the names in the MSR to standard error. -This implies that no LilyPond code is generated.)", - "displayMsrNames", - fDisplayMsrNames)); - - // MSR summary - - fDisplayMsrSummary = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "sum", "display-msr-summary", -R"(Only write a summary of the MSR to standard error. -This implies that no LilyPond code is generated.)", - "displayMsrSummary", - fDisplayMsrSummary)); -} - -void msrOah::initializeMsrLanguagesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Languages", - "hmsrlang", "help-msr-languages", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // notes pitches - - if (! setMsrQuarterTonesPitchesLanguage ("nederlands")) { - stringstream s; - - s << - "INTERNAL INITIALIZATION ERROR: " - "MSR pitches language 'nederlands' is unknown" << - endl << - "The " << - gQuarterTonesPitchesLanguageKindsMap.size () << - " known MSR pitches languages are:" << - endl; - - gIndenter++; - - s << - existingQuarterTonesPitchesLanguageKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - const msrQuarterTonesPitchesLanguageKind - msrQuarterTonesPitchesLanguageKindDefaultValue = - kNederlands; //LilyPond default value - - subGroup-> - appendAtomToSubGroup ( - msrPitchesLanguageAtom::create ( - "mplang", "msr-pitches-language", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(Use LANGUAGE to display note pitches in the MSR logs and text views. -The NUMBER LilyPond pitches languages available are: -PITCHES_LANGUAGES. -The default is 'DEFAULT_VALUE'.)", - "NUMBER", - to_string (gQuarterTonesPitchesLanguageKindsMap.size ())), - "PITCHES_LANGUAGES", - gIndenter.indentMultiLineString ( - existingQuarterTonesPitchesLanguageKinds (K_NAMES_LIST_MAX_LENGTH))), - "DEFAULT_VALUE", - msrQuarterTonesPitchesLanguageKindAsString ( - msrQuarterTonesPitchesLanguageKindDefaultValue)), - "LANGUAGE", - "msrPitchesLanguage", - fMsrQuarterTonesPitchesLanguageKind)); -} - -void msrOah::initializeMsrPartsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Parts", - "hmsrp", "help-msr-parts", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // MSR rename part - - subGroup-> - appendAtomToSubGroup ( - msrRenamePartAtom::create ( - "mrp", "msr-rename-part", - replaceSubstringInString ( -R"(Rename part ORIGINAL_NAME to NEW_NAME, for example after displaying -the names in the score or a summary of the latter in a first run with options -'-dmnames, -display-msr-names' or 'dmsum, -display-msr-summary'. -PART_RENAME_SPEC can be: -'ORIGINAL_NAME = NEW_NAME' -or -"ORIGINAL_NAME = NEW_NAME" -The single or double quotes are used to allow spaces in the names -and around the '=' sign, otherwise they can be dispensed with. -Using double quotes allows for shell variables substitutions, as in: -DESSUS="Cor anglais" -EXECUTABLE -msr-rename-part "P1 = ${DESSUS}" . -There can be several occurrences of this option.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName), - "PART_RENAME_SPEC", - "partsRenamingMap", - fPartsRenamingMap)); - - // MSR transpose part - - subGroup-> - appendAtomToSubGroup ( - msrTransposePartAtom::create ( - "mtp", "msr-transpose-part", -R"(Transpose part ORIGINAL_NAME using TRANSPOSITION to tranpose in the MSR data. -PART_TRANSPOSITION_SPEC can be: -'ORIGINAL_NAME = TRANSPOSITION' -or -"ORIGINAL_NAME = TRANSPOSITION" -The single or double quotes are used to allow spaces in the names -and around the '=' sign, otherwise they can be dispensed with. -TRANSPOSITION should contain a diatonic pitch, followed if needed -by a sequence of ',' or '\'' octave indications. -Such indications cannot be mixed, and they are relative to c\', i.e. middle C. -For example, 'a', 'f' and 'bes,' can be used respectively -for instruments in 'a', 'f' and B flat respectively. -Using double quotes allows for shell variables substitutions, as in: -SAXOPHONE="bes," -EXECUTABLE -msr-transpose-part "P1 ${SAXOPHONE}" . -There can be several occurrences of this option.)", - "PART_TRANSPOSITION_SPEC", - "partsTranspositionMap", - fPartsTranspositionMap)); - - // MSR omit part ID - - fOmitPartIDAtom = - oahStringSetAtom::create ( - "mopi", "msr-omit-part-id", -R"(Omit part with ID PART_ID. -There can be several occurrences of this option. -All the parts not omitted are kept. -This option is incompatible with '-mkpi, -msr-keep-part-id'.)", - "PART_ID", - "partsOmitIDSet", - fPartsOmitIDSet); - - subGroup-> - appendAtomToSubGroup ( - fOmitPartIDAtom); - - // MSR omit part name - - fOmitPartNameAtom = - oahStringSetAtom::create ( - "mopn", "msr-omit-part-name", -R"(Omit part named PART_NAME. -There can be several occurrences of this option. -All the parts not omitted are kept. -This option is incompatible with '-mkpn, -msr-keep-part-name'.)", - "PART_NAME", - "partsOmitNameSet", - fPartsOmitNameSet); - - subGroup-> - appendAtomToSubGroup ( - fOmitPartNameAtom); - - // MSR keep part ID - - fKeepPartIDAtom = - oahStringSetAtom::create ( - "mkpi", "msr-keep-part-id", -R"(Keep part with ID PART_ID. -There can be several occurrences of this option. -All the parts not kept are omitted. -This option is incompatible with '-mopi, -msr-omit-part-id'.)", - "PART_ID", - "partsKeepIDSet", - fPartsKeepIDSet); - - subGroup-> - appendAtomToSubGroup ( - fKeepPartIDAtom); - - // MSR keep part name - - fKeepPartNameAtom = - oahStringSetAtom::create ( - "mkpn", "msr-keep-part-name", -R"(Keep part named PART_NAME. -There can be several occurrences of this option. -All the parts not kept are omitted. -This option is incompatible with '-mopn, -msr-omit-part-name'.)", - "PART_NAME", - "partsKeepNameSet", - fPartsKeepNameSet); - - subGroup-> - appendAtomToSubGroup ( - fKeepPartNameAtom); -} - -void msrOah::initializeMsrStavesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Staves", - "hmsrs", "help-msr-staves", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // single line staves - - fCreateVoicesStaffRelativeNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "cslsar", "create-single-line-staves-as-rythmic", -R"(Create staves with a single line as rythmic staves. -By default, drum staves are created in this case.)", - "createSingleLineStavesAsRythmic", - fCreateSingleLineStavesAsRythmic)); -} - -void msrOah::initializeMsrVoicesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Voices", - "hmsrv", "help-msr-voices", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // staff relative numbers - - fCreateVoicesStaffRelativeNumbers = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "cvsrvn", "create-voices-staff-relative-numbers", -R"(Generate voices names with numbers relative to their staff. -By default, the voice numbers found are used, -which may be global to the score.)", - "createVoicesStaffRelativeNumbers", - fCreateVoicesStaffRelativeNumbers)); -} - -void msrOah::initializeMsrRepeatsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Repeats", - "hmsrr", "help-msr-repeats", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // barlines - - fCreateImplicitInitialRepeatBarline = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ciirb", "create-implicit-initial-repeat-barline", -R"(Create an implicit repeat barline at the beginning of the stave -in case there is none, as is usual in scores. -By default, no such barline is added.)", - "createImplicitInitialRepeatBarline", - fCreateImplicitInitialRepeatBarline)); -} - -void msrOah::initializeMsrNotesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Notes", - "hmsrn", "help-msr-notes", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'dr' prefix - - S_oahPrefix - shortDelayRestsPrefix = - oahPrefix::create ( - "dr", - "dr", - "'-dr=abc,yz' is equivalent to '-drabc, -dryz'"); - fHandlerUpLink-> - appendPrefixToHandler (shortDelayRestsPrefix); - - // the 'delay-rests' prefix - - S_oahPrefix - longDelayRestsPrefix = - oahPrefix::create ( - "delay-rests", - "delay-rests-", - "'-delay-rests=abc,yz' is equivalent to '-delay-rests-abc, -delay-rests-yz'"); - fHandlerUpLink-> - appendPrefixToHandler (longDelayRestsPrefix); - - // the 'delay rests' multiplex booleans atom - - S_oahMultiplexBooleansAtom - delayRestsMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Delay SHORT_NAME/LONG_NAME that occur on a rest until the next note.", - "SHORT_NAME", - "LONG_NAME", - shortDelayRestsPrefix, - longDelayRestsPrefix); - - subGroup-> - appendAtomToSubGroup ( - delayRestsMultiplexBooleansAtom); - - // delay rests dynamics - - fDelayRestsDynamics = false; - - S_oahBooleanAtom - delayRestsDynamicsAtom = - oahBooleanAtom::create ( - "drdyns", "delay-rests-dynamics", -R"()", - "delayRestsDynamics", - fDelayRestsDynamics); - subGroup-> - appendAtomToSubGroup ( - delayRestsDynamicsAtom); - delayRestsMultiplexBooleansAtom-> - addBooleanAtom ( - delayRestsDynamicsAtom); - - // delay rests words - - fDelayRestsWords = false; - - S_oahBooleanAtom - delayRestsWordsAtom = - oahBooleanAtom::create ( - "drwords", "delay-rests-words", -R"()", - "delayRestsWords", - fDelayRestsWords); - subGroup-> - appendAtomToSubGroup ( - delayRestsWordsAtom); - delayRestsMultiplexBooleansAtom-> - addBooleanAtom ( - delayRestsWordsAtom); - - // delay rests beams - - fDelayRestsBeams = false; - - S_oahBooleanAtom - delayRestsBeamsAtom = - oahBooleanAtom::create ( - "drbeams", "delay-rests-beams", -R"()", - "delayRestsBeams", - fDelayRestsBeams); - subGroup-> - appendAtomToSubGroup ( - delayRestsBeamsAtom); - delayRestsMultiplexBooleansAtom-> - addBooleanAtom ( - delayRestsBeamsAtom); - - // delay rests slurs - - fDelayRestsSlurs = false; - - S_oahBooleanAtom - delayRestsSlursAtom = - oahBooleanAtom::create ( - "drslurs", "delay-rests-slurs", -R"()", - "delayRestsSlurs", - fDelayRestsSlurs); - subGroup-> - appendAtomToSubGroup ( - delayRestsSlursAtom); - delayRestsMultiplexBooleansAtom-> - addBooleanAtom ( - delayRestsSlursAtom); - - // delay rests ligatures - - fDelayRestsLigatures = false; - - S_oahBooleanAtom - delayRestsLigaturesAtom = - oahBooleanAtom::create ( - "drligs", "delay-rests-ligatures", -R"( in MusicXML, '\[... \}' in LilyPond)", - "delayRestsLigatures", - fDelayRestsLigatures); - subGroup-> - appendAtomToSubGroup ( - delayRestsLigaturesAtom); - delayRestsMultiplexBooleansAtom-> - addBooleanAtom ( - delayRestsLigaturesAtom); - - // delay rests pedals - - fDelayRestsPedals = false; - - S_oahBooleanAtom - delayRestsPedalsAtom = - oahBooleanAtom::create ( - "drpeds", "delay-rests-pedals", -R"()", - "delayRestsPedals", - fDelayRestsPedals); - subGroup-> - appendAtomToSubGroup ( - delayRestsPedalsAtom); - delayRestsMultiplexBooleansAtom-> - addBooleanAtom ( - delayRestsPedalsAtom); - - // delay rests slashes - - fDelayRestsSlashes = false; - - S_oahBooleanAtom - delayRestsSlashesAtom = - oahBooleanAtom::create ( - "drslashes", "delay-rests-slashes", -R"('' in MusicXML)", - "delayRestsSlashes", - fDelayRestsSlashes); - subGroup-> - appendAtomToSubGroup ( - delayRestsSlashesAtom); - - // delay rests wedges - - fDelayRestsWedges = false; - - S_oahBooleanAtom - delayRestsWedgesAtom = - oahBooleanAtom::create ( - "drwedges", "delay-rests-wedges", -R"('' in MusicXML, ' - appendAtomToSubGroup ( - delayRestsWedgesAtom); - delayRestsMultiplexBooleansAtom-> - addBooleanAtom ( - delayRestsWedgesAtom); - - // slash all grace notes - - fSlashAllGraceNotes = false; - - S_oahBooleanAtom - slashAllGraceNotesAtom = - oahBooleanAtom::create ( - "slashagn", "slash-all-grace-notes ", -R"()", - "slashAllGraceNotes", - fSlashAllGraceNotes); - subGroup-> - appendAtomToSubGroup ( - slashAllGraceNotesAtom); - - // slur all grace notes - - fSlurAllGraceNotes = false; - - S_oahBooleanAtom - slurAllGraceNotesAtom = - oahBooleanAtom::create ( - "sluragn", "slur-all-grace-notes ", -R"()", - "slurAllGraceNotes", - fSlurAllGraceNotes); - subGroup-> - appendAtomToSubGroup ( - slurAllGraceNotesAtom); - - // omit articulations - - fOmitArticulations = false; - - S_oahBooleanAtom - omitArticulationsAtom = - oahBooleanAtom::create ( - "oarts", "omit-articulations", -R"('' in MusicXML, ' - appendAtomToSubGroup ( - omitArticulationsAtom); - - // omit ornaments - // -------------------------------------- - - fOmitOrnaments = false; - - S_oahBooleanAtom - omitOrnamentsAtom = - oahBooleanAtom::create ( - "oorns", "omit-ornaments", -R"('' in MusicXML, ' - appendAtomToSubGroup ( - omitOrnamentsAtom); - - // omit words - - fOmitWords = false; - - S_oahBooleanAtom - omitWordsAtom = - oahBooleanAtom::create ( - "owords", "omit-words", -R"('' in MusicXML, ' - appendAtomToSubGroup ( - omitWordsAtom); - - // omit ties - - fOmitTies = false; - - S_oahBooleanAtom - omitTiesAtom = - oahBooleanAtom::create ( - "oties", "omit-ties", -R"()", - "omitTies", - fOmitTies); - subGroup-> - appendAtomToSubGroup ( - omitTiesAtom); - - // omit dynamics - - fOmitDynamics = false; - - S_oahBooleanAtom - omitDynamicsAtom = - oahBooleanAtom::create ( - "odyns", "omit-dynamics", -R"()", - "omitDynamics", - fOmitDynamics); - subGroup-> - appendAtomToSubGroup ( - omitDynamicsAtom); - - // omit slurs - - fOmitSlurs = false; - - S_oahBooleanAtom - omitSlursAtom = - oahBooleanAtom::create ( - "oslurs", "omit-slurs", -R"()", - "omitSlurs", - fOmitSlurs); - subGroup-> - appendAtomToSubGroup ( - omitSlursAtom); - - // omit wedges - - fOmitWedges = false; - - S_oahBooleanAtom - omitWedgesAtom = - oahBooleanAtom::create ( - "owedges", "omit-wedges", -R"('' in MusicXML, ' - appendAtomToSubGroup ( - omitWedgesAtom); -} - -void msrOah::initializeMsrLyricsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Lyrics", - "hmsrlyrd", "help-msr-lyrics", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // stanzas numbers - - fAddStanzasNumbers = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "asn", "add-stanzas-numbers", -R"(Add stanzas numbers to lyrics.)", - "addStanzasNumbers", - fAddStanzasNumbers)); - - // omit lyrics - - fOmitLyrics = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "olyrics", "omit-lyrics", -R"(Don't create lyrics in the MSR.)", - "omitLyrics", - fOmitLyrics)); -} - -void msrOah::initializeMsrHarmoniesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Harmonies", - "hmsrh", "help-msr-harmonies", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // show harmony voices - - fShowHarmonyVoices = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "shv", "show-harmony-voices", -R"(Show the parts harmony voices in the MSR data -even though it does not contain music.)", - "showHarmonyVoices", - fShowHarmonyVoices)); - - // no MSR harmonies - - fOmitHarmonies = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "oharms", "omit-harmonies", -R"(Don't create harmonies in the MSR.)", - "omitHarmonies", - fOmitHarmonies)); -} - -void msrOah::initializeMsrFiguredBassOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup subGroup = - oahSubGroup::create ( - "Figured bass", - "hmsrfb", "help-msr-figured-bass", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // show figured bass voices - - fShowFiguredBassVoices = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "sfbv", "show-figured-bass-voices", -R"(Show the figured bass harmony voices in the MSR data -even though they do not contain music.)", - "showFiguredBassVoices", - fShowFiguredBassVoices)); - - // omit figured basses - - fOmitFiguredBasses = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ofigbasses", "omit-figured-basses", -R"(Don't create figured basses in the MSR.)", - "omitFiguredBasses", - fOmitFiguredBasses)); -} - -void msrOah::initializeMsrExitAfterSomePassesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - exitAfterSomePassesSubGroup = - oahSubGroup::create ( - "Exit after some passes", - "hmexit", "help-msr-exit", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (exitAfterSomePassesSubGroup); - - // exit after pass 2a - - fExit2a = boolOptionsInitialValue; - - S_oahBooleanAtom - exit2aOahBooleanAtom = - oahBooleanAtom::create ( - "e2a", "exit-2a", -R"(Exit after pass 2a, i.e. after conversion -of the MusicXML tree to an MSR skeleton.)", - "exit2a", - fExit2a); - - exitAfterSomePassesSubGroup-> - appendAtomToSubGroup ( - exit2aOahBooleanAtom); - - // exit after pass 2b - - fExit2b = boolOptionsInitialValue; - - S_oahBooleanAtom - exit2bOahBooleanAtom = - oahBooleanAtom::create ( - "e2b", "exit-2b", -R"(Exit after pass 2b, i.e. after conversion -of the MusicXML tree to MSR.)", - "exit2b", - fExit2b); - - exitAfterSomePassesSubGroup-> - appendAtomToSubGroup ( - exit2bOahBooleanAtom); -} - -void msrOah::initializeMsrOah ( - bool boolOptionsInitialValue) -{ -#ifdef TRACE_OAH - // trace - // -------------------------------------- - initializeMsrTraceOah ( - boolOptionsInitialValue); -#endif - - // display - // -------------------------------------- - initializeMsrDisplayOptions ( - boolOptionsInitialValue); - - // languages - // -------------------------------------- - initializeMsrLanguagesOptions ( - boolOptionsInitialValue); - - // parts - // -------------------------------------- - initializeMsrPartsOptions ( - boolOptionsInitialValue); - - // staves - // -------------------------------------- - initializeMsrStavesOptions ( - boolOptionsInitialValue); - - // voices - // -------------------------------------- - initializeMsrVoicesOptions ( - boolOptionsInitialValue); - - // repeats - // -------------------------------------- - initializeMsrRepeatsOptions ( - boolOptionsInitialValue); - - // notes - // -------------------------------------- - initializeMsrNotesOptions ( - boolOptionsInitialValue); - - // lyrics - // -------------------------------------- - initializeMsrLyricsOptions ( - boolOptionsInitialValue); - - // harmonies - // -------------------------------------- - initializeMsrHarmoniesOptions ( - boolOptionsInitialValue); - - // figured bass - // -------------------------------------- - initializeMsrFiguredBassOptions ( - boolOptionsInitialValue); - - // exit after some passes - // -------------------------------------- - initializeMsrExitAfterSomePassesOptions ( - boolOptionsInitialValue); -} - -S_msrOah msrOah::createCloneWithDetailedTrace () -{ - S_msrOah - clone = - msrOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the options handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - - // trace and display - // -------------------------------------- - - clone->fTraceMsr = - true; - - clone->fTraceMsrVisitors = - true; - - clone->fDisplayPartGroups = - true; - - clone->fDisplayMsr = - fDisplayMsr; - clone->fDisplayMsrDetails = - fDisplayMsrDetails; - - clone->fDisplayMsrNames = - fDisplayMsrNames; - clone->fDisplayMsrSummary = - fDisplayMsrSummary; - - - // languages - // -------------------------------------- - - clone->fMsrQuarterTonesPitchesLanguageKind = - fMsrQuarterTonesPitchesLanguageKind; - - - // parts - // -------------------------------------- - - clone->fPartsRenamingMap = - fPartsRenamingMap; - clone->fPartsTranspositionMap = - fPartsTranspositionMap; - - clone->fPartsOmitIDSet = - fPartsOmitIDSet; - clone->fPartsKeepIDSet = - fPartsKeepIDSet; - - clone->fPartsOmitNameSet = - fPartsOmitNameSet; - clone->fPartsKeepNameSet = - fPartsKeepNameSet; - - - // staves - // -------------------------------------- - - clone->fCreateSingleLineStavesAsRythmic = - fCreateSingleLineStavesAsRythmic; - - - // voices - // -------------------------------------- - - clone->fCreateVoicesStaffRelativeNumbers = - fCreateVoicesStaffRelativeNumbers; - - - // repeats - // -------------------------------------- - - clone->fCreateImplicitInitialRepeatBarline = - fCreateImplicitInitialRepeatBarline; - - - // notes - // -------------------------------------- - - clone->fDelayRestsDynamics = - fDelayRestsDynamics; - clone->fDelayRestsWords = - fDelayRestsWords; - clone->fDelayRestsSlurs = - fDelayRestsSlurs; - clone->fDelayRestsLigatures = - fDelayRestsLigatures; - clone->fDelayRestsPedals = - fDelayRestsPedals; - clone->fDelayRestsSlashes = - fDelayRestsSlashes; - clone->fDelayRestsWedges = - fDelayRestsWedges; - - clone->fSlashAllGraceNotes = - fSlashAllGraceNotes; - clone->fSlurAllGraceNotes = - fSlurAllGraceNotes; - - clone->fOmitArticulations = - fOmitArticulations; - - clone->fOmitOrnaments = - fOmitOrnaments; - - clone->fOmitWords = - fOmitWords; - - clone->fOmitTies = - fOmitTies; - - clone->fOmitDynamics = - fOmitDynamics; - - clone->fOmitSlurs = - fOmitSlurs; - - clone->fOmitWedges = - fOmitWedges; - - - // lyrics - // -------------------------------------- - - clone->fAddStanzasNumbers = - fAddStanzasNumbers; - - clone->fOmitLyrics = - fOmitLyrics; - - // harmonies - // -------------------------------------- - - clone->fShowHarmonyVoices = - fShowHarmonyVoices; - - clone->fOmitHarmonies = - fOmitHarmonies; - - - // figured bass - // -------------------------------------- - - clone->fShowFiguredBassVoices = - fShowFiguredBassVoices; - - clone->fOmitFiguredBasses = - fOmitFiguredBasses; - - return clone; -} - -//______________________________________________________________________________ -bool msrOah::setMsrQuarterTonesPitchesLanguage (string language) -{ - // is language in the pitches languages map? - map::const_iterator - it = - gQuarterTonesPitchesLanguageKindsMap.find (language); - - if (it == gQuarterTonesPitchesLanguageKindsMap.end ()) { - // no, language is unknown in the map - return false; - } - - fMsrQuarterTonesPitchesLanguageKind = (*it).second; - - return true; -} - -//______________________________________________________________________________ -void msrOah::enforceQuietness () -{ - fTraceMsr = false; - fTraceMsrVisitors = false; - fDisplayPartGroups = false; - fDisplayMsr = false; - fDisplayMsrDetails = false; - fDisplayMsrNames = false; - fDisplayMsrSummary = false; -} - -//______________________________________________________________________________ -void msrOah::checkOptionsConsistency () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "Checking the consistency of OAH group \"" << - fGroupHeader << - "\"" << - endl; - } -#endif - - // JMI and if mixed ID and name options are used? - - if (fPartsOmitIDSet.size () > 0 && fPartsKeepIDSet.size () > 0) { - stringstream s; - - s << - "options '" << - fOmitPartIDAtom->fetchNames () << - "' and '" << - fKeepPartIDAtom->fetchNames () << - "' are incompatible"; - - oahError (s.str ()); - } - - if (fPartsOmitNameSet.size () > 0 && fPartsKeepNameSet.size () > 0) { - stringstream s; - - s << - "options '" << - fOmitPartNameAtom->fetchNames () << - "' and '" << - fKeepPartNameAtom->fetchNames () << - "' are incompatible"; - - oahError (s.str ()); - } -} - -//______________________________________________________________________________ -void msrOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void msrOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching msrOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void msrOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> msrOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void msrOah::printMsrOahValues (int fieldWidth) -{ - gLogOstream << - "The MSR options are:" << - endl; - - gIndenter++; - - - // trace and display - // -------------------------------------- - - gLogOstream << - "Trace and display:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "traceMsr" << " : " << - booleanAsString (fTraceMsr) << - endl << - - setw (fieldWidth) << "traceMsrVisitors" << " : " << - booleanAsString (fTraceMsrVisitors) << - endl << - - setw (fieldWidth) << "displayPartGroups" << " : " << - booleanAsString (fDisplayPartGroups) << - endl << - - setw (fieldWidth) << "displayMsr" << " : " << - booleanAsString (fDisplayMsr) << - endl << - setw (fieldWidth) << "displayMsrDetails" << " : " << - booleanAsString (fDisplayMsrDetails) << - endl << - - setw (fieldWidth) << "displayMsrNames" << " : " << - booleanAsString (fDisplayMsrNames) << - endl << - - setw (fieldWidth) << "displayMsrSummary" << " : " << - booleanAsString (fDisplayMsrSummary) << - endl; - - gIndenter--; - - - // languages - // -------------------------------------- - - gLogOstream << - "Languages:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "msrPitchesLanguage" << " : \"" << - msrQuarterTonesPitchesLanguageKindAsString ( - fMsrQuarterTonesPitchesLanguageKind) << - "\"" << - endl; - - gIndenter--; - - - // parts - // -------------------------------------- - - gLogOstream << - "Parts:" << - endl; - - gIndenter++; - - // parts renaming - - gLogOstream << left << - setw (fieldWidth) << "parts renaming" << " : "; - - if (! fPartsRenamingMap.size ()) { - gLogOstream << - "none"; - } - else { - for ( - map::const_iterator i = - fPartsRenamingMap.begin (); - i != fPartsRenamingMap.end (); - i++ - ) { - gLogOstream << - "\"" << ((*i).first) << "\" -> \"" << ((*i).second) << "\""; - } // for - } - - gLogOstream << endl; - - // parts transposition - - gLogOstream << left << - setw (fieldWidth) << "parts transposition" << " : "; - - if (! fPartsTranspositionMap.size ()) { - gLogOstream << - "none"; - } - else { - for ( - map::const_iterator i = - fPartsTranspositionMap.begin (); - i != fPartsTranspositionMap.end (); - i++ - ) { - gLogOstream << - "\"" << ((*i).first) << - " = " << - ((*i).second->asString ()) << - "\" "; - } // for - } - - // parts omitted IDs - - gLogOstream << left << - setw (fieldWidth) << "parts omitted IDs" << " : "; - - if (! fPartsOmitIDSet.size ()) { - gLogOstream << - "none"; - } - else { - for ( - set ::const_iterator i = - fPartsOmitIDSet.begin (); - i != fPartsOmitIDSet.end (); - i++ - ) { - gLogOstream << - "\"" << (*i) << "\" "; - } // for - } - - // parts kept IDs - - gLogOstream << left << - setw (fieldWidth) << "parts kept IDs" << " : "; - - if (! fPartsKeepIDSet.size ()) { - gLogOstream << - "none"; - } - else { - for ( - set ::const_iterator i = - fPartsKeepIDSet.begin (); - i != fPartsKeepIDSet.end (); - i++ - ) { - gLogOstream << - "\"" << (*i) << "\" "; - } // for - } - - // parts omitted names - - gLogOstream << left << - setw (fieldWidth) << "parts omitted names" << " : "; - - if (! fPartsOmitNameSet.size ()) { - gLogOstream << - "none"; - } - else { - for ( - set ::const_iterator i = - fPartsOmitNameSet.begin (); - i != fPartsOmitNameSet.end (); - i++ - ) { - gLogOstream << - "\"" << (*i) << "\" "; - } // for - } - - // parts kept names - - gLogOstream << left << - setw (fieldWidth) << "parts kept names" << " : "; - - if (! fPartsKeepNameSet.size ()) { - gLogOstream << - "none"; - } - else { - for ( - set ::const_iterator i = - fPartsKeepNameSet.begin (); - i != fPartsKeepNameSet.end (); - i++ - ) { - gLogOstream << - "\"" << (*i) << "\" "; - } // for - } - - gLogOstream << endl; - - gIndenter--; - - - // staves - // -------------------------------------- - - gLogOstream << - "Staves:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << - "createSingleLineStavesAsRythmic" << " : " << - booleanAsString (fCreateSingleLineStavesAsRythmic) << - endl; - - gIndenter--; - - - // voices - // -------------------------------------- - - gLogOstream << - "Voices:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << - "createVoicesStaffRelativeNumbers" << " : " << - booleanAsString (fCreateVoicesStaffRelativeNumbers) << - endl; - - gIndenter--; - - - // repeats - // -------------------------------------- - - gLogOstream << - "Repeats:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << - "createImplicitInitialRepeatBarline" << " : " << - booleanAsString (fCreateImplicitInitialRepeatBarline) << - endl; - - gIndenter--; - - - // notes - // -------------------------------------- - - gLogOstream << - "Notes:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "delayRestsDynamics" << " : " << - booleanAsString (fDelayRestsDynamics) << - endl << - - setw (fieldWidth) << "delayRestsWords" << " : " << - booleanAsString (fDelayRestsWords) << - endl << - - setw (fieldWidth) << "delayRestsSlurs" << " : " << - booleanAsString (fDelayRestsSlurs) << - endl << - - setw (fieldWidth) << "delayRestsLigatures" << " : " << - booleanAsString (fDelayRestsLigatures) << - endl << - - setw (fieldWidth) << "delayRestsPedals" << " : " << - booleanAsString (fDelayRestsPedals) << - endl << - - setw (fieldWidth) << "delayRestsSlashes" << " : " << - booleanAsString (fDelayRestsSlashes) << - endl << - - setw (fieldWidth) << "delayRestsWedges" << " : " << - booleanAsString (fDelayRestsWedges) << - endl << - - setw (fieldWidth) << "slashAllGraceNotes" << " : " << - booleanAsString (fSlashAllGraceNotes) << - endl << - setw (fieldWidth) << "slurAllGraceNotes" << " : " << - booleanAsString (fSlurAllGraceNotes) << - endl; - - gIndenter--; - - - // articulations - // -------------------------------------- - - gLogOstream << - "Articulations:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "omitArticulations" << " : " << - booleanAsString (fOmitArticulations) << - endl; - - gIndenter--; - - - // ornaments - // -------------------------------------- - - gLogOstream << - "Ornaments:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "omitOrnaments" << " : " << - booleanAsString (fOmitOrnaments) << - endl; - - gIndenter--; - - - // words - // -------------------------------------- - - gLogOstream << - "Words:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "omitWords" << " : " << - booleanAsString (fOmitWords) << - endl; - - gIndenter--; - - - // ties - // -------------------------------------- - - gLogOstream << - "Ties:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "omitTies" << " : " << - booleanAsString (fOmitTies) << - endl; - - gIndenter--; - - - // dynamics - // -------------------------------------- - - gLogOstream << - "Dynamics:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "omitDynamics" << " : " << - booleanAsString (fOmitDynamics) << - endl; - - gIndenter--; - - - // slurs - // -------------------------------------- - - gLogOstream << - "Slurs:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "mitSlurs" << " : " << - booleanAsString (fOmitSlurs) << - endl; - - gIndenter--; - - - // wedges - // -------------------------------------- - - gLogOstream << - "Wedges:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "omitWedges" << " : " << - booleanAsString (fOmitWedges) << - endl; - - gIndenter--; - - - // lyrics - // -------------------------------------- - - gLogOstream << - "Lyrics:" << - endl; - - gIndenter++; - - gLogOstream << - setw (fieldWidth) << "addStanzasNumbers" << " : " << - booleanAsString (fAddStanzasNumbers) << - endl << - - setw (fieldWidth) << "omitLyrics" << " : " << - booleanAsString (fOmitLyrics) << - endl; - - gIndenter--; - - - // harmonies - // -------------------------------------- - - gLogOstream << - "Harmonies:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "showHarmonyVoices" << " : " << - booleanAsString (fShowHarmonyVoices) << - endl << - - setw (fieldWidth) << "omitHarmonies" << " : " << - booleanAsString (fOmitHarmonies) << - endl; - - gIndenter--; - - - // figured bass - // -------------------------------------- - - gLogOstream << - "Figured bass:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "showFiguredBassVoices" << " : " << - booleanAsString (fShowFiguredBassVoices) << - endl << - - setw (fieldWidth) << "omitFiguredBasses" << " : " << - booleanAsString (fOmitFiguredBasses) << - endl; - - gIndenter--; - - gIndenter--; - - - // exit after some passes - // -------------------------------------- - - gLogOstream << - "Exit after some passes:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "exit2a" << " : " << - booleanAsString (fExit2a) << - endl << - setw (fieldWidth) << "exit2b" << " : " << - booleanAsString (fExit2b) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeMsrOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing MSR options handling" << - endl; - } -#endif - - // MSR options - // ------------------------------------------------------ - - gMsrOahUserChoices = msrOah::create ( - handler); - assert(gMsrOahUserChoices != 0); - - gMsrOah = - gMsrOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ - -/* JMI - gMsrOahWithDetailedTrace = - gMsrOah-> - createCloneWithDetailedTrace (); - */ -} - - -} diff --git a/src/lilypond/msrOah.h b/src/lilypond/msrOah.h deleted file mode 100644 index 75c06d646..000000000 --- a/src/lilypond/msrOah.h +++ /dev/null @@ -1,766 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrOah___ -#define ___msrOah___ - -#include "msrBasicTypes.h" - -#include "oahBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrRenamePartAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringStringMapVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRenamePartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringStringMapVariable); - - virtual ~msrRenamePartAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - const map& - getStringStringMapVariable () - { return fStringStringMapVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - map& fStringStringMapVariable; -}; -typedef SMARTP S_msrRenamePartAtom; -EXP ostream& operator<< (ostream& os, const S_msrRenamePartAtom& elt); - -//______________________________________________________________________________ -class msrTransposePartAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& - stringMsrSemiTonesPitchAndOctaveVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTransposePartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& - stringMsrSemiTonesPitchAndOctaveVariable); - - virtual ~msrTransposePartAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringMsrSemiTonesPitchAndOctaveVariable ( - string partName, - S_msrSemiTonesPitchAndOctave - semiTonesPitchAndOctave) - { - fStringMsrSemiTonesPitchAndOctaveVariable [ - partName - ] = - semiTonesPitchAndOctave; - } - - const map& - getStringMsrSemiTonesPitchAndOctaveVariable () - { - return - fStringMsrSemiTonesPitchAndOctaveVariable; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - map& - fStringMsrSemiTonesPitchAndOctaveVariable; -}; -typedef SMARTP S_msrTransposePartAtom; -EXP ostream& operator<< (ostream& os, const S_msrTransposePartAtom& elt); - -//______________________________________________________________________________ -class msrOmitPartAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrOmitPartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable); - - virtual ~msrOmitPartAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringSetVariable ( - string partName) - { fStringSetVariable.insert (partName); } - - const set& getStringSetVariable () - { return fStringSetVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - set& fStringSetVariable; -}; -typedef SMARTP S_msrOmitPartAtom; -EXP ostream& operator<< (ostream& os, const S_msrOmitPartAtom& elt); - -//______________________________________________________________________________ -class msrKeepPartAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrKeepPartAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable); - - virtual ~msrKeepPartAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringSetVariable ( - string partName) - { fStringSetVariable.insert (partName); } - - const set& getStringSetVariable () - { return fStringSetVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - set& fStringSetVariable; -}; -typedef SMARTP S_msrKeepPartAtom; -EXP ostream& operator<< (ostream& os, const S_msrKeepPartAtom& elt); - -//______________________________________________________________________________ -class msrPitchesLanguageAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - msrMsrPitchesLanguageKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPitchesLanguageAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrQuarterTonesPitchesLanguageKind& - msrMsrPitchesLanguageKindVariable); - - virtual ~msrPitchesLanguageAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setMsrQuarterTonesPitchesLanguageKindVariable ( - msrQuarterTonesPitchesLanguageKind value) - { - fMsrQuarterTonesPitchesLanguageKindVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - msrQuarterTonesPitchesLanguageKind& - fMsrQuarterTonesPitchesLanguageKindVariable; -}; -typedef SMARTP S_msrPitchesLanguageAtom; -EXP ostream& operator<< (ostream& os, const S_msrPitchesLanguageAtom& elt); - -//______________________________________________________________________________ -class msrOah : public oahGroup -{ - public: - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithDetailedTrace (); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeMsrOah ( - bool boolOptionsInitialValue); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrOah ( - S_oahHandler handlerUpLink); - - virtual ~msrOah (); - - // set and get - // ------------------------------------------------------ - - bool setMsrQuarterTonesPitchesLanguage ( - string language); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - -#ifdef TRACE_OAH - void initializeMsrTraceOah ( - bool boolOptionsInitialValue); -#endif - - void initializeMsrDisplayOptions ( - bool boolOptionsInitialValue); - - void initializeMsrLanguagesOptions ( - bool boolOptionsInitialValue); - - void initializeMsrPartsOptions ( - bool boolOptionsInitialValue); - - void initializeMsrStavesOptions ( - bool boolOptionsInitialValue); - - void initializeMsrVoicesOptions ( - bool boolOptionsInitialValue); - - void initializeMsrRepeatsOptions ( - bool boolOptionsInitialValue); - - void initializeMsrNotesOptions ( - bool boolOptionsInitialValue); - - void initializeMsrLyricsOptions ( - bool boolOptionsInitialValue); - - void initializeMsrHarmoniesOptions ( - bool boolOptionsInitialValue); - - void initializeMsrFiguredBassOptions ( - bool boolOptionsInitialValue); - - void initializeMsrExitAfterSomePassesOptions ( - bool boolOptionsInitialValue); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printMsrOahHelp (); - - void printMsrOahValues (int fieldWidth); - - public: - - // trace - // -------------------------------------- - - bool fTraceMsr; - - bool fTraceMsrVisitors; - - // display - // -------------------------------------- - - bool fDisplayPartGroups; - - bool fDisplayMsr; - bool fDisplayMsrDetails; - - bool fDisplayMsrNames; - bool fDisplayMsrSummary; - - - // languages - // -------------------------------------- - - msrQuarterTonesPitchesLanguageKind - fMsrQuarterTonesPitchesLanguageKind; - - // parts - // -------------------------------------- - - map fPartsRenamingMap; - - map - fPartsTranspositionMap; - - set fPartsOmitIDSet; - set fPartsKeepIDSet; - - set fPartsOmitNameSet; - set fPartsKeepNameSet; - - // for checkOptionsConsistency() - S_oahStringSetAtom fOmitPartIDAtom; - S_oahStringSetAtom fKeepPartIDAtom; - - S_oahStringSetAtom fOmitPartNameAtom; - S_oahStringSetAtom fKeepPartNameAtom; - - - // staves - // -------------------------------------- - - bool fCreateSingleLineStavesAsRythmic; - - - // voices - // -------------------------------------- - - bool fCreateVoicesStaffRelativeNumbers; - - - // repeats - // -------------------------------------- - - bool fCreateImplicitInitialRepeatBarline; - - - // notes - // -------------------------------------- - - bool fDelayRestsDynamics; - bool fDelayRestsWords; // JMI - bool fDelayRestsBeams; // JMI - bool fDelayRestsSlurs; // JMI - bool fDelayRestsLigatures; // JMI - bool fDelayRestsPedals; // JMI - bool fDelayRestsSlashes; // JMI - bool fDelayRestsWedges; // JMI - - bool fSlashAllGraceNotes; - bool fSlurAllGraceNotes; - - // articulations - // -------------------------------------- - - bool fOmitArticulations; - - - // ornaments - // -------------------------------------- - - - bool fOmitOrnaments; - - // words - // -------------------------------------- - - bool fOmitWords; - - // ties - // -------------------------------------- - - bool fOmitTies; - - // dynamics - // -------------------------------------- - - bool fOmitDynamics; - - // slurs - // -------------------------------------- - - bool fOmitSlurs; - - // wedges - // -------------------------------------- - - bool fOmitWedges; - - // lyrics - // -------------------------------------- - - bool fAddStanzasNumbers; // LPSR ??? JMI - - bool fOmitLyrics; - - - // harmonies - // -------------------------------------- - - bool fShowHarmonyVoices; - - bool fOmitHarmonies; - - - // figured bass - // -------------------------------------- - - bool fShowFiguredBassVoices; - - bool fOmitFiguredBasses; - - - // exit after some passes - // -------------------------------------- - - bool fExit2a; - bool fExit2b; -}; -typedef SMARTP S_msrOah; -EXP ostream& operator<< (ostream& os, const S_msrOah& elt); - -EXP extern S_msrOah gMsrOah; -EXP extern S_msrOah gMsrOahUserChoices; -EXP extern S_msrOah gMsrOahWithDetailedTrace; - -//______________________________________________________________________________ -void initializeMsrOahHandling ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/msrOah2ManPageGenerator.cpp b/src/lilypond/msrOah2ManPageGenerator.cpp deleted file mode 100644 index 0f505813a..000000000 --- a/src/lilypond/msrOah2ManPageGenerator.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "msrOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -msrOah2ManPageGenerator::msrOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -msrOah2ManPageGenerator::~msrOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void msrOah2ManPageGenerator::visitStart (S_msrRenamePartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting msrRenamePartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void msrOah2ManPageGenerator::visitEnd (S_msrRenamePartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting msrRenamePartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrOah2ManPageGenerator::visitStart (S_msrTransposePartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting msrTransposePartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void msrOah2ManPageGenerator::visitEnd (S_msrTransposePartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting msrTransposePartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrOah2ManPageGenerator::visitStart (S_msrOmitPartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting msrOmitPartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void msrOah2ManPageGenerator::visitEnd (S_msrOmitPartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting msrOmitPartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrOah2ManPageGenerator::visitStart (S_msrKeepPartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting msrKeepPartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void msrOah2ManPageGenerator::visitEnd (S_msrKeepPartAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting msrKeepPartAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrOah2ManPageGenerator::visitStart (S_msrPitchesLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting msrPitchesLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void msrOah2ManPageGenerator::visitEnd (S_msrPitchesLanguageAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting msrPitchesLanguageAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/msrOah2ManPageGenerator.h b/src/lilypond/msrOah2ManPageGenerator.h deleted file mode 100644 index 87942d370..000000000 --- a/src/lilypond/msrOah2ManPageGenerator.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrOah2ManPageGenerator___ -#define ___msrOah2ManPageGenerator___ - -#include "msrOah.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class msrOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor, - - public visitor, - - public visitor, - - public visitor, - - public visitor - -{ - public: - - msrOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~msrOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_msrRenamePartAtom& elt); - virtual void visitEnd (S_msrRenamePartAtom& elt); - - virtual void visitStart (S_msrTransposePartAtom& elt); - virtual void visitEnd (S_msrTransposePartAtom& elt); - - virtual void visitStart (S_msrOmitPartAtom& elt); - virtual void visitEnd (S_msrOmitPartAtom& elt); - - virtual void visitStart (S_msrKeepPartAtom& elt); - virtual void visitEnd (S_msrKeepPartAtom& elt); - - virtual void visitStart (S_msrPitchesLanguageAtom& elt); - virtual void visitEnd (S_msrPitchesLanguageAtom& elt); -}; -typedef SMARTP S_msrOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/msrOrnaments.cpp b/src/lilypond/msrOrnaments.cpp deleted file mode 100644 index 1e5fffae4..000000000 --- a/src/lilypond/msrOrnaments.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrOrnament msrOrnament::create ( - int inputLineNumber, - msrOrnamentKind ornamentKind, - msrPlacementKind ornamentPlacementKind) -{ - msrOrnament* o = - new msrOrnament ( - inputLineNumber, ornamentKind, ornamentPlacementKind); - assert (o!=0); - return o; -} - -msrOrnament::msrOrnament ( - int inputLineNumber, - msrOrnamentKind ornamentKind, - msrPlacementKind ornamentPlacementKind) - : msrElement (inputLineNumber) -{ - fOrnamentKind = ornamentKind; - - fOrnamentPlacementKind = ornamentPlacementKind; - - fOrnamentAccidentalMark = k_NoAlteration; -} - -msrOrnament::~msrOrnament () -{} - -string msrOrnament::ornamentKindAsString () const -{ - string result; - - switch (fOrnamentKind) { - case msrOrnament::kOrnamentTrill: - result = "ornamentTrill"; - break; - case msrOrnament::kOrnamentDashes: - result = "ornamentDashes"; - break; - case msrOrnament::kOrnamentTurn: - result = "ornamentTurn"; - break; - case msrOrnament::kOrnamentInvertedTurn: - result = "ornamentInvertedTurn"; - break; - case msrOrnament::kOrnamentDelayedTurn: - result = "ornamentDelayedTurn"; - break; - case msrOrnament::kOrnamentDelayedInvertedTurn: - result = "ornamentDelayedInvertedTurn"; - break; - case msrOrnament::kOrnamentVerticalTurn: - result = "ornamentVerticalTurn"; - break; - case msrOrnament::kOrnamentMordent: - result = "ornamentMordent"; - break; - case msrOrnament::kOrnamentInvertedMordent: - result = "ornamentInvertedMordent"; - break; - case msrOrnament::kOrnamentSchleifer: - result = "ornamentSchleifer"; - break; - case msrOrnament::kOrnamentShake: - result = "ornamentShake"; - break; - case msrOrnament::kOrnamentAccidentalMark: - result = "ornamentAccidentalMark"; - break; - } // switch - - return result; -} - -string msrOrnament::ornamentPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fOrnamentPlacementKind); -} - -string msrOrnament::ornamentAccidentalMarkAsString () const -{ - string result; - - switch (fOrnamentAccidentalMark) { - case kTripleFlat: - result = "tripleFlat"; - break; - case kDoubleFlat: - result = "doubleFlat"; - break; - case kSesquiFlat: - result = "sesquiFlat"; - break; - case kFlat: - result = "flat"; - break; - case kSemiFlat: - result = "semiFlat"; - break; - case kNatural: - result = "natural"; - break; - case kSemiSharp: - result = "semiSharp"; - break; - case kSharp: - result = "sharp"; - break; - case kSesquiSharp: - result = "sesquiSharp"; - break; - case kDoubleSharp: - result = "doubleSharp"; - break; - case kTripleSharp: - result = "tripleSharp"; - break; - case k_NoAlteration: - result = "noAlteration"; - break; - } // switch - - return result; -} - -void msrOrnament::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrOrnament::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOrnament elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrOrnament::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrOrnament::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrOrnament::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOrnament elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrOrnament::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrOrnament::browseData (basevisitor* v) -{} - -void msrOrnament::print (ostream& os) const -{ - os << - "Ornament" << - ", " << ornamentKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - os << - setw (fieldWidth) << - "placement" << " : " << - ornamentPlacementKindAsString () << - endl << - setw (fieldWidth) << - "accidental mark" << " : " << - ornamentAccidentalMarkAsString () << - endl << - setw (fieldWidth) << - "noteUpLink" << " : " << - fOrnamentNoteUpLink->asShortString () << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrOrnament& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrOrnaments_MUT_DEP.h b/src/lilypond/msrOrnaments_MUT_DEP.h deleted file mode 100644 index 91d24fd78..000000000 --- a/src/lilypond/msrOrnaments_MUT_DEP.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrOrnament : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrOrnamentKind { - kOrnamentTrill, kOrnamentDashes, - kOrnamentTurn, kOrnamentInvertedTurn, kOrnamentDelayedTurn, - kOrnamentDelayedInvertedTurn, kOrnamentVerticalTurn, - kOrnamentMordent, kOrnamentInvertedMordent, - kOrnamentSchleifer, kOrnamentShake, - kOrnamentAccidentalMark }; - - static string ornamentKindAsString ( - msrOrnamentKind ornamentKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrOrnamentKind ornamentKind, - msrPlacementKind ornamentPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrOrnament ( - int inputLineNumber, - msrOrnamentKind ornamentKind, - msrPlacementKind ornamentPlacementKind); - - virtual ~msrOrnament (); - - public: - - // set and get - // ------------------------------------------------------ - - void setOrnamentNoteUpLink (S_msrNote note) - { fOrnamentNoteUpLink = note; } - - S_msrNote getOrnamentNoteUpLink () const - { return fOrnamentNoteUpLink; } - - msrOrnamentKind getOrnamentKind () const - { return fOrnamentKind; } - - void setOrnamentPlacementKind ( - msrPlacementKind - ornamentPlacementKind) - { - fOrnamentPlacementKind = - ornamentPlacementKind; - } - - msrPlacementKind getOrnamentPlacementKind () const - { return fOrnamentPlacementKind; } - - void setOrnamentAccidentalMarkKind ( - msrAlterationKind - ornamentAccidentalMark) - { - fOrnamentAccidentalMark = - ornamentAccidentalMark; - } - - msrAlterationKind getOrnamentAccidentalMark () const - { return fOrnamentAccidentalMark; } - - // services - // ------------------------------------------------------ - - string ornamentKindAsString () const; - - string ornamentPlacementKindAsString () const; - - string ornamentAccidentalMarkAsString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrNote fOrnamentNoteUpLink; - - msrOrnamentKind fOrnamentKind; - - msrPlacementKind fOrnamentPlacementKind; - - msrAlterationKind fOrnamentAccidentalMark; -}; -typedef SMARTP S_msrOrnament; -EXP ostream& operator<< (ostream& os, const S_msrOrnament& elt); - diff --git a/src/lilypond/msrOtherElements.cpp b/src/lilypond/msrOtherElements.cpp deleted file mode 100644 index 745311dac..000000000 --- a/src/lilypond/msrOtherElements.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrOtherElements.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrSegno msrSegno::create ( - int inputLineNumber) -{ - msrSegno* o = - new msrSegno ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrSegno::msrSegno ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{} - -msrSegno::~msrSegno () -{} - -void msrSegno::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSegno::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSegno elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSegno::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSegno::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSegno::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSegno elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSegno::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrSegno::browseData (basevisitor* v) -{} - -void msrSegno::print (ostream& os) const -{ - os << - "Segno" << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrSegno& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrCoda msrCoda::create ( - int inputLineNumber) -{ - msrCoda* o = - new msrCoda ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrCoda::msrCoda ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{} - -msrCoda::~msrCoda () -{} - -void msrCoda::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrCoda::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrCoda elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrCoda::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrCoda::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrCoda::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrCoda elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrCoda::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrCoda::browseData (basevisitor* v) -{} - -void msrCoda::print (ostream& os) const -{ - os << - "Coda" << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrCoda& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrEyeGlasses msrEyeGlasses::create ( - int inputLineNumber) -{ - msrEyeGlasses* o = - new msrEyeGlasses ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrEyeGlasses::msrEyeGlasses ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{} - -msrEyeGlasses::~msrEyeGlasses () -{} - -void msrEyeGlasses::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrEyeGlasses::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrEyeGlasses elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrEyeGlasses::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrEyeGlasses::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrEyeGlasses::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrEyeGlasses elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrEyeGlasses::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrEyeGlasses::browseData (basevisitor* v) -{} - -void msrEyeGlasses::print (ostream& os) const -{ - os << - "EyeGlasses" << - ", line " << fInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrEyeGlasses& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -/* -void msrPolyphony::print (ostream& os) const -{ - const int fieldWidth = 9; - - os << left << - setw (fieldWidth) << - "fBeatUnit" << " = " << fBeatUnit << - endl << - setw (fieldWidth) << - "fDots" << " = " << fDots << - endl; -}; -*/ - - -} diff --git a/src/lilypond/msrOtherElements.h b/src/lilypond/msrOtherElements.h deleted file mode 100644 index e76409cf1..000000000 --- a/src/lilypond/msrOtherElements.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrOtherElements___ -#define ___msrOtherElements___ - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrSegno : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSegno ( - int inputLineNumber); - - virtual ~msrSegno (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_msrSegno; -EXP ostream& operator<< (ostream& os, const S_msrSegno& elt); - -//______________________________________________________________________________ -class msrCoda : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrCoda ( - int inputLineNumber); - - virtual ~msrCoda (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_msrCoda; -EXP ostream& operator<< (ostream& os, const S_msrCoda& elt); - -//______________________________________________________________________________ -class msrEyeGlasses : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrEyeGlasses ( - int inputLineNumber); - - virtual ~msrEyeGlasses (); - - public: - - // set and get - // ------------------------------------------------------ - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_msrEyeGlasses; -EXP ostream& operator<< (ostream& os, const S_msrEyeGlasses& elt); - -//______________________________________________________________________________ -/* -class msrPolyphony : public smartable -{ - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - public: - - // fields - // ------------------------------------------------------ - - // what happens every measure - list fPolyphonyMeasureActivities; - - // what happens to the voices - list fPolyphonyVoiceActivities; -}; -*/ - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrPartGroupElements.cpp b/src/lilypond/msrPartGroupElements.cpp deleted file mode 100644 index e39e0631f..000000000 --- a/src/lilypond/msrPartGroupElements.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX - -#include "msrPartGroupElements.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -msrPartGroupElement::msrPartGroupElement ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{ -// fPartGroupNumber = "???"; -// fPositionInPartGroup = rational (INT_MIN, 1); -} - -msrPartGroupElement::~msrPartGroupElement () -{} - -/* JMI -void msrPartGroupElement::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartGroupElement::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartGroupElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartGroupElement::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPartGroupElement::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartGroupElement::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartGroupElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartGroupElement::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -string msrPartGroupElement::asString () const -{ - // this is overriden all in actual elements - return "??? msrPartGroupElement::asString () ???"; -} - -string msrPartGroupElement::asShortString () const -{ - // this can be overriden in actual elements - return asString () const; -} - -void msrPartGroupElement::print (ostream& os) -{ - os << asString () << endl; -} -*/ - -ostream& operator<< (ostream& os, const S_msrPartGroupElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrPartGroupElements.h b/src/lilypond/msrPartGroupElements.h deleted file mode 100644 index d2ede80f0..000000000 --- a/src/lilypond/msrPartGroupElements.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrPartGroupElements___ -#define ___msrPartGroupElements___ - -#include "msrMeasureElements.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -/* - PartGroup elements, i.e. notes, chords and tuplets, can also be found in measures, hence: -*/ -class msrPartGroupElement : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - // cloning - // ------------------------------------------------------ - - protected: - - msrPartGroupElement ( - int inputLineNumber); - - virtual ~msrPartGroupElement (); - - public: - -/* JMI - // set and get - // ------------------------------------------------------ - - void setPartGroupNumber ( - string positionInPartGroup) - { - fPartGroupNumber = - positionInPartGroup; - } - - string getPartGroupNumber () - { return fPartGroupNumber; } - - void setPositionInPartGroup ( - rational positionInPartGroup) - { - fPositionInPartGroup = - positionInPartGroup; - } - - rational getPositionInPartGroup () - { return fPositionInPartGroup; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v) = 0; - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asShortString () const; - virtual std::string asString () const; - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os) {} - - protected: - - // fields - // ------------------------------------------------------ - - string fPartGroupNumber; - rational fPositionInPartGroup; - */ -}; -typedef SMARTP S_msrPartGroupElement; -EXP ostream& operator<< (ostream& os, const S_msrPartGroupElement& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrPartGroups.cpp b/src/lilypond/msrPartGroups.cpp deleted file mode 100644 index d87ba2abe..000000000 --- a/src/lilypond/msrPartGroups.cpp +++ /dev/null @@ -1,1088 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrPartGroups.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrPartGroup msrPartGroup::create ( - int inputLineNumber, - int partGroupNumber, - int partGroupAbsoluteNumber, - string partGroupName, - string partGroupNameDisplayText, - string partGroupAccidentalText, - string partGroupAbbreviation, - msrPartGroupSymbolKind partGroupSymbolKind, - int partGroupSymbolDefaultX, - msrPartGroupBarlineKind partGroupBarlineKind, - S_msrPartGroup partGroupPartGroupUpLink, - S_msrScore partGroupScoreUpLink) -{ - msrPartGroup* o = - new msrPartGroup ( - inputLineNumber, - partGroupNumber, - partGroupAbsoluteNumber, - partGroupName, - partGroupNameDisplayText, - partGroupAccidentalText, - partGroupAbbreviation, - partGroupSymbolKind, - partGroupSymbolDefaultX, - msrPartGroup::kPartGroupImplicitNo, - partGroupBarlineKind, - partGroupPartGroupUpLink, - partGroupScoreUpLink); - assert(o!=0); - return o; -} - -S_msrPartGroup msrPartGroup::createImplicitPartGroup ( - int partGroupNumber, - int partGroupAbsoluteNumber, - string partGroupName, - string partGroupNameDisplayText, - string partGroupAccidentalText, - string partGroupAbbreviation, - msrPartGroupBarlineKind partGroupBarlineKind, - S_msrScore partGroupScoreUpLink) -{ - msrPartGroup* o = - new msrPartGroup ( - K_NO_INPUT_LINE_NUMBER, - partGroupNumber, - partGroupAbsoluteNumber, - partGroupName, - partGroupNameDisplayText, - partGroupAccidentalText, - partGroupAbbreviation, - msrPartGroup::kPartGroupSymbolNone, // partGroupSymbolKind - 0, // partGroupSymbolDefaultX, - msrPartGroup::kPartGroupImplicitYes, - partGroupBarlineKind, - 0, // partGroupPartGroupUpLink, - // will be set below - partGroupScoreUpLink); - assert(o!=0); - - // the implicit part group it the top-most one: - // set its group upLink points to itself - o->fPartGroupPartGroupUpLink = o; - - return o; -} - -msrPartGroup::msrPartGroup ( - int inputLineNumber, - int partGroupNumber, - int partGroupAbsoluteNumber, - string partGroupName, - string partGroupNameDisplayText, - string partGroupAccidentalText, - string partGroupAbbreviation, - msrPartGroupSymbolKind partGroupSymbolKind, - int partGroupSymbolDefaultX, - msrPartGroupImplicitKind partGroupImplicitKind, - msrPartGroupBarlineKind partGroupBarlineKind, - S_msrPartGroup partGroupPartGroupUpLink, - S_msrScore partGroupScoreUpLink) - : msrPartGroupElement (inputLineNumber) -{ - // no sanity check on partGroupPartGroupUpLink here, - // it will be set after all 'real' (i.e. not implicit) - // part groups and part have been analyzed - fPartGroupPartGroupUpLink = partGroupPartGroupUpLink; - -/* JMI - // sanity check - msrAssert ( - fPartGroupScoreUpLink != nullptr, - "fPartGroupScoreUpLink is null"); - */ - - fPartGroupScoreUpLink = partGroupScoreUpLink; - - // other fields - fPartGroupNumber = partGroupNumber; - fPartGroupAbsoluteNumber = partGroupAbsoluteNumber; - - fPartGroupName = partGroupName; - - int partGroupNameLength = - fPartGroupName.size (); - - if ( - partGroupNameLength - > - fPartGroupScoreUpLink->getScorePartGroupNamesMaxLength () - ) { // JMI sanity check ??? - fPartGroupScoreUpLink-> - setScorePartGroupNamesMaxLength ( - partGroupNameLength); - } - - fPartGroupNameDisplayText = partGroupNameDisplayText; - - fPartGroupAccidentalText = partGroupAccidentalText; - - fPartGroupAbbreviation = partGroupAbbreviation; - - fPartGroupSymbolKind = partGroupSymbolKind; - fPartGroupSymbolDefaultX = partGroupSymbolDefaultX; - - fPartGroupImplicitKind = partGroupImplicitKind; - - fPartGroupBarlineKind = partGroupBarlineKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "--------------------------------------------" << - endl << - "Creating part group '" << fPartGroupNumber << "'" << - ", partGroupAbsoluteNumber = " << fPartGroupAbsoluteNumber << - ", line " << inputLineNumber << - endl; - } -#endif -} - -msrPartGroup::~msrPartGroup () -{} - -S_msrPartGroup msrPartGroup::createPartGroupNewbornClone ( - S_msrPartGroup partGroupClone, - S_msrScore scoreClone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "--------------------------------------------" << - endl << - "Creating a newborn clone part group " << - getPartGroupCombinedName () << - endl; - } -#endif - - // don't check partGroupClone against 0, since the partGroup stack JMI - // that it comes from may be empty -/* JMI - // sanity check - msrAssert( - partGroupClone != nullptr, - "partGroupClone is null"); - */ - - // sanity check - msrAssert( - scoreClone != nullptr, - "scoreClone is null"); - - S_msrPartGroup - newbornClone = - msrPartGroup::create ( - fInputLineNumber, - fPartGroupNumber, - fPartGroupAbsoluteNumber, - fPartGroupName, - fPartGroupNameDisplayText, - fPartGroupAccidentalText, - fPartGroupAbbreviation, - fPartGroupSymbolKind, - fPartGroupSymbolDefaultX, - fPartGroupBarlineKind, - partGroupClone, - scoreClone); - - newbornClone->fPartGroupImplicitKind = - fPartGroupImplicitKind; - - newbornClone->fPartGroupInstrumentName = - fPartGroupInstrumentName; - - return newbornClone; -} - -string msrPartGroup::getPartGroupCombinedName () const -{ - stringstream s; - - s << - "PartGroup_" << fPartGroupAbsoluteNumber << - " ('" << fPartGroupNumber << - "', partGroupName \"" << fPartGroupName << "\")"; - - return s.str (); -} - -string msrPartGroup::getPartGroupCombinedNameWithoutEndOfLines () const -{ - list chunksList; - - splitRegularStringAtEndOfLines ( - fPartGroupName, - chunksList); - - stringstream s; - - s << - "PartGroup_" << fPartGroupAbsoluteNumber << - " ('" << fPartGroupNumber << - "', partGroupName \""; - - if (chunksList.size ()) { - // used the chunks separated by a space - list::const_iterator - iBegin = chunksList.begin (), - iEnd = chunksList.end (), - i = iBegin; - - for ( ; ; ) { - s <<(*i); - if (++i == iEnd) break; - s << ' '; - } // for - } - - s << - "\"" << - ", partGroupImplicitKind: " << - partGroupImplicitKindAsString (); - - return s.str (); -} - -void msrPartGroup::setPartGroupInstrumentName ( - string partGroupInstrumentName) -{ - fPartGroupInstrumentName = partGroupInstrumentName; - - S_msrScore - score = - fPartGroupScoreUpLink; - - int partGroupInstrumentNameLength = fPartGroupInstrumentName.size (); - - if ( - partGroupInstrumentNameLength - > - score->getScoreInstrumentNamesMaxLength () - ) { - score-> - setScoreInstrumentNamesMaxLength ( - partGroupInstrumentNameLength); - } -} - -S_msrPart msrPartGroup::appendPartToPartGroupByItsPartID ( - int inputLineNumber, - string partID) -{ - // sanity check - msrAssert ( - partID.size () > 0, - "partID is empty"); - - // has this partID already been added to this part? - if (fPartGroupPartsMap.count (partID)) { - stringstream s; - - s << - "partID \"" << partID << - "\" already exists in part group " << - getPartGroupCombinedName (); - - msrMusicXMLWarning ( // JMI - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - return fPartGroupPartsMap [partID]; - } - - // create the part - S_msrPart - part = - msrPart::create ( - inputLineNumber, - partID, - this); - - // register it in this part group -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Appending part " << - part->getPartCombinedName () << - " to part group '" << - fPartGroupNumber << - "'" << - endl; - } -#endif - - fPartGroupPartsMap [partID] = part; - fPartGroupElements.push_back (part); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - gLogOstream << - endl << - "After appendPartToPartGroupByItsID, fPartGroupPartsMap contains:" << - endl; - - gIndenter++; - - for ( - map::const_iterator i = fPartGroupPartsMap.begin (); - i != fPartGroupPartsMap.end (); - i++ - ) { - gLogOstream << - "\"" << (*i).first << "\" --% --> " << - (*i).second-> - getPartCombinedName () << - endl; - } // for - - gIndenter--; - - gLogOstream << - "After appendPartToPartGroupByItsID, fPartGroupElements contains:" << - endl; - - gIndenter++; - - if (fPartGroupElements.size ()) { - list::const_iterator - iBegin = fPartGroupElements.begin (), - iEnd = fPartGroupElements.end (), - i = iBegin; - - for ( ; ; ) { - gLogOstream << - (*i); - if (++i == iEnd) break; - gLogOstream << endl; - } // for - } - - gIndenter--; - } -#endif - - // return the part - return part; -} - -void msrPartGroup::appendPartToPartGroup (S_msrPart part) -{ - // register part in this part group -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Adding part " << - part->getPartCombinedName () << - " to part group " << fPartGroupNumber << - endl; - } -#endif - - // register part into this part group's data - fPartGroupPartsMap [part->getPartID ()] = part; - fPartGroupElements.push_back (part); - - // set part's partgroup upLink - part->setPartPartGroupUpLink (this); -} - -void msrPartGroup::removePartFromPartGroup ( - int inputLineNumber, - S_msrPart partToBeRemoved) -{ - // register part in this part group -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Removing part " << - partToBeRemoved->getPartCombinedName () << - " from part group " << fPartGroupNumber << - endl; - } -#endif - - gIndenter++; - - for ( - list::iterator i = fPartGroupElements.begin (); - i != fPartGroupElements.end (); - i++ - ) { - S_msrElement - element = (*i); - - if ( - S_msrPartGroup - nestedPartGroup = - dynamic_cast(&(*element)) - ) { - // this is a part group - } - - else if ( - S_msrPart - part = - dynamic_cast(&(*element)) - ) { - // this is a part - if (part == partToBeRemoved) { - fPartGroupElements.erase (i); - break; - } - } - - else { - stringstream s; - - s << - "an element of partgroup " << - getPartGroupCombinedName () << - " is not a part group nor a part"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // for - - gIndenter--; -} - -void msrPartGroup::prependSubPartGroupToPartGroup ( - S_msrPartGroup partGroup) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Prepending (sub-)part group " << partGroup->getPartGroupNumber () << - " to part group " << getPartGroupNumber () << endl; - } -#endif - - // register it in this part group - fPartGroupElements.push_front (partGroup); -} - -void msrPartGroup::appendSubPartGroupToPartGroup ( - S_msrPartGroup partGroup) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - gLogOstream << - "Appending (sub-)part group " << partGroup->getPartGroupNumber () << - " to part group " << getPartGroupNumber () << endl; - } -#endif - - // register it in this part group - fPartGroupElements.push_back (partGroup); -} - -void msrPartGroup::printPartGroupParts ( - int inputLineNumber, - ostream& os) -{ - if (fPartGroupElements.size ()) { - list::const_iterator - iBegin = fPartGroupElements.begin (), - iEnd = fPartGroupElements.end (), - i = iBegin; - - for ( ; ; ) { - S_msrElement - element = (*i); - - if ( - S_msrPartGroup - nestedPartGroup = - dynamic_cast(&(*element)) - ) { - // this is a part group - gLogOstream << - nestedPartGroup-> - getPartGroupCombinedNameWithoutEndOfLines () << - endl; - - gIndenter++; - - nestedPartGroup-> - printPartGroupParts ( - inputLineNumber, - os); - - gIndenter--; - } - - else if ( - S_msrPart - part = - dynamic_cast(&(*element)) - ) { - // this is a part - gLogOstream << - part-> - getPartCombinedName () << - endl; - } - - else { - stringstream s; - - s << - "an element of partgroup " << - getPartGroupCombinedName () << - " is not a part group nor a part"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (++i == iEnd) break; - // JMI os << endl; - } // for - } - - else { - os << - "none" << - endl; - } -} - -S_msrPart msrPartGroup::fetchPartFromPartGroupByItsPartID ( - int inputLineNumber, - string partID) -{ - S_msrPart result; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - gLogOstream << - "fetchPartFromPartGroupByItsPartID(" << partID << "), fPartGroupElements contains:" << - endl; - - gIndenter++; - - printPartGroupParts ( - inputLineNumber, - gLogOstream); - - gIndenter--; - - gLogOstream << - "<=- fetchPartFromPartGroupByItsPartID(" << partID << ")" << - endl << - endl; - } -#endif - - for ( - list::const_iterator i = fPartGroupElements.begin (); - i != fPartGroupElements.end (); - i++ - ) { - S_msrPartGroupElement - element = (*i); - - if ( - S_msrPartGroup - partGroup = - dynamic_cast(&(*element)) - ) { - // this is a part group - S_msrPart - inter = - partGroup-> - fetchPartFromPartGroupByItsPartID ( - inputLineNumber, - partID); - - if (inter) { - result = inter; - break; - } - } - - else if ( - S_msrPart - part = - dynamic_cast(&(*element)) - ) { - // this is a part - if (part->getPartID () == partID) { - result = part; - break; - } - } - - else { - stringstream s; - - s << - "an element of partgroup " << - getPartGroupCombinedName () << - " is not a part group nor a part"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // for - - return result; -} - -void msrPartGroup::collectPartGroupPartsList ( - int inputLineNumber, - list& partsList) -{ - for ( - list::const_iterator i = fPartGroupElements.begin (); - i != fPartGroupElements.end (); - i++ - ) { - S_msrElement - element = (*i); - - if ( - S_msrPartGroup - partGroup = - dynamic_cast(&(*element)) - ) { - // this is a part group - partGroup-> - collectPartGroupPartsList ( - inputLineNumber, - partsList); - } - - else if ( - S_msrPart - part = - dynamic_cast(&(*element)) - ) { - // this is a part - partsList.push_back (part); - } - - else { - stringstream s; - - s << - "an element of partgroup " << - getPartGroupCombinedName () << - " is not a part group nor a part"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // for -} - -void msrPartGroup::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartGroup::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartGroup elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartGroup::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPartGroup::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartGroup::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartGroup elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartGroup::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrPartGroup::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartGroup::browseData ()" << - endl; - } - - for ( - list::const_iterator i = fPartGroupElements.begin (); - i != fPartGroupElements.end (); - i++ - ) { - // browse the part element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% <== msrPartGroup::browseData ()" << - endl; - } -} - -string msrPartGroup::partGroupImplicitKindAsString ( - msrPartGroupImplicitKind partGroupImplicitKind) -{ - string result; - - switch (partGroupImplicitKind) { - case msrPartGroup::kPartGroupImplicitYes: - result = "partGroupImplicitYes"; - break; - case msrPartGroup::kPartGroupImplicitNo: - result = "partGroupImplicitNo"; - break; - } // switch - - return result; -} - -string msrPartGroup::partGroupImplicitKindAsString () const -{ - return - partGroupImplicitKindAsString ( - fPartGroupImplicitKind); -} - -string msrPartGroup::partGroupTypeKindAsString ( - msrPartGroupTypeKind partGroupTypeKind) -{ - string result; - - switch (partGroupTypeKind) { - case msrPartGroup::kPartGroupTypeNone: - result = "partGroupTypeNone"; - break; - case msrPartGroup::kPartGroupTypeStart: - result = "partGroupTypeStart"; - break; - case msrPartGroup::kPartGroupTypeStop: - result = "partGroupTypeStop"; - break; - } // switch - - return result; -} - -string msrPartGroup::partGroupBarlineKindAsString () const -{ - return - partGroupBarlineKindAsString ( - fPartGroupBarlineKind); -} - -string msrPartGroup::asString () const -{ - stringstream s; - - s << - "PartGroup \"" << - getPartGroupCombinedName () << - "\", line " << fInputLineNumber; - - return s.str (); -} - -string msrPartGroup::partGroupSymbolKindAsString ( - msrPartGroupSymbolKind partGroupSymbolKind) -{ - string result; - - switch (partGroupSymbolKind) { - case msrPartGroup::kPartGroupSymbolNone: - result = "partGroupSymbolNone"; - break; - case msrPartGroup::kPartGroupSymbolBrace: - result = "partGroupSymbolBrace"; - break; - case msrPartGroup::kPartGroupSymbolBracket: - result = "partGroupSymbolBracket"; - break; - case msrPartGroup::kPartGroupSymbolLine: - result = "partGroupSymbolLine"; - break; - case msrPartGroup::kPartGroupSymbolSquare: - result = "partGroupSymbolSquare"; - break; - } // switch - - return result; -} - -string msrPartGroup::partGroupBarlineKindAsString ( - msrPartGroupBarlineKind partGroupBarlineKind) -{ - string result; - - switch (partGroupBarlineKind) { - case msrPartGroup::kPartGroupBarlineYes: - result = "partGroupBarlineYes"; - break; - case msrPartGroup::kPartGroupBarlineNo: - result = "partGroupBarlineNo"; - break; - } // switch - - return result; -} - -void msrPartGroup::print (ostream& os) const -{ - os << - "PartGroup" " \"" << getPartGroupCombinedName () << - "\" (" << - singularOrPlural ( - fPartGroupPartsMap.size (), "part", "parts") << - ")" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 25; - - os << left << - setw (fieldWidth) << - "partGroupPartGroupUpLink" << " : "; - - if (fPartGroupPartGroupUpLink) { - // it may be empty - os << - fPartGroupPartGroupUpLink-> - getPartGroupCombinedName (); - } - else { - os << - "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "partGroupName" << " : \"" << - fPartGroupName << - "\"" << - endl; - - os << left << - setw (fieldWidth) << - "partGroupPartGroupUpLink" << " : "; - if (fPartGroupPartGroupUpLink) { - os << - "\"" << - fPartGroupPartGroupUpLink-> - getPartGroupCombinedName () << - "\""; - } - else { - os << - "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "partGroupNameDisplayText" << " : \"" << - fPartGroupNameDisplayText << - "\"" << - endl << - setw (fieldWidth) << - "partGroupAccidentalText" << " : \"" << - fPartGroupAccidentalText << - "\"" << - endl << - setw (fieldWidth) << - "partGroupAbbrevation" << " : \"" << - fPartGroupAbbreviation << - "\"" << - endl << - setw (fieldWidth) << - "partGroupSymbolDefaultX" << " : " << - fPartGroupSymbolDefaultX << - endl << - setw (fieldWidth) << - "partGroupSymbolKind" << " : " << - partGroupSymbolKindAsString ( - fPartGroupSymbolKind) << - endl; - - os << left << - setw (fieldWidth) << - "partGroupImplicit" << " : " << - partGroupImplicitKindAsString ( - fPartGroupImplicitKind) << - endl; - - os << left << - setw (fieldWidth) << - "partGroupBarline" << " : " << - partGroupBarlineKindAsString ( - fPartGroupBarlineKind) << - endl; - - if (fPartGroupElements.size ()) { - os << endl; - list::const_iterator - iBegin = fPartGroupElements.begin (), - iEnd = fPartGroupElements.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - gIndenter--; -} - -void msrPartGroup::printSummary (ostream& os) -{ - os << - "PartGroup" " \"" << getPartGroupCombinedName () << - "\" (" << - singularOrPlural ( - fPartGroupPartsMap.size (), "part", "parts") << - ")" << - endl; - - gIndenter++; - - const int fieldWidth = 24; - - os << left << - setw (fieldWidth) << - "partGroupName" << " : \"" << - fPartGroupName << - "\"" << - endl << - setw (fieldWidth) << - "partGroupAbbrevation" << " : \"" << - fPartGroupAbbreviation << - "\"" << - endl << - setw (fieldWidth) << - "fPartGroupSymbolDefaultX" << " : " << - fPartGroupSymbolDefaultX << - endl << - setw (fieldWidth) << - "partGroupSymbolKind" << " : \"" << - partGroupSymbolKindAsString ( - fPartGroupSymbolKind) << - "\"" << - endl << - - setw (fieldWidth) << - "partGroupImplicit" << " : " << - partGroupImplicitKindAsString ( - fPartGroupImplicitKind) << - endl << - - setw (fieldWidth) << - "partGroupBarline" << " : " << - partGroupBarlineKindAsString ( - fPartGroupBarlineKind) << - endl; - - if (fPartGroupElements.size ()) { - os << endl; - list::const_iterator - iBegin = fPartGroupElements.begin (), - iEnd = fPartGroupElements.end (), - i = iBegin; - - gIndenter++; - for ( ; ; ) { - (*i)->printSummary (os); - if (++i == iEnd) break; - os << endl; - } // for - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrPartGroup& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrPartGroups.h b/src/lilypond/msrPartGroups.h deleted file mode 100644 index 794535802..000000000 --- a/src/lilypond/msrPartGroups.h +++ /dev/null @@ -1,333 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrPartGroups___ -#define ___msrPartGroups___ - -#include "msrPartGroupElements.h" - -#include "msrMutualDependencies.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrPart; -typedef SMARTP S_msrPart; - -class msrPartGroup; -typedef SMARTP S_msrPartGroup; - -class msrScore; -typedef SMARTP S_msrScore; - -//______________________________________________________________________________ -class msrPartGroup : public msrPartGroupElement -{ - public: - - /* - There is no hierarchy implied in part-group elements. - All that matters is the sequence of part-group elements relative to score-part elements. - The sequencing of two consecutive part-group elements does not matter. - It is the default-x attribute that indicates the left-to-right ordering of the group symbols. - - - Trombones - Trb. - brace - yes - - */ - - // data types - // ------------------------------------------------------ - - enum msrPartGroupImplicitKind { - kPartGroupImplicitYes, kPartGroupImplicitNo}; - - static string partGroupImplicitKindAsString ( - msrPartGroupImplicitKind partGroupImplicitKind); - - enum msrPartGroupTypeKind { - kPartGroupTypeNone, - kPartGroupTypeStart, kPartGroupTypeStop }; - - static string partGroupTypeKindAsString ( - msrPartGroupTypeKind partGroupTypeKind); - - enum msrPartGroupSymbolKind { - kPartGroupSymbolNone, - kPartGroupSymbolBrace, kPartGroupSymbolBracket, - kPartGroupSymbolLine, kPartGroupSymbolSquare}; - - static string partGroupSymbolKindAsString ( - msrPartGroupSymbolKind partGroupSymbolKind); - - enum msrPartGroupBarlineKind { - kPartGroupBarlineYes, kPartGroupBarlineNo}; - - static string partGroupBarlineKindAsString ( - msrPartGroupBarlineKind partGroupBarlineKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int partGroupNumber, - int partGroupAbsoluteNumber, - string partGroupName, - string partGroupNameDisplayText, - string partGroupAccidentalText, - string partGroupAbbreviation, - msrPartGroupSymbolKind partGroupSymbolKind, - int partGroupSymbolDefaultX, - msrPartGroupBarlineKind partGroupBarlineKind, - S_msrPartGroup partGroupPartGroupUpLink, - S_msrScore partGroupScoreUpLink); - - static SMARTP createImplicitPartGroup ( - int partGroupNumber, - int partGroupAbsoluteNumber, - string partGroupName, - string partGroupNameDisplayText, - string partGroupAccidentalText, - string partGroupAbbreviation, - msrPartGroupBarlineKind partGroupBarlineKind, - S_msrScore partGroupScoreUpLink); - - SMARTP createPartGroupNewbornClone ( - S_msrPartGroup partGroupClone, // the upLink for embeddeed part groups - S_msrScore scoreClone); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPartGroup ( - int inputLineNumber, - int partGroupNumber, - int partGroupAbsoluteNumber, - string partGroupName, - string partGroupNameDisplayText, - string partGroupAccidentalText, - string partGroupAbbreviation, - msrPartGroupSymbolKind partGroupSymbolKind, - int partGroupSymbolDefaultX, - msrPartGroupImplicitKind partGroupImplicitKind, - msrPartGroupBarlineKind partGroupBarlineKind, - S_msrPartGroup partGroupPartGroupUpLink, - S_msrScore partGroupScoreUpLink); - - virtual ~msrPartGroup (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - void setPartGroupPartGroupUpLink ( - S_msrPartGroup partGroup) - { - fPartGroupPartGroupUpLink = - partGroup; - } - - S_msrPartGroup getPartGroupPartGroupUpLink () const - { return fPartGroupPartGroupUpLink; } - - S_msrScore getPartGroupScoreUpLink () const - { return fPartGroupScoreUpLink; } - - // numbers - int getPartGroupAbsoluteNumber () const - { return fPartGroupAbsoluteNumber; } - - int getPartGroupNumber () const - { return fPartGroupNumber; } - - // names - - string getPartGroupCombinedName () const; - - string getPartGroupCombinedNameWithoutEndOfLines () const; - // for comments in LilyPond code - - // miscellaneous - - string getPartGroupNameDisplayText () const - { return fPartGroupNameDisplayText; } - - string getPartGroupAccidentalText () const - { return fPartGroupAccidentalText; } - - string getPartGroupName () const - { return fPartGroupName; } - - string getPartGroupAbbreviation () const - { return fPartGroupAbbreviation; } - - msrPartGroupSymbolKind - getPartGroupSymbolKind () const - { return fPartGroupSymbolKind; } - - int getPartGroupSymbolDefaultX () const - { return fPartGroupSymbolDefaultX; } - - msrPartGroupImplicitKind - getPartGroupImplicitKind () const - { return fPartGroupImplicitKind; } - - msrPartGroupBarlineKind - getPartGroupBarlineKind () const - { return fPartGroupBarlineKind; } - - void setPartGroupInstrumentName (string name); - - string getPartGroupInstrumentName () const - { return fPartGroupInstrumentName; } - - const list& - getPartGroupElements () const - { return fPartGroupElements; } - - // services - // ------------------------------------------------------ - - S_msrPart appendPartToPartGroupByItsPartID ( // JMI superflous - int inputLineNumber, - string partID); - - void appendPartToPartGroup (S_msrPart part); - - void removePartFromPartGroup ( - int inputLineNumber, - S_msrPart partToBeRemoved); - - void prependSubPartGroupToPartGroup ( - S_msrPartGroup partGroup); - - void appendSubPartGroupToPartGroup ( - S_msrPartGroup partGroup); - - S_msrPart fetchPartFromPartGroupByItsPartID ( - int inputLineNumber, - string partID); - - void collectPartGroupPartsList ( - int inputLineNumber, - list& partsList); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string partGroupSymbolKindAsString () const - { - return - partGroupSymbolKindAsString ( - fPartGroupSymbolKind); - } - - void printPartGroupParts ( - int inputLineNumber, - ostream& os); - - string partGroupImplicitKindAsString () const; - - string partGroupBarlineKindAsString () const; - - virtual string asString () const; - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os); - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - - S_msrPartGroup fPartGroupPartGroupUpLink; - // part groups can be nested - - S_msrScore fPartGroupScoreUpLink; - - // numbers - - int fPartGroupNumber; - int fPartGroupAbsoluteNumber; - - // name - - string fPartGroupName; - string fPartGroupNameDisplayText; - - string fPartGroupAccidentalText; - - string fPartGroupAbbreviation; - - // symbol kind - - msrPartGroupSymbolKind - fPartGroupSymbolKind; - - // default X - - int fPartGroupSymbolDefaultX; - - // implicit - - msrPartGroupImplicitKind - fPartGroupImplicitKind; - - // bar line - - msrPartGroupBarlineKind - fPartGroupBarlineKind; - - // instrument name - - string fPartGroupInstrumentName; // JMI - - // accessing parts by name - map - fPartGroupPartsMap; - - // allowing for both parts and (sub-)part groups as elements - list - fPartGroupElements; -}; -typedef SMARTP S_msrPartGroup; -EXP ostream& operator<< (ostream& os, const S_msrPartGroup& elt); - - -} - -#endif diff --git a/src/lilypond/msrPartNamesDisplays.cpp b/src/lilypond/msrPartNamesDisplays.cpp deleted file mode 100644 index 68d7446e8..000000000 --- a/src/lilypond/msrPartNamesDisplays.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrPartNamesDisplays.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrPartNameDisplay msrPartNameDisplay::create ( - int inputLineNumber, - string partNameDisplayValue) -{ - msrPartNameDisplay* o = - new msrPartNameDisplay ( - inputLineNumber, partNameDisplayValue); - assert(o!=0); - return o; -} - -msrPartNameDisplay::msrPartNameDisplay ( - int inputLineNumber, - string partNameDisplayValue) - : msrMeasureElement (inputLineNumber) -{ - fPartNameDisplayValue = partNameDisplayValue; -} - -msrPartNameDisplay::~msrPartNameDisplay () -{} - -void msrPartNameDisplay::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartNameDisplay::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartNameDisplay elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartNameDisplay::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPartNameDisplay::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartNameDisplay::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartNameDisplay elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartNameDisplay::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrPartNameDisplay::browseData (basevisitor* v) -{} - -string msrPartNameDisplay::asString () const -{ - stringstream s; - - s << - "PartNameDisplay" << - ", line " << fInputLineNumber << - ", partNameDisplayValue: " << fPartNameDisplayValue; - - return s.str (); -} - -void msrPartNameDisplay::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrPartNameDisplay& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrPartAbbreviationDisplay msrPartAbbreviationDisplay::create ( - int inputLineNumber, - string partAbbreviationDisplayValue) -{ - msrPartAbbreviationDisplay* o = - new msrPartAbbreviationDisplay ( - inputLineNumber, partAbbreviationDisplayValue); - assert(o!=0); - return o; -} - -msrPartAbbreviationDisplay::msrPartAbbreviationDisplay ( - int inputLineNumber, - string partAbbreviationDisplayValue) - : msrMeasureElement (inputLineNumber) -{ - fPartAbbreviationDisplayValue = partAbbreviationDisplayValue; -} - -msrPartAbbreviationDisplay::~msrPartAbbreviationDisplay () -{} - -void msrPartAbbreviationDisplay::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartAbbreviationDisplay::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartAbbreviationDisplay elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartAbbreviationDisplay::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPartAbbreviationDisplay::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPartAbbreviationDisplay::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPartAbbreviationDisplay elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPartAbbreviationDisplay::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrPartAbbreviationDisplay::browseData (basevisitor* v) -{} - -string msrPartAbbreviationDisplay::asString () const -{ - stringstream s; - - s << - "PartAbbreviationDisplay" << - ", line " << fInputLineNumber << - ", " << - "partAbbreviationDisplayValue: " << fPartAbbreviationDisplayValue; - - return s.str (); -} - -void msrPartAbbreviationDisplay::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrPartAbbreviationDisplay& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrPartNamesDisplays.h b/src/lilypond/msrPartNamesDisplays.h deleted file mode 100644 index ebd607afe..000000000 --- a/src/lilypond/msrPartNamesDisplays.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrPartNamesDisplays___ -#define ___msrPartNamesDisplays___ - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrPartNameDisplay : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string partNameDisplayValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPartNameDisplay ( - int inputLineNumber, - string partNameDisplayValue); - - virtual ~msrPartNameDisplay (); - - public: - - // set and get - // ------------------------------------------------------ - - string getPartNameDisplayValue () const - { return fPartNameDisplayValue; } - - // services - // ------------------------------------------------------ - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fPartNameDisplayValue; -}; -typedef SMARTP S_msrPartNameDisplay; -EXP ostream& operator<< (ostream& os, const S_msrPartNameDisplay& elt); - -//______________________________________________________________________________ -class msrPartAbbreviationDisplay : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string partAbbreviationDisplayValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPartAbbreviationDisplay ( - int inputLineNumber, - string partAbbreviationDisplayValue); - - virtual ~msrPartAbbreviationDisplay (); - - public: - - // set and get - // ------------------------------------------------------ - - string getPartAbbreviationDisplayValue () const - { return fPartAbbreviationDisplayValue; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - string fPartAbbreviationDisplayValue; -}; -typedef SMARTP S_msrPartAbbreviationDisplay; -EXP ostream& operator<< (ostream& os, const S_msrPartAbbreviationDisplay& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrParts.cpp b/src/lilypond/msrParts.cpp deleted file mode 100644 index ba021ce90..000000000 --- a/src/lilypond/msrParts.cpp +++ /dev/null @@ -1,2109 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -int msrPart::gPartsCounter = 0; - -S_msrPart msrPart::create ( - int inputLineNumber, - string partID, - S_msrPartGroup partPartGroupUpLink) -{ - msrPart* o = - new msrPart ( - inputLineNumber, - partID, - partPartGroupUpLink); - assert(o!=0); - return o; -} - -msrPart::msrPart ( - int inputLineNumber, - string partID, - S_msrPartGroup partPartGroupUpLink) - : msrPartGroupElement (inputLineNumber) -{ - // replace spaces in partID to set fPartID - for_each ( - partID.begin (), - partID.end (), - stringSpaceReplacer (fPartID, '_')); - -/* JMI - // sanity check - msrAssert( - partPartGroupUpLink != nullptr, - "partPartGroupUpLink is null"); - */ - - // set part number - fPartAbsoluteNumber = ++gPartsCounter; - - // set part's part group upLink - fPartPartGroupUpLink = partPartGroupUpLink; - - // do other initializations - initializePart (); -} - -void msrPart::initializePart () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Creating part \"" << asString () << "\"" << - endl; - - gMsrOah->printMsrOahValues (40); // JMI - } -#endif - - // is this part name in the part renaming map? - map::const_iterator - it = - gMsrOah->fPartsRenamingMap.find (fPartID); - - if (it != gMsrOah->fPartsRenamingMap.end ()) { - // yes, rename the part accordinglingly - fPartMsrName = (*it).second; - } - else { - // coin the name from the argument - fPartMsrName = - "Part_"+stringNumbersToEnglishWords (fPartID); - } - - // initialize part's number of measures - fPartNumberOfMeasures = 0; - - // rest measures - fPartContainsRestMeasures = false; - - // current position in measure - fPartCurrentPositionInMeasure = rational (0,0); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Creating part \"" << asString () << "\"" << - endl; - } -#endif -} - -msrPart::~msrPart () -{} - -S_msrPart msrPart::createPartNewbornClone (S_msrPartGroup partGroupClone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Creating a newborn clone of part " << - getPartCombinedName () << - endl; - } -#endif - - // sanity check - msrAssert( - partGroupClone != nullptr, - "partGroupClone is null"); - - S_msrPart - newbornClone = - msrPart::create ( - fInputLineNumber, - fPartID, - partGroupClone); - - newbornClone->fPartMsrName = - fPartMsrName; - - newbornClone->fPartName = - fPartName; - newbornClone->fPartNameDisplayText = - fPartNameDisplayText; - - newbornClone->fPartAbbreviation = - fPartAbbreviation; - newbornClone->fPartAbbreviationDisplayText = - fPartAbbreviationDisplayText; - - newbornClone->fPartInstrumentName = - fPartInstrumentName; - newbornClone->fPartInstrumentAbbreviation = - fPartInstrumentAbbreviation; - - return newbornClone; -} - -/* JMI -void msrPart::setPartInstrumentAbbreviation ( - string partInstrumentAbbreviation) - { - fPartInstrumentAbbreviation = - partInstrumentAbbreviation; - } -*/ - -/* JMI -void msrPart::createPartFiguredBassStaffAndVoiceIfNotYetDone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceParts - || - gTraceOah->fTraceFiguredBasses - || - gTraceOah->fTraceStaves - || - gTraceOah->fTraceVoices) { - gLogOstream << - "Creating the figured bass staff" << - " with number " << K_PART_FIGURED_BASS_STAFF_NUMBER << - " and corredponding voice for part " << - getPartCombinedName () << - " if not yet done" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTraceVoices) { - gLogOstream << - endl << - "*********** createPartFiguredBassStaffAndVoiceIfNotYetDone() 1" << - endl << - endl; - print (gLogOstream); - gLogOstream << - "***********" << - endl << - endl; - } -#endif - - if (! fPartFiguredBassStaff) { - gIndenter++; - - // create the part figured bass staff - fPartFiguredBassStaff = - addStaffToPartByItsNumber ( - inputLineNumber, - msrStaff::kStaffFiguredBass, - K_PART_FIGURED_BASS_STAFF_NUMBER); - - // create the part figured bass voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTraceVoices) { - gLogOstream << - "Creating figured bass voice " << - " number " << K_PART_FIGURED_BASS_VOICE_NUMBER << - " for part " << - getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the figured bass voice - fPartFiguredBassVoice = - msrVoice::create ( - inputLineNumber, - msrVoice::kVoiceFiguredBass, - K_PART_FIGURED_BASS_VOICE_NUMBER, - msrVoice::kCreateInitialLastSegmentYes, - fPartFiguredBassStaff); - - // register it in figured bass staff - fPartFiguredBassStaff-> - registerVoiceInStaff ( - inputLineNumber, - fPartFiguredBassVoice ); - - if (fPartCurrentTime) { - // append part current time to figured bass voice - fPartFiguredBassVoice-> - appendTimeToVoice ( - fPartCurrentTime); - } - - gIndenter--; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies || gTraceOah->fTraceVoices) { - gLogOstream << - endl << - "*********** createPartFiguredBassStaffAndVoiceIfNotYetDone() 2" << - endl << - endl; - print (gLogOstream); - gLogOstream << - "***********" << - endl << - endl; - } -#endif -} -*/ - -void msrPart::setPartCurrentPositionInMeasure ( - int inputLineNumber, - rational positionInMeasure) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Setting part current position in measure to " << - positionInMeasure << - " in part " << - getPartCombinedName () << - endl; - } -#endif - - if (positionInMeasure.getNumerator () < 0) { - stringstream s; - - s << - "cannot set part current position in measure to " << - positionInMeasure << - " in part " << - getPartCombinedName () << - " since it is negative"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fPartCurrentPositionInMeasure = - positionInMeasure; -} - -void msrPart::incrementPartCurrentPositionInMeasure ( - int inputLineNumber, - rational duration) -{ - fPartCurrentPositionInMeasure += duration; - fPartCurrentPositionInMeasure.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Incrementing part current position in measure by " << - duration << - " in part " << - getPartCombinedName () << - ", thus setting it to " << - fPartCurrentPositionInMeasure << - endl; - } -#endif -} - -void msrPart::decrementPartCurrentPositionInMeasure ( - int inputLineNumber, - rational duration) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Decrementing part current position in measure by " << - duration << - " in part " << - getPartCombinedName () << - endl; - } -#endif - - fPartCurrentPositionInMeasure -= duration; - fPartCurrentPositionInMeasure.rationalise (); - - if (fPartCurrentPositionInMeasure.getNumerator () < 0) { - stringstream s; - - s << - "cannot decrement part current position in measure by " << - duration << - " in part " << - getPartCombinedName () << - " since that sets it to " << - fPartCurrentPositionInMeasure << - ", which is negative "; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void msrPart::assignSequentialNumbersToRegularVoicesInPart ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts || gTraceOah->fTraceVoices) { - gLogOstream << - "Assigning sequential numbers to the regular voices in part \"" << - fPartID << - ", " << - fPartName << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - assignSequentialNumbersToRegularVoicesInStaff ( - inputLineNumber); - } // for -} - -void msrPart::addAVoiceToStavesThatHaveNone ( - int inputLineNumber) -{ - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - addAVoiceToStaffIfItHasNone ( - inputLineNumber); - } // for -} - -void msrPart::setPartMsrName (string partMsrName) -{ - // is this part name in the part renaming map? - map::const_iterator - it = - gMsrOah->fPartsRenamingMap.find (fPartMsrName); - - if (it != gMsrOah->fPartsRenamingMap.end ()) { - // yes, rename the part accordinglingly - fPartMsrName = (*it).second; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Setting part name of " << getPartCombinedName () << - " to \"" << fPartMsrName << "\"" << - endl; - } -#endif - } - else { - // use the argument - fPartMsrName = partMsrName; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Keeping partID \"" << partMsrName << - "\" as part name for " << getPartCombinedName () << - endl; - } -#endif - } -} - -string msrPart::getPartCombinedName () const -{ - stringstream s; - - if (! fPartMsrName.size ()) { - s << - "[empty name]"; - } - else { - s << - // JMI "\"" << - fPartMsrName - // JMI << "\"" - ; - } - - s << - " (partID \"" << fPartID << "\""; - - if (fPartName.size ()) { - s << - ", partName \"" << fPartName << "\""; - } - - s << - ")"; - - return s.str (); -} - -void msrPart::createMeasureAndAppendItToPart ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating and appending measure '" << - measureNumber << - "' to part " << - getPartCombinedName () << - "', line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // set part current measure number - fPartCurrentMeasureNumber = measureNumber; - - // create and append measure to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - createMeasureAndAppendItToStaff ( - inputLineNumber, - measureNumber, - measureImplicitKind); - } // for - - gIndenter--; -} - -void msrPart::setNextMeasureNumberInPart ( - int inputLineNumber, - string nextMeasureNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting next measure number to '" << - nextMeasureNumber << - "' in part " << - getPartCombinedName () << - "', line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // set next measure number in registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - setNextMeasureNumberInStaff ( - inputLineNumber, - nextMeasureNumber); - } // for - - gIndenter--; -} - -/* JMI -void msrPart::complementPartVoicesUpToMeasure ( - int inputLineNumber, - string measureNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Complement part voices up to measure number " << measureNumber << - ", line " << inputLineNumber << - ", in part " << getPartCombinedName () << - endl; - } -#endif - - // propagate to all staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - / * JMI - staff-> - createMeasureAndAppendItToStaff ( - inputLineNumber, - measureNumber, - measureImplicitKind); - } // for -} -*/ - -void msrPart::appendStaffDetailsToPart ( - S_msrStaffDetails staffDetails) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffDetails) { - gLogOstream << - "Appending staff details\"" << - staffDetails->asShortString () << - "\" to part " << getPartCombinedName () << - endl; - } -#endif - - // register staff details in part - fCurrentPartStaffDetails = staffDetails; - - // append staff details to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - appendStaffDetailsToStaff ( - staffDetails); - } // for -} - -void msrPart::appendClefToPart (S_msrClef clef) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Appending clef '" << - clef->asString () << - "' to part " << getPartCombinedName () << - endl; - } -#endif - - gIndenter++; - - // append clef to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendClefToStaff ( - clef); - } // for - - gIndenter--; -} - -void msrPart::appendKeyToPart (S_msrKey key) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Appending key '" << - key->asString () << - "' to part " << getPartCombinedName () << - endl; - } -#endif - - // set part key - fPartCurrentKey = key; - - gIndenter++; - - // append key to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - appendKeyToStaff ( - key); - } // for - - gIndenter--; -} - -void msrPart::appendTimeToPart (S_msrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time '" << - time->asString () << - "' to part " << getPartCombinedName () << - endl; - } -#endif - - // set part time - fPartCurrentTime = time; - - gIndenter++; - - // append time to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - appendTimeToStaff ( - time); - } // for - - gIndenter--; -} - -void msrPart::appendTimeToPartClone (S_msrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time '" << - time->asString () << - "' to part clone " << getPartCombinedName () << - endl; - } -#endif - - // set part time - fPartCurrentTime = time; - - gIndenter++; - - // propagate it to all staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - appendTimeToStaffClone (time); - } // for - - gIndenter--; -} - -void msrPart::appendTransposeToPart ( - S_msrTranspose transpose) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Appending transpose \"" << - transpose->asString () << - "\" to part " << getPartCombinedName () << - endl; - } -#endif - - // set part current transpose - fPartCurrentTranspose = transpose; - - // propagate it to all staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - appendTransposeToStaff (transpose); - } // for -} - -void msrPart::appendPartNameDisplayToPart ( - S_msrPartNameDisplay partNameDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Appending part name display \"" << - partNameDisplay->asString () << - "\" to part " << getPartCombinedName () << - endl; - } -#endif - - // set part current transpose -// JMI ??? fPartCurrentTranspose = partNameDisplay; - - // propagate it to all staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - appendPartNameDisplayToStaff (partNameDisplay); - } // for -} - -void msrPart::appendPartAbbreviationDisplayToPart ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Appending part abbreviation display \"" << - partAbbreviationDisplay->asString () << - "\" to part " << getPartCombinedName () << - endl; - } -#endif - - // set part current transpose -// JMI ??? fPartCurrentTranspose = partAbbreviationDisplay; - - // propagate it to all staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = (*i).second; - - staff-> - appendPartAbbreviationDisplayToStaff (partAbbreviationDisplay); - } // for -} - -/* JMI -void msrPart::nestContentsIntoNewRepeatInPart ( - int inputLineNumber) -{ - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - nestContentsIntoNewRepeatInStaff ( - inputLineNumber); - } // for -} -*/ - -void msrPart::handleRepeatStartInPart ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat start in part \"" << - getPartCombinedName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatStartInStaff ( - inputLineNumber); - } // for - - gIndenter--; -} - -void msrPart::handleRepeatEndInPart ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat end in part \"" << - getPartCombinedName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatEndInStaff ( - inputLineNumber, - measureNumber, - repeatTimes); - } // for - - gIndenter--; -} - -void msrPart::handleRepeatEndingStartInPart ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat ending start in part \"" << - getPartCombinedName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatEndingStartInStaff ( - inputLineNumber); - } // for - - gIndenter--; -} - -void msrPart::handleRepeatEndingEndInPart ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a " << - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingKind) << - " repeat ending end in part \"" << - getPartCombinedName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatEndingEndInStaff ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind); - } // for - - gIndenter--; -} - -/* JMI -void msrPart::finalizeRepeatEndInPart ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Finalizing a repeat upon its end in part \"" << - getPartCombinedName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create repeat and append it to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - finalizeRepeatEndInStaff ( - inputLineNumber, - measureNumber, - repeatTimes); - } // for - - gIndenter--; -} -*/ - -void msrPart::appendRepeatCloneToPart ( - int inputLineNumber, - S_msrRepeat repeatCLone) -{ - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = - (*i).second; - - switch (staff->getStaffKind ()) { - case msrStaff::kStaffRegular: - staff->appendRepeatCloneToStaff ( - inputLineNumber, repeatCLone); - break; - - case msrStaff::kStaffTablature: - break; - - case msrStaff::kStaffHarmony: - break; - - case msrStaff::kStaffFiguredBass: - break; - - case msrStaff::kStaffDrum: - staff->appendRepeatCloneToStaff ( - inputLineNumber, repeatCLone); - break; - - case msrStaff::kStaffRythmic: - staff->appendRepeatCloneToStaff ( - inputLineNumber, repeatCLone); - break; - } // switch - } // for -} - -void msrPart::appendRepeatEndingCloneToPart ( - S_msrRepeatEnding repeatEndingCLone) -{ - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendRepeatEndingCloneToStaff (repeatEndingCLone); - } // for -} - -void msrPart::createMeasuresRepeatFromItsFirstMeasuresInPart ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashes) -{ - // create measures repeat from its first measure in registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - createMeasuresRepeatFromItsFirstMeasuresInStaff ( - inputLineNumber, - measuresRepeatMeasuresNumber, - measuresRepeatSlashes); - } // for -} - -void msrPart::appendPendingMeasuresRepeatToPart ( - int inputLineNumber) -{ - // append pending measures repeat to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendPendingMeasuresRepeatToStaff ( - inputLineNumber); - } // for -} - -void msrPart::createRestMeasuresInPart ( - int inputLineNumber, - int multipleRestMeasuresMeasuresNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Creating a multiple rest in part " << - getPartCombinedName () << - ", " << - singularOrPlural ( - multipleRestMeasuresMeasuresNumber, "measure", "measures") << - endl; - } -#endif - - fPartContainsRestMeasures = true; - - // create multiple rest in registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - createRestMeasuresInStaff ( - inputLineNumber, - multipleRestMeasuresMeasuresNumber); - } // for -} - -void msrPart::appendPendingRestMeasuresToPart ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending the pending multiple rest to part " << - getPartCombinedName () << - endl; - } -#endif - - // append pending multiple rest to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendPendingRestMeasuresToStaff ( - inputLineNumber); - } // for -} - -void msrPart::appendRestMeasuresCloneToPart ( - int inputLineNumber, - S_msrRestMeasures multipleRestMeasures) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending multiple rest '" << - multipleRestMeasures->asString () << - "' to part clone " << - getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendRestMeasuresCloneToStaff ( - inputLineNumber, - multipleRestMeasures); - } // for -} - -void msrPart::appendBarlineToPart (S_msrBarline barline) -{ - // append barline to registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendBarlineToStaff (barline); - } // for -} - -S_msrStaff msrPart::addStaffToPartByItsNumber ( - int inputLineNumber, - msrStaff::msrStaffKind staffKind, - int staffNumber) -{ - if (fPartStavesMap.count (staffNumber)) { - stringstream s; - - s << - "staffNumber " << staffNumber << - " already exists in part " << getPartCombinedName () << - ", line " << inputLineNumber; - - msrInternalError ( // JMI ??? - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - - return fPartStavesMap [staffNumber]; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Adding " << - msrStaff::staffKindAsString (staffKind) << - " staff " << staffNumber << - " to part " << getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the staff - S_msrStaff - staff = - msrStaff::create ( - inputLineNumber, - staffKind, - staffNumber, - this); - - // register staff in this part if relevant - switch (staffKind) { - case msrStaff::kStaffRegular: - case msrStaff::kStaffTablature: - case msrStaff::kStaffHarmony: - case msrStaff::kStaffFiguredBass: - case msrStaff::kStaffDrum: - case msrStaff::kStaffRythmic: - fPartStavesMap [staffNumber] = staff; - break; - } // switch - - // initialize staff current clef and key if relevant // JMI - switch (staffKind) { - case msrStaff::kStaffRegular: - case msrStaff::kStaffTablature: - case msrStaff::kStaffHarmony: - case msrStaff::kStaffFiguredBass: - case msrStaff::kStaffDrum: - case msrStaff::kStaffRythmic: - staff->setStaffCurrentClef (fPartCurrentClef); - staff->setStaffCurrentKey (fPartCurrentKey); - break; - } // switch - - // return staff - return staff; -} - -void msrPart::addStaffToPartCloneByItsNumber (S_msrStaff staff) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Adding staff \"" << staff->getStaffName () << - "\" to part clone " << getPartCombinedName () << - endl; - } -#endif - - // register staff in this part - fPartStavesMap [staff->getStaffNumber ()] = staff; -} - -S_msrStaff msrPart::fetchStaffFromPart ( - int staffNumber) -{ - S_msrStaff result; - - if (fPartStavesMap.count (staffNumber)) { - result = fPartStavesMap [staffNumber]; - } - - return result; -} - -void msrPart::appendFiguredBassToPart ( - S_msrVoice figuredBassSupplierVoice, - S_msrFiguredBass figuredBass) -{ - int inputLineNumber = - figuredBass->getInputLineNumber (); - - switch (figuredBassSupplierVoice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - // append the figured bass to the part figured bass voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << - figuredBass->asString () << - " to part " << - getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - fPartFiguredBassVoice-> - appendFiguredBassToVoice (figuredBass); - break; - - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - stringstream s; - - s << - "figured bass cannot by supplied to part by " << - msrVoice::voiceKindAsString ( - figuredBassSupplierVoice->getVoiceKind ()) << - " voice \" " << - figuredBassSupplierVoice->getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch -} - -void msrPart::appendFiguredBassToPartClone ( - S_msrVoice figuredBassSupplierVoice, - S_msrFiguredBass figuredBass) -{ - int inputLineNumber = - figuredBass->getInputLineNumber (); - - switch (figuredBassSupplierVoice->getVoiceKind ()) { - case msrVoice::kVoiceFiguredBass: - // append the figured bass to the part figured bass voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << - figuredBass->asString () << - " to part clone " << - getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - fPartFiguredBassVoice-> - appendFiguredBassToVoiceClone (figuredBass); - break; - - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - { - stringstream s; - - s << - "figured bass cannot by supplied to part clone by " << - msrVoice::voiceKindAsString ( - figuredBassSupplierVoice->getVoiceKind ()) << - " voice \" " << - figuredBassSupplierVoice->getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch -} - -void msrPart::appendScordaturaToPart ( - S_msrScordatura scordatura) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Appending scordatura '" << - scordatura->asString () << - "' to part " << - getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendScordaturaToStaff ( - scordatura); - } // for -} - -void msrPart::appendAccordionRegistrationToPart ( - S_msrAccordionRegistration - accordionRegistration) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Appending accordion registration '" << - accordionRegistration->asString () << - "' to part " << - getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendAccordionRegistrationToStaff ( - accordionRegistration); - } // for -} - -void msrPart::appendHarpPedalsTuningToPart ( - S_msrHarpPedalsTuning - harpPedalsTuning) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Appending harp pedals tuning '" << - harpPedalsTuning->asString () << - "' to part " << - getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - appendHarpPedalsTuningToStaff ( - harpPedalsTuning); - } // for -} - -void msrPart::addSkipGraceNotesGroupBeforeAheadOfVoicesClonesIfNeeded ( - S_msrVoice graceNotesGroupOriginVoice, - S_msrGraceNotesGroup skipGraceNotesGroup) -{ -#ifdef TRACE_OAH - int inputLineNumber = - skipGraceNotesGroup->getInputLineNumber (); -#endif - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceMeasures - || - gTraceOah->fTraceGraceNotes - || - gTraceOah->fTraceParts - ) { - gLogOstream << - "addSkipGraceNotesGroupBeforeAheadOfVoicesClonesIfNeeded () in " << - getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - for ( - map::const_iterator i=fPartStavesMap.begin (); - i!=fPartStavesMap.end (); - i++ - ) { - - map - staffAllVoicesMap = - (*i).second-> - getStaffAllVoicesMap (); - - for ( - map::const_iterator j=staffAllVoicesMap.begin (); - j!=staffAllVoicesMap.end (); - j++ - ) { - S_msrVoice voice = (*j).second; - - if (voice != graceNotesGroupOriginVoice) { - // add skip grace notes group ahead of voice - voice-> - addGraceNotesGroupBeforeAheadOfVoiceIfNeeded ( - skipGraceNotesGroup); - } - } // for - } // for -} - -void msrPart::handleBackupInPart ( - int inputLineNumber, - rational backupStepLength) -{ - // account for backup in part - decrementPartCurrentPositionInMeasure ( - inputLineNumber, - backupStepLength); -} - -void msrPart::finalizeCurrentMeasureInPart ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Finalizing current measure in part " << - getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // reset current position in measure - fPartCurrentPositionInMeasure = rational (0,0); - - // finalize current measure in registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - finalizeCurrentMeasureInStaff ( - inputLineNumber); - } // for - - gIndenter--; -} - -void msrPart::setPartInstrumentNamesMaxLengthes () -{ - S_msrScore - score = - fPartPartGroupUpLink-> - getPartGroupScoreUpLink (); - - int partInstrumentNameLength = - fPartInstrumentName.size (); - - if ( - partInstrumentNameLength - > - score->getScoreInstrumentNamesMaxLength ()) { - score-> - setScoreInstrumentNamesMaxLength ( - partInstrumentNameLength); - } - - int partInstrumentAbbreviationLength = - fPartInstrumentAbbreviation.size (); - - if ( - partInstrumentAbbreviationLength - > - score->getScoreInstrumentAbbreviationsMaxLength ()) { - score-> - setScoreInstrumentAbbreviationsMaxLength ( - partInstrumentAbbreviationLength); - } -} - -void msrPart::finalizePart ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Finalizing part " << - getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - if (! fPartStavesMap.size ()) { - stringstream s; - - s << - "Part " << - getPartCombinedName () << - " appears in the part list, but doesn't contain any stave"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - else { - // finalize registered staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - (*i).second-> - finalizeStaff ( - inputLineNumber); - } // for - } - - // set score instrument names max lengthes if relevant - setPartInstrumentNamesMaxLengthes (); - - gIndenter--; -} - -void msrPart::finalizePartClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - gLogOstream << - "Finalizing part clone " << - getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - // set score instrument names max lengthes if relevant - setPartInstrumentNamesMaxLengthes (); -} - -void msrPart::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPart::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPart elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPart::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrPart::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPart::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrPart elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrPart::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrPart::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrPart::browseData ()" << - endl; - } - - // browse all non figured bass staves - for ( - map::const_iterator i = fPartStavesMap.begin (); - i != fPartStavesMap.end (); - i++ - ) { - S_msrStaff - staff = - (*i).second; - - if (staff != fPartFiguredBassStaff) { - // browse the staff - msrBrowser browser (v); - browser.browse (*staff); - } - } // for - - // browse the part figured bass only now if any, - // to place it after the corresponding part - if (fPartFiguredBassStaff) { - msrBrowser browser (v); - browser.browse (*fPartFiguredBassStaff); - } - -} - -string msrPart::asString () const -{ - stringstream s; - - s << - "Part" << - ", partID = \"" << - fPartID << - "\", partName = \"" << - fPartName << - "\", partMsrName: " << fPartMsrName << - fPartName << - "\", partStaves: " << fPartStavesMap.size () << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrPart::print (ostream& os) const -{ - os << - "Part" << " " << fPartMsrName << - " (" << - singularOrPlural ( - fPartStavesMap.size (), "staff", "staves") << - ")" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 27; - - os << left << - setw (fieldWidth) << - "partGroupUpLink" << " : "; - if (fPartPartGroupUpLink) { - // it may be empty - os << - fPartPartGroupUpLink->getPartGroupCombinedName (); - } - else { - os << "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << - "partID" << " : \"" << - fPartID << "\"" << - endl << - - setw (fieldWidth) << - "partMsrName" << " : \"" << - fPartMsrName << "\"" << - endl << - - setw (fieldWidth) << - "partAbsoluteNumber" << " : " << - fPartAbsoluteNumber << - endl << - - setw (fieldWidth) << - "partName" << " : \"" << - fPartName << "\"" << - endl << - setw (fieldWidth) << - "partNameDisplayText" << " : \"" << - fPartNameDisplayText << "\"" << - endl << - - setw (fieldWidth) << - "partAbbrevation" << " : \"" << - fPartAbbreviation << "\"" << - endl << - setw (fieldWidth) << - "partAbbreviationDisplayText" << " : \"" << - fPartAbbreviationDisplayText << "\"" << - endl << - - setw (fieldWidth) << - "partInstrumentName" << " : \"" << - fPartInstrumentName << "\"" << - endl << - setw (fieldWidth) << - "partInstrumentAbbreviation" << " : \"" << - fPartInstrumentAbbreviation << "\"" << - endl << - - setw (fieldWidth) << - "partNumberOfMeasures" << " : " << - fPartNumberOfMeasures << - endl << - - setw (fieldWidth) << - "partContainsRestMeasures" << " : " << - booleanAsString (fPartContainsRestMeasures) << - endl << - - setw (fieldWidth) << - "partCurrentPositionInMeasure" << " : " << - fPartCurrentPositionInMeasure << - endl; - - // print current the part clef if any -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - os << left << - setw (fieldWidth) << - "partCurrentClef" << " : "; - - if (fPartCurrentClef) { - os << - "'" << - fPartCurrentClef->asShortString () << - "'"; - } - else { - os << - "none"; - } - - os << endl; - } -#endif - - // print the current part key if any -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - os << left << - setw (fieldWidth) << - "partCurrentKey" << " : "; - - if (fPartCurrentKey) { - os << - "'" << - fPartCurrentKey->asShortString () << - "'"; - } - else { - os << - "none"; - } - - os << endl; - } -#endif - - // print the current part time if any -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - os << left << - setw (fieldWidth) << - "partCurrentTime" << " : "; - - if (fPartCurrentTime) { - os << - "'" << - fPartCurrentTime->asShortString () << - "'"; - } - else { - os << - "none"; - } - - os << endl; - } -#endif - - os << endl; - - // print the registered staves - if (fPartStavesMap.size ()) { - gIndenter++; - - map::const_iterator - iBegin = fPartStavesMap.begin (), - iEnd = fPartStavesMap.end (), - i = iBegin; - - for ( ; ; ) { - S_msrStaff - staff = - (*i).second; - - // sanity check - msrAssert ( - staff != nullptr, - "staff is null"); - - msrStaff::msrStaffKind - staffKind = - staff->getStaffKind (); - - switch (staffKind) { // JMI - case msrStaff::kStaffRegular: - os << - staff; - break; - - case msrStaff::kStaffTablature: - os << - staff; - break; - - case msrStaff::kStaffHarmony: - // JMI if (gMsrOah->fShowHarmonyVoices) {} - os << - staff; - break; - - case msrStaff::kStaffFiguredBass: - // JMI if (gMsrOah->fShowFiguredBassVoices) {} - os << - staff; - break; - - case msrStaff::kStaffDrum: - os << - staff; - break; - - case msrStaff::kStaffRythmic: - os << - staff; - break; - } // switch - - if (++i == iEnd) break; - - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrPart::printSummary (ostream& os) -{ - os << - "Part" << " " << fPartMsrName << - " (" << - singularOrPlural ( - fPartStavesMap.size (), "staff", "staves") << - ", " << - singularOrPlural ( - fPartNumberOfMeasures, "measure", "measure") << - ")" << - endl; - - gIndenter++; - - const int fieldWidth = 27; - - os << left << - setw (fieldWidth) << - "partID" << " : \"" << - fPartID << "\"" << - endl << - - setw (fieldWidth) << - "partMsrName" << " : \"" << - fPartMsrName << "\"" << - endl << - - setw (fieldWidth) << - "partName" << " : \"" << - fPartName << "\"" << - endl << - - setw (fieldWidth) << - "partAbsoluteNumber" << " : " << - fPartAbsoluteNumber << - endl << - - setw (fieldWidth) << - "partNameDisplayText" << " : \"" << - fPartNameDisplayText << "\"" << - endl << - - setw (fieldWidth) << - "partAbbrevation" << " : \"" << - fPartAbbreviation << "\"" << - endl << - setw (fieldWidth) << - "partAbbreviationDisplayText" << " : \"" << - fPartAbbreviationDisplayText << "\"" << - endl << - - setw (fieldWidth) << - "partInstrumentName" << " : \"" << - fPartInstrumentName << "\"" << - endl << - setw (fieldWidth) << - "partInstrumentAbbreviation" << " : \"" << - fPartInstrumentAbbreviation << "\"" << - endl << - - setw (fieldWidth) << - "partNumberOfMeasures" << " : " << - fPartNumberOfMeasures << - endl << - - setw (fieldWidth) << - "partContainsRestMeasures" << " : " << - booleanAsString (fPartContainsRestMeasures) << - endl << - - setw (fieldWidth) << - "partCurrentPositionInMeasure" << " : " << - fPartCurrentPositionInMeasure << - endl; - - // print the staves - if (fPartStavesMap.size ()) { - os << - "partStavesMap" << - endl; - - gIndenter++; - - map::const_iterator - iBegin = fPartStavesMap.begin (), - iEnd = fPartStavesMap.end (), - i = iBegin; - - for ( ; ; ) { - (*i).second->printSummary (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - // print the figured bass staff if any // JMI - if (fPartFiguredBassStaff) { - os << - "partFiguredBassStaff" << - endl; - - gIndenter++; - os << - fPartFiguredBassStaff; - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrPart& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrParts_MUT_DEP.h b/src/lilypond/msrParts_MUT_DEP.h deleted file mode 100644 index 6fac5ea23..000000000 --- a/src/lilypond/msrParts_MUT_DEP.h +++ /dev/null @@ -1,546 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrPart : public msrPartGroupElement -{ - public: - - // constants - // ------------------------------------------------------ - - #define K_PART_FIGURED_BASS_STAFF_NUMBER -219 - #define K_PART_FIGURED_BASS_VOICE_NUMBER -227 - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string partID, - S_msrPartGroup partPartGroupUpLink); - - SMARTP createPartNewbornClone ( - S_msrPartGroup partGroupClone); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrPart ( - int inputLineNumber, - string partID, - S_msrPartGroup partPartGroupUpLink); - - virtual ~msrPart (); - - private: - - // initialization - // ------------------------------------------------------ - - void initializePart (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - - void setPartPartGroupUpLink ( - S_msrPartGroup partGroup) - { fPartPartGroupUpLink = partGroup; } - - S_msrPartGroup getPartPartGroupUpLink () const - { return fPartPartGroupUpLink; } - - // part absolute number - - int getPartAbsoluteNumber () const - { return fPartAbsoluteNumber; } - - // ID and name - - void setPartID (string partID) - { fPartID = partID; } - - string getPartID () const - { return fPartID; } - - void setPartMsrName (string partMsrName); - - string getPartMsrName () const - { return fPartMsrName; } - - void setPartName (string partName) - { fPartName = partName; } - - string getPartName () const - { return fPartName; } - - void setPartNameDisplayText ( - string partNameDisplayText) - { - fPartNameDisplayText = - partNameDisplayText; - } - - string getPartNameDisplayText () const - { return fPartNameDisplayText; } - - void setPartAbbreviation ( - string partAbbreviation) - { - fPartAbbreviation = - partAbbreviation; - } - - string getPartAbbreviation () const - { return fPartAbbreviation; } - - void setPartAbbreviationDisplayText ( - string partAbbreviationDisplayText) - { - fPartAbbreviationDisplayText = - partAbbreviationDisplayText; - } - - string getPartAbbreviationDisplayText () const - { return fPartAbbreviationDisplayText; } - - string getPartCombinedName () const; - - void setPartInstrumentNamesMaxLengthes (); - - // measures - - void setPartNumberOfMeasures ( - int partNumberOfMeasures) - { - fPartNumberOfMeasures = - partNumberOfMeasures; - } - - const int getPartNumberOfMeasures () const - { return fPartNumberOfMeasures; } - // instrument name - - void setPartInstrumentName ( - string partInstrumentName) - { - fPartInstrumentName = - partInstrumentName; - } - - string getPartInstrumentName () const - { return fPartInstrumentName; } - - void setPartInstrumentAbbreviation ( - string partInstrumentAbbreviation) - { - fPartInstrumentAbbreviation = - partInstrumentAbbreviation; - } - - string getPartInstrumentAbbreviation () const - { return fPartInstrumentAbbreviation; } - - // figured bass staff and voice - - void setPartFiguredBassStaff ( - S_msrStaff figuredBassStaff) - { - fPartFiguredBassStaff = - figuredBassStaff; - } - - S_msrStaff getPartFiguredBassStaff () const - { return fPartFiguredBassStaff; } - - void setPartFiguredBassVoice ( - S_msrVoice figuredBassVoice) - { - fPartFiguredBassVoice = - figuredBassVoice; - } - - S_msrVoice getPartFiguredBassVoice () const - { return fPartFiguredBassVoice; } - - // staves map - - const map& - getPartStavesMap () - { return fPartStavesMap; } - - // staff position in measure - - void setPartCurrentPositionInMeasure ( - int inputLineNumber, - rational positionInMeasure); - - void incrementPartCurrentPositionInMeasure ( - int inputLineNumber, - rational duration); - void decrementPartCurrentPositionInMeasure ( - int inputLineNumber, - rational duration); - - rational getPartCurrentPositionInMeasure () const - { return fPartCurrentPositionInMeasure; } - - // services - // ------------------------------------------------------ - - void assignSequentialNumbersToRegularVoicesInPart ( - int inputLineNumber); - - void addAVoiceToStavesThatHaveNone ( - int inputLineNumber); - - // part name display - - void appendPartNameDisplayToPart ( - S_msrPartNameDisplay partNameDisplay); - - // part abbreviation display - - void appendPartAbbreviationDisplayToPart ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay); - -/* JMI - // figured bass staff and voice - - void createPartFiguredBassStaffAndVoiceIfNotYetDone ( - int inputLineNumber); - */ - - // measures - - void createMeasureAndAppendItToPart ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind); - - void setNextMeasureNumberInPart ( - int inputLineNumber, - string nextMeasureNumber); - - // clef, key, time - - void appendClefToPart (S_msrClef clef); - - void appendKeyToPart (S_msrKey key); - - void appendTimeToPart (S_msrTime time); - void appendTimeToPartClone (S_msrTime time); - - // transpose - - void appendTransposeToPart ( - S_msrTranspose transpose); - - // staff details - - void appendStaffDetailsToPart ( - S_msrStaffDetails staffDetails); - - // tuplets JMI ??? - - // barlines - - void appendBarlineToPart (S_msrBarline barline); - - // repeats - - void handleRepeatStartInPart ( - int inputLineNumber); - - void handleRepeatEndInPart ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - - void handleRepeatEndingStartInPart ( - int inputLineNumber); - - void handleRepeatEndingEndInPart ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind); - - /* JMI ??? - void finalizeRepeatEndInPart ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - */ - - void appendRepeatCloneToPart ( - int inputLineNumber, - S_msrRepeat repeatCLone); - - void appendRepeatEndingCloneToPart ( - S_msrRepeatEnding repeatEndingCLone); - - void createRestMeasuresInPart ( - int inputLineNumber, - int restMeasuresNumber); - - void appendPendingRestMeasuresToPart ( - int inputLineNumber); - - void appendRestMeasuresCloneToPart ( - int inputLineNumber, - S_msrRestMeasures restMeasures); - - void createMeasuresRepeatFromItsFirstMeasuresInPart ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber); - - void appendPendingMeasuresRepeatToPart ( - int inputLineNumber); - - void appendMeasuresRepeatCloneToPart ( - int inputLineNumber, - S_msrRestMeasures restMeasures); - - // staves - - S_msrStaff addStaffToPartByItsNumber ( - int inputLineNumber, - msrStaff::msrStaffKind staffKind, - int staffNumber); - - void addStaffToPartCloneByItsNumber ( - S_msrStaff staff); - - S_msrStaff fetchStaffFromPart (int staffNumber); - - // voices - - void removePartEmptyVoices (); - - // harmonies - - // JMI ??? - - // frames - - // JMI ??? - - // figured bass - - void appendFiguredBassToPart ( - S_msrVoice figuredBassSupplierVoice, - S_msrFiguredBass figuredBass); - - void appendFiguredBassToPartClone ( - S_msrVoice figuredBassSupplierVoice, - S_msrFiguredBass figuredBass); - - // scordaturas - - void appendScordaturaToPart ( - S_msrScordatura scordatura); - - // accordion registration - - void appendAccordionRegistrationToPart ( - S_msrAccordionRegistration - accordionRegistration); - - // harp pedals tuning - - void appendHarpPedalsTuningToPart ( - S_msrHarpPedalsTuning - harpPedalsTuning); - - // work around LilyPond issue 34 - - void addSkipGraceNotesGroupBeforeAheadOfVoicesClonesIfNeeded ( - S_msrVoice graceNotesGroupOriginVoice, - S_msrGraceNotesGroup skipGraceNotesGroup); - -/* - void appendSkipGraceNotesToVoicesClones ( // JMI ??? - S_msrVoice graceNotesOriginVoice, - S_msrGraceNotes skipGraceNotes); - - */ - - void handleBackupInPart ( - int inputLineNumber, - rational backupStepLength); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual string asString () const; - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os); - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - - S_msrPartGroup fPartPartGroupUpLink; - - // part ID and name - - string fPartID; // native - - string fPartMsrName; - // may be different than fPartID - // if renamed, - // coined in constructor - - string fPartName; // from '' - string fPartNameDisplayText; - - string fPartAbbreviation; - string fPartAbbreviationDisplayText; - - // part absolute number - - int fPartAbsoluteNumber; - - // part instrument names - - string fPartInstrumentName; - string fPartInstrumentAbbreviation; - - // measures - - string fPartCurrentMeasureNumber; - - int fPartNumberOfMeasures; - - // clef, key, time - - S_msrClef fPartCurrentClef; - - S_msrKey fPartCurrentKey; - - S_msrTime fPartCurrentTime; - - // transpose - - S_msrTranspose fPartCurrentTranspose; - - // figured bass - - S_msrStaff fPartFiguredBassStaff; - S_msrVoice fPartFiguredBassVoice; - - // the registered staves map - - map fPartStavesMap; - - // counter - - static int gPartsCounter; - - // rest measures - - bool fPartContainsRestMeasures; - - public: - - // public work services - // ------------------------------------------------------ - - // measure number - - void setPartCurrentMeasureNumber ( - string measureNumber) - { - fPartCurrentMeasureNumber = - measureNumber; - } - - const string getPartCurrentMeasureNumber () const - { return fPartCurrentMeasureNumber; } - - // clef, key, time - - S_msrClef getPartCurrentClef () const - { return fPartCurrentClef; } - - S_msrKey getPartCurrentKey () const - { return fPartCurrentKey; } - - void setPartCurrentTime (S_msrTime time) - { fPartCurrentTime = time; } - - S_msrTime getPartCurrentTime () const - { return fPartCurrentTime; } - - // transpose - - S_msrTranspose getPartCurrentTranspose () const - { return fPartCurrentTranspose; } - - // staff details - - S_msrStaffDetails getCurrentPartStaffDetails () const - { return fCurrentPartStaffDetails; } - - // finalization - - void finalizeCurrentMeasureInPart ( - int inputLineNumber); - - void finalizePart ( - int inputLineNumber); - - void finalizePartClone ( - int inputLineNumber); - - private: - - // private work services - // ------------------------------------------------------ - - // measure elements - - private: - - // work fields - // ------------------------------------------------------ - - // staff details - - S_msrStaffDetails fCurrentPartStaffDetails; - - // position in measure - - rational fPartCurrentPositionInMeasure; -}; -typedef SMARTP S_msrPart; -EXP ostream& operator<< (ostream& os, const S_msrPart& elt); - diff --git a/src/lilypond/msrRehearsals.cpp b/src/lilypond/msrRehearsals.cpp deleted file mode 100644 index 9e7a077e4..000000000 --- a/src/lilypond/msrRehearsals.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrRehearsals.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrRehearsal msrRehearsal::create ( - int inputLineNumber, - msrRehearsalKind rehearsalKind, - string rehearsalText, - msrPlacementKind rehearsalPlacementKind) -{ - msrRehearsal* o = - new msrRehearsal ( - inputLineNumber, - rehearsalKind, - rehearsalText, - rehearsalPlacementKind); - assert (o!=0); - return o; -} - -msrRehearsal::msrRehearsal ( - int inputLineNumber, - msrRehearsalKind rehearsalKind, - string rehearsalText, - msrPlacementKind rehearsalPlacementKind) - : msrMeasureElement (inputLineNumber) -{ - fRehearsalKind = rehearsalKind; - - fRehearsalText = rehearsalText; - - fRehearsalPlacementKind = rehearsalPlacementKind; -} - -msrRehearsal::~msrRehearsal () -{} - -void msrRehearsal::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRehearsal::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRehearsal elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRehearsal::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRehearsal::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRehearsal::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRehearsal elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRehearsal::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRehearsal::browseData (basevisitor* v) -{} - -string msrRehearsal::rehearsalKindAsString ( - msrRehearsalKind rehearsalKind) -{ - string result; - - switch (rehearsalKind) { - case msrRehearsal::kNone: - result = "none"; - break; - case msrRehearsal::kRectangle: - result = "rectangle"; - break; - case msrRehearsal::kOval: - result = "oval"; - break; - case msrRehearsal::kCircle: - result = "circle"; - break; - case msrRehearsal::kBracket: - result = "bracket"; - break; - case msrRehearsal::kTriangle: - result = "triangle"; - break; - case msrRehearsal::kDiamond: - result = "diamond"; - break; - } // switch - - return result; -} - -void msrRehearsal::print (ostream& os) const -{ - os << - "Rehearsal" << " " << fRehearsalText << - " kind: " << - rehearsalKindAsString (fRehearsalKind) << - " rehearsalPlacementKind: " << - msrPlacementKindAsString (fRehearsalPlacementKind) << - endl; -} - -ostream& operator<< (ostream& os, const S_msrRehearsal& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrRehearsals.h b/src/lilypond/msrRehearsals.h deleted file mode 100644 index d4df989d2..000000000 --- a/src/lilypond/msrRehearsals.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrRehearsals___ -#define ___msrRehearsals___ - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrRehearsal : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrRehearsalKind { - kNone, - kRectangle, kOval, kCircle, kBracket, kTriangle, kDiamond }; - - static string rehearsalKindAsString ( - msrRehearsalKind rehearsalKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrRehearsalKind rehearsalKind, - string rehearsalText, - msrPlacementKind rehearsalPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRehearsal ( - int inputLineNumber, - msrRehearsalKind rehearsalKind, - string rehearsalText, - msrPlacementKind rehearsalPlacementKind); - - virtual ~msrRehearsal (); - - public: - - // set and get - // ------------------------------------------------------ - - msrRehearsalKind getRehearsalKind () const - { return fRehearsalKind; } - - msrPlacementKind getRehearsalPlacementKind () const - { return fRehearsalPlacementKind; } - - // services - string getRehearsalText () const - { return fRehearsalText; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrRehearsalKind fRehearsalKind; - - string fRehearsalText; - - msrPlacementKind fRehearsalPlacementKind; -}; -typedef SMARTP S_msrRehearsal; -EXP ostream& operator<< (ostream& os, const S_msrRehearsal& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrRepeatCodas.cpp b/src/lilypond/msrRepeatCodas.cpp deleted file mode 100644 index a9a967986..000000000 --- a/src/lilypond/msrRepeatCodas.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrRepeatCoda msrRepeatCoda::create ( - int inputLineNumber, - S_msrSegment repeatCodaSegment, - S_msrRepeat repeatUpLink) -{ - msrRepeatCoda* o = - new msrRepeatCoda ( - inputLineNumber, - repeatCodaSegment, - repeatUpLink); - assert(o!=0); - return o; -} - -msrRepeatCoda::msrRepeatCoda ( - int inputLineNumber, - S_msrSegment repeatCodaSegment, - S_msrRepeat repeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - repeatCodaSegment != nullptr, - "repeatCodaSegment is null"); - - fRepeatCodaSegment = repeatCodaSegment; - - // sanity check - msrAssert ( - repeatUpLink != nullptr, - "repeatUpLink is null"); - - fRepeatCodaRepeatUpLink = repeatUpLink; -} - -msrRepeatCoda::~msrRepeatCoda () -{} - -S_msrRepeatCoda msrRepeatCoda::createRepeatCodaNewbornClone ( - S_msrRepeat containingRepeat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a newborn clone of a " << - asString () << - endl; - } -#endif - - // sanity check - msrAssert( - containingRepeat != nullptr, - "containingRepeat is null"); - - S_msrRepeatCoda - newbornClone = 0; // JMI - /* - msrRepeatCoda::create ( - fInputLineNumber, - containingRepeat-> - getRepeatCoda ()-> - getRepeatCodaSegment (), // JMI - containingRepeat); - */ - - // segment - - // upLinks - - return newbornClone; -} - -S_msrRepeatCoda msrRepeatCoda::createRepeatCodaDeepCopy ( - S_msrRepeat containingRepeat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a newborn clone of a " << - asString () << - endl; - } -#endif - - // sanity check - msrAssert( - containingRepeat != nullptr, - "containingRepeat is null"); - - S_msrRepeatCoda - repeatCodaDeepCopy = 0; // JMI - /* JMI - msrRepeatCoda::create ( - fInputLineNumber, - containingRepeat-> - getRepeatCoda ()-> - getRepeatCodaSegment (), // JMI - containingRepeat); - */ - - // segment - repeatCodaDeepCopy->fRepeatCodaSegment = - fRepeatCodaSegment-> - createSegmentDeepCopy ( - fRepeatCodaRepeatUpLink-> - getRepeatVoiceUpLink ()); - - // upLinks - repeatCodaDeepCopy->fRepeatCodaRepeatUpLink = - containingRepeat; - - return repeatCodaDeepCopy; -} - -/* JMI -void msrRepeatCoda::appendElementToRepeatCoda ( - S_msrElement elem) // JMI ??? -{ - fRepeatCodaSegment-> - appendOtherElementToSegment (elem); -} -*/ - -void msrRepeatCoda::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatCoda::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatCoda elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatCoda::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRepeatCoda::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatCoda::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatCoda elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatCoda::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRepeatCoda::browseData (basevisitor* v) -{ - // browse the segment - msrBrowser browser (v); - browser.browse (*fRepeatCodaSegment); -} - -string msrRepeatCoda::asString () const -{ - stringstream s; - - s << - "RepeatCoda" << - ", line " << fInputLineNumber << - endl; - - return s.str (); -} - -void msrRepeatCoda::print (ostream& os) const -{ - os << - endl << - asString () << - endl; - - gIndenter++; - - os << - fRepeatCodaSegment; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrRepeatCoda& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrRepeatCodas_MUT_DEP.h b/src/lilypond/msrRepeatCodas_MUT_DEP.h deleted file mode 100644 index 0e273e9b5..000000000 --- a/src/lilypond/msrRepeatCodas_MUT_DEP.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrRepeatCoda : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrSegment segment, - S_msrRepeat repeatUpLink); - - SMARTP createRepeatCodaNewbornClone ( - S_msrRepeat containingRepeat); - - SMARTP createRepeatCodaDeepCopy ( - S_msrRepeat containingRepeat); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRepeatCoda ( - int inputLineNumber, - S_msrSegment segment, - S_msrRepeat repeatUpLink); - - virtual ~msrRepeatCoda (); - - public: - - // set and get - // ------------------------------------------------------ - - // segment - S_msrSegment getRepeatCodaSegment () const - { return fRepeatCodaSegment; } - - // upLinks - S_msrRepeat getRepeatCodaRepeatUpLink () const - { return fRepeatCodaRepeatUpLink; } - - // services - // ------------------------------------------------------ - - // JMI void appendElementToRepeatCoda (S_msrElement elem); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // segment - S_msrSegment fRepeatCodaSegment; - - // upLinks - S_msrRepeat fRepeatCodaRepeatUpLink; -}; -typedef SMARTP S_msrRepeatCoda; -EXP ostream& operator<< (ostream& os, const S_msrRepeatCoda& elt); - diff --git a/src/lilypond/msrRepeats.cpp b/src/lilypond/msrRepeats.cpp deleted file mode 100644 index 1702dc3cd..000000000 --- a/src/lilypond/msrRepeats.cpp +++ /dev/null @@ -1,2261 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -/* - Repeats in MusicXML are applied to all voices in all staves of the current part - - The currentRepeat in each voice is the top of the voice repeats stack - - A repeat is recognized in MusicXML either by: - - - it's start: handleRepeatStart - - it's first hooked ending (45b): handleRepeatEndingStart - the elements before is moved to the new repeat's common part - - it's end: handleRepeatEnd - - Hooked endings following the first one are added to currentRepeat handleRepeatHookedEndingEnd - - A hookless ending terminates currentRepeat: handleRepeatHooklessEndingEnd - finalize currentRepeat -*/ - -//______________________________________________________________________________ -S_msrRepeatCommonPart msrRepeatCommonPart::create ( - int inputLineNumber, - S_msrRepeat repeatUpLink) -{ - msrRepeatCommonPart* o = - new msrRepeatCommonPart ( - inputLineNumber, - repeatUpLink); - assert(o!=0); - return o; -} - -msrRepeatCommonPart::msrRepeatCommonPart ( - int inputLineNumber, - S_msrRepeat repeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - repeatUpLink != nullptr, - "repeatUpLink is null"); - - fRepeatCommonPartRepeatUpLink = repeatUpLink; -} - -msrRepeatCommonPart::~msrRepeatCommonPart () -{} - -void msrRepeatCommonPart::appendSegmentToRepeatCommonPart ( - int inputLineNumber, - S_msrSegment segment, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Appending segment '" << - segment->asString () << - "' to repeat common part '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - segment != nullptr, - "segment is null"); - - fRepeatCommonPartElementsList.push_back (segment); -} - -void msrRepeatCommonPart::appendRepeatToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending repeat '" << - // JMI repeat->asString () << - repeat << - "' to repeat common part '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - repeat != nullptr, - "repeat is null"); - - fRepeatCommonPartElementsList.push_back (repeat); -} - -void msrRepeatCommonPart::appendMeasuresRepeatToRepeatCommonPart ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending measures repeat '" << - measuresRepeat->asString () << - "' to repeat common part '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeat != nullptr, - "measuresRepeat is null"); - - fRepeatCommonPartElementsList.push_back (measuresRepeat); -} - -void msrRepeatCommonPart::appendRestMeasuresToRepeatCommonPart ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending rest measures '" << - restMeasures->asString () << - "' to repeat common part '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - restMeasures != nullptr, - "restMeasures is null"); - - fRepeatCommonPartElementsList.push_back (restMeasures); -} - -void msrRepeatCommonPart::appendVoiceElementToRepeatCommonPart ( - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending voice element '" << - voiceElement->asString () << - "' to repeat common part '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - voiceElement != nullptr, - "voiceElement is null"); - - fRepeatCommonPartElementsList.push_back (voiceElement); -} - -S_msrNote msrRepeatCommonPart::fetchRepeatCommonPartFirstNonGraceNote () const -{ - - S_msrNote result; - - // fetch the first note in the first measure to which - // a grace notes group can be attached - // i.e. one not in a grace notes group itself, - // possibly inside a chord or tuplet - - if (fRepeatCommonPartElementsList.size ()) { - list::const_iterator - iBegin = fRepeatCommonPartElementsList.begin (), - iEnd = fRepeatCommonPartElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrVoiceElement element = (*i); - - if ( - S_msrNote note = dynamic_cast(&(*element)) - ) { - result = note; - break; - } - - else if ( - S_msrChord chord = dynamic_cast(&(*element)) - ) { - // get the chord's first note - result = chord->fetchChordFirstNonGraceNote (); - break; - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*element)) - ) { - // get the tuplet's first note - result = tuplet->fetchTupletFirstNonGraceNote (); - break; - } - - else if ( - S_msrClef clef = dynamic_cast(&(*element)) - ) { - // ignore this clef - } - - else if ( - S_msrKey key = dynamic_cast(&(*element)) - ) { - // ignore this key - } - - else if ( - S_msrTime time = dynamic_cast(&(*element)) - ) { - // ignore this time - } - - else { - stringstream s; - - s << - "tuplet first element should be a note, a chord or another tuplet, found instead '" << - element->asShortString () << - "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (++i == iEnd) break; - } // for - } - - return result; -} - -void msrRepeatCommonPart::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatCommonPart::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatCommonPart elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatCommonPart::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRepeatCommonPart::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatCommonPart::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatCommonPart elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatCommonPart::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRepeatCommonPart::browseData (basevisitor* v) -{ - // browse the elements - if (fRepeatCommonPartElementsList.size ()) { - for ( - list::const_iterator i = fRepeatCommonPartElementsList.begin (); - i != fRepeatCommonPartElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrRepeatCommonPart::asString () const -{ - stringstream s; - - s << - "RepeatCommonPart" << - ", repeat upLink: '" << - fRepeatCommonPartRepeatUpLink-> - asShortString () << - "', line " << fInputLineNumber; - - return s.str (); -} - -void msrRepeatCommonPart::print (ostream& os) const -{ - os << - "RepeatCommonPart" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << - "repeat upLink: '" << - fRepeatCommonPartRepeatUpLink-> - asShortString () << - "'" << - endl << - endl; - - // print the elements - int elementsNumber = - fRepeatCommonPartElementsList.size (); - - os << - "repeatCommonPartElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fRepeatCommonPartElementsList.begin (), - iEnd = fRepeatCommonPartElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrRepeatCommonPart::shortPrint (ostream& os) const -{ - os << - this->asShortString () << - endl; - -/* JMI - gIndenter++; - - os << - "repeat upLink: '" << - fRepeatCommonPartRepeatUpLink-> - asShortString () << - "'" << - endl; -*/ - -/* JMI - // print the elements - int elementsNumber = - fRepeatCommonPartElementsList.size (); - - os << - "repeatCommonPartElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fRepeatCommonPartElementsList.begin (), - iEnd = fRepeatCommonPartElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // short print the element - (*i)->shortPrint (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -*/ -} - -ostream& operator<< (ostream& os, const S_msrRepeatCommonPart& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrRepeatEnding msrRepeatEnding::create ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEndingKind repeatEndingKind, - S_msrRepeat repeatUpLink) -{ - msrRepeatEnding* o = - new msrRepeatEnding ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind, - repeatUpLink); - assert(o!=0); - return o; -} - -msrRepeatEnding::msrRepeatEnding ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEndingKind repeatEndingKind, - S_msrRepeat repeatUpLink) - : msrElement (inputLineNumber) -{ - fRepeatEndingNumber = repeatEndingNumber; - - fRepeatEndingInternalNumber = 0; - // will be set by msrRepeat::addRepeatEnding () - - fRepeatEndingKind = repeatEndingKind; - - fRepeatEndingRepeatUpLink = repeatUpLink; -} - -msrRepeatEnding::~msrRepeatEnding () -{} - -void msrRepeatEnding::appendSegmentToRepeatEnding ( - int inputLineNumber, - S_msrSegment segment, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending segment '" << segment << - "' to repeat ending '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - segment != nullptr, - "segment is null"); - - fRepeatEndingElementsList.push_back (segment); -} - -void msrRepeatEnding::appendRepeatToRepeatEnding ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending repeat '" << repeat << - "' to repeat ending '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - repeat != nullptr, - "repeat is null"); - - fRepeatEndingElementsList.push_back (repeat); -} - -void msrRepeatEnding::appendMeasuresRepeatToRepeatEnding ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending measures repeat '" << - measuresRepeat->asShortString () << - "' to repeat ending '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeat != nullptr, - "measuresRepeat is null"); - - fRepeatEndingElementsList.push_back (measuresRepeat); -} - -void msrRepeatEnding::appendRestMeasuresToRepeatEnding ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending rest measures '" << - restMeasures->asShortString () << - "' to repeat ending '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - restMeasures != nullptr, - "restMeasures is null"); - - fRepeatEndingElementsList.push_back (restMeasures); -} - -void msrRepeatEnding::appendVoiceElementToRepeatEnding ( - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending voice element '" << voiceElement << - "' to repeat ending '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - voiceElement != nullptr, - "voiceElement is null"); - - fRepeatEndingElementsList.push_back (voiceElement); -} - -void msrRepeatEnding::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatEnding::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatEnding elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatEnding::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRepeatEnding::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatEnding::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatEnding elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatEnding::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRepeatEnding::browseData (basevisitor* v) -{ - // browse the elements - if (fRepeatEndingElementsList.size ()) { - for ( - list::const_iterator i = fRepeatEndingElementsList.begin (); - i != fRepeatEndingElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrRepeatEnding::repeatEndingKindAsString ( - msrRepeatEndingKind repeatEndingKind) -{ - string result; - - switch (repeatEndingKind) { - case msrRepeatEnding::kHookedEnding: - result = "hooked"; - break; - case msrRepeatEnding::kHooklessEnding: - result = "hookless"; - break; - } // switch - - return result; -} - -string msrRepeatEnding::asString () const -{ - stringstream s; - - s << - "RepeatEnding" << - ", " << - repeatEndingKindAsString ( - fRepeatEndingKind) << - ", repeatEndingRepeatUpLink: '"; - - if (fRepeatEndingRepeatUpLink) { - s << - fRepeatEndingRepeatUpLink-> - asShortString (); - } - else { - s << - "none"; - } - - s << - ", repeatEndingNumber: " << fRepeatEndingNumber << - ", repeatEndingInternalNumber: " << fRepeatEndingInternalNumber << - "', line " << fInputLineNumber; - - return s.str (); -} - -void msrRepeatEnding::print (ostream& os) const -{ - os << - endl << - "RepeatEnding" << - ", repeatEndingKind" << " : " << - repeatEndingKindAsString ( - fRepeatEndingKind) << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - -/* JMI - os << - "repeat upLink: '" << - fRepeatEndingRepeatUpLink-> - asShortString () << - "'" << - endl; -*/ - - const int fieldWidth = 27; - - os << left << - setw (fieldWidth) << - "repeatEndingNumber" << " : " < - asShortString () << - "'" << - endl << - endl; - - // print the elements - int elementsNumber = - fRepeatEndingElementsList.size (); - - os << - "repeatEndingElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fRepeatEndingElementsList.begin (), - iEnd = fRepeatEndingElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - (*i)->print (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrRepeatEnding::shortPrint (ostream& os) const -{ - os << - this->asShortString () << - endl; - -/* - gIndenter++; - - const int fieldWidth = 27; - - os << left << - setw (fieldWidth) << - "repeatEndingNumber" << " : " < - asShortString () << - "'" << - endl << - * / - endl; - -/ * JMI - os << - "repeat upLink: '" << - fRepeatEndingRepeatUpLink-> - asShortString () << - "'" << - endl; -* / - - // print the elements - int elementsNumber = - fRepeatEndingElementsList.size (); - - os << - "repeatEndingElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fRepeatEndingElementsList.begin (), - iEnd = fRepeatEndingElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - (*i)->shortPrint (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -*/ -} - -ostream& operator<< (ostream& os, const S_msrRepeatEnding& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrRepeat msrRepeat::create ( - int inputLineNumber, - int repeatTimes, - S_msrVoice voiceUpLink) -{ - msrRepeat* o = - new msrRepeat ( - inputLineNumber, - repeatTimes, - voiceUpLink); - assert(o!=0); - return o; -} - -msrRepeat::msrRepeat ( - int inputLineNumber, - int repeatTimes, - S_msrVoice voiceUpLink) - : msrVoiceElement (inputLineNumber) -{ - fRepeatEndingsInternalCounter = 0; - - // sanity check - msrAssert( - voiceUpLink != nullptr, - "voiceUpLink is null"); - - fRepeatVoiceUpLink = voiceUpLink; - - fRepeatTimes = repeatTimes; - - fRepeatExplicitStartKind = kRepeatExplicitStartNo; // default value - - // repeat build phase - fCurrentRepeatBuildPhaseKind = - msrRepeat::kRepeatBuildPhaseJustCreated; -} - -S_msrRepeat msrRepeat::createRepeatNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a newborn clone of a repeat" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrRepeat - newbornClone = - msrRepeat::create ( - fInputLineNumber, - fRepeatTimes, - containingVoice); - - return newbornClone; -} - -msrRepeat::~msrRepeat () -{} - -void msrRepeat::setRepeatCommonPart ( - S_msrRepeatCommonPart repeatCommonPart) -{ - // sanity check - msrAssert( - repeatCommonPart != nullptr, - "repeatCommonPart is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Setting repeat common part containing " << - singularOrPlural ( - repeatCommonPart-> - getRepeatCommonPartElementsList ().size (), - "element", - "elements") << - endl; - } -#endif - - fRepeatCommonPart = repeatCommonPart; - - // set repeat's build phase - fCurrentRepeatBuildPhaseKind = - msrRepeat::kRepeatBuildPhaseInCommonPart; -} - -void msrRepeat::addRepeatEndingToRepeat ( - int inputLineNumber, - S_msrRepeatEnding repeatEnding) -{ - // sanity check - msrAssert( - repeatEnding != nullptr, - "repeatEnding is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Adding ending '" << - repeatEnding->asString () << - "' to repeat" << - "' to repeat '" << - asShortString () << - "'" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeatsDetails) { - displayRepeat ( - inputLineNumber, - "addRepeatEndingToRepeat() 1"); - } -#endif - - // get repeat ending kind - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind = - repeatEnding-> - getRepeatEndingKind (); - - // consistency check - switch (repeatEndingKind) { - case msrRepeatEnding::kHookedEnding: - switch (fCurrentRepeatBuildPhaseKind) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "cannot add hooked ending '" << - repeatEnding->asShortString () << - "' right after a repeat has been created"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - case msrRepeat::kRepeatBuildPhaseInCommonPart: - fCurrentRepeatBuildPhaseKind = - msrRepeat::kRepeatBuildPhaseInEndings; - break; - case msrRepeat::kRepeatBuildPhaseInEndings: - // there can be several successive endings - break; - case msrRepeat::kRepeatBuildPhaseCompleted: - { - stringstream s; - - s << - "cannot add hooked ending '" << - repeatEnding->asShortString () << - "' after a repeat has been completed"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - break; - - case msrRepeatEnding::kHooklessEnding: - switch (fCurrentRepeatBuildPhaseKind) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "cannot add hookless repeat ending '" << - repeatEnding->asShortString () << - "' right after the repeat has been created"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - case msrRepeat::kRepeatBuildPhaseInCommonPart: - { - stringstream s; - - s << - "cannot add hookless repeat ending '" << - repeatEnding->asShortString () << - "' right after the repeat common part"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - case msrRepeat::kRepeatBuildPhaseInEndings: - // there can be several successive endings - break; - case msrRepeat::kRepeatBuildPhaseCompleted: - { - stringstream s; - - s << - "cannot add hookless ending '" << - repeatEnding->asShortString () << - "' after a repeat has been completed"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // switch - break; - } // switch - - fRepeatEndings.push_back (repeatEnding); - - // set repeat ending internal number - repeatEnding-> - setRepeatEndingInternalNumber ( - ++ fRepeatEndingsInternalCounter); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeatsDetails) { - displayRepeat ( - inputLineNumber, - "addRepeatEndingToRepeat() 2"); - } -#endif -} - -void msrRepeat::appendSegmentToRepeat ( - int inputLineNumber, - S_msrSegment segment, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending segment '" << - segment->asString () << - "' to repeat '" << - asShortString () << - "'" << - endl; - - displayRepeat ( - inputLineNumber, - "appendSegmentToRepeat() 1"); - } -#endif - - switch (fCurrentRepeatBuildPhaseKind) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "segment '" << - segment->asShortString () << - "'cannot be added to a just created repeat" << - " (" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrRepeat::kRepeatBuildPhaseInCommonPart: - fRepeatCommonPart-> - appendSegmentToRepeatCommonPart ( - inputLineNumber, - segment, - context); - break; - - case msrRepeat::kRepeatBuildPhaseInEndings: - fRepeatEndings.back ()-> - appendSegmentToRepeatEnding ( - inputLineNumber, - segment, - context); - break; - - case msrRepeat::kRepeatBuildPhaseCompleted: - { - stringstream s; - - s << - "segment '" << - segment->asShortString () << - "'cannot be added to a completed repeat" << - "(" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayRepeat ( - inputLineNumber, - "appendSegmentToRepeat() 2"); - } -#endif -} - -void msrRepeat::appendRepeatToRepeat ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending repeat '" << - repeat->asString () << - "' to repeat '" << - asShortString () << - "'" << - endl; - - displayRepeat ( - inputLineNumber, - "appendRepeatToRepeat() 1"); - } -#endif - - switch (fCurrentRepeatBuildPhaseKind) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "repeat '" << - repeat->asShortString () << - "'cannot be added to a just created repeat" << - " (" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrRepeat::kRepeatBuildPhaseInCommonPart: - fRepeatCommonPart-> - appendRepeatToRepeatCommonPart ( - inputLineNumber, - repeat, - context); - break; - - case msrRepeat::kRepeatBuildPhaseInEndings: - fRepeatEndings.back ()-> - appendRepeatToRepeatEnding ( - inputLineNumber, - repeat, - context); - break; - - case msrRepeat::kRepeatBuildPhaseCompleted: - { - stringstream s; - - s << - "repeat '" << - repeat->asShortString () << - "'cannot be added to a completed repeat" << - "(" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayRepeat ( - inputLineNumber, - "appendRepeatToRepeat() 2"); - } -#endif -} - -void msrRepeat::appendMeasuresRepeatToRepeat ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending measures repeat '" << - measuresRepeat->asString () << - "' to repeat '" << - asShortString () << - "'" << - endl; - - displayRepeat ( - inputLineNumber, - "appendMeasuresRepeatToRepeat() 1"); - } -#endif - - switch (fCurrentRepeatBuildPhaseKind) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "measures repeat '" << - measuresRepeat->asShortString () << - "'cannot be added to a just created repeat" << - " (" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrRepeat::kRepeatBuildPhaseInCommonPart: - fRepeatCommonPart-> - appendMeasuresRepeatToRepeatCommonPart ( - inputLineNumber, - measuresRepeat, - context); - break; - - case msrRepeat::kRepeatBuildPhaseInEndings: - fRepeatEndings.back ()-> - appendMeasuresRepeatToRepeatEnding ( - inputLineNumber, - measuresRepeat, - context); - break; - - case msrRepeat::kRepeatBuildPhaseCompleted: - { - stringstream s; - - s << - "measures repeat '" << - measuresRepeat->asShortString () << - "'cannot be added to a completed repeat" << - "(" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayRepeat ( - inputLineNumber, - "appendMeasuresRepeatToRepeat() 2"); - } -#endif -} - -void msrRepeat::appendRestMeasuresToRepeat ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending rest measures '" << - restMeasures->asString () << - "' to repeat '" << - asShortString () << - "'" << - endl; - - displayRepeat ( - inputLineNumber, - "appendRestMeasuresToRepeat() 1"); - } -#endif - - switch (fCurrentRepeatBuildPhaseKind) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "rest measures '" << - restMeasures->asShortString () << - "'cannot be added to a just created repeat" << - " (" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrRepeat::kRepeatBuildPhaseInCommonPart: - fRepeatCommonPart-> - appendRestMeasuresToRepeatCommonPart ( - inputLineNumber, - restMeasures, - context); - break; - - case msrRepeat::kRepeatBuildPhaseInEndings: - fRepeatEndings.back ()-> - appendRestMeasuresToRepeatEnding ( - inputLineNumber, - restMeasures, - context); - break; - - case msrRepeat::kRepeatBuildPhaseCompleted: - { - stringstream s; - - s << - "rest measures '" << - restMeasures->asShortString () << - "'cannot be added to a completed repeat" << - "(" << context << ")"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayRepeat ( - inputLineNumber, - "appendRestMeasuresToRepeat() 2"); - } -#endif -} - -S_msrNote msrRepeat::fetchRepeatFirstNonGraceNote () const -{ - S_msrNote result; - - if (fRepeatCommonPart) { - result = - fRepeatCommonPart-> - fetchRepeatCommonPartFirstNonGraceNote (); - } - - return result; -} - -void msrRepeat::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeat::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeat::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRepeat::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeat::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeat::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRepeat::browseData (basevisitor* v) -{ - if (fRepeatCommonPart) { - // browse the common part - msrBrowser browser (v); - browser.browse (*fRepeatCommonPart); - } - - // browse the alternatives - for ( - vector::const_iterator i = fRepeatEndings.begin (); - i != fRepeatEndings.end (); - i++ - ) { - // browse the alternative - msrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string msrRepeat::repeatExplicitStartKindAsString ( - msrRepeatExplicitStartKind repeatExplicitStartKind) -{ - string result; - - switch (repeatExplicitStartKind) { - case msrRepeat::kRepeatExplicitStartNo: - result = "repeatExplicitStartNo"; - break; - case msrRepeat::kRepeatExplicitStartYes: - result = "repeatExplicitStartYes"; - break; - } // switch - - return result; -} - -string msrRepeat::repeatBuildPhaseKindAsString ( - msrRepeatBuildPhaseKind repeatBuildPhaseKind) -{ - string result; - - switch (repeatBuildPhaseKind) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - result = "repeatBuildPhaseJustCreated"; - break; - case msrRepeat::kRepeatBuildPhaseInCommonPart: - result = "repeatBuildPhaseInCommonPart"; - break; - case msrRepeat::kRepeatBuildPhaseInEndings: - result = "repeatBuildPhaseInEndings"; - break; - case msrRepeat::kRepeatBuildPhaseCompleted: - result = "repeatBuildPhaseCompleted"; - break; - } // switch - - return result; -} - -string msrRepeat::asShortString () const -{ - stringstream s; - - s << - "Repeat" << - ", " << fRepeatTimes << " times" << - ", repeatExplicitStartKind: " << - repeatExplicitStartKindAsString ( - fRepeatExplicitStartKind) << - ", currentRepeatBuildPhaseKind: " << - repeatBuildPhaseKindAsString ( - fCurrentRepeatBuildPhaseKind) << - ", common part: "; - - if (fRepeatCommonPart) { - s << - singularOrPlural ( - fRepeatCommonPart-> - getRepeatCommonPartElementsList ().size (), - "element", - "elements"); - } - else { - s << - "none"; - } - - int repeatEndingsNumber = - fRepeatEndings.size (); - - s << - ", " << - singularOrPlural ( - repeatEndingsNumber, "repeat ending", "repeat endings") << - ", line " << fInputLineNumber; - - return s.str (); -} - -string msrRepeat::asString () const -{ - stringstream s; - - s << - "Repeat" << - ", " << fRepeatTimes << " times" << - ", repeatExplicitStartKind:: " << - repeatExplicitStartKindAsString ( - fRepeatExplicitStartKind) << - ", currentRepeatBuildPhaseKind: " << - repeatBuildPhaseKindAsString ( - fCurrentRepeatBuildPhaseKind) << - ", common part: "; - - if (fRepeatCommonPart) { - s << - fRepeatCommonPart->asString (); - } - else { - s << - "none"; - } - - int endingsNumber = - fRepeatEndings.size (); - - s << - ", " << - singularOrPlural ( - endingsNumber, "repeat ending", "repeat endings"); - - if (endingsNumber) { - vector::const_iterator - iBegin = fRepeatEndings.begin (), - iEnd = fRepeatEndings.end (), - i = iBegin; - - s << - ", "; - - for ( ; ; ) { - // print the repeat ending - s << (*i)->asShortString (); - if (++i == iEnd) break; - s << " "; - } // for - } - - s << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrRepeat::displayRepeat ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - "*********>> Repeat '" << - asShortString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - " contains:" << - endl; - - gIndenter++; - print (gLogOstream); - gIndenter--; - - gLogOstream << - "<<*********" << - endl << - endl; -} - -void msrRepeat::print (ostream& os) const -{ - os << - "Repeat" << - ", " << fRepeatTimes << " times" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 28; - - os << left << - setw (fieldWidth) << - "repeatExplicitStartKind" << " : " << - repeatExplicitStartKindAsString ( - fRepeatExplicitStartKind) << - endl << - setw (fieldWidth) << - "repeat ending(s)" << " : " << - fRepeatEndings.size () << - endl; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - // print the current repeat build phase - os << left << - setw (fieldWidth) << - "currentRepeatBuildPhaseKind" << " : " << - repeatBuildPhaseKindAsString ( - fCurrentRepeatBuildPhaseKind) << - endl; - } -#endif - - os << endl; - - // print the repeat common part - if (! fRepeatCommonPart) { - os << - "Common part: none" << - endl; - } - else { - os << - fRepeatCommonPart << - endl; - } - - // print the repeat endings - int endingsNumber = - fRepeatEndings.size (); - - os << - "Repeat endings: "; - if (endingsNumber) { - os << "(" << endingsNumber << ")"; - } - else { - os << "none"; - } - os << endl; - - if (endingsNumber) { - gIndenter++; - - vector::const_iterator - iBegin = fRepeatEndings.begin (), - iEnd = fRepeatEndings.end (), - i = iBegin; - - for ( ; ; ) { - // print the repeat ending - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrRepeat::shortPrint (ostream& os) const -{ - os << - this->asShortString () << - endl; - - gIndenter++; - - // short print the repeat common part - if (! fRepeatCommonPart) { - os << - "Common part: none" << - endl; - } - else { - fRepeatCommonPart->shortPrint (os); - } - - // short print the repeat endings - int endingsNumber = - fRepeatEndings.size (); - - os << - "Repeat endings: "; - if (endingsNumber) { - os << "(" << endingsNumber << ")"; - } - else { - os << "none"; - } - os << endl; - - if (endingsNumber) { - gIndenter++; - - vector::const_iterator - iBegin = fRepeatEndings.begin (), - iEnd = fRepeatEndings.end (), - i = iBegin; - - for ( ; ; ) { - // short print the repeat ending - (*i)->shortPrint (os); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrRepeat& elt) -{ - elt->print (os); - return os; -} - - -} - - - -//______________________________________________________________________________ -/* JMI -S_msrRepeatElement msrRepeatElement::create ( - int inputLineNumber, - S_msrRepeat repeatUpLink) -{ - msrRepeatElement* o = - new msrRepeatElement ( - inputLineNumber, - repeatUpLink); - assert(o!=0); - return o; -} - -msrRepeatElement::msrRepeatElement ( - int inputLineNumber, - S_msrRepeat repeatUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert ( - repeatUpLink != nullptr, - "repeatUpLink is null"); - - fRepeatElementRepeatUpLink = repeatUpLink; -} - -msrRepeatElement::~msrRepeatElement () -{} - -void msrRepeatElement::appendSegmentToRepeatElementsList ( // JMI ??? - int inputLineNumber, - S_msrSegment segment, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending segment '" << segment << - "' to repeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - segment != nullptr, - "segment is null"); - - fRepeatElementElementsList.push_back (segment); -} - -void msrRepeatElement::appendRepeatToRepeatElementsList ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending repeat '" << repeat << - "' to repeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - repeat != nullptr, - "repeat is null"); - - fRepeatElementElementsList.push_back (repeat); -} - -void msrRepeatElement::appendVoiceElementToRepeatElementsList ( - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending voice element '" << voiceElement << - "' to repeat element elements list '" << asString () << - "' (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - voiceElement != nullptr, - "voiceElement is null"); - - fRepeatElementElementsList.push_back (voiceElement); -} - -S_msrNote msrRepeatElement::fetchRepeatElementFirstNonGraceNote () const -{ - - S_msrNote result; - - // fetch the first note in the first measure to which - // a grace notes group can be attached - // i.e. one not in a grace notes group itself, - // possibly inside a chord or tuplet - - if (fRepeatElementElementsList.size ()) { - list::const_iterator - iBegin = fRepeatElementElementsList.begin (), - iEnd = fRepeatElementElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrVoiceElement element = (*i); - - if ( - S_msrNote note = dynamic_cast(&(*element)) - ) { - result = note; - break; - } - - else if ( - S_msrChord chord = dynamic_cast(&(*element)) - ) { - // get the chord's first note - result = chord->fetchChordFirstNonGraceNote (); - break; - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*element)) - ) { - // get the tuplet's first note - result = tuplet->fetchTupletFirstNonGraceNote (); - break; - } - - else if ( - S_msrClef clef = dynamic_cast(&(*element)) - ) { - // ignore this clef - } - - else if ( - S_msrKey key = dynamic_cast(&(*element)) - ) { - // ignore this key - } - - else if ( - S_msrTime time = dynamic_cast(&(*element)) - ) { - // ignore this time - } - - else { - stringstream s; - - s << - "tuplet first element should be a note, a chord or another tuplet, found instead '" << - element->asShortString () << - "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (++i == iEnd) break; - } // for - } - - return result; -} - -void msrRepeatElement::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatElement::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatElement::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRepeatElement::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRepeatElement::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRepeatElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRepeatElement::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRepeatElement::browseData (basevisitor* v) -{ - // browse the elements - if (fRepeatElementElementsList.size ()) { - for ( - list::const_iterator i = fRepeatElementElementsList.begin (); - i != fRepeatElementElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrRepeatElement::asString () const -{ - stringstream s; - - s << - "RepeatElement" << - ", repeat upLink: '" << - fRepeatElementRepeatUpLink-> - asShortString () << - "', line " << fInputLineNumber << - endl; - - return s.str (); -} - -void msrRepeatElement::print (ostream& os) const -{ - os << - "RepeatElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << - "repeat upLink: '" << - fRepeatElementRepeatUpLink-> - asShortString () << - "'" << - endl << - endl; - - // print the elements - int elementsNumber = - fRepeatElementElementsList.size (); - - os << - "repeatElementElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fRepeatElementElementsList.begin (), - iEnd = fRepeatElementElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void msrRepeatElement::shortPrint (ostream& os) const -{ - os << - "RepeatElement" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - -/ * JMI - os << - "repeat upLink: '" << - fRepeatElementRepeatUpLink-> - asShortString () << - "'" << - endl; -* / - - // print the elements - int elementsNumber = - fRepeatElementElementsList.size (); - - os << - "repeatElementElementsList: "; - if (elementsNumber) { - os << - "(" << - singularOrPlural ( - elementsNumber, "element", "elements") << - ")"; - } - else { - os << "none"; - } - os << endl; - - if (elementsNumber) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fRepeatElementElementsList.begin (), - iEnd = fRepeatElementElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - (*i)->shortPrint (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrRepeatElement& elt) -{ - elt->print (os); - return os; -} -*/ - diff --git a/src/lilypond/msrRepeats_MUT_DEP.h b/src/lilypond/msrRepeats_MUT_DEP.h deleted file mode 100644 index 0d040f146..000000000 --- a/src/lilypond/msrRepeats_MUT_DEP.h +++ /dev/null @@ -1,650 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -/* JMI -class msrRepeatElement : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrRepeat repeatUpLink); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRepeatElement ( - int inputLineNumber, - S_msrRepeat repeatUpLink); - - virtual ~msrRepeatElement (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrRepeat getRepeatElementRepeatUpLink () const - { return fRepeatElementRepeatUpLink; } - - // elements - const list& - getRepeatElementElementsList () - { return fRepeatElementElementsList; } - - public: - - // public services - // ------------------------------------------------------ - - void appendSegmentToRepeatElementsList ( - int inputLineNumber, - S_msrSegment segment, - string context); - - void appendRepeatToRepeatElementsList ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void appendMeasuresRepeatToRepeatElementsList ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - void appendRestMeasuresToRepeatElementsList ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - S_msrNote fetchRepeatElementFirstNonGraceNote () const; - - void collectRepeatElementMeasuresIntoFlatList ( - int inputLineNumber); - - private: - - // private services - // ------------------------------------------------------ - - void appendVoiceElementToRepeatElementsList ( // JMI - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrRepeat fRepeatElementRepeatUpLink; - - // elements list - list - fRepeatElementElementsList; -}; -typedef SMARTP S_msrRepeatElement; -EXP ostream& operator<< (ostream& os, const S_msrRepeatElement& elt); -*/ - -//______________________________________________________________________________ -class msrRepeatCommonPart : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrRepeat repeatUpLink); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRepeatCommonPart ( - int inputLineNumber, - S_msrRepeat repeatUpLink); - - virtual ~msrRepeatCommonPart (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrRepeat getRepeatCommonPartRepeatUpLink () const - { return fRepeatCommonPartRepeatUpLink; } - - // elements - const list& - getRepeatCommonPartElementsList () - { return fRepeatCommonPartElementsList; } - - public: - - // services - // ------------------------------------------------------ - - void appendVoiceElementToRepeatCommonPart ( - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context); - - void appendSegmentToRepeatCommonPart ( - int inputLineNumber, - S_msrSegment segment, - string context); - - void appendRepeatToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void appendMeasuresRepeatToRepeatCommonPart ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - void appendRestMeasuresToRepeatCommonPart ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context); - - S_msrNote fetchRepeatCommonPartFirstNonGraceNote () const; - - void collectRepeatCommonPartMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrRepeat fRepeatCommonPartRepeatUpLink; - - // elements list - list - fRepeatCommonPartElementsList; -}; -typedef SMARTP S_msrRepeatCommonPart; -EXP ostream& operator<< (ostream& os, const S_msrRepeatCommonPart& elt); - -//______________________________________________________________________________ -class msrRepeatEnding : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrRepeatEndingKind { - kHookedEnding, - kHooklessEnding}; - - static string repeatEndingKindAsString ( - msrRepeatEndingKind repeatEndingKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEndingKind repeatEndingKind, - S_msrRepeat repeatUpLink); - - /* JMI - SMARTP createRepeatEndingNewbornClone ( - S_msrRepeat containingRepeat); - */ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRepeatEnding ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEndingKind repeatEndingKind, - S_msrRepeat repeatUpLink); - - virtual ~msrRepeatEnding (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrRepeat getRepeatEndingRepeatUpLink () const - { return fRepeatEndingRepeatUpLink; } - - // numbers - string getRepeatEndingNumber () const - { return fRepeatEndingNumber; } - - void setRepeatEndingNumber (int repeatEndingNumber) - { fRepeatEndingNumber = repeatEndingNumber; } - - void setRepeatEndingInternalNumber ( - int repeatEndingInternalNumber) - { - fRepeatEndingInternalNumber = - repeatEndingInternalNumber; - } - - int getRepeatEndingInternalNumber () const - { return fRepeatEndingInternalNumber; } - - // kind - msrRepeatEndingKind getRepeatEndingKind () const - { return fRepeatEndingKind; } - - // elements - const list& - getRepeatEndingElementsList () - { return fRepeatEndingElementsList; } - - // services - // ------------------------------------------------------ - - void appendVoiceElementToRepeatEnding ( // JMI - int inputLineNumber, - S_msrVoiceElement voiceElement, - string context); - - void appendSegmentToRepeatEnding ( - int inputLineNumber, - S_msrSegment segment, - string context); - - void appendRepeatToRepeatEnding ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void appendMeasuresRepeatToRepeatEnding ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - void appendRestMeasuresToRepeatEnding ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context); - - void collectRepeatEndingMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrRepeat fRepeatEndingRepeatUpLink; - - // numbers - string fRepeatEndingNumber; // may be "1, 2" - int fRepeatEndingInternalNumber; // internally assigned - - // kind - msrRepeatEndingKind fRepeatEndingKind; - - // elements list - list - fRepeatEndingElementsList; -}; -typedef SMARTP S_msrRepeatEnding; -EXP ostream& operator<< (ostream& os, const S_msrRepeatEnding& elt); - -//______________________________________________________________________________ -class msrRepeat : public msrVoiceElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrRepeatExplicitStartKind { - kRepeatExplicitStartNo, - kRepeatExplicitStartYes }; - - static string repeatExplicitStartKindAsString ( - msrRepeatExplicitStartKind repeatExplicitStartKind); - - enum msrRepeatBuildPhaseKind { - kRepeatBuildPhaseJustCreated, - kRepeatBuildPhaseInCommonPart, - kRepeatBuildPhaseInEndings, - kRepeatBuildPhaseCompleted}; - - static string repeatBuildPhaseKindAsString ( - msrRepeatBuildPhaseKind repeatBuildPhaseKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int repeatTimes, - S_msrVoice voiceUpLink); - - SMARTP createRepeatNewbornClone ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRepeat ( - int inputLineNumber, - int repeatTimes, - S_msrVoice voiceUpLink); - - virtual ~msrRepeat (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrVoice getRepeatVoiceUpLink () const - { return fRepeatVoiceUpLink; } - // times - int getRepeatTimes () const - { return fRepeatTimes; } - - void setRepeatTimes (int repeatTimes) // JMI - { fRepeatTimes = repeatTimes; } - - // implicit start? - void setRepeatExplicitStartKind ( - msrRepeatExplicitStartKind repeatExplicitStartKind) - { - fRepeatExplicitStartKind = - repeatExplicitStartKind; - } - - msrRepeatExplicitStartKind - getRepeatExplicitStartKind () const - { return fRepeatExplicitStartKind; } - - // common part - void setRepeatCommonPart ( - S_msrRepeatCommonPart repeatCommonPart); - - S_msrRepeatCommonPart getRepeatCommonPart () const - { return fRepeatCommonPart; } - - // endings - const vector& - getRepeatEndings () const - { return fRepeatEndings; } - - public: - - // public services - // ------------------------------------------------------ - - void addRepeatEndingToRepeat ( - int inputLineNumber, - S_msrRepeatEnding repeatEnding); - - void appendSegmentToRepeat ( - int inputLineNumber, - S_msrSegment segment, - string context); - - void appendRepeatToRepeat ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void appendMeasuresRepeatToRepeat ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - void appendRestMeasuresToRepeat ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context); - - S_msrNote fetchRepeatFirstNonGraceNote () const; - - void collectRepeatMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortString () const; - string asString () const; - - void displayRepeat ( - int inputLineNumber, - string context); - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fRepeatVoiceUpLink; - - // number of repetitions - int fRepeatTimes; - - // explicit start? - msrRepeatExplicitStartKind - fRepeatExplicitStartKind; - - // common part - S_msrRepeatCommonPart fRepeatCommonPart; - - // repeat endings - vector - fRepeatEndings; - int fRepeatEndingsInternalCounter; - - public: - - // public work services - // ------------------------------------------------------ - - // repeat build phase - void setCurrentRepeatBuildPhaseKind ( - msrRepeatBuildPhaseKind repeatBuildPhaseKind) - { - fCurrentRepeatBuildPhaseKind = - repeatBuildPhaseKind; - } - - msrRepeatBuildPhaseKind - getCurrentRepeatBuildPhaseKind () const - { return fCurrentRepeatBuildPhaseKind; } - - private: - - // private work services - // ------------------------------------------------------ - - private: - - // work fields - // ------------------------------------------------------ - - // repeat build phase, used when building the repeat - msrRepeatBuildPhaseKind - fCurrentRepeatBuildPhaseKind; -}; -typedef SMARTP S_msrRepeat; -EXP ostream& operator<< (ostream& os, const S_msrRepeat& elt); - -//________________________________________________________________________ -struct msrRepeatDescr : public smartable -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int repeatDescrStartInputLineNumber, - S_msrRepeat repeatDescrRepeat); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRepeatDescr ( - int repeatDescrStartInputLineNumber, - S_msrRepeat fRepeatDescrRepeat); - - virtual ~msrRepeatDescr (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrRepeat getRepeatDescrRepeat () const - { return fRepeatDescrRepeat; } - - void setRepeatDescrStartInputLineNumber ( - int inputLineNumber) - { - fRepeatDescrStartInputLineNumber = - inputLineNumber; - } - - int getRepeatDescrStartInputLineNumber () const - { - return - fRepeatDescrStartInputLineNumber; - } - - // services - // ------------------------------------------------------ - - string repeatDescrAsString () const; - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // the repeat - S_msrRepeat fRepeatDescrRepeat; - - // its start input line number - int fRepeatDescrStartInputLineNumber; -}; -typedef SMARTP S_msrRepeatDescr; -EXP ostream& operator<< (ostream& os, const S_msrRepeatDescr& elt); - diff --git a/src/lilypond/msrRestMeasures.cpp b/src/lilypond/msrRestMeasures.cpp deleted file mode 100644 index 52be34dad..000000000 --- a/src/lilypond/msrRestMeasures.cpp +++ /dev/null @@ -1,660 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrRestMeasuresContents msrRestMeasuresContents::create ( - int inputLineNumber, - S_msrRestMeasures restMeasures) -{ - msrRestMeasuresContents* o = - new msrRestMeasuresContents ( - inputLineNumber, - restMeasures); - assert(o!=0); - return o; -} - -msrRestMeasuresContents::msrRestMeasuresContents ( - int inputLineNumber, - S_msrRestMeasures restMeasures) - : msrElement (inputLineNumber) -{ - fRestMeasuresContentsRestMeasuresUpLink = - restMeasures; -} - -msrRestMeasuresContents::~msrRestMeasuresContents () -{} - -S_msrRestMeasuresContents msrRestMeasuresContents::createRestMeasuresContentsNewbornClone ( - S_msrRestMeasures restMeasures) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Creating a newborn clone of a rest measures contents" << - endl; - } -#endif - - // sanity check - msrAssert( - restMeasures != nullptr, - "restMeasures is null"); - - S_msrRestMeasuresContents - newbornClone = - msrRestMeasuresContents::create ( - fInputLineNumber, - restMeasures); - - return newbornClone; -} - -void msrRestMeasuresContents::setRestMeasuresContentsSegment ( - int inputLineNumber, - S_msrSegment restMeasuresContentsSegment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting rest measures contents segment containing " << - singularOrPlural ( - restMeasuresContentsMeasuresNumber (), - "measure", - "measures") << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert ( - restMeasuresContentsSegment != nullptr, - "restMeasuresContentsSegment is null"); - - fRestMeasuresContentsSegment = - restMeasuresContentsSegment; -} - -int msrRestMeasuresContents::restMeasuresContentsMeasuresNumber () const -{ - int result; - - if (fRestMeasuresContentsSegment) { - result = - fRestMeasuresContentsSegment-> - getSegmentMeasuresList ().size (); - } - else { - result = 0; - } - - return result; -} - -void msrRestMeasuresContents::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRestMeasuresContents::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRestMeasuresContents elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRestMeasuresContents::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRestMeasuresContents::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRestMeasuresContents::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRestMeasuresContents elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRestMeasuresContents::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRestMeasuresContents::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRestMeasuresContents::browseData ()" << - endl; - } - - if (fRestMeasuresContentsSegment) { - // browse the pattern segment - msrBrowser browser (v); - browser.browse (*fRestMeasuresContentsSegment); - } -} - -string msrRestMeasuresContents::asString () const -{ - stringstream s; - - s << - - "RestMeasuresContents" << - ", line " << fInputLineNumber << - " (" << - singularOrPlural ( - restMeasuresContentsMeasuresNumber (), - "contents measure", - "contents measures") << - ")"; - - return s.str (); -} - -void msrRestMeasuresContents::print (ostream& os) const -{ - os << - endl << - asString () << - endl; - - gIndenter++; - - // print the pattern segment - os << - "Contents segment:"; - - if (! fRestMeasuresContentsSegment) { - os << - " none" << - endl; - } - else { - os << endl; - - gIndenter++; - - os << - fRestMeasuresContentsSegment; - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrRestMeasuresContents& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrRestMeasures msrRestMeasures::create ( - int inputLineNumber, - rational restMeasuresMeasureSoundingNotes, - int restMeasuresNumber, - S_msrVoice voiceUpLink) -{ - msrRestMeasures* o = - new msrRestMeasures ( - inputLineNumber, - restMeasuresMeasureSoundingNotes, - restMeasuresNumber, - voiceUpLink); - assert(o!=0); - return o; -} - -S_msrRestMeasures msrRestMeasures::create ( - int inputLineNumber, - S_msrMeasure restMeasureClone, - S_msrVoice voiceUpLink) -{ - msrRestMeasures* o = - new msrRestMeasures ( - inputLineNumber, - restMeasureClone, - voiceUpLink); - assert(o!=0); - return o; -} - -msrRestMeasures::msrRestMeasures ( - int inputLineNumber, - rational restMeasuresMeasureSoundingNotes, - int restMeasuresNumber, - S_msrVoice voiceUpLink) - : msrVoiceElement (inputLineNumber) -{ - fRestMeasuresVoiceUpLink = voiceUpLink; - - fRestMeasuresMeasureSoundingNotes = restMeasuresMeasureSoundingNotes; - - fRestMeasuresNumber = restMeasuresNumber; - - fRestMeasuresLastMeasurePuristNumber = -1; -} - -msrRestMeasures::msrRestMeasures ( - int inputLineNumber, - S_msrMeasure restMeasureClone, - S_msrVoice voiceUpLink) - : msrVoiceElement (inputLineNumber) -{ - fRestMeasuresVoiceUpLink = voiceUpLink; - - fRestMeasuresMeasureSoundingNotes = - restMeasureClone-> - getFullMeasureWholeNotesDuration (); // JMI ??? - - fRestMeasuresNumber = 1; // will evolve JMI - - fRestMeasuresLastMeasurePuristNumber = -1; - - // create the rest measures contents - fRestMeasuresContents = - msrRestMeasuresContents::create ( - inputLineNumber, - this); -} - -msrRestMeasures::~msrRestMeasures () -{} - -S_msrRestMeasures msrRestMeasures::createRestMeasuresNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Creating a newborn clone of rest measures '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrRestMeasures - newbornClone = - msrRestMeasures::create ( - fInputLineNumber, - fRestMeasuresMeasureSoundingNotes, - fRestMeasuresNumber, - containingVoice); - -/* JMI - newbornClone->fRestMeasuresNextMeasureNumber = - fRestMeasuresNextMeasureNumber; - */ - - return newbornClone; -} - -void msrRestMeasures::setRestMeasuresContents ( - S_msrRestMeasuresContents restMeasuresContents) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting rest measures contents containing " << - singularOrPlural ( - restMeasuresContents-> - restMeasuresContentsMeasuresNumber (), - "measure", - "measures") << - endl; - } -#endif - - // sanity check - msrAssert ( - restMeasuresContents != nullptr, - "restMeasuresContents is null"); - - fRestMeasuresContents = restMeasuresContents; -} - -void msrRestMeasures::setRestMeasuresNextMeasureNumber ( - string nextMeasureNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting rest measures next measure number to '" << - "' " << - nextMeasureNumber << - endl; - } -#endif - - fRestMeasuresNextMeasureNumber = - nextMeasureNumber; -} - -void msrRestMeasures::setRestMeasuresLastMeasurePuristMeasureNumber ( - int inputLineNumber) -{ - // sanity check - msrAssert ( - fRestMeasuresContents != nullptr, - "fRestMeasuresContents is null"); - - S_msrSegment - restMeasuresContentsSegment = - fRestMeasuresContents-> - getRestMeasuresContentsSegment (); - - // sanity check - msrAssert ( - restMeasuresContentsSegment != nullptr, - "restMeasuresContentsSegment is null"); - - // get rest measures contents segment measures list - const list& - contentsSegmentMeasuresList = - restMeasuresContentsSegment-> - getSegmentMeasuresList (); - - // get rest measures contents last measure's purist number - int lastMeasuresPuristNumber = -1; - - if (contentsSegmentMeasuresList.size ()) { - lastMeasuresPuristNumber = - contentsSegmentMeasuresList.back ()-> - getMeasurePuristNumber (); - } - else { - stringstream s; - - s << - "cannot get rest measures contents last measure purist number" << - " because its measures list is empty" << - " in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting rest measures last measure purist number to '" << - "' " << - lastMeasuresPuristNumber << - "', line " << inputLineNumber << - endl; - } -#endif - - fRestMeasuresLastMeasurePuristNumber = - lastMeasuresPuristNumber; -} - -void msrRestMeasures::appendMeasureCloneToRestMeasures ( - S_msrMeasure measureClone) -{ - fRestMeasuresContents-> - getRestMeasuresContentsSegment ()-> - appendMeasureToSegment ( - measureClone); -} - -void msrRestMeasures::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRestMeasures::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRestMeasures elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRestMeasures::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrRestMeasures::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRestMeasures::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrRestMeasures elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrRestMeasures::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrRestMeasures::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrRestMeasures::browseData ()" << - endl; - } - -/* JMI - // get the part upLink - S_msrPart - partUpLink = - fRestMeasuresVoiceUpLink-> - fetchVoicePartUpLink (); - - // get the part group upLink - S_msrPartGroup - partGroupUpLink = - partUpLink-> - getPartPartGroupUpLink (); - - // get the score upLink - S_msrScore - scoreUpLink = - partGroupUpLink-> - getPartGroupScoreUpLink (); - - bool inhibitRestMeasuresBrowsing = - scoreUpLink-> - getInhibitRestMeasuresBrowsing (); - - if (inhibitRestMeasuresBrowsing) { - if (gMsrOah->fTraceMsrVisitors || gTraceOah->fTraceRestMeasures) { - gLogOstream << - "% ==> visiting rest measures is inhibited" << - endl; - } - } -*/ - - if (fRestMeasuresContents) { - // JMI if (! inhibitRestMeasuresBrowsing) { - // browse the rest measures contents - msrBrowser browser (v); - browser.browse (*fRestMeasuresContents); -// } - } -} - -string msrRestMeasures::asString () const -{ - stringstream s; - - s << - "RestMeasures" << - ", restMeasuresLastMeasurePuristNumber: '" << - fRestMeasuresLastMeasurePuristNumber << - "'" << - ", restMeasuresMeasureSoundingNotes: " << - fRestMeasuresMeasureSoundingNotes << - ", " << - singularOrPlural ( - fRestMeasuresNumber, - "rest measure", - "rest measures") << - ", restMeasuresNextMeasureNumber: '" << - fRestMeasuresNextMeasureNumber << - "'" << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrRestMeasures::displayRestMeasures ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - "*********>> Rest measures " << context << " \"" << - // JMI getVoiceName () << - "\"" << - ", line " << inputLineNumber << - " contains:" << - endl; - - gIndenter++; - print (gLogOstream); - gIndenter--; - - gLogOstream << - "<<*********" << - endl << - endl; -} - -void msrRestMeasures::print (ostream& os) const -{ - os << - "RestMeasures" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 36; - - os << left << - setw (fieldWidth) << - "restMeasuresLastMeasurePuristNumber" << " : " << - fRestMeasuresLastMeasurePuristNumber << - endl << - setw (fieldWidth) << - "restMeasuresMeasureSoundingNotes" << " : " << - fRestMeasuresMeasureSoundingNotes << - endl << - setw (fieldWidth) << - "restMeasuresNumber" << " : " << - fRestMeasuresNumber << - endl << - setw (fieldWidth) << - "restMeasuresNextMeasureNumber" << " : '" << - fRestMeasuresNextMeasureNumber << - "'" << - endl; - - // print the voice upLink - os << left << - setw (fieldWidth) << - "restMeasuresVoiceUpLink" << " : " << - "\"" << - fRestMeasuresVoiceUpLink->getVoiceName () << - "\"" << - endl; - - // print the rests contents - if (! fRestMeasuresContents) { - os << left << - setw (fieldWidth) << - "restMeasuresContents" << " : " << "none" << - endl; - } - - else { - os << - fRestMeasuresContents; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrRestMeasures& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrRestMeasures_MUT_DEP.h b/src/lilypond/msrRestMeasures_MUT_DEP.h deleted file mode 100644 index 7a966a347..000000000 --- a/src/lilypond/msrRestMeasures_MUT_DEP.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrRestMeasuresContents : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrRestMeasures restMeasures); - - SMARTP createRestMeasuresContentsNewbornClone ( - S_msrRestMeasures restMeasures); - - SMARTP createRestMeasuresContentsDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRestMeasuresContents ( - int inputLineNumber, - S_msrRestMeasures restMeasures); - - virtual ~msrRestMeasuresContents (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLink - S_msrRestMeasures - getRestMeasuresContentsRestMeasuresUpLink () const - { - return fRestMeasuresContentsRestMeasuresUpLink; - } - - void setRestMeasuresContentsSegment ( - int inputLineNumber, - S_msrSegment restMeasuresContentsSegment); - - S_msrSegment getRestMeasuresContentsSegment () const - { return fRestMeasuresContentsSegment; } - - // services - // ------------------------------------------------------ - - int restMeasuresContentsMeasuresNumber () const; - - void collectRestMeasuresContentsMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLink - S_msrRestMeasures fRestMeasuresContentsRestMeasuresUpLink; - - S_msrSegment fRestMeasuresContentsSegment; -}; -typedef SMARTP S_msrRestMeasuresContents; -EXP ostream& operator<< (ostream& os, const S_msrRestMeasuresContents& elt); - -//______________________________________________________________________________ -class msrRestMeasures : public msrVoiceElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrRestMeasuresKind { - kStartRestMeasures, kStopRestMeasures, - k_NoRestMeasures }; - - static string restMeasuresKindAsString ( - msrRestMeasuresKind restMeasuresKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - rational restMeasuresMeasureSoundingNotes, - int restMeasuresNumber, - S_msrVoice voiceUpLink); - - static SMARTP create ( - int inputLineNumber, - S_msrMeasure restMeasureClone, - S_msrVoice voiceUpLink); - - SMARTP createRestMeasuresNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createRestMeasuresDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrRestMeasures ( - int inputLineNumber, - rational restMeasuresMeasureSoundingNotes, - int restMeasuresNumber, - S_msrVoice voiceUpLink); - - msrRestMeasures ( - int inputLineNumber, - S_msrMeasure restMeasureClone, - S_msrVoice voiceUpLink); - - virtual ~msrRestMeasures (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrVoice getRestMeasuresVoiceUpLink () const - { return fRestMeasuresVoiceUpLink; } - - int getRestMeasuresNumber () const - { return fRestMeasuresNumber; } - - void setRestMeasuresContents ( - S_msrRestMeasuresContents - restMeasuresContents); - - S_msrRestMeasuresContents - getRestMeasuresContents () const - { return fRestMeasuresContents; } - - void setRestMeasuresNextMeasureNumber ( - string nextMeasureNumber); - - string getRestMeasuresNextMeasureNumber () const - { return fRestMeasuresNextMeasureNumber; } - - void setRestMeasuresLastMeasurePuristMeasureNumber ( - int inputLineNumber); - - int getRestMeasuresLastMeasurePuristMeasureNumber () const - { return fRestMeasuresLastMeasurePuristNumber; } - - rational getRestMeasuresMeasureSoundingNotes () const - { return fRestMeasuresMeasureSoundingNotes; } - - // services - // ------------------------------------------------------ - - void appendMeasureCloneToRestMeasures ( - S_msrMeasure measureClone); - - int restMeasuresContentsMeasuresNumber () const - { - return - fRestMeasuresContents-> - restMeasuresContentsMeasuresNumber (); - } - - void collectRestMeasuresIntoFlatList ( - int inputLineNumber); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - void displayRestMeasures ( - int inputLineNumber, - string context); - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrVoice fRestMeasuresVoiceUpLink; - - int fRestMeasuresNumber; - - S_msrRestMeasuresContents - fRestMeasuresContents; - - string fRestMeasuresNextMeasureNumber; - int fRestMeasuresLastMeasurePuristNumber; - - // shortcut for efficiency - rational fRestMeasuresMeasureSoundingNotes; -}; -typedef SMARTP S_msrRestMeasures; -EXP ostream& operator<< (ostream& os, const S_msrRestMeasures& elt); - diff --git a/src/lilypond/msrScaling.cpp b/src/lilypond/msrScaling.cpp deleted file mode 100644 index 551a4329c..000000000 --- a/src/lilypond/msrScaling.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrScaling.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" -#include "lpsrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrScaling msrScaling::create ( - int inputLineNumber) -{ - msrScaling* o = - new msrScaling ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrScaling::msrScaling ( - int inputLineNumber) - : msrElement (inputLineNumber) -{ - fMillimeters = -1; - fTenths = -1; - - fPageLayout = - msrPageLayout::create ( - inputLineNumber); -} - -msrScaling::~msrScaling () -{} - -S_msrScaling msrScaling::createMsrScalingNewbornClone () -{ - S_msrScaling - newbornClone = - msrScaling::create ( - fInputLineNumber); - - newbornClone->fMillimeters = - fMillimeters; - newbornClone->fTenths = - fTenths; - - newbornClone->fPageLayout = - fPageLayout; - - return newbornClone; -} - -float msrScaling::fetchGlobalStaffSize () const -{ - const float optionsGlobalStaffSize = - gLpsrOah->fGlobalStaffSize; - - const float defaultTenthsToMillimetersRatio = 0.175; - - float millimetersOverTenths = - fMillimeters / fTenths; - float ratio = - millimetersOverTenths / defaultTenthsToMillimetersRatio; - - float staffSize = - optionsGlobalStaffSize * ratio; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGeometry) { - gLogOstream << - "fetchGlobalStaffSize():" << - endl; - - gIndenter++; - - gLogOstream << - "optionsGlobalStaffSize" << " : " << - optionsGlobalStaffSize << - endl << - "defaultTenthsToMillimetersRatio" << " : " << - defaultTenthsToMillimetersRatio << - endl << - "millimetersOverTenths" << " : " << - millimetersOverTenths << - endl << - "ratio" << " : " << - ratio << - endl << - "staffSize" << " : " << - staffSize << - endl; - - gIndenter--; - } -#endif - - if (staffSize < 1.0 || staffSize > 100.0) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGeometry) { - stringstream s; - - s << - "staffSize " << staffSize << - " is not between 1.0 and 100.0, replaced by 20.0:" << - endl; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - fInputLineNumber, - s.str ()); - } -#endif - - staffSize = optionsGlobalStaffSize; - } - - return staffSize; -} - -void msrScaling::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrScaling::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrScaling elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrScaling::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrScaling::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrScaling::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrScaling elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrScaling::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrScaling::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% ==> msrScaling::browseData ()" << - endl; - } -#endif - - // browse the page layout - if (fPageLayout) { - msrBrowser browser (v); - browser.browse (*fPageLayout); - } - -#ifdef TRACE_OAH - if (gLpsrOah->fTraceLpsrVisitors) { - gLogOstream << - "% <== msrScaling::browseData ()" << - endl; - } -#endif -} - -void msrScaling::print (ostream& os) const -{ - os << - "Scaling" << - endl; - - gIndenter++; - - const int fieldWidth = 13; - - // relative to absolute lengths conversion - os << left << - setw (fieldWidth) << - "millimeters" << " : " << - setprecision (2) << fMillimeters << - endl << - setw (fieldWidth) << - "tenths" << " : " << - setprecision (2) << fTenths << - endl; - - // page layout - os << left << - setw (fieldWidth) << - "pageLayout" << " : "; - if (fPageLayout) { - os << - fPageLayout; - } - else { - os << "none"; - } - os << endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrScaling& elt) { - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrScaling.h b/src/lilypond/msrScaling.h deleted file mode 100644 index d266a201d..000000000 --- a/src/lilypond/msrScaling.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrScaling___ -#define ___msrScaling___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - -#include "msrLayouts.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrScaling : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - SMARTP createMsrScalingNewbornClone (); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrScaling ( - int inputLineNumber); - - virtual ~msrScaling (); - - public: - - // set and get - // ------------------------------------------------------ - - // relative to absolute lengths conversion - void setMillimeters (float val) - { fMillimeters = val; } - float getMillimeters () const - { return fMillimeters; } - - void setTenths (int val) - { fTenths = val; } - float getTenths () const - { return float(fTenths); } - - // page layout - void setPageLayout (S_msrPageLayout val) - { fPageLayout = val; } - S_msrPageLayout getPageLayout () const - { return fPageLayout; } - - public: - - // services - // ------------------------------------------------------ - - float fetchGlobalStaffSize () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - - private: - - // fields - // ------------------------------------------------------ - - // relative to absolute lengths conversion - float fMillimeters; - int fTenths; - - // page layout - S_msrPageLayout fPageLayout; -}; -typedef SMARTP S_msrScaling; -EXP ostream& operator<< (ostream& os, const S_msrScaling& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrScores.cpp b/src/lilypond/msrScores.cpp deleted file mode 100644 index 82fb54603..000000000 --- a/src/lilypond/msrScores.cpp +++ /dev/null @@ -1,806 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrScores.h" - -#include // for 'setw()' - -#include "msr.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - - -using namespace std; - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrScore msrScore::create ( - int inputLineNumber) -{ - msrScore* o = - new msrScore ( - inputLineNumber); - assert(o!=0); - return o; -} - -msrScore::msrScore ( - int inputLineNumber) - : msrElement (inputLineNumber) -{ - // create the identification - fIdentification = - msrIdentification::create ( - inputLineNumber); - - // create the scaling - fScaling = - msrScaling::create ( - inputLineNumber); - - // create the page layout - fPageLayout = - msrPageLayout::create ( - inputLineNumber); - - // number of measures - fScoreNumberOfMeasures = -1; - - // part group names max length - fScorePartGroupNamesMaxLength = -1; - - // part names max length - fScorePartNamesMaxLength = -1; - - // set instrument names max lengthes - fScoreInstrumentNamesMaxLength = -1; - fScoreInstrumentAbbreviationsMaxLength = -1; - - // measures repeats replicas should be browsed by default - fInhibitMeasuresRepeatReplicasBrowsing = false; - - // rest measures should be browsed by default - fInhibitRestMeasuresBrowsing = false; -} - -msrScore::~msrScore () -{} - -S_msrScore msrScore::createScoreNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceScore) { - gLogOstream << - "Creating a newborn clone of a score" << - endl; - } -#endif - - S_msrScore - newbornClone = - msrScore::create ( - fInputLineNumber); - - // number of measures - newbornClone->fScoreNumberOfMeasures = - fScoreNumberOfMeasures; - - // part group names max length - - newbornClone->fScorePartGroupNamesMaxLength = - fScorePartGroupNamesMaxLength; - - // part names max length - - newbornClone->fScorePartNamesMaxLength = - fScorePartNamesMaxLength; - - // instrument names max lengthes - - newbornClone->fScoreInstrumentNamesMaxLength = - fScoreInstrumentNamesMaxLength; - - newbornClone->fScoreInstrumentAbbreviationsMaxLength = - fScoreInstrumentAbbreviationsMaxLength; - - // inhibiting browsing - - newbornClone->fInhibitMeasuresRepeatReplicasBrowsing = - fInhibitMeasuresRepeatReplicasBrowsing; - - newbornClone->fInhibitRestMeasuresBrowsing = - fInhibitRestMeasuresBrowsing; - - return newbornClone; -} - -void msrScore::setScoreMasterVoice ( - S_msrVoice masterVoice) -{ fScoreMasterVoice = masterVoice; } - -S_msrVoice msrScore::getScoreMasterVoice () const -{ return fScoreMasterVoice; } - -void msrScore::addPartGroupToScore (S_msrPartGroup partGroup) -{ - if (fScorePartGroupsSet.count (partGroup)) { - stringstream s; - - s << - "part group '" << - partGroup->getPartGroupCombinedName () << - "' already exists in this score"; - - msrInternalError ( - gOahOah->fInputSourceName, - partGroup->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - // register it in this score - fScorePartGroupsSet.insert (partGroup); - fPartGroupsList.push_back (partGroup); -} - -void msrScore::appendCreditToScore (S_msrCredit credit) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceCredits) { - gLogOstream << - "Appending credit '" << - credit->asString () << - "' to score" << - endl; - } -#endif - - fCreditsList.push_back (credit); -} - -S_msrPart msrScore::fetchPartFromScoreByItsPartID ( - int inputLineNumber, - string partID) -{ - S_msrPart result; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - gLogOstream << - "fetchPartFromScoreByItsPartID(" << partID << "), fPartGroupsList contains:" << - endl; - - gIndenter++; - - for ( - list::const_iterator i = fPartGroupsList.begin (); - i != fPartGroupsList.end (); - i++ - ) { - gLogOstream << - (*i)->getPartGroupCombinedName () << - ", " << - (*i)->getPartGroupName () << - endl; - } // for - - gIndenter--; - - gLogOstream << - "<=- fetchPartFromScoreByItsPartID(" << partID << ")" << - endl << - endl; - } -#endif - - for ( - list::const_iterator i = fPartGroupsList.begin (); - i != fPartGroupsList.end (); - i++ - ) { - S_msrPart - part = - (*i)-> - fetchPartFromPartGroupByItsPartID ( - inputLineNumber, - partID); - - if (part) { - result = part; - break; - } - } // for - - return result; -} - -void msrScore::fetchIdentificationFromCreditsIfAny ( - int inputLineNumber) -{ - if ( - ! fIdentification->getWorkTitle () - && - gMusicXMLOah->fUseFilenameAsWorkTitle - ) { - string - inputSourceName = - gOahOah->fInputSourceName; - - if (inputSourceName == "-") { - inputSourceName = "Standard_input"; - } - } - - /* - - "R E Q U I E M" from D E A T H N O T E - - - Theme from L's death. For SATB choir. - - - Yoshihisa Hirano & Hideki Taniuchi - - - arrangement and lyrics by Andrés Rojas - - - */ - - // credits on top of page one can be used as identification - if (fCreditsList.size () >= 1) { - list::const_iterator - iBegin = fCreditsList.begin (), - iEnd = fCreditsList.end (), - i = iBegin; - - int topCreditsCounter = 0; - int bottomCreditsCounter = 0; - - for ( ; ; ) { - S_msrCredit credit = (*i); - - if (credit->getCreditPageNumber () == 1) { - const vector& - creditWordsVector = - credit-> - getCreditWordsList (); - - if (creditWordsVector.size () >= 1) { - S_msrCreditWords - creditWords = - creditWordsVector.front (); - - string - creditWordsContents = - creditWords-> - getCreditWordsContents (); - - switch (creditWords->getCreditWordsVerticalAlignmentKind ()) { - case kVerticalAlignmentNone: - break; - - case kVerticalAlignmentTop: - topCreditsCounter++; - - switch (topCreditsCounter) { - case 1: -#ifdef TRACE_OAH - if (gTraceOah->fTraceCredits) { - gLogOstream << - "Using credit words '" << - creditWordsContents << - "' as score title" << - endl; - } -#endif - - fIdentification-> - setWorkTitle ( - inputLineNumber, - creditWordsContents); - break; - - case 2: -#ifdef TRACE_OAH - if (gTraceOah->fTraceCredits) { - gLogOstream << - "Using credit words '" << - creditWordsContents << - "' as movement title" << - endl; - } -#endif - - fIdentification-> - setMovementTitle ( - inputLineNumber, - creditWordsContents); - break; - - default: - ; - } // switch - break; - - case kVerticalAlignmentMiddle: - break; - - case kVerticalAlignmentBottom: - bottomCreditsCounter++; - - switch (bottomCreditsCounter) { - case 1: -#ifdef TRACE_OAH - if (gTraceOah->fTraceCredits) { - gLogOstream << - "Using credit words '" << - creditWordsContents << - "' as composer" << - endl; - } -#endif - - fIdentification-> - addComposer ( - inputLineNumber, - creditWordsContents); - break; - - case 2: -#ifdef TRACE_OAH - if (gTraceOah->fTraceCredits) { - gLogOstream << - "Using credit words '" << - creditWordsContents << - "' as poet" << - endl; - } -#endif - - fIdentification-> - addPoet ( - inputLineNumber, - creditWordsContents); - break; - - default: - ; - } // switch - break; - } // switch - } - } - - if (++i == iEnd) break; -// s << ", "; - } // for - } -} - -/* JMI -void msrScore::setHeaderFromOptionsIfAny ( - int inputLineNumber) -{ - // should we use lyricists as poets? JMI - if (gMusicXMLOah->fUseLyricistsAsPoets) { - S_msrVarValsListAssoc - lyricists = - fIdentification->getLyricists (); - - const list& - lyricistsValuesList = - lyricists->getVariableValuesList (); - - if (lyricistsValuesList.size ()) { - S_msrVarValsListAssoc - poets = - fIdentification->getPoets (); - - list::const_iterator - iBegin = lyricistsValuesList.begin (), - iEnd = lyricistsValuesList.end (), - i = iBegin; - - for ( ; ; ) { - poets->addAssocVariableValue (*i); - if (++i == iEnd) break; - } // for - } - } -} -*/ - -void msrScore::collectScorePartsList ( - int inputLineNumber, - list& partsList) -{ - S_msrPart result; - - for ( - list::const_iterator i = fPartGroupsList.begin (); - i != fPartGroupsList.end (); - i++ - ) { - S_msrPartGroup - partGroup = (*i); - partGroup-> - collectPartGroupPartsList ( - inputLineNumber, - partsList); - } // for -} - -/* -S_msrPartGroup msrScore::fetchScorePartGroup ( - int partGroupNumber) -{ - S_msrPartGroup result; - - if (fScorePartGroupsMap.count (partGroupNumber)) { - result = fScorePartGroupsMap [partGroupNumber]; - } - - return result; -} -*/ - -void msrScore::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrScore::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrScore elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrScore::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrScore::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrScore::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrScore elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrScore::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrScore::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrScore::browseData ()" << - endl; - } - - if (fIdentification) { - // browse identification - msrBrowser browser (v); - browser.browse (*fIdentification); - } - - if (fScaling) { - // browse scaling - msrBrowser browser (v); - browser.browse (*fScaling); - } - - if (fPageLayout) { - // browse page layout - msrBrowser browser (v); - browser.browse (*fPageLayout); - } - - for ( - list::const_iterator i = fCreditsList.begin (); - i != fCreditsList.end (); - i++ - ) { - // browse the part credit - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - for ( - list::const_iterator i = fPartGroupsList.begin (); - i != fPartGroupsList.end (); - i++ - ) { - // browse the part group - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% <== msrScore::browseData ()" << - endl; - } -} - -void msrScore::print (ostream& os) const -{ - os << - "MSR Score" << - endl; - - gIndenter++; - - const int fieldWidth = 38; - - int partGroupsListSize = - fPartGroupsList.size (); - - os << left << - setw (fieldWidth) << - singularOrPluralWithoutNumber ( - partGroupsListSize, - "part group", "part groups") << - " : " << - partGroupsListSize << - endl << - - setw (fieldWidth) << - singularOrPluralWithoutNumber ( - fScoreNumberOfMeasures, - "measure", "measures") << - " : " << - fScoreNumberOfMeasures << - endl << - - setw (fieldWidth) << - "scorePartGroupNamesMaxLength" << " : " << - fScorePartGroupNamesMaxLength << - endl<< - - setw (fieldWidth) << - "scorePartNamesMaxLength" << " : " << - fScorePartNamesMaxLength << - endl<< - - setw (fieldWidth) << - "scoreInstrumentNamesMaxLength" << " : " << - fScoreInstrumentNamesMaxLength << - endl<< - - setw (fieldWidth) << - "scoreInstrumentAbbreviationsMaxLength" << " : " << - fScoreInstrumentAbbreviationsMaxLength << - endl<< - - setw (fieldWidth) << - "inhibitRestMeasuresBrowsing" << " : " << - booleanAsString ( - fInhibitRestMeasuresBrowsing) << - endl<< - endl; - - // print the identification if any - if (fIdentification) { - os << - fIdentification; - } - - // print the scaling if any - if (fScaling) { - os << - fScaling; - } - - // print the page layout if any - if (fPageLayout) { - os << - fPageLayout; - } - - // print the credits if any - int creditsListSize = fCreditsList.size (); - - os << - setw (fieldWidth) << - "CreditsList"; - if (creditsListSize) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fCreditsList.begin (), - iEnd = fCreditsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl; - } - os << endl; - - // print the part groups if any - if (partGroupsListSize) { - list::const_iterator - iBegin = fPartGroupsList.begin (), - iEnd = fPartGroupsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here - } // for - } - else { - os << - "There are no part groups in the list" << - endl; - } - - gIndenter--; -} - -void msrScore::printSummary (ostream& os) -{ - os << - "MSR component" << - endl; - - gIndenter++; - - const int fieldWidth = 38; - - int partGroupsListSize = - fPartGroupsList.size (); - - // print global information - os << left << - setw (fieldWidth) << - singularOrPluralWithoutNumber ( - partGroupsListSize, - "part group", "part groups") << - " : " << - partGroupsListSize << - endl << - - setw (fieldWidth) << - singularOrPluralWithoutNumber ( - fScoreNumberOfMeasures, - "measure", "measures") << - " : " << - fScoreNumberOfMeasures << - endl << - - setw (fieldWidth) << - "scoreInstrumentNamesMaxLength" << " : " << - fScoreInstrumentNamesMaxLength << - endl << - - setw (fieldWidth) << - "scoreInstrumentAbbreviationsMaxLength" << " : " << - fScoreInstrumentAbbreviationsMaxLength << - endl<< - - setw (fieldWidth) << - "inhibitRestMeasuresBrowsing" << " : " << - booleanAsString ( - fInhibitRestMeasuresBrowsing) << - endl<< - endl; - - // print the implicit part group contents - // it is the only element in fPartGroupsList JMI single variable - if (partGroupsListSize) { - os << - "Parts and part groups structure:" << - endl; - - gIndenter++; - - fPartGroupsList.front () -> - printPartGroupParts ( - fInputLineNumber, - os); - - gIndenter--; - - os << endl; - } - - // print the identification if any - if (fIdentification) { - os << - fIdentification; - } - - // print the scaling if any - if (fScaling) { - os << - fScaling; - } - - // print the credits if any - if (fCreditsList.size ()) { - list::const_iterator - iBegin = fCreditsList.begin (), - iEnd = fCreditsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - os << endl; - } - - if (partGroupsListSize) { - list::const_iterator - iBegin = fPartGroupsList.begin (), - iEnd = fPartGroupsList.end (), - i = iBegin; - for ( ; ; ) { - (*i)-> - printSummary (os); - if (++i == iEnd) break; - os << endl; - } // for - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrScore& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrScores.h b/src/lilypond/msrScores.h deleted file mode 100644 index cd9c21fbc..000000000 --- a/src/lilypond/msrScores.h +++ /dev/null @@ -1,291 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrScores___ -#define ___msrScores___ - -#include - -#include -#include - -#include "msrIdentification.h" -#include "msrScaling.h" -#include "msrLayouts.h" -#include "msrCredits.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrPart; -typedef SMARTP S_msrPart; - -class msrPartGroup; -typedef SMARTP S_msrPartGroup; - -class msrVoice; -typedef SMARTP S_msrVoice; - -//______________________________________________________________________________ -class msrScore : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - SMARTP createScoreNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrScore ( - int inputLineNumber); - - virtual ~msrScore (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrIdentification getIdentification () const - { return fIdentification; } - - void setScaling ( - S_msrScaling scaling) - { fScaling = scaling; } - - S_msrScaling getScaling () const - { return fScaling; } - - void setPageLayout ( - S_msrPageLayout pageLayout) - { fPageLayout = pageLayout; } - - S_msrPageLayout getPageLayout () const - { return fPageLayout; } - - const list& - getPartGroupsList () const - { return fPartGroupsList; } - -//* JMI - void setScoreMasterVoice ( - S_msrVoice masterVoice); - - S_msrVoice getScoreMasterVoice () const; - -/* JMI - void setScoreMasterVoice ( - S_msrVoice masterVoice) - { fScoreMasterVoice = masterVoice; } - - S_msrVoice getScoreMasterVoice () const - { return fScoreMasterVoice; } -*/ - - const list& - getCreditsList () const - { return fCreditsList; } - - void setScoreNumberOfMeasures ( - int scoreNumberOfMeasures) - { - fScoreNumberOfMeasures = - scoreNumberOfMeasures; - } - - int getScoreNumberOfMeasures () const - { return fScoreNumberOfMeasures; } - - void setStaffContainsRestMeasures ( - bool staffContainsRestMeasures) - { - fStaffContainsRestMeasures = - staffContainsRestMeasures; - } - - bool getStaffContainsRestMeasures () const - { return fStaffContainsRestMeasures; } - - // part group names max length - - void setScorePartGroupNamesMaxLength (int value) - { fScorePartGroupNamesMaxLength = value; } - - int getScorePartGroupNamesMaxLength () const - { return fScorePartGroupNamesMaxLength; } - - // part names max length - - void setScorePartNamesMaxLength (int value) - { fScorePartNamesMaxLength = value; } - - int getScorePartNamesMaxLength () const - { return fScorePartNamesMaxLength; } - - // instrument names max lengthes - - void setScoreInstrumentNamesMaxLength (int value) - { fScoreInstrumentNamesMaxLength = value; } - - int getScoreInstrumentNamesMaxLength () const - { return fScoreInstrumentNamesMaxLength; } - - void setScoreInstrumentAbbreviationsMaxLength (int value) - { fScoreInstrumentAbbreviationsMaxLength = value; } - - int getScoreInstrumentAbbreviationsMaxLength () const - { return fScoreInstrumentAbbreviationsMaxLength; } - - // inhibiting browsing - - void setInhibitMeasuresRepeatReplicasBrowsing () - { - fInhibitMeasuresRepeatReplicasBrowsing = - true; - } - - bool getInhibitMeasuresRepeatReplicasBrowsing () - const - { - return - fInhibitMeasuresRepeatReplicasBrowsing; - }; - - void setInhibitRestMeasuresBrowsing () - { - fInhibitRestMeasuresBrowsing = - true; - } - - bool getInhibitRestMeasuresBrowsing () - const - { - return - fInhibitRestMeasuresBrowsing; - }; - - public: - - // services - // ------------------------------------------------------ - - void addPartGroupToScore ( - S_msrPartGroup partGroup); - - void appendCreditToScore ( - S_msrCredit credit); - - S_msrPart fetchPartFromScoreByItsPartID ( - int inputLineNumber, - string partID); - - void fetchIdentificationFromCreditsIfAny ( - int inputLineNumber); - -/* JMI - void setHeaderFromOptionsIfAny ( - int inputLineNumber); -*/ - - void collectScorePartsList ( - int inputLineNumber, - list& partsList); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os); - - private: - - // fields - // ------------------------------------------------------ - - S_msrIdentification fIdentification; - - S_msrScaling fScaling; - - S_msrPageLayout fPageLayout; - - list fCreditsList; - - set fScorePartGroupsSet; - - list fPartGroupsList; - - // master voice - -// JMI - S_msrVoice fScoreMasterVoice; - - // number of measures - - int fScoreNumberOfMeasures; - - // rest measures - - bool fStaffContainsRestMeasures; - - // part group names max length - - int fScorePartGroupNamesMaxLength; - - // part names max length - - int fScorePartNamesMaxLength; - - // instrument names max lengthes - - int fScoreInstrumentNamesMaxLength; - int fScoreInstrumentAbbreviationsMaxLength; - - // inhibiting browsing - - // in , the measure replicas are explicit, - // whereas LilyPond only needs the repeated measure - bool fInhibitMeasuresRepeatReplicasBrowsing; - - // in , the rest measures are explicit, - // whereas LilyPond only needs the number of rest measures - bool fInhibitRestMeasuresBrowsing; -}; -typedef SMARTP S_msrScore; -EXP ostream& operator<< (ostream& os, const S_msrScore& elt); - - -} - -#endif diff --git a/src/lilypond/msrSegments.cpp b/src/lilypond/msrSegments.cpp deleted file mode 100644 index d6ba3d50a..000000000 --- a/src/lilypond/msrSegments.cpp +++ /dev/null @@ -1,2331 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -int msrSegment::gSegmentsCounter = 0; -int msrSegment::gSegmentDebugNumber = 0; - -S_msrSegment msrSegment::create ( - int inputLineNumber, - S_msrVoice segmentVoicekUpLink) -{ - msrSegment* o = - new msrSegment ( - inputLineNumber, - segmentVoicekUpLink); - assert(o!=0); - - return o; -} - -msrSegment::msrSegment ( - int inputLineNumber, - S_msrVoice segmentVoicekUpLink) - : msrVoiceElement (inputLineNumber) -{ - // sanity check - msrAssert( - segmentVoicekUpLink != nullptr, - "segmentVoicekUpLink is null"); - - // set segment's voice upLink - fSegmentVoiceUpLink = - segmentVoicekUpLink; - - // do other initializations - initializeSegment (); -} - -msrSegment::~msrSegment () -{} - -void msrSegment::initializeSegment () -{ - fSegmentAbsoluteNumber = ++gSegmentsCounter; - fSegmentDebugNumber = ++gSegmentDebugNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Initializing new segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "', in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\", line " << fInputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - if (false && fSegmentDebugNumber == 3) { // JMI - gLogOstream << - endl << - "======================= initializeSegment()" << - endl << - - fSegmentVoiceUpLink << - - "=======================" << - endl << - endl; - - abort (); - } - } -#endif -} - -S_msrSegment msrSegment::createSegmentNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a newborn clone of segment " << - asString () << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrSegment - newbornClone = - msrSegment::create ( - fInputLineNumber, - containingVoice); - - // absolute number, for coherency between passes - newbornClone->fSegmentAbsoluteNumber = - fSegmentAbsoluteNumber; - - // keep debug number fSegmentDebugNumber unchanged - - return newbornClone; -} - -S_msrSegment msrSegment::createSegmentDeepCopy ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a deep copy of segment " << - asString () << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrSegment - segmentDeepCopy = - msrSegment::create ( - fInputLineNumber, - containingVoice); - - // absolute number - segmentDeepCopy->fSegmentAbsoluteNumber = - fSegmentAbsoluteNumber; - - // keep debug number fSegmentDebugNumber unchanged - - // the measures in the segment contain the mmusic - int numberOfSegmentMeasures = - fSegmentMeasuresList.size () ; - - if (numberOfSegmentMeasures) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "There are " << - numberOfSegmentMeasures << - " measures in segment to be deep copied" << - endl; - } -#endif - - for ( - list::const_iterator i = fSegmentMeasuresList.begin (); - i != fSegmentMeasuresList.end (); - i++ - ) { - // append a deep copy of the measure to the deep copy - segmentDeepCopy-> - appendMeasureToSegment ( - (*i)-> - createMeasureDeepCopy (this)); - } // for - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "There are no measures in segment to be deep copied" << - endl; - } -#endif - } - - // upLinks - segmentDeepCopy->fSegmentVoiceUpLink = - containingVoice; - - return segmentDeepCopy; -} - -S_msrPart msrSegment::fetchSegmentPartUpLink () const -{ - return - fSegmentVoiceUpLink-> - fetchVoicePartUpLink (); -} - -void msrSegment::assertSegmentMeasuresListIsNotEmpty ( - int inputLineNumber) const -{ - if (! fSegmentMeasuresList.size ()) { -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceMeasures - || - gTraceOah->fTraceSegments - || - gTraceOah->fTraceRepeats - ) { - fSegmentVoiceUpLink-> - displayVoiceRepeatsStackRestMeasuresMeasuresRepeatAndVoice ( - inputLineNumber, - "assertSegmentMeasuresListIsNotEmpty()"); - } -#endif - - gLogOstream << - "assertSegmentMeasuresListIsNotEmpty()" << - ", segmentMeasuresList is empty" << - ", segment: " << - this->asString () << - ", in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - "', line " << inputLineNumber << - endl; - - msrAssert ( - false, - ", segmentMeasuresList is empty"); - } -} - -S_msrMeasure msrSegment::createMeasureAndAppendItToSegment ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating and appending a measure '" << measureNumber << - "', to segment '" << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // determine new measure 'first in segment' kind - msrMeasure::msrMeasureFirstInSegmentKind - measureFirstInSegmentKind; - - if (fSegmentMeasuresList.size () == 0) { - // this is the first measure in the segment - measureFirstInSegmentKind = - msrMeasure::kMeasureFirstInSegmentKindYes; - } - else { - // this is not the first measure in the segment - measureFirstInSegmentKind = - msrMeasure::kMeasureFirstInSegmentKindNo; - } - - // create a measure -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating measure '" << measureNumber << - "' in segment " << asString () << - ", in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - ", measureFirstInSegmentKind: " << - msrMeasure::measureFirstInSegmentKindAsString ( - measureFirstInSegmentKind) << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasure - result = - msrMeasure::create ( - inputLineNumber, - measureNumber, - this); - - // append it to the segment - appendMeasureToSegment (result); - - gIndenter--; - - return result; -} - -void msrSegment::setNextMeasureNumberInSegment ( - int inputLineNumber, - string nextMeasureNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting next measure number to '" << nextMeasureNumber << - "' in segment '" << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - if (fSegmentMeasuresList.size ()) { // JMI ??? -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting next measure number to '" << nextMeasureNumber << - "' in segment '" << asString () << - "'s last measure " << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - fSegmentMeasuresList.back ()-> - setNextMeasureNumber ( - nextMeasureNumber); - } - - gIndenter--; -} - -void msrSegment::appendClefToSegment (S_msrClef clef) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Appending clef '" << clef->asString () << - "' to segment " << asString () << - ", in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - // sanity check - if (fSegmentMeasuresList.size () == 0) { - stringstream s; - - s << - "SegmentMeasuresList is empty" << - " in segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\""; - - gLogOstream << - "SegmentVoiceUpLink:" << - endl; - gIndenter++; - gLogOstream << - fSegmentVoiceUpLink << - endl; - gIndenter--; - - msrInternalError ( - gOahOah->fInputSourceName, - clef->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - // register clef in segments's current measure - fSegmentMeasuresList.back ()-> - appendClefToMeasure (clef); - - gIndenter--; -} - -void msrSegment::prependClefToSegment (S_msrClef clef) // JMI -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Prepending clef '" << clef->asString () << - "' to segment " << asString () << - ", in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - // sanity check - if (fSegmentMeasuresList.size () == 0) { - stringstream s; - - s << - "SegmentMeasuresList is empty" << - " in segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\""; - - gLogOstream << - "SegmentVoiceUpLink:" << - endl; - gIndenter++; - gLogOstream << - fSegmentVoiceUpLink << - endl; - gIndenter--; - - msrInternalError ( - gOahOah->fInputSourceName, - clef->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - - // register clef in segments's current measure - fSegmentMeasuresList.front ()-> - appendClefToMeasure (clef); - - gIndenter--; -} - -void msrSegment::appendKeyToSegment (S_msrKey key) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Appending key '" << key->asString () << - "' to segment " << asString () << - ", in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - key->getInputLineNumber ()); - - gIndenter++; - - // register key in segments's current measure - fSegmentMeasuresList.back ()-> - appendKeyToMeasure (key); - - gIndenter--; -} - -void msrSegment::appendTimeToSegment (S_msrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time:" << - endl; - - gIndenter++; - - gLogOstream << - time; - - gIndenter--; - - gLogOstream << - "to segment " << asString () << - ", in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - time->getInputLineNumber ()); - - gIndenter++; - - // append time to segments's current measure - fSegmentMeasuresList.back ()-> - appendTimeToMeasure (time); - - gIndenter--; -} - -void msrSegment::appendTimeToSegmentClone (S_msrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time:" << - endl; - - gIndenter++; - - gLogOstream << - time; - - gIndenter--; - - gLogOstream << - "to segment clone " << asString () << - ", in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - time->getInputLineNumber ()); - - // append time to segments's current measure - fSegmentMeasuresList.back ()-> - appendTimeToMeasureClone (time); - - gIndenter--; -} - -void msrSegment::appendHarmonyToSegment (S_msrHarmony harmony) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending harmony " << - harmony->asString () << - " to segment " << asString () << - " in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - int inputLineNumber = - harmony->getInputLineNumber (); - - gIndenter++; - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - inputLineNumber); - - // append harmony to this segment - fSegmentMeasuresList.back ()-> - appendHarmonyToMeasure (harmony); - - gIndenter--; -} - -void msrSegment::appendHarmonyToSegmentClone (S_msrHarmony harmony) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending harmony " << harmony->asString () << - " to segment clone " << asString () << - "' in voice clone \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - harmony->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendHarmonyToMeasureClone (harmony); - - gIndenter--; -} - -void msrSegment::appendFiguredBassToSegment ( - S_msrFiguredBass figuredBass) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << - figuredBass->asString () << - " to segment " << asString () << - " in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - int inputLineNumber = - figuredBass->getInputLineNumber (); - - gIndenter++; - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - inputLineNumber); - - // append figuredBass to this segment - fSegmentMeasuresList.back ()-> - appendFiguredBassToMeasure (figuredBass); - - gIndenter--; -} - -void msrSegment::appendFiguredBassToSegmentClone ( - S_msrFiguredBass figuredBass) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << - figuredBass->asString () << - " to segment clone " << asString () << - "' in voice clone \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - figuredBass->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendFiguredBassToMeasure (figuredBass); - - gIndenter--; -} - -void msrSegment::appendSegnoToSegment (S_msrSegno segno) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegnos) { - gLogOstream << - "Appending segno " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - segno->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendSegnoToMeasure (segno); - - gIndenter--; -} - -void msrSegment::appendCodaToSegment (S_msrCoda coda) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceCodas) { - gLogOstream << - "Appending coda " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - coda->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendCodaToMeasure (coda); - - gIndenter--; -} - -void msrSegment::appendEyeGlassesToSegment ( - S_msrEyeGlasses eyeGlasses) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceEyeGlasses) { - gLogOstream << - "Appending eyeGlasses " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - eyeGlasses->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendEyeGlassesToMeasure (eyeGlasses); - - gIndenter--; -} - -void msrSegment::appendPedalToSegment (S_msrPedal pedal) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePedals) { - gLogOstream << - "Appending pedal " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } - -#endif - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - pedal->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendPedalToMeasure (pedal); - - gIndenter--; -} - -void msrSegment::appendDampToSegment (S_msrDamp damp) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceDamps) { - gLogOstream << - "Appending damp " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - damp->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendDampToMeasure (damp); - - gIndenter--; -} - -void msrSegment::appendDampAllToSegment (S_msrDampAll dampAll) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceDampAlls) { - gLogOstream << - "Appending damp all " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - dampAll->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendDampAllToMeasure (dampAll); - - gIndenter--; -} - -void msrSegment::appendTransposeToSegment ( - S_msrTranspose transpose) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Appending transpose " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - transpose->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendTransposeToMeasure (transpose); - - gIndenter--; -} - -void msrSegment::appendPartNameDisplayToSegment ( - S_msrPartNameDisplay partNameDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Appending part name display " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - partNameDisplay->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendPartNameDisplayToMeasure (partNameDisplay); - - gIndenter--; -} - -void msrSegment::appendPartAbbreviationDisplayToSegment ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Appending part abbreviation display " << - - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - partAbbreviationDisplay->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendPartAbbreviationDisplayToMeasure ( - partAbbreviationDisplay); - - gIndenter--; -} - -void msrSegment::appendStaffDetailsToSegment ( - S_msrStaffDetails staffDetails) -{ - int inputLineNumber = - staffDetails->getInputLineNumber (); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceStaffDetails - || - gTraceOah->fTraceSegments - ) { - gLogOstream << - "Appending staff details '" << - staffDetails->asShortString () << - "' to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\" line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceStaffDetails - || - gTraceOah->fTraceSegments - ) { - fSegmentVoiceUpLink-> - displayVoice ( - inputLineNumber, - "appendStaffDetailsToSegment() 1"); - } -#endif - - gIndenter++; - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - staffDetails->getInputLineNumber ()); - - // append staffDetails to this segment - fSegmentMeasuresList.back ()-> - appendStaffDetailsToMeasure (staffDetails); - -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceStaffDetails - || - gTraceOah->fTraceSegments - ) { - fSegmentVoiceUpLink-> - displayVoice ( - inputLineNumber, - "appendStaffDetailsToSegment() 2"); - } -#endif - - gIndenter--; -} - -void msrSegment::appendLineBreakToSegment (S_msrLineBreak lineBreak) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLineBreaks) { - gLogOstream << - "Appending break '" << - lineBreak->asShortString () << - "' to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - lineBreak->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendLineBreakToMeasure (lineBreak); - - gIndenter--; -} - -void msrSegment::appendPageBreakToSegment (S_msrPageBreak pageBreak) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePageBreaks) { - gLogOstream << - "Appending break " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - pageBreak->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendPageBreakToMeasure (pageBreak); - - gIndenter--; -} - -void msrSegment::appendBarNumberCheckToSegment ( - S_msrBarNumberCheck barNumberCheck) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarNumberChecks) { - gLogOstream << - "Appending bar number check " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - barNumberCheck->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendBarNumberCheckToMeasure (barNumberCheck); - - gIndenter--; -} - -void msrSegment::appendTempoToSegment ( - S_msrTempo tempo) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - gLogOstream << - "Appending tempo " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - tempo->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendTempoToMeasure (tempo); - - gIndenter--; -} - -void msrSegment::appendRehearsalToSegment ( - S_msrRehearsal rehearsal) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRehearsals) { - gLogOstream << - "Appending rehearsal " << - " to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - rehearsal->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendRehearsalToMeasure (rehearsal); - - gIndenter--; -} - -void msrSegment::appendOctaveShiftToSegment ( - S_msrOctaveShift octaveShift) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOctaveShifts) { - gLogOstream << - "Appending octave shift '" << - octaveShift->octaveShiftKindAsString () << - "' to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - octaveShift->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendOctaveShiftToMeasure (octaveShift); - - gIndenter--; -} - -void msrSegment::appendScordaturaToSegment ( - S_msrScordatura scordatura) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceScordaturas) { - gLogOstream << - "Appending scordatura '" << - // JMI ??? scordatura->octaveShiftKindAsString () << - "' to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - scordatura->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendScordaturaToMeasure (scordatura); - - gIndenter--; -} - -void msrSegment::appendAccordionRegistrationToSegment ( - S_msrAccordionRegistration - accordionRegistration) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Appending accordion registration '" << - accordionRegistration->asString () << - "' to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - accordionRegistration->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendAccordionRegistrationToMeasure ( - accordionRegistration); - - gIndenter--; -} - -void msrSegment::appendHarpPedalsTuningToSegment ( - S_msrHarpPedalsTuning - harpPedalsTuning) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Appending staff pedals tuning '" << - harpPedalsTuning->asString () << - "' to segment " << asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - harpPedalsTuning->getInputLineNumber ()); - - gIndenter++; - - // append it to this segment - fSegmentMeasuresList.back ()-> - appendHarpPedalsTuningToMeasure ( - harpPedalsTuning); - - gIndenter--; -} - -void msrSegment::padUpToPositionInMeasureInSegment ( - int inputLineNumber, - rational wholeNotes) -{ -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceSegments - || - gTraceOah->fTraceMeasures - || - gMusicXMLOah->fTraceBackup - ) { - gLogOstream << - "Padding up to current whole notes '" << wholeNotes << - "' in segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - if (false && fSegmentMeasuresList.size () == 0) { // JMI - stringstream s; - - s << - "SegmentMeasuresList is empty" << - " in segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\""; - - gLogOstream << - "SegmentVoiceUpLink:" << - endl; - gIndenter++; - gLogOstream << - fSegmentVoiceUpLink << - endl; - gIndenter--; - - gLogOstream << - "Part:" << - endl; - gIndenter++; - gLogOstream << - fSegmentVoiceUpLink->fetchVoicePartUpLink () << - endl; - gIndenter--; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (fSegmentMeasuresList.size ()) { // JMI BOFBOF - // pad last measure up to to this actual wholes notes - fSegmentMeasuresList.back ()-> - padUpToPositionInMeasureInMeasure ( - inputLineNumber, - wholeNotes); - } -} - -void msrSegment::backupByWholeNotesStepLengthInSegment ( - int inputLineNumber, - rational backupTargetMeasureElementPositionInMeasure) -{ -#ifdef TRACE_OAH - if ( - gTraceOah->fTraceSegments - || - gTraceOah->fTraceMeasures - || - gMusicXMLOah->fTraceBackup - ) { - gLogOstream << - "Backup by a '" << - backupTargetMeasureElementPositionInMeasure << - "' whole notes step length in segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - if (fSegmentMeasuresList.size ()) { // JMI BOFBOF - // pad last measure up to to this actual wholes notes - fSegmentMeasuresList.back ()-> - backupByWholeNotesStepLengthInMeasure ( - inputLineNumber, - backupTargetMeasureElementPositionInMeasure); - } -} - -void msrSegment::appendPaddingNoteToSegment ( - int inputLineNumber, - rational forwardStepLength) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Appending padding note" << - ", forwardStepLength: " << - forwardStepLength << - ", to segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - if (fSegmentMeasuresList.size ()) { // JMI BOFBOF - // append a padding note to the segment's last measure - fSegmentMeasuresList.back ()-> - appendPaddingNoteToMeasure ( - inputLineNumber, - forwardStepLength); - } - - gIndenter--; -} - -void msrSegment::appendMeasureToSegment (S_msrMeasure measure) -{ - int inputLineNumber = - measure->getInputLineNumber (); - - string measureNumber = - measure->getMeasureElementMeasureNumber (); - - int segmentMeasuresListSize = - fSegmentMeasuresList.size (); - - string currentMeasureNumber = - segmentMeasuresListSize == 0 - ? "" - : fSegmentMeasuresList.back ()->getMeasureElementMeasureNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending measure '" << measureNumber << - "' to segment " << asString (); - - if (fSegmentMeasuresList.size () == 0) - gLogOstream << - ", as first measure"; - else - gLogOstream << - ", after measure number '" << currentMeasureNumber << "'"; - - gLogOstream << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - ", line " << measure->getInputLineNumber () << - endl; - } -#endif - - if (measureNumber == currentMeasureNumber) { - stringstream s; - - s << - "measure number '" << measureNumber << - "' occurs twice in a row"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // is measure the first one this segment? - if (segmentMeasuresListSize == 0) { - measure-> - setMeasureFirstInSegmentKind ( - msrMeasure::kMeasureFirstInSegmentKindYes); - } - else { - measure-> - setMeasureFirstInSegmentKind ( - msrMeasure::kMeasureFirstInSegmentKindNo); - } - - // is measure the first one it the voice? - // this is necessary for voice clones, - // which don't go down the part-staff-voice-segment hierarchy - if (! fSegmentVoiceUpLink->getVoiceFirstMeasure ()) { - // yes, register it as such - fSegmentVoiceUpLink-> - setVoiceFirstMeasure (measure); - - measure-> - setMeasureFirstInVoice (); - } - - // append measure to the segment - fSegmentMeasuresList.push_back (measure); -} - -void msrSegment::prependMeasureToSegment (S_msrMeasure measure) -{ - int inputLineNumber = - measure->getInputLineNumber (); - - string measureNumber = - measure->getMeasureElementMeasureNumber (); - - int segmentMeasuresListSize = - fSegmentMeasuresList.size (); - - string currentMeasureNumber = - segmentMeasuresListSize == 0 - ? "" - : fSegmentMeasuresList.back ()->getMeasureElementMeasureNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Prepending measure " << measureNumber << - " to segment " << asString (); - - if (segmentMeasuresListSize == 0) { - gLogOstream << - ", as first measure FOO"; // JMI - } - -/* JMI - else - gLogOstream << - ", after measure number '" << currentMeasureNumber << "'"; -*/ - - gLogOstream << - " in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - ", line " << measure->getInputLineNumber () << - endl; - } -#endif - - if (measureNumber == currentMeasureNumber) { - stringstream s; - - s << - "measure number '" << measureNumber << - "' occurs twice in a row"; - - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - measure-> - setMeasureFirstInVoice (); - - // prepend measure to the segment - fSegmentMeasuresList.push_front (measure); -} - -void msrSegment::prependBarlineToSegment (S_msrBarline barline) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - gLogOstream << - "Prepending barline '" << barline->asString () << - "' to segment '" << asString () << "'" << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - barline->getInputLineNumber ()); - - // prepend barline to this segment - gIndenter++; - - fSegmentMeasuresList.front ()-> - prependBarlineToMeasure (barline); - - gIndenter--; -} - -void msrSegment::appendBarlineToSegment (S_msrBarline barline) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - gLogOstream << - "Appending barline " << barline->asString () << - " to segment " << asString () << "'" << - " in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - barline->getInputLineNumber ()); - - gIndenter++; - - // append barline to this segment - fSegmentMeasuresList.back ()-> - appendBarlineToMeasure (barline); - - gIndenter--; -} - -void msrSegment::appendBarCheckToSegment (S_msrBarCheck barCheck) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarChecks) { - gLogOstream << - "Appending bar check '" << barCheck->asString () << - "' to segment '" << asString () << "'" << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - barCheck->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendBarCheckToMeasure (barCheck); -} - -void msrSegment::appendVoiceStaffChangeToSegment ( - S_msrVoiceStaffChange voiceStaffChange) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffChanges) { - gLogOstream << - "Appending voice staff change '" << - voiceStaffChange->asString () << - "' to segment \"" << asString () << "\"" << - ", line " << voiceStaffChange->getInputLineNumber () << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - voiceStaffChange->getInputLineNumber ()); - - gIndenter++; - - fSegmentMeasuresList.back ()-> - appendVoiceStaffChangeToMeasure ( - voiceStaffChange); - - gIndenter--; -} - -void msrSegment::appendNoteToSegment ( - S_msrNote note, - rational partCurrentPositionInMeasure) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - if (! fSegmentMeasuresList.size ()) { // JMI - displaySegment ( - note->getInputLineNumber (), - "appendNoteToSegment()"); - } - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - note->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendNoteToMeasure ( - note, - partCurrentPositionInMeasure); -} - -void msrSegment::appendNoteToSegmentClone (S_msrNote note) -{ - fSegmentMeasuresList.back ()-> - appendNoteToMeasureClone (note); -} - -void msrSegment::appendDoubleTremoloToSegment ( // JMI - S_msrDoubleTremolo doubleTremolo) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Appending double tremolo " << - doubleTremolo->asShortString () << - " to segment '" << asString () << "'" << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - endl; - } -#endif - - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - doubleTremolo->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendDoubleTremoloToMeasure (doubleTremolo); -} - -void msrSegment::appendChordToSegment (S_msrChord chord) // JMI -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - chord->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendChordToMeasure (chord); -} - -void msrSegment::appendTupletToSegment (S_msrTuplet tuplet) // JMI -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - tuplet->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendTupletToMeasure (tuplet); -} - -/* JMI -void msrSegment::addGraceNotesGroupAheadOfSegmentIfNeeded ( - S_msrGraceNotesGroup graceNotesGroup) - -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - graceNotesGroup->getInputLineNumber ()); - - fSegmentMeasuresList.front ()-> - addGraceNotesGroupAheadOfMeasure (graceNotesGroup); -} - -void msrSegment::appendGraceNotesToSegment ( - S_msrGraceNotes graceNotes) -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - graceNotes->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendGraceNotesToMeasure (graceNotes); -} - -void msrSegment::appendAfterGraceNotesToSegment ( - S_msrAfterGraceNotes afterGraceNotes) -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - afterGraceNotes->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendAfterGraceNotesToMeasure (afterGraceNotes); -} - -void msrSegment::prependAfterGraceNotesToSegment ( - S_msrAfterGraceNotes afterGraceNotes) - -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - afterGraceNotes->getInputLineNumber ()); - - fSegmentMeasuresList.front ()-> - prependAfterGraceNotesToMeasure (afterGraceNotes); // JMI -} -*/ - -void msrSegment::prependOtherElementToSegment ( - S_msrMeasureElement elem) -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - elem->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - prependOtherElementToMeasure (elem); -} - -void msrSegment::appendOtherElementToSegment ( - S_msrMeasureElement elem) -{ - // sanity check - assertSegmentMeasuresListIsNotEmpty ( - elem->getInputLineNumber ()); - - fSegmentMeasuresList.back ()-> - appendOtherElementToMeasure (elem); -} - -/* JMI -S_msrElement msrSegment::removeLastElementFromSegment ( - int inputLineNumber) -{ - // this last element can be a note or a tuplet, - // this method is used when the seconde note of a chord is mest - - if (fSegmentMeasuresList.size ()) { - return - fSegmentMeasuresList.back ()-> - removeLastElementFromMeasure ( - inputLineNumber); - } - - else { - msrInternalError ( - inputLineNumber, - "cannot removeLastElementFromSegment () " << - asString () << - " since it is empty"); - } -} -*/ - -void msrSegment::removeNoteFromSegment ( - int inputLineNumber, - S_msrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Removing note '" << - note->asString () << - "'from segment '" << - asString () << - "'" << - endl; - } -#endif - - gIndenter++; - - if (fSegmentMeasuresList.size ()) { - fSegmentMeasuresList.back ()-> - removeNoteFromMeasure ( - inputLineNumber, - note); - } - - else { - stringstream s; - - s << - "cannot remove note from segment " << - asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - " since it is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - gIndenter--; -} - -void msrSegment::removeElementFromSegment ( - int inputLineNumber, - S_msrElement element) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Removing element '" << - element->asString () << - "'from segment '" << - asString () << - "'" << - endl; - } -#endif - - if (fSegmentMeasuresList.size ()) { - fSegmentMeasuresList.back ()-> - removeElementFromMeasure ( - inputLineNumber, - element); - } - - else { - stringstream s; - - s << - "cannot remove note from segment " << - asString () << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - " since it is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -S_msrMeasure msrSegment::fetchLastMeasureFromSegment ( - int inputLineNumber, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Fetching last measure from segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - " (" << context << ")" << - "', line " << inputLineNumber << - endl; - } -#endif - - if (! fSegmentMeasuresList.size ()) { - stringstream s; - - s << - "cannot fetch last measure from segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - "' since it is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - S_msrMeasure - result = - fSegmentMeasuresList.back (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - endl << - "The fetched measure contains:" << - endl; - - gIndenter++; - - gLogOstream << - result << - endl; - - gIndenter--; - } -#endif - - return result; -} - -S_msrMeasure msrSegment::removeLastMeasureFromSegment ( - int inputLineNumber, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Removing last measure from segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - " (" << context << ")" << - "', line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - fSegmentVoiceUpLink-> - displayVoiceRepeatsStackRestMeasuresMeasuresRepeatAndVoice ( - inputLineNumber, - "removeLastMeasureFromSegment() 1"); - } -#endif - - if (! fSegmentMeasuresList.size ()) { - stringstream s; - - s << - "cannot remove last measure from segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"," << - "' since it is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - S_msrMeasure - result = - fSegmentMeasuresList.back (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - endl << - "The removed measure contains:" << - endl; - - gIndenter++; - - gLogOstream << - result << - endl; - - gIndenter--; - } -#endif - - // JMI for tests abort (); - - fSegmentMeasuresList.pop_back (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - fSegmentVoiceUpLink-> - displayVoiceRepeatsStackRestMeasuresMeasuresRepeatAndVoice ( - inputLineNumber, - "removeLastMeasureFromSegment() 2"); - } -#endif - - return result; -} - -void msrSegment::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSegment::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSegment elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSegment::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSegment::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSegment::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSegment elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSegment::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrSegment::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSegment::browseData ()" << - endl; - } - -/* JMI - gLogOstream << - gTab << - "==========>>> " << - fSegmentMeasuresList.size () << " measures" << endl; - */ - - for ( - list::const_iterator i = fSegmentMeasuresList.begin (); - i != fSegmentMeasuresList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% <== msrSegment::browseData ()" << - endl; - } -} - -string msrSegment::asShortString () const -{ - stringstream s; - - s << - "[" << - "Segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "', voice: \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - "]"; - - return s.str (); -} - -string msrSegment::asString () const -{ - stringstream s; - - s << - "[" << - "Segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "' in voice \"" << - fSegmentVoiceUpLink->getVoiceName () << - "\""; - - if (! fSegmentMeasuresList.size ()) { - s << - " (0 measures)"; - } - else { - s << - " (" << - singularOrPlural ( - fSegmentMeasuresList.size (), "measure", " measures") << - "), i.e. ["; - - list::const_iterator - iBegin = fSegmentMeasuresList.begin (), - iEnd = fSegmentMeasuresList.end (), - i = iBegin; - - for ( ; ; ) { - s << (*i)->getMeasureElementMeasureNumber (); - if (++i == iEnd) break; - s << ", "; - } // for - - s << "]"; - } - - s << "]"; - - return s.str (); -} - -void msrSegment::displaySegment ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - "*********>> Segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - /* JMI - "', score:" << - endl << - fSegmentVoiceUpLink-> - getVoiceStaffUpLink ()-> - getStaffPartUpLink ()-> - getPartPartGroupUpLink ()-> - getPartGroupScoreUpLink () << - */ - "', voice:" << - endl << - fSegmentVoiceUpLink->getVoiceName () << - " (" << context << ")" << - ", line " << inputLineNumber << - " contains:" << - endl; - - gIndenter++; - print (gLogOstream); - gIndenter--; - - gLogOstream << - "<<*********" << - endl << - endl; -} - -void msrSegment::print (ostream& os) const -{ - os << - "Segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "', " << - singularOrPlural ( - fSegmentMeasuresList.size (), "measure", "measures") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 20; - - os << - setw (fieldWidth) << - "voiceUpLink" << " : " << - "\"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - - if (! fSegmentMeasuresList.size ()) { - os << - setw (fieldWidth) << - "segmentMeasuresList" << " : " << "none" << - endl; - } - - else { - os << endl; - - list::const_iterator - iBegin = fSegmentMeasuresList.begin (), - iEnd = fSegmentMeasuresList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - gIndenter--; -} - -void msrSegment::shortPrint (ostream& os) const -{ - os << - "Segment '" << - fSegmentAbsoluteNumber << - ", segmentDebugNumber: '" << - fSegmentDebugNumber << - "', " << - singularOrPlural ( - fSegmentMeasuresList.size (), "measure", "measures") << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 20; - - /* JMI - os << - setw (fieldWidth) << "voiceUpLink" << " : " << - "\"" << - fSegmentVoiceUpLink->getVoiceName () << - "\"" << - endl; - */ - - if (! fSegmentMeasuresList.size ()) { - os << - setw (fieldWidth) << - "segmentMeasuresList" << " : " << "none" << - endl; - } - - else { - list::const_iterator - iBegin = fSegmentMeasuresList.begin (), - iEnd = fSegmentMeasuresList.end (), - i = iBegin; - - for ( ; ; ) { - (*i)->shortPrint (os); - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSegment& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrSegments_MUT_DEP.h b/src/lilypond/msrSegments_MUT_DEP.h deleted file mode 100644 index ca4577e82..000000000 --- a/src/lilypond/msrSegments_MUT_DEP.h +++ /dev/null @@ -1,365 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrSegment : public msrVoiceElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrVoice segmentVoicekUpLink); - - SMARTP createSegmentNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createSegmentDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSegment ( - int inputLineNumber, - S_msrVoice segmentVoicekUpLink); - - virtual ~msrSegment (); - - private: - - // initialization - // ------------------------------------------------------ - - void initializeSegment (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - - S_msrVoice getSegmentVoiceUpLink () const - { return fSegmentVoiceUpLink; } - - // number - - int getSegmentAbsoluteNumber () const - { return fSegmentAbsoluteNumber; } - - // measures - - const list& - getSegmentMeasuresList () const - { return fSegmentMeasuresList; } - - list& getSegmentMeasuresListToModify () // JMI - { return fSegmentMeasuresList; } - - public: - - // public services - // ------------------------------------------------------ - - // upLinks - - S_msrPart fetchSegmentPartUpLink () const; - - // backup and padding - - void padUpToPositionInMeasureInSegment ( - int inputLineNumber, - rational wholeNotes); - - void backupByWholeNotesStepLengthInSegment ( - int inputLineNumber, - rational backupTargetMeasureElementPositionInMeasure); - - void appendPaddingNoteToSegment ( - int inputLineNumber, - rational forwardStepLength); - - // measures - - S_msrMeasure fetchLastMeasureFromSegment ( - int inputLineNumber, - string context); - - S_msrMeasure createMeasureAndAppendItToSegment ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind); - - void setNextMeasureNumberInSegment ( - int inputLineNumber, - string nextMeasureNumber); - - void appendMeasureToSegment ( - S_msrMeasure measure); - - void prependMeasureToSegment ( - S_msrMeasure measure); - - // clef, key, time - - void appendClefToSegment (S_msrClef clef); - void prependClefToSegment (S_msrClef clef); - - void appendKeyToSegment (S_msrKey key); - - void appendTimeToSegment (S_msrTime time); - void appendTimeToSegmentClone (S_msrTime time); - - // transpose - - void appendTransposeToSegment ( - S_msrTranspose transpose); - - // part name display - - void appendPartNameDisplayToSegment ( - S_msrPartNameDisplay partNameDisplay); - - // part abbreviation display - - void appendPartAbbreviationDisplayToSegment ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay); - - // staff details - - void appendStaffDetailsToSegment ( - S_msrStaffDetails staffDetails); - - // tempo - - void appendTempoToSegment (S_msrTempo tempo); - - // rehearsals - - void appendRehearsalToSegment ( - S_msrRehearsal rehearsal); - - // octave shifts - - void appendOctaveShiftToSegment ( - S_msrOctaveShift octaveShift); - - // scordaturas - - void appendScordaturaToSegment ( - S_msrScordatura scordatura); - - // accordion registration - - void appendAccordionRegistrationToSegment ( - S_msrAccordionRegistration - accordionRegistration); - - // harp pedals tuning - - void appendHarpPedalsTuningToSegment ( - S_msrHarpPedalsTuning - harpPedalsTuning); - - // harmonies - - void appendHarmonyToSegment ( - S_msrHarmony harmony); - - void appendHarmonyToSegmentClone ( - S_msrHarmony harmony); - - // frames - - void appendFrameToSegment ( - S_msrFrame frame); - - void appendFrameToSegmentClone ( - S_msrFrame frame); - - // figured bass - - void appendFiguredBassToSegment ( - S_msrFiguredBass figuredBass); - - void appendFiguredBassToSegmentClone ( - S_msrFiguredBass figuredBass); - - // staff change - - void appendVoiceStaffChangeToSegment ( - S_msrVoiceStaffChange voiceStaffChange); - - // notes - - void appendNoteToSegment ( - S_msrNote note, - rational partCurrentPositionInMeasure); - - void appendNoteToSegmentClone (S_msrNote note); - - // tremolos - - void appendDoubleTremoloToSegment ( - S_msrDoubleTremolo doubleTremolo); - - // chords - - void appendChordToSegment (S_msrChord chord); - - // tuplets - - void appendTupletToSegment (S_msrTuplet tuplet); - - // bar lines - - void appendBarlineToSegment ( - S_msrBarline barline); - - void prependBarlineToSegment ( - S_msrBarline barline); - - // bar checks - - void appendBarCheckToSegment ( - S_msrBarCheck barCheck); - - // bar number checks - - void appendBarNumberCheckToSegment ( - S_msrBarNumberCheck barNumberCheck); - - // breaks - - void appendLineBreakToSegment (S_msrLineBreak lineBreak); - void appendPageBreakToSegment (S_msrPageBreak pageBreak); - - // segno - - void appendSegnoToSegment (S_msrSegno segno); - - // coda - - void appendCodaToSegment (S_msrCoda coda); - - // eyeglasses - - void appendEyeGlassesToSegment ( - S_msrEyeGlasses eyeGlasses); - - // pedal - - void appendPedalToSegment (S_msrPedal pedal); - - // damp - - void appendDampToSegment (S_msrDamp damp); - - // damp all - - void appendDampAllToSegment (S_msrDampAll dampAll); - - // grace notes - - /* JMI - void addGraceNotesGroupAheadOfSegmentIfNeeded ( - S_msrGraceNotesGroup graceNotesGroup); - - void appendGraceNotesToSegment ( - S_msrGraceNotes graceNotes); - - void appendAfterGraceNotesToSegment ( - S_msrAfterGraceNotes afterGraceNotes); - - void prependAfterGraceNotesToSegment ( - S_msrAfterGraceNotes afterGraceNotes); - */ - - // other elements - - void prependOtherElementToSegment ( - S_msrMeasureElement elem); - void appendOtherElementToSegment ( - S_msrMeasureElement elem); - - // removing elements - - void removeNoteFromSegment ( - int inputLineNumber, - S_msrNote note); - - void removeElementFromSegment ( - int inputLineNumber, - S_msrElement element); - - S_msrMeasure removeLastMeasureFromSegment ( - int inputLineNumber, - string context); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortString () const; - string asString () const; - - void displaySegment ( - int inputLineNumber, - string context); - - virtual void print (ostream& os) const; - - virtual void shortPrint (ostream& os) const; - - private: - - // private services - // ------------------------------------------------------ - - // necessary due to the complexity of repeats management - void assertSegmentMeasuresListIsNotEmpty ( - int inputLineNumber) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fSegmentVoiceUpLink; - - // counter - static int gSegmentsCounter; - - // absolute number, shared by newborn clones and deep copies - int fSegmentAbsoluteNumber; - - // the measures in the segment contain the mmusic - list fSegmentMeasuresList; - - // debug number, unique for every msrSegment instance - static int gSegmentDebugNumber; - int fSegmentDebugNumber; -}; -typedef SMARTP S_msrSegment; -EXP ostream& operator<< (ostream& os, const S_msrSegment& elt); - diff --git a/src/lilypond/msrSingleTremolos.cpp b/src/lilypond/msrSingleTremolos.cpp deleted file mode 100644 index 7a515b336..000000000 --- a/src/lilypond/msrSingleTremolos.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrSingleTremolos.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrSingleTremolo msrSingleTremolo::create ( - int inputLineNumber, - int singleTremoloMarksNumber, - msrPlacementKind singleTremoloPlacementKind) -{ - msrSingleTremolo* o = - new msrSingleTremolo ( - inputLineNumber, - singleTremoloMarksNumber, singleTremoloPlacementKind); - assert (o!=0); - return o; -} - -msrSingleTremolo::msrSingleTremolo ( - int inputLineNumber, - int singleTremoloMarksNumber, - msrPlacementKind singleTremoloPlacementKind) - : msrElement (inputLineNumber) -{ - fSingleTremoloMarksNumber = singleTremoloMarksNumber; - fSingleTremoloPlacementKind = singleTremoloPlacementKind; -} - -msrSingleTremolo::~msrSingleTremolo () -{} - -string msrSingleTremolo::singleTremoloPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fSingleTremoloPlacementKind); -} - -void msrSingleTremolo::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSingleTremolo::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSingleTremolo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSingleTremolo::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSingleTremolo::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSingleTremolo::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSingleTremolo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSingleTremolo::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrSingleTremolo::browseData (basevisitor* v) -{} - -string msrSingleTremolo::asString () const -{ - stringstream s; - - s << - "SingleTremolo" << - ", line " << fInputLineNumber << - ", " << fSingleTremoloMarksNumber << " marks" << - ", placement" << " = " << singleTremoloPlacementKindAsString (); - - return s.str (); -} - -void msrSingleTremolo::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrSingleTremolo& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrSingleTremolos.h b/src/lilypond/msrSingleTremolos.h deleted file mode 100644 index ded1e7563..000000000 --- a/src/lilypond/msrSingleTremolos.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTremolos___ -#define ___msrTremolos___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrSingleTremolo : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int singleTremoloMarksNumber, - msrPlacementKind singleTremoloPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSingleTremolo ( - int inputLineNumber, - int singleTremoloMarksNumber, - msrPlacementKind singleTremoloPlacementKind); - - virtual ~msrSingleTremolo (); - - public: - - // set and get - // ------------------------------------------------------ - - void setSingleTremoloPlacementKind ( - msrPlacementKind - SingleTremoloPlacementKind) - { - fSingleTremoloPlacementKind = - SingleTremoloPlacementKind; - } - - int getSingleTremoloMarksNumber () const - { return fSingleTremoloMarksNumber; } - - msrPlacementKind getSingleTremoloPlacementKind () const - { return fSingleTremoloPlacementKind; } - - void setSingleTremoloGraphicDurationKind ( - msrDurationKind durationKind) - { - fSingleTremoloGraphicDurationKind = - durationKind; - } - - msrDurationKind getSingleTremoloGraphicDurationKind () const - { - return fSingleTremoloGraphicDurationKind; - } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string singleTremoloPlacementKindAsString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fSingleTremoloMarksNumber; - - msrPlacementKind fSingleTremoloPlacementKind; - - msrDurationKind fSingleTremoloGraphicDurationKind; -}; -typedef SMARTP S_msrSingleTremolo; -EXP ostream& operator<< (ostream& os, const S_msrSingleTremolo& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrSlashes.cpp b/src/lilypond/msrSlashes.cpp deleted file mode 100644 index 01077b225..000000000 --- a/src/lilypond/msrSlashes.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrSlashes.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrSlash msrSlash::create ( - int inputLineNumber, - msrSlashTypeKind slashTypeKind, - msrUseDotsKind useDotsKind, - msrSlashUseStemsKind slashUseStemsKind) -{ - msrSlash* o = - new msrSlash ( - inputLineNumber, - slashTypeKind, - useDotsKind, - slashUseStemsKind); - assert(o!=0); - return o; -} - -msrSlash::msrSlash ( - int inputLineNumber, - msrSlashTypeKind slashTypeKind, - msrUseDotsKind useDotsKind, - msrSlashUseStemsKind slashUseStemsKind) - : msrElement (inputLineNumber) -{ - fSlashTypeKind = slashTypeKind; - fUseDotsKind = useDotsKind; - fSlashUseStemsKind = slashUseStemsKind; -} - -msrSlash::~msrSlash () -{} - -void msrSlash::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSlash::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSlash elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSlash::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSlash::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSlash::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSlash elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSlash::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrSlash::browseData (basevisitor* v) -{} - -string msrSlash::asString () const -{ - stringstream s; - - s << - "Slash" << - ", line " << fInputLineNumber << - ", slashTypeKind:" << - msrSlashTypeKindAsString ( - fSlashTypeKind) << - ", useDotsKind:" << - msrUseDotsKindAsString ( - fUseDotsKind) << - ", slashUseStemsKind:" << - msrSlashUseStemsKindAsString ( - fSlashUseStemsKind); - - return s.str (); -} - -void msrSlash::print (ostream& os) const -{ - os << - "Slash" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 18; - - // print the voice upLink - os << left << - setw (fieldWidth) << - "slashTypeKind" << " : " << - msrSlashTypeKindAsString ( - fSlashTypeKind) << - endl << - setw (fieldWidth) << - "useDotsKind" << " : " << - msrUseDotsKindAsString ( - fUseDotsKind) << - endl << - setw (fieldWidth) << - "slashUseStemsKind" << " : " << - msrSlashUseStemsKindAsString ( - fSlashUseStemsKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSlash& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrSlashes.h b/src/lilypond/msrSlashes.h deleted file mode 100644 index df9215c25..000000000 --- a/src/lilypond/msrSlashes.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrSlashes___ -#define ___msrSlashes___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrSlash : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrSlashTypeKind slashTypeKind, - msrUseDotsKind useDotsKind, - msrSlashUseStemsKind slashUseStemsKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSlash ( - int inputLineNumber, - msrSlashTypeKind slashTypeKind, - msrUseDotsKind useDotsKind, - msrSlashUseStemsKind slashUseStemsKind); - - virtual ~msrSlash (); - - public: - - // set and get - // ------------------------------------------------------ - - msrSlashTypeKind getSlashTypeKind () const - { return fSlashTypeKind; } - - msrUseDotsKind getUseDotsKind () const - { return fUseDotsKind; } - - msrSlashUseStemsKind getSlashUseStemsKind () const - { return fSlashUseStemsKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrSlashTypeKind fSlashTypeKind; - msrUseDotsKind fUseDotsKind; - msrSlashUseStemsKind fSlashUseStemsKind; -}; -typedef SMARTP S_msrSlash; -EXP ostream& operator<< (ostream& os, const S_msrSlash& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrSlides.cpp b/src/lilypond/msrSlides.cpp deleted file mode 100644 index f7abb1976..000000000 --- a/src/lilypond/msrSlides.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrSlide msrSlide::create ( - int inputLineNumber, - int slideNumber, - msrSlideTypeKind slideTypeKind, - msrLineTypeKind slideLineTypeKind, - string slideTextValue) -{ - msrSlide* o = - new msrSlide ( - inputLineNumber, - slideNumber, - slideTypeKind, - slideLineTypeKind, - slideTextValue); - assert(o!=0); - return o; -} - -msrSlide::msrSlide ( - int inputLineNumber, - int slideNumber, - msrSlideTypeKind slideTypeKind, - msrLineTypeKind slideLineTypeKind, - string slideTextValue) - : msrElement (inputLineNumber) -{ - fSlideNumber = slideNumber; - - fSlideTypeKind = slideTypeKind; - fSlideLineTypeKind = slideLineTypeKind; - - fSlideTextValue = slideTextValue; -} - -msrSlide::~msrSlide () -{} - -S_msrSlide msrSlide::createSlideNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlides) { - gLogOstream << - "Creating a newborn clone of slide '" << - asString () << - "'" << - endl; - } -#endif - - S_msrSlide - newbornClone = - msrSlide::create ( - fInputLineNumber, - fSlideNumber, - fSlideTypeKind, - fSlideLineTypeKind, - fSlideTextValue); - - return newbornClone; -} - -string msrSlide::slideTypeKindAsString ( - msrSlideTypeKind slideTypeKind) -{ - string result; - - switch (slideTypeKind) { - case msrSlide::kSlideTypeNone: - result = "slideTypeNone"; - break; - case msrSlide::kSlideTypeStart: - result = "slideTypeStart"; - break; - case msrSlide::kSlideTypeStop: - result = "slideTypeStop"; - break; - } // switch - - return result; -} - -void msrSlide::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSlide::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSlide elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSlide::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSlide::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSlide::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSlide elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSlide::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrSlide::browseData (basevisitor* v) -{} - -string msrSlide::asString () const -{ - stringstream s; - - s << - "Slide" << - ", fSlideNumber " << fSlideNumber << - ", " << slideTypeKindAsString ( - fSlideTypeKind) << - ", " << msrLineTypeKindAsString ( - fSlideLineTypeKind) << - ", \"" << fSlideTextValue << - "\", line " << fInputLineNumber; - - return s.str (); -} - -void msrSlide::print (ostream& os) const -{ - os << - "Slide" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 22; - - os << left << - setw (fieldWidth) << - "slideNumber " << - fSlideNumber << - endl << - setw (fieldWidth) << - "slideTypeKind" << - slideTypeKindAsString ( - fSlideTypeKind) << - endl << - setw (fieldWidth) << - "slideLineTypeKind" << - msrLineTypeKindAsString ( - fSlideLineTypeKind) << - endl << - setw (fieldWidth) << - "slideTextValue" << " : \"" << - fSlideTextValue << - "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSlide& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrSlides_MUT_DEP.h b/src/lilypond/msrSlides_MUT_DEP.h deleted file mode 100644 index eb1e82808..000000000 --- a/src/lilypond/msrSlides_MUT_DEP.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrSlide : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrSlideTypeKind { - kSlideTypeNone, - kSlideTypeStart, kSlideTypeStop }; - - static string slideTypeKindAsString ( - msrSlideTypeKind slideTypeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int slideNumber, - msrSlideTypeKind slideTypeKind, - msrLineTypeKind slideLineTypeKind, - string slideTextValue); - - SMARTP createSlideNewbornClone (); - - SMARTP createSlideDeepCopy (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSlide ( - int inputLineNumber, - int slideNumber, - msrSlideTypeKind slideTypeKind, - msrLineTypeKind slideLineTypeKind, - string slideTextValue); - - virtual ~msrSlide (); - - public: - - // set and get - // ------------------------------------------------------ - - int getSlideNumber () const - { return fSlideNumber; } - - msrSlideTypeKind getSlideTypeKind () const - { return fSlideTypeKind; } - - msrLineTypeKind getSlideLineTypeKind () const - { return fSlideLineTypeKind; } - - string getSlideTextValue () const - { return fSlideTextValue; } - - // measure upLink - void setSlideMeasureUpLink ( - const S_msrMeasure& measure) - { fSlideMeasureUpLink = measure; } - - S_msrMeasure getSlideMeasureUpLink () const - { return fSlideMeasureUpLink; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLink - S_msrMeasure fSlideMeasureUpLink; - - int fSlideNumber; - - msrSlideTypeKind fSlideTypeKind; - - msrLineTypeKind fSlideLineTypeKind; - - string fSlideTextValue; -}; -typedef SMARTP S_msrSlide; -EXP ostream& operator<< (ostream& os, const S_msrSlide& elt); - diff --git a/src/lilypond/msrSlurs.cpp b/src/lilypond/msrSlurs.cpp deleted file mode 100644 index 53b12e014..000000000 --- a/src/lilypond/msrSlurs.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrSlurs.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrSlur msrSlur::create ( - int inputLineNumber, - int slurNumber, - msrSlurTypeKind slurTypeKind, - msrLineTypeKind slurLineTypeKind) -{ - msrSlur* o = - new msrSlur ( - inputLineNumber, slurNumber, slurTypeKind, slurLineTypeKind); - assert(o!=0); - return o; -} - -msrSlur::msrSlur ( - int inputLineNumber, - int slurNumber, - msrSlurTypeKind slurTypeKind, - msrLineTypeKind slurLineTypeKind) - : msrElement (inputLineNumber) -{ - fSlurNumber = slurNumber; - fSlurTypeKind = slurTypeKind; - fSlurLineTypeKind = slurLineTypeKind; -} - -msrSlur::~msrSlur () -{} - -void msrSlur::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSlur::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSlur elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSlur::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSlur::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSlur::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSlur elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSlur::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - - -void msrSlur::browseData (basevisitor* v) -{} - -string msrSlur::slurTypeKindAsString ( - msrSlurTypeKind slurTypeKind) -{ - stringstream s; - - switch (slurTypeKind) { - case msrSlur::kRegularSlurStart: - s << "regularSlurStart"; - break; - case msrSlur::kPhrasingSlurStart: - s << "phrasingSlurStart"; - break; - case msrSlur::kSlurContinue: - s << "slurContinue"; - break; - case msrSlur::kRegularSlurStop: - s << "regularSlurStop"; - break; - case msrSlur::kPhrasingSlurStop: - s << "phrasingSlurStop"; - break; - case msrSlur::k_NoSlur: - s << "Slur" << slurTypeKind << "???"; - } // switch - - return s.str (); -} - -string msrSlur::slurTypeKindAsString () const -{ - return slurTypeKindAsString (fSlurTypeKind); -} - -string msrSlur::asString () const -{ - stringstream s; - - s << - "Slur" " " << slurTypeKindAsString () << - ", slurLineTypeKind = " << - msrLineTypeKindAsString ( - fSlurLineTypeKind) << - ", slurNumber = " << fSlurNumber << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrSlur::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrSlur& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrSlurs.h b/src/lilypond/msrSlurs.h deleted file mode 100644 index ebf862640..000000000 --- a/src/lilypond/msrSlurs.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrSlurs___ -#define ___msrSlurs___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrSlur : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrSlurTypeKind { - k_NoSlur, - kRegularSlurStart, kPhrasingSlurStart, - kSlurContinue, - kRegularSlurStop, kPhrasingSlurStop}; - - static string slurTypeKindAsString ( - msrSlurTypeKind slurKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int slurNumber, - msrSlurTypeKind slurKind, - msrLineTypeKind slurLineTypeKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSlur ( - int inputLineNumber, - int slurNumber, - msrSlurTypeKind slurKind, - msrLineTypeKind slurLineTypeKind); - - virtual ~msrSlur (); - - public: - - // set and get - // ------------------------------------------------------ - - int getSlurNumber () const - { return fSlurNumber; } - - void setSlurTypeKind (msrSlurTypeKind slurTypeKind) - { fSlurTypeKind = slurTypeKind; } - - msrSlurTypeKind getSlurTypeKind () const - { return fSlurTypeKind; } - - msrLineTypeKind getSlurLineTypeKind () const - { return fSlurLineTypeKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string slurTypeKindAsString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fSlurNumber; - - msrSlurTypeKind fSlurTypeKind; - - msrLineTypeKind fSlurLineTypeKind; -}; -typedef SMARTP S_msrSlur; -EXP ostream& operator<< (ostream& os, const S_msrSlur& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrSpanners.cpp b/src/lilypond/msrSpanners.cpp deleted file mode 100644 index a751110a9..000000000 --- a/src/lilypond/msrSpanners.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrSpanner msrSpanner::create ( - int inputLineNumber, - int spannerNumber, - msrSpannerKind spannerKind, - msrSpannerTypeKind spannerTypeKind, - msrPlacementKind spannerPlacementKind, - S_msrNote spannerNoteUpLink) -{ - msrSpanner* o = - new msrSpanner ( - inputLineNumber, - spannerNumber, - spannerKind, - spannerTypeKind, - spannerPlacementKind, - spannerNoteUpLink); - assert (o!=0); - return o; -} - -msrSpanner::msrSpanner ( - int inputLineNumber, - int spannerNumber, - msrSpannerKind spannerKind, - msrSpannerTypeKind spannerTypeKind, - msrPlacementKind spannerPlacementKind, - S_msrNote spannerNoteUpLink) - : msrElement (inputLineNumber) -{ - fSpannerNoteUpLink = spannerNoteUpLink; - - fSpannerNumber = spannerNumber; - - fSpannerKind = spannerKind; - - fSpannerTypeKind = spannerTypeKind; - - fSpannerPlacementKind = spannerPlacementKind; -} - -msrSpanner::~msrSpanner () -{} - -void msrSpanner::setSpannerOtherEndSideLink ( - S_msrSpanner otherEndSideLink) -{ - // sanity check - msrAssert ( - otherEndSideLink != nullptr, - "otherEndSideLink is null"); - - // set the two-way sideLink between both ends of the spanner - fSpannerOtherEndSideLink = - otherEndSideLink; - - otherEndSideLink->fSpannerOtherEndSideLink = - this; -} - -void msrSpanner::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSpanner::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSpanner elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSpanner::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSpanner::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSpanner::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSpanner elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSpanner::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrSpanner::browseData (basevisitor* v) -{} - -string msrSpanner::spannerKindAsString ( - msrSpannerKind spannerKind) -{ - string result; - - switch (spannerKind) { - case msrSpanner::kSpannerDashes: - result = "spannerDashes"; - break; - case msrSpanner::kSpannerWavyLine: - result = "spannerWavyLine"; - break; - } // switch - - return result; -} - -string msrSpanner::spannerTypeKindAsString () const -{ - return - msrSpannerTypeKindAsString ( - fSpannerTypeKind); -} - -string msrSpanner::spannerKindAsString () const -{ - return - spannerKindAsString ( - fSpannerKind); -} - -string msrSpanner::spannerPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fSpannerPlacementKind); -} - -string msrSpanner::asShortString () const -{ - stringstream s; - - s << - "Spanner" << - ", spannerNumber = " << fSpannerNumber << - ", " << spannerKindAsString () << - ", line " << fInputLineNumber << - ", spannerPlacementKind" << " : " << - spannerPlacementKindAsString () << - ", spannerTypeKind" << " : " << - spannerTypeKindAsString (); - - return s.str (); -} - -void msrSpanner::print (ostream& os) const -{ - os << - "Spanner" << - ", spannerNumber = " << fSpannerNumber << - ", " << spannerKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 24; - - os << left << - setw (fieldWidth) << - "spannerPlacementKind" << " : " << - spannerPlacementKindAsString () << - endl << - setw (fieldWidth) << - "spannerTypeKind" << " : " << - spannerTypeKindAsString () << - endl << - setw (fieldWidth) << - "spannerNoteUpLink" << " : " << - endl; - - gIndenter++; - os << - fSpannerNoteUpLink->asString () << - endl; - gIndenter--; - - os << left << - setw (fieldWidth) << - "spannerOtherEndSideLink"; - if (fSpannerOtherEndSideLink) { - os << - endl << - fSpannerOtherEndSideLink->asShortString (); - } - else { - os << - " : " << "***none***" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSpanner& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrSpanners_MUT_DEP.h b/src/lilypond/msrSpanners_MUT_DEP.h deleted file mode 100644 index ecc95a546..000000000 --- a/src/lilypond/msrSpanners_MUT_DEP.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -// pre-declaration for two-way sideLinks -class msrSpanner; -typedef SMARTP S_msrSpanner; - -class msrSpanner : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrSpannerKind { - kSpannerDashes, kSpannerWavyLine }; - - static string spannerKindAsString ( - msrSpannerKind spannerKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int spannerNumber, - msrSpannerKind spannerKind, - msrSpannerTypeKind spannerTypeKind, - msrPlacementKind spannerPlacementKind, - S_msrNote spannerNoteUpLink); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSpanner ( - int inputLineNumber, - int spannerNumber, - msrSpannerKind spannerKind, - msrSpannerTypeKind spannerTypeKind, - msrPlacementKind spannerPlacementKind, - S_msrNote spannerNoteUpLink); - - virtual ~msrSpanner (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - void setSpannerNoteUpLink ( - S_msrNote spannerNoteUpLink) - { fSpannerNoteUpLink = spannerNoteUpLink; } - - S_msrNote getSpannerNoteUpLink () const - { return fSpannerNoteUpLink; } - - // sideLinks - void setSpannerOtherEndSideLink ( - S_msrSpanner otherEndSideLink); - - S_msrSpanner getSpannerOtherEndSideLink () const - { return fSpannerOtherEndSideLink; } - - int getSpannerNumber () const - { return fSpannerNumber; } - - msrSpannerKind getSpannerKind () const - { return fSpannerKind; } - - msrSpannerTypeKind getSpannerTypeKind () const - { return fSpannerTypeKind; } - - msrPlacementKind getSpannerPlacementKind () const - { return fSpannerPlacementKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string spannerKindAsString () const; - - string spannerTypeKindAsString () const; - - string spannerPlacementKindAsString () const; - - string asShortString () const; - - virtual void print (ostream& os) const; - - protected: - - // upLinks - // ------------------------------------------------------ - S_msrNote fSpannerNoteUpLink; - - // sideLinks - // ------------------------------------------------------ - S_msrSpanner fSpannerOtherEndSideLink; // two-way - - // fields - // ------------------------------------------------------ - - int fSpannerNumber; - - msrSpannerKind fSpannerKind; - - msrSpannerTypeKind fSpannerTypeKind; - - msrPlacementKind fSpannerPlacementKind; -}; -typedef SMARTP S_msrSpanner; -EXP ostream& operator<< (ostream& os, const S_msrSpanner& elt); - diff --git a/src/lilypond/msrStanzas.cpp b/src/lilypond/msrStanzas.cpp deleted file mode 100644 index 8077b9aec..000000000 --- a/src/lilypond/msrStanzas.cpp +++ /dev/null @@ -1,627 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrStanza msrStanza::create ( - int inputLineNumber, - string stanzaNumber, - S_msrVoice stanzaVoiceUpLink) -{ - msrStanza* o = - new msrStanza ( - inputLineNumber, - stanzaNumber, - stanzaVoiceUpLink); - assert(o!=0); - - return o; -} - -msrStanza::msrStanza ( - int inputLineNumber, - string stanzaNumber, - S_msrVoice stanzaVoiceUpLink) - : msrElement (inputLineNumber) -{ - // set stanza number and kind - fStanzaNumber = stanzaNumber; - - // sanity check - msrAssert( - stanzaVoiceUpLink != nullptr, - "stanzaVoiceUpLink is null"); - - // set stanza's voice upLink - fStanzaVoiceUpLink = - stanzaVoiceUpLink; - - // do other initializations - initializeStanza (); -} - -void msrStanza::initializeStanza () -{ - fStanzaName = - fStanzaVoiceUpLink->getVoiceName () + - "_Stanza_" + - stringNumbersToEnglishWords ( - makeSingleWordFromString ( - fStanzaNumber)); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Initializing stanza " << getStanzaName () << - endl; - } -#endif - - fStanzaTextPresent = false; - - fStanzaCurrentMeasureWholeNotesDuration = rational (0, 1); -} - -msrStanza::~msrStanza () -{} - -S_msrStanza msrStanza::createStanzaNewbornClone ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Creating a newborn clone of stanza \"" << - getStanzaName () << - "\" in voice \"" << - containingVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrStanza - newbornClone = - msrStanza::create ( - fInputLineNumber, - fStanzaNumber, - containingVoice); - - // number - - // kind - - // name - newbornClone->fStanzaName = - fStanzaName; - - // contents - newbornClone->fStanzaTextPresent = - fStanzaTextPresent; - - // upLinks - newbornClone->fStanzaVoiceUpLink = - containingVoice; - - return newbornClone; -} - -S_msrStanza msrStanza::createStanzaDeepCopy ( - S_msrVoice containingVoice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Creating a deep copy of stanza \"" << - getStanzaName () << - "\" in voice \"" << - containingVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert( - containingVoice != nullptr, - "containingVoice is null"); - - S_msrStanza - stanzaDeepCopy = - msrStanza::create ( - fInputLineNumber, - fStanzaNumber, - containingVoice); - - // number - - // kind - - // name - stanzaDeepCopy->fStanzaName = - fStanzaName; - - // contents - int n = fSyllables.size (); - for (int i = 0; i < n; i++) { - stanzaDeepCopy->fSyllables.push_back ( - fSyllables [i]-> - createSyllableDeepCopy ( - containingVoice-> - fetchVoicePartUpLink ())); - } // for - - stanzaDeepCopy->fStanzaTextPresent = - fStanzaTextPresent; - - // upLinks - stanzaDeepCopy->fStanzaVoiceUpLink = - containingVoice; - - return stanzaDeepCopy; -} - -void msrStanza::appendSyllableToStanza ( - S_msrSyllable syllable) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending syllable '" << syllable->asString () << - "' to stanza " << getStanzaName () << - endl; - } -#endif - - // append the syllable to this stanza - fSyllables.push_back (syllable); - - // does this stanza contain text? - switch (syllable->getSyllableKind ()) { - - case msrSyllable::kSyllableSingle: - case msrSyllable::kSyllableBegin: - case msrSyllable::kSyllableMiddle: - case msrSyllable::kSyllableEnd: - // only now, in case addSyllableToStanza () is called - // from LPSR for example - fStanzaTextPresent = true; - break; - - case msrSyllable::kSyllableOnRestNote: - case msrSyllable::kSyllableSkipRestNote: - case msrSyllable::kSyllableSkipNonRestNote: - case msrSyllable::kSyllableMeasureEnd: - case msrSyllable::kSyllableLineBreak: - case msrSyllable::kSyllablePageBreak: - break; - - case msrSyllable::kSyllableNone: - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "syllable type has not been set"); - break; - } // switch - -/* JMI - // get the syllable's sounding whole notes - rational - syllableSoundingWholeNotes = - syllable-> - getSyllableNoteUpLink ()-> - getNoteSoundingWholeNotes (); - - // update the stanza's current measure whole notes - fStanzaCurrentMeasureWholeNotesDuration +=syllableSoundingWholeNotes; - */ -} - -S_msrSyllable msrStanza::appendRestSyllableToStanza ( - int inputLineNumber, - rational wholeNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending 'Rest' syllable" << - " to stanza " << getStanzaName () << - ", whole notes = " << wholeNotes << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create stanza rest syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - msrSyllable::kSyllableSkipRestNote, - msrSyllable::kSyllableExtendNone, - wholeNotes, - msrTupletFactor (), - this); - - // append syllable to this stanza - appendSyllableToStanza (syllable); - - gIndenter--; - - // and return it - return syllable; -} - -S_msrSyllable msrStanza::appendSkipSyllableToStanza ( - int inputLineNumber, - rational wholeNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending 'Skip' syllable " << - " to stanza " << getStanzaName () << - ", whole notes = " << wholeNotes << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create stanza skip syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - msrSyllable::kSyllableSkipRestNote, - msrSyllable::kSyllableExtendNone, - wholeNotes, - msrTupletFactor (), - this); - - // append syllable to this stanza - appendSyllableToStanza (syllable); - - gIndenter--; - - // and return it - return syllable; -} - -S_msrSyllable msrStanza::appendMeasureEndSyllableToStanza ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending 'Measure end' syllable " << - " to stanza " << getStanzaName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create stanza skip syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - msrSyllable::kSyllableMeasureEnd, - msrSyllable::kSyllableExtendNone, - 0, // wholeNotes - msrTupletFactor (), - this); - - // append syllable to this stanza - appendSyllableToStanza (syllable); - - // reset current measure whole notes - fStanzaCurrentMeasureWholeNotesDuration = rational (0, 1); - - gIndenter--; - - // and return it - return syllable; -} - -S_msrSyllable msrStanza::appendMelismaSyllableToStanza ( - int inputLineNumber, - msrSyllable::msrSyllableKind - syllableKind, - rational wholeNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending '" << - msrSyllable::syllableKindAsString (syllableKind) << - "' syllable" << - " to stanza " << getStanzaName () << - ", whole notes = " << wholeNotes << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create stanza melisma syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - syllableKind, - msrSyllable::kSyllableExtendNone, - wholeNotes, - msrTupletFactor (), - this); - - // append syllable to this stanza - appendSyllableToStanza (syllable); - - gIndenter--; - - // and return it - return syllable; -} - -S_msrSyllable msrStanza::appendLineBreakSyllableToStanza ( - int inputLineNumber, - int nextMeasurePuristNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending a 'LineBreak' syllable" << - " to stanza " << getStanzaName () << - ", nextMeasurePuristNumber: " << nextMeasurePuristNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create line break syllable - S_msrSyllable - syllable = - msrSyllable::createWithNextMeasurePuristNumber ( - inputLineNumber, - msrSyllable::kSyllableLineBreak, - msrSyllable::kSyllableExtendNone, - 0, // whole notes - msrTupletFactor (), - this, - nextMeasurePuristNumber); - - // append syllable to this stanza - appendSyllableToStanza (syllable); - - gIndenter--; - - // and return it - return syllable; -} - -S_msrSyllable msrStanza::appendPageBreakSyllableToStanza ( - int inputLineNumber, - int nextMeasurePuristNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending a 'PageBreak' syllable" << - " to stanza " << getStanzaName () << - ", nextMeasurePuristNumber: " << nextMeasurePuristNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create page break syllable - S_msrSyllable - syllable = - msrSyllable::createWithNextMeasurePuristNumber ( - inputLineNumber, - msrSyllable::kSyllablePageBreak, - msrSyllable::kSyllableExtendNone, - 0, // whole notes - msrTupletFactor (), - this, - nextMeasurePuristNumber); - - // append syllable to this stanza - appendSyllableToStanza (syllable); - - gIndenter--; - - // and return it - return syllable; -} - -void msrStanza::padUpToCurrentMeasureWholeNotesDurationInStanza ( - int inputLineNumber, - rational wholeNotes) -{ - // JMI ??? -} - -void msrStanza::appendPaddingNoteToStanza ( - int inputLineNumber, - rational forwardStepLength) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending padding note" << - ", forwardStepLength: " << - forwardStepLength << - ", to stanza \"" << - fStanzaName << - "\" in voice \"" << - fStanzaVoiceUpLink->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // JMI TO DO ??? - - gIndenter--; -} - -void msrStanza::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStanza::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStanza elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStanza::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrStanza::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStanza::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStanza elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStanza::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrStanza::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStanza::browseData ()" << - endl; - } - - gIndenter++; - - // browse the syllables - int n = fSyllables.size (); - for (int i = 0; i < n; i++) { - // browse the syllable - msrBrowser browser (v); - browser.browse (*fSyllables [i]); - } // for - - gIndenter--; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% <== msrStanza::browseData ()" << - endl; - } -} - -void msrStanza::print (ostream& os) const -{ - os << - "Stanza " << getStanzaName () << - " (number \"" << - fStanzaNumber << - "\", " << - fSyllables.size () << " syllables)" << - endl; - - gIndenter++; - - if (! fStanzaTextPresent) { - os << - "(No actual text)" << - endl; - } - - else { - if (fSyllables.size ()) { - vector::const_iterator - iBegin = fSyllables.begin (), - iEnd = fSyllables.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here - } // for - } - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrStanza& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrStanzas_MUT_DEP.h b/src/lilypond/msrStanzas_MUT_DEP.h deleted file mode 100644 index 4fa6f4824..000000000 --- a/src/lilypond/msrStanzas_MUT_DEP.h +++ /dev/null @@ -1,192 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrStanza : public msrElement -{ - public: - - // constants - // ------------------------------------------------------ - - #define K_NO_STANZA_NUMBER "-1" - #define K_NO_STANZA_NAME "Unknown stanza" - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string stanzaNumber, - S_msrVoice stanzaVoiceUpLink); - - SMARTP createStanzaNewbornClone ( - S_msrVoice containingVoice); - - SMARTP createStanzaDeepCopy ( - S_msrVoice containingVoice); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrStanza ( - int inputLineNumber, - string stanzaNumber, - S_msrVoice stanzaVoiceUpLink); - - public: - - virtual ~msrStanza (); - - private: - - // initialization - // ------------------------------------------------------ - - void initializeStanza (); - - public: - - // set and get - // ------------------------------------------------------ - - // number - string getStanzaNumber () const - { return fStanzaNumber; } - - // name - string getStanzaName () const - { return fStanzaName; } - - // contents - const vector& - getSyllables () const - { return fSyllables; } - - void setStanzaTextPresent () - { fStanzaTextPresent = true; } - - bool getStanzaTextPresent () const - { return fStanzaTextPresent; } - - // upLinks - S_msrVoice getStanzaVoiceUpLink () const - { return fStanzaVoiceUpLink; } - - // services - // ------------------------------------------------------ - - void appendSyllableToStanza ( - S_msrSyllable syllable); - - S_msrSyllable appendRestSyllableToStanza ( - int inputLineNumber, - rational wholeNotes); - - S_msrSyllable appendSkipSyllableToStanza ( - int inputLineNumber, - rational wholeNotes); - - S_msrSyllable appendMeasureEndSyllableToStanza ( - int inputLineNumber); - - S_msrSyllable appendMelismaSyllableToStanza ( - int inputLineNumber, - msrSyllable::msrSyllableKind - syllableKind, - rational wholeNote); - -/* JMI - S_msrSyllable appendTiedSyllableToStanza ( - int inputLineNumber, - rational wholeNotes); - - S_msrSyllable appendSlurSyllableToStanza ( - int inputLineNumber, - rational wholeNotes); - - S_msrSyllable appendSlurBeyondEndSyllableToStanza ( - int inputLineNumber, - rational wholeNotes); - - S_msrSyllable appendLigatureSyllableToStanza ( - int inputLineNumber, - rational wholeNotes); - - S_msrSyllable appendLigatureBeyondEndSyllableToStanza ( - int inputLineNumber, - rational wholeNotes); - - S_msrSyllable appendBarNumberCheckSyllableToStanza ( - int inputLineNumber, - string nextMeasureNumber); - - S_msrSyllable appendBarcheckSyllableToStanza ( - int inputLineNumber, - string nextMeasureNumber); -*/ - - S_msrSyllable appendLineBreakSyllableToStanza ( - int inputLineNumber, - int nextMeasurePuristNumber); - - S_msrSyllable appendPageBreakSyllableToStanza ( - int inputLineNumber, - int nextMeasurePuristNumber); - - void padUpToCurrentMeasureWholeNotesDurationInStanza ( // JMI - int inputLineNumber, - rational wholeNotes); - - void appendPaddingNoteToStanza ( - int inputLineNumber, - rational forwardStepLength); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrVoice fStanzaVoiceUpLink; - - // number - // The lyric number indicates multiple lines, - // though a name can be used as well (as in Finale's verse/chorus/section specification) - string fStanzaNumber; - - // name - string fStanzaName; - - // contents - vector fSyllables; - - bool fStanzaTextPresent; - - // current measure whole notes - rational fStanzaCurrentMeasureWholeNotesDuration; -}; -typedef SMARTP S_msrStanza; -EXP ostream& operator<< (ostream& os, const S_msrStanza& elt); - diff --git a/src/lilypond/msrStaves.cpp b/src/lilypond/msrStaves.cpp deleted file mode 100644 index b12b3843a..000000000 --- a/src/lilypond/msrStaves.cpp +++ /dev/null @@ -1,2876 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -int msrStaff::gStaffMaxRegularVoices = 4; - -S_msrStaff msrStaff::create ( - int inputLineNumber, - msrStaffKind staffKind, - int staffNumber, - S_msrPart staffPartUpLink) -{ - msrStaff* o = - new msrStaff ( - inputLineNumber, - staffKind, - staffNumber, - staffPartUpLink); - assert(o!=0); - - return o; -} - -msrStaff::msrStaff ( - int inputLineNumber, - msrStaffKind staffKind, - int staffNumber, - S_msrPart staffPartUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert( - staffPartUpLink != nullptr, - "staffPartUpLink is null"); - - // set staff part upLink - fStaffPartUpLink = - staffPartUpLink; - - // set staff kind and number - fStaffKind = staffKind; - fStaffNumber = staffNumber; - - // do other initializations - initializeStaff (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Creating staff \"" << asString () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif -} - -void msrStaff::initializeStaff () -{ - fStaffRegularVoicesCounter = 0; - - // set staff name - switch (fStaffKind) { - case msrStaff::kStaffRegular: - fStaffName = - fStaffPartUpLink->getPartMsrName () + - "_Staff_" + - int2EnglishWord (fStaffNumber); - break; - - case msrStaff::kStaffTablature: - fStaffPartUpLink->getPartMsrName () + - "_Tablature_" + - int2EnglishWord (fStaffNumber); - break; - - case msrStaff::kStaffHarmony: - fStaffName = - fStaffPartUpLink->getPartMsrName () + - "_HARMONY_Staff"; - break; - - case msrStaff::kStaffFiguredBass: - fStaffName = - fStaffPartUpLink->getPartMsrName () + - "_FIGURED_BASS_Staff"; - break; - - case msrStaff::kStaffDrum: - fStaffName = - fStaffPartUpLink->getPartMsrName () + - "_DRUM_Staff"; - break; - - case msrStaff::kStaffRythmic: - fStaffName = - fStaffPartUpLink->getPartMsrName () + - "_RYTHMIC_Staff"; - break; - } // switch - -// JMI gIndenter++; - - // check the staff number - switch (fStaffKind) { - case msrStaff::kStaffRegular: - // the staff number should not be negative - if (fStaffNumber < 0) { - stringstream s; - - s << - "regular staff number " << fStaffNumber << - " is not positive"; - - msrAssert ( - false, - s.str ()); - } - break; - - case msrStaff::kStaffTablature: - break; - - case msrStaff::kStaffHarmony: - break; - - case msrStaff::kStaffFiguredBass: - /* JMI - if (fStaffNumber != K_PART_FIGURED_BASS_STAFF_NUMBER) { - stringstream s; - - s << - "figured bass staff number " << fStaffNumber << - " is not equal to " << K_PART_FIGURED_BASS_STAFF_NUMBER; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - */ - break; - - case msrStaff::kStaffDrum: - break; - - case msrStaff::kStaffRythmic: - break; - } // switch - - // get the initial staff details from the part if any - S_msrStaffDetails - partStaffDetails = - fStaffPartUpLink-> - getCurrentPartStaffDetails (); - - if (partStaffDetails) { - // append it to the staff - appendStaffDetailsToStaff (partStaffDetails); - } - - // get the initial clef from the part if any - { - S_msrClef - clef = - fStaffPartUpLink-> - getPartCurrentClef (); - - if (clef) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Appending part clef '" << clef->asString () << - "' as initial clef to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - appendClefToStaff (clef); // JMI - } - } - - // get the initial key from the part if any - { - //* JMI - S_msrKey - key = - fStaffPartUpLink-> - getPartCurrentKey (); - - if (key) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Appending part key '" << key->asString () << - "' as initial key to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - appendKeyToStaff (key); - } - } - - // get the initial transpose from the part if any - { - S_msrTranspose - transpose = - fStaffPartUpLink-> - getPartCurrentTranspose (); - - if (transpose) { -#ifdef TRACE_OAH - if ( gTraceOah->fTraceTranspositions) { - gLogOstream << - "Appending part transpose '" << transpose->asString () << - "' as initial transpose to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - fStaffCurrentTranspose = transpose; - - appendTransposeToAllStaffVoices (transpose); - } - } - - // set staff instrument names default values // JMI - fStaffInstrumentName = - fStaffPartUpLink-> - getPartInstrumentName (); - fStaffInstrumentAbbreviation = - fStaffPartUpLink-> - getPartInstrumentAbbreviation (); - - // rest measures - fStaffContainsRestMeasures = false; - -// JMI gIndenter--; -} - -msrStaff::~msrStaff () -{} - -S_msrStaff msrStaff::createStaffNewbornClone ( - S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Creating a newborn clone of staff \"" << - fStaffName << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - - S_msrStaff - newbornClone = - msrStaff::create ( - fInputLineNumber, - fStaffKind, - fStaffNumber, - containingPart); - - newbornClone->fStaffName = - fStaffName; - - newbornClone->fStaffNumber = - fStaffNumber; - - newbornClone->fStaffInstrumentName = - fStaffInstrumentName; - - newbornClone->fStaffInstrumentAbbreviation = - fStaffInstrumentAbbreviation; - - return newbornClone; -} - -void msrStaff::setStaffCurrentClef (S_msrClef clef) -{ - fStaffCurrentClef = clef; -}; - -void msrStaff::setStaffCurrentKey (S_msrKey key) -{ - fStaffCurrentKey = key; -}; - -void msrStaff::setStaffCurrentTime (S_msrTime time) -{ - fStaffCurrentTime = time; -}; - -string msrStaff::staffNumberAsString () -{ - string result; - - switch (fStaffNumber) { - case K_PART_FIGURED_BASS_STAFF_NUMBER: - result = "K_PART_FIGURED_BASS_STAFF_NUMBER"; // JMI - break; - default: - result = to_string (fStaffNumber); - } // switch - - return result; -} - -/* KEEP JMI -const int msrStaff::getStaffNumberOfMusicVoices () const -{ - int result = 0; - - for ( - map::const_iterator i = - fStaffRegularVoicesMap.begin (); - i != fStaffRegularVoicesMap.end (); - i++ - ) { - S_msrVoice - voice = - (*i).second; - - switch (voice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - if (voice->getMusicHasBeenInsertedInVoice ()) { - result++; - } - break; - - case msrVoice::kVoiceHarmony: // JMI - break; - - case msrVoice::kVoiceFiguredBass: // JMI - break; - } // switch - - } // for - - return result; -} -*/ - -void msrStaff::createMeasureAndAppendItToStaff ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating and appending measure '" << - measureNumber << - ", in staff \"" << getStaffName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - // propagate it to all staves - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - S_msrVoice - voice = (*i).second; - - // sanity check - msrAssert ( - voice != nullptr, - "voice is null"); - - switch (voice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Propagating the creation and appending of measure '" << - measureNumber << - "', line " << inputLineNumber << - ", to voice \"" << voice->getVoiceName () << "\"" << - endl; - } -#endif - - voice-> - createMeasureAndAppendItToVoice ( - inputLineNumber, - measureNumber, - measureImplicitKind); - break; - - case msrVoice::kVoiceHarmony: - break; - - case msrVoice::kVoiceFiguredBass: - break; - } // switch - } // for -} - -void msrStaff::setNextMeasureNumberInStaff ( - int inputLineNumber, - string nextMeasureNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting next measure number to '" << - nextMeasureNumber << - ", in staff \"" << getStaffName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // propagate it to all staves - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - S_msrVoice voice = (*i).second; - - // sanity check - msrAssert ( - voice != nullptr, - "voice is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Propagating the setting of next measure number '" << - nextMeasureNumber << - "', line " << inputLineNumber << - ", in voice \"" << voice->getVoiceName () << "\"" << - endl; - } -#endif - - voice-> - setNextMeasureNumberInVoice ( - inputLineNumber, - nextMeasureNumber); - } // for - - gIndenter--; -} - -S_msrVoice msrStaff::createVoiceInStaffByItsNumber ( - int inputLineNumber, - msrVoice::msrVoiceKind voiceKind, - int voiceNumber, - string currentMeasureNumber) -{ - // take this new voice into account if relevant - switch (voiceKind) { - case msrVoice::kVoiceRegular: - fStaffRegularVoicesCounter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Creating regular voice number '" << - voiceNumber << - "', voiceKind '" << - msrVoice::voiceKindAsString (voiceKind) << - "' as regular voice '" << - fStaffRegularVoicesCounter << - "' of staff \"" << getStaffName () << - "\", line " << inputLineNumber << - "\", current measure number: " << - currentMeasureNumber << - // JMI " in part " << fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - break; - - case msrVoice::kVoiceHarmony: -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Creating harmony voice number '" << - voiceNumber << - "', voiceKind '" << - msrVoice::voiceKindAsString (voiceKind) << - "' in staff \"" << getStaffName () << - "\", line " << inputLineNumber << - "\", current measure number: " << - currentMeasureNumber << - // JMI " in part " << fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - break; - - case msrVoice::kVoiceFiguredBass: -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Creating figured bass voice number '" << - voiceNumber << - "', voiceKind '" << - msrVoice::voiceKindAsString (voiceKind) << - "' in staff \"" << getStaffName () << - "\", line " << inputLineNumber << - "\", current measure number: " << - currentMeasureNumber << - // JMI " in part " << fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - break; - } // switch - - - // are there too many regular voices in this staff? - if (fStaffRegularVoicesCounter > msrStaff::gStaffMaxRegularVoices) { - stringstream s; - - s << - "staff \"" << getStaffName () << - "\" is already filled up with " << - msrStaff::gStaffMaxRegularVoices << " regular voices" << - endl << - ". voice number " << - voiceNumber << - " overflows it" << - endl << - ", fStaffRegularVoicesCounter = " << - fStaffRegularVoicesCounter << - ", msrStaff::gStaffMaxRegularVoices = " << - msrStaff::gStaffMaxRegularVoices << - endl; - - /* JMI ??? - msrMusicXMLError ( -// JMI msrMusicXMLWarning ( JMI - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - - // create the voice - S_msrVoice - voice = - msrVoice::create ( - inputLineNumber, - voiceKind, - voiceNumber, - msrVoice::kCreateInitialLastSegmentYes, - this); - - // take this new voice into account if relevant - switch (voiceKind) { - case msrVoice::kVoiceRegular: - // register the voice by its relative number - /* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Voice " << voiceNumber << - " in staff " << getStaffName () << - " gets staff regular voice number " << - fStaffRegularVoicesCounter << - endl; - } -#endif -*/ - - registerVoiceInRegularVoicesMapByItsNumberByItsNumber ( - voiceNumber, - voice); - break; - - case msrVoice::kVoiceHarmony: - break; - - case msrVoice::kVoiceFiguredBass: - break; - } // switch - - // register it in staff by its number - registerVoiceByItsNumber ( - inputLineNumber, - voiceNumber, - voice); - - return voice; -} - -void msrStaff::registerVoiceByItsNumber ( - int inputLineNumber, - int voiceNumber, - S_msrVoice voice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Registering voice number '" << voiceNumber << - "', named \"" << voice->getVoiceName () << - "\" in staff " << getStaffName () << - endl; - } -#endif - - // register voice in all voices map - fStaffAllVoicesMap [voiceNumber] = - voice; - - // register it in all voices list - fStaffAllVoicesList.push_back (voice); - - // sort the list if necessary - switch (voice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - break; - - case msrVoice::kVoiceHarmony: -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Sorting the voices in staff \"" << - getStaffName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sort fStaffAllVoicesList, to have harmonies just before - // the corresponding voice - if (fStaffAllVoicesList.size ()) { - fStaffAllVoicesList.sort ( - compareVoicesToHaveHarmoniesAboveCorrespondingVoice); - } - break; - - case msrVoice::kVoiceFiguredBass: -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Sorting the voices in staff \"" << - getStaffName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sort fStaffAllVoicesList, to have figured basses just after - // the corresponding voice - if (fStaffAllVoicesList.size ()) { - fStaffAllVoicesList.sort ( - compareVoicesToHaveFiguredBassesBelowCorrespondingVoice); - } - break; - } // switch -} - -void msrStaff::registerVoiceInRegularVoicesMapByItsNumberByItsNumber ( - int voiceNumber, - S_msrVoice voice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Registering regular voice number '" << voiceNumber << - "', named \"" << voice->getVoiceName () << - "\" in staff " << getStaffName () << - "'s regular voices map as regular voice with sequential number " << - fStaffRegularVoicesCounter << - endl; - } -#endif - - fStaffRegularVoicesList.push_back (voice); - - fStaffRegularVoicesMap [fStaffRegularVoicesCounter] = - voice; - - // setRegularVoiceStaffSequentialNumber() will be called in msrStaff::finalizeStaff() - -/* JMI - // set voice staff sequential number - voice-> - setRegularVoiceStaffSequentialNumber ( - fStaffRegularVoicesCounter); - */ -} - -void msrStaff::registerVoiceInAllVoicesList ( - int voiceNumber, - S_msrVoice voice) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Registering voice number '" << voiceNumber << - "', named \"" << voice->getVoiceName () << - "\" in staff " << getStaffName () << - "'s all voices list" << - endl; - } -#endif - - fStaffAllVoicesList.push_back (voice); -} - -S_msrVoice msrStaff::fetchVoiceFromStaffByItsNumber ( - int inputLineNumber, - int voiceNumber) -{ - S_msrVoice result; // JMI avoid repetitive messages! - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Fetching voice number " << - voiceNumber << - " in staff \"" << getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - for ( - map::const_iterator i = - fStaffRegularVoicesMap.begin (); - i != fStaffRegularVoicesMap.end (); - i++ - ) { - if ( - (*i).second->getVoiceNumber () - == - voiceNumber) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Voice " << voiceNumber << - " in staff \"" << getStaffName () << "\"" << - " has staff relative number " << (*i).first << - endl; - } -#endif - - result = (*i).second; - break; - } - } // for - - return result; -} - -void msrStaff::assignSequentialNumbersToRegularVoicesInStaff ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Assigning sequential numbers to the regular voices in staff \"" << - fStaffName << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // assign sequential numbers to the regular voices, - // needed to know about voices 1, 2, 3 and 4 - fStaffRegularVoicesList.sort ( - compareVoicesByIncreasingNumber); - - if (fStaffRegularVoicesList.size ()) { - int voiceSequentialCounter = 0; - - list::const_iterator - iBegin = fStaffRegularVoicesList.begin (), - iEnd = fStaffRegularVoicesList.end (), - i = iBegin; - - for ( ; ; ) { - if (i == iEnd) break; - - S_msrVoice voice = (*i); - - // sanity check - msrAssert ( - voice != nullptr, - "voice is null"); - - voiceSequentialCounter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Voice \"" << - voice->getVoiceName () << - "\" gets sequential number " << - voiceSequentialCounter << - " in staff \"" << - fStaffName << - "\"" << - endl; - } -#endif - - voice-> - setRegularVoiceStaffSequentialNumber ( - voiceSequentialCounter); - - if (++i == iEnd) break; - } // for - } -} - -S_msrVoice msrStaff::fetchFirstRegularVoiceFromStaff ( - int inputLineNumber) -{ - S_msrVoice result; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Fetching first regular voice in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - if (! fStaffRegularVoicesList.size ()) { - stringstream s; - - s << - "staff " << fStaffNumber << - " in part " << - fStaffPartUpLink->getPartCombinedName () << - " doesn't contain any regular voices, cannot fetch the first one" << - ", line " << inputLineNumber; - - msrInternalError ( // JMI ??? - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - else { - result = fStaffRegularVoicesList.front (); - - // sanity check - msrAssert ( - result->getRegularVoiceStaffSequentialNumber () == 1, - "result->getRegularVoiceStaffSequentialNumber () is not equal to 1"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "The first regular voice in staff \"" << - getStaffName () << - "\" is " << - result->asShortString () << - endl; - } -#endif - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "--> result = \"" << - result->getVoiceName () << - "\"" << - endl; - } -#endif - - return result; -} - -void msrStaff::addAVoiceToStaffIfItHasNone ( - int inputLineNumber) -{ - if (fStaffAllVoicesMap.size () == 0) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Staff \"" << - getStaffName () << - "\" doesn't contain any voice, adding one" << - ", line " << inputLineNumber << - endl; - } -#endif - - this-> - createVoiceInStaffByItsNumber ( - inputLineNumber, - msrVoice::kVoiceRegular, - 1, // voiceNumber, - "1"); // fCurrentMeasureNumber - } -} - -void msrStaff::registerVoiceInStaff ( - int inputLineNumber, - S_msrVoice voice) -{ - // sanity check - msrAssert ( - voice != nullptr, - "voice is null"); - - // get voice kind - msrVoice::msrVoiceKind voiceKind = - voice->getVoiceKind (); - - // take this new voice into account if relevant - switch (voiceKind) { - case msrVoice::kVoiceRegular: - // take that regular voice into account - fStaffRegularVoicesCounter++; - - // are there too many voices in this staff? - if (fStaffRegularVoicesCounter > msrStaff::gStaffMaxRegularVoices) { - stringstream s; - - s << - "staff \"" << getStaffName () << - "\" is already filled up with " << - msrStaff::gStaffMaxRegularVoices << " regular voices," << - endl << - "the voice named \"" << voice->getVoiceName () << "\" overflows it" << - endl << - ", fStaffRegularVoicesCounter = " << - fStaffRegularVoicesCounter << - ", msrStaff::gStaffMaxRegularVoices = " << - msrStaff::gStaffMaxRegularVoices << - endl; - - /* JMI ??? - msrMusicXMLError ( - // JMI msrMusicXMLWarning ( JMI - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - break; - - case msrVoice::kVoiceHarmony: - break; - case msrVoice::kVoiceFiguredBass: - break; - } // switch - - // register voice in this staff -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Registering voice \"" << voice->getVoiceName () << - "\" as relative voice " << - fStaffRegularVoicesCounter << - " of staff \"" << getStaffName () << - "\", line " << inputLineNumber << -// JMI " in part " << fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - // register it in staff by its number - registerVoiceByItsNumber ( - inputLineNumber, - voice->getVoiceNumber (), - voice); - - // is voice a regular voice??? - switch (voiceKind) { - case msrVoice::kVoiceRegular: - { - int voiceNumber = voice->getVoiceNumber (); - - // register the voice by its number -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Registering regular voice '" << voiceNumber << - "' " << voice->getVoiceName () << - " with staff regular voice number " << - fStaffRegularVoicesCounter << - " in staff " << getStaffName () << - endl; - } -#endif - - registerVoiceInRegularVoicesMapByItsNumberByItsNumber ( - voiceNumber, - voice); - } - break; - - case msrVoice::kVoiceHarmony: - break; - - case msrVoice::kVoiceFiguredBass: - break; - } // switch -} - -void msrStaff::appendClefToStaff (S_msrClef clef) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Appending clef '" << clef->asString () << - "' to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - gIndenter++; - - // append clef to the staff, - // unless we should ignore redundant clefs - // and a clef equal to the current clef is found - bool doAppendClefToStaff = true; - - if (fStaffCurrentClef) { - if ( - gMusicXMLOah->fIgnoreRedundantClefs - && - clef->isEqualTo (fStaffCurrentClef) - ) { - doAppendClefToStaff = false; - } - } - - if (doAppendClefToStaff) { - // register clef as current staff clef - fStaffCurrentClef = clef; - - // propagate clef to all voices - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> // JMI msrAssert??? - appendClefToVoice (clef); - } // for - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Clef '" << - clef->asString () << - "' ignored because it is already present in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - } - - gIndenter--; -} - -void msrStaff::appendKeyToStaff (S_msrKey key) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Appending key '" << key->asString () << - "' to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - gIndenter++; - - // append key to staff? - bool doAppendKeyToStaff = true; - - if (fStaffCurrentKey) { - if ( - gMusicXMLOah->fIgnoreRedundantKeys - && - fStaffCurrentKey->isEqualTo (key) - ) { - doAppendKeyToStaff = false; - } - - else { - if (key->isEqualTo (fStaffCurrentKey)) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Key '" << - key->asString () << - "' ignored because it is already present in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - doAppendKeyToStaff = false; - } - } - } - - if (doAppendKeyToStaff) { - // register key as current staff key - fStaffCurrentKey = key; - - // propagate it to all voices - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> // JMI msrAssert??? - appendKeyToVoice (key); - } // for - } - - gIndenter--; -} - -void msrStaff::appendTimeToStaff (S_msrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time '" << time->asString () << - "' to staff \"" << - getStaffName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - // append time to staff? - bool doAppendTimeToStaff = true; - - if (fStaffCurrentTime) { - if ( - gMusicXMLOah->fIgnoreRedundantTimes - && - fStaffCurrentTime->isEqualTo (time) - ) { - doAppendTimeToStaff = false; - } - - else { - if (time->isEqualTo (fStaffCurrentTime)) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Time '" << - time->asString () << - "' ignored because it is already present in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - doAppendTimeToStaff = false; - } - } - } - - if (doAppendTimeToStaff) { - // register time as current staff time - fStaffCurrentTime = time; - - // propagate it to all voices - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> // JMI msrAssert??? - appendTimeToVoice (time); - } // for - } - - gIndenter--; -} - -void msrStaff::appendTimeToStaffClone (S_msrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time '" << time->asString () << - "' to staff clone \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - gIndenter++; - - // set staff time - fStaffCurrentTime = time; - - // propagate it to all voices - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> // JMI msrAssert??? - appendTimeToVoiceClone (time); - } // for - - gIndenter--; -} - -/* JMI -void msrStaff::nestContentsIntoNewRepeatInStaff ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Nesting contents into new repeat in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - nestContentsIntoNewRepeatInVoice ( - inputLineNumber); - } // for -} -*/ - -void msrStaff::handleRepeatStartInStaff ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling repeat start in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatStartInVoice ( - inputLineNumber); - } // for - - gIndenter--; -} - -void msrStaff::handleRepeatEndInStaff ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat end in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatEndInVoice ( - inputLineNumber, - measureNumber, - repeatTimes); - } // for - - gIndenter--; -} - -void msrStaff::handleRepeatEndingStartInStaff ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat ending start in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatEndingStartInVoice ( - inputLineNumber); - } // for - - gIndenter--; -} - -void msrStaff::handleRepeatEndingEndInStaff ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a " << - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingKind) << - " repeat ending end in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - handleRepeatEndingEndInVoice ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind); - } // for - - gIndenter--; -} - -/* JMI -void msrStaff::finalizeRepeatEndInStaff ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Finalizing a repeat upon its end in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - finalizeRepeatEndInVoice ( - inputLineNumber, - measureNumber, - repeatTimes); - } // for - - gIndenter--; -} -*/ - -void msrStaff::createMeasuresRepeatFromItsFirstMeasuresInStaff ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a measures repeat from it's first measure in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - createMeasuresRepeatFromItsFirstMeasuresInVoice ( - inputLineNumber, - measuresRepeatMeasuresNumber, - measuresRepeatSlashes); - } // for -} - -void msrStaff::appendPendingMeasuresRepeatToStaff ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending the pending measures repeat to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendPendingMeasuresRepeatToVoice ( - inputLineNumber); - } // for -} - -void msrStaff::createRestMeasuresInStaff ( - int inputLineNumber, - int restMeasuresMeasuresNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a multiple rest in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", " << - singularOrPlural ( - restMeasuresMeasuresNumber, "measure", "measures") << - endl; - } -#endif - - fStaffContainsRestMeasures = true; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - createRestMeasuresInVoice ( - inputLineNumber, - restMeasuresMeasuresNumber); - } // for -} - -void msrStaff::appendPendingRestMeasuresToStaff ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending the pending multiple rest to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendPendingRestMeasuresToVoice ( - inputLineNumber); - } // for -} - -void msrStaff::appendRestMeasuresCloneToStaff ( - int inputLineNumber, - S_msrRestMeasures restMeasures) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending multiple rest '" << - restMeasures->asString () << - "' to staff clone \"" << - getStaffName () << - "\"" << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> // JMI msrAssert??? - appendRestMeasuresCloneToVoiceClone ( - inputLineNumber, - restMeasures); - } // for -} - -void msrStaff::appendRepeatCloneToStaff ( - int inputLineNumber, - S_msrRepeat repeatCLone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending repeat clone to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> // JMI msrAssert??? - appendRepeatCloneToVoiceClone ( - inputLineNumber, repeatCLone); - } // for -} - -void msrStaff::appendRepeatEndingCloneToStaff ( - S_msrRepeatEnding repeatEndingClone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending a repeat ending clone to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - ", line " << repeatEndingClone->getInputLineNumber () << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> // JMI msrAssert??? - appendRepeatEndingCloneToVoice ( - repeatEndingClone); - } // for - - gIndenter--; -} - -void msrStaff::appendBarlineToStaff (S_msrBarline barline) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending barline " << barline->asString () << - " to staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - gIndenter++; - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendBarlineToVoice (barline); - } // for - - gIndenter--; -} - -void msrStaff::appendTransposeToStaff ( - S_msrTranspose transpose) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Setting transpose '" << - transpose->asString () << - "' in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - // set staff transpose - bool doAppendTransposeToStaff = true; - - if (! fStaffCurrentTranspose) { - doAppendTransposeToStaff = true; - } - - else { - if (transpose->isEqualTo (fStaffCurrentTranspose)) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Transpose '" << - transpose->asString () << - "' ignored because it is already present in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - doAppendTransposeToStaff = false; - } - } - - if (doAppendTransposeToStaff) { - // register transpose as current staff transpose - fStaffCurrentTranspose = transpose; - - // propagate it to all voices - appendTransposeToAllStaffVoices (transpose); - } -} - -void msrStaff::appendPartNameDisplayToStaff ( - S_msrPartNameDisplay partNameDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Setting part name display '" << - partNameDisplay->asString () << - "' in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - // set staff transpose - bool doAppendPartNameDisplayToStaff = true; - - /* JMI ??? - if (! fStaffCurrentTranspose) { - doAppendPartNameDisplayToStaff = true; - } - - else { - if (partNameDisplay->isEqualTo (fStaffCurrentTranspose)) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Transpose '" << - partNameDisplay->asString () << - "' ignored because it is already present in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - doAppendPartNameDisplayToStaff = false; - } - } - */ - - if (doAppendPartNameDisplayToStaff) { - // register transpose as current staff transpose - // JMI fStaffCurrentTranspose = partNameDisplay; - - // propagate it to all voices - appendPartNameDisplayToAllStaffVoices (partNameDisplay); - } -} - -void msrStaff::appendPartAbbreviationDisplayToStaff ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Setting part abbreviation display '" << - partAbbreviationDisplay->asString () << - "' in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - // set staff transpose - bool doAppendPartAbbreviationDisplayToStaff = true; - -/* JMI ??? - if (! fStaffCurrentTranspose) { - doAppendPartAbbreviationDisplayToStaff = true; - } - - else { - if (partAbbreviationDisplay->isEqualTo (fStaffCurrentTranspose)) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Transpose '" << - transpose->asString () << - "' ignored because it is already present in staff " << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - doAppendPartAbbreviationDisplayToStaff = false; - } - } - */ - - if (doAppendPartAbbreviationDisplayToStaff) { - // register transpose as current staff transpose - // JMI fStaffCurrentTranspose = partAbbreviationDisplay; - - // propagate it to all voices - appendPartAbbreviationDisplayToAllStaffVoices (partAbbreviationDisplay); - } -} - -void msrStaff::appendStaffDetailsToStaff ( - S_msrStaffDetails staffDetails) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffDetails) { - gLogOstream << - "Appending staff details '" << - staffDetails->asShortString () << - "' to staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - // sanity check - msrAssert ( - staffDetails != nullptr, - "staffDetails is null"); - - // register staff details in staff - fCurrentStaffStaffDetails = staffDetails; - - // set staff kind accordingly if relevant - switch (staffDetails->getStaffLinesNumber ()) { - case 1: - if (gMsrOah->fCreateSingleLineStavesAsRythmic) { - fStaffKind = msrStaff::kStaffRythmic; - } - else { - fStaffKind = msrStaff::kStaffDrum; - } - break; - default: - ; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Setting staff kind to '" << - staffKindAsString (fStaffKind) << - "' in staff \"" << - getStaffName () << - "\" in part " << - fStaffPartUpLink->getPartCombinedName () << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendStaffDetailsToVoice (staffDetails); - } // for -} - -void msrStaff::appendTransposeToAllStaffVoices ( - S_msrTranspose transpose) -{ - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendTransposeToVoice (transpose); - } // for -} - -void msrStaff::appendPartNameDisplayToAllStaffVoices ( - S_msrPartNameDisplay partNameDisplay) -{ - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendPartNameDisplayToVoice (partNameDisplay); - } // for -} - -void msrStaff::appendPartAbbreviationDisplayToAllStaffVoices ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay) -{ - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendPartAbbreviationDisplayToVoice (partAbbreviationDisplay); - } // for -} - -void msrStaff::appendScordaturaToStaff ( - S_msrScordatura scordatura) -{ - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendScordaturaToVoice ( - scordatura); - } // for -} - -void msrStaff::appendAccordionRegistrationToStaff ( - S_msrAccordionRegistration - accordionRegistration) -{ - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendAccordionRegistrationToVoice ( - accordionRegistration); - } // for -} - -void msrStaff::appendHarpPedalsTuningToStaff ( - S_msrHarpPedalsTuning - harpPedalsTuning) -{ - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - (*i).second-> - appendHarpPedalsTuningToVoice ( - harpPedalsTuning); - } // for -} - -void msrStaff::finalizeCurrentMeasureInStaff ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Finalizing current measure in staff \"" << - getStaffName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // finalize all the regular voices - for ( - map::const_iterator i = fStaffRegularVoicesMap.begin (); - i != fStaffRegularVoicesMap.end (); - i++ - ) { - S_msrVoice - voice = - (*i).second; - - switch (voice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - { - // handle the regular voice - voice-> - finalizeCurrentMeasureInVoice ( - inputLineNumber); - -/* JMI this will be done later - // handle the harmony voice if any - S_msrVoice - harmonyVoiceForRegularVoice = - voice-> - getHarmonyVoiceForRegularVoiceForwardLink (); - - if (harmonyVoiceForRegularVoice) { - harmonyVoiceForRegularVoice-> - finalizeCurrentMeasureInVoice ( - inputLineNumber); - } -*/ - - // handle the figuredBass voice if any - S_msrVoice - figuredBassVoiceForRegularVoice = - voice-> - getFiguredBassVoiceForRegularVoiceForwardLink (); - - if (figuredBassVoiceForRegularVoice) { - figuredBassVoiceForRegularVoice-> - finalizeCurrentMeasureInVoice ( - inputLineNumber); - } - } - break; - - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - break; - } // switch - } // for - - gIndenter--; -} - -bool msrStaff::compareVoicesByIncreasingNumber ( - const S_msrVoice& first, - const S_msrVoice& second) -{ - return - first->getVoiceNumber () - < - second->getVoiceNumber (); -} - -bool msrStaff::compareVoicesToHaveHarmoniesAboveCorrespondingVoice ( - const S_msrVoice& first, - const S_msrVoice& second) -{ - int - firstVoiceNumber = - first->getVoiceNumber (), - secondVoiceNumber = - second->getVoiceNumber (); - - if (firstVoiceNumber > K_VOICE_HARMONY_VOICE_BASE_NUMBER) { - firstVoiceNumber -= K_VOICE_HARMONY_VOICE_BASE_NUMBER + 1; - } - if (secondVoiceNumber > K_VOICE_HARMONY_VOICE_BASE_NUMBER) { - secondVoiceNumber -= K_VOICE_HARMONY_VOICE_BASE_NUMBER + 1; - } - - bool result = - firstVoiceNumber < secondVoiceNumber; - - return result; - - /* JMI - switch (firstVoiceNumber) { - case msrVoice::kVoiceRegular: - switch (secondVoiceNumber) { - case msrVoice::kVoiceRegular: - break; - - case msrVoice::kVoiceHarmony: - result = - secondVoiceNumber - K_VOICE_HARMONY_VOICE_BASE_NUMBER - > - firstVoiceNumber; - break; - - case msrVoice::kVoiceFiguredBass: - break; - } // switch - break; - - case msrVoice::kVoiceHarmony: - switch (secondVoiceNumber) { - case msrVoice::kVoiceRegular: - result = - firstVoiceNumber - K_VOICE_HARMONY_VOICE_BASE_NUMBER - > - secondVoiceNumber; - break; - - case msrVoice::kVoiceHarmony: - break; - - case msrVoice::kVoiceFiguredBass: - break; - } // switch - break; - - case msrVoice::kVoiceFiguredBass: - switch (secondVoiceNumber) { - case msrVoice::kVoiceRegular: - break; - - case msrVoice::kVoiceHarmony: - break; - - case msrVoice::kVoiceFiguredBass: - break; - } // switch - break; - } // switch - - return result; - */ -} - -bool msrStaff::compareVoicesToHaveFiguredBassesBelowCorrespondingVoice ( - const S_msrVoice& first, - const S_msrVoice& second) -{ - int - firstVoiceNumber = - first->getVoiceNumber (), - secondVoiceNumber = - second->getVoiceNumber (); - - if (firstVoiceNumber > K_VOICE_FIGURED_BASS_VOICE_BASE_NUMBER) { - firstVoiceNumber -= K_VOICE_FIGURED_BASS_VOICE_BASE_NUMBER + 1; - } - if (secondVoiceNumber > K_VOICE_FIGURED_BASS_VOICE_BASE_NUMBER) { - secondVoiceNumber -= K_VOICE_FIGURED_BASS_VOICE_BASE_NUMBER + 1; - } - - bool result = - firstVoiceNumber > secondVoiceNumber; - - return result; -} - -void msrStaff::finalizeStaff (int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Finalizing staff \"" << - getStaffName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // finalize the voices -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Finalizing the voices in staff \"" << - getStaffName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - S_msrVoice - voice = (*i).second; - - voice-> - finalizeVoice ( - inputLineNumber); - } // for - - gIndenter--; -} - -void msrStaff::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStaff::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStaff elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStaff::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrStaff::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStaff::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStaff elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStaff::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrStaff::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStaff::browseData ()" << - endl; - } - - /* - fPartCurrentClef, fPartCurrentKey and fPartCurrentTime are used - to populate newly created voices, not to create music proper: - they're thus not browsed - */ - - /* - fCurrentPartStaffDetails is used - to populate newly created voices, not to create music proper: - it is thus not browsed - */ - -/* - if (fStaffTuningsList.size ()) { - for ( - list::const_iterator i = fStaffTuningsList.begin (); - i != fStaffTuningsList.end (); - i++ - ) { - // browse the voice - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - // gInfgdenter--; - } -*/ - -/* JMI may be useful??? - if (fStaffAllVoicesMap.size ()) { - for ( - map::const_iterator i = fStaffAllVoicesMap.begin (); - i != fStaffAllVoicesMap.end (); - i++ - ) { - msrBrowser browser (v); - browser.browse (*((*i).second)); - } // for - } - */ - - if (fStaffAllVoicesList.size ()) { - for ( - list::const_iterator i = fStaffAllVoicesList.begin (); - i != fStaffAllVoicesList.end (); - i++ - ) { - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% <== msrStaff::browseData ()" << - endl; - } -} - -string msrStaff::staffKindAsString ( - msrStaffKind staffKind) -{ - string result; - - switch (staffKind) { - case msrStaff::kStaffRegular: - result = "staffRegular"; - break; - case msrStaff::kStaffTablature: - result = "staffTablature"; - break; - case msrStaff::kStaffHarmony: - result = "staffHarmony"; - break; - case msrStaff::kStaffFiguredBass: - result = "staffFiguredBass bass"; - break; - case msrStaff::kStaffDrum: - result = "staffDrum"; - break; - case msrStaff::kStaffRythmic: - result = "staffRythmic"; - break; - } // switch - - return result; -} - -string msrStaff::staffKindAsString () const -{ - return staffKindAsString (fStaffKind); -} - -void msrStaff::print (ostream& os) const -{ - os << - "Staff " << getStaffName () << - ", " << staffKindAsString () << - ", " << - singularOrPlural ( - fStaffAllVoicesMap.size (), "voice", "voices") << - ", " << - singularOrPlural ( - fStaffRegularVoicesCounter, - "regular voice", - "regular voices") << // JMI - ")" << - endl; - - gIndenter++; - - const int fieldWidth = 28; - - os << - setw (fieldWidth) << - "staffNumber" << " : " << - fStaffNumber << - endl << - setw (fieldWidth) << - "staffPartUpLink" << " : " << - fStaffPartUpLink->getPartCombinedName () << - endl << - setw (fieldWidth) << - "staffInstrumentName" << " : \"" << - fStaffInstrumentName << - "\"" << - endl << - setw (fieldWidth) << - "staffInstrumentAbbreviation" << " : \"" << - fStaffInstrumentAbbreviation << - endl; - - // print current the staff clef if any -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - os << left << - setw (fieldWidth) << - "staffCurrentClef" << " : "; - - if (fStaffCurrentClef) { - os << - "'" << - fStaffCurrentClef->asShortString () << - "'"; - } - else { - os << - "none"; - } - - os << endl; - } -#endif - - // print the current staff key if any -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - os << left << - setw (fieldWidth) << - "staffCurrentKey" << " : "; - - if (fStaffCurrentKey) { - os << - "'" << - fStaffCurrentKey->asShortString () << - "'"; - } - else { - os << - "none"; - } - - os << endl; - } -#endif - - // print the current staff time if any -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - os << left << - setw (fieldWidth) << - "staffCurrentTime" << " : "; - - if (fStaffCurrentTime) { - os << - "'" << - fStaffCurrentTime->asShortString () << - "'"; - } - else { - os << - "none"; - } - - os << endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffDetails) { - // print the staff details if any - if (fCurrentStaffStaffDetails) { - os << - fCurrentStaffStaffDetails; - } - else { - os << left << - setw (fieldWidth) << - "currentStaffStaffDetails" << " : " << "none"; - } - os << endl; - } -#endif - - // print the all voices map - if (fStaffAllVoicesMap.size ()) { - os << left << - setw (fieldWidth) << - "staffAllVoicesMap" << " : " << - endl; - - gIndenter++; - - map::const_iterator - iBegin = fStaffAllVoicesMap.begin (), - iEnd = fStaffAllVoicesMap.end (), - i = iBegin; - - for ( ; ; ) { - int voiceNumber = (*i).first; - S_msrVoice voice = (*i).second; - - os << - voiceNumber << " : " << - "regularVoiceStaffSequentialNumber = " << - voice->getRegularVoiceStaffSequentialNumber () << - ", " << - voice->asShortString (); - if (++i == iEnd) break; - os << endl; - } // for - os << endl; - - gIndenter--; - } - - // print the regular voices map - if (fStaffAllVoicesMap.size ()) { - os << left << - setw (fieldWidth) << - "staffRegularVoicesMap" << " : " << - endl; - - gIndenter++; - - map::const_iterator - iBegin = fStaffRegularVoicesMap.begin (), - iEnd = fStaffRegularVoicesMap.end (), - i = iBegin; - - for ( ; ; ) { - if (i == iEnd) break; // JMI ??? - - int voiceNumber = (*i).first; - S_msrVoice voice = (*i).second; - - // sanity check - msrAssert ( - voice != nullptr, - "voice is null"); - - os << - voiceNumber << " : " << - "regularVoiceStaffSequentialNumber = " << - voice->getRegularVoiceStaffSequentialNumber () << - ", " << - voice->asShortString (); - if (++i == iEnd) break; - os << endl; - } // for - os << endl; - - gIndenter--; - } - - // print the regular voices list - if (fStaffRegularVoicesList.size ()) { - os << left << - setw (fieldWidth) << - "staffRegularVoicesList" << " : " << - endl; - - gIndenter++; - - list::const_iterator - iBegin = fStaffRegularVoicesList.begin (), - iEnd = fStaffRegularVoicesList.end (), - i = iBegin; - - int voiceNumber = 0; - - for ( ; ; ) { - if (i == iEnd) break; // JMI ??? - - S_msrVoice voice = (*i); - - // sanity check - msrAssert ( - voice != nullptr, - "voice is null"); - - voiceNumber++; - - os << - voiceNumber << " : " << - "regularVoiceStaffSequentialNumber = " << - voice->getRegularVoiceStaffSequentialNumber () << - ", " << - voice->asShortString (); - if (++i == iEnd) break; - os << endl; - } // for - os << endl; - - gIndenter--; - } - - // print the voices - if (fStaffAllVoicesMap.size ()) { - os << endl; - - map::const_iterator - iBegin = fStaffAllVoicesMap.begin (), - iEnd = fStaffAllVoicesMap.end (), - i = iBegin; - - for ( ; ; ) { - S_msrVoice voice = (*i).second; - -/* JMI -os << - endl << - "================= voice :" << - endl << - voice << - endl << - endl; -*/ - - os << - voice; - - /* JMI - switch (voice->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - os << - voice; - break; - - case msrVoice::kVoiceHarmony: - if ( - gMsrOah->fShowHarmonyVoices - || - voice->getMusicHasBeenInsertedInVoice ()) - os << - voice; - break; - - case msrVoice::kVoiceFiguredBass: - if ( - gMsrOah->fShowFiguredBassVoices - || - voice->getMusicHasBeenInsertedInVoice ()) - os << - voice; - break; - } // switch - */ - - if (++i == iEnd) break; - - os << endl; - } // for - } - - gIndenter--; -} - -void msrStaff::printSummary (ostream& os) -{ - os << - "Staff" " " << getStaffName () << - ", " << staffKindAsString () << - " (" << - singularOrPlural ( - fStaffAllVoicesMap.size (), "voice", "voices") << - ")" << - endl; - - gIndenter++; - - os << - "StaffInstrumentName: \"" << - fStaffInstrumentName << "\"" << - endl; - -/* JMI - if (fStaffTuningsList.size ()) { - os << - "Staff tunings:" << - endl; - - list::const_iterator - iBegin = fStaffTuningsList.begin (), - iEnd = fStaffTuningsList.end (), - i = iBegin; - - gIndenter++; - for ( ; ; ) { - os << (*i)->asString () const; - if (++i == iEnd) break; - os << endl; - } // for - os << endl; - gIndenter--; - } -*/ - - // print the voices names - if (fStaffAllVoicesMap.size ()) { - os << - "Voices:" << - endl; - - gIndenter++; - - map::const_iterator - iBegin = fStaffAllVoicesMap.begin (), - iEnd = fStaffAllVoicesMap.end (), - i = iBegin; - - for ( ; ; ) { - S_msrVoice - voice = - (*i).second; - - os << - left << - voice->getVoiceName () << - " (" << - singularOrPlural ( - voice->getVoiceActualNotesCounter (), - "actual note", - "actual notes") << - ", " << - singularOrPlural ( - voice->getVoiceStanzasMap ().size (), - "stanza", - "stanzas") << - ")"; - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter --; - } - - gIndenter--; - - os << endl; -} - -ostream& operator<< (ostream& os, const S_msrStaff& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrVoiceStaffChange msrVoiceStaffChange::create ( - int inputLineNumber, - S_msrStaff staffToChangeTo) -{ - msrVoiceStaffChange* o = - new msrVoiceStaffChange ( - inputLineNumber, staffToChangeTo); - assert(o!=0); - return o; -} - -msrVoiceStaffChange::msrVoiceStaffChange ( - int inputLineNumber, - S_msrStaff staffToChangeTo) - : msrMeasureElement (inputLineNumber) -{ - fStaffToChangeTo = staffToChangeTo; -} - -msrVoiceStaffChange::~msrVoiceStaffChange () -{} - -S_msrVoiceStaffChange msrVoiceStaffChange::createStaffChangeNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffChanges) { - gLogOstream << - "Creating a newborn clone of voice staff change '" << - asString () << - "'" << - endl; - } -#endif - - S_msrVoiceStaffChange - newbornClone = - msrVoiceStaffChange::create ( - fInputLineNumber, - fStaffToChangeTo); - - return newbornClone; -} - -void msrVoiceStaffChange::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVoiceStaffChange::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVoiceStaffChange elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVoiceStaffChange::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrVoiceStaffChange::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVoiceStaffChange::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVoiceStaffChange elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVoiceStaffChange::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrVoiceStaffChange::browseData (basevisitor* v) -{} - -string msrVoiceStaffChange::asString () const -{ - stringstream s; - - s << - "VoiceStaffChange" << - ", line " << fInputLineNumber << - ", " << - "staffToChangeTo: \"" << fStaffToChangeTo->getStaffName () << "\""; - - return s.str (); -} - -void msrVoiceStaffChange::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrVoiceStaffChange& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrStavesDetails.cpp b/src/lilypond/msrStavesDetails.cpp deleted file mode 100644 index 6dcd418b5..000000000 --- a/src/lilypond/msrStavesDetails.cpp +++ /dev/null @@ -1,445 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrStavesDetails.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrStaffTuning msrStaffTuning::create ( - int inputLineNumber, - int staffTuningLineNumber, - msrQuarterTonesPitchKind quarterTonesPitchKind, - int staffTuningOctave) -{ - msrStaffTuning* o = - new msrStaffTuning ( - inputLineNumber, - staffTuningLineNumber, - quarterTonesPitchKind, - staffTuningOctave); - assert(o!=0); - return o; -} - -msrStaffTuning::msrStaffTuning ( - int inputLineNumber, - int staffTuningLineNumber, - msrQuarterTonesPitchKind quarterTonesPitchKind, - int staffTuningOctave) - : msrElement (inputLineNumber) -{ - fStaffTuningLineNumber = staffTuningLineNumber; - fStaffTuningQuarterTonesPitchKind = quarterTonesPitchKind; - fStaffTuningOctave = staffTuningOctave; -} - -msrStaffTuning::~ msrStaffTuning () -{} - -S_msrStaffTuning msrStaffTuning::createStaffTuningNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffDetails) { - gLogOstream << - "Creating a newborn clone of staff tuning '" << - asString () << - "'" << - endl; - } -#endif - - S_msrStaffTuning - newbornClone = - msrStaffTuning::create ( - fInputLineNumber, - fStaffTuningLineNumber, - fStaffTuningQuarterTonesPitchKind, - fStaffTuningOctave); - - return newbornClone; -} - -void msrStaffTuning::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStaffTuning::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStaffTuning elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStaffTuning::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrStaffTuning::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStaffTuning::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStaffTuning elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStaffTuning::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrStaffTuning::browseData (basevisitor* v) -{} - -string msrStaffTuning::asString () const -{ - stringstream s; - - s << - "StaffTuning" << - ", line " << fStaffTuningLineNumber << - ", " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fStaffTuningQuarterTonesPitchKind) << - ", octave " << fStaffTuningOctave; - - return s.str (); -} - -void msrStaffTuning::print (ostream& os) const -{ - os << - "StaffTuning" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 29; - - os << left << - setw (fieldWidth) << - "staffTuningLineNumber" << " : " << - fStaffTuningLineNumber << - endl << - setw (fieldWidth) << - "staffTuningQuarterTonesPitch" << " : " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fStaffTuningQuarterTonesPitchKind) << - endl << - setw (fieldWidth) << - "staffTuningOctave" << " : " << - fStaffTuningOctave << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrStaffTuning& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrStaffDetails msrStaffDetails::create ( - int inputLineNumber, - msrStaffTypeKind staffTypeKind, - msrShowFretsKind showFretsKind, - msrPrintObjectKind printObjectKind, - msrPrintSpacingKind printSpacingKind) -{ - msrStaffDetails* o = - new msrStaffDetails ( - inputLineNumber, - staffTypeKind, - showFretsKind, - printObjectKind, - printSpacingKind); - assert(o!=0); - return o; -} - -msrStaffDetails::msrStaffDetails ( - int inputLineNumber, - msrStaffTypeKind staffTypeKind, - msrShowFretsKind showFretsKind, - msrPrintObjectKind printObjectKind, - msrPrintSpacingKind printSpacingKind) - : msrMeasureElement (inputLineNumber) -{ - fStaffTypeKind = staffTypeKind; - - fStaffLinesNumber = 5; // default value JMI ??? - - fShowFretsKind = showFretsKind; - - fPrintObjectKind = printObjectKind; - fPrintSpacingKind = printSpacingKind; -} - -msrStaffDetails::~msrStaffDetails () -{} - -void msrStaffDetails::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStaffDetails::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStaffDetails elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStaffDetails::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrStaffDetails::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStaffDetails::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStaffDetails elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStaffDetails::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrStaffDetails::browseData (basevisitor* v) -{ - if (fStaffTuningsList.size ()) { - for ( - list::const_iterator i = fStaffTuningsList.begin (); - i != fStaffTuningsList.end (); - i++ - ) { - // browse the staff tuning - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrStaffDetails::staffTypeKindAsString ( - msrStaffTypeKind staffTypeKind) -{ - string result; - - switch (staffTypeKind) { - case msrStaffDetails::kRegularStaffType: - result = "regularStaffType"; - break; - case msrStaffDetails::kOssiaStaffType: - result = "ossiaStaffType"; - break; - case msrStaffDetails::kCueStaffType: - result = "cueStaffType"; - break; - case msrStaffDetails::kEditorialStaffType: - result = "editorialStaffType"; - break; - case msrStaffDetails::kAlternateStaffType: - result = "alternateStaffType"; - break; - } // switch - - return result; -} - -string msrStaffDetails::showFretsKindAsString ( - msrShowFretsKind showFretsKind) -{ - string result; - - switch (showFretsKind) { - case msrStaffDetails::kShowFretsNumbers: - result = "showFretsNumbers"; - break; - case msrStaffDetails::kShowFretsLetters: - result = "showFretsLetters"; - break; - } // switch - - return result; -} - -string msrStaffDetails::printSpacingKindAsString ( - msrPrintSpacingKind printSpacingKind) -{ - string result; - - switch (printSpacingKind) { - case msrStaffDetails::kPrintSpacingYes: - result = "printSpacingYes"; - break; - case msrStaffDetails::kPrintSpacingNo: - result = "printSpacingNo"; - break; - } // switch - - return result; -} - -string msrStaffDetails::asShortString () const -{ - stringstream s; - - s << - "StaffDetails" << - ", staffTypeKind" << - staffTypeKindAsString (fStaffTypeKind) << - ", line " << fInputLineNumber << - endl; - - // print the staff lines number - s << ", staffLinesNumber: " << fStaffLinesNumber; - - // print the staff tunings if any - s << - ", StaffTunings: " << fStaffTuningsList.size (); - - s << - ", showFretsKind = " << - showFretsKindAsString (fShowFretsKind) << - ", printObjectKind = " << - msrPrintObjectKindAsString (fPrintObjectKind) << - ", printSpacingKind = " << - printSpacingKindAsString (fPrintSpacingKind); - - return s.str (); -} - -void msrStaffDetails::print (ostream& os) const -{ - os << - "StaffDetails" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 17; - - os << left << - setw (fieldWidth) << - "staffTypeKind" << " : " << - staffTypeKindAsString (fStaffTypeKind) << - endl << - setw (fieldWidth) << - "staffLinesNumber" << " : " << fStaffLinesNumber << - endl; - - // print the staff tunings if any - if (fStaffTuningsList.size ()) { - os << endl; - - list::const_iterator - iBegin = fStaffTuningsList.begin (), - iEnd = fStaffTuningsList.end (), - i = iBegin; - - gIndenter++; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - os << endl; - - gIndenter--; - } - else { - os << left << - setw (fieldWidth) << - "staffTunings" << " : " << "none" << - endl; - } - - os << left << - setw (fieldWidth) << - "showFretsKind" << " : " << - showFretsKindAsString (fShowFretsKind) << - endl << - setw (fieldWidth) << - "printObjectKind" << " : " << - msrPrintObjectKindAsString (fPrintObjectKind) << - endl << - setw (fieldWidth) << - "printSpacingKind" << " : " << - printSpacingKindAsString (fPrintSpacingKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrStaffDetails& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrStavesDetails.h b/src/lilypond/msrStavesDetails.h deleted file mode 100644 index b95d1becc..000000000 --- a/src/lilypond/msrStavesDetails.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrStavesDetails___ -#define ___msrStavesDetails___ - -#include - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrStaffTuning : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int staffTuningLineNumber, - msrQuarterTonesPitchKind quarterTonesPitchKind, - int staffTuningOctave); - - SMARTP createStaffTuningNewbornClone (); - - SMARTP createStaffTuningDeepCopy (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrStaffTuning ( - int inputLineNumber, - int staffTuningLineNumber, - msrQuarterTonesPitchKind quarterTonesPitchKind, - int staffTuningOctave); - - ~ msrStaffTuning (); - - public: - - // set and get - // ------------------------------------------------------ - - int getStaffTuningLineNumber () const - { return fStaffTuningLineNumber; } - - msrQuarterTonesPitchKind - getStaffTuningQuarterTonesPitchKind () const - { return fStaffTuningQuarterTonesPitchKind; } - - int getStaffTuningOctave () const - { return fStaffTuningOctave; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - public: - - // fields - // ------------------------------------------------------ - - int fStaffTuningLineNumber; - - msrQuarterTonesPitchKind - fStaffTuningQuarterTonesPitchKind; - int fStaffTuningOctave; -}; -typedef SMARTP S_msrStaffTuning; -EXP ostream& operator<< (ostream& os, const S_msrStaffTuning& elt); - -//______________________________________________________________________________ -class msrStaffDetails : public msrMeasureElement -{ - public: - - - // data types - // ------------------------------------------------------ - - enum msrStaffTypeKind { - kRegularStaffType, - kOssiaStaffType, kCueStaffType, kEditorialStaffType, - kAlternateStaffType}; - - static string staffTypeKindAsString ( - msrStaffTypeKind staffTypeKind); - - enum msrShowFretsKind { - kShowFretsNumbers, kShowFretsLetters}; - - static string showFretsKindAsString ( - msrShowFretsKind showFretsKind); - - enum msrPrintSpacingKind { - kPrintSpacingYes, kPrintSpacingNo}; - - static string printSpacingKindAsString ( - msrPrintSpacingKind printSpacingKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrStaffTypeKind staffTypeKind, - msrShowFretsKind showFretsKind, - msrPrintObjectKind printObjectKind, - msrPrintSpacingKind printSpacingKin); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrStaffDetails ( - int inputLineNumber, - msrStaffTypeKind staffTypeKind, - msrShowFretsKind showFretsKind, - msrPrintObjectKind printObjectKind, - msrPrintSpacingKind printSpacingKin); - - virtual ~msrStaffDetails (); - - public: - - // set and get - // ------------------------------------------------------ - - msrStaffTypeKind getStaffTypeKind () const - { return fStaffTypeKind; } - - void setStaffLinesNumber ( - int staffLinesNumber) - { fStaffLinesNumber = staffLinesNumber; } - - int getStaffLinesNumber () const - { return fStaffLinesNumber; } - - const list& - getStaffTuningsList () const - { return fStaffTuningsList; } - - msrShowFretsKind getShowFretsKind () const - { return fShowFretsKind; } - - msrPrintObjectKind getPrintObjectKind () const - { return fPrintObjectKind; } - - msrPrintSpacingKind getPrintSpacingKind () const - { return fPrintSpacingKind; } - - // services - // ------------------------------------------------------ - - void addStaffTuningToStaffDetails ( - S_msrStaffTuning staffTuning) - { - fStaffTuningsList.push_back (staffTuning); - } - - string asShortString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrStaffTypeKind fStaffTypeKind; - - int fStaffLinesNumber; - list - fStaffTuningsList; - - msrShowFretsKind fShowFretsKind; - - msrPrintObjectKind fPrintObjectKind; - msrPrintSpacingKind fPrintSpacingKind; -}; -typedef SMARTP S_msrStaffDetails; -EXP ostream& operator<< (ostream& os, const S_msrStaffDetails& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrStaves_MUT_DEP.h b/src/lilypond/msrStaves_MUT_DEP.h deleted file mode 100644 index 0bad7782a..000000000 --- a/src/lilypond/msrStaves_MUT_DEP.h +++ /dev/null @@ -1,515 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrVoiceStaffChange : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrStaff staffToChangeTo); - - SMARTP createStaffChangeNewbornClone (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrVoiceStaffChange ( - int inputLineNumber, - S_msrStaff staffToChangeTo); - - virtual ~msrVoiceStaffChange (); - - public: - - // set and get - // ------------------------------------------------------ - - S_msrStaff getStaffToChangeTo () const - { return fStaffToChangeTo; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - S_msrStaff fStaffToChangeTo; -}; -typedef SMARTP S_msrVoiceStaffChange; -EXP ostream& operator<< (ostream& os, const S_msrVoiceStaffChange& elt); - -//______________________________________________________________________________ -class msrStaff : public msrElement -{ - public: - - // constants - // ------------------------------------------------------ - - #define K_NO_STAFF_NUMBER -777 - - // data types - // ------------------------------------------------------ - - enum msrStaffKind { - kStaffRegular, - kStaffTablature, - kStaffHarmony, - kStaffFiguredBass, - kStaffDrum, - kStaffRythmic }; - - static string staffKindAsString ( - msrStaffKind staffKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrStaffKind staffKind, - int staffNumber, - S_msrPart staffPartUpLink); - - SMARTP createStaffNewbornClone ( - S_msrPart containingPart); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrStaff ( - int inputLineNumber, - msrStaffKind staffKind, - int staffNumber, - S_msrPart staffPartUpLink); - - virtual ~msrStaff (); - - private: - - // initialization - // ------------------------------------------------------ - - void initializeStaff (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - - S_msrPart getStaffPartUpLink () const - { return fStaffPartUpLink; } - - // staff kind - - msrStaffKind getStaffKind () const - { return fStaffKind; } - - // staff number and name - - int getStaffNumber () const - { return fStaffNumber; } - - string getStaffName () const - { return fStaffName; } - - string getStaffInstrumentName () const - { return fStaffInstrumentName; } - - string getStaffInstrumentAbbreviation () const - { return fStaffInstrumentAbbreviation; } - - // voices - - int getStaffRegularVoicesCounter () const - { return fStaffRegularVoicesCounter; } - - // staff details - - S_msrStaffDetails getCurrentStaffStaffDetails () const - { return fCurrentStaffStaffDetails; } - - // staff voices - - const map& - getStaffAllVoicesMap () const - { return fStaffAllVoicesMap; } - - const map& - getStaffRegularVoicesMap () const - { - return - fStaffRegularVoicesMap; - } - - const list& - getStaffAllVoicesVector () const - { - return - fStaffAllVoicesList; - } - - // services - // ------------------------------------------------------ - - // staff details - - void appendStaffDetailsToStaff ( - S_msrStaffDetails staffDetails); - - // clef, key, time - - void appendClefToStaff (S_msrClef clef); - - void appendKeyToStaff (S_msrKey key); - - void appendTimeToStaff (S_msrTime time); - void appendTimeToStaffClone (S_msrTime time); - - // transpose - - void appendTransposeToStaff ( - S_msrTranspose transpose); - - // part name display - - void appendPartNameDisplayToStaff ( - S_msrPartNameDisplay partNameDisplay); - - // part abbreviation display - - void appendPartAbbreviationDisplayToStaff ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay); - - // voices - - S_msrVoice createVoiceInStaffByItsNumber ( - int inputLineNumber, - msrVoice::msrVoiceKind voiceKind, - int voiceNumber, - string currentMeasureNumber); - - void registerVoiceInStaff ( - int inputLineNumber, - S_msrVoice voice); - - void registerVoiceByItsNumber ( - int inputLineNumber, - int voiceNumber, - S_msrVoice voice); - - void registerVoiceInRegularVoicesMapByItsNumberByItsNumber ( - int voiceNumber, - S_msrVoice voice); - - void registerVoiceInAllVoicesList ( - int voiceNumber, - S_msrVoice voice); - - S_msrVoice fetchVoiceFromStaffByItsNumber ( - int inputLineNumber, - int voiceNumber); - - S_msrVoice fetchFirstRegularVoiceFromStaff ( - int inputLineNumber); - - void assignSequentialNumbersToRegularVoicesInStaff ( - int inputLineNumber); - - void addAVoiceToStaffIfItHasNone ( - int inputLineNumber); - - // measures - - void createMeasureAndAppendItToStaff ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind); - - void setNextMeasureNumberInStaff ( - int inputLineNumber, - string nextMeasureNumber); - - // repeats - - void handleRepeatStartInStaff ( - int inputLineNumber); - - void handleRepeatEndInStaff ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - - void handleRepeatEndingStartInStaff ( - int inputLineNumber); - - void handleRepeatEndingEndInStaff ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind); - -/* JMI - void finalizeRepeatEndInStaff ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - */ - - void createMeasuresRepeatFromItsFirstMeasuresInStaff ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber); - - void appendPendingMeasuresRepeatToStaff ( - int inputLineNumber); - - void createRestMeasuresInStaff ( - int inputLineNumber, - int restMeasuresNumber); - - void appendPendingRestMeasuresToStaff ( - int inputLineNumber); - - void appendRestMeasuresCloneToStaff ( - int inputLineNumber, - S_msrRestMeasures restMeasures); - - void createBeatsRepeatFromItsFirstMeasuresInStaff ( - int inputLineNumber, - int beatsRepeatMeasuresNumber, - int beatsRepeatSlashesNumber); - - void appendRepeatCloneToStaff ( - int inputLineNumber, - S_msrRepeat repeatCLone); - - void appendRepeatEndingCloneToStaff ( - S_msrRepeatEnding repeatEndingClone); - - // barlines - - void appendBarlineToStaff (S_msrBarline barline); - - // transpose - - void appendTransposeToAllStaffVoices ( // JMI - S_msrTranspose transpose); - - // part name display - - void appendPartNameDisplayToAllStaffVoices ( // JMI - S_msrPartNameDisplay partNameDisplay); - - // part abbreviation display - - void appendPartAbbreviationDisplayToAllStaffVoices ( // JMI - S_msrPartAbbreviationDisplay partAbbreviationDisplay); - - // scordaturas - - void appendScordaturaToStaff ( - S_msrScordatura scordatura); - - // accordion registration - - void appendAccordionRegistrationToStaff ( - S_msrAccordionRegistration - accordionRegistration); - - // harp pedals tuning - - void appendHarpPedalsTuningToStaff ( - S_msrHarpPedalsTuning - harpPedalsTuning); - - // strings - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - // staff number - - string staffNumberAsString (); - - string staffKindAsString () const; - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os); - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - - S_msrPart fStaffPartUpLink; - - // staff name - - string fStaffName; - - // staff kind - - msrStaffKind fStaffKind; - - // staff number - - int fStaffNumber; - - // staff instrument name - - string fStaffInstrumentName; - string fStaffInstrumentAbbreviation; - - // staff voices - - static int gStaffMaxRegularVoices; - - // the dictionary of all the voices in the staff - map fStaffAllVoicesMap; - - // we need to handle the regular voice specifically - // to assign them sequencing numbers from 1 to gMaxStaffVoices, - // needed to set the beams orientation (up or down) - int fStaffRegularVoicesCounter; - map fStaffRegularVoicesMap; - - // harmonies and figured basses should be placed - // in the first regular voice of the staff, hence: - list fStaffRegularVoicesList; - - // we need to sort the voices by increasing voice numbers, - // but with harmony voices right before the corresponding regular voices - list fStaffAllVoicesList; - - // staff details - - S_msrStaffDetails fCurrentStaffStaffDetails; - - // rest measures - - bool fStaffContainsRestMeasures; - - public: - - // public work services - // ------------------------------------------------------ - - // clef, key, time - - void setStaffCurrentClef (S_msrClef clef); - - S_msrClef getStaffCurrentClef () const - { return fStaffCurrentClef; } - - void setStaffCurrentKey (S_msrKey key); - - S_msrKey getStaffCurrentKey () const - { return fStaffCurrentKey; } - - void setStaffCurrentTime (S_msrTime time); - - S_msrTime getStaffCurrentTime () const - { return fStaffCurrentTime; } - - // finalization - - void finalizeCurrentMeasureInStaff ( - int inputLineNumber); - - void finalizeStaff ( - int inputLineNumber); - - private: - - // private work services - // ------------------------------------------------------ - - // transpose - - S_msrTranspose getStaffCurrentTranspose () const - { return fStaffCurrentTranspose; } - - // voices ordering in staves - - static bool compareVoicesByIncreasingNumber ( - const S_msrVoice& first, - const S_msrVoice& second); - - static bool compareVoicesToHaveHarmoniesAboveCorrespondingVoice ( - const S_msrVoice& first, - const S_msrVoice& second); - - static bool compareVoicesToHaveFiguredBassesBelowCorrespondingVoice ( - const S_msrVoice& first, - const S_msrVoice& second); - - private: - - // work fields - // ------------------------------------------------------ - - // clef, key, time - - S_msrClef fStaffCurrentClef; - - S_msrKey fStaffCurrentKey; - - S_msrTime fStaffCurrentTime; - - // transpose - - S_msrTranspose fStaffCurrentTranspose; -}; -typedef SMARTP S_msrStaff; -EXP ostream& operator<< (ostream& os, const S_msrStaff& elt); diff --git a/src/lilypond/msrStems.cpp b/src/lilypond/msrStems.cpp deleted file mode 100644 index c9e352b60..000000000 --- a/src/lilypond/msrStems.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrStems.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrStem msrStem::create ( - int inputLineNumber, - msrStemKind stemKind) -{ - msrStem* o = - new msrStem ( - inputLineNumber, stemKind); - assert(o!=0); - return o; -} - -msrStem::msrStem ( - int inputLineNumber, - msrStemKind stemKind) - : msrElement (inputLineNumber) -{ - fStemKind = stemKind; -} - -msrStem::~msrStem () -{} - -void msrStem::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStem::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStem elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStem::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrStem::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrStem::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrStem elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrStem::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrStem::browseData (basevisitor* v) -{} - -string msrStem::stemKindAsString ( - msrStemKind stemKind) -{ - string result; - - switch (stemKind) { - case kStemNone: - result = "stemNone"; - break; - case kStemUp: - result = "stemUp"; - break; - case kStemDown: - result = "stemDown"; - break; - case kStemDouble: - result = "stemDouble"; - break; - } // switch - - return result; -} - -string msrStem::asString () const -{ - stringstream s; - - s << - "Stem" << - ", fStemKind: " << - stemKindAsString (fStemKind) << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrStem::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrStem& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrStems.h b/src/lilypond/msrStems.h deleted file mode 100644 index bfdd10609..000000000 --- a/src/lilypond/msrStems.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrStems___ -#define ___msrStems___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrStem : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrStemKind { - kStemNone, - kStemUp, kStemDown, kStemDouble}; - - static string stemKindAsString ( - msrStemKind stemKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrStemKind stemKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrStem ( - int inputLineNumber, - msrStemKind stemKind); - - virtual ~msrStem (); - - public: - - // set and get - // ------------------------------------------------------ - - msrStemKind getStemKind () const - { return fStemKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrStemKind fStemKind; -}; -typedef SMARTP S_msrStem; -EXP ostream& operator<< (ostream& os, const S_msrStem& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrSyllables.cpp b/src/lilypond/msrSyllables.cpp deleted file mode 100644 index 640341190..000000000 --- a/src/lilypond/msrSyllables.cpp +++ /dev/null @@ -1,710 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrSyllable msrSyllable::create ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink) -{ - msrSyllable* o = - new msrSyllable ( - inputLineNumber, - syllableKind, - syllableExtendKind, - syllableWholeNotes, - syllableTupletFactor, - syllableStanzaUpLink); - assert(o!=0); - - return o; -} - -S_msrSyllable msrSyllable::createWithNextMeasurePuristNumber ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink, - int syllableNextMeasurePuristNumber) -{ - msrSyllable* o = - new msrSyllable ( - inputLineNumber, - syllableKind, - syllableExtendKind, - syllableWholeNotes, - syllableTupletFactor, - syllableStanzaUpLink, - syllableNextMeasurePuristNumber); - assert(o!=0); - - return o; -} - -msrSyllable::msrSyllable ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink) - : msrMeasureElement (inputLineNumber) -{ - // sanity check - msrAssert( - syllableStanzaUpLink != nullptr, - "syllableStanzaUpLink is null"); - - // set syllable's stanza upLink - fSyllableStanzaUpLink = - syllableStanzaUpLink; - - fSyllableKind = syllableKind; - - fSyllableExtendKind = syllableExtendKind; - - // fSyllableNoteUpLink will be set - // by appendSyllableToNoteAndSetItsNoteUpLink () later - - fSyllableWholeNotes = syllableWholeNotes; - - fSyllableTupletFactor = syllableTupletFactor; - - fSyllableNextMeasurePuristNumber = -1; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Creating a syllable containing:" << - endl; - - gIndenter++; - - print (gLogOstream); - - gIndenter--; - } -#endif -} - -msrSyllable::msrSyllable ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink, - int syllableNextMeasurePuristNumber) - : msrSyllable ( - inputLineNumber, - syllableKind, - syllableExtendKind, - syllableWholeNotes, - syllableTupletFactor, - syllableStanzaUpLink) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Setting syllable next measure purist number to " << - fSyllableNextMeasurePuristNumber << - endl; - } -#endif - - switch (fSyllableKind) { - case msrSyllable::kSyllableNone: - case msrSyllable::kSyllableSingle: - case msrSyllable::kSyllableBegin: - case msrSyllable::kSyllableMiddle: - case msrSyllable::kSyllableEnd: - case msrSyllable::kSyllableOnRestNote: - case msrSyllable::kSyllableSkipRestNote: - case msrSyllable::kSyllableSkipNonRestNote: - case msrSyllable::kSyllableMeasureEnd: - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "syllable with next measure purist number is no line nor page break"); - break; - - case msrSyllable::kSyllableLineBreak: - case msrSyllable::kSyllablePageBreak: - break; - } // switch - - fSyllableNextMeasurePuristNumber = syllableNextMeasurePuristNumber; -} - -msrSyllable::~msrSyllable () -{} - -S_msrSyllable msrSyllable::createSyllableNewbornClone ( - S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Creating a newborn clone of syllable '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - - S_msrSyllable - newbornClone = - msrSyllable::create ( - fInputLineNumber, - fSyllableKind, - fSyllableExtendKind, - fSyllableWholeNotes, - fSyllableTupletFactor, - fSyllableStanzaUpLink); - - // append the lyric texts to the syllable clone - for ( - list::const_iterator i = fSyllableTextsList.begin (); - i!=fSyllableTextsList.end (); - i++ - ) { - newbornClone-> - appendLyricTextToSyllable ((*i)); - } // for - - // dont't set 'newbornClone->fSyllableStanzaUpLink' - // nor 'newbornClone->fSyllableNoteUpLink', - // this will be done by the caller - - newbornClone->fSyllableNoteUpLink = - fSyllableNoteUpLink; // TEMP - - return newbornClone; -} - -S_msrSyllable msrSyllable::createSyllableDeepCopy ( - S_msrPart containingPart) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Creating a newborn clone of syllable '" << - asString () << - "'" << - endl; - } -#endif - - // sanity check - msrAssert( - containingPart != nullptr, - "containingPart is null"); - - S_msrSyllable - syllableDeepCopy = - msrSyllable::create ( - fInputLineNumber, - fSyllableKind, - fSyllableExtendKind, - fSyllableWholeNotes, - fSyllableTupletFactor, - fSyllableStanzaUpLink); - - // append the lyric texts to the syllable deep copy - for ( - list::const_iterator i = fSyllableTextsList.begin (); - i!=fSyllableTextsList.end (); - i++ - ) { - syllableDeepCopy-> - appendLyricTextToSyllable ((*i)); - } // for - - // dont't set 'newbornClone->fSyllableStanzaUpLink' - // nor 'newbornClone->fSyllableNoteUpLink', - // this will be done by the caller - - syllableDeepCopy->fSyllableNoteUpLink = - fSyllableNoteUpLink; // TEMP - - return syllableDeepCopy; -} - -void msrSyllable::appendLyricTextToSyllable (string text) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending text \"" << - text << - "\" to the texts list of syllable '" << - asString () << - "'" << - endl; - } -#endif - - fSyllableTextsList.push_back ( - text); -} - -void msrSyllable::appendSyllableToNoteAndSetItsNoteUpLink ( - S_msrNote note) -{ - // sanity check - msrAssert ( - note != nullptr, - "note is empty"); - - fSyllableNoteUpLink = note; - -/* - // sanity check JMI ??? - msrAssert ( - fSyllableTextsList.size () != 0, - "fSyllableTextsList is empty"); - */ - - // append syllable to note - note-> - appendSyllableToNote (this); - - // set it upLink to note -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Setting syllable note upLink for:" << - endl; - - gIndenter++; - - gLogOstream << - asString () << - // JMI "to '" << note->asString () << - ", line " << note->getInputLineNumber () << - endl; - - gIndenter--; - } -#endif -} - -void msrSyllable::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSyllable::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSyllable elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSyllable::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrSyllable::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrSyllable::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrSyllable elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrSyllable::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrSyllable::browseData (basevisitor* v) -{} - -string msrSyllable::syllableWholeNotesAsMsrString () const -{ - string result; - - if (fSyllableNoteUpLink) { // JMI - switch (fSyllableNoteUpLink->getNoteKind ()) { - case msrNote::k_NoNoteKind: - case msrNote::kRestNote: - case msrNote::kUnpitchedNote: - case msrNote::kStandaloneNote: - case msrNote::kDoubleTremoloMemberNote: - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - case msrNote::kChordMemberNote: - result = - wholeNotesAsMsrString ( - fInputLineNumber, - fSyllableWholeNotes); - break; - - case msrNote::kSkipNote: - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - { - stringstream s; - - s << - fSyllableNoteUpLink-> - // JMI noteSoundingWholeNotesAsMsrString () << - noteDisplayWholeNotesAsMsrString () << - "*" << - fSyllableTupletFactor.getTupletNormalNotes () << - "/" << - fSyllableTupletFactor.getTupletActualNotes (); - - result = s.str (); - } - break; - } // switch - } - - else { - result = - wholeNotesAsMsrString ( - fInputLineNumber, - fSyllableWholeNotes); - } - - return result; -} - -string msrSyllable::syllableKindAsString ( - msrSyllableKind syllableKind) -{ - string result; - - switch (syllableKind) { - case msrSyllable::kSyllableNone: - result = "syllableNone"; - break; - - case msrSyllable::kSyllableSingle: - result = "syllableSingle"; - break; - - case msrSyllable::kSyllableBegin: - result = "syllableBegin"; - break; - case msrSyllable::kSyllableMiddle: - result = "syllableMiddle"; - break; - case msrSyllable::kSyllableEnd: - result = "syllableEnd"; - break; - - case msrSyllable::kSyllableOnRestNote: - result = "syllableOnRestNote"; - break; - - case msrSyllable::kSyllableSkipRestNote: - result = "syllableSkipRestNote"; - break; - case msrSyllable::kSyllableSkipNonRestNote: - result = "syllableSkipNonRestNote"; - break; - - case msrSyllable::kSyllableMeasureEnd: - result = "syllableMeasureEnd"; - break; - - case msrSyllable::kSyllableLineBreak: - result = "syllableLineBreak"; - break; - case msrSyllable::kSyllablePageBreak: - result = "syllablePageBreak"; - break; - } // switch - - return result; -} - -string msrSyllable::syllableKindAsString () const -{ - return syllableKindAsString (fSyllableKind); -} - -string msrSyllable::syllableExtendKindAsString ( - msrSyllableExtendKind syllableExtendKind) -{ - string result; - - switch (syllableExtendKind) { - case msrSyllable::kSyllableExtendNone: - result = "syllableExtendNone"; - break; - case msrSyllable::kSyllableExtendSingle: - result = "syllableExtendSingle"; - break; - case msrSyllable::kSyllableExtendStart: - result = "syllableExtendStart"; - break; - case msrSyllable::kSyllableExtendContinue: - result = "syllableExtendContinue"; - break; - case msrSyllable::kSyllableExtendStop: - result = "syllableExtendStop"; - break; - } // switch - - return result; -} - -string msrSyllable::syllableExtendKindAsString () const -{ - return syllableExtendKindAsString (fSyllableExtendKind); -} - -string msrSyllable::syllableNoteUpLinkAsString () const -{ - string result; - - if (fSyllableNoteUpLink) { - result = fSyllableNoteUpLink->asString (); - } - else { - result = "none"; - } - - return result; -} - -string msrSyllable::syllableTextsListAsString () const -{ - stringstream s; - - if (fSyllableTextsList.size ()) { - list::const_iterator - iBegin = fSyllableTextsList.begin (), - iEnd = fSyllableTextsList.end (), - i = iBegin; - - for ( ; ; ) { - s << doubleQuoteStringIfNonAlpha (*i); - if (++i == iEnd) break; - s << ", "; - } // for - } - - return s.str (); -} - -void msrSyllable::writeTextsList ( - const list& textsList, - ostream& os) -{ - os << "["; - - if (textsList.size ()) { - list::const_iterator - iBegin = textsList.begin (), - iEnd = textsList.end (), - i = iBegin; - - for ( ; ; ) { - os << doubleQuoteStringIfNonAlpha (*i); - if (++i == iEnd) break; - os << ", "; - } // for - } - - os << "]"; -} - -string msrSyllable::asString () const -{ - stringstream s; - - s << - "Syllable '" << - syllableKindAsString () << - "', syllableExtendKind: " << - syllableExtendKindAsString (fSyllableExtendKind) << - ", syllableWholeNotes: " << fSyllableWholeNotes << - ", syllableTupletFactor: " << fSyllableTupletFactor << - ", syllableNextMeasurePuristNumber: " << fSyllableNextMeasurePuristNumber << - ", line " << fInputLineNumber << - ", syllableTextsList: "; - - writeTextsList ( - fSyllableTextsList, - s); - - s << - ", " << - syllableNoteUpLinkAsString (); - - switch (fSyllableKind) { - case msrSyllable::kSyllableNone: - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "syllable type has not been set"); - break; - - case msrSyllable::kSyllableSingle: - case msrSyllable::kSyllableBegin: - case msrSyllable::kSyllableMiddle: - case msrSyllable::kSyllableEnd: - case msrSyllable::kSyllableOnRestNote: - case msrSyllable::kSyllableSkipRestNote: - case msrSyllable::kSyllableSkipNonRestNote: - case msrSyllable::kSyllableMeasureEnd: - case msrSyllable::kSyllableLineBreak: - case msrSyllable::kSyllablePageBreak: - break; - } // switch - - s << - ", attached to note " << - fSyllableNoteUpLink->asShortString () << - ", in stanza " << - fSyllableStanzaUpLink->getStanzaName (); - - return s.str (); -} - -void msrSyllable::print (ostream& os) const -{ - os << - "Syllable" << - ", syllableKind: " << - syllableKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 32; - os << left << - setw (fieldWidth) << - "syllableNoteUpLink" << " : " << - syllableNoteUpLinkAsString () << - endl << - setw (fieldWidth) << - "syllableStanzaUpLink" << " : " << - fSyllableStanzaUpLink->getStanzaName () << - endl << - - setw (fieldWidth) << - "syllableKind" << " : " << - syllableKindAsString (fSyllableKind) << - endl << - setw (fieldWidth) << - "syllableExtendKind" << " : " << - syllableExtendKindAsString ( - fSyllableExtendKind) << - endl << - - setw (fieldWidth) << - "syllableWholeNotes" << " : " << - fSyllableWholeNotes << - endl << - - setw (fieldWidth) << - "syllableTupletFactor" << " : " << - fSyllableTupletFactor.asString () << - endl << - - setw (fieldWidth) << - "syllableNextMeasurePuristNumber" << " : " << - fSyllableNextMeasurePuristNumber << - endl; - - os << left << - setw (fieldWidth) << - "syllableTextsList" << " : "; - - writeTextsList ( - fSyllableTextsList, - os); - - switch (fSyllableKind) { // JMI - case msrSyllable::kSyllableNone: - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "syllable type has not been set"); - break; - - case msrSyllable::kSyllableSingle: - case msrSyllable::kSyllableBegin: - case msrSyllable::kSyllableMiddle: - case msrSyllable::kSyllableEnd: - case msrSyllable::kSyllableOnRestNote: - case msrSyllable::kSyllableSkipRestNote: - case msrSyllable::kSyllableSkipNonRestNote: - case msrSyllable::kSyllableMeasureEnd: - case msrSyllable::kSyllableLineBreak: - case msrSyllable::kSyllablePageBreak: - break; - } // switch - os << endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrSyllable& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrSyllables_MUT_DEP.h b/src/lilypond/msrSyllables_MUT_DEP.h deleted file mode 100644 index 716fc649d..000000000 --- a/src/lilypond/msrSyllables_MUT_DEP.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrSyllable : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - // we want to end the line in the LilyPond code at a break - enum msrSyllableKind { - kSyllableNone, - kSyllableSingle, - kSyllableBegin, kSyllableMiddle, kSyllableEnd, - - kSyllableOnRestNote, - kSyllableSkipRestNote, - kSyllableSkipNonRestNote, - - kSyllableMeasureEnd, - kSyllableLineBreak, kSyllablePageBreak}; - - static string syllableKindAsString ( - msrSyllableKind syllableKind); - - enum msrSyllableExtendKind { - kSyllableExtendNone, - kSyllableExtendSingle, - kSyllableExtendStart, kSyllableExtendContinue, kSyllableExtendStop }; - - static string syllableExtendKindAsString ( - msrSyllableExtendKind syllableExtendKind); - - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink); - - static SMARTP createWithNextMeasurePuristNumber ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink, - int syllableNextMeasurePuristNumber); - - SMARTP createSyllableNewbornClone ( - S_msrPart containingPart); // JMI - - SMARTP createSyllableDeepCopy ( - S_msrPart containingPart); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrSyllable ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink); - - msrSyllable ( - int inputLineNumber, - msrSyllableKind syllableKind, - msrSyllableExtendKind syllableExtendKind, - rational syllableWholeNotes, - msrTupletFactor syllableTupletFactor, - S_msrStanza syllableStanzaUpLink, - int syllableNextMeasurePuristNumber); - - virtual ~msrSyllable (); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - S_msrNote getSyllableNoteUpLink () const - { return fSyllableNoteUpLink; } - - S_msrStanza getSyllableStanzaUpLink () const - { return fSyllableStanzaUpLink; } - - // syllable kind and contents - msrSyllableKind getSyllableKind () const - { return fSyllableKind; } - - const list& getSyllableTextsList () - { return fSyllableTextsList; } - - msrSyllableExtendKind getSyllableExtendKind () const - { return fSyllableExtendKind; } - - // syllable whole notes - rational getSyllableWholeNotes () const - { return fSyllableWholeNotes; } - - // syllable tuplet factor - msrTupletFactor getSyllableTupletFactor () const - { return fSyllableTupletFactor; } - - // syllable next measure purist number - void setSyllableNextMeasurePuristNumber ( - int puristMeasureNumber) - { - fSyllableNextMeasurePuristNumber = - puristMeasureNumber; - } - - int getSyllableNextMeasurePuristNumber () const - { return fSyllableNextMeasurePuristNumber; } - - // services - // ------------------------------------------------------ - - void appendSyllableToNoteAndSetItsNoteUpLink ( - S_msrNote note); - - void appendLyricTextToSyllable (string text); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string syllableNoteUpLinkAsString () const; - - string syllableWholeNotesAsMsrString () const; - - string syllableKindAsString () const; - - string syllableExtendKindAsString () const; - - string syllableTextsListAsString () const; - - static void writeTextsList ( - const list& textsList, - ostream& os); - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - S_msrNote fSyllableNoteUpLink; - S_msrStanza fSyllableStanzaUpLink; - - // syllable kind and contents - msrSyllableKind fSyllableKind; - list fSyllableTextsList; - msrSyllableExtendKind fSyllableExtendKind; - - // syllable whole notes - rational fSyllableWholeNotes; - - // syllable tuplet factor - msrTupletFactor fSyllableTupletFactor; - - // syllable complementary measure number - // for kSyllableMeasureEnd, kSyllableLineBreak and kSyllablePageBreak - int fSyllableNextMeasurePuristNumber; -}; -typedef SMARTP S_msrSyllable; -EXP ostream& operator<< (ostream& os, const S_msrSyllable& elt); - diff --git a/src/lilypond/msrTablatures.cpp b/src/lilypond/msrTablatures.cpp deleted file mode 100644 index ed52a0240..000000000 --- a/src/lilypond/msrTablatures.cpp +++ /dev/null @@ -1,526 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrTablatures.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrFrameNote msrFrameNote::create ( - int inputLineNumber, - int frameNoteStringNumber, - int frameNoteFretNumber, - int frameNoteFingering, - msrBarreTypeKind frameNoteBarreTypeKind) -{ - msrFrameNote* o = - new msrFrameNote ( - inputLineNumber, - frameNoteStringNumber, - frameNoteFretNumber, - frameNoteFingering, - frameNoteBarreTypeKind); - assert(o!=0); - - return o; -} - -msrFrameNote::msrFrameNote ( - int inputLineNumber, - int frameNoteStringNumber, - int frameNoteFretNumber, - int frameNoteFingering, - msrBarreTypeKind frameNoteBarreTypeKind) - : msrElement (inputLineNumber) -{ - fFrameNoteStringNumber = frameNoteStringNumber; - fFrameNoteFretNumber = frameNoteFretNumber; - - fFrameNoteFingering = frameNoteFingering; - - fFrameNoteBarreTypeKind = frameNoteBarreTypeKind; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Creating frame note '" << - asString () << - "'" << - endl; - } -#endif -} - -msrFrameNote::~msrFrameNote () -{} - -string msrFrameNote::barreTypeKindAsString ( - msrBarreTypeKind barreTypeKind) -{ - string result; - - switch (barreTypeKind) { - case msrFrameNote::kBarreTypeNone: - result = "barreTypeNone"; - break; - case msrFrameNote::kBarreTypeStart: - result = "barreTypeStart"; - break; - case msrFrameNote::kBarreTypeStop: - result = "barreTypeStop"; - break; - } // switch - - return result; -} - -string msrFrameNote::asString () const -{ - stringstream s; - - s << - "FrameNote" << - ", frameNoteStringNumber: " << fFrameNoteStringNumber << - ", frameNoteFretNumber: " << fFrameNoteFretNumber << - ", frameNoteFingering: " << fFrameNoteFingering << - ", frameNoteBarreTypeKind: " << - barreTypeKindAsString ( - fFrameNoteBarreTypeKind) << - ", line: " << fInputLineNumber; - - return s.str (); -} - -void msrFrameNote::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFrameNote::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFrameNote elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFrameNote::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrFrameNote::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFrameNote::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFrameNote elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFrameNote::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrFrameNote::browseData (basevisitor* v) -{} - -void msrFrameNote::print (ostream& os) const -{ - os << - "FrameNote" << - ", line: " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 23; - - os << - setw (fieldWidth) << - "frameNoteStringNumber" << " : " << fFrameNoteStringNumber << - endl << - setw (fieldWidth) << - "frameNoteFretNumber" << " : " << fFrameNoteFretNumber << - endl << - setw (fieldWidth) << - "frameNoteFingering" << " : " << fFrameNoteFingering << - endl << - setw (fieldWidth) << - "frameNoteBarreTypeKind" << " : " << - barreTypeKindAsString ( - fFrameNoteBarreTypeKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrFrameNote& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrFrame msrFrame::create ( - int inputLineNumber, - int frameStringsNumber, - int frameFretsNumber, - int frameFirstFretNumber) -{ - msrFrame* o = - new msrFrame ( - inputLineNumber, - frameStringsNumber, - frameFretsNumber, - frameFirstFretNumber); - assert(o!=0); - - return o; -} - -msrFrame::msrFrame ( - int inputLineNumber, - int frameStringsNumber, - int frameFretsNumber, - int frameFirstFretNumber) - : msrElement (inputLineNumber) -{ - fFrameStringsNumber = frameStringsNumber; - fFrameFretsNumber = frameFretsNumber; - fFrameFirstFretNumber = frameFirstFretNumber; - - fFrameContainsFingerings = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Creating frame '" << - asString () << - "'" << - endl; - } -#endif -} - -msrFrame::~msrFrame () -{} - -void msrFrame::appendFrameNoteToFrame ( - S_msrFrameNote frameNote) -{ - int inputLineNumber = - frameNote->getInputLineNumber (); - - fFrameFrameNotesList.push_back ( - frameNote); - - // handle nested barre start/stop - switch (frameNote->getFrameNoteBarreTypeKind ()) { - case msrFrameNote::kBarreTypeNone: - break; - - case msrFrameNote::kBarreTypeStart: - fPendingBarreStartFrameNotes.push ( - frameNote); - break; - - case msrFrameNote::kBarreTypeStop: - { - if (! fPendingBarreStartFrameNotes.size ()) { - stringstream s; - - s << - "frame note with barre stop has no maching barre start" << - frameNote; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - else { - S_msrFrameNote - pendingBarreStartFrameNotesTop = - fPendingBarreStartFrameNotes.top (); - - int - barreStartFretNumber = - pendingBarreStartFrameNotesTop-> - getFrameNoteFretNumber (), - barreStopFretNumber = - frameNote-> - getFrameNoteFretNumber (); - - if (barreStartFretNumber != barreStopFretNumber) { - stringstream s; - - s << - "frame note with barre stop has is at fret" << - barreStopFretNumber << - "while the matching barre start is at fret" << - barreStartFretNumber; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fFrameBarresList.push_back ( - msrBarre ( - pendingBarreStartFrameNotesTop-> - getFrameNoteStringNumber (), - frameNote-> - getFrameNoteStringNumber (), - barreStartFretNumber)); - - fPendingBarreStartFrameNotes.pop (); - } - } - break; - } // switch - - // are there fingerings in this frame? - if (frameNote->getFrameNoteFingering () != -1) { - fFrameContainsFingerings = true; - } -} - -string msrFrame::asString () const -{ - stringstream s; - - s << - "Frame" << - ", frameStringsNumber: " << fFrameStringsNumber << - ", frameFretsNumber: " << fFrameFretsNumber << - ", frameFirstFretNumber: " << fFrameFirstFretNumber << - singularOrPlural ( - fFrameFrameNotesList.size (), "frame note", "frame notes") << - singularOrPlural ( - fFrameBarresList.size (), "barre", "barres") << - ", frameContainsFingerings: " << - booleanAsString ( - fFrameContainsFingerings); - - return s.str (); -} - -void msrFrame::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFrame::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFrame elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFrame::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrFrame::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrFrame::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrFrame elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrFrame::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrFrame::browseData (basevisitor* v) -{ - // browse frame notes if any - if (fFrameFrameNotesList.size ()) { - for ( - list::const_iterator i = fFrameFrameNotesList.begin (); - i != fFrameFrameNotesList.end (); - i++ - ) { - // browse the harmony degree - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -void msrFrame::print (ostream& os) const -{ - os << - "Frame" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 15; - - os << left << - setw (fieldWidth) << - "frameStringsNumber" << " = " << fFrameStringsNumber << - endl << - setw (fieldWidth) << - "frameFretsNumber" << " = " << fFrameFretsNumber << - endl << - setw (fieldWidth) << - "frameFirstFretNumber" << " = " << fFrameFirstFretNumber << - endl << - setw (fieldWidth) << - "frameContainsFingerings" << " = " << fFrameContainsFingerings << - endl; - - // print frame notes if any - os << - "Frame notes:"; - if (fFrameFrameNotesList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fFrameFrameNotesList.begin (), - iEnd = fFrameFrameNotesList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << - "none" << - endl; - } - - // print the barres if any - os << - "Frame barres:"; - if (fFrameBarresList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fFrameBarresList.begin (), - iEnd = fFrameBarresList.end (), - i = iBegin; - - for ( ; ; ) { - msrBarre barre = (*i); - - os << - "Barre" << - endl; - - gIndenter++; - - const int fieldWidth = 21; - - os << left << - setw (fieldWidth) << - "barreStartString" << " : " << barre.fBarreStartString << - endl << - setw (fieldWidth) << - "barreStopString" << " : " << barre.fBarreStopString << - endl << - setw (fieldWidth) << - "barreFretNumber" << " : " << barre.fBarreFretNumber << - endl; - - gIndenter--; - - if (++i == iEnd) break; - // no endl here; - } // for - - gIndenter--; - } - else { - os << - "none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrFrame& elt) -{ - elt->print (os); - return os; -} - - - -} diff --git a/src/lilypond/msrTablatures.h b/src/lilypond/msrTablatures.h deleted file mode 100644 index 3b06eae40..000000000 --- a/src/lilypond/msrTablatures.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTablatures___ -#define ___msrTablatures___ - -#include - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrFrameNote : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrBarreTypeKind { - kBarreTypeNone, - kBarreTypeStart, kBarreTypeStop }; - - static string barreTypeKindAsString ( - msrBarreTypeKind barreTypeKind); - -/* - - 6 - 0 - -*/ - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int frameNoteStringNumber, - int frameNoteFretNumber, - int frameNoteFingering, - msrBarreTypeKind frameNoteBarreTypeKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrFrameNote ( - int inputLineNumber, - int frameNoteStringNumber, - int frameNoteFretNumber, - int frameNoteFingering, - msrBarreTypeKind frameNoteBarreTypeKind); - - virtual ~msrFrameNote (); - - public: - - // set and get - // ------------------------------------------------------ - - int getFrameNoteStringNumber () const - { return fFrameNoteStringNumber; } - - int getFrameNoteFretNumber () const - { return fFrameNoteFretNumber; } - - int getFrameNoteFingering () const - { return fFrameNoteFingering; } - - msrBarreTypeKind getFrameNoteBarreTypeKind () const - { return fFrameNoteBarreTypeKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fFrameNoteStringNumber; - int fFrameNoteFretNumber; - - int fFrameNoteFingering; - - msrBarreTypeKind fFrameNoteBarreTypeKind; -}; -typedef SMARTP S_msrFrameNote; -EXP ostream& operator<< (ostream& os, const S_msrFrameNote& elt); - -//______________________________________________________________________________ -struct msrBarre { - public: - - // constructors/destructor - // ------------------------------------------------------ - - msrBarre ( - int barreStartString, - int barreStopString, - int barreFretNumber) - { - fBarreStartString = barreStartString; - fBarreStopString = barreStopString; - fBarreFretNumber = barreFretNumber; - } - - // fields - // ------------------------------------------------------ - - int fBarreStartString; - int fBarreStopString; - int fBarreFretNumber; -}; - -//______________________________________________________________________________ -class msrFrame : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int frameStringsNumber, - int frameFretsNumber, - int frameFirstFretNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrFrame ( - int inputLineNumber, - int frameStringsNumber, - int frameFretsNumber, - int frameFirstFretNumber); - - virtual ~msrFrame (); - - public: - - // set and get - // ------------------------------------------------------ - - - int getFrameStringsNumber () const - { return fFrameStringsNumber; } - - int getFrameFretsNumber () const - { return fFrameFretsNumber; } - - int getFrameFirstFretNumber () const - { return fFrameFirstFretNumber; } - - const list& - getFrameFrameNotesList () - { return fFrameFrameNotesList; } - - const list& getFrameBarresList () - { return fFrameBarresList; } - - bool getFrameContainsFingerings () const - { return fFrameContainsFingerings; } - - public: - - // public services - // ------------------------------------------------------ - - void appendFrameNoteToFrame ( - S_msrFrameNote frameNote); - - private: - - // private services - // ------------------------------------------------------ - - void appendBarreToFrame ( // JMI - msrBarre barre) - { - fFrameBarresList.push_back (barre); - } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fFrameStringsNumber; - int fFrameFretsNumber; - int fFrameFirstFretNumber; - - list fFrameFrameNotesList; - - list fFrameBarresList; - - // a barre start remains pending - // until the matching stop is appended to the frame - stack fPendingBarreStartFrameNotes; - - // optimizing computation - bool fFrameContainsFingerings; -}; -typedef SMARTP S_msrFrame; -EXP ostream& operator<< (ostream& os, const S_msrFrame& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrTechnicals.cpp b/src/lilypond/msrTechnicals.cpp deleted file mode 100644 index c205262e3..000000000 --- a/src/lilypond/msrTechnicals.cpp +++ /dev/null @@ -1,696 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrTechnicals.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrTechnical msrTechnical::create ( - int inputLineNumber, - msrTechnicalKind technicalKind, - msrPlacementKind technicalPlacementKind) -{ - msrTechnical* o = - new msrTechnical ( - inputLineNumber, - technicalKind, - technicalPlacementKind); - assert (o!=0); - return o; -} - -msrTechnical::msrTechnical ( - int inputLineNumber, - msrTechnicalKind technicalKind, - msrPlacementKind technicalPlacementKind) - : msrElement (inputLineNumber) -{ - fTechnicalKind = technicalKind; - - fTechnicalPlacementKind = technicalPlacementKind; -} - -msrTechnical::~msrTechnical () -{} - -string msrTechnical::technicalKindAsString () const -{ - string result; - - switch (fTechnicalKind) { - case msrTechnical::kArrow: - result = "Arrow"; - break; - case msrTechnical::kDoubleTongue: - result = "DoubleTongue"; - break; - case msrTechnical::kDownBow: - result = "DownBow"; - break; - case msrTechnical::kFingernails: - result = "Fingernails"; - break; - case msrTechnical::kHarmonic: - result = "Harmonic"; - break; - case msrTechnical::kHeel: - result = "Heel"; - break; - case msrTechnical::kHole: - result = "Hole"; - break; - case msrTechnical::kOpenString: - result = "OpenString"; - break; - case msrTechnical::kSnapPizzicato: - result = "SnapPizzicato"; - break; - case msrTechnical::kStopped: - result = "Stopped"; - break; - case msrTechnical::kTap: - result = "Tap"; - break; - case msrTechnical::kThumbPosition: - result = "ThumbPosition"; - break; - case msrTechnical::kToe: - result = "Toe"; - break; - case msrTechnical::kTripleTongue: - result = "TripleTongue"; - break; - case msrTechnical::kUpBow: - result = "UpBow"; - break; - } // switch - - return result; -} - -string msrTechnical::technicalPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fTechnicalPlacementKind); -} - -/* -string msrTechnical::technicalAccidentalMarkKindAsString () const -{ - string result; - - switch (fTechnicalAccidentalMarkKind) { - case msrTechnical::kNatural: - result = "natural"; - break; - case msrTechnical::kSharp: - result = "sharp"; - break; - case msrTechnical::kFlat: - result = "flat"; - break; - } // switch - - return result; -} -*/ - -void msrTechnical::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnical::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnical elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnical::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTechnical::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnical::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnical elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnical::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTechnical::browseData (basevisitor* v) -{} - -string msrTechnical::asString () const -{ - return - msrPlacementKindAsString ( - fTechnicalPlacementKind); -} - -void msrTechnical::print (ostream& os) const -{ - os << - "Technical" " " << - asString () << - ", line " << fInputLineNumber << -// ", accidental mark" << " = " << technicalAccidentalMarkKindAsString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrTechnical& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTechnicalWithInteger msrTechnicalWithInteger::create ( - int inputLineNumber, - msrTechnicalWithIntegerKind technicalWithIntegerKind, - int technicalWithIntegerValue, - msrPlacementKind technicalWithIntegerPlacementKind) -{ - msrTechnicalWithInteger* o = - new msrTechnicalWithInteger ( - inputLineNumber, - technicalWithIntegerKind, - technicalWithIntegerValue, - technicalWithIntegerPlacementKind); - assert (o!=0); - return o; -} - -msrTechnicalWithInteger::msrTechnicalWithInteger ( - int inputLineNumber, - msrTechnicalWithIntegerKind technicalWithIntegerKind, - int technicalWithIntegerValue, - msrPlacementKind technicalWithIntegerPlacementKind) - : msrElement (inputLineNumber) -{ - fTechnicalWithIntegerKind = technicalWithIntegerKind; - - fTechnicalWithIntegerValue = technicalWithIntegerValue; - - fTechnicalWithIntegerPlacementKind = technicalWithIntegerPlacementKind; -} - -msrTechnicalWithInteger::~msrTechnicalWithInteger () -{} - -string msrTechnicalWithInteger::technicalWithIntegerKindAsString () const -{ - string result; - - switch (fTechnicalWithIntegerKind) { - case msrTechnicalWithInteger::kFingering: - result = "fingering"; - break; - case msrTechnicalWithInteger::kFret: - result = "fret"; - break; - case msrTechnicalWithInteger::kString: - result = "string"; - break; - } // switch - - return result; -} - -string msrTechnicalWithInteger::technicalWithIntegerPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fTechnicalWithIntegerPlacementKind); -} - -void msrTechnicalWithInteger::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnicalWithInteger::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnicalWithInteger elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnicalWithInteger::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTechnicalWithInteger::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnicalWithInteger::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnicalWithInteger elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnicalWithInteger::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTechnicalWithInteger::browseData (basevisitor* v) -{} - -string msrTechnicalWithInteger::asString () const -{ - stringstream s; - - s << - technicalWithIntegerKindAsString () << - ", value '" << - fTechnicalWithIntegerValue << - "', placement " << - technicalWithIntegerPlacementKindAsString (); - - return s.str (); -} - -void msrTechnicalWithInteger::print (ostream& os) const -{ - os << - "TechnicalWithInteger" << - ", " << technicalWithIntegerKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 14; - - os << left << - setw (fieldWidth) << - "value" << " : " << - fTechnicalWithIntegerValue << - endl << - - setw (fieldWidth) << - "placement" << " : " << - technicalWithIntegerPlacementKindAsString () << - endl << - - setw (fieldWidth) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTechnicalWithInteger& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTechnicalWithFloat msrTechnicalWithFloat::create ( - int inputLineNumber, - msrTechnicalWithFloatKind technicalWithFloatKind, - float technicalWithFloatValue, - msrPlacementKind technicalWithFloatPlacementKind) -{ - msrTechnicalWithFloat* o = - new msrTechnicalWithFloat ( - inputLineNumber, - technicalWithFloatKind, - technicalWithFloatValue, - technicalWithFloatPlacementKind); - assert (o!=0); - return o; -} - -msrTechnicalWithFloat::msrTechnicalWithFloat ( - int inputLineNumber, - msrTechnicalWithFloatKind technicalWithFloatKind, - float technicalWithFloatValue, - msrPlacementKind technicalWithFloatPlacementKind) - : msrElement (inputLineNumber) -{ - fTechnicalWithFloatKind = technicalWithFloatKind; - - fTechnicalWithFloatValue = technicalWithFloatValue; - - fTechnicalWithFloatPlacementKind = technicalWithFloatPlacementKind; -} - -msrTechnicalWithFloat::~msrTechnicalWithFloat () -{} - -string msrTechnicalWithFloat::technicalWithFloatKindAsString () const -{ - string result; - - switch (fTechnicalWithFloatKind) { - case msrTechnicalWithFloat::kBend: - result = "bend"; - break; - } // switch - - return result; -} - -string msrTechnicalWithFloat::technicalWithFloatPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fTechnicalWithFloatPlacementKind); -} - -void msrTechnicalWithFloat::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnicalWithFloat::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnicalWithFloat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnicalWithFloat::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTechnicalWithFloat::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnicalWithFloat::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnicalWithFloat elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnicalWithFloat::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTechnicalWithFloat::browseData (basevisitor* v) -{} - -string msrTechnicalWithFloat::asString () const -{ - stringstream s; - - s << - technicalWithFloatKindAsString () << - ", value '" << - fTechnicalWithFloatValue << - "', placement " << - technicalWithFloatPlacementKindAsString (); - - return s.str (); -} - -void msrTechnicalWithFloat::print (ostream& os) const -{ - os << - "TechnicalWithFloat" << - ", " << technicalWithFloatKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 14; - - os << left << - setw (fieldWidth) << - "value" << " : " << - fTechnicalWithFloatValue << - endl << - - setw (fieldWidth) << - "placement" << " : " << - technicalWithFloatPlacementKindAsString () << - endl << - - setw (fieldWidth) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTechnicalWithFloat& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTechnicalWithString msrTechnicalWithString::create ( - int inputLineNumber, - msrTechnicalWithStringKind technicalWithStringKind, - msrTechnicalTypeKind technicalWithStringTypeKind, - string technicalWithStringValue, - msrPlacementKind technicalWithStringPlacementKind) -{ - msrTechnicalWithString* o = - new msrTechnicalWithString ( - inputLineNumber, - technicalWithStringKind, - technicalWithStringTypeKind, - technicalWithStringValue, - technicalWithStringPlacementKind); - assert (o!=0); - return o; -} - -msrTechnicalWithString::msrTechnicalWithString ( - int inputLineNumber, - msrTechnicalWithStringKind technicalWithStringKind, - msrTechnicalTypeKind technicalWithStringTypeKind, - string technicalWithStringValue, - msrPlacementKind technicalWithStringPlacementKind) - : msrElement (inputLineNumber) -{ - fTechnicalWithStringKind = technicalWithStringKind; - - fTechnicalWithStringTypeKind = technicalWithStringTypeKind; - - fTechnicalWithStringValue = technicalWithStringValue; - - fTechnicalWithStringPlacementKind = technicalWithStringPlacementKind; -} - -msrTechnicalWithString::~msrTechnicalWithString () -{} - -string msrTechnicalWithString::technicalWithStringKindAsString () const -{ - string result; - - switch (fTechnicalWithStringKind) { - case msrTechnicalWithString::kHammerOn: - result = "HammerOn"; - break; - case msrTechnicalWithString::kHandbell: - result = "Handbell"; - break; - case msrTechnicalWithString::kOtherTechnical: - result = "OtherTechnical"; - break; - case msrTechnicalWithString::kPluck: - result = "Pluck"; - break; - case msrTechnicalWithString::kPullOff: - result = "PullOff"; - break; - } // switch - - result += - " \"" + fTechnicalWithStringValue + "\""; - - return result; -} - -string msrTechnicalWithString::technicalWithStringTypeKindAsString () const -{ - return - msrTechnicalTypeKindAsString ( - fTechnicalWithStringTypeKind); -} - -string msrTechnicalWithString::technicalWithStringPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fTechnicalWithStringPlacementKind); -} - -void msrTechnicalWithString::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnicalWithString::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnicalWithString elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnicalWithString::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTechnicalWithString::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTechnicalWithString::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTechnicalWithString elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTechnicalWithString::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTechnicalWithString::browseData (basevisitor* v) -{} - -string msrTechnicalWithString::asString () const -{ - stringstream s; - - s << - technicalWithStringKindAsString () << - ", " << technicalWithStringTypeKindAsString () << - ", value \"" << - fTechnicalWithStringValue << - "\", placement " << - technicalWithStringPlacementKindAsString (); - - return s.str (); -} - -void msrTechnicalWithString::print (ostream& os) const -{ - os << - "TechnicalWithString" << - ", " << technicalWithStringKindAsString () << - ", " << technicalWithStringTypeKindAsString () << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 14; - - os << left << - setw (fieldWidth) << - "value" << " : \"" << - fTechnicalWithStringValue << - "\"" << - endl << - - setw (fieldWidth) << - "placement" << " : " << - technicalWithStringPlacementKindAsString () << - endl << - - setw (fieldWidth) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTechnicalWithString& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrTechnicals.h b/src/lilypond/msrTechnicals.h deleted file mode 100644 index c43826301..000000000 --- a/src/lilypond/msrTechnicals.h +++ /dev/null @@ -1,477 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTechnicals___ -#define ___msrTechnicals___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrTechnical : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTechnicalKind { - kArrow, // rich JMI - kDoubleTongue, - kDownBow, - kFingernails, - kHarmonic, - kHeel, - kHole, // rich JMI - kOpenString, - kSnapPizzicato, - kStopped, - kTap, - kThumbPosition, - kToe, - kTripleTongue, - kUpBow}; - - static string technicalKindAsString ( - msrTechnicalKind technicalKind); - -/* JMI - enum msrTechnicalAccidentalMarkKind { - kNatural, kSharp, kFlat}; - - static string technicalAccidentalMarkKindAsString ( - msrTechnicalAccidentalMarkKind technicalAccidentalMarkKind); - */ - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrTechnicalKind technicalKind, - msrPlacementKind technicalPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTechnical ( - int inputLineNumber, - msrTechnicalKind technicalKind, - msrPlacementKind technicalPlacementKind); - - virtual ~msrTechnical (); - - public: - - // set and get - // ------------------------------------------------------ - - msrTechnicalKind getTechnicalKind () const - { return fTechnicalKind; } - - void setTechnicalPlacementKind ( - msrPlacementKind technicalPlacementKind) - { - fTechnicalPlacementKind = - technicalPlacementKind; - } - - msrPlacementKind getTechnicalPlacementKind () const - { return fTechnicalPlacementKind; } - - /* JMI - void setTechnicalAccidentalMarkKind ( - msrTechnicalAccidentalMarkKind - technicalAccidentalMarkKind) - { - fTechnicalAccidentalMarkKind = - technicalAccidentalMarkKind; - } - - msrTechnicalAccidentalMarkKind - getTechnicalAccidentalMarkKind () const - { return fTechnicalAccidentalMarkKind; } -*/ - - // services - // ------------------------------------------------------ - - string technicalKindAsString () const; - - string technicalPlacementKindAsString () const; - - string technicalAccidentalMarkKindAsString () const; - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrTechnicalKind fTechnicalKind; - - msrPlacementKind fTechnicalPlacementKind; - -// JMI msrTechnicalAccidentalMarkKind fTechnicalAccidentalMarkKind; -}; -typedef SMARTP S_msrTechnical; -EXP ostream& operator<< (ostream& os, const S_msrTechnical& elt); - -//______________________________________________________________________________ -class msrTechnicalWithInteger : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTechnicalWithIntegerKind { - kFingering, - kFret, - kString }; - - static string technicalWithIntegerKindAsString ( - msrTechnicalWithIntegerKind technicalWithIntegerKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrTechnicalWithIntegerKind technicalWithIntegerKind, - int technicalWithIntegerValue, - msrPlacementKind technicalWithIntegerPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTechnicalWithInteger ( - int inputLineNumber, - msrTechnicalWithIntegerKind technicalWithIntegerKind, - int technicalWithIntegerValue, - msrPlacementKind technicalWithIntegerPlacementKind); - - virtual ~msrTechnicalWithInteger (); - - public: - - // set and get - // ------------------------------------------------------ - - msrTechnicalWithIntegerKind - getTechnicalWithIntegerKind () const - { return fTechnicalWithIntegerKind; } - - int getTechnicalWithIntegerValue () const - { return fTechnicalWithIntegerValue; } - - void setTechnicalWithIntegerPlacementKind ( - msrPlacementKind - technicalWithIntegerPlacementKind) - { - fTechnicalWithIntegerPlacementKind = - technicalWithIntegerPlacementKind; - } - - msrPlacementKind getTechnicalWithIntegerPlacementKind () const - { return fTechnicalWithIntegerPlacementKind; } - - // services - // ------------------------------------------------------ - - string technicalWithIntegerKindAsString () const; - - string technicalWithIntegerPlacementKindAsString () const; - - string technicalWithIntegerAccidentalMarkKindAsString () const; - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrTechnicalWithIntegerKind fTechnicalWithIntegerKind; - - int fTechnicalWithIntegerValue; - - msrPlacementKind fTechnicalWithIntegerPlacementKind; -}; -typedef SMARTP S_msrTechnicalWithInteger; -EXP ostream& operator<< (ostream& os, const S_msrTechnicalWithInteger& elt); - -//______________________________________________________________________________ -class msrTechnicalWithFloat : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTechnicalWithFloatKind { - kBend }; - - static string technicalWithFloatKindAsString ( - msrTechnicalWithFloatKind technicalWithFloatKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrTechnicalWithFloatKind technicalWithFloatKind, - float technicalWithFloatValue, - msrPlacementKind technicalWithFloatPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTechnicalWithFloat ( - int inputLineNumber, - msrTechnicalWithFloatKind technicalWithFloatKind, - float technicalWithFloatValue, - msrPlacementKind technicalWithFloatPlacementKind); - - virtual ~msrTechnicalWithFloat (); - - public: - - // set and get - // ------------------------------------------------------ - - msrTechnicalWithFloatKind - getTechnicalWithFloatKind () const - { return fTechnicalWithFloatKind; } - - float getTechnicalWithFloatValue () const - { return fTechnicalWithFloatValue; } - - void setTechnicalWithFloatPlacementKind ( - msrPlacementKind - technicalWithFloatPlacementKind) - { - fTechnicalWithFloatPlacementKind = - technicalWithFloatPlacementKind; - } - - msrPlacementKind getTechnicalWithFloatPlacementKind () const - { return fTechnicalWithFloatPlacementKind; } - - // services - // ------------------------------------------------------ - - string technicalWithFloatKindAsString () const; - - string technicalWithFloatPlacementKindAsString () const; - - string technicalWithFloatAccidentalMarkKindAsString () const; - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrTechnicalWithFloatKind fTechnicalWithFloatKind; - - float fTechnicalWithFloatValue; - - msrPlacementKind fTechnicalWithFloatPlacementKind; -}; -typedef SMARTP S_msrTechnicalWithFloat; -EXP ostream& operator<< (ostream& os, const S_msrTechnicalWithFloat& elt); - -//______________________________________________________________________________ -class msrTechnicalWithString : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTechnicalWithStringKind { - kHammerOn, - kHandbell, - kOtherTechnical, - kPluck, - kPullOff}; - - static string technicalWithStringKindAsString ( - msrTechnicalWithStringKind technicalWithStringKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrTechnicalWithStringKind technicalWithStringKind, - msrTechnicalTypeKind technicalWithStringTypeKind, - string technicalWithStringValue, - msrPlacementKind technicalWithStringPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTechnicalWithString ( - int inputLineNumber, - msrTechnicalWithStringKind technicalWithStringKind, - msrTechnicalTypeKind technicalWithStringTypeKind, - string technicalWithStringValue, - msrPlacementKind technicalWithStringPlacementKind); - - virtual ~msrTechnicalWithString (); - - public: - - // set and get - // ------------------------------------------------------ - - msrTechnicalWithStringKind - getTechnicalWithStringKind () const - { return fTechnicalWithStringKind; } - - msrTechnicalTypeKind getTechnicalWithStringTypeKind () const - { return fTechnicalWithStringTypeKind; } - - string getTechnicalWithStringValue () const - { return fTechnicalWithStringValue; } - - void setTechnicalWithStringPlacementKind ( - msrPlacementKind - technicalWithStringPlacementKind) - { - fTechnicalWithStringPlacementKind = - technicalWithStringPlacementKind; - } - - msrPlacementKind getTechnicalWithStringPlacementKind () const - { return fTechnicalWithStringPlacementKind; } - - // services - // ------------------------------------------------------ - - string technicalWithStringKindAsString () const; - - string technicalWithStringTypeKindAsString () const; - - string technicalWithStringPlacementKindAsString () const; - - string technicalWithStringAccidentalMarkKindAsString () const; - - string asString () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrTechnicalWithStringKind - fTechnicalWithStringKind; - - msrTechnicalTypeKind fTechnicalWithStringTypeKind; - - string fTechnicalWithStringValue; - - msrPlacementKind fTechnicalWithStringPlacementKind; -}; -typedef SMARTP S_msrTechnicalWithString; -EXP ostream& operator<< (ostream& os, const S_msrTechnicalWithString& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrTempos.cpp b/src/lilypond/msrTempos.cpp deleted file mode 100644 index 03ddd736c..000000000 --- a/src/lilypond/msrTempos.cpp +++ /dev/null @@ -1,1428 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrTempos.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrTempoNote msrTempoNote::create ( - int inputLineNumber, - rational tempoNoteWholeNotes, - bool tempoNoteBelongsToATuplet) -{ - msrTempoNote * o = - new msrTempoNote ( - inputLineNumber, - tempoNoteWholeNotes, - tempoNoteBelongsToATuplet); - assert(o!=0); - - return o; -} - -msrTempoNote::msrTempoNote ( - int inputLineNumber, - rational tempoNoteWholeNotes, - bool tempoNoteBelongsToATuplet) - : msrElement (inputLineNumber) -{ - fTempoNoteWholeNotes = tempoNoteWholeNotes; - - fTempoNoteBelongsToATuplet = tempoNoteBelongsToATuplet; -} - -msrTempoNote::~msrTempoNote () -{} - -void msrTempoNote::appendBeamToTempoNote (S_msrBeam beam) -{ - fTempoNoteBeams.push_back (beam); -} - -void msrTempoNote::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempoNote::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempoNote elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempoNote::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTempoNote::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempoNote::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempoNote elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempoNote::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTempoNote::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fTempoNoteBeams.begin (); - i != fTempoNoteBeams.end (); - i++ ) { - // browse tempoTuplet element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string msrTempoNote::asString () const -{ - stringstream s; - - s << - "Tempo note" << - ", tempoNoteWholeNotes = " << fTempoNoteWholeNotes << - ", tempoNoteBelongsToATuplet = " << - booleanAsString (fTempoNoteBelongsToATuplet); - - return s.str (); -} - -void msrTempoNote::print (ostream& os) const -{ - os << - "TempoNote" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 26; - - os << left << - setw (fieldWidth) << - "tempoNoteWholeNotes" << " : " << fTempoNoteWholeNotes << - endl << - setw (fieldWidth) << - "tempoNoteBelongsToATuplet" << " : " << - booleanAsString (fTempoNoteBelongsToATuplet) << - endl << - setw (fieldWidth) << - "tempoNoteBeams"; - - if (fTempoNoteBeams.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fTempoNoteBeams.begin (), - iEnd = fTempoNoteBeams.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << - "none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTempoNote& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTempoTuplet msrTempoTuplet::create ( - int inputLineNumber, - int tempoTupletNumber, - msrTempoTupletBracketKind tempoTupletBracketKind, - msrTempoTupletShowNumberKind tempoTupletShowNumberKind, - int tempoTupletActualNotes, - int tempoTupletNormalNotes, - rational memberNotesDisplayWholeNotes) -{ - msrTempoTuplet* o = - new msrTempoTuplet ( - inputLineNumber, - tempoTupletNumber, - tempoTupletBracketKind, - tempoTupletShowNumberKind, - tempoTupletActualNotes, - tempoTupletNormalNotes, - memberNotesDisplayWholeNotes); - assert(o!=0); - return o; -} - -msrTempoTuplet::msrTempoTuplet ( - int inputLineNumber, - int tempoTupletNumber, - msrTempoTupletBracketKind tempoTupletBracketKind, - msrTempoTupletShowNumberKind tempoTupletShowNumberKind, - int tempoTupletActualNotes, - int tempoTupletNormalNotes, - rational memberNotesDisplayWholeNotes) - : msrElement (inputLineNumber) -{ - fTempoTupletNumber = tempoTupletNumber; - - fTempoTupletBracketKind = tempoTupletBracketKind; - fTempoTupletShowNumberKind = tempoTupletShowNumberKind; - - fTempoTupletActualNotes = tempoTupletActualNotes; - fTempoTupletNormalNotes = tempoTupletNormalNotes; - - fMemberNotesDisplayWholeNotes = memberNotesDisplayWholeNotes; - - fTempoTupletDisplayWholeNotes = rational (0, 1); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos){ - gLogOstream << - "Creating tempo tuplet '" << - this->asString () << - "'" << - endl; - } -#endif -} - -msrTempoTuplet::~msrTempoTuplet () -{} - -string msrTempoTuplet::tempoTupletTypeKindAsString ( - msrTempoTupletTypeKind tempoTupletTypeKind) -{ - string result; - - switch (tempoTupletTypeKind) { - case msrTempoTuplet::kTempoTupletTypeNone: - result = "tempoTupletTypeNone"; - break; - case msrTempoTuplet::kTempoTupletTypeStart: - result = "tempoTupletTypeStart"; - break; - case msrTempoTuplet::kTempoTupletTypeStop: - result = "tempoTupletTypeStop"; - break; - } // switch - - return result; -} - -string msrTempoTuplet::tempoTupletBracketKindAsString ( - msrTempoTupletBracketKind tempoTupletBracketKind) -{ - string result; - - switch (tempoTupletBracketKind) { - case msrTempoTuplet::kTempoTupletBracketYes: - result = "tempoTupletBracketYes"; - break; - case msrTempoTuplet::kTempoTupletBracketNo: - result = "tempoTupletBracketNo"; - break; - } // switch - - return result; -} - -string msrTempoTuplet::tempoTupletShowNumberKindAsString ( - msrTempoTupletShowNumberKind tempoTupletShowNumberKind) -{ - string result; - - switch (tempoTupletShowNumberKind) { - case msrTempoTuplet::kTempoTupletShowNumberActual: - result = "tempoTupletShowNumberActual"; - break; - case msrTempoTuplet::kTempoTupletShowNumberBoth: - result = "tempoTupletShowNumberBoth"; - break; - case msrTempoTuplet::kTempoTupletShowNumberNone: - result = "tempoTupletShowNumberNone"; - break; - } // switch - - return result; -} - -void msrTempoTuplet::addTempoNoteToTempoTuplet (S_msrTempoNote tempoNote) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - gLogOstream << - "Adding tempoNote '" << - tempoNote->asShortString () << - // the information is missing to display it the normal way JMI ??? - "' to tempoTuplet '" << - asString () << - "'" << - endl; - } -#endif - - fTempoTupletElements.push_back (tempoNote); - -/* JMI - // register note's tempoTuplet upLink - note-> - setNoteTempoTupletUpLink (this); - - fTupletDisplayWholeNotes += // JMI - note->getNoteDisplayWholeNotes (); - fTempoTupletDisplayWholeNotes.rationalise (); - - */ -} - -/* -void msrTempoTuplet::addTempoTupletToTempoTuplet (S_msrTempoTuplet tempoTuplet) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - gLogOstream << - "Adding tempoTuplet '" << - tempoTuplet->asString () << - "' to tempoTuplet '" << - asString () << - "'" << - endl; - } -#endif - - // register tempoTuplet in elements list - fTempoTupletElements.push_back (tempoTuplet); - - // account for tempoTuplet duration - fTempoTupletDisplayWholeNotes += // JMI - tempoTuplet->getTempoTupletDisplayWholeNotes (); - fTempoTupletDisplayWholeNotes.rationalise (); - - / * - fTempoTupletDisplayWholeNotes += // JMI - tempoTuplet->getTempoTupletDisplayWholeNotes (); - * / - - // don't populate tempoTuplet's measure number nor position in measure, - // this will be done in setTupletMembersMeasureNumber () - / * JMI - tempoTuplet->setTempoTupletMeasureNumber ( - fTempoTupletMeasureNumber); - - // populate tempoTuplet's position in measure - tempoTuplet->setTempoTupletPositionInMeasure ( - fTempoTupletPositionInMeasure); - * / -} - -void msrTempoTuplet::removeFirstNoteFromTempoTuplet ( - int inputLineNumber, - S_msrTempoNote tempoNote) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - gLogOstream << - "Removing first tempoNote '" << - tempoNote->asShortString () << - "' from tempoTuplet '" << - asString () << - "'" << - endl; - } -#endif - - if (fTempoTupletElements.size ()) { - S_msrElement - firstTempoTupletElement = - fTempoTupletElements.front (); - - for ( - list::iterator i=fTempoTupletElements.begin (); - i!=fTempoTupletElements.end (); - ++i) { - if ((*i) == tempoNote) { - // found note, erase it - fTempoTupletElements.erase (i); - - // account for note duration - fTempoTupletDisplayWholeNotes -= // JMI - tempoNote->getTempoNoteWholeNotes (); - fTempoTupletDisplayWholeNotes.rationalise (); - - // don't update measure number nor position in measure: // JMI - // they have not been set yet - - // return from function - return; - } - } // for - - stringstream s; - - s << - "cannot remove tempoNote " << - tempoNote << - " from tempoTuplet " << asString () << - " since it has not been found"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - else { - stringstream s; - - s << - "cannot remove tempoNote " << - tempoNote << - " from empty tempoTuplet " << - " since it has not been found"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} -*/ - -/* JMI -void msrTempoTuplet::applyDisplayFactorToTempoTupletMembers () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - gLogOstream << - "% ==> applyDisplayFactorToTempoTupletMembers ()" << - endl; - - gIndenter++; - - gLogOstream << - "% fTempoTupletActualNotes = " << - fTempoTupletActualNotes << - ", fTempoTupletNormalNotes = " << - fTempoTupletNormalNotes << - endl << - endl; - - gIndenter--; - } -#endif -} - -void msrTempoTuplet::unapplySoundingFactorToTempoTupletMembers ( - int containingTempoTupletActualNotes, - int containingTempoTupletNormalNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - gLogOstream << - "unapplySoundingFactorToTempoTupletMembers ()" << - endl; - - gIndenter++; - - gLogOstream << - "% fTempoTupletActualNotes = " << - fTempoTupletActualNotes << - ", fTempoTupletNormalNotes = " << - fTempoTupletNormalNotes << - endl << - "% containingTempoTupletActualNotes = " << - containingTempoTupletActualNotes << - ", containingTempoTupletNormalNotes = " << - containingTempoTupletNormalNotes << - endl << - endl; - - gIndenter--; - } -#endif - - fTempoTupletActualNotes /= - containingTempoTupletActualNotes; - fTempoTupletNormalNotes /= - containingTempoTupletNormalNotes; -} -*/ - -void msrTempoTuplet::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempoTuplet::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempoTuplet elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempoTuplet::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTempoTuplet::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempoTuplet::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempoTuplet elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempoTuplet::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTempoTuplet::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fTempoTupletElements.begin (); - i != fTempoTupletElements.end (); - i++ ) { - // browse tempoTuplet element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string msrTempoTuplet::asString () const -{ - stringstream s; - - s << - "TempoTuplet " << - fTempoTupletActualNotes << "/" << fTempoTupletNormalNotes << - " " << fTempoTupletDisplayWholeNotes << " display whole notes" << - ":"; - - s << "[["; - - if (fTempoTupletElements.size ()) { - list::const_iterator - iBegin = fTempoTupletElements.begin (), - iEnd = fTempoTupletElements.end (), - i = iBegin; - for ( ; ; ) { - - if ( - S_msrTempoNote note = dynamic_cast(&(*(*i))) - ) { - s << - note->asShortString (); - } - - else if ( - S_msrTempoTuplet tempoTuplet = dynamic_cast(&(*(*i))) - ) { - s << - tempoTuplet->asString (); - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "tempoTuplet member should be a note, a chord or another tempoTuplet"); - } - - if (++i == iEnd) break; - s << " "; - - } // for - } - - s << "]]"; - - return s.str (); -} - -/* JMI -string msrTempoTuplet::asString () const -{ - stringstream s; - - s << - "TempoTuplet " << - fTempoTupletActualNotes << "/" << fTempoTupletNormalNotes << - " " << fTempoTupletSoundingWholeNotes << " sound whole notes" << - " measure '"<< - fTempoTupletMeasureNumber << - "':"; - - if (fTempoTupletPositionInMeasure.getNumerator () < 0) { - s << "?"; - } - else { - s << fTempoTupletPositionInMeasure; - } - - s << "[["; - - if (fTempoTupletElements.size ()) { - list::const_iterator - iBegin = fTempoTupletElements.begin (), - iEnd = fTempoTupletElements.end (), - i = iBegin; - for ( ; ; ) { - - if ( - S_msrTempoNote note = dynamic_cast(&(*(*i))) - ) { - s << - note->asShortString () const; - } - - else if ( - S_msrChord chord = dynamic_cast(&(*(*i))) - ) { - s << - chord->asString () const; - } - - else if ( - S_msrTempoTuplet tempoTuplet = dynamic_cast(&(*(*i))) - ) { - s << - tempoTuplet->asString () const; - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "tempoTuplet member should be a note, a chord or another tempoTuplet"); - } - - if (++i == iEnd) break; - s << " "; - } // for - } - - s << "]]"; - - return s.str (); -} -*/ - -void msrTempoTuplet::print (ostream& os) const -{ - os << - "TempoTuplet " << - fTempoTupletActualNotes << "/" << fTempoTupletNormalNotes << - ", " << - singularOrPlural ( - fTempoTupletElements.size (), "element", "elements") << - ", display whole notes: " << - fTempoTupletDisplayWholeNotes << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 30; - - os << left << - setw (fieldWidth) << - "TempoTupletBracketKind" << " : " << - tempoTupletBracketKindAsString ( - fTempoTupletBracketKind) << - endl << - setw (fieldWidth) << - "TempoTupletShowNumberKind" << " : " << - tempoTupletShowNumberKindAsString ( - fTempoTupletShowNumberKind) << - endl << - setw (fieldWidth) << - "MemberNotesDisplayWholeNotes" << " : " << - fMemberNotesDisplayWholeNotes << - endl << - endl; - -/* JMI ??? - os << left << - setw (fieldWidth) << - "(position in measure" << " : "; - if (fTempoTupletPositionInMeasure.getNumerator () < 0) { - os << "???)"; - } - else { - os << fTempoTupletPositionInMeasure << ")"; - } - os << endl; - */ - - os << - "TempoTupletsElements"; - - if (fTempoTupletElements.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fTempoTupletElements.begin (), - iEnd = fTempoTupletElements.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - else { - os << left << - " : " << "none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTempoTuplet& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTempoRelationshipElements msrTempoRelationshipElements::create ( - int inputLineNumber, - msrTempoRelationshipElementsKind - tempoRelationshipElementsKind) -{ - msrTempoRelationshipElements * o = - new msrTempoRelationshipElements ( - inputLineNumber, - tempoRelationshipElementsKind); - assert(o!=0); - - return o; -} - -msrTempoRelationshipElements::msrTempoRelationshipElements ( - int inputLineNumber, - msrTempoRelationshipElementsKind - tempoRelationshipElementsKind) - : msrElement (inputLineNumber) -{ - fTempoRelationshipElementsKind = tempoRelationshipElementsKind; -} - -msrTempoRelationshipElements::~msrTempoRelationshipElements () -{} - -void msrTempoRelationshipElements::addElementToTempoRelationshipElements ( - S_msrElement element) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos){ - gLogOstream << - "Adding element '" << - element->asString () << - "' to tempo relationship" << - endl; - } -#endif - - fTempoRelationshipElementsList.push_back (element); -} - -void msrTempoRelationshipElements::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempoRelationshipElements::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempoRelationshipElements elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempoRelationshipElements::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTempoRelationshipElements::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempoRelationshipElements::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempoRelationshipElements elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempoRelationshipElements::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTempoRelationshipElements::browseData (basevisitor* v) -{ - // browse the elements list - if (fTempoRelationshipElementsList.size ()) { - for ( - list::const_iterator i = - fTempoRelationshipElementsList.begin (); - i != fTempoRelationshipElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } -} - -string msrTempoRelationshipElements::asString () const -{ - stringstream s; - - s << - "TempoRelationshipElements" << - ", fTempoRelationshipElementsKind = " << fTempoRelationshipElementsKind; - - return s.str (); -} - -string msrTempoRelationshipElements::tempoRelationshipElementsKindAsString ( - msrTempoRelationshipElementsKind tempoRelationshipElementsKind) -{ - string result; - - switch (tempoRelationshipElementsKind) { - case msrTempoRelationshipElements::kTempoRelationshipElementsLeft: - result = "tempoRelationshipElementsLeft"; - break; - case msrTempoRelationshipElements::kTempoRelationshipElementsRight: - result = "tempoRelationshipElementsRight"; - break; - } // switch - - return result; -} - -void msrTempoRelationshipElements::print (ostream& os) const -{ - os << - "TempoRelationshipElements" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << - "tempoRelationshipElementsKindAsString : " << - tempoRelationshipElementsKindAsString ( - fTempoRelationshipElementsKind) << - endl; - - const int fieldWidth = 26; - - os << left << - setw (fieldWidth) << - "tempoRelationshipElementsList"; - - if (fTempoRelationshipElementsList.size ()) { - gIndenter++; - - os << endl; - - list::const_iterator - iBegin = fTempoRelationshipElementsList.begin (), - iEnd = fTempoRelationshipElementsList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none ???" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTempoRelationshipElements& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTempo msrTempo::create ( - int inputLineNumber, - S_msrWords tempoWords) -{ - msrTempo* o = - new msrTempo ( - inputLineNumber, - tempoWords); - assert(o!=0); - - return o; -} - -S_msrTempo msrTempo::create ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - string tempoPerMinute, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind) -{ - msrTempo* o = - new msrTempo ( - inputLineNumber, - tempoBeatUnit, - tempoPerMinute, - tempoParenthesizedKind, - tempoPlacementKind); - assert(o!=0); - return o; -} - -S_msrTempo msrTempo::create ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - msrDottedDuration tempoEquivalentBeatUnit, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind) -{ - msrTempo* o = - new msrTempo ( - inputLineNumber, - tempoBeatUnit, - tempoEquivalentBeatUnit, - tempoParenthesizedKind, - tempoPlacementKind); - assert(o!=0); - return o; -} - -S_msrTempo msrTempo::create ( - int inputLineNumber, - S_msrTempoRelationshipElements - tempoRelationLeftElements, - S_msrTempoRelationshipElements - tempoRelationRightElements, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind) -{ - msrTempo* o = - new msrTempo ( - inputLineNumber, - tempoRelationLeftElements, - tempoRelationRightElements, - tempoParenthesizedKind, - tempoPlacementKind); - assert(o!=0); - return o; -} - -msrTempo::msrTempo ( - int inputLineNumber, - S_msrWords tempoWords) - : msrMeasureElement (inputLineNumber), - fTempoBeatUnit (), - fTempoEquivalentBeatUnit () -{ - fTempoKind = kTempoBeatUnitsWordsOnly; - - fTempoPerMinute = ""; - - fTempoParenthesizedKind = kTempoParenthesizedNo; - - fTempoPlacementKind = kPlacementAbove; - - fTempoWordsList.push_back (tempoWords); -} - -msrTempo::msrTempo ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - string tempoPerMinute, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind) - : msrMeasureElement (inputLineNumber), - fTempoBeatUnit (tempoBeatUnit), - fTempoEquivalentBeatUnit () -{ - fTempoKind = kTempoBeatUnitsPerMinute; - - fTempoPerMinute = tempoPerMinute; - - fTempoParenthesizedKind = tempoParenthesizedKind; - - fTempoPlacementKind = tempoPlacementKind; -} - -msrTempo::msrTempo ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - msrDottedDuration tempoEquivalentBeatUnit, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind) - : msrMeasureElement (inputLineNumber), - fTempoBeatUnit (tempoBeatUnit), - fTempoEquivalentBeatUnit (tempoEquivalentBeatUnit) -{ - fTempoKind = kTempoBeatUnitsEquivalence; - - fTempoPerMinute = ""; - - fTempoParenthesizedKind = tempoParenthesizedKind; - - fTempoPlacementKind = tempoPlacementKind; -} - -msrTempo::msrTempo ( - int inputLineNumber, - S_msrTempoRelationshipElements - tempoRelationLeftElements, - S_msrTempoRelationshipElements - tempoRelationRightElements, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind) - : msrMeasureElement (inputLineNumber) -{ - fTempoKind = kTempoNotesRelationShip; - - fTempoPerMinute = ""; - - fTempoRelationLeftElements = - tempoRelationLeftElements; - fTempoRelationRightElements = - tempoRelationRightElements; - - fTempoParenthesizedKind = tempoParenthesizedKind; - - fTempoPlacementKind = tempoPlacementKind; -} - -msrTempo::~msrTempo () -{} - -void msrTempo::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempo::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempo::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTempo::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTempo::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTempo elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTempo::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - - -void msrTempo::browseData (basevisitor* v) -{ - switch (fTempoKind) { - case msrTempo::k_NoTempoKind: - break; - - case msrTempo::kTempoBeatUnitsWordsOnly: - break; - - case msrTempo::kTempoBeatUnitsPerMinute: - break; - - case msrTempo::kTempoBeatUnitsEquivalence: - break; - - case msrTempo::kTempoNotesRelationShip: - { - // browse the left elements - if (fTempoRelationLeftElements) { - msrBrowser browser (v); - browser.browse (*fTempoRelationLeftElements); - } - - // browse the right elements - if (fTempoRelationRightElements) { - msrBrowser browser (v); - browser.browse (*fTempoRelationRightElements); - } - } - break; - } // switch -} - -string msrTempo::tempoKindAsString ( - msrTempoKind tempoKind) -{ - string result; - - switch (tempoKind) { - case msrTempo::k_NoTempoKind: - result = "noTempoKind???"; - break; - case msrTempo::kTempoBeatUnitsWordsOnly: - result = "tempoBeatUnitsWordsOnly"; - break; - case msrTempo::kTempoBeatUnitsPerMinute: - result = "tempoBeatUnitsPerMinute"; - break; - case msrTempo::kTempoBeatUnitsEquivalence: - result = "tempoBeatUnitsEquivalence"; - break; - case msrTempo::kTempoNotesRelationShip: - result = "tempoNotesRelationShip"; - break; - } // switch - - return result; -} - -string msrTempo::tempoParenthesizedKindAsString ( - msrTempoParenthesizedKind tempoParenthesizedKind) -{ - string result; - - switch (tempoParenthesizedKind) { - case msrTempo::kTempoParenthesizedYes: - result = "tempoParenthesizedYes"; - break; - case msrTempo::kTempoParenthesizedNo: - result = "tempoParenthesizedNo"; - break; - } // switch - - return result; -} - -string msrTempo::tempoRelationKindAsString ( - msrTempoRelationKind tempoRelationKind) -{ - string result; - - switch (tempoRelationKind) { - case msrTempo::kTempoRelationEquals: - result = "tempoRelationEquals"; - break; - case msrTempo::kTempoRelationNone: - result = "tempoRelationNone"; - break; - } // switch - - return result; -} - -string msrTempo::tempoWordsListAsString (string separator) const -{ - string result; - - list::const_iterator - iBegin = fTempoWordsList.begin (), - iEnd = fTempoWordsList.end (), - i = iBegin; - for ( ; ; ) { - result += (*i)->getWordsContents (); - if (++i == iEnd) break; - result += separator; - } // for - - return result; -} - -string msrTempo::asString () const -{ - stringstream s; - - s << - "Tempo" << - ", tempoKind: " << tempoKindAsString (fTempoKind) << - ", tempoWordsList: "; - - if (fTempoWordsList.size ()) { - list::const_iterator - iBegin = fTempoWordsList.begin (), - iEnd = fTempoWordsList.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ", "; - } // for - } - else { - s << "\"\""; - } - - s << - ", " << fTempoBeatUnit << ": " << fTempoPerMinute << - ", tempoParenthesizedKind : " << - tempoParenthesizedKindAsString (fTempoParenthesizedKind) << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrTempo::print (ostream& os) const -{ - os << - "Tempo" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 27; - - os << left << - setw (fieldWidth) << - "tempoKind" << " : " << tempoKindAsString (fTempoKind) << - endl; - - os << left << - setw (fieldWidth) << - "tempoWords"; - - if (fTempoWordsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fTempoWordsList.begin (), - iEnd = fTempoWordsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - else { - os << - " : " << "none" << - endl;; - } - - os << left << - setw (fieldWidth) << - "tempoBeatUnit :" << - endl; - - gIndenter++; - - os << - fTempoBeatUnit; - - gIndenter--; - - os << left << - setw (fieldWidth) << - "tempoPerMinute" << " : \"" << fTempoPerMinute << "\"" << - endl << - setw (fieldWidth) << - "tempoParenthesizedKind" << " : " << - tempoParenthesizedKindAsString (fTempoParenthesizedKind) << - endl; - - os << left << - setw (fieldWidth) << - "tempoRelationLeftElements"; - if (fTempoRelationLeftElements) { - os << - " : " << - endl; - - gIndenter++; - - os << - fTempoRelationLeftElements; - - gIndenter--; - } - else { - os << " : " << "none" << - endl; - } - - - os << left << - setw (fieldWidth) << - "tempoRelationKind" << " : " << - tempoRelationKindAsString ( - fTempoRelationKind) << - endl; - - - os << left << - setw (fieldWidth) << - "tempoRelationRightElements"; - if (fTempoRelationRightElements) { - os << - ":" << - endl; - - gIndenter++; - - os << - fTempoRelationRightElements; - - gIndenter--; - } - else { - os << " : " << "none" << - endl; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTempo& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrTempos.h b/src/lilypond/msrTempos.h deleted file mode 100644 index 4498a97da..000000000 --- a/src/lilypond/msrTempos.h +++ /dev/null @@ -1,537 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTempos___ -#define ___msrTempos___ - -#include - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - -#include "msrBeams.h" -#include "msrWords.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrTempoNote : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - rational tempoNoteWholeNotes, - bool tempoNoteBelongsToATuplet); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTempoNote ( - int inputLineNumber, - rational tempoNoteWholeNotes, - bool tempoNoteBelongsToATuplet); - - virtual ~msrTempoNote (); - - public: - - // set and get - // ------------------------------------------------------ - - rational getTempoNoteWholeNotes () const - { return fTempoNoteWholeNotes; } - - const list& - getTempoNoteBeams () const - { return fTempoNoteBeams; } - - // services - // ------------------------------------------------------ - - void appendBeamToTempoNote (S_msrBeam beam); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - rational fTempoNoteWholeNotes; - - list fTempoNoteBeams; - - bool fTempoNoteBelongsToATuplet; -}; -typedef SMARTP S_msrTempoNote; -EXP ostream& operator<< (ostream& os, const S_msrTempoNote& elt); - -//______________________________________________________________________________ -class msrTempoTuplet : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTempoTupletTypeKind { - kTempoTupletTypeNone, - kTempoTupletTypeStart, kTempoTupletTypeStop }; - - static string tempoTupletTypeKindAsString ( - msrTempoTupletTypeKind tempoTupletTypeKind); - - enum msrTempoTupletBracketKind { - kTempoTupletBracketYes, kTempoTupletBracketNo}; - - static string tempoTupletBracketKindAsString ( - msrTempoTupletBracketKind tempoTupletBracketKind); - - enum msrTempoTupletShowNumberKind { - kTempoTupletShowNumberActual, kTempoTupletShowNumberBoth, kTempoTupletShowNumberNone }; - - static string tempoTupletShowNumberKindAsString ( - msrTempoTupletShowNumberKind tempoTupletShowNumberKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int tempoTupletNumber, - msrTempoTupletBracketKind tempoTupletBracketKind, - msrTempoTupletShowNumberKind tempoTupletShowNumberKind, - int tempoTupletActualNotes, - int tempoTupletNormalNotes, - rational memberNotesDisplayWholeNotes); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTempoTuplet ( - int inputLineNumber, - int tempoTupletNumber, - msrTempoTupletBracketKind tempoTupletBracketKind, - msrTempoTupletShowNumberKind tempoTupletShowNumberKind, - int tempoTupletActualNotes, - int tempoTupletNormalNotes, - rational memberNotesDisplayWholeNotes); - - virtual ~msrTempoTuplet (); - - public: - - // set and get - // ------------------------------------------------------ - - int getTempoTupletNumber () const - { return fTempoTupletNumber; } - - msrTempoTupletBracketKind getTempoTupletBracketKind () const - { return fTempoTupletBracketKind; } - - msrTempoTupletShowNumberKind - getTempoTupletShowNumberKind () const - { return fTempoTupletShowNumberKind; } - - int getTempoTupletActualNotes () const - { return fTempoTupletActualNotes; } - int getTempoTupletNormalNotes () const - { return fTempoTupletNormalNotes; } - - rational getMemberNotesDisplayWholeNotes () const - { return fMemberNotesDisplayWholeNotes; } - - const list& - getTempoTupletElements () const - { return fTempoTupletElements; } - - rational getTempoTupletDisplayWholeNotes () const - { return fTempoTupletDisplayWholeNotes; } - - // services - // ------------------------------------------------------ - - void addTempoNoteToTempoTuplet (S_msrTempoNote tempoNote); - /* - void addTempoTupletToTempoTuplet (S_msrTempoTuplet tempoTuplet); - - void addTempoTupletToTempoTupletClone (S_msrTempoTuplet tempoTuplet); - - void removeFirstNoteFromTempoTuplet ( - int inputLineNumber, - S_msrTempoNote tempoNote); - */ - - // JMI void applyDisplayFactorToTempoTupletMembers (); - - /* - void unapplySoundingFactorToTempoTupletMembers ( - int containingTempoTupletActualNotes, - int containingTempoTupletNormalNotes); -*/ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fTempoTupletNumber; - - msrTempoTupletBracketKind - fTempoTupletBracketKind; - - msrTempoTupletShowNumberKind - fTempoTupletShowNumberKind; - - int fTempoTupletActualNotes; - int fTempoTupletNormalNotes; - - rational fMemberNotesDisplayWholeNotes; - - rational fTempoTupletDisplayWholeNotes; - - list fTempoTupletElements; -}; -typedef SMARTP S_msrTempoTuplet; -EXP ostream& operator<< (ostream& os, const S_msrTempoTuplet& elt); - -//______________________________________________________________________________ -class msrTempoRelationshipElements : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTempoRelationshipElementsKind { - kTempoRelationshipElementsLeft, - kTempoRelationshipElementsRight }; - - static string tempoRelationshipElementsKindAsString ( - msrTempoRelationshipElementsKind tempoRelationshipElementsKind); - - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrTempoRelationshipElementsKind - tempoRelationshipElementsKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTempoRelationshipElements ( - int inputLineNumber, - msrTempoRelationshipElementsKind - tempoRelationshipElementsKind); - - virtual ~msrTempoRelationshipElements (); - - public: - - // set and get - // ------------------------------------------------------ - - rational getTempoRelationshipElementsKind () const - { return fTempoRelationshipElementsKind; } - - const list& - getTempoRelationshipElementsList () const - { return fTempoRelationshipElementsList; } - - // services - // ------------------------------------------------------ - - string asString () const; - - void addElementToTempoRelationshipElements ( - S_msrElement element); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - msrTempoRelationshipElementsKind - fTempoRelationshipElementsKind; - - list fTempoRelationshipElementsList; -}; -typedef SMARTP S_msrTempoRelationshipElements; -EXP ostream& operator<< (ostream& os, const S_msrTempoRelationshipElements& elt); - -//______________________________________________________________________________ -class msrTempo : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTempoKind { - k_NoTempoKind, - kTempoBeatUnitsWordsOnly, - kTempoBeatUnitsPerMinute, - kTempoBeatUnitsEquivalence, - kTempoNotesRelationShip }; - - static string tempoKindAsString ( - msrTempoKind tempoKind); - - enum msrTempoParenthesizedKind { - kTempoParenthesizedYes, kTempoParenthesizedNo }; - - static string tempoParenthesizedKindAsString ( - msrTempoParenthesizedKind tempoParenthesizedKind); - - enum msrTempoRelationKind { - kTempoRelationNone, kTempoRelationEquals }; - - static string tempoRelationKindAsString ( - msrTempoRelationKind tempoRelationKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - S_msrWords tempoWords); - - static SMARTP create ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - string tempoPerMinute, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind); - - static SMARTP create ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - msrDottedDuration tempoEquivalentBeatUnit, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind); - - static SMARTP create ( - int inputLineNumber, - S_msrTempoRelationshipElements - tempoRelationLeftElements, - S_msrTempoRelationshipElements - tempoRelationRightElements, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTempo ( - int inputLineNumber, - S_msrWords tempoWords); - - msrTempo ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - string tempoPerMinute, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind); - - msrTempo ( - int inputLineNumber, - msrDottedDuration tempoBeatUnit, - msrDottedDuration tempoEquivalentBeatUnit, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind); - - msrTempo ( - int inputLineNumber, - S_msrTempoRelationshipElements - tempoRelationLeftElements, - S_msrTempoRelationshipElements - tempoRelationRightElements, - msrTempoParenthesizedKind - tempoParenthesizedKind, - msrPlacementKind tempoPlacementKind); - - virtual ~msrTempo (); - - public: - - // set and get - // ------------------------------------------------------ - - msrTempoKind getTempoKind () const - { return fTempoKind; } - - const list& - getTempoWordsList () const - { return fTempoWordsList; } - - msrDottedDuration getTempoBeatUnit () const - { return fTempoBeatUnit; } - - string getTempoPerMinute () const - { return fTempoPerMinute; } - - msrDottedDuration getTempoEquivalentBeatUnit () const - { return fTempoEquivalentBeatUnit; } - - S_msrTempoRelationshipElements - getTempoRelationLeftElements () const - { return fTempoRelationLeftElements; } - msrTempoRelationKind getTempoRelationKind () const - { return fTempoRelationKind; } - S_msrTempoRelationshipElements - getTempoRelationRightElements () const - { return fTempoRelationRightElements; } - - msrTempoParenthesizedKind - getTempoParenthesizedKind () const - { return fTempoParenthesizedKind; } - - msrPlacementKind getTempoPlacementKind () const - { return fTempoPlacementKind; } - - // services - // ------------------------------------------------------ - - void appendWordsToTempo (S_msrWords tempoWords) - { - fTempoWordsList.push_back (tempoWords); - } - - string tempoWordsListAsString (string separator) const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrTempoKind fTempoKind; - - list fTempoWordsList; - - msrDottedDuration fTempoBeatUnit; - - string fTempoPerMinute; // '90' or '132-156' for example - msrDottedDuration fTempoEquivalentBeatUnit; - - S_msrTempoRelationshipElements - fTempoRelationLeftElements; - msrTempoRelationKind fTempoRelationKind; - S_msrTempoRelationshipElements - fTempoRelationRightElements; - - msrTempoParenthesizedKind - fTempoParenthesizedKind; - - msrPlacementKind fTempoPlacementKind; -}; -typedef SMARTP S_msrTempo; -EXP ostream& operator<< (ostream& os, const S_msrTempo& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrTies.cpp b/src/lilypond/msrTies.cpp deleted file mode 100644 index dd0206142..000000000 --- a/src/lilypond/msrTies.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrTies.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrTie msrTie::create ( - int inputLineNumber, - msrTieKind tieKind) -{ - msrTie* o = - new msrTie ( - inputLineNumber, tieKind); - assert(o!=0); - return o; -} - -msrTie::msrTie ( - int inputLineNumber, - msrTieKind tieKind) - : msrElement (inputLineNumber) -{ - fTieKind = tieKind; -} - -msrTie::~msrTie () -{} - -void msrTie::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTie::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTie elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTie::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTie::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTie::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTie elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTie::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTie::browseData (basevisitor* v) -{} - -string msrTie::tieKindAsString (msrTieKind tieKind) -{ - stringstream s; - - switch (tieKind) { - case kTieStart: - s << "tieStart"; - break; - case kTieContinue: - s << "tieContinue"; - break; - case kTieStop: - s << "tieStop"; - break; - case kTieNone: - s << "tieNone"; - } // switch - - return s.str (); -} - -string msrTie::tieKindAsString () const -{ - return tieKindAsString (fTieKind); -} - -string msrTie::asString () const -{ - stringstream s; - - s << - "Tie" << " " << tieKindAsString () << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrTie::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrTie& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrTies.h b/src/lilypond/msrTies.h deleted file mode 100644 index 7f1ed56db..000000000 --- a/src/lilypond/msrTies.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTies___ -#define ___msrTies___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrTie : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTieKind { - kTieNone, - kTieStart, kTieContinue, kTieStop}; - - static string tieKindAsString ( - msrTieKind tieKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrTieKind tieKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTie ( - int inputLineNumber, - msrTieKind tieKind); - - virtual ~msrTie (); - - public: - - // set and get - // ------------------------------------------------------ - - msrTieKind getTieKind () const - { return fTieKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string tieKindAsString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrTieKind fTieKind; -}; -typedef SMARTP S_msrTie; -EXP ostream& operator<< (ostream& os, const S_msrTie& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrTimes.cpp b/src/lilypond/msrTimes.cpp deleted file mode 100644 index a5b02e19c..000000000 --- a/src/lilypond/msrTimes.cpp +++ /dev/null @@ -1,698 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include - -#include "msrTimes.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - -#include "messagesHandling.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrTimeItem msrTimeItem::create ( - int inputLineNumber) -{ - msrTimeItem* o = - new msrTimeItem ( - inputLineNumber); - assert (o!=0); - - return o; -} - -msrTimeItem::msrTimeItem ( - int inputLineNumber) - : msrElement (inputLineNumber) -{ - fTimeBeatValue = -1; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Creating time item" << - ", line = " << inputLineNumber << - endl; - } -#endif -} - -msrTimeItem::~msrTimeItem () -{} - -bool msrTimeItem::isEqualTo (S_msrTimeItem otherTimeItem) const -{ - if (! otherTimeItem) { - return false; - } - - if ( - ! ( - fTimeBeatValue == otherTimeItem->fTimeBeatValue - && - fTimeBeatsNumbersVector.size () - == - otherTimeItem->fTimeBeatsNumbersVector.size () - ) - ) { - return false; - } - - for (unsigned int i = 0; i < fTimeBeatsNumbersVector.size (); i++) { - if ( - ! ( - fTimeBeatsNumbersVector [i] - == - otherTimeItem->fTimeBeatsNumbersVector [i] - ) - ) { - return false; - } - } // for - - return true; -} - -void msrTimeItem::appendBeatsNumber (int beatsNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending beat number '" << - beatsNumber << - "' to time item '" << - asString () << - "'" << - endl; - } -#endif - - fTimeBeatsNumbersVector.insert ( - fTimeBeatsNumbersVector.end (), - beatsNumber); -} - -void msrTimeItem::setTimeBeatValue (int timeBeatValue) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Setting beat value to '" << - timeBeatValue << - "' in time item '" << - asString () << - "'" << - endl; - } -#endif - - fTimeBeatValue = timeBeatValue; -} - -int msrTimeItem::getTimeBeatsNumber () const -{ - int result = 0; - - for (unsigned int i = 0; i < fTimeBeatsNumbersVector.size (); i++) { - result += - fTimeBeatsNumbersVector [i]; - } // for - - return result; -} - -void msrTimeItem::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTimeItem::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTimeItem elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTimeItem::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTimeItem::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTimeItem::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTimeItem elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTimeItem::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTimeItem::browseData (basevisitor* v) -{} - -string msrTimeItem::asString () const -{ - stringstream s; - - s << - "TimeItem "; - - int vectorSize = - fTimeBeatsNumbersVector.size (); - - switch (vectorSize) { - case 0: - /* JMI - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "time item beats numbers vector is empty"); - */ - s << - "beats numbers: none"; - break; - - case 1: - s << - fTimeBeatsNumbersVector [0] << "/" << fTimeBeatValue; - break; - - default: - s << - "beats numbers: "; - - for (int i = 0; i < vectorSize; i++) { - s << - fTimeBeatsNumbersVector [i]; - - if (i != vectorSize - 1) { - s << - " "; - } - } // for - - s << - ", beat value: " << fTimeBeatValue; - } // switch - - s << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrTimeItem::print (ostream& os) const -{ - os << - asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_msrTimeItem& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTime msrTime::create ( - int inputLineNumber, - msrTimeSymbolKind timeSymbolKind) -{ - msrTime* o = - new msrTime ( - inputLineNumber, timeSymbolKind); - assert (o!=0); - return o; -} - -msrTime::msrTime ( - int inputLineNumber, - msrTimeSymbolKind timeSymbolKind) - : msrMeasureElement (inputLineNumber) -{ - fTimeSymbolKind = timeSymbolKind; - - fTimeIsCompound = false; -} - -bool msrTime::isEqualTo (S_msrTime otherTime) const -{ - if (! otherTime) { - return false; - } - - if ( - ! ( - fTimeSymbolKind == otherTime->fTimeSymbolKind - && - fTimeIsCompound == otherTime->fTimeIsCompound - && - fTimeItemsVector.size () == otherTime->fTimeItemsVector.size () - ) - ) { - return false; - } - - for (unsigned int i = 0; i < fTimeItemsVector.size (); i++) { - if ( - ! ( - fTimeItemsVector [i]->isEqualTo ( - otherTime->fTimeItemsVector [i]) - ) - ) { - return false; - } - } // for - - return true; -} - -S_msrTime msrTime::createFourQuartersTime ( - int inputLineNumber) -{ - // create the time - S_msrTime - time = - msrTime::create ( - inputLineNumber, - msrTime::kTimeSymbolNone); - - // create a four quarters time item - S_msrTimeItem - timeItem = - msrTimeItem::create ( - inputLineNumber); - - timeItem-> - appendBeatsNumber (4); - timeItem-> - setTimeBeatValue (4); - - // append the time item to the time - time-> - appendTimeItem (timeItem); - - // return the time - return time; -} - -msrTime::~msrTime () -{} - -void msrTime::appendTimeItem ( - S_msrTimeItem timeItem) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Append item '" << - timeItem->asString () << - "' to time '" << - "JMI" << - "'" << - endl; - } -#endif - - if (! fTimeItemsVector.size ()) { - // this is the first item inserted - if ( - timeItem-> - getTimeBeatsNumbersVector (). size () - > - 1) { - // this time is compound - fTimeIsCompound = true; - } - } - - else { - // there are several time items, this time is compound - fTimeIsCompound = true; - } - - // append the time item to the vector - fTimeItemsVector.insert ( - fTimeItemsVector.end (), timeItem); -} - -rational msrTime::wholeNotesPerMeasure () const -{ - rational result (0, 1); // addition neutral element - - int vectorSize = fTimeItemsVector.size (); - - if (vectorSize) { - /* JMI - // start with first item - result = - rational ( - fTimeItemsVector [0]->getTimeBeatsNumber (), - fTimeItemsVector [0]->getTimeBeatValue ()); -*/ - -/* JMI - gLogOstream << - endl << - endl << - "result1 = " << - result.getNumerator () << - "/" << - result.getDenominator () << - endl << - endl; -*/ - - // iterate over the others - for (int i = 0; i < vectorSize; i++) { - result += - rational ( - fTimeItemsVector [i]->getTimeBeatsNumber (), - fTimeItemsVector [i]->getTimeBeatValue ()); - -/* JMI - gLogOstream << - endl << - endl << - "result2 = " << - result.getNumerator () << - "/" << - result.getDenominator () << - endl << - endl; - */ - - } // for - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "time items vector is empty"); - } - - // rationalize result - result.rationalise (); - - // return it - return result; -} - -void msrTime::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTime::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTime elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTime::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTime::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTime::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTime elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTime::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTime::browseData (basevisitor* v) -{} - -string msrTime::timeSymbolKindAsString ( - msrTimeSymbolKind timeSymbolKind) -{ - string result; - - switch (timeSymbolKind) { - case msrTime::kTimeSymbolCommon: - result = "timeSymbolCommon"; - break; - case msrTime::kTimeSymbolCut: - result = "timeSymbolCut"; - break; - case msrTime::kTimeSymbolNote: - result = "timeSymbolNote"; - break; - case msrTime::kTimeSymbolDottedNote: - result = "timeSymbolDottedNote"; - break; - case msrTime::kTimeSymbolSingleNumber: - result = "timeSymbolSingleNumber"; - break; - case msrTime::kTimeSymbolSenzaMisura: - result = "timeSymbolSenzaMisura"; - break; - case msrTime::kTimeSymbolNone: - result = "timeSymbolNone"; - break; - } // switch - - return result; -} - -string msrTime::timeSeparatorKindAsString ( - msrTimeSeparatorKind timeSeparatorKind) -{ - string result; - - switch (timeSeparatorKind) { - case msrTime::kTimeSeparatorNone: - result = "timeSeparatorNone"; - break; - case msrTime::kTimeSeparatorHorizontal: - result = "timeSeparatorHorizontal"; - break; - case msrTime::kTimeSeparatorDiagonal: - result = "timeSeparatorDiagonal"; - break; - case msrTime::kTimeSeparatorVertical: - result = "timeSeparatorVertical"; - break; - case msrTime::kTimeSeparatorAdjacent: - result = "timeSeparatorAdjacent"; - break; - } // switch - - return result; -} - -string msrTime::timeRelationKindAsString ( - msrTimeRelationKind timeRelationKind) -{ - string result; - - switch (timeRelationKind) { - case msrTime::kTimeRelationNone: - result = "timeRelationNone"; - break; - case msrTime::kTimeRelationParentheses: - result = "timeRelationParentheses"; - break; - case msrTime::kTimeRelationBracket: - result = "timeRelationBracket"; - break; - case msrTime::kTimeRelationEquals: - result = "timeRelationEquals"; - break; - case msrTime::kTimeRelationSlash: - result = "timeRelationSlash"; - break; - case msrTime::kTimeRelationSpace: - result = "timeRelationSpace"; - break; - case msrTime::kTimeRelationHyphen: - result = "timeRelationHyphen"; - break; - } // switch - - return result; -} - -string msrTime::asString () const -{ - stringstream s; - - s << - "Time, " << - ", timeSymbolKind: " << - timeSymbolKindAsString (fTimeSymbolKind) << - ", timeIsCompound: " << - booleanAsString ( - fTimeIsCompound) << - ", " << - singularOrPlural ( - fTimeItemsVector.size (), "item", "items") << - ", line " << fInputLineNumber; - - if (fTimeItemsVector.size ()) { - s << - ", "; - - vector::const_iterator - iBegin = fTimeItemsVector.begin (), - iEnd = fTimeItemsVector.end (), - i = iBegin; - - for ( ; ; ) { - s << (*i)->asString (); - if (++i == iEnd) break; - s << ", "; - } // for - } - else { - if (fTimeSymbolKind != msrTime::kTimeSymbolSenzaMisura) { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "time items vector is empty"); - } - } - - return s.str (); -} - -string msrTime::asShortString () const -{ - /* JMI - stringstream s; - - s << - "Time, " << - ", timeSymbolKind: " << - timeSymbolKindAsString (fTimeSymbolKind) << - ", compound " << - booleanAsString ( - fTimeIsCompound) << - ", " << - singularOrPlural ( - fTimeItemsVector.size (), "item", "items") << - ", line " << fInputLineNumber; - - return s.str (); - */ - - return asString (); -} - -void msrTime::print (ostream& os) const -{ - os << - "Time" << - ", timeSymbolKind: " << - timeSymbolKindAsString (fTimeSymbolKind) << - ", compound: " << - booleanAsString ( - fTimeIsCompound) << - ", " << - singularOrPlural ( - fTimeItemsVector.size (), "item", "items") << - ", line " << fInputLineNumber << - ":"; - - if (fTimeItemsVector.size ()) { - os << endl; - - gIndenter++; - - vector::const_iterator - iBegin = fTimeItemsVector.begin (), - iEnd = fTimeItemsVector.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - else { - os << - " none" << - endl; - } -} - -ostream& operator<< (ostream& os, const S_msrTime& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrTimes.h b/src/lilypond/msrTimes.h deleted file mode 100644 index 32472813f..000000000 --- a/src/lilypond/msrTimes.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTimes___ -#define ___msrTimes___ - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrTimeItem; -typedef SMARTP S_msrTimeItem; - -class msrTime; -typedef SMARTP S_msrTime; - -//______________________________________________________________________________ -class msrTimeItem : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTimeItem ( - int inputLineNumber); - - virtual ~msrTimeItem (); - - public: - - // set and get - // ------------------------------------------------------ - - const vector& getTimeBeatsNumbersVector () const - { return fTimeBeatsNumbersVector; } - - void setTimeBeatValue (int timeBeatValue); - - int getTimeBeatValue () const - { return fTimeBeatValue; } - - // services - // ------------------------------------------------------ - - bool isEqualTo (S_msrTimeItem otherTimeItem) const; - - void appendBeatsNumber (int beatsNumber); - - int getTimeBeatsNumber () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - vector fTimeBeatsNumbersVector; // 5+3+1 is possible - int fTimeBeatValue; -}; -typedef SMARTP S_msrTimeItem; -EXP ostream& operator<< (ostream& os, const S_msrTimeItem& elt); - -//______________________________________________________________________________ -class msrTime : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTimeSymbolKind { - kTimeSymbolNone, - kTimeSymbolCommon, - kTimeSymbolCut, - kTimeSymbolNote, - kTimeSymbolDottedNote, - kTimeSymbolSingleNumber, - kTimeSymbolSenzaMisura }; - - static string timeSymbolKindAsString ( - msrTimeSymbolKind timeSymbolKind); - - enum msrTimeSeparatorKind { - kTimeSeparatorNone, - kTimeSeparatorHorizontal, - kTimeSeparatorDiagonal, - kTimeSeparatorVertical, - kTimeSeparatorAdjacent }; - - static string timeSeparatorKindAsString ( - msrTimeSeparatorKind timeSeparatorKind); - - enum msrTimeRelationKind { - kTimeRelationNone, - kTimeRelationParentheses, - kTimeRelationBracket, - kTimeRelationEquals, - kTimeRelationSlash, - kTimeRelationSpace, - kTimeRelationHyphen }; - - static string timeRelationKindAsString ( - msrTimeRelationKind timeRelationKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrTimeSymbolKind timeSymbolKind); - - static SMARTP createFourQuartersTime ( - int inputLineNumber); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTime ( - int inputLineNumber, - msrTimeSymbolKind timeSymbolKind); - - virtual ~msrTime (); - - public: - - // set and get - // ------------------------------------------------------ - - msrTimeSymbolKind getTimeSymbolKind () const - { return fTimeSymbolKind; } - - bool getTimeIsCompound () const - { return fTimeIsCompound; } - - const vector& - getTimeItemsVector () - { return fTimeItemsVector; } - - // services - // ------------------------------------------------------ - - bool isEqualTo (S_msrTime otherTime) const; - - void appendTimeItem ( - S_msrTimeItem timeItem); - - rational wholeNotesPerMeasure () const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - string asShortString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrTimeSymbolKind fTimeSymbolKind; - - vector fTimeItemsVector; - - // a time is compound if it contains several items - // or if the only one has several beats numbers - // i.e. 3/4 is not, (3+4)/8 is, and 2/4+3/4 is too - bool fTimeIsCompound; -}; -typedef SMARTP S_msrTime; -EXP ostream& operator<< (ostream& os, const S_msrTime& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrTranspositions.cpp b/src/lilypond/msrTranspositions.cpp deleted file mode 100644 index 738136386..000000000 --- a/src/lilypond/msrTranspositions.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrTranspositions.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrOctaveShift msrOctaveShift::create ( - int inputLineNumber, - msrOctaveShiftKind octaveShiftKind, - int octaveShiftSize) -{ - msrOctaveShift* o = - new msrOctaveShift ( - inputLineNumber, octaveShiftKind, octaveShiftSize); - assert(o!=0); - return o; -} - -msrOctaveShift::msrOctaveShift ( - int inputLineNumber, - msrOctaveShiftKind octaveShiftKind, - int octaveShiftSize) - : msrMeasureElement (inputLineNumber) -{ - fOctaveShiftKind = octaveShiftKind; - - fOctaveShiftSize = octaveShiftSize; -} - -msrOctaveShift::~msrOctaveShift () -{} - -void msrOctaveShift::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrOctaveShift::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOctaveShift elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrOctaveShift::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrOctaveShift::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrOctaveShift::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrOctaveShift elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrOctaveShift::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrOctaveShift::browseData (basevisitor* v) -{} - -string msrOctaveShift::octaveShiftKindAsString () const -{ - string result; - - switch (fOctaveShiftKind) { - case msrOctaveShift::kOctaveShiftNone: - result = "octaveShiftNone"; - break; - case msrOctaveShift::kOctaveShiftUp: - result = "octaveShiftUp"; - break; - case msrOctaveShift::kOctaveShiftDown: - result = "octaveShiftDown"; - break; - case msrOctaveShift::kOctaveShiftStop: - result = "octaveShiftStop"; - break; - case msrOctaveShift::kOctaveShiftContinue: - result = "octaveShiftContinue"; - break; - } // switch - - return result; -} - -string msrOctaveShift::asString () const -{ - string result; - - stringstream s; - - s << - "OctaveShift" << - ", kind: " << octaveShiftKindAsString () << - ", size: " << fOctaveShiftSize; - - return s.str (); -} - -void msrOctaveShift::print (ostream& os) const -{ - gIndenter++; - - os << - "OctaveShift" << - ", kind: " << octaveShiftKindAsString () << - ", size: " << fOctaveShiftSize << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrOctaveShift& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrTranspose msrTranspose::create ( - int inputLineNumber, - int transposeDiatonic, - int transposeChromatic, - int transposeOctaveChange, - bool transposeDouble) -{ - msrTranspose* o = - new msrTranspose ( - inputLineNumber, - transposeDiatonic, - transposeChromatic, - transposeOctaveChange, - transposeDouble); - assert (o!=0); - return o; -} - -msrTranspose::msrTranspose ( - int inputLineNumber, - int transposeDiatonic, - int transposeChromatic, - int transposeOctaveChange, - bool transposeDouble) - : msrMeasureElement (inputLineNumber) -{ - fTransposeDiatonic = transposeDiatonic; - fTransposeChromatic = transposeChromatic; - fTransposeOctaveChange = transposeOctaveChange; - fTransposeDouble = transposeDouble; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Creating transpose '" << - asString () << - "'" << - endl; - } -#endif -} - -msrTranspose::~msrTranspose () -{} - -bool msrTranspose::isEqualTo (S_msrTranspose otherTranspose) const -{ - if (! otherTranspose) { - return false; - } - - return - fTransposeDiatonic == - otherTranspose->fTransposeDiatonic - && - fTransposeChromatic == - otherTranspose->fTransposeChromatic - && - fTransposeOctaveChange == - otherTranspose->fTransposeOctaveChange - && - fTransposeDouble == - otherTranspose->fTransposeDouble; -} - -void msrTranspose::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTranspose::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTranspose elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTranspose::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTranspose::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTranspose::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTranspose elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTranspose::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTranspose::browseData (basevisitor* v) -{} - -string msrTranspose::asString () const -{ - stringstream s; - - s << - "Transpose" << - ", diatonic = " << fTransposeDiatonic << - ", chromatic = " << fTransposeChromatic << - ", transposeOctaveChange = " << fTransposeOctaveChange << - ", transposeDouble = " << fTransposeDouble << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrTranspose::print (ostream& os) const -{ - const int fieldWidth = 22; - - os << - "Transpose" << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << left << - setw (fieldWidth) << - "Diatonic" << " = " << fTransposeDiatonic << - endl << - setw (fieldWidth) << - "Chromatic" << " = " << fTransposeChromatic << - endl << - setw (fieldWidth) << - "TransposeOctaveChange" << " = " << fTransposeOctaveChange << - endl << - setw (fieldWidth) << - "TransposeDouble" << " = " << fTransposeDouble << - endl << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrTranspose& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrTranspositions.h b/src/lilypond/msrTranspositions.h deleted file mode 100644 index 9ea7a6916..000000000 --- a/src/lilypond/msrTranspositions.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTranspositions___ -#define ___msrTranspositions___ - -#include "msrMeasureElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrOctaveShift : public msrMeasureElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrOctaveShiftKind { - kOctaveShiftNone, - kOctaveShiftUp, kOctaveShiftDown, - kOctaveShiftStop, kOctaveShiftContinue }; - - static string octaveShiftKindAsString ( - msrOctaveShiftKind octaveShiftKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrOctaveShiftKind octaveShiftKind, - int octaveShiftSize); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrOctaveShift ( - int inputLineNumber, - msrOctaveShiftKind octaveShiftKind, - int octaveShiftSize); - - virtual ~msrOctaveShift (); - - public: - - // set and get - // ------------------------------------------------------ - - msrOctaveShiftKind getOctaveShiftKind () const - { return fOctaveShiftKind; } - - int getOctaveShiftSize () const - { return fOctaveShiftSize; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string octaveShiftKindAsString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrOctaveShiftKind fOctaveShiftKind; - - int fOctaveShiftSize; -}; -typedef SMARTP S_msrOctaveShift; -EXP ostream& operator<< (ostream& os, const S_msrOctaveShift& elt); - -//______________________________________________________________________________ -class msrTranspose; -typedef SMARTP S_msrTranspose; - -class msrTranspose : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - int transposeDiatonic, - int transposeChromatic, - int transposeOctaveChange, - bool transposeDouble); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTranspose ( - int inputLineNumber, - int transposeDiatonic, - int transposeChromatic, - int transposeOctaveChange, - bool transposeDouble); - - virtual ~msrTranspose (); - - public: - - // set and get - // ------------------------------------------------------ - - int getTransposeDiatonic () const - { return fTransposeDiatonic; } - - int getTransposeChromatic () const - { return fTransposeChromatic; } - - int getTransposeOctaveChange () const - { return fTransposeOctaveChange; } - - bool getTransposeDouble () const - { return fTransposeDouble; } - - // services - // ------------------------------------------------------ - - bool isEqualTo (S_msrTranspose otherTranspose) const; - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fTransposeDiatonic; - int fTransposeChromatic; - int fTransposeOctaveChange; - bool fTransposeDouble; -}; -typedef SMARTP S_msrTranspose; -EXP ostream& operator<< (ostream& os, const S_msrTranspose& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrTupletElements.cpp b/src/lilypond/msrTupletElements.cpp deleted file mode 100644 index 891288559..000000000 --- a/src/lilypond/msrTupletElements.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX - -#include "msrTupletElements.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -msrTupletElement::msrTupletElement ( - int inputLineNumber) - : msrMeasureElement (inputLineNumber) -{ -// fTupletNumber = "???"; -// fPositionInTuplet = rational (INT_MIN, 1); -} - -msrTupletElement::~msrTupletElement () -{} - -/* JMI -void msrTupletElement::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTupletElement::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTupletElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTupletElement::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTupletElement::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTupletElement::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTupletElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTupletElement::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -string msrTupletElement::asString () const -{ - // this is overriden all in actual elements - return "??? msrTupletElement::asString () ???"; -} - -string msrTupletElement::asShortString () const -{ - // this can be overriden in actual elements - return asString () const; -} - -void msrTupletElement::print (ostream& os) -{ - os << asString () << endl; -} -*/ - -ostream& operator<< (ostream& os, const S_msrTupletElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrTupletElements.h b/src/lilypond/msrTupletElements.h deleted file mode 100644 index 1e090e06e..000000000 --- a/src/lilypond/msrTupletElements.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrTupletElements___ -#define ___msrTupletElements___ - -#include "msrMeasureElements.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -/* - Tuplet elements, i.e. notes, chords and tuplets, can also be found in measures, hence: -*/ -class msrTupletElement : public msrMeasureElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - // cloning - // ------------------------------------------------------ - - protected: - - msrTupletElement ( - int inputLineNumber); - - virtual ~msrTupletElement (); - - public: - -/* JMI - // set and get - // ------------------------------------------------------ - - void setTupletNumber ( - string positionInTuplet) - { - fTupletNumber = - positionInTuplet; - } - - string getTupletNumber () - { return fTupletNumber; } - - void setPositionInTuplet ( - rational positionInTuplet) - { - fPositionInTuplet = - positionInTuplet; - } - - rational getPositionInTuplet () - { return fPositionInTuplet; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v) = 0; - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asShortString () const; - virtual std::string asString () const; - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os) {} - - protected: - - // fields - // ------------------------------------------------------ - - string fTupletNumber; - rational fPositionInTuplet; - */ -}; -typedef SMARTP S_msrTupletElement; -EXP ostream& operator<< (ostream& os, const S_msrTupletElement& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrTuplets.cpp b/src/lilypond/msrTuplets.cpp deleted file mode 100644 index 241b69302..000000000 --- a/src/lilypond/msrTuplets.cpp +++ /dev/null @@ -1,1142 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrTuplet msrTuplet::create ( - int inputLineNumber, - string tupletMeasureNumber, - int tupletNumber, - msrTupletBracketKind tupletBracketKind, - msrTupletLineShapeKind tupletLineShapeKind, - msrTupletShowNumberKind tupletShowNumberKind, - msrTupletShowTypeKind tupletShowTypeKind, - msrTupletFactor tupletFactor, - rational memberNotesSoundingWholeNotes, - rational memberNotesDisplayWholeNotes) -{ - msrTuplet* o = - new msrTuplet ( - inputLineNumber, - tupletMeasureNumber, - tupletNumber, - tupletBracketKind, - tupletLineShapeKind, - tupletShowNumberKind, - tupletShowTypeKind, - tupletFactor, - memberNotesSoundingWholeNotes, - memberNotesDisplayWholeNotes); - assert(o!=0); - return o; -} - -msrTuplet::msrTuplet ( - int inputLineNumber, - string tupletMeasureNumber, - int tupletNumber, - msrTupletBracketKind tupletBracketKind, - msrTupletLineShapeKind tupletLineShapeKind, - msrTupletShowNumberKind tupletShowNumberKind, - msrTupletShowTypeKind tupletShowTypeKind, - msrTupletFactor tupletFactor, - rational memberNotesSoundingWholeNotes, - rational memberNotesDisplayWholeNotes) - : msrTupletElement (inputLineNumber) -{ - fTupletNumber = tupletNumber; - - fTupletBracketKind = tupletBracketKind; - fTupletLineShapeKind = tupletLineShapeKind; - fTupletShowNumberKind = tupletShowNumberKind; - fTupletShowTypeKind = tupletShowTypeKind; - - fTupletFactor = tupletFactor; - - fMemberNotesSoundingWholeNotes = memberNotesSoundingWholeNotes; - fMemberNotesDisplayWholeNotes = memberNotesDisplayWholeNotes; - - fMeasureElementSoundingWholeNotes = rational (0, 1); - fTupletDisplayWholeNotes = rational (0, 1); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Creating tuplet:" << - endl; - - gIndenter++; - - this->print (gLogOstream); - - gIndenter--; - } -#endif -} - -msrTuplet::~msrTuplet () -{} - -S_msrTuplet msrTuplet::createTupletNewbornClone () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Creating a newborn clone of tuplet " << - asString () << - endl; - } -#endif - - S_msrTuplet - newbornClone = - msrTuplet::create ( - fInputLineNumber, - fMeasureElementMeasureNumber, - fTupletNumber, - fTupletBracketKind, - fTupletLineShapeKind, - fTupletShowNumberKind, - fTupletShowTypeKind, - fTupletFactor, - fMemberNotesSoundingWholeNotes, - fMemberNotesDisplayWholeNotes); - -/* JMI ??? - newbornClone->fMeasureElementSoundingWholeNotes = - fMeasureElementSoundingWholeNotes; - - newbornClone->fTupletDisplayWholeNotes = - fTupletDisplayWholeNotes; - - newbornClone->fMeasureElementMeasureNumber = - fMeasureElementMeasureNumber; - - newbornClone->fMeasureElementPositionInMeasure = - fMeasureElementPositionInMeasure; -*/ - - return newbornClone; -} - -string msrTuplet::tupletTypeKindAsString ( - msrTupletTypeKind tupletTypeKind) -{ - string result; - - switch (tupletTypeKind) { - case msrTuplet::kTupletTypeNone: - result = "tupletTypeNone"; - break; - case msrTuplet::kTupletTypeStart: - result = "tupletTypeStart"; - break; - case msrTuplet::kTupletTypeContinue: - result = "tupletTypeContinue"; - break; - case msrTuplet::kTupletTypeStop: - result = "tupletTypeStop"; - break; - case msrTuplet::kTupletTypeStartAndStopInARow: - result = "tupletTypeStartAndStopInARow"; - break; - } // switch - - return result; -} - -string msrTuplet::tupletBracketKindAsString ( - msrTupletBracketKind tupletBracketKind) -{ - string result; - - switch (tupletBracketKind) { - case msrTuplet::kTupletBracketYes: - result = "tupletBracketYes"; - break; - case msrTuplet::kTupletBracketNo: - result = "tupletBracketNo"; - break; - } // switch - - return result; -} - -string msrTuplet::tupletLineShapeKindAsString ( - msrTupletLineShapeKind tupletLineShapeKind) -{ - string result; - - switch (tupletLineShapeKind) { - case msrTuplet::kTupletLineShapeStraight: - result = "tupletLineShapeStraight"; - break; - case msrTuplet::kTupletLineShapeCurved: - result = "tupletLineShapeCurved"; - break; - } // switch - - return result; -} - -string msrTuplet::tupletShowNumberKindAsString ( - msrTupletShowNumberKind tupletShowNumberKind) -{ - string result; - - switch (tupletShowNumberKind) { - case msrTuplet::kTupletShowNumberActual: - result = "tupletShowNumberActual"; - break; - case msrTuplet::kTupletShowNumberBoth: - result = "tupletShowNumberBoth"; - break; - case msrTuplet::kTupletShowNumberNone: - result = "tupletShowNumberNone"; - break; - } // switch - - return result; -} - -string msrTuplet::tupletShowTypeKindAsString ( - msrTupletShowTypeKind tupletShowTypeKind) -{ - string result; - - switch (tupletShowTypeKind) { - case msrTuplet::kTupletShowTypeActual: - result = "tupletShowTypeActual"; - break; - case msrTuplet::kTupletShowTypeBoth: - result = "tupletShowTypeBoth"; - break; - case msrTuplet::kTupletShowTypeNone: - result = "tupletShowTypeNone"; - break; - } // switch - - return result; -} - -void msrTuplet::addNoteToTuplet ( - S_msrNote note, - S_msrVoice voice) -{ - int inputLineNumber = - note->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Adding note " << - note->asShortString () << - // the information is missing to display it the normal way - " to tuplet " << - asString () << - endl; - } -#endif - - fTupletElementsList.push_back (note); - - // register note's tuplet upLink - note-> - setNoteTupletUpLink (this); - - // account for note duration in tuplet duration - fMeasureElementSoundingWholeNotes += - note->getNoteSoundingWholeNotes (); - fMeasureElementSoundingWholeNotes.rationalise (); - - fTupletDisplayWholeNotes += // JMI - note->getNoteDisplayWholeNotes (); - fTupletDisplayWholeNotes.rationalise (); - - // fetch voice last measure - S_msrMeasure - voiceLastMeasure = - voice->fetchVoiceLastMeasure ( - inputLineNumber); - - // account for the duration of note in voice last measure - voiceLastMeasure-> - accountForTupletMemberNoteDurationInMeasure ( - note); -} - -void msrTuplet::addChordToTuplet (S_msrChord chord) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Adding chord " << - chord->asString () << - " to tuplet " << - asString () << - endl; - } -#endif - - fTupletElementsList.push_back (chord); - - // DO NOT account for the chord duration, - // since its first note has been accounted for already - /* JMI - fMeasureElementSoundingWholeNotes += - chord->getChordSoundingWholeNotes (); - fMeasureElementSoundingWholeNotes.rationalise (); -*/ - - fTupletDisplayWholeNotes += // JMI - chord->getChordDisplayWholeNotes (); - fTupletDisplayWholeNotes.rationalise (); - -/* too early JMI - // populate chord's measure number - chord->setChordMeasureNumber ( - fMeasureElementMeasureNumber); -*/ -} - -void msrTuplet::addTupletToTuplet (S_msrTuplet tuplet) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Adding tuplet " << - tuplet->asString () << - " to tuplet " << - asString () << - endl; - } -#endif - -/* JMI - // unapply containing tuplet factor, - // i.e 3/2 inside 5/4 becomes 15/8 in MusicXML... - tuplet-> - unapplySoundingFactorToTupletMembers ( - this->getTupletNormalNotes (), - this->getTupletNormalNotes (); - */ - - // register tuplet in elements list - fTupletElementsList.push_back (tuplet); - - // account for tuplet duration - fMeasureElementSoundingWholeNotes += - tuplet->getTupletSoundingWholeNotes (); - fMeasureElementSoundingWholeNotes.rationalise (); - - fTupletDisplayWholeNotes += // JMI - tuplet->getTupletDisplayWholeNotes (); - fTupletDisplayWholeNotes.rationalise (); -} - -void msrTuplet::addTupletToTupletClone (S_msrTuplet tuplet) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Adding tuplet " << - tuplet->asString () << - " to tuplet " << - asString () << - endl; - } -#endif - - // dont' unapply containing tuplet factor, - // this has been done when building the MSR from MusicXML - - // register tuplet in elements list - fTupletElementsList.push_back (tuplet); - - // account for tuplet duration - fMeasureElementSoundingWholeNotes += - tuplet->getTupletSoundingWholeNotes (); - fMeasureElementSoundingWholeNotes.rationalise (); - - fTupletDisplayWholeNotes += - tuplet->getTupletDisplayWholeNotes (); - fTupletDisplayWholeNotes.rationalise (); -} - -S_msrNote msrTuplet::fetchTupletFirstNonGraceNote () const -{ - S_msrNote result; - - if (fTupletElementsList.size ()) { - S_msrElement - firstTupletElement = - fTupletElementsList.front (); - - if ( - S_msrNote note = dynamic_cast(&(*firstTupletElement)) - ) { - // first element is a note, we have it - result = note; - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*firstTupletElement)) - ) { - // first element is another tuplet, recurse - result = tuplet->fetchTupletFirstNonGraceNote (); - } - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "cannot access the first note of an empty tuplet"); - } - - return result; -} - -S_msrNote msrTuplet::removeFirstNoteFromTuplet ( - int inputLineNumber) -{ - S_msrNote result; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Removing first note from tuplet " << - asString () << - endl; - } -#endif - - if (fTupletElementsList.size ()) { - S_msrElement - firstTupletElement = - fTupletElementsList.front (); - - if ( - S_msrNote note = dynamic_cast(&(*firstTupletElement)) - ) { - fTupletElementsList.pop_front (); - result = note; - } - - else { - if (true) { - this->print (gLogOstream); - } - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "removeFirstNoteFromTuplet () expects a note as the first tuplet element"); - } - -/* JMI - for ( - list::iterator i=fTupletElementsList.begin (); - i!=fTupletElementsList.end (); - ++i) { - if ((*i) == note) { - // found note, erase it - fTupletElementsList.erase (i); - - // account for note duration - fMeasureElementSoundingWholeNotes -= - note->getNoteSoundingWholeNotes (); - fMeasureElementSoundingWholeNotes.rationalise (); - - fTupletDisplayWholeNotes -= // JMI - note->getNoteDisplayWholeNotes (); - fTupletDisplayWholeNotes.rationalise (); - - // don't update measure number nor position in measure: // JMI - // they have not been set yet - - // return from function - return; - } - } // for - - stringstream s; - - s << - "cannot remove note " << - note << - " from tuplet " << asString () << - " in voice \"" << - fTupletMeasureUpLink-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\"," << - " since it has not been found"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - - else { - stringstream s; - - s << - "cannot remove the first note of an empty tuplet " << - " in voice \"" << - fTupletMeasureUpLink-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return result; -} - -S_msrNote msrTuplet::removeLastNoteFromTuplet ( - int inputLineNumber) -{ - S_msrNote result; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Removing last note from tuplet " << - asString () << - endl; - } -#endif - - if (fTupletElementsList.size ()) { - S_msrElement - lastTupletElement = - fTupletElementsList.back (); - - if ( - S_msrNote note = dynamic_cast(&(*lastTupletElement)) - ) { - // remove note from tuplet elements list - fTupletElementsList.pop_back (); - -/* - // decrement the tuplet sounding whole notes accordingly ??? JMI BAD??? - fMeasureElementSoundingWholeNotes += - note->getNoteSoundingWholeNotes (); - fMeasureElementSoundingWholeNotes.rationalise (); -*/ - - result = note; - } - - else { - if (true) { // JMI - this->print (gLogOstream); - } - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "removeLastNoteFromTuplet () expects a note as the last tuplet element"); - } - } - - else { - stringstream s; - - s << - "cannot remove the last note of an empty tuplet " << - " in voice \"" << - fTupletMeasureUpLink-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink ()-> - getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "This last note from tuplet " << - asString () << - " turns out to be " << - result->asShortString () << - endl; - } -#endif - - return result; -} - -rational msrTuplet::setTupletMembersPositionInMeasure ( - S_msrMeasure measure, - rational positionInMeasure) - // returns the position in measure after the tuplet -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Setting tuplet position in measure of " << asString () << - " to '" << - positionInMeasure << - "'" << - endl; - } -#endif - - msrMeasureElement::setMeasureElementPositionInMeasure ( - positionInMeasure, - "setTupletMembersPositionInMeasure()"); - - rational currentPosition = positionInMeasure; - - // compute position in measure for the tuplets elements - for ( - list::const_iterator i = fTupletElementsList.begin (); - i != fTupletElementsList.end (); - i++ - ) { - // set tuplet element position in measure - - if ( - S_msrNote note = dynamic_cast(&(*(*i))) - ) { - // note - note-> - setNoteMeasureUpLink ( - measure); - - note-> - setNotePositionInMeasure ( - currentPosition); - - currentPosition += - note-> - getNoteSoundingWholeNotes (); - currentPosition.rationalise (); - } - - else if ( - S_msrChord chord = dynamic_cast(&(*(*i))) - ) { - // chord - chord-> - setChordMembersPositionInMeasure ( - measure, - currentPosition); - currentPosition.rationalise (); - - currentPosition += - chord-> - getChordSoundingWholeNotes (); - currentPosition.rationalise (); - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*(*i))) - ) { - // nested tuplet - currentPosition = - tuplet-> - setTupletMembersPositionInMeasure ( // a function JMI ??? - measure, - currentPosition); - - currentPosition += - tuplet-> - getTupletSoundingWholeNotes (); - currentPosition.rationalise (); - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "tuplet member should be a note, a chord or another tuplet"); - } - } // for - - return currentPosition; -} - -void msrTuplet::unapplySoundingFactorToTupletMembers ( - const msrTupletFactor& containingTupletFactor) - /* - int containingTupletActualNotes, - int containingTupletNormalNotes) - */ -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "unapplySoundingFactorToTupletMembers ()" << - endl; - - gIndenter++; - - gLogOstream << - "% fTupletFactor = " << fTupletFactor.asString () << - endl << - "% containingTupletFactor = " << containingTupletFactor.asString () << - endl; - - gIndenter--; - } -#endif - - fTupletFactor.setTupletActualNotes ( - fTupletFactor.getTupletActualNotes () - / - containingTupletFactor.getTupletActualNotes ()); - fTupletFactor.setTupletNormalNotes ( - fTupletFactor.getTupletNormalNotes () - / - containingTupletFactor.getTupletNormalNotes ()); - -/* JMI - fTupletFactor.getTupletNormalNotes () /= - containingTupletFactor.getTupletNormalNotes (); - fTupletFactor.fTupletNormalNotes /= - containingTupletFactor.fTupletNormalNotes; - */ -} - -/* JMI ??? -void msrTuplet::finalizeTuplet ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Finalizing tuplet " << - asString () << - ", line " << inputLineNumber << - endl; - } -#endif - -/ * JMI - // we can now set the position in measure for all the tuplet members - setTupletMembersPositionInMeasure ( - fMeasureElementPositionInMeasure); - * / -} -*/ - -void msrTuplet::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTuplet::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTuplet elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTuplet::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrTuplet::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrTuplet::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrTuplet elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrTuplet::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrTuplet::browseData (basevisitor* v) -{ - for ( - list::const_iterator i = fTupletElementsList.begin (); - i != fTupletElementsList.end (); - i++ - ) { - // browse tuplet element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for -} - -string msrTuplet::asString () const -{ - stringstream s; - - s << - "[" << - "Tuplet " << - fTupletFactor.asString () << - " " << fMeasureElementSoundingWholeNotes << " tupletSoundingWholeNotes" << - ", measure ' "<< - fMeasureElementMeasureNumber << - "':"; - - if (fMeasureElementPositionInMeasure.getNumerator () < 0) { - s << "?"; - } - else { - s << fMeasureElementPositionInMeasure; - } - - s << "[["; - - if (fTupletElementsList.size ()) { - list::const_iterator - iBegin = fTupletElementsList.begin (), - iEnd = fTupletElementsList.end (), - i = iBegin; - for ( ; ; ) { - - if ( - S_msrNote note = dynamic_cast(&(*(*i))) - ) { - s << - note->asShortString (); - } - - else if ( - S_msrChord chord = dynamic_cast(&(*(*i))) - ) { - s << - chord->asString (); - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*(*i))) - ) { - s << - tuplet->asString (); - } - - else { - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - "tuplet member should be a note, a chord or another tuplet"); - } - - if (++i == iEnd) break; - s << " "; - - } // for - } - - s << "]]" << "]"; - - return s.str (); -} - -void msrTuplet::print (ostream& os) const -{ - os << - "Tuplet " << - fTupletNumber << - ", " << - fTupletFactor.asString () << - ", " << - singularOrPlural ( - fTupletElementsList.size (), "element", "elements") << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << " sounding, " << - fTupletDisplayWholeNotes << " displayed" << - ", meas "<< - fMeasureElementMeasureNumber << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 30; - - os << left << - setw (fieldWidth) << - "tupletBracketKind" << " : " << - tupletBracketKindAsString ( - fTupletBracketKind) << - endl << - setw (fieldWidth) << - "tupletLineShapeKind" << " : " << - tupletLineShapeKindAsString ( - fTupletLineShapeKind) << - endl << - setw (fieldWidth) << - "tupletShowNumberKind" << " : " << - tupletShowNumberKindAsString ( - fTupletShowNumberKind) << - endl << - setw (fieldWidth) << - "tupletShowTypeKind" << " : " << - tupletShowTypeKindAsString ( - fTupletShowTypeKind) << - endl << - - setw (fieldWidth) << - "memberNotesSoundingWholeNotes" << " : " << - fMemberNotesSoundingWholeNotes << - endl << - setw (fieldWidth) << - "memberNotesDisplayWholeNotes" << " : " << - fMemberNotesDisplayWholeNotes << - endl << - - setw (fieldWidth) << - "tupletSoundingWholeNotes" << " : " << - fMeasureElementSoundingWholeNotes << - endl << - setw (fieldWidth) << - "tupletDisplayWholeNotes" << " : " << - fTupletDisplayWholeNotes << - endl << - - setw (fieldWidth) << - "tupletMeasureNumber" << " : " << - fMeasureElementMeasureNumber << - endl << - setw (fieldWidth) << - "positionInMeasure" << " : " << - fMeasureElementPositionInMeasure << - endl << - endl; - -/* JMI ??? - os << left << - setw (fieldWidth) << - "(position in measure" << " : "; - if (fMeasureElementPositionInMeasure.getNumerator () < 0) { - os << "???)"; - } - else { - os << fMeasureElementPositionInMeasure << ")"; - } - os << endl; - */ - - gIndenter--; - - if (fTupletElementsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fTupletElementsList.begin (), - iEnd = fTupletElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - - // JMI os << endl; - } - - os << - "TupletTupletUpLink: "; - if (fTupletTupletUpLink) { - os << - fTupletTupletUpLink->asShortString (); - } - else { - os << "none"; - } - os << endl; -} - -void msrTuplet::printShort (indentedOstream& os) -{ - os << - "Tuplet " << - fTupletNumber << - ", " << - fTupletFactor.asString () << - ", " << - singularOrPlural ( - fTupletElementsList.size (), "element", "elements") << - ", whole notes: " << - fMeasureElementSoundingWholeNotes << " sounding, " << - fTupletDisplayWholeNotes << " displayed" << - ", meas "<< - fMeasureElementMeasureNumber << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 30; - - os << left << - setw (fieldWidth) << - "tupletBracketKind" << " : " << - tupletBracketKindAsString ( - fTupletBracketKind) << - endl << - setw (fieldWidth) << - "tupletLineShapeKind" << " : " << - tupletLineShapeKindAsString ( - fTupletLineShapeKind) << - endl << - setw (fieldWidth) << - "tupletShowNumberKind" << " : " << - tupletShowNumberKindAsString ( - fTupletShowNumberKind) << - endl << - setw (fieldWidth) << - "tupletShowTypeKind" << " : " << - tupletShowTypeKindAsString ( - fTupletShowTypeKind) << - endl << - - setw (fieldWidth) << - "memberNotesSoundingWholeNotes" << " : " << - fMemberNotesSoundingWholeNotes << - endl << - setw (fieldWidth) << - "memberNotesDisplayWholeNotes" << " : " << - fMemberNotesDisplayWholeNotes << - endl << - - setw (fieldWidth) << - "tupletSoundingWholeNotes" << " : " << - fMeasureElementSoundingWholeNotes << - endl << - setw (fieldWidth) << - "tupletDisplayWholeNotes" << " : " << - fTupletDisplayWholeNotes << - endl << - - setw (fieldWidth) << - "tupletMeasureNumber" << " : " << - fMeasureElementMeasureNumber << - endl << - setw (fieldWidth) << - "positionInMeasure" << " : " << - fMeasureElementPositionInMeasure << - endl << - endl; - -/* JMI ??? - os << left << - setw (fieldWidth) << - "(position in measure" << " : "; - if (fMeasureElementPositionInMeasure.getNumerator () < 0) { - os << "???)"; - } - else { - os << fMeasureElementPositionInMeasure << ")"; - } - os << endl; - */ - - gIndenter--; - - if (fTupletElementsList.size ()) { - os << - "TupletElements:" << - endl; - - gIndenter++; - - list::const_iterator - iBegin = fTupletElementsList.begin (), - iEnd = fTupletElementsList.end (), - i = iBegin; - for ( ; ; ) { - os << - (*i)->asShortString () << - endl; - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - - // JMI os << endl; - } - - os << - "TupletTupletUpLink: "; - if (fTupletTupletUpLink) { - os << - fTupletTupletUpLink->asShortString (); - } - else { - os << "none"; - } - os << endl; -} - -ostream& operator<< (ostream& os, const S_msrTuplet& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrTuplets_MUT_DEP.h b/src/lilypond/msrTuplets_MUT_DEP.h deleted file mode 100644 index 5e051a65d..000000000 --- a/src/lilypond/msrTuplets_MUT_DEP.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrTuplet : public msrTupletElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrTupletTypeKind { - kTupletTypeNone, - kTupletTypeStart, kTupletTypeContinue, kTupletTypeStop, - kTupletTypeStartAndStopInARow }; - - static string tupletTypeKindAsString ( - msrTupletTypeKind tupletTypeKind); - - enum msrTupletBracketKind { - kTupletBracketYes, kTupletBracketNo}; - - static string tupletBracketKindAsString ( - msrTupletBracketKind tupletBracketKind); - - enum msrTupletLineShapeKind { - kTupletLineShapeStraight, kTupletLineShapeCurved}; - - static string tupletLineShapeKindAsString ( - msrTupletLineShapeKind tupletLineShapeKind); - - enum msrTupletShowNumberKind { - kTupletShowNumberActual, kTupletShowNumberBoth, kTupletShowNumberNone }; - - static string tupletShowNumberKindAsString ( - msrTupletShowNumberKind tupletShowNumberKind); - - enum msrTupletShowTypeKind { - kTupletShowTypeActual, kTupletShowTypeBoth, kTupletShowTypeNone }; - - static string tupletShowTypeKindAsString ( - msrTupletShowTypeKind tupletShowTypeKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - string tupletMeasureNumber, - int tupletNumber, - msrTupletBracketKind tupletBracketKind, - msrTupletLineShapeKind tupletLineShapeKind, - msrTupletShowNumberKind tupletShowNumberKind, - msrTupletShowTypeKind tupletShowTypeKind, - msrTupletFactor tupletFactor, - rational memberNotesSoundingWholeNotes, - rational memberNotesDisplayWholeNotes); - - SMARTP createTupletNewbornClone (); - - SMARTP createTupletDeepCopy (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrTuplet ( - int inputLineNumber, - string tupletMeasureNumber, - int tupletNumber, - msrTupletBracketKind tupletBracketKind, - msrTupletLineShapeKind tupletLineShapeKind, - msrTupletShowNumberKind tupletShowNumberKind, - msrTupletShowTypeKind tupletShowTypeKind, - msrTupletFactor tupletFactor, - rational memberNotesSoundingWholeNotes, - rational memberNotesDisplayWholeNotes); - - virtual ~msrTuplet (); - - public: - - // set and get - // ------------------------------------------------------ - - // tuplet uplink - void setTupletTupletUpLink ( - const S_msrTuplet& tuplet) - { fTupletTupletUpLink = tuplet; } - - S_msrTuplet getTupletTupletUpLink () const - { return fTupletTupletUpLink; } - - // measure upLink - void setTupletMeasureUpLink ( - const S_msrMeasure& measure) - { fTupletMeasureUpLink = measure; } - - S_msrMeasure getTupletMeasureUpLink () const - { return fTupletMeasureUpLink; } - - // positions in measures - rational setTupletMembersPositionInMeasure ( - S_msrMeasure measure, - rational positionInMeasure); - // returns the position after the tuplet JMI ??? - - int getTupletNumber () const - { return fTupletNumber; } - - msrTupletBracketKind getTupletBracketKind () const - { return fTupletBracketKind; } - - msrTupletLineShapeKind - getTupletLineShapeKind () const - { return fTupletLineShapeKind; } - - msrTupletShowNumberKind - getTupletShowNumberKind () const - { return fTupletShowNumberKind; } - - msrTupletShowTypeKind getTupletShowTypeKind () const - { return fTupletShowTypeKind; } - - const msrTupletFactor& - getTupletFactor () - { return fTupletFactor; } - - rational getMemberNotesSoundingWholeNotes () const - { return fMemberNotesSoundingWholeNotes; } - rational getMemberNotesDisplayWholeNotes () const - { return fMemberNotesDisplayWholeNotes; } - -/* JMI - const list& - getTupletElementsList () const - { return fTupletElementsList; } - */ - - rational getTupletSoundingWholeNotes () const - // JMI { return fTupletSoundingWholeNotes; } - { return fMeasureElementSoundingWholeNotes; } - - rational getTupletDisplayWholeNotes () const - { return fTupletDisplayWholeNotes; } - - // services - // ------------------------------------------------------ - - void addNoteToTuplet ( - S_msrNote note, - S_msrVoice voice); - - void addChordToTuplet (S_msrChord chord); - - void addTupletToTuplet (S_msrTuplet tuplet); - - void addTupletToTupletClone (S_msrTuplet tuplet); - - S_msrNote fetchTupletFirstNonGraceNote () const; - - S_msrNote removeFirstNoteFromTuplet ( // JMI - int inputLineNumber); - S_msrNote removeLastNoteFromTuplet ( - int inputLineNumber); - - // JMI void applyDisplayFactorToTupletMembers (); - - void unapplySoundingFactorToTupletMembers ( - const msrTupletFactor& containingTupletFactor); - -/* JMI - // finalization - void finalizeTuplet ( - int inputLineNumber); -*/ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asString () const; - - virtual void print (ostream& os) const; - - virtual void printShort (indentedOstream& os); - - private: - - // fields - // ------------------------------------------------------ - - // upLink - S_msrMeasure fTupletMeasureUpLink; - S_msrTuplet fTupletTupletUpLink; - - int fTupletNumber; - - // appearance - msrTupletBracketKind fTupletBracketKind; - - msrTupletLineShapeKind - fTupletLineShapeKind; - - msrTupletShowNumberKind - fTupletShowNumberKind; - - msrTupletShowTypeKind fTupletShowTypeKind; - - // factor - msrTupletFactor fTupletFactor; - - // member notes - rational fMemberNotesSoundingWholeNotes; - rational fMemberNotesDisplayWholeNotes; - -// JMI rational fTupletSoundingWholeNotes; - // display whole notes - rational fTupletDisplayWholeNotes; - - list - fTupletElementsList; -}; -typedef SMARTP S_msrTuplet; -EXP ostream& operator<< (ostream& os, const S_msrTuplet& elt); - diff --git a/src/lilypond/msrVarValAssocs.cpp b/src/lilypond/msrVarValAssocs.cpp deleted file mode 100644 index 514a957f5..000000000 --- a/src/lilypond/msrVarValAssocs.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrVarValAssocs.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrVarValAssoc msrVarValAssoc::create ( - int inputLineNumber, - msrVarValAssocKind varValAssocKind, - string value) -{ - msrVarValAssoc* o = - new msrVarValAssoc( - inputLineNumber, - varValAssocKind, value); - assert(o!=0); - return o; -} - -msrVarValAssoc::msrVarValAssoc ( - int inputLineNumber, - msrVarValAssocKind varValAssocKind, - string value) - : msrElement (inputLineNumber) -{ - fVarValAssocKind = varValAssocKind; - fVariableValue = value; -} - -msrVarValAssoc::~msrVarValAssoc () -{} - -void msrVarValAssoc::setVariableValue (string value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVarValAssocs) { - gLogOstream << - "Setting the value of marVarValAssoc \"" << - varValAssocKindAsString (fVarValAssocKind) << - "\" to '" << - value << - "', line " << fInputLineNumber << - endl; - } -#endif - - fVariableValue = value; -} - -void msrVarValAssoc::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVarValAssoc::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVarValAssoc elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVarValAssoc::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrVarValAssoc::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVarValAssoc::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVarValAssoc elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVarValAssoc::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrVarValAssoc::browseData (basevisitor* v) -{} - -string msrVarValAssoc::varValAssocKindAsString ( - msrVarValAssocKind varValAssocKind) -{ - string result; - - switch (varValAssocKind) { - case msrVarValAssoc::kWorkNumber: - result = "workNumber"; - break; - case msrVarValAssoc::kWorkTitle: - result = "workTitle"; - break; - case msrVarValAssoc::kMovementNumber: - result = "movementNumber"; - break; - case msrVarValAssoc::kMovementTitle: - result = "movementTitle"; - break; - case msrVarValAssoc::kEncodingDate: - result = "encodingDate"; - break; - case msrVarValAssoc::kScoreInstrument: - result = "scoreInstrument"; - break; - case msrVarValAssoc::kMiscellaneousField: - result = "miscellaneousField"; - break; - } // switch - - return result; -} - -void msrVarValAssoc::print (ostream& os) const -{ - os << - "MSR VarValAssoc" << - endl; - - gIndenter++; - - string variableValue; - - for_each ( - fVariableValue.begin (), - fVariableValue.end (), - stringQuoteEscaper (variableValue)); - - // print resulting strings - const int fieldWidth = 16; - - os << left << - setw (fieldWidth) << - "variable kind" << " : " << - varValAssocKindAsString () << - endl << - setw (fieldWidth) << - "variable value" << " : " << - "\"" << variableValue << "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrVarValAssoc& elt) { - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_msrVarValsListAssoc msrVarValsListAssoc::create ( - int inputLineNumber, - msrVarValsListAssocKind varValsListAssocKind) -{ - msrVarValsListAssoc* o = - new msrVarValsListAssoc( - inputLineNumber, - varValsListAssocKind); - assert(o!=0); - return o; -} - -msrVarValsListAssoc::msrVarValsListAssoc ( - int inputLineNumber, - msrVarValsListAssocKind varValsListAssocKind) - : msrElement (inputLineNumber) -{ - fVarValsListAssocKind = varValsListAssocKind; -} - -msrVarValsListAssoc::~msrVarValsListAssoc () -{} - -void msrVarValsListAssoc::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVarValsListAssoc::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVarValsListAssoc elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVarValsListAssoc::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrVarValsListAssoc::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVarValsListAssoc::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVarValsListAssoc elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVarValsListAssoc::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrVarValsListAssoc::browseData (basevisitor* v) -{} - -string msrVarValsListAssoc::varValsListAssocKindAsString ( - msrVarValsListAssocKind varValsListAssocKind) -{ - string result; - - switch (varValsListAssocKind) { - case msrVarValsListAssoc::kRights: - result = "rights"; - break; - case msrVarValsListAssoc::kComposer: - result = "composer"; - break; - case msrVarValsListAssoc::kArranger: - result = "arranger"; - break; - case msrVarValsListAssoc::kLyricist: - result = "lyricist"; - break; - case msrVarValsListAssoc::kPoet: - result = "poet"; - break; - case msrVarValsListAssoc::kTranslator: - result = "translator"; - break; - case msrVarValsListAssoc::kArtist: - result = "artist"; - break; - case msrVarValsListAssoc::kSoftware: - result = "software"; - break; - } // switch - - return result; -} - -string msrVarValsListAssoc::varValsListAssocValuesAsString () const -{ - stringstream s; - - list::const_iterator - iBegin = fVariableValuesList.begin (), - iEnd = fVariableValuesList.end (), - i = iBegin; - - s << "["; - if (fVariableValuesList.size ()) { - for ( ; ; ) { - s << "\"" << (*i) << "\""; - if (++i == iEnd) break; - s << ", "; - } // for - } - s << "]"; - - return s.str (); -} - -void msrVarValsListAssoc::print (ostream& os) const -{ - os << - "MSR VarValsListAssoc" << - endl; - - gIndenter++; - - const int fieldWidth = 16; - - os << left << - setw (fieldWidth) << - "assoc kind" << " : " << - varValsListAssocKindAsString () << - endl << - setw (fieldWidth) << - - "variable values" << " : " << - endl; - - gIndenter++; - - if (fVariableValuesList.size ()) { - list::const_iterator - iBegin = fVariableValuesList.begin (), - iEnd = fVariableValuesList.end (), - i = iBegin; - - for ( ; ; ) { - os << "\"" << (*i) << "\""; - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrVarValsListAssoc& elt) { - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrVarValAssocs.h b/src/lilypond/msrVarValAssocs.h deleted file mode 100644 index e29072740..000000000 --- a/src/lilypond/msrVarValAssocs.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrVarValAssocs___ -#define ___msrVarValAssocs___ - -#include - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrVarValAssoc : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrVarValAssocKind { - kWorkNumber, kWorkTitle, - kMovementNumber, kMovementTitle, - kEncodingDate, - kScoreInstrument, - kMiscellaneousField }; - - static string varValAssocKindAsString ( - msrVarValAssocKind varValAssocKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrVarValAssocKind varValAssocKind, - string value); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrVarValAssoc ( - int inputLineNumber, - msrVarValAssocKind varValAssocKind, - string value); - - virtual ~msrVarValAssoc (); - - public: - - // set and get - // ------------------------------------------------------ - - msrVarValAssocKind getVarValAssocKind () const - { return fVarValAssocKind; } - - void setVariableValue (string value); - - string getVariableValue () const - { return fVariableValue; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string varValAssocKindAsString () const - { - return - varValAssocKindAsString ( - fVarValAssocKind); - } - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrVarValAssocKind fVarValAssocKind; - - string fVariableValue; -}; -typedef SMARTP S_msrVarValAssoc; -EXP ostream& operator<< (ostream& os, const S_msrVarValAssoc& elt); - -//______________________________________________________________________________ -class msrVarValsListAssoc : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrVarValsListAssocKind { - kRights, - kComposer, kArranger, kLyricist, kPoet, kTranslator, - kArtist, - kSoftware }; - - static string varValsListAssocKindAsString ( - msrVarValsListAssocKind varValsListAssocKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrVarValsListAssocKind varValsListAssocKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrVarValsListAssoc ( - int inputLineNumber, - msrVarValsListAssocKind varValsListAssocKind); - - virtual ~msrVarValsListAssoc (); - - public: - - // set and get - // ------------------------------------------------------ - - msrVarValsListAssocKind - getVarValsListAssocKind () const - { return fVarValsListAssocKind; } - - const list& getVariableValuesList () - { return fVariableValuesList; } - - // services - // ------------------------------------------------------ - - void addAssocVariableValue (string value) - { - fVariableValuesList.push_back (value); - } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string varValsListAssocKindAsString () const - { - return - varValsListAssocKindAsString ( - fVarValsListAssocKind); - } - - string varValsListAssocValuesAsString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrVarValsListAssocKind - fVarValsListAssocKind; - - list fVariableValuesList; -}; -typedef SMARTP S_msrVarValsListAssoc; -EXP ostream& operator<< (ostream& os, const S_msrVarValsListAssoc& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrVoice2MasterVoiceCreator.cpp b/src/lilypond/msrVoice2MasterVoiceCreator.cpp deleted file mode 100644 index 2e605e635..000000000 --- a/src/lilypond/msrVoice2MasterVoiceCreator.cpp +++ /dev/null @@ -1,2009 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // INT_MIN, INT_MAX -#include // for_each - -#include "conversions.h" - -#include "msrVoice2MasterVoiceCreator.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" -#include "lilypondOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -msrVoice2MasterVoiceCreator::msrVoice2MasterVoiceCreator ( - indentedOstream& ios, - S_msrVoice mVoice) - : fLogOutputStream (ios) -{ - // the MSR score we're visiting - fVisitedMsrVoice = mVoice; - - // create an empty clone of fVisitedMsrVoice - fMasterVoice = - fVisitedMsrVoice-> - createVoiceNewbornClone (nullptr); // JMI ??? CRASH - - // voices - fOnGoingHarmonyVoice = false; - fOnGoingFiguredBassVoice = false; - - // repeats - - // notes - fOnGoingNote = false; - - // chords - fOnGoingChord = false; -}; - -msrVoice2MasterVoiceCreator::~msrVoice2MasterVoiceCreator () -{} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::buildMsrMasterFromMsrVoice () -{ - if (fVisitedMsrVoice) { - // create a msrVoice browser - msrBrowser browser (this); - - // browse the visited voice with the browser - browser.browse (*fVisitedMsrVoice); - } -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrVoice& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrVoice \"" << - elt->asString () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - switch (elt->getVoiceKind ()) { - - case msrVoice::kVoiceRegular: - break; - - case msrVoice::kVoiceHarmony: - { - } - break; - - case msrVoice::kVoiceFiguredBass: - { - } - break; - } // switch - - fFirstNoteCloneInVoice = nullptr; -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrVoice& elt) -{ - gIndenter--; - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrVoice \"" << - elt->getVoiceName () << "\"" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - switch (elt->getVoiceKind ()) { - case msrVoice::kVoiceRegular: - // JMI - break; - - case msrVoice::kVoiceHarmony: - fOnGoingHarmonyVoice = false; - break; - - case msrVoice::kVoiceFiguredBass: - fOnGoingFiguredBassVoice = false; - break; - } // switch -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrSegment& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a clone of the segment - fCurrentSegmentClone = - elt->createSegmentNewbornClone ( - fMasterVoice); - - // set it as the new voice last segment - fMasterVoice-> - setVoiceLastSegmentInVoiceClone ( - fCurrentSegmentClone); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrSegment& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrSegment '" << - elt->getSegmentAbsoluteNumber () << "'" << - ", line " << inputLineNumber << - endl; - } -#endif - - fMasterVoice-> - handleSegmentCloneEndInVoiceClone ( - inputLineNumber, - fCurrentSegmentClone); - - // forget current segment clone - fCurrentSegmentClone = nullptr; -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrHarmony& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrHarmony '" << - elt->asString () << - ", fOnGoingNote = " << booleanAsString (fOnGoingNote) << - ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - ", fOnGoingHarmonyVoice = " << booleanAsString (fOnGoingHarmonyVoice) << - "', line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a harmony new born clone - fCurrentHarmonyClone = - elt-> - createHarmonyNewbornClone ( - fMasterVoice); - - if (fOnGoingNote) { - // register the harmony in the current non-grace note clone - fCurrentNonGraceNoteClone-> - appendNoteToNoteHarmoniesList ( - fCurrentHarmonyClone); - - // don't append the harmony to the part harmony, - // this has been done in pass2b // JMI ??? - } - - else if (fOnGoingChord) { - // register the harmony in the current chord clone - fCurrentChordClone-> - appendHarmonyToChord (fCurrentHarmonyClone); // JMI - } - - else if (fOnGoingHarmonyVoice) { - /* JMI - // get the harmony whole notes offset - rational - harmonyWholeNotesOffset = - elt->getHarmonyWholeNotesOffset (); - - // is harmonyWholeNotesOffset not equal to 0? - if (harmonyWholeNotesOffset.getNumerator () != 0) { - // create skip with duration harmonyWholeNotesOffset - S_msrNote - skip = - msrNote::createSkipNote ( - elt-> getInputLineNumber (), - "666", // JMI elt-> getHarmonyMeasureNumber (), - elt-> getHarmonyDisplayWholeNotes (), // would be 0/1 otherwise JMI - elt-> getHarmonyDisplayWholeNotes (), - 0, // JMI elt-> getHarmonyDotsNumber (), - fMasterVoice-> getRegularVoiceStaffSequentialNumber (), // JMI - fMasterVoice-> getVoiceNumber ()); - - // append it to the current voice clone - // to 'push' the harmony aside - fMasterVoice-> - appendNoteToVoice (skip); - } -*/ - - // append the harmony to the current voice clone - fMasterVoice-> - appendHarmonyToVoiceClone ( - fCurrentHarmonyClone); - } -} - -void msrVoice2MasterVoiceCreator::visitStart (S_msrHarmonyDegree& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting S_msrHarmonyDegree '" << - elt->asString () << - ", fOnGoingNote = " << booleanAsString (fOnGoingNote) << - ", fOnGoingChord = " << booleanAsString (fOnGoingChord) << - ", fOnGoingHarmonyVoice = " << booleanAsString (fOnGoingHarmonyVoice) << - "', line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the harmony degree to the current harmony clone - fCurrentHarmonyClone-> - appendHarmonyDegreeToHarmony ( - elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrHarmony& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrHarmony '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentHarmonyClone = nullptr; -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrFrame& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFrame '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - // register the frame in the current non-grace note clone - fCurrentNonGraceNoteClone-> - setNoteFrame (elt); - } -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrFiguredBass& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", fOnGoingFiguredBassVoice = " << booleanAsString (fOnGoingFiguredBassVoice) << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create a figured bass new born clone - fCurrentFiguredBassClone = - elt-> - createFiguredBassNewbornClone ( - fMasterVoice); - - if (fOnGoingNote) { - // register the figured bass in the current non-grace note clone - fCurrentNonGraceNoteClone-> - setNoteFiguredBass (fCurrentFiguredBassClone); - - // don't append the figured bass to the part figured bass, - // this will be done below - } - - /* JMI - else if (fOnGoingChord) { - // register the figured bass in the current chord clone - fCurrentChordClone-> - setChordFiguredBass (fCurrentFiguredBassClone); // JMI - } - */ - - else if (fOnGoingFiguredBassVoice) { // JMI - /* - // register the figured bass in the part clone figured bass - fCurrentPartClone-> - appendFiguredBassToPartClone ( - fMasterVoice, - fCurrentFiguredBassClone); - */ - // append the figured bass to the current voice clone - fMasterVoice-> - appendFiguredBassToVoiceClone ( - fCurrentFiguredBassClone); - } -} - -void msrVoice2MasterVoiceCreator::visitStart (S_msrFigure& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFigure '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the figure to the current figured bass - fCurrentFiguredBassClone-> - appendFigureToFiguredBass ( - elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrFiguredBass& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrFiguredBass '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFiguredBassClone = nullptr; -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrMeasure& elt) -{ - int - inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - - int - measurePuristNumber = - elt->getMeasurePuristNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasure '" << - measureNumber << - "', measurePuristNumber = '" << - measurePuristNumber << - "', line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - // create a clone of the measure - fCurrentMeasureClone = - elt-> - createMeasureNewbornClone ( - fCurrentSegmentClone); - - // is this a full measures rest? - if (elt->getMeasureIsAFullMeasureRest ()) { - // yes - - // should we compress full measures rests? - if (gLilypondOah->fCompressFullMeasureRests) { - // yes - - if (! fCurrentRestMeasure) { - // this is the first full measure rest in the sequence - - // create a rest measures containing fCurrentMeasureClone - fCurrentRestMeasures = - msrRestMeasures::create ( - inputLineNumber, - fCurrentMeasureClone, - fMasterVoice); - -/* JMI - // append the current rest measures to the current voice clone - fMasterVoice-> - appendRestMeasuresToVoice ( - inputLineNumber, - fCurrentRestMeasures); - */ - } - - else { - // this is a subsequent full measure rest, merely append it - fCurrentRestMeasures-> - appendMeasureCloneToRestMeasures ( - fCurrentMeasureClone); - } - - fCurrentRestMeasure = fCurrentMeasureClone; - } - - else { - // no - - // append current measure clone to the current voice clone - fMasterVoice-> - appendMeasureCloneToVoiceClone ( - inputLineNumber, - fCurrentMeasureClone); - } - } - - else { - // no - - // append current measure clone to the current voice clone - fMasterVoice-> - appendMeasureCloneToVoiceClone ( - inputLineNumber, - fCurrentMeasureClone); - } - - // should the last bar check's measure purist number be set? - if (fLastBarCheck) { - fLastBarCheck-> - setNextBarPuristNumber ( - measurePuristNumber); - - fLastBarCheck = nullptr; - } -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrMeasure& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - string - measureNumber = - elt->getMeasureElementMeasureNumber (); - - string - nextMeasureNumber = - elt->getNextMeasureNumber (); - - int - measurePuristNumber = - elt->getMeasurePuristNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasure '" << - measureNumber << - "', nextMeasureNumber = '" << - nextMeasureNumber << - "', measurePuristNumber = '" << - measurePuristNumber << - "', line " << inputLineNumber << - endl; - } -#endif - - fCurrentMeasureClone-> - finalizeMeasureClone ( - inputLineNumber, - elt, // original measure - fMasterVoice); - - bool doCreateABarCheck = false; - - switch (elt->getMeasureKind ()) { - case msrMeasure::kMeasureKindUnknown: - { - stringstream s; - - s << - "measure '" << measureNumber << - "' in voice \"" << - elt-> - fetchMeasureVoiceUpLink ()-> - getVoiceName () << - "\" is of unknown kind"; - - // JMI msrInternalError ( - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - break; - - case msrMeasure::kMeasureKindRegular: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindAnacrusis: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindIncompleteStandalone: - case msrMeasure::kMeasureKindIncompleteLastInRepeatCommonPart: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHookedEnding: - case msrMeasure::kMeasureKindIncompleteLastInRepeatHooklessEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterCommonPart: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHookedEnding: - case msrMeasure::kMeasureKindIncompleteNextMeasureAfterHooklessEnding: - // generate a bar check if relevant - switch (elt-> getMeasureEndRegularKind ()) { - case msrMeasure::kMeasureEndRegularKindUnknown: - break; - case msrMeasure::kMeasureEndRegularKindYes: - doCreateABarCheck = true; - break; - case msrMeasure::kMeasureEndRegularKindNo: - break; - } // switch - break; - - case msrMeasure::kMeasureKindOvercomplete: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindCadenza: - doCreateABarCheck = true; - break; - - case msrMeasure::kMeasureKindMusicallyEmpty: - // JMI - break; - } // switch - - // is this a full measures rest? - if (elt->getMeasureIsAFullMeasureRest ()) { - // yes JMI - } - - else { - // no - - // should we compress full measures rests? - if (gLilypondOah->fCompressFullMeasureRests) { - // yes - - if (fCurrentRestMeasures) { - // append the current rest measures to the current voice clone - fMasterVoice-> - appendRestMeasuresToVoice ( - inputLineNumber, - fCurrentRestMeasures); - - // forget about the current rest measure - fCurrentRestMeasure = nullptr; - - // forget about the current rest measures - fCurrentRestMeasures = nullptr; - } - - else { - stringstream s; - - s << - "fCurrentRestMeasures is null upon full measure rest end" << - measureNumber << - "', measurePuristNumber = '" << - measurePuristNumber << - "', line " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - if (doCreateABarCheck) { - // create a bar check - int voiceCurrentMeasurePuristNumber = - fMasterVoice-> - getVoiceCurrentMeasurePuristNumber (); - - fLastBarCheck = - msrBarCheck::createWithNextBarPuristNumber ( - inputLineNumber, - nextMeasureNumber, - voiceCurrentMeasurePuristNumber); - - // append it to the current voice clone - fMasterVoice-> - appendBarCheckToVoice (fLastBarCheck); - - // create a bar number check - // should NOT be done in cadenza, SEE TO IT JMI - S_msrBarNumberCheck - barNumberCheck_ = - msrBarNumberCheck::create ( - inputLineNumber, - nextMeasureNumber, - voiceCurrentMeasurePuristNumber); - - // append it to the current voice clone - fMasterVoice-> - appendBarNumberCheckToVoice (barNumberCheck_); - } -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrKey& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrKey" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendKeyToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrKey& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrKey" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrTime& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTime" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append time to voice clone - fMasterVoice-> - appendTimeToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrTime& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTime" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrTempo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendTempoToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrTempo& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTempo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendRehearsalToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrRehearsal& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRehearsal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrFermata& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrFermata" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // a fermata is an articulation - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendArticulationToNote (elt); - } - else if (fOnGoingChord) { - fCurrentChordClone-> - appendArticulationToChord (elt); - } -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrSlash& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSlash" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - if (fOnGoingNote) { - fCurrentNonGraceNoteClone-> - appendSlashToNote (elt); - } - - else if (fOnGoingChord) { - fCurrentChordClone-> - appendSlashToChord (elt); - } -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrNote& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrNote '" << - elt->asString () << - "'" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the note clone - S_msrNote - noteClone = - elt->createNoteNewbornClone ( - nullptr); // JMI ??? CRASH - - switch (elt->getNoteKind ()) { - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - case msrNote::kGraceTupletMemberNote: - break; - - default: - fCurrentNonGraceNoteClone = noteClone; - - if (! fFirstNoteCloneInVoice) { - fFirstNoteCloneInVoice = - fCurrentNonGraceNoteClone; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceVoices) { - fLogOutputStream << - "The first note of voice clone RJIRWR '" << - fMasterVoice->getVoiceName () << - "' is '" << - fFirstNoteCloneInVoice->asShortString () << - "'" << - endl; - } -#endif - } - - fOnGoingNote = true; - } // switch - -/* JMI - // can we optimize graceNotesGroup into afterGraceNotesGroup? - if ( - elt->getNoteIsFollowedByGraceNotesGroup () - && - elt->getNoteTrillOrnament ()) { - // yes, create the after grace notes -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesGroup) { - fLogOutputStream << - "Optimizing grace notes on trilled note '" << - elt->asShortString () << - "' as after grace notes " << - ", line " << inputLineNumber << - endl; - } -#endif - - fPendingAfterGraceNotesGroup = - msrAfterGraceNotesGroup::create ( - inputLineNumber, - fCurrentNonGraceNoteClone, - false, // aftergracenoteIsSlashed, may be updated later - fMasterVoice); - - // register current afterGraceNotesGroup element - fCurrentAfterGraceNotesGroupElement = - fCurrentNonGraceNoteClone; - } -*/ -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrNote& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrNote " << - elt->asString () << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "FAA fCurrentNonGraceNoteClone = " << - endl; - if (fCurrentNonGraceNoteClone) { - fLogOutputStream << - fCurrentNonGraceNoteClone; - } - else { - fLogOutputStream << - "nullptr" << - endl; - } - } -#endif - - switch (elt->getNoteKind ()) { - - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending rest note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fMasterVoice->getVoiceName () << - endl; - } -#endif - - fMasterVoice-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kSkipNote: // JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending skip note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fMasterVoice->getVoiceName () << - endl; - } -#endif - - fMasterVoice-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kUnpitchedNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending unpitched note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fMasterVoice->getVoiceName () << - endl; - } -#endif - - fMasterVoice-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kStandaloneNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending standalone note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "' to voice clone " << - fMasterVoice->getVoiceName () << - endl; - } -#endif - - fMasterVoice-> - appendNoteToVoiceClone ( - fCurrentNonGraceNoteClone); - break; - - case msrNote::kDoubleTremoloMemberNote: - break; - - case msrNote::kGraceNote: - break; - - case msrNote::kChordMemberNote: - if (fOnGoingChord) { - fCurrentChordClone-> - addAnotherNoteToChord ( - fCurrentNonGraceNoteClone, - fMasterVoice); - } - - else { - stringstream s; - - s << - "msrVoice2MasterVoiceCreator:::visitEnd (S_msrNote& elt): chord member note " << - elt->asString () << - " appears outside of a chord"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kGraceChordMemberNote: - if (fOnGoingChord) { - /* JMI - fCurrentChordClone-> - addAnotherNoteToChord ( - fCurrentGraceNoteClone, - fMasterVoice); - */ - } - - else { - stringstream s; - - s << - "msrVoice2MasterVoiceCreator:::visitEnd (S_msrNote& elt): chord member note " << - elt->asString () << - " appears outside of a chord"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending note clone '" << - fCurrentNonGraceNoteClone->asShortString () << "'' to voice clone " << - fMasterVoice->getVoiceName () << - endl; - } -#endif - - fTupletClonesStack.top ()-> - addNoteToTuplet ( - fCurrentNonGraceNoteClone, - fMasterVoice); - break; - } // switch - - fOnGoingNote = false; -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrChord& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrChord" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentChordClone = - elt->createChordNewbornClone ( - nullptr); // JMI ??? CRASH - -/* JMI - if (fTupletClonesStack.size ()) { - // a chord in a tuplet is handled as part of the tuplet JMI - fTupletClonesStack.top ()-> - addChordToTuplet ( - fCurrentChordClone); - } - - else if (fOnGoingDoubleTremolo) { - if (elt->getChordIsFirstChordInADoubleTremolo ()) { - / * JMI - // replace double tremolo's first element by chord - fCurrentDoubleTremoloClone-> - setDoubleTremoloChordFirstElement ( - elt) - * / - } - - else if (elt->getChordIsSecondChordInADoubleTremolo ()) { - / * JMI - // replace double tremolo's second element by chord - fCurrentDoubleTremoloClone-> - setDoubleTremoloChordSecondElement ( - elt); - * / - } - - else { - stringstream s; - - s << - "chord '" << elt->asString () << - "' belongs to a double tremolo, but is not marked as such"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else if (fCurrentGraceNotesGroupClone) { - // append the chord to the grace notes - fCurrentGraceNotesGroupClone-> - appendChordToGraceNotesGroup ( - fCurrentChordClone); - } - - else { - // appending the chord to the voice clone at once - fMasterVoice-> - appendChordToVoice ( - fCurrentChordClone); - } - */ - - fOnGoingChord = true; -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrChord& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrChord" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingChord = false; -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // create the tuplet clone - S_msrTuplet - tupletClone = - elt->createTupletNewbornClone (); - - // register it in this visitor -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "++> pushing tuplet '" << - tupletClone->asString () << - "' to tuplets stack" << - endl; - } -#endif - - fTupletClonesStack.push (tupletClone); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrTuplet& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrTuplet" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Popping tuplet '" << - elt->asString () << - "' from tuplets stack" << - endl; - } -#endif - - fTupletClonesStack.pop (); - - if (fTupletClonesStack.size ()) { - // tuplet is a nested tuplet -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Adding nested tuplet '" << - elt->asString () << - "' to stack top tuplet '" << - fTupletClonesStack.top ()->asString () << - "'" << - endl; - } -#endif - - fTupletClonesStack.top ()-> - addTupletToTupletClone (elt); - } - - else { - // tuplet is a top level tuplet - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Adding top level tuplet '" << - elt->asString () << - "' to voice" << - fMasterVoice->getVoiceName () << - endl; - } -#endif - - fMasterVoice-> - appendTupletToVoice (elt); - } -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrSegno& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrSegno" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendSegnoToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitStart (S_msrCoda& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrCoda" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendCodaToVoice (elt); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrScordatura& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting scordatura" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNonGraceNoteClone-> - appendScordaturaToNote (elt); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarCheck" << - ", nextBarNumber: " << - elt->getNextBarPuristNumber () << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendBarCheckToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrBarCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarNumberCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendBarNumberCheckToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrBarNumberCheck& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarNumberCheck" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrLineBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrLineBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendLineBreakToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrLineBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrLineBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrPageBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrPageBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fMasterVoice-> - appendPageBreakToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrPageBreak& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrPageBreak" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling repeat start in voice clone \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleRepeatStartInVoiceClone ( - inputLineNumber, - elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling repeat end in voice clone \"" << - fMasterVoice->getVoiceName () << -// "\" in part \"" << -// fCurrentPartClone->getPartCombinedName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleRepeatEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrRepeatCommonPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeatCommonPart" << - ", line " << inputLineNumber << - endl; - } -#endif - - fMasterVoice-> - handleRepeatCommonPartStartInVoiceClone ( - inputLineNumber); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrRepeatCommonPart& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeatCommonPart" << - ", line " << inputLineNumber << - endl; - } -#endif - - fMasterVoice-> - handleRepeatCommonPartEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrRepeatEnding& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRepeatEnding" << - ", line " << inputLineNumber << - endl; - } -#endif - - // handle the repeat ending start in the voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat ending start in voice clone \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleRepeatEndingStartInVoiceClone ( - inputLineNumber, - elt->getRepeatEndingKind (), - elt->getRepeatEndingNumber ()); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrRepeatEnding& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRepeatEnding" << - ", line " << inputLineNumber << - endl; - } -#endif - - // handle the repeat ending end in the voice clone -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat ending end in voice clone \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleRepeatEndingEndInVoiceClone ( - inputLineNumber, - elt->getRepeatEndingNumber (), - elt->getRepeatEndingKind ()); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrRestMeasures& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRestMeasures" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLogOutputStream << - "Handling multiple rest start in voice clone \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleRestMeasuresStartInVoiceClone ( - inputLineNumber, - elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrRestMeasures& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRestMeasures" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fLogOutputStream << - "Handling multiple rest start in voice clone \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleRestMeasuresEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrRestMeasuresContents& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrRestMeasuresContents" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fMasterVoice-> - displayVoice ( - inputLineNumber, - "Upon visitStart (S_msrRestMeasuresContents&)"); - } -#endif - - fMasterVoice-> - handleRestMeasuresContentsStartInVoiceClone ( - inputLineNumber); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrRestMeasuresContents& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrRestMeasuresContents" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - fMasterVoice-> - displayVoice ( - inputLineNumber, - "Upon visitEnd (S_msrRestMeasuresContents&) 1"); - } -#endif - - fMasterVoice-> - handleRestMeasuresContentsEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrMeasuresRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Handling measures repeat start in voice clone \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleMeasuresRepeatStartInVoiceClone ( - inputLineNumber, - elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrMeasuresRepeat& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasuresRepeat" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -/* JMI - // set last segment as the measures repeat pattern segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Setting current last segment as measures repeat pattern segment in voice \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif -*/ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Handling measures repeat end in voice clone \"" << - fMasterVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fMasterVoice-> - handleMeasuresRepeatEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrMeasuresRepeatPattern& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeatPattern" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fMasterVoice-> - displayVoice ( - inputLineNumber, - "Upon visitStart (S_msrMeasuresRepeatPattern&)"); - } -#endif - - fMasterVoice-> - handleMeasuresRepeatPatternStartInVoiceClone ( - inputLineNumber); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrMeasuresRepeatPattern& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrMeasuresRepeatPattern" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fMasterVoice-> - displayVoice ( - inputLineNumber, - "Upon visitEnd (S_msrMeasuresRepeatPattern&) 1"); - } -#endif - - fMasterVoice-> - handleMeasuresRepeatPatternEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrMeasuresRepeatReplicas& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrMeasuresRepeatReplicas" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fMasterVoice-> - displayVoice ( - inputLineNumber, - "Upon visitStart (S_msrMeasuresRepeatReplicas&)"); - } -#endif - - fMasterVoice-> - handleMeasuresRepeatReplicasStartInVoiceClone ( - inputLineNumber); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrMeasuresRepeatReplicas& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting S_msrMeasuresRepeatReplicas" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fMasterVoice-> - displayVoice ( - inputLineNumber, - "Upon visitEnd (S_msrMeasuresRepeatReplicas&) 1"); - } -#endif - - fMasterVoice-> - handleMeasuresRepeatReplicasEndInVoiceClone ( - inputLineNumber); -} - -//________________________________________________________________________ -void msrVoice2MasterVoiceCreator::visitStart (S_msrBarline& elt) -{ -#ifdef TRACE_OAH - int inputLineNumber = - elt->getInputLineNumber (); -#endif - -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> Start visiting msrBarline" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - fLogOutputStream << - "Handling '" << - msrBarline::barlineCategoryKindAsString ( - elt->getBarlineCategory ()) << - "' in voice \"" << - fMasterVoice->getVoiceName () << "\"" << - endl; - } -#endif - - // append the barline to the current voice clone - fMasterVoice-> - appendBarlineToVoice (elt); -} - -void msrVoice2MasterVoiceCreator::visitEnd (S_msrBarline& elt) -{ -#ifdef TRACE_OAH - if (gMsrOah->fTraceMsrVisitors) { - fLogOutputStream << - "--> End visiting msrBarline" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/msrVoice2MasterVoiceCreator.h b/src/lilypond/msrVoice2MasterVoiceCreator.h deleted file mode 100644 index 1a7ff23f6..000000000 --- a/src/lilypond/msrVoice2MasterVoiceCreator.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrVoice2MasterVoiceCreator___ -#define ___msrVoice2MasterVoiceCreator___ - -#include -#include - -#include "msr.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class msrVoice2MasterVoiceCreator : - - public visitor, - - // keys - - public visitor, - - // times - - public visitor, - - // tempo - - public visitor, - - public visitor, - - // rehearsal - - public visitor, - - // harmonies - - public visitor, - public visitor, - - // frames - - public visitor, - - // figured bass - - public visitor, - public visitor, - - // measures - - public visitor, - - // fermatas - - public visitor, - - // notes - - public visitor, - - // chords - - public visitor, - - // tuplets - - public visitor, - - // ? - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - - public visitor, - - // repeats - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor - -{ - public: - - msrVoice2MasterVoiceCreator ( - indentedOstream& ios, - S_msrVoice mVoice); - - virtual ~msrVoice2MasterVoiceCreator (); - - void buildMsrMasterFromMsrVoice (); - - S_msrVoice getMasterVoice () const - { return fMasterVoice; } - - protected: - - virtual void visitStart (S_msrVoice& elt); - virtual void visitEnd (S_msrVoice& elt); - - virtual void visitStart (S_msrKey& elt); - virtual void visitEnd (S_msrKey& elt); - - virtual void visitStart (S_msrTime& elt); - virtual void visitEnd (S_msrTime& elt); - - virtual void visitStart (S_msrTempo& elt); - virtual void visitEnd (S_msrTempo& elt); - - virtual void visitStart (S_msrRehearsal& elt); - virtual void visitEnd (S_msrRehearsal& elt); - - virtual void visitStart (S_msrSegment& elt); - virtual void visitEnd (S_msrSegment& elt); - - virtual void visitStart (S_msrHarmony& elt); - virtual void visitEnd (S_msrHarmony& elt); - virtual void visitStart (S_msrHarmonyDegree& elt); - - virtual void visitStart (S_msrFrame& elt); - - virtual void visitStart (S_msrFiguredBass& elt); - virtual void visitEnd (S_msrFiguredBass& elt); - virtual void visitStart (S_msrFigure& elt); - - virtual void visitStart (S_msrMeasure& elt); - virtual void visitEnd (S_msrMeasure& elt); - - virtual void visitStart (S_msrFermata& elt); - - virtual void visitStart (S_msrSlash& elt); - - virtual void visitStart (S_msrNote& elt); - virtual void visitEnd (S_msrNote& elt); - - virtual void visitStart (S_msrChord& elt); - virtual void visitEnd (S_msrChord& elt); - - virtual void visitStart (S_msrTuplet& elt); - virtual void visitEnd (S_msrTuplet& elt); - - virtual void visitStart (S_msrBarline& elt); - virtual void visitEnd (S_msrBarline& elt); - - virtual void visitStart (S_msrSegno& elt); - virtual void visitStart (S_msrCoda& elt); - - virtual void visitStart (S_msrScordatura& elt); - - virtual void visitStart (S_msrBarCheck& elt); - virtual void visitEnd (S_msrBarCheck& elt); - virtual void visitStart (S_msrBarNumberCheck& elt); - virtual void visitEnd (S_msrBarNumberCheck& elt); - - virtual void visitStart (S_msrLineBreak& elt); - virtual void visitEnd (S_msrLineBreak& elt); - - virtual void visitStart (S_msrPageBreak& elt); - virtual void visitEnd (S_msrPageBreak& elt); - - virtual void visitStart (S_msrRepeat& elt); - virtual void visitEnd (S_msrRepeat& elt); - virtual void visitStart (S_msrRepeatCommonPart& elt); - virtual void visitEnd (S_msrRepeatCommonPart& elt); - virtual void visitStart (S_msrRepeatEnding& elt); - virtual void visitEnd (S_msrRepeatEnding& elt); - - virtual void visitStart (S_msrMeasuresRepeat& elt); - virtual void visitEnd (S_msrMeasuresRepeat& elt); - virtual void visitStart (S_msrMeasuresRepeatPattern& elt); - virtual void visitEnd (S_msrMeasuresRepeatPattern& elt); - virtual void visitStart (S_msrMeasuresRepeatReplicas& elt); - virtual void visitEnd (S_msrMeasuresRepeatReplicas& elt); - - virtual void visitStart (S_msrRestMeasures& elt); - virtual void visitEnd (S_msrRestMeasures& elt); - virtual void visitStart (S_msrRestMeasuresContents& elt); - virtual void visitEnd (S_msrRestMeasuresContents& elt); - - private: - - indentedOstream& fLogOutputStream; - - - // the MSR voice we're visiting - // ------------------------------------------------------ - S_msrVoice fVisitedMsrVoice; - - - // the MSR master voice we're building - // ------------------------------------------------------ - S_msrVoice fMasterVoice; - - - // harmonies - // ------------------------------------------------------ - bool fOnGoingHarmonyVoice; - - S_msrHarmony fCurrentHarmonyClone; - - list fPendingHarmoniesList; - - - // figured bass - // ------------------------------------------------------ - bool fOnGoingFiguredBassVoice; - S_msrFiguredBass fCurrentFiguredBassClone; - - - // segments - // ------------------------------------------------------ - // the current segment clone is the one at the top of the stack - S_msrSegment fCurrentSegmentClone; - - - // measures - // ------------------------------------------------------ - S_msrMeasure fCurrentMeasureClone; - - // full measure rests compression - S_msrMeasure fCurrentRestMeasure; - S_msrRestMeasures fCurrentRestMeasures; - - - // bar checks - // ------------------------------------------------------ - S_msrBarCheck fLastBarCheck; - - - // notes - // ------------------------------------------------------ - bool fOnGoingNote; - - // fCurrentNonGraceNoteClone is not used for grace notes, - // which are visited while the note they're attached to - // is being visited too - S_msrNote fCurrentNonGraceNoteClone; - - // to help workaround LilyPond issue 34 - S_msrNote fFirstNoteCloneInVoice; - - S_msrGraceNotesGroup fCurrentSkipGraceNotesGroup; - - - // chords - // ------------------------------------------------------ - bool fOnGoingChord; - S_msrChord fCurrentChordClone; - - // tuplets - // ------------------------------------------------------ -// S_msrTuplet fCurrentTupletClone; - // bool fOnGoingTuplet; - stack fTupletClonesStack; -}; - - -} - - -#endif diff --git a/src/lilypond/msrVoiceElements.cpp b/src/lilypond/msrVoiceElements.cpp deleted file mode 100644 index a0adc2b06..000000000 --- a/src/lilypond/msrVoiceElements.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX - -#include "msrVoiceElements.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ -//______________________________________________________________________________ -msrVoiceElement::msrVoiceElement ( - int inputLineNumber) - : msrElement (inputLineNumber) -{ - /* JMI - fVoiceNumber = "???"; - fPositionInVoice = rational (INT_MIN, 1); - */ -} - -msrVoiceElement::~msrVoiceElement () -{} - -/* JMI -void msrVoiceElement::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVoiceElement::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVoiceElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVoiceElement::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrVoiceElement::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVoiceElement::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVoiceElement elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVoiceElement::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -string msrVoiceElement::asString () const -{ - // this is overriden all in actual elements - return "??? msrVoiceElement::asString () ???"; -} - -string msrVoiceElement::asShortString () const -{ - // this can be overriden in actual elements - return asString () const; -} - -void msrVoiceElement::print (ostream& os) const -{ - os << asString () << endl; -} -*/ - -ostream& operator<< (ostream& os, const S_msrVoiceElement& elt) -{ - elt->print (os); - return os; -} - -} diff --git a/src/lilypond/msrVoiceElements.h b/src/lilypond/msrVoiceElements.h deleted file mode 100644 index 6a2bc8a4c..000000000 --- a/src/lilypond/msrVoiceElements.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrVoiceElements___ -#define ___msrVoiceElements___ - -#include "msrElements.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrVoiceElement : public msrElement -{ - public: - - // creation from MusicXML - // ------------------------------------------------------ - - // cloning - // ------------------------------------------------------ - - protected: - - msrVoiceElement ( - int inputLineNumber); - - virtual ~msrVoiceElement (); - - public: - -/* JMI - // set and get - // ------------------------------------------------------ - - void setVoiceNumber ( - string positionInVoice) - { - fVoiceNumber = - positionInVoice; - } - - string getVoiceNumber () - { return fVoiceNumber; } - - void setPositionInVoice ( - rational positionInVoice) - { - fPositionInVoice = - positionInVoice; - } - - rational getPositionInVoice () - { return fPositionInVoice; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v) = 0; - - public: - - // print - // ------------------------------------------------------ - - virtual std::string asShortString () const; - virtual std::string asString () const; - - virtual void print (ostream& os) const; - - virtual void printSummary (ostream& os) {} - - protected: - - // fields - // ------------------------------------------------------ - - string fVoiceNumber; - rational fPositionInVoice; - */ -}; -typedef SMARTP S_msrVoiceElement; -EXP ostream& operator<< (ostream& os, const S_msrVoiceElement& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/msrVoices.cpp b/src/lilypond/msrVoices.cpp deleted file mode 100644 index f13266522..000000000 --- a/src/lilypond/msrVoices.cpp +++ /dev/null @@ -1,9713 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX - -#include "msrMutualDependencies.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrRepeatDescr msrRepeatDescr::create ( - int repeatDescrStartInputLineNumber, - S_msrRepeat repeatDescrRepeat) -{ - msrRepeatDescr* o = new - msrRepeatDescr ( - repeatDescrStartInputLineNumber, - repeatDescrRepeat); - assert(o!=0); - return o; -} - -msrRepeatDescr::msrRepeatDescr ( - int repeatDescrStartInputLineNumber, - S_msrRepeat repeatDescrRepeat) -{ - fRepeatDescrStartInputLineNumber = - repeatDescrStartInputLineNumber; - fRepeatDescrRepeat = repeatDescrRepeat; -} - -msrRepeatDescr::~msrRepeatDescr () -{} - -string msrRepeatDescr::repeatDescrAsString () const -{ - stringstream s; - - s << - "fRepeatDescrRepeat = '" << - fRepeatDescrRepeat->asShortString () << - "', fRepeatDescrStartInputLineNumber = " << - fRepeatDescrStartInputLineNumber; - - return s.str (); -} - -void msrRepeatDescr::print (ostream& os) const -{ - const int fieldWidth = 29; - - os << left << - setw (fieldWidth) << - "repeatDescrRepeat" << " : " << - fRepeatDescrRepeat << - endl << - setw (fieldWidth) << - "repeatDescrStartInputLineNumber" << " : " << - fRepeatDescrStartInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_msrRepeatDescr& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -// global variable -int msrVoice::gVoicesCounter = 0; - -S_msrVoice msrVoice::create ( - int inputLineNumber, - msrVoiceKind voiceKind, - int voiceNumber, - msrVoiceCreateInitialLastSegmentKind - voiceCreateInitialLastSegmentKind, - S_msrStaff voiceStaffUpLink) -{ - msrVoice* o = - new msrVoice ( - inputLineNumber, - voiceKind, - voiceNumber, - voiceCreateInitialLastSegmentKind, - voiceStaffUpLink); - assert(o!=0); - - return o; -} - -msrVoice::msrVoice ( - int inputLineNumber, - msrVoiceKind voiceKind, - int voiceNumber, - msrVoiceCreateInitialLastSegmentKind - voiceCreateInitialLastSegmentKind, - S_msrStaff voiceStaffUpLink) - : msrElement (inputLineNumber) -{ - // sanity check - msrAssert( - voiceStaffUpLink != nullptr, - "voiceStaffUpLink is null"); - - // set voice staff upLink - fVoiceStaffUpLink = voiceStaffUpLink; - - // set voice kind - fVoiceKind = voiceKind; - - // set voice number - fVoiceNumber = voiceNumber; - - // do other initializations - initializeVoice ( - voiceCreateInitialLastSegmentKind); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Creating voice \"" << asString () << "\"" << - endl; - } -#endif -} - -msrVoice::~msrVoice () -{} - -S_msrPart msrVoice::fetchVoicePartUpLink () const -{ - return - fVoiceStaffUpLink-> - getStaffPartUpLink (); -} - -void msrVoice::setRegularVoiceStaffSequentialNumber ( - int regularVoiceStaffSequentialNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Setting the regular voice staff sequential number of voice \"" << - getVoiceName () << - "\" to " << regularVoiceStaffSequentialNumber << - endl; - } -#endif - - fRegularVoiceStaffSequentialNumber = - regularVoiceStaffSequentialNumber; -} - -void msrVoice::setVoiceNameFromNumber ( - int inputLineNumber, - int voiceNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Setting the name of '" << - voiceKindAsString () << - "' voice from number " << voiceNumber << - endl; - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - fVoiceName = - fVoiceStaffUpLink->getStaffName () + - "_Voice_" + - int2EnglishWord (voiceNumber); - break; - - case msrVoice::kVoiceHarmony: - fVoiceName = - fVoiceStaffUpLink->getStaffName () + - "_Voice_" + - int2EnglishWord ( - voiceNumber - K_VOICE_HARMONY_VOICE_BASE_NUMBER) + - "_HARMONY"; - break; - - case msrVoice::kVoiceFiguredBass: - fVoiceName = - fVoiceStaffUpLink->getStaffName () + - "_Voice_" + - int2EnglishWord ( - voiceNumber - K_VOICE_FIGURED_BASS_VOICE_BASE_NUMBER) + - "_FIGURED_BASS"; -/* JMI - { - stringstream s; - - s << - "A '" << - getVoiceName () << - "' voice cannot get its name from its number"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - */ - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "The resulting voice name is \"" << - fVoiceName << - "\"" << - endl; - } -#endif -} - -void msrVoice::setVoiceLastSegmentInVoiceClone ( - S_msrSegment segment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Setting segment '" << - segment->asShortString () << - "' as last segment in voice clone \"" << - fVoiceName << - "\"" << - ", line " << segment->getInputLineNumber () << - endl; - } -#endif - - // sanity check - msrAssert ( - segment != nullptr, - "segment is null"); - - fVoiceLastSegment = segment; - - if (! fVoiceFirstSegment) { - fVoiceFirstSegment = fVoiceLastSegment; - } -} - -void msrVoice::appendSegmentToVoiceClone ( //JMI VIRER??? - S_msrSegment segment) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Appending segment '" << - segment->asString () << - "' to voice clone \"" << - fVoiceName << - "\"" << - endl; - } -#endif - - int inputLineNumber = - segment->getInputLineNumber (); - - // does segment belong to a repeat? - if (fVoicePendingRepeatDescrsStack.size ()) { - // yes - - // JMI if (fVoiceLastSegment) { - - // append segment to whichever part of the repeat is adequate - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - currentRepeat-> - appendSegmentToRepeat ( - inputLineNumber, - segment, - "appendSegmentToVoiceClone()"); - } - - else { - // no - } - - { -/* JMI - // move fVoiceLastSegment to the initial voice elements list - moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( - inputLineNumber, - "appendSegmentToVoiceClone()"); - */ - - // segment becomes the fVoiceLastSegment -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Segment '" << - segment->asShortString () << - "' becomes the new last segment in voice clone \"" << - fVoiceName << - "\"" << - endl; - } -#endif - - fVoiceLastSegment = segment; - - if (! fVoiceFirstSegment) { - fVoiceFirstSegment = fVoiceLastSegment; - } - } -} - -void msrVoice::initializeVoice ( - msrVoiceCreateInitialLastSegmentKind - voiceCreateInitialLastSegmentKind) -{ - // the voice staff sequential number will be set - // when regular voices are added to a staff - // in registerVoiceInRegularVoicesMapByItsNumberByItsNumber () - fRegularVoiceStaffSequentialNumber = -1; - - gIndenter++; - - // compute voice number - int voiceNumber = - gMsrOah-> - fCreateVoicesStaffRelativeNumbers // JMI use it - ? fRegularVoiceStaffSequentialNumber - : fVoiceNumber; - - // set voice name - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - setVoiceNameFromNumber ( - fInputLineNumber, - voiceNumber); - break; - - case msrVoice::kVoiceHarmony: - setVoiceNameFromNumber ( - fInputLineNumber, - voiceNumber); - break; - - case msrVoice::kVoiceFiguredBass: - fVoiceName = - fVoiceStaffUpLink->getStaffName () + - "_FIGURED_BASS_Voice"; - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Initializing voice \"" << fVoiceName << - "\" in staff \"" << - fVoiceStaffUpLink->getStaffName () << - "\"" << - endl; - } -#endif - - // check voice number - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - // the voice number should be positive - if (fVoiceNumber < 1 || fVoiceNumber > 4) { - stringstream s; - - s << - "regular voice number " << fVoiceNumber << - " is not in the 1..4 range"; - - /* JMI ??? - msrMusicXMLError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - break; - - case msrVoice::kVoiceHarmony: - break; - - case msrVoice::kVoiceFiguredBass: - /* JMI - if (fVoiceNumber != K_PART_FIGURED_BASS_VOICE_NUMBER) { - stringstream s; - - s << - "figured bass voice number " << fVoiceNumber << - " is not equal to " << K_PART_FIGURED_BASS_VOICE_NUMBER; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - */ - break; - } // switch - - // voice shortest note - fVoiceShortestNoteDuration = - rational (INT_MAX, 1); - fVoiceShortestNoteTupletFactor = - rational (1, 1); - - // set voice number - fVoiceCurrentMeasureNumber = // JMI "??"; - fetchVoicePartUpLink ()-> - getPartCurrentMeasureNumber (); - - // set voice current measure purist number - fVoiceCurrentMeasurePuristNumber = 1; // default value, - // supposing there's no anacrusis - - // music has not been inserted in voice yet - fMusicHasBeenInsertedInVoice = false; - - // counters - fVoiceActualNotesCounter = 0; - fVoiceRestsCounter = 0; - fVoiceSkipsCounter = 0; - fVoiceActualHarmoniesCounter = 0; - fVoiceActualFiguredBassesCounter = 0; - - // regular measure ends detection - fWholeNotesSinceLastRegularMeasureEnd = rational (0, 1); - - // set voice current after repeat component phase kind - setCurrentVoiceRepeatPhaseKind ( - fInputLineNumber, - kVoiceRepeatPhaseNone); - - // rest measures - fVoiceContainsRestMeasures = false; - fVoiceRemainingRestMeasures = 0; - - // measures repests - fVoiceContainsMeasuresRepeats = false; - - // voice finalization - fVoiceHasBeenFinalized = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Initial contents of voice \"" << fVoiceName << - "\" in staff \"" << - fVoiceStaffUpLink->getStaffName () << - "\":" << - endl; - - gIndenter++; - - this->print (gLogOstream); - - gIndenter--; - } -#endif - - gIndenter--; -} - -void msrVoice::changeVoiceIdentity ( // after a deep copy - int voiceNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Changing identity of voice \"" << - getVoiceName () << - "\"" << - ", number: " << voiceNumber << - endl; - } -#endif - - // make it a regular voice - setVoiceKind ( - msrVoice::kVoiceRegular); - - // set its voice number - setVoiceNumber ( - voiceNumber); - - // set its name - setVoiceNameFromNumber ( - fInputLineNumber, - voiceNumber); -} - -S_msrVoice msrVoice::createVoiceNewbornClone ( - S_msrStaff staffClone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Creating a newborn clone of voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - // sanity check - msrAssert( - staffClone != nullptr, - "staffClone is null"); - - S_msrVoice - newbornClone = - msrVoice::create ( - fInputLineNumber, - fVoiceKind, - fVoiceNumber, - msrVoice::kCreateInitialLastSegmentNo, - // initial segment will be created upon a later segment visit - staffClone); - - // voice numbers - newbornClone->fRegularVoiceStaffSequentialNumber = - fRegularVoiceStaffSequentialNumber; - - // voice name - newbornClone->fVoiceName = - fVoiceName; - - return newbornClone; -} - -S_msrVoice msrVoice::createVoiceDeepCopy ( - int inputLineNumber, - msrVoiceKind voiceKind, - int voiceNumber, - S_msrStaff containingStaff) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Creating a deep copy of voice \"" << - getVoiceName () << - "\"" << - ", to be placed in containing staff \"" << - containingStaff->getStaffName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // sanity check - msrAssert( - containingStaff != nullptr, - "containingStaff is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoicesDetails) { - gLogOstream << - "****" << - " BEFORE voiceDeepCopy = " << - endl; - - print (gLogOstream); - - gLogOstream << - endl << - "****" << - endl; - } -#endif - - S_msrVoice - voiceDeepCopy = - msrVoice::create ( - fInputLineNumber, - voiceKind, - voiceNumber, - msrVoice::kCreateInitialLastSegmentNo, - // the voice initial last segment - // will be created by deep cloning below - containingStaff); - - // voice numbers - voiceDeepCopy->fRegularVoiceStaffSequentialNumber = - fRegularVoiceStaffSequentialNumber; - - // voice name - if (false) { // JMI - voiceDeepCopy->fVoiceName = - fVoiceName; - } - -/* JMI - // set voice name // JMI - voiceDeepCopy-> - setVoiceNameFromNumber ( - fInputLineNumber, - voiceNumber); -*/ - - // counters - voiceDeepCopy->fVoiceActualNotesCounter = - fVoiceActualNotesCounter; - - voiceDeepCopy->fVoiceRestsCounter = - fVoiceRestsCounter; - - voiceDeepCopy->fVoiceSkipsCounter = - fVoiceSkipsCounter; - - voiceDeepCopy->fVoiceActualHarmoniesCounter = - fVoiceActualHarmoniesCounter; - - voiceDeepCopy->fVoiceActualFiguredBassesCounter = - fVoiceActualFiguredBassesCounter; - - // measures - voiceDeepCopy->fVoiceCurrentMeasureNumber = - fVoiceCurrentMeasureNumber; - voiceDeepCopy->fVoiceCurrentMeasurePuristNumber = - fVoiceCurrentMeasurePuristNumber; - - // musically empty voices - voiceDeepCopy->fMusicHasBeenInsertedInVoice = - fMusicHasBeenInsertedInVoice; - - // regular measure ends detection - voiceDeepCopy->fWholeNotesSinceLastRegularMeasureEnd = - fWholeNotesSinceLastRegularMeasureEnd; - - // incomplete measures after repeats detection - voiceDeepCopy->fCurrentVoiceRepeatPhaseKind = - fCurrentVoiceRepeatPhaseKind; - - // initial elements - int numberOfInitialElements = - fInitialVoiceElementsList.size (); - - if (numberOfInitialElements) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "There are " << - numberOfInitialElements << - " initial elements in voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - list::const_iterator - iBegin = fInitialVoiceElementsList.begin (), - iEnd = fInitialVoiceElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // handle the deep copy - S_msrVoiceElement - elementDeepCopy; - - if ( - S_msrRepeat repeat = dynamic_cast(&(*(*i))) - ) { - /* JMI ??? - // create the repeat deep copy - elementDeepCopy = - repeat->createRepeatDeepCopy ( - voiceDeepCopy); - */ - } - - else if ( - // create the segment deep copy - S_msrSegment segment = dynamic_cast(&(*(*i))) - ) { - elementDeepCopy = - segment->createSegmentDeepCopy ( - voiceDeepCopy); - } - - else { - stringstream s; - - s << - "voice \"" << - getVoiceName () << - "\" initial elements element should be a repeat or a segment"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // append the element deep copy to the voice deep copy - voiceDeepCopy-> - fInitialVoiceElementsList.push_back ( - elementDeepCopy); - - if (++i == iEnd) break; - } // for - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "There are no initial elements in voice \"" << - getVoiceName () << - "\" to be deep copied" << - endl; - } -#endif - } - - // last segment - if (fVoiceLastSegment) { // JMI - voiceDeepCopy->fVoiceLastSegment = - fVoiceLastSegment-> - createSegmentDeepCopy ( - voiceDeepCopy); - - if (! voiceDeepCopy->fVoiceFirstSegment) { - voiceDeepCopy->fVoiceFirstSegment = - voiceDeepCopy->fVoiceLastSegment; - } - } - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "There is no last segment in voice \"" << - getVoiceName () << - "\" to be deep copied" << - endl; - } -#endif - } - - // rest measures - voiceDeepCopy->fVoiceContainsRestMeasures = - fVoiceContainsRestMeasures; - - // measures reeats - voiceDeepCopy->fVoiceContainsMeasuresRepeats = - fVoiceContainsMeasuresRepeats; - - // stanzas - for ( - map::const_iterator i = fVoiceStanzasMap.begin (); - i != fVoiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - - voiceDeepCopy-> - addStanzaToVoiceWithoutCatchUp ( // JMI - stanza-> - createStanzaDeepCopy ( - voiceDeepCopy)); - } // for - - // upLinks - voiceDeepCopy->fVoiceStaffUpLink = - containingStaff; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoicesDetails) { - gLogOstream << - "****" << - " AFTER voiceDeepCopy = " << - endl << - voiceDeepCopy << - endl << - "****" << - endl; - } -#endif - - return voiceDeepCopy; -} - -void msrVoice::setNextMeasureNumberInVoice ( - int inputLineNumber, - string nextMeasureNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting next measure number to '" << - nextMeasureNumber << - ", in voice \"" << getVoiceName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - fVoiceLastSegment-> - setNextMeasureNumberInSegment ( - inputLineNumber, - nextMeasureNumber); - - // is there a pending rest measures in this voice? - if (fVoiceRestMeasuresWaitingForItsNextMeasureNumber) { - // yes -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "There is a rest measures waiting for its next measure number" << - ", fVoiceRemainingRestMeasures = " << - fVoiceRemainingRestMeasures << - "' in voice \"" << - fVoiceName << "\"" << - endl; - } -#endif - - fVoiceRemainingRestMeasures--; - - // is this the last measure in the row? - if (fVoiceRemainingRestMeasures == 0) { - // yes, set waiting rest measures's next measure number -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting rest measures next measure number to '" << - nextMeasureNumber << - "' in voice \"" << - fVoiceName << "\"" << - endl; - } -#endif - - fVoiceRestMeasuresWaitingForItsNextMeasureNumber-> - setRestMeasuresNextMeasureNumber ( - nextMeasureNumber); - - // forget about this waiting rest measures - fVoiceRestMeasuresWaitingForItsNextMeasureNumber = nullptr; - } - } - - gIndenter--; -} - -void msrVoice::incrementVoiceCurrentMeasurePuristNumber ( - int inputLineNumber, - string context) -{ - fVoiceCurrentMeasurePuristNumber++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Incrementing voice current measure purist number to '" << - fVoiceCurrentMeasurePuristNumber << - "' (" << context << ")" << - " in voice \"" << getVoiceName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif -} - -void msrVoice::appendMeasureCloneToVoiceClone ( - int inputLineNumber, - S_msrMeasure measureClone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending measure clone '" << - measureClone->asShortString () << - "' to voice '" << getVoiceName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - // append measureClone to the voice last segment - fVoiceLastSegment-> - appendMeasureToSegment ( - measureClone); - - // measureClone is the new voice current measure - fVoiceCurrentMeasure = measureClone; -} - -void msrVoice::setWholeNotesSinceLastRegularMeasureEnd ( - int inputLineNumber, - rational value) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Setting voice whole notes since last regular measure end to '" << - value << - // JMI "' (" << context << ")" << - " in voice \"" << getVoiceName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - fWholeNotesSinceLastRegularMeasureEnd = value; -} - -void msrVoice::setCurrentVoiceRepeatPhaseKind ( - int inputLineNumber, - msrVoiceRepeatPhaseKind - afterRepeatComponentPhaseKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Setting voice current after repeat component phase kind to '" << - voiceRepeatPhaseKindAsString ( - afterRepeatComponentPhaseKind) << - // JMI "' (" << context << ")" << - " in voice \"" << getVoiceName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - - fCurrentVoiceRepeatPhaseKind = - afterRepeatComponentPhaseKind; -} - -void msrVoice::createNewLastSegmentForVoice ( - int inputLineNumber, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a new last segment for voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } - - if (gTraceOah->fTraceVoicesDetails) { - string - combinedContext = - "createNewLastSegmentForVoice() 1 called from " + context; - - displayVoice ( - inputLineNumber, - combinedContext); - } -#endif - - // create the last segment - fVoiceLastSegment = - msrSegment::create ( - inputLineNumber, - this); - - if (! fVoiceFirstSegment) { - fVoiceFirstSegment = fVoiceLastSegment; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoicesDetails) { - string - combinedContext = - "createNewLastSegmentForVoice() 2 called from " + context; - - displayVoice ( - inputLineNumber, - combinedContext); - } -#endif -} - -void msrVoice::createNewLastSegmentFromItsFirstMeasureForVoice ( - int inputLineNumber, - S_msrMeasure firstMeasure, - string context) -{ - // create the last segment - fVoiceLastSegment = - msrSegment::create ( - inputLineNumber, - this); - - if (! fVoiceFirstSegment) { - fVoiceFirstSegment = fVoiceLastSegment; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a new last segment '" << - fVoiceLastSegment->asShortString () << - "' from its first measure '" << - firstMeasure->getMeasureElementMeasureNumber () << - "' for voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // append firstMeasure to fVoiceLastSegment - fVoiceLastSegment-> - appendMeasureToSegment (firstMeasure); - - // firstMeasure is the new voice current measure - fVoiceCurrentMeasure = firstMeasure; - - // is firstMeasure the first one it the voice? - if (! fVoiceFirstMeasure) { - // yes, register it as such - setVoiceFirstMeasure ( - firstMeasure); - - firstMeasure-> - setMeasureFirstInVoice (); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayVoice ( - inputLineNumber, - "createNewLastSegmentFromItsFirstMeasureForVoice()"); - } -#endif -} - -S_msrMeasure msrVoice::createMeasureAndAppendItToVoice ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind) -{ - fVoiceCurrentMeasureNumber = measureNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Creating measure '" << - measureNumber << - "' and appending it to voice \"" << getVoiceName () << "\"" << - "', line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayVoice ( - inputLineNumber, - "createMeasureAndAppendItToVoice() 1"); - } -#endif - - gIndenter++; - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - inputLineNumber, - "createMeasureAndAppendItToVoice() 2"); - } - - // append new measure with given number to voice last segment - S_msrMeasure - result = - fVoiceLastSegment-> - createMeasureAndAppendItToSegment ( - inputLineNumber, - measureNumber, - measureImplicitKind); - - // result is the new voice current measure - fVoiceCurrentMeasure = result; - - // handle voice kind - switch (fVoiceKind) { - case msrVoice::kVoiceHarmony: - break; - case msrVoice::kVoiceRegular: - // append new measure with given number to voice harmony voice if any - if (fHarmonyVoiceForRegularVoiceForwardLink) { - fHarmonyVoiceForRegularVoiceForwardLink-> - createMeasureAndAppendItToVoice ( - inputLineNumber, - measureNumber, - measureImplicitKind); - } - // append new measure with given number to voice figured bass voice if any - if (fFiguredBassVoiceForRegularVoiceForwardLink) { - fFiguredBassVoiceForRegularVoiceForwardLink-> - createMeasureAndAppendItToVoice ( - inputLineNumber, - measureNumber, - measureImplicitKind); - } - break; - case msrVoice::kVoiceFiguredBass: - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayVoice ( - inputLineNumber, - "createMeasureAndAppendItToVoice() 3"); - } -#endif - - gIndenter--; - - return result; -} - -S_msrVoice msrVoice::createHarmonyVoiceForRegularVoice ( - int inputLineNumber, - string currentMeasureNumber) -{ - if (fHarmonyVoiceForRegularVoiceForwardLink) { - stringstream s; - - s << - "Voice \"" << - getVoiceName () << - "\" already has a harmony voice"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create the voice harmony voice - int harmonyVoiceForRegularVoiceNumber = - K_VOICE_HARMONY_VOICE_BASE_NUMBER + fVoiceNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Creating harmony voice for regular voice \"" << - getVoiceName () << - "\" with voice number " << - harmonyVoiceForRegularVoiceNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - fHarmonyVoiceForRegularVoiceForwardLink = - msrVoice::create ( - inputLineNumber, - msrVoice::kVoiceHarmony, - harmonyVoiceForRegularVoiceNumber, - msrVoice::kCreateInitialLastSegmentYes, - fVoiceStaffUpLink); - - // register it in the staff - fVoiceStaffUpLink-> - registerVoiceInStaff ( - inputLineNumber, - fHarmonyVoiceForRegularVoiceForwardLink); - - // set backward link - fHarmonyVoiceForRegularVoiceForwardLink-> - fRegularVoiceForHarmonyVoiceBackwardLink = this; - - return fHarmonyVoiceForRegularVoiceForwardLink; -} - -S_msrVoice msrVoice::createFiguredBassVoiceForRegularVoice ( - int inputLineNumber, - string currentMeasureNumber) -{ - if (fFiguredBassVoiceForRegularVoiceForwardLink) { - stringstream s; - - s << - "Voice \"" << - getVoiceName () << - "\" already has a figured bass voice"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create the voice figured bass voice - int figuredBassVoiceForRegularVoiceNumber = - K_VOICE_FIGURED_BASS_VOICE_BASE_NUMBER + fVoiceNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Creating figured bass voice for regular voice \"" << - getVoiceName () << - "\" with voice number " << - figuredBassVoiceForRegularVoiceNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - fFiguredBassVoiceForRegularVoiceForwardLink = - msrVoice::create ( - inputLineNumber, - msrVoice::kVoiceFiguredBass, - figuredBassVoiceForRegularVoiceNumber, - msrVoice::kCreateInitialLastSegmentYes, - fVoiceStaffUpLink); - - // register it in the staff - fVoiceStaffUpLink-> - registerVoiceInStaff ( - inputLineNumber, - fFiguredBassVoiceForRegularVoiceForwardLink); - - // set backward link - fFiguredBassVoiceForRegularVoiceForwardLink-> - fRegularVoiceForFiguredBassVoiceBackwardLink = this; - - return fFiguredBassVoiceForRegularVoiceForwardLink; -} - -S_msrStanza msrVoice::addStanzaToVoiceByItsNumber ( - int inputLineNumber, - string stanzaNumber) -{ - if (fVoiceStanzasMap.count (stanzaNumber)) { - stringstream s; - - s << - "stanza " << stanzaNumber << - " already exists in voice \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create the stanza - S_msrStanza - stanza = - msrStanza::create ( - inputLineNumber, - stanzaNumber, - this); - - // add the stanza to this voice - addStanzaToVoice (stanza); - - // return it - return stanza; -} - -void msrVoice::addStanzaToVoice (S_msrStanza stanza) -{ - // get stanza number - string stanzaNumber = - stanza->getStanzaNumber (); - - // register stanza in this voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Adding stanza " << stanza->getStanzaName () << - " (" << stanzaNumber << - ") to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // add the stanza to this voice - fVoiceStanzasMap [stanzaNumber] = stanza; -} - -void msrVoice::addStanzaToVoiceWithoutCatchUp (S_msrStanza stanza) -{ - // get stanza number - string stanzaNumber = - stanza->getStanzaNumber (); - - // register stanza in this voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Adding stanza " << stanza->getStanzaName () << - " (" << stanzaNumber << - ") to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // add the stanza to this voice - fVoiceStanzasMap [stanzaNumber] = stanza; -} - -S_msrStanza msrVoice::createStanzaInVoiceIfNotYetDone ( - int inputLineNumber, - string stanzaNumber, - string stanzaName) // JMI -{ - S_msrStanza stanza; - - // is stanzaNumber already known in voice? - if (fVoiceStanzasMap.count (stanzaNumber)) { - // yes, use it - stanza = - fVoiceStanzasMap [stanzaNumber]; - } - - else { - // no, create it and add it to the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Creating stanza" << - " number " << stanzaNumber << - ", name \"" << stanzaName << "\"" << - ", in voice \"" << getVoiceName () << "\"" << - ", line " << inputLineNumber << - ", fVoiceStanzasMap.size () = " << fVoiceStanzasMap.size () << - endl; - } -#endif - - stanza = - addStanzaToVoiceByItsNumber ( - inputLineNumber, stanzaNumber); - } - - return stanza; -} - -S_msrStanza msrVoice::fetchStanzaInVoice ( - int inputLineNumber, - string stanzaNumber, - string stanzaName) // JMI -{ - S_msrStanza stanza; - - // is stanzaNumber known in voice? - if (fVoiceStanzasMap.count (stanzaNumber)) { - // yes, use it - stanza = - fVoiceStanzasMap [stanzaNumber]; - } - - else { - stringstream s; - - gLogOstream << - endl << endl << endl << - "VOICEVOICEVOICEVOICEVOICEVOICEVOICEVOICE" << - endl; - - print (gLogOstream); - - gLogOstream << - "VOICEVOICEVOICEVOICEVOICEVOICEVOICEVOICE" << - endl << endl << endl << - endl; - - - s << - "Stanza" << - " number " << stanzaNumber << - ", name \"" << stanzaName << "\"" << - ", not found in voice \"" << getVoiceName () << "\"" << - ", line " << inputLineNumber << - ", fVoiceStanzasMap.size () = " << fVoiceStanzasMap.size () << - endl; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return stanza; -} - -void msrVoice::setVoiceCurrentClef (S_msrClef clef) -{ - fVoiceCurrentClef = clef; - - if (! fVoiceFirstClef) { - fVoiceFirstClef = fVoiceCurrentClef; - } -}; - -void msrVoice::setVoiceCurrentKey (S_msrKey key) -{ - fVoiceCurrentKey = key; -}; - -void msrVoice::setVoiceCurrentTime (S_msrTime time) -{ - fVoiceCurrentTime = time; -}; - -void msrVoice::appendClefToVoice (S_msrClef clef) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceClefs) { - gLogOstream << - "Appending clef '" << clef->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - gIndenter++; - - // set voice current clef - this->setVoiceCurrentClef (clef); - - if (fMusicHasBeenInsertedInVoice) { - // append clef to last segment - fVoiceLastSegment-> - appendClefToSegment (clef); - } - - else { - // moving clefs to the left, thus prepend to last segment - fVoiceLastSegment-> - prependClefToSegment (clef); - } - - gIndenter--; -} - -void msrVoice::appendKeyToVoice (S_msrKey key) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - gLogOstream << - "Appending key '" << key->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - gIndenter++; - - // set voice current clef - this->setVoiceCurrentKey (key); - - // append key to last segment - fVoiceLastSegment-> - appendKeyToSegment (key); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceKeys) { - displayVoice ( // JMI TEMP - key->getInputLineNumber (), - "appendKeyToVoice()"); - } -#endif - - gIndenter--; -} - -void msrVoice::appendTimeToVoice (S_msrTime time) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time '" << time->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - gIndenter++; - - // set voice current time - this->setVoiceCurrentTime (time); - - // append time to the last segment - fVoiceLastSegment-> - appendTimeToSegment (time); - - gIndenter--; -} - -void msrVoice::appendTimeToVoiceClone (S_msrTime time) // superflous ??? JMI -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTimes) { - gLogOstream << - "Appending time '" << time->asString () << - "' to voice clone \"" << getVoiceName () << "\"" << - endl; - } -#endif - - gIndenter++; - - // set voice current time - this->setVoiceCurrentTime (time); - - // append time to the last segment - fVoiceLastSegment-> - appendTimeToSegmentClone (time); - - gIndenter--; -} - -S_msrNote msrVoice::fetchVoiceFirstNonGraceNote () const -{ - S_msrNote result; - - if (fVoiceFirstSegment) { - // get the segment's measures list - const list& - firstSegmentMeasuresList = - fVoiceFirstSegment-> - getSegmentMeasuresList (); - - if (firstSegmentMeasuresList.size ()) { - // get the segment's first measure - S_msrMeasure - firstMeasure = - firstSegmentMeasuresList.front (); - - // get the first measure's elements list - const list& - firstMeasureElementsList = - firstMeasure-> - getMeasureElementsList (); - - // fetch the first note in the first measure to which - // a grace notes group can be attached - // i.e. one not in a grace notes group itself, - // possibly inside a chord or tuplet - - if (firstMeasureElementsList.size ()) { - list::const_iterator - iBegin = firstMeasureElementsList.begin (), - iEnd = firstMeasureElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_msrMeasureElement element = (*i); - - if ( - S_msrNote note = dynamic_cast(&(*element)) - ) { - result = note; - break; - } - - else if ( - S_msrChord chord = dynamic_cast(&(*element)) - ) { - // get the chord's first note - result = chord->fetchChordFirstNonGraceNote (); - break; - } - - else if ( - S_msrTuplet tuplet = dynamic_cast(&(*element)) - ) { - // get the tuplet's first note - result = tuplet->fetchTupletFirstNonGraceNote (); - break; - } - - else if ( - S_msrRepeat repeat = dynamic_cast(&(*element)) - ) { - // get the repeat's first note - result = repeat->fetchRepeatFirstNonGraceNote (); - break; - } - - else if ( - S_msrClef clef = dynamic_cast(&(*element)) - ) { - // ignore this clef - } - - else if ( - S_msrKey key = dynamic_cast(&(*element)) - ) { - // ignore this key - } - - else if ( - S_msrTime time = dynamic_cast(&(*element)) - ) { - // ignore this time - } - - else { - // ignore this element and return nullptr JMI ??? - /* - stringstream s; - - s << - "tuplet first element should be a note, a chord or another tuplet, found instead '" << - element->asShortString () << - "'"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - } - - if (++i == iEnd) break; - } // for - } - } - } - - return result; -} - -void msrVoice::registerShortestNoteIfRelevant (S_msrNote note) -{ - // is note the shortest one in this voice? - rational - noteSoundingWholeNotes = - note->getNoteSoundingWholeNotes (), - noteDisplayWholeNotes = - note->getNoteDisplayWholeNotes (); // JMI - - if (noteSoundingWholeNotes < fVoiceShortestNoteDuration) { - fVoiceShortestNoteDuration = noteSoundingWholeNotes; - } - if (noteDisplayWholeNotes < fVoiceShortestNoteDuration) { - fVoiceShortestNoteDuration = noteDisplayWholeNotes; - } -} - -void msrVoice::registerNoteAsVoiceLastAppendedNote (S_msrNote note) -{ - fVoiceLastAppendedNote = note; - - // is note the shortest one in this voice? - rational - noteSoundingWholeNotes = - note->getNoteSoundingWholeNotes (), - noteDisplayWholeNotes = - note->getNoteDisplayWholeNotes (); // JMI - - if (noteSoundingWholeNotes < fVoiceShortestNoteDuration) { - fVoiceShortestNoteDuration = noteSoundingWholeNotes; - } - if (noteDisplayWholeNotes < fVoiceShortestNoteDuration) { - fVoiceShortestNoteDuration = noteDisplayWholeNotes; - } -} - -void msrVoice::appendHarmonyToVoice ( - S_msrHarmony harmony) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending harmony " << harmony->asString () << - " to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - int inputLineNumber = - harmony->getInputLineNumber (); - - // sanity check - switch (fVoiceKind) { - case msrVoice::kVoiceHarmony: - appendHarmonyToHarmonyVoice ( - harmony); - break; - - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceFiguredBass: - { - stringstream s; - - s << - "cannot append a harmony to " << - voiceKindAsString () << - " voice \"" << - getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch -} - -void msrVoice::appendHarmonyToHarmonyVoice ( - S_msrHarmony harmony) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending harmony " << harmony->asString () << - " to harmony voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // append the harmony to the voice last segment - fVoiceLastSegment-> - appendHarmonyToSegment (harmony); - - // register harmony - fVoiceActualHarmoniesCounter++; - fMusicHasBeenInsertedInVoice = true; -} - -void msrVoice::appendFiguredBassToFiguredBassVoice ( - S_msrFiguredBass figuredBass) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending figuredBass " << figuredBass->asString () << - " to figuredBass voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // append the figuredBass to the voice last segment - fVoiceLastSegment-> - appendFiguredBassToSegment (figuredBass); - - // register harmony - fVoiceActualFiguredBassesCounter++; - fMusicHasBeenInsertedInVoice = true; -} - -void msrVoice::appendHarmonyToVoiceClone (S_msrHarmony harmony) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - gLogOstream << - "Appending harmony " << harmony->asString () << - " to voice clone \"" << getVoiceName () << "\"" << - endl; - } -#endif - - int inputLineNumber = - harmony->getInputLineNumber (); - - switch (fVoiceKind) { - case msrVoice::kVoiceHarmony: - fVoiceLastSegment-> - appendHarmonyToSegmentClone (harmony); - - // register harmony - fVoiceActualHarmoniesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceFiguredBass: - { - stringstream s; - - s << - "cannot append a harmony to " << - voiceKindAsString () << - " voice clone \"" << - getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch -} - -void msrVoice::appendFiguredBassToVoice ( - S_msrFiguredBass figuredBass) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << figuredBass->asString () << - " to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - int inputLineNumber = - figuredBass->getInputLineNumber (); - - // sanity check - switch (fVoiceKind) { - case msrVoice::kVoiceFiguredBass: - appendFiguredBassToFiguredBassVoice ( - figuredBass); - break; - - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - { - stringstream s; - - s << - "cannot append a figured bass to " << - voiceKindAsString () << - " voice \"" << - getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch -} - -void msrVoice::appendFiguredBassToVoiceClone ( - S_msrFiguredBass figuredBass) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - gLogOstream << - "Appending figured bass " << figuredBass->asString () << - " to voice clone \"" << getVoiceName () << "\"" << - endl; - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceFiguredBass: - fVoiceLastSegment-> - appendFiguredBassToSegmentClone (figuredBass); - - // register figured bass - fVoiceActualFiguredBassesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - { - stringstream s; - - s << - "cannot append a figured bass to " << - voiceKindAsString () << - " voice clone \"" << - getVoiceName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - figuredBass->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch -} - -void msrVoice::padUpToPositionInMeasureInVoice ( - int inputLineNumber, - rational wholeNotesPositionInMeasure) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePositionsInMeasures) { - gLogOstream << - "Padding up to position in measure '" << - wholeNotesPositionInMeasure << - "' whole notes in voice \"" << - getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // sanity check - msrAssert ( - fVoiceLastSegment != nullptr, - "fVoiceLastSegment is null"); - - // pad up the voice's last segment - fVoiceLastSegment-> - padUpToPositionInMeasureInSegment ( - inputLineNumber, - wholeNotesPositionInMeasure); - - // pad up the voice's stanzas // JMI ??? - if (fVoiceStanzasMap.size ()) { - for ( - map::const_iterator i = fVoiceStanzasMap.begin (); - i != fVoiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - - stanza-> - padUpToCurrentMeasureWholeNotesDurationInStanza ( - inputLineNumber, - wholeNotesPositionInMeasure); - } // for - } - - gIndenter--; -} - -void msrVoice::backupByWholeNotesStepLengthInVoice ( - int inputLineNumber, - rational backupTargetMeasureElementPositionInMeasure) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceBackup) { - gLogOstream << - "Backup by a '" << - backupTargetMeasureElementPositionInMeasure << - "' whole notes step length in voice \"" << - getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // sanity check - msrAssert ( - fVoiceLastSegment != nullptr, - "fVoiceLastSegment is null"); - - // pad up the voice's last segment - fVoiceLastSegment-> - backupByWholeNotesStepLengthInSegment ( - inputLineNumber, - backupTargetMeasureElementPositionInMeasure); - - gIndenter--; -} - -void msrVoice::appendPaddingNoteToVoice ( - int inputLineNumber, - rational forwardStepLength) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Appending padding note" << - ", forwardStepLength: " << - forwardStepLength << - ", to voice \"" << - getVoiceName () << - "\",line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // pad up the voice's last segment - fVoiceLastSegment-> - appendPaddingNoteToSegment ( - inputLineNumber, - forwardStepLength); - - // account for padding note's duration in staff - fVoiceStaffUpLink-> - getStaffPartUpLink ()-> - incrementPartCurrentPositionInMeasure ( - inputLineNumber, - forwardStepLength); - - // pad up the voice's stanzas - if (fVoiceStanzasMap.size ()) { - for ( - map::const_iterator i = fVoiceStanzasMap.begin (); - i != fVoiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - - stanza->appendPaddingNoteToStanza ( - inputLineNumber, - forwardStepLength); - } // for - } - - gIndenter--; -} - -void msrVoice::appendTransposeToVoice ( - S_msrTranspose transpose) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTranspositions) { - gLogOstream << - "Appending transpose '" << - transpose->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendTransposeToSegment (transpose); -} - -void msrVoice::appendPartNameDisplayToVoice ( - S_msrPartNameDisplay partNameDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending part name display '" << - partNameDisplay->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendPartNameDisplayToSegment (partNameDisplay); -} - -void msrVoice::appendPartAbbreviationDisplayToVoice ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending part abbreviation display '" << - partAbbreviationDisplay->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendPartAbbreviationDisplayToSegment ( - partAbbreviationDisplay); -} - -void msrVoice::appendStaffDetailsToVoice ( - S_msrStaffDetails staffDetails) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - gLogOstream << - "Appending staff details '" << - staffDetails->asShortString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // staff details are attributes in MusicXML, - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - staffDetails->getInputLineNumber (), - "appendStaffDetailsToVoice()"); - } - - fVoiceLastSegment-> - appendStaffDetailsToSegment (staffDetails); -} - -void msrVoice::appendTempoToVoice (S_msrTempo tempo) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - gLogOstream << - "Appending tempo '" << tempo->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendTempoToSegment (tempo); -} - -void msrVoice::appendOctaveShiftToVoice ( - S_msrOctaveShift octaveShift) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOctaveShifts) { - gLogOstream << - "Appending octave shift '" << - octaveShift->octaveShiftKindAsString () << - "', size: " << octaveShift->getOctaveShiftSize () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendOctaveShiftToSegment (octaveShift); -} - -void msrVoice::appendScordaturaToVoice ( - S_msrScordatura scordatura) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceScordaturas) { - gLogOstream << - "Appending scordatura '" << - scordatura->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendScordaturaToSegment (scordatura); -} - -void msrVoice::appendAccordionRegistrationToVoice ( - S_msrAccordionRegistration - accordionRegistration) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceAccordionRegistrations) { - gLogOstream << - "Appending accordion registration '" << - accordionRegistration->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendAccordionRegistrationToSegment ( - accordionRegistration); -} - -void msrVoice::appendHarpPedalsTuningToVoice ( - S_msrHarpPedalsTuning - harpPedalsTuning) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarpPedals) { - gLogOstream << - "Appending harp pedals tuning '" << - harpPedalsTuning->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendHarpPedalsTuningToSegment ( - harpPedalsTuning); -} - -void msrVoice::appendRehearsalToVoice (S_msrRehearsal rehearsal) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRehearsals) { - gLogOstream << - "Appending rehearsal '" << rehearsal->getRehearsalText () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendRehearsalToSegment (rehearsal); -} - -void msrVoice::appendVoiceStaffChangeToVoice ( - S_msrVoiceStaffChange voiceStaffChange) -{ -#ifdef TRACE_OAH - int inputLineNumber = - voiceStaffChange->getInputLineNumber (); -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffChanges) { - gLogOstream << - "Appending voice staff change '" << - voiceStaffChange->asString () << - "' to voice " << - " \"" << getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // append voice staff change to voice's last segment - fVoiceLastSegment-> - appendVoiceStaffChangeToSegment ( - voiceStaffChange); - - gIndenter--; -} - -void msrVoice::appendNoteToVoice (S_msrNote note) { - int inputLineNumber = - note->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Appending note '" << - endl; - - gIndenter++; - - gLogOstream << - note << - "' to voice \"" << getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - - gIndenter--; - } -#endif - - // fetch the part current position in measure - rational - partCurrentPositionInMeasure = - fVoiceStaffUpLink-> - getStaffPartUpLink ()-> - getPartCurrentPositionInMeasure (); - - // append the note to the last segment - fVoiceLastSegment-> - appendNoteToSegment ( - note, - partCurrentPositionInMeasure); - - // is this note the shortest one in this voice? - this-> - registerShortestNoteIfRelevant (note); - - // register note as the last appended one into this voice - fVoiceLastAppendedNote = note; - - // account for note's duration in staff - fVoiceStaffUpLink-> - getStaffPartUpLink ()-> - incrementPartCurrentPositionInMeasure ( - inputLineNumber, - note->getNoteSoundingWholeNotes ()); - - // register whether music (i.e. not just skips) - // has been inserted into the voice - switch (note->getNoteKind ()) { - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: - // register rest - fVoiceRestsCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kSkipNote: - // don't account skips as music - fVoiceSkipsCounter++; - break; - - case msrNote::kUnpitchedNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kStandaloneNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kDoubleTremoloMemberNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kChordMemberNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - } // switch -} - -void msrVoice::appendNoteToVoiceClone (S_msrNote note) { -#ifdef TRACE_OAH - int inputLineNumber = - note->getInputLineNumber (); -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - gLogOstream << - "Appending note '" << - note->asShortString () << - "' to voice clone \"" << getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // append the note to the last segment - fVoiceLastSegment-> - appendNoteToSegmentClone (note); - - // is this note the shortest one in this voice? - this-> - registerShortestNoteIfRelevant (note); - - // register note as the last appended one into this voice - fVoiceLastAppendedNote = note; - - // register whether music (i.e. not just skips) - // has been inserted into the voice - switch (note->getNoteKind ()) { - case msrNote::k_NoNoteKind: - break; - - case msrNote::kRestNote: - // register rest - fVoiceRestsCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kSkipNote: - // don't account skips as music - fVoiceSkipsCounter++; - break; - - case msrNote::kUnpitchedNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kStandaloneNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kDoubleTremoloMemberNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kChordMemberNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - // register actual note - fVoiceActualNotesCounter++; - fMusicHasBeenInsertedInVoice = true; - break; - } // switch -} - -void msrVoice::appendDoubleTremoloToVoice ( - S_msrDoubleTremolo doubleTremolo) - -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - gLogOstream << - "Appending double tremolo '" << - doubleTremolo->asShortString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendDoubleTremoloToSegment (doubleTremolo); - - fMusicHasBeenInsertedInVoice = true; -} - -void msrVoice::appendChordToVoice (S_msrChord chord) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Appending chord '" << chord->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // append chord to voice last segment - fVoiceLastSegment-> - appendChordToSegment (chord); - - // account for chord duration in the part current position in measure - fVoiceStaffUpLink-> - getStaffPartUpLink ()-> - incrementPartCurrentPositionInMeasure ( - chord->getInputLineNumber (), - chord->getChordSoundingWholeNotes ()); - - // get the chord's notes vector - const vector& - chordNotesVector = - chord-> - getChordNotesVector (); - - int chordNotesVectorSize = - chordNotesVector.size (); - - if (chordNotesVectorSize > 0) { - { - // get the chord's first note - S_msrNote - chordFirstNote = chordNotesVector [0]; - - // is chordFirstNote the shortest one in this voice? - this-> - registerShortestNoteIfRelevant (chordFirstNote); - } - - { - // get the chord's last note - S_msrNote - chordLastNote = - chordNotesVector [chordNotesVectorSize - 1]; - - // is chordLastNote the shortest one in this voice? - this-> - registerShortestNoteIfRelevant (chordLastNote); - - // register chordLastNote as the last appended one into this voice - fVoiceLastAppendedNote = chordLastNote; - } - } - - fMusicHasBeenInsertedInVoice = true; -} - -void msrVoice::appendTupletToVoice (S_msrTuplet tuplet) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - gLogOstream << - "Appending tuplet " << tuplet->asString () << - " to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - gIndenter++; - - // append tuplet to voice last segment - fVoiceLastSegment-> - appendTupletToSegment (tuplet); - - // account for tuplet duration in the part's current position in measure - fVoiceStaffUpLink-> - getStaffPartUpLink ()-> - incrementPartCurrentPositionInMeasure ( - tuplet->getInputLineNumber (), - tuplet->getTupletSoundingWholeNotes ()); - - gIndenter--; - - fMusicHasBeenInsertedInVoice = true; -} - -void msrVoice::addGraceNotesGroupBeforeAheadOfVoiceIfNeeded ( - S_msrGraceNotesGroup graceNotesGroup) -{ - int inputLineNumber = - graceNotesGroup->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Adding grace notes '" << - graceNotesGroup->asString () << - "' ahead of voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - -/* JMI - gLogOstream << - endl << - "======================= prependGraceNotesToVoice" << - endl; - this->print (gLogOstream); - gLogOstream << - "=======================" << - endl << - endl; - */ - - if (! fVoiceFirstSegment) { - // these graceNotesGroup appears at the beginning of the voice: - // create a first segment - createNewLastSegmentForVoice ( - inputLineNumber, - "addGraceNotesGroupBeforeAheadOfVoiceIfNeeded()"); - - fVoiceFirstSegment = fVoiceLastSegment; - - // then create the first measure - createMeasureAndAppendItToVoice ( - inputLineNumber, - graceNotesGroup-> - getGraceNotesGroupMeasureNumber (), - msrMeasure::kMeasureImplicitKindNo); - } - - // such grace notes groups should be attached to the voice's first note, - // or to the first chord if the latter belongs to such - - // fetch the voice's first note - S_msrNote - voiceFirstNote = - fetchVoiceFirstNonGraceNote (); // JMI - - // get the voice first note's chord upLink - S_msrChord - firstNoteChordUpLink = - voiceFirstNote-> - getNoteChordUpLink (); - - if (firstNoteChordUpLink) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Attaching grace notes before '" << - graceNotesGroup->asString () << - "' to the first chord of voice \"" << getVoiceName () << - "\", i.e. '" << - firstNoteChordUpLink->asShortString () << - "'" << - endl; - } -#endif - - firstNoteChordUpLink-> - setChordGraceNotesGroupBefore ( - graceNotesGroup); - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Attaching grace notes before '" << - graceNotesGroup->asString () << - "' to the first note of voice \"" << getVoiceName () << - "\", i.e. '" << - voiceFirstNote->asShortString () << - "'" << - endl; - } -#endif - - voiceFirstNote-> - setNoteGraceNotesGroupBefore ( - graceNotesGroup); - } - - fMusicHasBeenInsertedInVoice = true; -} - -/* JMI -void msrVoice::appendAfterGraceNotesToVoice ( - S_msrAfterGraceNotes afterGraceNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Appending after grace notes " << // JMI AfterGraceNotes << - " to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendAfterGraceNotesToSegment (afterGraceNotes); - - fMusicHasBeenInsertedInVoice = true; -} - -void msrVoice::prependAfterGraceNotesToVoice ( - S_msrAfterGraceNotes afterGraceNotes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - gLogOstream << - "Prepending after grace notes " << // JMI AfterGraceNotes << - " to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceFirstSegment-> - prependAfterGraceNotesToSegment (afterGraceNotes); - - fMusicHasBeenInsertedInVoice = true; -} -*/ - -void msrVoice::appendSyllableToVoice ( - int inputLineNumber, - string stanzaNumber, - string stanzaName, - S_msrSyllable syllable) -{ - // append syllable to this voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gLogOstream << - "Appending syllable '" << - syllable->asString () << - "' to voice \"" << fVoiceName << "\"" << - endl; - } -#endif - - // fetch stanzaNumber in this voice - S_msrStanza - stanza = - createStanzaInVoiceIfNotYetDone ( - inputLineNumber, - stanzaNumber, - stanzaName); - - // add the syllable to the stanza - stanza-> - appendSyllableToStanza ( - syllable); -} - -void msrVoice::appendBarCheckToVoice (S_msrBarCheck barCheck) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending bar check '" << barCheck->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendBarCheckToSegment (barCheck); -} - -void msrVoice::appendBarNumberCheckToVoice ( - S_msrBarNumberCheck barNumberCheck) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending barnumber check '" << - barNumberCheck->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendBarNumberCheckToSegment (barNumberCheck); -} - -void msrVoice::appendLineBreakToVoice (S_msrLineBreak lineBreak) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending line break '" << lineBreak->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendLineBreakToSegment (lineBreak); - - // propagate this lineBreak to the voice stanzas if any - if (fVoiceStanzasMap.size ()) { - for ( - map::const_iterator i = fVoiceStanzasMap.begin (); - i != fVoiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - - stanza->appendLineBreakSyllableToStanza ( - lineBreak->getInputLineNumber (), - fVoiceCurrentMeasurePuristNumber); - } // for - } -} - -void msrVoice::appendPageBreakToVoice (S_msrPageBreak pageBreak) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Appending page break '" << pageBreak->asString () << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendPageBreakToSegment (pageBreak); -} - -void msrVoice::prependOtherElementToVoice (S_msrMeasureElement elem) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Prepending other element '" << elem << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - prependOtherElementToSegment (elem); -} - -void msrVoice::appendOtherElementToVoice (S_msrMeasureElement elem) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Appending other element '" << elem << - "' to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - fVoiceLastSegment-> - appendOtherElementToSegment (elem); -} - -S_msrMeasure msrVoice::fetchVoiceLastMeasure ( - int inputLineNumber) const -{ - S_msrMeasure result; - - msrAssert ( - fVoiceLastSegment != 0, - "fVoiceLastSegment is null"); - - const list& - lastSegmentMeasuresList = - fVoiceLastSegment->getSegmentMeasuresList (); - - if (lastSegmentMeasuresList.size ()) { - result = lastSegmentMeasuresList.back (); - } - else { - stringstream s; - - s << - "attempting to fetch voice last measure in an empty measures list"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return result; -} - -S_msrMeasureElement msrVoice::fetchVoiceLastElement ( - int inputLineNumber) const -{ - S_msrMeasureElement result; - - S_msrMeasure - lastMeasure = - fetchVoiceLastMeasure (inputLineNumber); - - const list& - lastMeasureElementsList = - lastMeasure->getMeasureElementsList (); - - if (lastMeasureElementsList.size ()) { - result = lastMeasureElementsList.back (); - } - - else { - stringstream s; - - s << - "attempting to fetch voice last element in an empty elements list"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - return result; -} - -void msrVoice::pushRepeatOntoRepeatDescrsStack ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Pushing repeat '" << - repeat->asShortString () << - "' onto the repeats stack in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - fVoicePendingRepeatDescrsStack.push_front ( - msrRepeatDescr::create ( - inputLineNumber, - repeat)); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - string - combinedContext = - "pushRepeatOntoRepeatDescrsStack() called from " + context; - - displayVoiceRepeatsStackSummary ( - inputLineNumber, - combinedContext); - } -#endif -} - -void msrVoice::popRepeatFromRepeatDescrsStack ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - string - combinedContext = - "popRepeatFromRepeatDescrsStack() 1 called from " + context; - - displayVoiceRepeatsStackSummary ( - inputLineNumber, - combinedContext); - } -#endif - - if ( - repeat - != - fVoicePendingRepeatDescrsStack.front ()->getRepeatDescrRepeat () - ) { - stringstream s; - - s << - "cannot pop repeat '" << - repeat->asShortString () << - "' from the stack since it is not at the top" << - " (" << context << ")" << - ", line " << inputLineNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Popping repeat '" << - repeat->asString () << - "' from the repeat stack in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - // pop it from repeats stack - fVoicePendingRepeatDescrsStack.pop_front (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - string - combinedContext = - "popRepeatFromRepeatDescrsStack() 2 called from " + context; - - displayVoiceRepeatsStackSummary ( - inputLineNumber, - combinedContext); - } -#endif -} - -void msrVoice::displayVoiceRepeatsStack ( - int inputLineNumber, - string context) -{ - int repeatDescrsStackSize = - fVoicePendingRepeatDescrsStack.size (); - - gLogOstream << - endl << - ">>++++++++++++++++ Displaying voice repeats stack " << context << - endl << - "The voice repeats stack contains " << - singularOrPlural (repeatDescrsStackSize, "element", "elements") << - ", line " << inputLineNumber << - ":" << - endl; - - if (repeatDescrsStackSize) { - list::const_iterator - iBegin = fVoicePendingRepeatDescrsStack.begin (), - iEnd = fVoicePendingRepeatDescrsStack.end (), - i = iBegin; - - gIndenter++; - - int n = repeatDescrsStackSize; - for ( ; ; ) { - gLogOstream << - "v (" << n << ")" << - ", repeatDescrStartInputLineNumber: " << - (*i)->getRepeatDescrStartInputLineNumber () << - endl; - - gIndenter++; - (*i)-> - getRepeatDescrRepeat ()-> - shortPrint (gLogOstream); - gIndenter--; - - n--; - - if (++i == iEnd) break; - - gLogOstream << endl; - } // for - - gIndenter--; - } - - gLogOstream << - "<<++++++++++++++++ " << - endl << - endl; -} - -void msrVoice::displayVoiceRepeatsStackSummary ( - int inputLineNumber, - string context) -{ - int repeatDescrsStackSize = - fVoicePendingRepeatDescrsStack.size (); - - gLogOstream << - endl << - "The voice repeats stack contains " << - singularOrPlural (repeatDescrsStackSize, "element", "elements") << - " - " << context << - ", line " << inputLineNumber << - ":" << - endl; - - if (repeatDescrsStackSize) { - list::const_iterator - iBegin = fVoicePendingRepeatDescrsStack.begin (), - iEnd = fVoicePendingRepeatDescrsStack.end (), - i = iBegin; - - gIndenter++; - - int n = repeatDescrsStackSize; - for ( ; ; ) { - gLogOstream << - "v (" << n << ")" << - ", repeatDescrStartInputLineNumber: " << - (*i)->getRepeatDescrStartInputLineNumber () << - endl; - - gIndenter++; - (*i)-> - getRepeatDescrRepeat ()-> - shortPrint (gLogOstream); - gIndenter--; - - n--; - - if (++i == iEnd) break; - - gLogOstream << endl; - } // for - - gLogOstream << - "===============" << - endl << - endl; - - gIndenter--; - } -} - -void msrVoice::displayVoiceRepeatsStackAndVoice ( - int inputLineNumber, - string context) -{ - displayVoiceRepeatsStack ( - inputLineNumber, - context); - - displayVoice ( - inputLineNumber, - context); -} - -void msrVoice::displayVoiceMeasuresRepeat ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - ">>++++++++++++++++ Displaying voice measures repeats " << context << - endl << - "The current voice measures repeat contains " << - ", line " << inputLineNumber << - ":" << - endl; - - gIndenter++; - - if (fVoicePendingMeasuresRepeat) { - fVoicePendingMeasuresRepeat-> - displayMeasuresRepeat ( - inputLineNumber, - context); - } - else { - gLogOstream << - "none" << - endl; - } - - gIndenter--; - - gLogOstream << - "<<++++++++++++++++ " << - endl << - endl; -} - -void msrVoice::displayVoiceMeasuresRepeatAndVoice ( - int inputLineNumber, - string context) -{ - displayVoiceMeasuresRepeat ( - inputLineNumber, - context); - - displayVoice ( - inputLineNumber, - context); -} - -void msrVoice::displayVoiceRestMeasures ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - ">>++++++++++++++++ voice rest measures " << context << - endl << - "The current voice rest measures contains " << - ", line " << inputLineNumber << - ":" << - endl; - - gIndenter++; - - if (fVoicePendingRestMeasures) { - fVoicePendingRestMeasures-> - displayRestMeasures ( - inputLineNumber, - context); - } - else { - gLogOstream << - "none" << - endl; - } - - gIndenter--; - - gLogOstream << - "<<++++++++++++++++ " << - endl << - endl; -} - -void msrVoice::displayVoiceRestMeasuresAndVoice ( - int inputLineNumber, - string context) -{ - displayVoiceRestMeasures ( - inputLineNumber, - context); - - displayVoice ( - inputLineNumber, - context); -} - -S_msrRepeat msrVoice::createARepeatAndStackIt ( - int inputLineNumber, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat and stacking it in voice \"" << - getVoiceName () << - "\"" << - " (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeat - result = - msrRepeat::create ( - inputLineNumber, - 2, // repeatTimes, default value JMI - this); - - // push it onto the voice's repeat descrs stack - pushRepeatOntoRepeatDescrsStack ( - inputLineNumber, - result, - "createARepeatAndStackIt() 1"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "createARepeatAndStackIt() 2"); - } -#endif - - return result; -} - -S_msrRepeat msrVoice::createARepeatCloneAndStackIt ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat clone and stacking it in voice clone \"" << - getVoiceName () << - "\"" << - " (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeat - result = - repeat-> - createRepeatNewbornClone (this); - - // push it onto the voice's repeat descrs stack - pushRepeatOntoRepeatDescrsStack ( - inputLineNumber, - result, - "createARepeatCloneAndStackIt()"); - - return result; -} - -void msrVoice::moveVoiceInitialElementsToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeatCommonPart repeatCommonPart, - string context) -{ - // move the voice initial elements to the new repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Moving the " << - singularOrPlural ( - fInitialVoiceElementsList.size (), - "initial element", - "initial elements") << - " in voice \"" << - getVoiceName () << - "\" to repeat common part '" << - repeatCommonPart->asShortString () << - "' (" << context << ")" << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - for ( - list::iterator i = fInitialVoiceElementsList.begin (); - i != fInitialVoiceElementsList.end (); - i++ - ) { - S_msrVoiceElement element = (*i); - - // append the element to the new segment - repeatCommonPart-> - appendVoiceElementToRepeatCommonPart ( - inputLineNumber, - element, - "moveVoiceInitialElementsToRepeatCommonPart()"); - - // remove it from the voice initial elements - i = fInitialVoiceElementsList.erase (i); - } // for -} - -void msrVoice::moveVoiceLastSegmentToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeatCommonPart repeatCommonPart, - string context) -{ - // move the voice last segment to repeatCommonPart -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Moving the voice last segment '"; - - if (fVoiceLastSegment) { // JMI should not be necessary? - gLogOstream << - fVoiceLastSegment->asShortString (); - } - else { - gLogOstream << - "null"; - } - - gLogOstream << - "' to repeat common part '" << - repeatCommonPart->asShortString () << - "' (" << context << ")" << - "' in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - string - combinedContext = - "moveVoiceLastSegmentToRepeatCommonPart() 1 called from " + context; - - displayVoiceRepeatsStackSummary ( - inputLineNumber, - combinedContext); - } -#endif - - if (fVoiceLastSegment) { // JMI should not be necessary? - /* JMI - // fetch the last segment's last measure // JMI ??? - string - combinedContext = - "moveVoiceLastSegmentToRepeatCommonPart() 2 called from " + context; - - S_msrMeasure - voiceLastSegmentLastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - combinedContext); -*/ - - // set voice current after repeat component phase kind - setCurrentVoiceRepeatPhaseKind ( - inputLineNumber, - kVoiceRepeatPhaseAfterCommonPart); - - // append fVoiceLastSegment to the repeat common part - repeatCommonPart-> - appendSegmentToRepeatCommonPart ( - inputLineNumber, - fVoiceLastSegment, - context); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - string - combinedContext = - "moveVoiceLastSegmentToRepeatCommonPart() 3 called from " + context; - - displayVoiceRepeatsStackSummary ( - inputLineNumber, - combinedContext); - } -#endif -} - -void msrVoice::moveAllVoiceContentsToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeatCommonPart repeatCommonPart, - string context) -{ - moveVoiceInitialElementsToRepeatCommonPart ( - inputLineNumber, - repeatCommonPart, - context); - - moveVoiceLastSegmentToRepeatCommonPart ( - inputLineNumber, - repeatCommonPart, - context); -} - -void msrVoice::moveVoiceLastSegmentToRepeatEnding ( - int inputLineNumber, - S_msrRepeatEnding repeatEnding, - string context) -{ - // move the voice last segment to repeatEnding -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Moving the voice last segment to repeat ending '" << - repeatEnding->asShortString () << - "' in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fVoiceLastSegment) { // JMI should not be necessary? - repeatEnding-> - appendSegmentToRepeatEnding ( - inputLineNumber, - fVoiceLastSegment, - context); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; - } -} - -void msrVoice::appendRepeatToInitialVoiceElements ( - int inputLineNumber, - S_msrRepeat repeat, - string context) -{ - // append repeat to the list of initial elements -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending repeat '" << - repeat->asString () << - "' to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - fInitialVoiceElementsList.push_back ( - repeat); -} - -void msrVoice::appendRestMeasuresToInitialVoiceElements ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context) -{ - // append restMeasures to the list of initial elements -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending rest measures '" << - restMeasures->asString () << - "' to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - fInitialVoiceElementsList.push_back ( - restMeasures); -} - -void msrVoice::appendMeasuresRepeatToInitialVoiceElements ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context) -{ - // append measuresRepeat to the list of initial elements -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending measures repeat '" << - measuresRepeat->asString () << - "' to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - fInitialVoiceElementsList.push_back ( - measuresRepeat); -} - -void msrVoice::appendVoiceLastSegmentToInitialVoiceElements ( - int inputLineNumber, - string context) -{ - // append segment to the list of initial elements -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Appending voice last segment '" << - fVoiceLastSegment->asString () << - "' to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - fInitialVoiceElementsList.push_back ( - fVoiceLastSegment); -} - -void msrVoice::moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( - int inputLineNumber, - string context) -{ - if (fVoiceLastSegment) { - const list& - segmentMeasuresList = - fVoiceLastSegment-> - getSegmentMeasuresList (); - - if (segmentMeasuresList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Moving voice last segment '" << - fVoiceLastSegment->asString () << - "' to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } - - if (gTraceOah->fTraceSegmentsDetails) { - displayVoice ( - inputLineNumber, - "moveVoiceLastSegmentToInitialVoiceElementsIfRelevant() 1"); - } -#endif - - // append segment to the list of initial elements - fInitialVoiceElementsList.push_back ( - fVoiceLastSegment); - - // forget about this last segment - fVoiceLastSegment = nullptr; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegmentsDetails) { - displayVoice ( - inputLineNumber, - "moveVoiceLastSegmentToInitialVoiceElementsIfRelevant() 2"); - } -#endif - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Voice last segment '" << - fVoiceLastSegment->asString () << - "' contains no measure, not moved to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - } - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Voice last segment '" << - fVoiceLastSegment->asString () << - "' is null, not moved to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - } -} - -void msrVoice::appendRepeatCloneToInitialVoiceElements ( - int inputLineNumber, - S_msrRepeat repeatCLone, - string context) -{ - // append repeatCLone to the list of initial elements -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending repeat cLone '" << - repeatCLone->asString () << - "' to the initial elements in voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - endl; - } -#endif - - fInitialVoiceElementsList.push_back ( - repeatCLone); -} - -void msrVoice::handleVoiceLevelRepeatStartInVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a voice-level repeat start in voice \"" << - getVoiceName () << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 1"); - } -#endif - - gIndenter++; - - // is there a voice last segment? - if (fVoiceLastSegment) { - - // fetch last segment's measures list - list - voiceLastSegmentMeasuresList = - fVoiceLastSegment-> - getSegmentMeasuresList (); - - // are there measures in the voice last segment? - if (voiceLastSegmentMeasuresList.size ()) { - // yes - - // fetch last measure in the last segment - S_msrMeasure - lastMeasureInLastSegment = - voiceLastSegmentMeasuresList.back (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeatsDetails) { - lastMeasureInLastSegment-> - displayMeasure ( - inputLineNumber, - "lastMeasureInLastSegment - handleVoiceLevelRepeatStartInVoice() 2"); - } -#endif - - // let's look at the last measure in detail - - // fetch its elements list - const list& - lastMeasureElementsList = - lastMeasureInLastSegment-> - getMeasureElementsList (); - - if (lastMeasureElementsList.size ()) { - // the last measure is not empty - - // is there a measure splitting? - if ( - lastMeasureInLastSegment->getCurrentMeasureWholeNotesDuration () - == // JMI SURE ??? - lastMeasureInLastSegment->getFullMeasureWholeNotesDuration () - ) { - // yes this measure is not yet complete and should be split -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Splitting measure '" << - lastMeasureInLastSegment->asShortString () << - "' upon a repeat end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // finalize lastMeasureInLastSegment - lastMeasureInLastSegment-> - finalizeMeasure ( - inputLineNumber, - msrMeasure::kMeasuresRepeatContextKindNone, - "handleVoiceLevelRepeatStartInVoice() 3"); - - // append last segment to initial voice elements list - appendVoiceLastSegmentToInitialVoiceElements ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 4"); - - // create a new last segment for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a new last segment for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentForVoice ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 5"); - - // create a new measure with the same number as the voice last measure - // and append it to the voice, - createMeasureAndAppendItToVoice ( - inputLineNumber, - lastMeasureInLastSegment->getMeasureElementMeasureNumber (), - msrMeasure::kMeasureImplicitKindNo); - - /* JMI - // set it as created before a repeat - voiceLastMeasure-> - setMeasureCreatedForARepeatKind ( - msrMeasure::kMeasureCreatedForARepeatBefore); - */ - } - else { - // no this measure is complete - // JMI ??? - } - } - - else { - // the last measure elements list is empty, - // keep it for a new voice last segment - - // remove last measure -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Removing the last measure in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasure - dummyMeasure = - fVoiceLastSegment-> - removeLastMeasureFromSegment ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 55"); - - // append the voice last segment to the initial voice elements list - appendVoiceLastSegmentToInitialVoiceElements ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 555"); - - // create a new last segment containing a new measure for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a new last segment with the first common part measure for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentFromItsFirstMeasureForVoice ( - inputLineNumber, - dummyMeasure, - "handleVoiceLevelRepeatStartInVoice() 5555"); - } - } - } - - else { - // no voice last segment JMI ??? - } - - // create the repeat and stack it - S_msrRepeat - newRepeat = - createARepeatAndStackIt ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 10"); - - // create the repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat common part upon its end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeatCommonPart - repeatCommonPart = - msrRepeatCommonPart::create ( - inputLineNumber, - newRepeat); - - // register it in newRepeat - newRepeat-> - setRepeatCommonPart ( - repeatCommonPart); - - // set newRepeat as having an explicit start - newRepeat-> - setRepeatExplicitStartKind ( - msrRepeat::kRepeatExplicitStartYes); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 11"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleNestedRepeatStartInVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a nested repeat start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleNestedRepeatStartInVoice() 2"); - } -#endif -} - -void msrVoice::handleRepeatStartInVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling repeat start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatStartInVoice() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - // analyze this repeat start's context - switch (fVoicePendingRepeatDescrsStack.size ()) { - case 0: - // this repeat start is at the voice-level - // ------------------------------------- - handleVoiceLevelRepeatStartInVoice ( - inputLineNumber); - break; - - default: - // this repeat start belongs to a nested repeat - // --------------------------------------- - handleNestedRepeatStartInVoice ( - inputLineNumber); - } // switch - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatStartInVoice() 2"); - } -#endif -} - -void msrVoice::handleVoiceLevelRepeatEndWithoutStartInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a voice-level repeat end without start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndWithoutStartInVoice() 1"); - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "This repeat end without a start is at the voice-level" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat upon its end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - int repeatInputLineNumber = 1; // could find first measure's input line number??? JMI - - S_msrRepeat - newRepeat = - msrRepeat::create ( - repeatInputLineNumber, - repeatTimes, - this); - - // create the repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat common part upon its end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeatCommonPart - repeatCommonPart = - msrRepeatCommonPart::create ( - repeatInputLineNumber, - newRepeat); - - // register it in newRepeat - newRepeat-> - setRepeatCommonPart ( - repeatCommonPart); - - // fetch the last segment's last measure - S_msrMeasure - voiceLastSegmentLastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - "handleVoiceLevelRepeatEndWithoutStartInVoice() 2"); - - // set voice current after repeat component phase kind - // before finalizeCurrentMeasureInVoice() - setCurrentVoiceRepeatPhaseKind ( - inputLineNumber, - kVoiceRepeatPhaseAfterCommonPart); - - // finalize current measure in voice - voiceLastSegmentLastMeasure-> - finalizeMeasure ( - inputLineNumber, - msrMeasure::kMeasuresRepeatContextKindCommonPartLastMeasure, - "handleVoiceLevelRepeatEndWithoutStartInVoice() 3" - ); - - // append the voice last segment to the new repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending the voice last segment in voice \"" << - getVoiceName () << - "\" to the new voice-level repeat common part" << - ", line " << inputLineNumber << - endl; - } -#endif - - repeatCommonPart-> - appendSegmentToRepeatCommonPart ( - inputLineNumber, - fVoiceLastSegment, - "handleVoiceLevelRepeatEndWithoutStartInVoice() 4"); - - // create a new last segment for the voice - createNewLastSegmentForVoice ( - inputLineNumber, - "handleVoiceLevelRepeatEndWithoutStartInVoice() 5"); - - // set newRepeat's build phase to completed - newRepeat-> - setCurrentRepeatBuildPhaseKind ( - msrRepeat::kRepeatBuildPhaseCompleted); - - // append newRepeat to the list of initial elements - appendRepeatToInitialVoiceElements ( - inputLineNumber, - newRepeat, - "handleVoiceLevelRepeatEndWithoutStartInVoice() 6"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndWithoutStartInVoice() 7"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleVoiceLevelContainingRepeatEndWithoutStartInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a voice-level rcontaining epeat end without start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 1"); - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "This repeat end without a start is at the voice-level" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat upon its end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - int repeatInputLineNumber = 1; // could find first measure's input line number??? JMI - - S_msrRepeat - newRepeat = - msrRepeat::create ( - repeatInputLineNumber, - repeatTimes, - this); - - // create the repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat common part upon its end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeatCommonPart - newRepeatCommonPart = - msrRepeatCommonPart::create ( - repeatInputLineNumber, - newRepeat); - - // register it in newRepeat - newRepeat-> - setRepeatCommonPart ( - newRepeatCommonPart); - - // fetch the last segment's last measure - S_msrMeasure - voiceLastSegmentLastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 1"); - - // fetch the top of the repeats stack - S_msrRepeat - repeatsStackTopRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // pop it from the repeats stack - popRepeatFromRepeatDescrsStack ( - inputLineNumber, - repeatsStackTopRepeat, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 2"); - - // append it to newRepeat's common part - newRepeatCommonPart-> - appendRepeatToRepeatCommonPart ( - inputLineNumber, - repeatsStackTopRepeat, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 3"); - - // append newRepeat to the list of initial elements - appendRepeatToInitialVoiceElements ( - inputLineNumber, - newRepeat, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 4"); - - // append the voice last segment to the new repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending the voice last segment in voice \"" << - getVoiceName () << - "\" to the new voice-level repeat common part" << - ", line " << inputLineNumber << - endl; - } -#endif - - newRepeatCommonPart-> - appendSegmentToRepeatCommonPart ( - inputLineNumber, - fVoiceLastSegment, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 5"); - -/* JMI SURE - // create a new last segment for the voice - createNewLastSegmentForVoice ( - inputLineNumber, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice()"); - */ - - // set newRepeat's build phase to completed - newRepeat-> - setCurrentRepeatBuildPhaseKind ( - msrRepeat::kRepeatBuildPhaseCompleted); - - // append newRepeat to the list of initial elements - appendRepeatToInitialVoiceElements ( - inputLineNumber, - newRepeat, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 6"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelContainingRepeatEndWithoutStartInVoice() 7"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleVoiceLevelRepeatEndWithStartInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a voice-level repeat end with start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndWithStartInVoice() 1"); - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "This repeat end with a start is at the voice-level" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // fetch the voice's last measure - S_msrMeasure - voiceLastMeasure = - fetchVoiceLastMeasure ( - inputLineNumber); - - // set voice current after repeat component phase kind - setCurrentVoiceRepeatPhaseKind ( - inputLineNumber, - kVoiceRepeatPhaseAfterCommonPart); - - // grab current repeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // pop it from the repeats stack - popRepeatFromRepeatDescrsStack ( - inputLineNumber, - currentRepeat, - "handleVoiceLevelRepeatEndWithStartInVoice() 2"); - - // set its repeat times field - currentRepeat-> - setRepeatTimes (repeatTimes); - - // create the currentRepeat's common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat common part upon repeat end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeatCommonPart - repeatCommonPart = - msrRepeatCommonPart::create ( - inputLineNumber, - currentRepeat); - - // register it in newRepeat - currentRepeat-> - setRepeatCommonPart ( - repeatCommonPart); - - // move the voice last segment to the new repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Moving the voice last segment in voice \"" << - getVoiceName () << - "\" to the current voice-level repeat common part" << - " and forget about it" << - ", line " << inputLineNumber << - endl; - } -#endif - - moveVoiceLastSegmentToRepeatCommonPart ( - inputLineNumber, - repeatCommonPart, - "handleVoiceLevelRepeatEndWithStartInVoice() 3"); - -/* JMI SURE ??? - // create a new last segment to collect the remainder of the voice, - if (false) { - createNewLastSegmentForVoice ( // JMI - inputLineNumber, - "handleVoiceLevelRepeatEndWithStartInVoice() BOF"); - } - */ - - // set currentRepeat's build phase to completed - currentRepeat-> - setCurrentRepeatBuildPhaseKind ( - msrRepeat::kRepeatBuildPhaseCompleted); - - // append currentRepeat to the list of initial elements - appendRepeatToInitialVoiceElements ( - inputLineNumber, - currentRepeat, - "handleVoiceLevelRepeatEndWithStartInVoice() 4"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndWithStartInVoice() 5"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleNestedRepeatEndInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a nested repeat end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleNestedRepeatEndInVoice() 1"); - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "This repeat is nested" << - ", line " << inputLineNumber << - endl; - } -#endif - -// fetch the voice's last measure - S_msrMeasure - voiceLastMeasure = - fetchVoiceLastMeasure ( - inputLineNumber); - - // is there a measure splitting? - if ( - voiceLastMeasure->getCurrentMeasureWholeNotesDuration () - == - voiceLastMeasure->getFullMeasureWholeNotesDuration () - ) { - // this measure is incomplete and should be split -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Splitting measure '" << - voiceLastMeasure->asShortString () << - "' upon a repeat end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create a new measure with the same number as the voice last measure - // and append it to the voice, - createMeasureAndAppendItToVoice ( - inputLineNumber, - measureNumber, - msrMeasure::kMeasureImplicitKindNo); - - /* JMI - // set it as created after a repeat - voiceLastMeasure-> - setMeasureCreatedForARepeatKind ( - msrMeasure::kMeasureCreatedForARepeatAfter); - */ - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleNestedRepeatEndInVoice() 2"); - } -#endif -} - -void msrVoice::handleRepeatEndInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndInVoice() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // analyze this repeat end's context - switch (fVoicePendingRepeatDescrsStack.size ()) { - case 0: - // this repeat is at the voice-level and has no start - // ------------------------------------- - handleVoiceLevelRepeatEndWithoutStartInVoice ( - inputLineNumber, - measureNumber, - repeatTimes); - break; - - case 1: - { - // fetch the top of the repeats stack - S_msrRepeat - repeatsStackTopRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // analyze it - switch (repeatsStackTopRepeat->getCurrentRepeatBuildPhaseKind ()) { - case msrRepeat::kRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "attempting to end repeat '" << - repeatsStackTopRepeat->asShortString () << - "' right after it has been created" << - " in voice '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrRepeat::kRepeatBuildPhaseInCommonPart: - case msrRepeat::kRepeatBuildPhaseInEndings: - // this repeat is at the voice-level and has a start - // ------------------------------------- - handleVoiceLevelRepeatEndWithStartInVoice ( - inputLineNumber, - measureNumber, - repeatTimes); - break; - - case msrRepeat::kRepeatBuildPhaseCompleted: - // this repeat is at the voice-level, has no start - // and contains repeatsStackTop - // ------------------------------------- - handleVoiceLevelContainingRepeatEndWithoutStartInVoice ( - inputLineNumber, - measureNumber, - repeatTimes); - break; - } // switch - } - break; - - default: - // newRepeat is a nested repeat - // --------------------------------------- - handleNestedRepeatEndInVoice ( - inputLineNumber, - measureNumber, - repeatTimes); - } // switch - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndInVoice() 2"); - } -#endif -} - -void msrVoice::handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice ( - int inputLineNumber, - S_msrRepeat currentRepeat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a voice-level repeat ending start without explicit start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 1"); - } -#endif - - gIndenter++; - - S_msrRepeat repeat; - S_msrRepeatCommonPart repeatCommonPart; - - if (currentRepeat) { - repeatCommonPart = - currentRepeat-> - getRepeatCommonPart (); - } - - else { - // create the repeat and stack it - stringstream s1; - - s1 << - "Creating a voice-level repeat upon its first ending in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber; - - int repeatInputLineNumber = 1; // could find first measure's input line number??? JMI - - currentRepeat = - createARepeatAndStackIt ( - repeatInputLineNumber, - s1.str ()); - - // create the repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat common part upon its end in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - repeatCommonPart = - msrRepeatCommonPart::create ( - repeatInputLineNumber, - currentRepeat); - - // register it in newRepeat - currentRepeat-> - setRepeatCommonPart ( - repeatCommonPart); - } - - // fetch last measure -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Fetching the last measure in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasure - lastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 1"); - - // fetch lastMeasure's elements list - const list& - lastMeasureElementsList = - lastMeasure-> - getMeasureElementsList (); - - // let's look at lastMeasure in detail - if (! lastMeasureElementsList.size ()) { - - // it is empty, keep it for a new voice last segment - - // remove last measure -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Removing the last measure in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasure - dummyMeasure = - fVoiceLastSegment-> - removeLastMeasureFromSegment ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 2"); - - // move voice last segment into the repeat common part - stringstream s2; - - s2 << - "Moving the voice last segment to the repeat common part in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber; - - moveVoiceLastSegmentToRepeatCommonPart ( - inputLineNumber, - repeatCommonPart, - s2.str ()); - - // create a new last segment containing a new measure for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a new last segment with the first ending measure for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentFromItsFirstMeasureForVoice ( - inputLineNumber, - lastMeasure, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 3"); - } - - else { - - // it is not empty - - // append last segment to initial voice elements list - appendVoiceLastSegmentToInitialVoiceElements ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 4"); - - // create a new last segment for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a new last segment for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentForVoice ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice( 5)"); - } - - // set currentRepeat's build phase - currentRepeat-> - setCurrentRepeatBuildPhaseKind ( - msrRepeat::kRepeatBuildPhaseInEndings); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleVoiceLevelRepeatEndingStartWithExplicitStartInVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a voice-level repeat ending start with explicit start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithExplicitStartInVoice() 1"); - } -#endif - - gIndenter++; - - // fetch currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // get currentRepeat's common part - S_msrRepeatCommonPart - repeatCommonPart = - currentRepeat-> - getRepeatCommonPart (); - - // fetch last measure of last segment - S_msrMeasure - lastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithExplicitStartInVoice() 2"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Fetching the last measure of the last segment in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", it is:" << - endl << - lastMeasure->asShortString () << - endl; - } -#endif - - // fetch lastMeasure's elements list - const list& - lastMeasureElementsList = - lastMeasure-> - getMeasureElementsList (); - - // let's look at lastMeasure in detail - if (! lastMeasureElementsList.size ()) { - - // it is empty, keep it for a new voice last segment - - // remove last measure -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Removing the last measure in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasure - dummyMeasure = - fVoiceLastSegment-> - removeLastMeasureFromSegment ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 3"); - - // move voice last segment into the repeat common part - stringstream s2; - - s2 << - "Moving the voice last segment to the repeat common part in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber; - - moveVoiceLastSegmentToRepeatCommonPart ( - inputLineNumber, - repeatCommonPart, - s2.str ()); - - // create a new last segment containing a new measure for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a new last segment with the first ending measure for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentFromItsFirstMeasureForVoice ( - inputLineNumber, - lastMeasure, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 4"); - } - - else { - - // it is not empty - - // append last segment to initial voice elements list - appendVoiceLastSegmentToInitialVoiceElements ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 5"); - - // create a new last segment for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a new last segment for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentForVoice ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice() 6"); - } - - // set currentRepeat's build phase - currentRepeat-> - setCurrentRepeatBuildPhaseKind ( - msrRepeat::kRepeatBuildPhaseInEndings); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithExplicitStartInVoice() 7"); - } -#endif - - gIndenter--; -} - -void msrVoice::nestContentsIntoNewRepeatInVoice ( - int inputLineNumber) -{ - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - // is there a voice last segment? - if (fVoiceLastSegment) { - - // are there measures in the voice last segment? - if (fVoiceLastSegment->getSegmentMeasuresList ().size ()) { - // finalize current measure in voice - finalizeCurrentMeasureInVoice ( - inputLineNumber); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "nestContentsIntoNewRepeatInVoice() 1"); - } -#endif - - // move voice last segment to the list of initial elements - moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( - inputLineNumber, - "nestContentsIntoNewRepeatInVoice() 1"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "nestContentsIntoNewRepeatInVoice() 2"); - } -#endif - } - } - break; - } // switch -} - -void msrVoice::handleNestedRepeatEndingStartInVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a nested repeat ending start voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleNestedRepeatEndingStartInVoice() 2"); - } -#endif -} - -void msrVoice::handleRepeatEndingStartInVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat ending start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndingStartInVoice() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - gIndenter++; - - // analyze this repeat end's context - switch (fVoicePendingRepeatDescrsStack.size ()) { - case 0: - // this the first ending of a voice-level repeat without start - // ------------------------------------- - handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice ( - inputLineNumber, - nullptr); - break; - - case 1: - { - // fetch currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - switch (currentRepeat->getRepeatExplicitStartKind ()) { - case msrRepeat::kRepeatExplicitStartNo: - // this the first ending of a voice-level repeat without a start - // ------------------------------------- - handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice ( - inputLineNumber, - currentRepeat); - break; - case msrRepeat::kRepeatExplicitStartYes: - // this the first ending of a voice-level repeat with a start - // ------------------------------------- - handleVoiceLevelRepeatEndingStartWithExplicitStartInVoice ( - inputLineNumber); - break; - } // switch - } - break; - - default: - // newRepeat is a nested repeat - // --------------------------------------- - handleNestedRepeatEndingStartInVoice ( - inputLineNumber); - } // switch - - gIndenter--; - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndingStartInVoice() 2"); - } -#endif -} - -void msrVoice::handleRepeatEndingStartInVoiceClone ( - int inputLineNumber, - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind, - string repeatEndingNumber) // may be "1, 2" -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndingStartInVoiceClone() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // handle the repeat ending start - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat ending upon its start in voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // is there a current repeat? - switch (fVoicePendingRepeatDescrsStack.size ()) { - case 0: - { - stringstream s; - - s << - "repeats stack is empty when attempting to handle a repeat ending start in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case 1: - { - // this repeat ending is part of a voice-level repeat - - // fetch currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // create a repeat ending -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a " << - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingKind) << - " repeat ending in current repeat in voice clone \"" << - fVoiceName << - "\"" << - endl; - } -#endif - - S_msrRepeatEnding - repeatEnding = - msrRepeatEnding::create ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind, - currentRepeat); - - // add the repeat ending to the voice current repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending a " << - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingKind) << - " repeat ending to current repeat in voice \"" << - fVoiceName << - "\"" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "before adding a hooked repeat ending to current repeat"); - } -#endif - - currentRepeat-> - addRepeatEndingToRepeat ( - inputLineNumber, - repeatEnding); - - // set currentRepeat's build phase - currentRepeat-> - setCurrentRepeatBuildPhaseKind ( - msrRepeat::kRepeatBuildPhaseInEndings); - } - break; - - default: - { - // the current repeat is nested - - // JMI ??? - - // move voice last segment into the repeat common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Moving the voice last segment to the repeat common part in voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - } - } // switch - - gIndenter--; - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndingStartInVoiceClone() 2"); - } -#endif -} - -void msrVoice::handleSegmentCloneEndInVoiceClone ( - int inputLineNumber, - S_msrSegment segmentClone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Handling segment '" << - segmentClone->asShortString () << - "' in voice clone \"" << - fVoiceName << - "\"" << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegmentsDetails) { - displayVoice ( - inputLineNumber, - "handleSegmentCloneEndInVoiceClone() 1"); - } -#endif - - // analyze segmentClone's context, - // rest measures and measures repeats first, - // since they can be nested in repeats - if (fVoicePendingRestMeasures) { - // segmentClone belongs to a rest measures - - // get fVoicePendingRestMeasures's contents - S_msrRestMeasuresContents - restMeasuresContents = - fVoicePendingRestMeasures-> - getRestMeasuresContents (); - - // set segmentClone as the contents's segment - restMeasuresContents-> - setRestMeasuresContentsSegment ( - inputLineNumber, - segmentClone); - } - - else if (fVoicePendingMeasuresRepeat) { - // segmentClone belongs to a measures repeat - - switch ( - fVoicePendingMeasuresRepeat->getCurrentMeasuresRepeatBuildPhaseKind () - ) { - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseJustCreated: - { - stringstream s; - - s << - "segment '" << - segmentClone->asShortString () << - "'cannot be added to a just created measures repeat"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseInPattern: - { - // get fVoicePendingMeasuresRepeat's pattern - S_msrMeasuresRepeatPattern - measuresRepeatPattern = - fVoicePendingMeasuresRepeat-> - getMeasuresRepeatPattern (); - - // set segmentClone as the pattern's segment - measuresRepeatPattern-> - setMeasuresRepeatPatternSegment ( - // JMI inputLineNumber, - segmentClone); - } - break; - - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseInReplicas: - { - // get fVoicePendingMeasuresRepeat's replicas - S_msrMeasuresRepeatReplicas - measuresRepeatReplicas = - fVoicePendingMeasuresRepeat-> - getMeasuresRepeatReplicas (); - - // set segmentClone as the replicas's segment - measuresRepeatReplicas-> - setMeasuresRepeatReplicasSegment ( - // JMI inputLineNumber, - segmentClone); - } - break; - - case msrMeasuresRepeat::kMeasuresRepeatBuildPhaseCompleted: - { - stringstream s; - - s << - "segment '" << - segmentClone->asShortString () << - "'cannot be added to a completed measures repeat"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch - } - - else if (fVoicePendingRepeatDescrsStack.size ()) { - // segmentClone belongs to a repeat - - // append segment to whichever part of the repeat is adequate - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - currentRepeat-> - appendSegmentToRepeat ( - inputLineNumber, - segmentClone, - "handleSegmentCloneEndInVoiceClone() 2"); - } - - else { - // segmentClone is a voice-level segment - - // move fVoiceLastSegment to the initial voice elements list - moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( - inputLineNumber, - "handleSegmentCloneEndInVoiceClone()"); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegmentsDetails) { - displayVoice ( - inputLineNumber, - "handleSegmentCloneEndInVoiceClone() 3"); - } -#endif - - gIndenter--; -} - -/* JMI -void msrVoice::finalizeRepeatEndInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "finalizeRepeatEndInVoice() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // finalize current measure in voice - finalizeCurrentMeasureInVoice ( - inputLineNumber); - - // fetch the repeat - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to finalize a repeat in voice '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - S_msrRepeat - repeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // get repeat's common part - S_msrRepeatCommonPart - repeatCommonPart = - repeat-> - getRepeatCommonPart (); - - // is there another repeat to nest into this repeat? - if (! fVoicePendingRepeatDescrsStack.size ()) { - // yes, this repeat contains a nested repeat - -/ * JMI - // move all the voice contents to the new repeat common part - moveAllVoiceContentsToRepeatCommonPart ( - inputLineNumber, - repeatCommonPart, - "finalize repeat"); - // move the voice initial elements to the new repeat common part - * / - } - - else { - // no, this repeat is at the voice-level - -/ * JMI - // move all the voice contents to the new repeat common part - moveAllVoiceContentsToRepeatCommonPart ( // JMI - inputLineNumber, - repeatCommonPart, - "finalizing voice-level repeat"); - * / - } - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "finalizeRepeatEndInVoice() 2"); - } -#endif -} -*/ - -void msrVoice::createMeasuresRepeatFromItsFirstMeasuresInVoice ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a measures repeat from its first measure in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "createMeasuresRepeatFromItsFirstMeasuresInVoice() 1"); - } -#endif - - // this occurs after an empty measure has just been created, - // hence the repeated measure/measures is/are the - // measuresRepeatMeasuresNumber measures preceding the last one - - int - lastSegmentMeasuresNumber = - fVoiceLastSegment-> - getSegmentMeasuresList ().size (), - availableMeasuresNumber = - lastSegmentMeasuresNumber - 1; - - if ( - availableMeasuresNumber < measuresRepeatMeasuresNumber) { - stringstream s; - - s << - "attempting to create a measures repeat with " << - measuresRepeatMeasuresNumber << - " measures while current last segment only has " << - availableMeasuresNumber << - " available"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // grab the just created last measure from the voice, - // (i.e. the one containing: - // 2) - // which is the first replica measure - S_msrMeasure - firstReplicaMeasure = - removeLastMeasureFromVoice ( - inputLineNumber); - - // create the measures repeat repeated segment - S_msrSegment - repeatedSegment = - msrSegment::create ( - inputLineNumber, - this); - - if (! fVoiceFirstSegment) { - fVoiceFirstSegment = fVoiceLastSegment; - } - - // remove the repeated measure(s) for the last segment - // and prepend them to the repeated segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Removing the last " << - singularOrPlural ( - measuresRepeatMeasuresNumber, "measure", "measures") << - " (to be repeated) from voice \"" << - fVoiceName << - endl; - } -#endif - - for (int i = 0; i < measuresRepeatMeasuresNumber; i++) { - S_msrMeasure - lastMeasure = - removeLastMeasureFromVoice ( - inputLineNumber); - - repeatedSegment-> - prependMeasureToSegment ( - lastMeasure); - } // for - - // create the measures repeat - if (fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "attempting to create a measures repeat while another one is pending"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fVoicePendingMeasuresRepeat = - msrMeasuresRepeat::create ( - inputLineNumber, - measuresRepeatMeasuresNumber, - measuresRepeatSlashesNumber, - this); - - // create the measures repeat pattern -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a measures repeat pattern in voice \"" << - fVoiceName << - "\"" << - endl; - } -#endif - - S_msrMeasuresRepeatPattern - measuresRepeatPattern = - msrMeasuresRepeatPattern::create ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - - // set the repeated segment as the measures repeat pattern segment - measuresRepeatPattern-> - setMeasuresRepeatPatternSegment ( - repeatedSegment); - - // set the measures repeat pattern - fVoicePendingMeasuresRepeat-> - setMeasuresRepeatPattern ( - measuresRepeatPattern); - - // create a new last segment to collect the measures repeat replicas, - // containing the first, yet incomplete, replica -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a new last segment with the first replica measure for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentFromItsFirstMeasureForVoice ( - inputLineNumber, - firstReplicaMeasure, - "createMeasuresRepeatFromItsFirstMeasuresInVoice() 2"); - - // keep the measures repeat pending - - // print resulting voice contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "createMeasuresRepeatFromItsFirstMeasuresInVoice() 3"); - } -#endif -} - -void msrVoice::appendRestMeasuresToVoice ( - int inputLineNumber, - S_msrRestMeasures restMeasures) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending rest measures '" << - restMeasures->asShortString () << - "' to voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "appendRestMeasuresToVoice() 1"); - } -#endif - - // analyze this rest measures's context - switch (fVoicePendingRepeatDescrsStack.size ()) { - case 0: - // this rest measures is at the voice-level - // ------------------------------------- - appendRestMeasuresToVoiceElementsList ( - restMeasures); - break; - - default: - // this rest measures is inside a repeat - // ------------------------------------- - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - currentRepeat-> - appendRestMeasuresToRepeat ( - inputLineNumber, - restMeasures, - "appendRestMeasuresToVoice() 2"); - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "appendRestMeasuresToVoice() 3"); - } -#endif -} - -void msrVoice::appendMeasuresRepeatToVoice ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending measures repeat '" << - measuresRepeat->asShortString () << - "' to voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "appendMeasuresRepeatToVoice() 1"); - } -#endif - - // analyze this measures repeats's context - switch (fVoicePendingRepeatDescrsStack.size ()) { - case 0: - // this measures repeat is at the voice-level - // ------------------------------------- - appendMeasuresRepeatToVoiceElementsList ( - measuresRepeat); - break; - - default: - // this measures repeat is inside a repeat - // ------------------------------------- - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - currentRepeat-> - appendMeasuresRepeatToRepeat ( - inputLineNumber, - measuresRepeat, - "appendMeasuresRepeatToVoice() 2"); - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "appendMeasuresRepeatToVoice() 3"); - } -#endif -} - -void msrVoice::appendPendingMeasuresRepeatToVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending pending measures repeat to voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "appendPendingMeasuresRepeatToVoice() 1"); - } -#endif - - // does the current measures repeat exist? - if (! fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "attempting to append a pending measures repeat which doesn't exist"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // fetch the last segment's measure list - list - voiceLastSegmentMeasureList = - fVoiceLastSegment-> - getSegmentMeasuresList (); - - // grab the just created last measure - // in the last segment's measure list, - // (i.e. the one containing: - // ) - // which is the next measure after the measures repeat - if (! voiceLastSegmentMeasureList.size ()) { - stringstream s; - - s << - "attempting to grab first measure of voice last segment, that contains none"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - S_msrMeasure - nextMeasureAfterMeasuresRepeat = - voiceLastSegmentMeasureList.back (); - -// BOFBOFBOF JMI - // remove the next measure from the last segment's measure list -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Removing last measure in last segment" << - "in voice \"" << - fVoiceName << - "\":" << - endl; - gIndenter++; - gLogOstream << - nextMeasureAfterMeasuresRepeat; - gLogOstream << endl; - } -#endif - - voiceLastSegmentMeasureList.pop_back (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "appendPendingMeasuresRepeatToVoice() 2"); - } -#endif - - // create the measures repeat replicas contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a measures repeat replicas contents for voice \"" << - fVoiceName << "\" is:" << - endl; - } -#endif - - S_msrMeasuresRepeatReplicas - measuresRepeatReplicas = - msrMeasuresRepeatReplicas::create ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - - // set the voice last segment as the measures repeat replicas segment - measuresRepeatReplicas-> - setMeasuresRepeatReplicasSegment ( - fVoiceLastSegment); - - fVoicePendingMeasuresRepeat-> - setMeasuresRepeatReplicas ( - measuresRepeatReplicas); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Setting pending measures repeat replicas segment in voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - fVoicePendingMeasuresRepeat-> - setMeasuresRepeatReplicas ( - measuresRepeatReplicas); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Setting measures repeat segment to voice last segment for voice \"" << - fVoiceName << "\"" << - endl; - } -#endif - - fVoicePendingMeasuresRepeat-> - getMeasuresRepeatReplicas ()-> - setMeasuresRepeatReplicasSegment ( - fVoiceLastSegment); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; // JMI - - // append pending measures repeat to the voice - appendMeasuresRepeatToVoice ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - - // create a new last segment to collect the remainder of the voice, - // containing the next, yet incomplete, measure -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a new last segment with the AAA measures repeat next measure for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentFromItsFirstMeasureForVoice ( - inputLineNumber, - nextMeasureAfterMeasuresRepeat, - "appendPendingMeasuresRepeatToVoice() 3"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending pending measures repeat to voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "appendPendingMeasuresRepeatToVoice() 4"); - } -#endif -} - -void msrVoice::createMeasuresRepeatAndAppendItToVoiceClone ( - int inputLineNumber, - int measuresRepeatMeasuresNumber, - int measuresRepeatSlashesNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating measures repeat and appending it to voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "createMeasuresRepeatAndAppendItToVoiceClone() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // does the pending measures repeat exist? - if (fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "attempting to create a measures repeat while another one is pending"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create the measures repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating and appending a measures repeat in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - fVoicePendingMeasuresRepeat = - msrMeasuresRepeat::create ( - inputLineNumber, - measuresRepeatMeasuresNumber, - measuresRepeatSlashesNumber, - this); - - // create a measures repeat pattern from current last segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a measures repeat pattern from current last segment in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasuresRepeatPattern - measuresRepeatPattern = - msrMeasuresRepeatPattern::create ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - - // set current last segment as the measures repeat pattern segment - measuresRepeatPattern-> - setMeasuresRepeatPatternSegment ( - fVoiceLastSegment); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; // JMI - - // set the measures repeat pattern -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Setting repeat common part in voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - fVoicePendingMeasuresRepeat-> - setMeasuresRepeatPattern ( - measuresRepeatPattern); - - // append the measures repeat to the list of initial elements -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending measures repeat to voice \"" << - fVoiceName << - "\"" << - endl; - } -#endif - - // append pending measures repeat to the voice - appendMeasuresRepeatToVoice ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating measures repeat and appending it to voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "createMeasuresRepeatAndAppendItToVoiceClone() 2"); - } -#endif -} - -void msrVoice::setVoiceContainsRestMeasures ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains rest measures" << - endl; - } -#endif - - fVoiceContainsRestMeasures = true; -} - -void msrVoice::setVoiceContainsMeasuresRepeats ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", contains measures repeats" << - endl; - } -#endif - - fVoiceContainsMeasuresRepeats = true; -} - -void msrVoice::createRestMeasuresInVoice ( - int inputLineNumber, - int restMeasuresNumber) -{ - // create a rest measures -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Creating a rest measures in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - ", " << - singularOrPlural ( - restMeasuresNumber, "measure", "measures") << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "createRestMeasuresInVoice() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - gIndenter++; - - // grab the just created last measure from the voice, - // (i.e. the one containing: - // 2) - // which is the first rest measure - S_msrMeasure - firstRestMeasure = - removeLastMeasureFromVoice ( - inputLineNumber); - - // move the current voice last segment to the initial elements list - moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( //JMI - inputLineNumber, - "createRestMeasuresInVoice() 2"); - - // create the rest measures - if (fVoicePendingRestMeasures) { - stringstream s; - - s << - "attempting to create a rest measures while another one is pending"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fVoicePendingRestMeasures = - msrRestMeasures::create ( - inputLineNumber, - firstRestMeasure->getFullMeasureWholeNotesDuration (), - restMeasuresNumber, - this); - - // remember fVoicePendingRestMeasures for later next measure number setting -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Registering rest measures as waiting for its next measure number" << - ", restMeasuresNumber = " << - restMeasuresNumber << - " in voice \"" << - fVoiceName << "\"" << - endl; - } -#endif - - fVoiceRestMeasuresWaitingForItsNextMeasureNumber = - fVoicePendingRestMeasures; - - fVoiceRemainingRestMeasures = - restMeasuresNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting fVoiceRemainingRestMeasures to '" << - fVoiceRemainingRestMeasures << - "' in voice \"" << - fVoiceName << "\"" << - endl; - } -#endif - - // create a new segment to collect the rest measures, - // containing the first, rest measure -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Creating a new last segment containing the first rest measure in voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentFromItsFirstMeasureForVoice ( - inputLineNumber, - firstRestMeasure, - "createRestMeasuresInVoice() 3"); - - // this voice contails rest measures - this->setVoiceContainsRestMeasures ( - inputLineNumber); - - // keep the rest measures pending - - gIndenter--; - } - break; - } // switch - - // print resulting voice contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "createRestMeasuresInVoice() 4"); - } -#endif -} - -void msrVoice::appendPendingRestMeasuresToVoice ( - int inputLineNumber) -{ - // a rest measures is a voice element, - // and can be voice-level as well as part of a repeat - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "appendPendingRestMeasuresToVoice() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // does the pending rest measures exist? - if (! fVoicePendingRestMeasures) { - stringstream s; - - s << - "attempting to append a pending rest measures which doesn't exist"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending pending rest measures '" << - fVoicePendingRestMeasures->asShortString () << - "' to voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the rest measures contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Creating a rest measures contents for voice \"" << - fVoiceName << "\" is:" << - endl; - } -#endif - - S_msrRestMeasuresContents - restMeasuresContents = - msrRestMeasuresContents::create ( - inputLineNumber, - fVoicePendingRestMeasures); - - // set voice last segment as the rest measures contents segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting current last segment as rest measures contents segment in voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - restMeasuresContents-> - setRestMeasuresContentsSegment ( - inputLineNumber, - fVoiceLastSegment); - - // set restMeasuresContents as the rest measures contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Setting rest measures contents in voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - fVoicePendingRestMeasures-> - setRestMeasuresContents ( - restMeasuresContents); - - // set pending rest measures last measure purist number - fVoicePendingRestMeasures-> - setRestMeasuresLastMeasurePuristMeasureNumber ( - inputLineNumber); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; - - // append pending rest measures to the voice - appendRestMeasuresToVoice ( - inputLineNumber, - fVoicePendingRestMeasures); - - // forget about this pending rest measures - fVoicePendingRestMeasures = nullptr; - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "appendPendingRestMeasuresToVoice() 2"); - } -#endif -} - -void msrVoice::handleRestMeasuresStartInVoiceClone ( - int inputLineNumber, - S_msrRestMeasures restMeasures) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Handling rest measures start in voice clone \"" << - getVoiceName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresStartInVoiceClone() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - - // is there a voice last segment? - if (fVoiceLastSegment) { - - // are there measures in the voice last segment? - if (fVoiceLastSegment->getSegmentMeasuresList ().size ()) { - - // finalize current measure in voice - finalizeCurrentMeasureInVoice ( - inputLineNumber); - - // move voice last segment to the list of initial elements - moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( - inputLineNumber, - "handleRestMeasuresStartInVoiceClone() 2"); - - // forget about fVoicePendingRestMeasures - fVoicePendingRestMeasures = nullptr; - - // create a new last segment containing a new measure for the voice - createNewLastSegmentForVoice ( - inputLineNumber, - "handleRestMeasuresStartInVoiceClone()"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresStartInVoiceClone() 3"); - } -#endif - } - } - - // is there already a current rest measures in this voice? - if (fVoicePendingRestMeasures) { - stringstream s; - - s << - "current voice rest measures is not null when attempting to handle rest measures start '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create the rest measures clone and register it - fVoicePendingRestMeasures = - restMeasures-> - createRestMeasuresNewbornClone ( - this); - - // this voice contails rest measures - this->setVoiceContainsRestMeasures ( - inputLineNumber); - - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresStartInVoiceClone() 4"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleRestMeasuresEndInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Handling rest measures end in voice clone \"" << - getVoiceName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresEndInVoiceClone() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - - // is there a current rest measures in this voice? - if (! fVoicePendingRestMeasures) { - stringstream s; - - s << - "current voice rest measures is null when attempting to handle rest measures end '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // set pending rest measures last measure purist number - fVoicePendingRestMeasures-> - setRestMeasuresLastMeasurePuristMeasureNumber ( - inputLineNumber); - - // append current voice rest measure to the initial voice elements list - appendRestMeasuresToInitialVoiceElements ( - inputLineNumber, - fVoicePendingRestMeasures, - "handleRestMeasuresEndInVoiceClone() 2"); - - // forget about fVoicePendingRestMeasures - fVoicePendingRestMeasures = nullptr; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoice ( - inputLineNumber, - "handleRestMeasuresEndInVoiceClone() 3"); - } -#endif - break; - } // switch - - gIndenter--; -} - -void msrVoice::handleRestMeasuresContentsStartInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Handling rest measures contents start in voice clone \"" << - getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresContentsStartInVoiceClone() 1"); - } -#endif - - gIndenter++; - - if (! fVoicePendingRestMeasures) { - stringstream s; - - s << - "current voice rest measures is null when attempting to handle rest measures contents start '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create fVoicePendingRestMeasures' rest contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Creating a rest measures contents upon its start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRestMeasuresContents - restMeasuresContents = - msrRestMeasuresContents::create ( - inputLineNumber, - fVoicePendingRestMeasures); - - // register it in fVoicePendingRestMeasures - fVoicePendingRestMeasures-> - setRestMeasuresContents ( - restMeasuresContents); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresContentsStartInVoiceClone() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleRestMeasuresContentsEndInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Handling rest measures contents end in voice clone \"" << - getVoiceName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresContentsEndInVoiceClone() 1"); - } -#endif - - if (! fVoicePendingRestMeasures) { - stringstream s; - - s << - "current voice rest measures is null when attempting to handle rest measures contents end '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // get fVoicePendingRestMeasures's contents - S_msrRestMeasuresContents - restMeasuresContents = - fVoicePendingRestMeasures-> - getRestMeasuresContents (); - - // set fVoiceLastSegment as restMeasuresContents' segment - restMeasuresContents-> - setRestMeasuresContentsSegment ( - inputLineNumber, - fVoiceLastSegment); - - // forget about fVoiceLastSegment - // fVoiceLastSegment = nullptr; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "handleRestMeasuresContentsEndInVoiceClone() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::appendRestMeasuresCloneToVoiceClone ( - int inputLineNumber, - S_msrRestMeasures restMeasuresClone) -{ - gIndenter++; - - // sanity check - msrAssert( - restMeasuresClone != nullptr, - "restMeasuresClone is null"); - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending rest measures clone '" << - restMeasuresClone->asString () << - "' to voice clone \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - - displayVoiceRestMeasuresAndVoice ( - inputLineNumber, - "appendRestMeasuresCloneToVoiceClone() 1"); - } -#endif - - // is rest measures nested in a repeat? - if (fVoicePendingRepeatDescrsStack.size ()) { - // yes - - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // grab the rest measures segment, i.e. the voice's last segment JMI ??? - S_msrSegment - restMeasuresSegment = - fVoiceLastSegment; - - // append it to the current repeat's common part - currentRepeat-> - getRepeatCommonPart ()-> - appendSegmentToRepeatCommonPart ( // NO !!! - inputLineNumber, - restMeasuresSegment, - "appendRestMeasuresCloneToVoiceClone() 2"); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; - } - - else { - // no - // JMI ??? - } - - // append the rest measures clone to the voice - appendRestMeasuresToVoice ( - inputLineNumber, - restMeasuresClone); - - // print resulting voice contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - displayVoice ( - inputLineNumber, - "appendRestMeasuresCloneToVoiceClone() 3"); - } -#endif - } - break; - } // switch - - gIndenter--; -} - -void msrVoice::appendRepeatCloneToVoiceClone ( - int inputLineNumber, - S_msrRepeat repeatCLone) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending repeat clone '" << - repeatCLone->asString () << - "' to voice clone \"" << - getVoiceName () << "\"" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "appendRepeatCloneToVoiceClone() 1"); - } -#endif - - gIndenter++; - - // sanity check - msrAssert( - repeatCLone != nullptr, - "repeatCLone is null"); - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // pushing repeat clone as the (new) current repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Pushing repeat clone as the new current repeat in voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - // push the repeat clone onto the voice's repeat descrs stack - pushRepeatOntoRepeatDescrsStack ( - inputLineNumber, - repeatCLone, - "appendRepeatCloneToVoiceClone() 2"); - - // append it to the list of initial elements - appendRepeatCloneToInitialVoiceElements ( - inputLineNumber, - repeatCLone, - "appendRepeatCloneToVoiceClone() 3"); - } - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "appendRepeatCloneToVoiceClone() 4"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleMeasuresRepeatStartInVoiceClone ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Handling measures repeat start in voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatStartInVoiceClone() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - // is there already a current measures repeat in this voice? - if (fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "current voice measures repeat is not null when attempting to handle measures repeat start '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create the measures repeat clone and register it - fVoicePendingMeasuresRepeat = - measuresRepeat-> - createMeasuresRepeatNewbornClone ( - this); - - // this voice contails measures repeats - this->setVoiceContainsMeasuresRepeats ( - inputLineNumber); - - // set fVoicePendingMeasuresRepeat's build phase to completed - fVoicePendingMeasuresRepeat-> - setCurrentMeasuresRepeatBuildPhaseKind ( - msrMeasuresRepeat::kMeasuresRepeatBuildPhaseJustCreated); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatStartInVoiceClone() 2"); - } -#endif - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatStartInVoiceClone() 3"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleMeasuresRepeatEndInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Handling measures repeat end in voice clone \"" << - getVoiceName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatEndInVoiceClone() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - // is there a current measures repeat in this voice? - if (! fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "current voice measures repeat is null when attempting to handle measures repeat end '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // append current voice rest measure to the initial voice elements list - appendMeasuresRepeatToInitialVoiceElements ( - inputLineNumber, - fVoicePendingMeasuresRepeat, - "handleMeasuresRepeatEndInVoiceClone() 2"); - - // forget about fVoicePendingMeasuresRepeat - fVoicePendingMeasuresRepeat = nullptr; - - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatEndInVoiceClone() 3"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleMeasuresRepeatPatternStartInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Handling measures repeat start in voice clone \"" << - getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatPatternStartInVoiceClone() 1"); - } -#endif - - if (! fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "current voice measures repeat is null when attempting to handle measures repeat pattern start '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create fVoicePendingMeasuresRepeat' rest pattern -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a measures repeat pattern upon its start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasuresRepeatPattern - measuresRepeatPattern = - msrMeasuresRepeatPattern::create ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - - // register it in fVoicePendingMeasuresRepeat - fVoicePendingMeasuresRepeat-> - setMeasuresRepeatPattern ( - measuresRepeatPattern); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatPatternStartInVoiceClone() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleMeasuresRepeatPatternEndInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Handling measures repeat end in voice clone \"" << - getVoiceName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatPatternEndInVoiceClone() 1"); - } -#endif - - if (! fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "current voice measures repeat is null when attempting to handle measures repeat pattern end '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // get fVoicePendingMeasuresRepeat's pattern - S_msrMeasuresRepeatPattern - measuresRepeatPattern = - fVoicePendingMeasuresRepeat-> - getMeasuresRepeatPattern (); - - // set fVoiceLastSegment as measuresRepeatPattern' segment - measuresRepeatPattern-> - setMeasuresRepeatPatternSegment ( - fVoiceLastSegment); - - // forget about fVoiceLastSegment - // fVoiceLastSegment = nullptr; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatPatternEndInVoiceClone() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleMeasuresRepeatReplicasStartInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Handling measures repeat start in voice clone \"" << - getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatReplicasStartInVoiceClone() 1"); - } -#endif - - if (! fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "current voice measures repeat is null when attempting to handle measures repeat replicas start '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create fVoicePendingMeasuresRepeat' replicas -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Creating a measures repeat replicas upon its start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrMeasuresRepeatReplicas - measuresRepeatReplicas = - msrMeasuresRepeatReplicas::create ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - - // register it in fVoicePendingMeasuresRepeat - fVoicePendingMeasuresRepeat-> - setMeasuresRepeatReplicas ( - measuresRepeatReplicas); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatReplicasStartInVoiceClone() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleMeasuresRepeatReplicasEndInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Handling measures repeat end in voice clone \"" << - getVoiceName () << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatReplicasEndInVoiceClone() 1"); - } -#endif - - if (! fVoicePendingMeasuresRepeat) { - stringstream s; - - s << - "current voice measures repeat is null when attempting to handle measures repeat replicas end '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // get fVoicePendingMeasuresRepeat's replicas - S_msrMeasuresRepeatReplicas - measuresRepeatReplicas = - fVoicePendingMeasuresRepeat-> - getMeasuresRepeatReplicas (); - - // set fVoiceLastSegment as measuresRepeatReplicas' segment - measuresRepeatReplicas-> - setMeasuresRepeatReplicasSegment ( - fVoiceLastSegment); - - // forget about fVoiceLastSegment - // fVoiceLastSegment = nullptr; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "handleMeasuresRepeatReplicasEndInVoiceClone() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::appendMeasuresRepeatCloneToVoiceClone ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeatClone) -{ - gIndenter++; - - // sanity check - msrAssert( - measuresRepeatClone != nullptr, - "measuresRepeatClone is null"); - - switch (fVoiceKind) { // superflous JMI ??? - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending measures repeat clone '" << - measuresRepeatClone->asString () << - "' to voice clone \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "appendMeasuresRepeatCloneToVoiceClone() 1"); - } -#endif - - // is measures repeat nested in a repeat? - if (fVoicePendingRepeatDescrsStack.size ()) { - // yes - - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // grab the measures repeat segment, i.e. the voice's last segment JMI ??? - S_msrSegment - measuresRepeatSegment = - fVoiceLastSegment; - - // append it to the current repeat's common part - currentRepeat-> - getRepeatCommonPart ()-> - appendSegmentToRepeatCommonPart ( // NO !!! - inputLineNumber, - measuresRepeatSegment, - "appendMeasuresRepeatCloneToVoiceClone() 2"); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; - } - - else { - // no - // JMI ??? - } - - // append the measures repeat clone to the voice - appendMeasuresRepeatToVoice ( - inputLineNumber, - measuresRepeatClone); - - // print resulting voice contents -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - displayVoiceMeasuresRepeatAndVoice ( - inputLineNumber, - "appendMeasuresRepeatCloneToVoiceClone() 3"); - } -#endif - } - break; - } // switch - - gIndenter--; -} - -void msrVoice::handleHookedRepeatEndingEndInVoice ( - int inputLineNumber, - string repeatEndingNumber) // may be "1, 2" -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a hooked repeat ending in voice \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHookedRepeatEndingEndInVoice() 1"); - } -#endif - - gIndenter++; - -/* JMI - int voicerepeatDescrsStackSize = - fVoicePendingRepeatDescrsStack.size (); -*/ - - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to handle a hooked repeat ending end in voice '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // finalize current measure in voice - finalizeCurrentMeasureInVoice ( - inputLineNumber); - - // grab currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // create a hooked repeat ending - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind = - msrRepeatEnding::kHookedEnding; - - S_msrRepeatEnding - repeatEnding = - msrRepeatEnding::create ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind, - currentRepeat); - - // move the voice last segment to repeatEnding - moveVoiceLastSegmentToRepeatEnding ( - inputLineNumber, - repeatEnding, - "handleHookedRepeatEndingEndInVoice() 2"); - - // add the repeat ending to the voice current repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending a " << - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingKind) << - " repeat ending to current repeat in voice \"" << - fVoiceName << - "\"" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "before adding a hooked repeat ending to current repeat"); - } -#endif - - currentRepeat-> - addRepeatEndingToRepeat ( - inputLineNumber, - repeatEnding); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHookedRepeatEndingEndInVoice() 3"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleHooklessRepeatEndingEndInVoice ( - int inputLineNumber, - string repeatEndingNumber) // may be "1, 2" -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a hookless repeat ending in voice \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHooklessRepeatEndingEndInVoice() 1"); - } -#endif - - gIndenter++; - - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to handle a hookless repeat ending end in voice '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // finalize current measure in voice - finalizeCurrentMeasureInVoice ( - inputLineNumber); - - // grab currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // create a hookless repeat ending - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind = - msrRepeatEnding::kHooklessEnding; - - S_msrRepeatEnding - repeatEnding = - msrRepeatEnding::create ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind, - currentRepeat); - - // move the voice last segment to repeatEnding - moveVoiceLastSegmentToRepeatEnding ( - inputLineNumber, - repeatEnding, - "handleHookedRepeatEndingEndInVoice() 2"); - - // add the repeat ending it to the voice current repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending a " << - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingKind) << - " repeat ending to current repeat in voice \"" << - fVoiceName << - "\"" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "before adding a hookless repeat ending to current repeat"); - } -#endif - - currentRepeat-> - addRepeatEndingToRepeat ( - inputLineNumber, - repeatEnding); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "after adding a hookless repeat ending to current repeat"); - } -#endif - - // append currentRepeat to the list of initial elements - appendRepeatCloneToInitialVoiceElements ( - inputLineNumber, - currentRepeat, - "handleHooklessRepeatEndingEndInVoice() 3"); - - // pop it from the voice's repeat descrs stack - popRepeatFromRepeatDescrsStack ( - inputLineNumber, - currentRepeat, - "handleHooklessRepeatEndingEndInVoice"); - - // create a new last segment containing a new measure for the voice - createNewLastSegmentForVoice ( - inputLineNumber, - "handleHooklessRepeatEndingEndInVoice() 4"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHooklessRepeatEndingEndInVoice() 5"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleRepeatEndingEndInVoice ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind) -{ - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - switch (repeatEndingKind) { - case msrRepeatEnding::kHookedEnding: - handleHookedRepeatEndingEndInVoice ( - inputLineNumber, - repeatEndingNumber); - break; - - case msrRepeatEnding::kHooklessEnding: - handleHooklessRepeatEndingEndInVoice ( - inputLineNumber, - repeatEndingNumber); - break; - } // switch - break; - } - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "appendRepeatEndingToVoice() 0"); - } -#endif -} - -void msrVoice::handleRepeatCommonPartStartInVoiceClone ( - int inputLineNumber) // may be "1, 2" -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat common part start in voice clone \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatCommonPartStartInVoiceClone() 1"); - } -#endif - - gIndenter++; - - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to handle repeat common part start '" << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // grab currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // create currentRepeat's common part -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat common part upon its start in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeatCommonPart - repeatCommonPart = - msrRepeatCommonPart::create ( - inputLineNumber, - currentRepeat); - - // register it in currentRepeat - currentRepeat-> - setRepeatCommonPart ( - repeatCommonPart); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatCommonPartStartInVoiceClone() 2"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleRepeatCommonPartEndInVoiceClone ( - int inputLineNumber) // may be "1, 2" -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat common part end in voice clone \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatCommonPartEndInVoiceClone() 1"); - } -#endif - - gIndenter++; - - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to handle repeat ending '" << - // repeatEnding->asShortString () << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // grab currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // get currentRepeat's common part - S_msrRepeatCommonPart - repeatCommonPart = - currentRepeat-> - getRepeatCommonPart (); - -/* JMI - // fetch the last segment's last measure - S_msrMeasure - voiceLastSegmentLastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - "handleRepeatCommonPartEndInVoiceClone() 2"); -*/ - - // set voice current after repeat component phase kind - setCurrentVoiceRepeatPhaseKind ( - inputLineNumber, - kVoiceRepeatPhaseAfterCommonPart); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatCommonPartEndInVoiceClone() 3"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleHookedRepeatEndingEndInVoiceClone ( - int inputLineNumber, - string repeatEndingNumber) // may be "1, 2" -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a hooked repeat ending in voice clone \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHookedRepeatEndingEndInVoiceClone() 1"); - } -#endif - - gIndenter++; - - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to handle hooked repeat ending '" << - // repeatEnding->asShortString () << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // grab currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // create a hooked repeat ending - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind = - msrRepeatEnding::kHookedEnding; - - S_msrRepeatEnding - repeatEnding = - msrRepeatEnding::create ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind, - currentRepeat); - - // fetch the last segment's last measure - S_msrMeasure - voiceLastSegmentLastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - "handleHookedRepeatEndingEndInVoiceClone() 2"); - - // set voice current after repeat component phase kind - setCurrentVoiceRepeatPhaseKind ( - inputLineNumber, - kVoiceRepeatPhaseAfterHookedEnding); - - // move the voice last segment to repeatEnding - moveVoiceLastSegmentToRepeatEnding ( - inputLineNumber, - repeatEnding, - "handleHookedRepeatEndingEndInVoiceClone()"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHookedRepeatEndingEndInVoiceClone() 3"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleHooklessRepeatEndingEndInVoiceClone ( - int inputLineNumber, - string repeatEndingNumber) // may be "1, 2" -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a hookless repeat ending in voice clone \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHooklessRepeatEndingEndInVoiceClone() 1"); - } -#endif - - gIndenter++; - - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to handle hookless repeat ending '" << - // repeatEnding->asShortString () << - "' in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // grab currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // create a hookless repeat ending - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind = - msrRepeatEnding::kHooklessEnding; - - S_msrRepeatEnding - repeatEnding = - msrRepeatEnding::create ( - inputLineNumber, - repeatEndingNumber, - repeatEndingKind, - currentRepeat); - - // fetch the last segment's last measure - S_msrMeasure - voiceLastSegmentLastMeasure = - fVoiceLastSegment-> - fetchLastMeasureFromSegment ( - inputLineNumber, - "handleHookedRepeatEndingEndInVoiceClone() 2"); - - // set voice current after repeat component phase kind - setCurrentVoiceRepeatPhaseKind ( - inputLineNumber, - kVoiceRepeatPhaseAfterHooklessEnding); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleHooklessRepeatEndingEndInVoiceClone() 3"); - } -#endif - - gIndenter--; -} - -void msrVoice::handleRepeatEndingEndInVoiceClone ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "appendRepeatEndingToVoiceClone() 1"); - } -#endif - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - switch (repeatEndingKind) { - case msrRepeatEnding::kHookedEnding: - handleHookedRepeatEndingEndInVoiceClone ( - inputLineNumber, - repeatEndingNumber); - break; - - case msrRepeatEnding::kHooklessEnding: - handleHooklessRepeatEndingEndInVoiceClone ( - inputLineNumber, - repeatEndingNumber); - break; - } // switch - break; - } - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "appendRepeatEndingToVoiceClone() 2"); - } -#endif -} - -void msrVoice::handleRepeatStartInVoiceClone ( - int inputLineNumber, - S_msrRepeat repeat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling repeat start in voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatStartInVoiceClone() 1"); - } -#endif - - gIndenter++; - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - // is there a voice last segment? - if (fVoiceLastSegment) { - - // fetch last segment's measures list - list - voiceLastSegmentMeasuresList = - fVoiceLastSegment-> - getSegmentMeasuresList (); - - // are there measures in the voice last segment? - if (voiceLastSegmentMeasuresList.size ()) { - // finalize current measure in voice - finalizeCurrentMeasureInVoice ( - inputLineNumber); - - // move current last segment to the list of initial elements - moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( - inputLineNumber, - "handleRepeatStartInVoiceClone() 2"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatStartInVoiceClone() 3"); - } -#endif - } - } - - // create the repeat clone and stack it -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Creating a repeat upon its start in voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrRepeat - repeatClone = - createARepeatCloneAndStackIt ( - inputLineNumber, - repeat, - "handleRepeatStartInVoiceClone() 4"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatStartInVoiceClone() 5"); - } -#endif - break; - } // switch - - gIndenter--; -} - -void msrVoice::handleRepeatEndInVoiceClone ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Handling a repeat end in voice clone \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // finalize current measure in voice - finalizeCurrentMeasureInVoice ( - inputLineNumber); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndInVoiceClone() 1"); - } -#endif - - // is there a current repeat? - switch (fVoicePendingRepeatDescrsStack.size ()) { - case 0: - { - stringstream s; - - s << - "repeats stack is empty when attempting to handle a repeat end in voice clone '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case 1: - { - // this is a voice-level repeat - - // fetch currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // get currentRepeat's common part - S_msrRepeatCommonPart - repeatCommonPart = - currentRepeat-> - getRepeatCommonPart (); - - // append currentRepeat to the list of initial elements - appendRepeatToInitialVoiceElements ( - inputLineNumber, - currentRepeat, - "handleRepeatEndInVoiceClone() 2"); - - // pop currentRepeat from the voice's repeat descrs stack - popRepeatFromRepeatDescrsStack ( - inputLineNumber, - currentRepeat, - "handleRepeatEndInVoiceClone() 3"); - - // forget about the voice last segment JMI ??? BOF - fVoiceLastSegment = nullptr; - } - break; - - default: - { - // this is a nested repeat - - // fetch currentRepeat - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - // get currentRepeat's common part - S_msrRepeatCommonPart - repeatCommonPart = - currentRepeat-> - getRepeatCommonPart (); - - // append currentRepeat to the list of initial elements - appendRepeatCloneToInitialVoiceElements ( - inputLineNumber, - currentRepeat, - "handleRepeatEndInVoiceClone() 4"); - - // pop currentRepeat from the voice's repeat descrs stack - popRepeatFromRepeatDescrsStack ( - inputLineNumber, - currentRepeat, - "handleRepeatEndInVoiceClone() 5"); - } - } // switch - - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "handleRepeatEndInVoiceClone() 6"); - } -#endif - } - break; - } // switch - - gIndenter--; -} - -void msrVoice::appendMeasuresRepeatReplicaToVoice ( - int inputLineNumber) -{ - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending a measures repeat replica to voice \"" << - getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // fetch last measure's full measure whole notes - /* JMI - int fullMeasureWholeNotesDuration = - fVoiceLastSegment-> - getSegmentMeasuresList ().back ()-> - getFullMeasureWholeNotesDuration (); - */ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { // JMI - gLogOstream << - endl << - "***********" << - endl << - endl; - print (gLogOstream); - gLogOstream << - "***********" << - endl << - endl; - } -#endif - - // sanity check - msrAssert ( - fVoicePendingMeasuresRepeat != nullptr, - "fVoicePendingMeasuresRepeat is null"); - - // create a measures repeat replicas - S_msrMeasuresRepeatReplicas - measuresRepeatReplicas = - msrMeasuresRepeatReplicas::create ( - inputLineNumber, - fVoicePendingMeasuresRepeat); - - // set the voice last segment as the measures repeat replicas segment - measuresRepeatReplicas-> - setMeasuresRepeatReplicasSegment ( - fVoiceLastSegment); - - // forget about this voice last segment - fVoiceLastSegment = nullptr; - - // set the measures repeat replicas in the voice current measures repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { // JMI - gLogOstream << - "Setting the measures repeat replica to current measures repeat BBB in voice \"" << - fVoiceName << - "\"" << - endl; - } -#endif - - fVoicePendingMeasuresRepeat-> - setMeasuresRepeatReplicas ( - measuresRepeatReplicas); - } - break; - } // switch -} - -void msrVoice::appendRestMeasuresToVoiceElementsList ( - S_msrRestMeasures restMeasures) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - gLogOstream << - "Appending rest measures '" << - restMeasures->asString () << - "' to voice \"" << - fVoiceName << - "\"," << - endl; - } -#endif - - // sanity check - msrAssert ( - restMeasures != nullptr, - "restMeasures is null"); - - fInitialVoiceElementsList.push_back (restMeasures); -} - -void msrVoice::appendMeasuresRepeatToVoiceElementsList ( - S_msrMeasuresRepeat measuresRepeat) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - gLogOstream << - "Appending measures repeat '" << - measuresRepeat->asString () << - "' to voice \"" << - fVoiceName << - "\"," << - endl; - } -#endif - - // sanity check - msrAssert ( - measuresRepeat != nullptr, - "measuresRepeat is null"); - - fInitialVoiceElementsList.push_back (measuresRepeat); -} - -void msrVoice:: appendRepeatEndingCloneToVoice ( // JMI - S_msrRepeatEnding repeatEndingClone) -{ -#ifdef TRACE_OAH - int inputLineNumber = - repeatEndingClone->getInputLineNumber (); // JMI -#endif - - gIndenter++; - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - { - // add the repeat ending it to the voice current repeat -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - gLogOstream << - "Appending a " << - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingClone->getRepeatEndingKind ()) << - " repeat ending clone to current repeat in voice \"" << - fVoiceName << - "\"" << - endl; - - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "appendRepeatEndingCloneToVoice() 1"); - } -#endif - - // sanity check - if (! fVoicePendingRepeatDescrsStack.size ()) { - stringstream s; - - s << - "repeats stack is empty when attempting to append a "<< - msrRepeatEnding::repeatEndingKindAsString ( - repeatEndingClone->getRepeatEndingKind ()) << - " repeat ending to voice '" << - asShortString () << - "' "; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - S_msrRepeat - currentRepeat = - fVoicePendingRepeatDescrsStack.front ()-> - getRepeatDescrRepeat (); - - currentRepeat-> - addRepeatEndingToRepeat ( - repeatEndingClone->getInputLineNumber (), - repeatEndingClone); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "appendRepeatEndingCloneToVoice() 2"); - } -#endif - } - break; - } // switch - - gIndenter--; -} - -void msrVoice::prependBarlineToVoice (S_msrBarline barline) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - gLogOstream << - "Prepending barline '" << - barline->asString () << - "' to voice \"" << getVoiceName () << "\"" << - ":" << - endl; - } -#endif - - gIndenter++; - - fVoiceLastSegment-> - prependBarlineToSegment (barline); - - gIndenter--; -} - -void msrVoice::appendBarlineToVoice (S_msrBarline barline) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - gLogOstream << - "Appending barline " << - barline->asString () << - " to voice \"" << getVoiceName () << "\"" << - ":" << - endl; - } -#endif - - gIndenter++; - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - barline->getInputLineNumber (), - "appendBarlineToVoice()"); - } - - fVoiceLastSegment-> - appendBarlineToSegment (barline); - - gIndenter--; -} - -void msrVoice::appendSegnoToVoice (S_msrSegno segno) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegnos) { - gLogOstream << - "Appending a segno to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - segno->getInputLineNumber (), - "appendSegnoToVoice()"); - } - - fVoiceLastSegment-> - appendSegnoToSegment (segno); -} - -void msrVoice::appendCodaToVoice (S_msrCoda coda) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceCodas) { - gLogOstream << - "Appending a coda to voice \"" << getVoiceName () << "\"" << - ":" << - endl; - } -#endif - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - coda->getInputLineNumber (), - "appendCodaToVoice()"); - } - - fVoiceLastSegment-> - appendCodaToSegment (coda); -} - -void msrVoice::appendEyeGlassesToVoice (S_msrEyeGlasses eyeGlasses) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceEyeGlasses) { - gLogOstream << - "Appending a eyeGlasses to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - eyeGlasses->getInputLineNumber (), - "appendEyeGlassesToVoice()"); - } - - fVoiceLastSegment-> - appendEyeGlassesToSegment (eyeGlasses); -} - -void msrVoice::appendPedalToVoice (S_msrPedal pedal) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePedals) { - gLogOstream << - "Appending a pedal to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - pedal->getInputLineNumber (), - "appendPedalToVoice()"); - } - - fVoiceLastSegment-> - appendPedalToSegment (pedal); -} - -void msrVoice::appendDampToVoice (S_msrDamp damp) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceDamps) { - gLogOstream << - "Appending a damp to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - damp->getInputLineNumber (), - "appendDampToVoice()"); - } - - fVoiceLastSegment-> - appendDampToSegment (damp); -} - -void msrVoice::appendDampAllToVoice (S_msrDampAll dampAll) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceDampAlls) { - gLogOstream << - "Appending a damp all to voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - // create the voice last segment if needed - if (! fVoiceLastSegment) { - createNewLastSegmentForVoice ( - dampAll->getInputLineNumber (), - "appendDampAllToVoice()"); - } - - fVoiceLastSegment-> - appendDampAllToSegment (dampAll); -} - -/* -S_msrElement msrVoice::removeLastElementFromVoice ( // JMI - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Removing last note" << - " from voice " << getVoiceName () << - endl; - } -#endif - - return - fVoiceLastSegment-> - removeLastElementFromSegment (inputLineNumber); -} -*/ - -void msrVoice::removeNoteFromVoice ( - int inputLineNumber, - S_msrNote note) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - gLogOstream << - "Removing note '" << - note->asShortString () << - "' from voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - gIndenter++; - - // remove note from voice last segment - fVoiceLastSegment-> - removeNoteFromSegment ( - inputLineNumber, - note); - - // update the part current position in measure - fVoiceStaffUpLink-> - getStaffPartUpLink ()-> - decrementPartCurrentPositionInMeasure ( - inputLineNumber, - note-> - getNoteSoundingWholeNotes ()); - - gIndenter--; -} - -void msrVoice::removeElementFromVoice ( - int inputLineNumber, - S_msrElement element) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Removing element '" << - element->asShortString () << - "' from voice \"" << getVoiceName () << "\"" << - endl; - } -#endif - - gIndenter++; - - fVoiceLastSegment-> - removeElementFromSegment ( - inputLineNumber, - element); - - gIndenter--; -} - -S_msrMeasure msrVoice::removeLastMeasureFromVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Removing last measure from voice \"" << - getVoiceName () << - "\"" << - endl; - } -#endif - - gIndenter++; - - // remove (new) last measure - S_msrMeasure result = - fVoiceLastSegment-> - removeLastMeasureFromSegment ( - inputLineNumber, - "removeLastMeasureFromVoice()"); - - gIndenter--; - - // return it - return result; -} - -void msrVoice::finalizeCurrentMeasureInVoice ( - int inputLineNumber) -{ - msrMeasure::msrMeasuresRepeatContextKind - measuresRepeatContextKind = - msrMeasure::kMeasuresRepeatContextKindNone; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - gLogOstream << - "Finalizing current measure in voice \"" << - getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } - - if (gTraceOah->fTraceMeasuresDetails) { - displayVoice ( - inputLineNumber, - "finalizeCurrentMeasureInVoice() 1"); - } -#endif - - gIndenter++; - - // sanity check - msrAssert ( - fVoiceCurrentMeasure != nullptr, - "fVoiceCurrentMeasure is null"); - - // finalize fVoiceCurrentMeasure - fVoiceCurrentMeasure-> - finalizeMeasure ( - inputLineNumber, - measuresRepeatContextKind, - "finalizeCurrentMeasureInVoice() 2"); - - - switch (fVoiceKind) { - case msrVoice::kVoiceRegular: - // append a measure end syllable to the voice stanzas if any - if (fVoiceStanzasMap.size ()) { - map::const_iterator - iBegin = fVoiceStanzasMap.begin (), - iEnd = fVoiceStanzasMap.end (), - i = iBegin; - - for ( ; ; ) { - S_msrStanza - stanza = (*i).second; - - stanza-> - appendMeasureEndSyllableToStanza ( - inputLineNumber); - - if (++i == iEnd) break; - } // for - } - - // handle the harmony voice if any - if (fHarmonyVoiceForRegularVoiceForwardLink) { - fHarmonyVoiceForRegularVoiceForwardLink-> - finalizeCurrentMeasureInVoice ( - inputLineNumber); - } - - // handle the figuredBass voice if any - if (fFiguredBassVoiceForRegularVoiceForwardLink) { - fFiguredBassVoiceForRegularVoiceForwardLink-> - finalizeCurrentMeasureInVoice ( - inputLineNumber); - } - break; - - case msrVoice::kVoiceHarmony: - case msrVoice::kVoiceFiguredBass: - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - displayVoice ( - inputLineNumber, - "finalizeCurrentMeasureInVoice() 3"); - } -#endif - - gIndenter--; -} - -void msrVoice:: collectVoiceMeasuresIntoFlatList ( - int inputLineNumber) -{ - // collect measures from the initial elements if any - if (fInitialVoiceElementsList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Collecting measures from the initial elements into voice \"" << - getVoiceName () << - "s measures flat list" << - ", line " << inputLineNumber << - endl; - } -#endif - - } - - // collect measures from the last segment if any - if (fVoiceLastSegment) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Collecting measures from the last segment into voice \"" << - getVoiceName () << - "s measures flat list" << - ", line " << inputLineNumber << - endl; - } -#endif - - list lastSegmentMeasuresFlatList; - - const list& - voiceLastSegmentMeasuresList = - fVoiceLastSegment-> - getSegmentMeasuresList (); - - if (voiceLastSegmentMeasuresList.size ()) { - list::const_iterator - iBegin = voiceLastSegmentMeasuresList.begin (), - iEnd = voiceLastSegmentMeasuresList.end (), - i = iBegin; - - for ( ; ; ) { - fVoiceMeasuresFlatList.push_back ((*i)); - if (++i == iEnd) break; - } // for - } - } -} - -void msrVoice::finalizeVoice ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Finalizing voice \"" << - getVoiceName () << - "\", line " << inputLineNumber << - endl; - } - - if (gTraceOah->fTraceVoicesDetails) { - displayVoice ( - inputLineNumber, - "finalizeVoice() 1"); - } -#endif - - if (fVoiceHasBeenFinalized) { - stringstream s; - - s << - "Attempting to finalize voice \"" << - asShortString () << - "\" more than once"; - - msrInternalError ( - gOahOah->fInputSourceName, - fInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // is this voice totally empty? this should be rare... - if ( - fInitialVoiceElementsList.size () == 0 - && - fVoiceLastSegment->getSegmentMeasuresList ().size () == 0 - ) { - stringstream s; - - s << - "Voice \"" << - getVoiceName () << - "\" is totally empty, no contents ever specified for it" << - endl; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - // are there pending repeats in the voice repeats stack??? - int voicePendingRepeatDescrsStackSize = - fVoicePendingRepeatDescrsStack.size (); - - if (voicePendingRepeatDescrsStackSize) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - displayVoiceRepeatsStackSummary ( - inputLineNumber, - "finalizeVoice() 2"); - } -#endif - - stringstream s; - - s << - singularOrPluralWithoutNumber ( - voicePendingRepeatDescrsStackSize, "There is", "There are") << - " " << - voicePendingRepeatDescrsStackSize << - " " << - singularOrPluralWithoutNumber ( - voicePendingRepeatDescrsStackSize, "repeat", "repeats") << - " pending in the voice repeats stack in voice \"" << - asShortString () << - "\" "; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - fInputLineNumber, - s.str ()); - } - - // collect the voice measures into the flat list - collectVoiceMeasuresIntoFlatList ( - inputLineNumber); - - fVoiceHasBeenFinalized = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Finalizing voice \"" << - getVoiceName () << - "\", line " << inputLineNumber << - endl; - - displayVoiceRepeatsStackRestMeasuresMeasuresRepeatAndVoice ( - inputLineNumber, - "finalizeVoice() 3"); - } -#endif - -/* JMI - // finalize the harmony voice if any - if (fHarmonyVoiceForRegularVoiceForwardLink) { - fHarmonyVoiceForRegularVoiceForwardLink->finalizeVoice ( - inputLineNumber); - } - - // finalize the figured bass voice if any - if (fFiguredBassVoiceForRegularVoiceForwardLink) { - fFiguredBassVoiceForRegularVoiceForwardLink->finalizeVoice ( - inputLineNumber); - } - */ -} - -void msrVoice::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVoice::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVoice elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVoice::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrVoice::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVoice::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrVoice elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrVoice::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrVoice::browseData (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrVoice::browseData ()" << - endl; - } - - // browse the voice initial elements - if (fInitialVoiceElementsList.size ()) { - for ( - list::const_iterator i = fInitialVoiceElementsList.begin (); - i != fInitialVoiceElementsList.end (); - i++ - ) { - // browse the element - msrBrowser browser (v); - browser.browse (*(*i)); - } // for - } - - if (fVoiceLastSegment) { - // browse the voice last segment - msrBrowser browser (v); - browser.browse (*fVoiceLastSegment); - } - - // browse the voice stanzas - if (fVoiceStanzasMap.size ()) { - for ( - map::const_iterator i = fVoiceStanzasMap.begin (); - i != fVoiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - - if (stanza->getStanzaTextPresent ()) { - // browse the stanza - msrBrowser browser (v); - browser.browse (*(stanza)); - } - } // for - } - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% <== msrVoice::browseData ()" << - endl; - } -} - -string msrVoice::voiceKindAsString ( - msrVoiceKind voiceKind) -{ - string result; - - switch (voiceKind) { - case msrVoice::kVoiceRegular: - result = "voiceRegular"; - break; - case msrVoice::kVoiceHarmony: - result = "voiceHarmony"; - break; - case msrVoice::kVoiceFiguredBass: - result = "voiceFiguredBass"; - break; - } // switch - - return result; -} - -string msrVoice::voiceNumberAsString () const -{ - string result; - - switch (fVoiceNumber) { - case K_PART_FIGURED_BASS_VOICE_NUMBER: - result = "K_PART_FIGURED_BASS_VOICE_NUMBER"; - break; - default: - result = to_string (fVoiceNumber); - } // switch - - return result; -} - -string msrVoice::regularVoiceStaffSequentialNumberAsString () const -{ - string result; - - switch (fRegularVoiceStaffSequentialNumber) { - case K_PART_FIGURED_BASS_VOICE_NUMBER: - result = "K_PART_FIGURED_BASS_VOICE_NUMBER"; - break; - default: - result = to_string (fRegularVoiceStaffSequentialNumber); - } // switch - - return result; -} - -string msrVoice::voiceRepeatPhaseKindAsString ( - msrVoiceRepeatPhaseKind - afterRepeatComponentPhaseKind) -{ - string result; - - switch (afterRepeatComponentPhaseKind) { - case msrVoice::kVoiceRepeatPhaseNone: - result = "voiceRepeatPhaseNone"; - break; - case msrVoice::kVoiceRepeatPhaseAfterCommonPart: - result = "voiceRepeatPhaseAfterCommonPart"; - break; - case msrVoice::kVoiceRepeatPhaseAfterHookedEnding: - result = "voiceRepeatPhaseAfterHookedEnding"; - break; - case msrVoice::kVoiceRepeatPhaseAfterHooklessEnding: - result = "voiceRepeatPhaseAfterHooklessEnding"; - break; - } // switch - - return result; -} - -string msrVoice::voiceFinalizationStatusKindAsString ( - msrVoiceFinalizationStatusKind voiceFinalizationStatusKind) -{ - string result; - - switch (voiceFinalizationStatusKind) { - case msrVoice::kKeepVoice: - result = "keepVoice"; - break; - case msrVoice::kEraseVoice: - result = "eraseVoice"; - break; - } // switch - - return result; -} - -string msrVoice::voiceKindAsString () const -{ - return voiceKindAsString (fVoiceKind); -} - -string msrVoice::asShortString () const -{ - stringstream s; - - s << - "Voice \"" << getVoiceName () << "\", " << - voiceKindAsString (fVoiceKind) << - ", line " << fInputLineNumber; - - return s.str (); -} - -string msrVoice::asString () const -{ - stringstream s; - - s << - "Voice \"" << getVoiceName () << "\", " << - voiceKindAsString (fVoiceKind) << - ", " << - singularOrPlural ( - fVoiceActualNotesCounter, "actual note", "actual notes") << - ", " << - singularOrPlural ( - fVoiceStanzasMap.size (), "stanza", "stanzas") << - ", line " << fInputLineNumber; - - return s.str (); -} - -void msrVoice::displayVoice ( - int inputLineNumber, - string context) -{ - gLogOstream << - endl << - "*********>> Displaying voice \"" << - getVoiceName () << - "\" (" << context << ")" << - ", line " << inputLineNumber << - " contains:" << - endl; - - gIndenter++; - print (gLogOstream); - gIndenter--; - - gLogOstream << - "<<*********" << - endl << - endl; -} - -void msrVoice::displayVoiceRepeatsStackRestMeasuresMeasuresRepeatAndVoice ( - int inputLineNumber, - string context) -{ - displayVoice ( - inputLineNumber, - context); - - displayVoiceRepeatsStack ( - inputLineNumber, - context); - - displayVoiceRestMeasures ( - inputLineNumber, - context); - - displayVoiceMeasuresRepeat ( - inputLineNumber, - context); -} - -void msrVoice::print (ostream& os) const -{ - os << - "Voice \"" << getVoiceName () << "\", " << - voiceKindAsString (fVoiceKind) << - ", line " << fInputLineNumber << - endl; - - gIndenter++; - - os << left << - "(" << - singularOrPlural ( - fVoiceActualHarmoniesCounter, "harmony", "harmonies") << - ", " << - singularOrPlural ( - fVoiceActualFiguredBassesCounter, "figured bass", "figured basses") << - ", " << - singularOrPlural ( - fVoiceActualNotesCounter, "actual note", "actual notes") << - ", " << - singularOrPlural ( - fVoiceRestsCounter, "rest", "rests") << - ", " << - singularOrPlural ( - fVoiceSkipsCounter, "skip", "skips") << - ", " << - singularOrPlural ( - fVoiceStanzasMap.size (), "stanza", "stanzas") << - ")" << - endl; - - const int fieldWidth = 41; - - os << left << - setw (fieldWidth) << - "staffUpLink" << " : " << - fVoiceStaffUpLink->getStaffName () << - endl << - - setw (fieldWidth) << - "voiceNumber" << " : " << - voiceNumberAsString () << - endl << - - setw (fieldWidth) << - "voiceCurrentMeasurePuristNumber" << " : " << - fVoiceCurrentMeasurePuristNumber << - endl << - - setw (fieldWidth) << - "regularVoiceStaffSequentialNumber" << " : " << - regularVoiceStaffSequentialNumberAsString () << - endl; - -#ifdef TRACE_OAH - // regular measure ends detection - os << left << - setw (fieldWidth) << - "wholeNotesSinceLastRegularMeasureEnd" << " : " << - fWholeNotesSinceLastRegularMeasureEnd << - endl; - - // incomplete measures after repeats detection - os << left << - setw (fieldWidth) << - "currentVoiceRepeatPhaseKind" << " : " << - voiceRepeatPhaseKindAsString ( - fCurrentVoiceRepeatPhaseKind) << - endl; - - // print the voice first clef, and the current clef, key and time - os << left << - setw (fieldWidth) << "voiceFirstClef" << " : "; - if (fVoiceFirstClef) { - os << - fVoiceFirstClef; - } - else { - os << "null" << endl; - } - os << left << - setw (fieldWidth) << "voiceCurrentClef" << " : "; - if (fVoiceCurrentClef) { - os << - fVoiceCurrentClef; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << "voiceCurrentKey" << " : "; - if (fVoiceCurrentKey) { - os << - fVoiceCurrentKey; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << "voiceCurrentTime" << " : "; - if (fVoiceCurrentTime) { - os << - fVoiceCurrentTime; - } - else { - os << "null" << endl; - } -#endif - - // print the harmony voice name if any - os << left << - setw (fieldWidth) << "harmonyVoiceForRegularVoice" << " : "; - if (fHarmonyVoiceForRegularVoiceForwardLink) { - os << - fHarmonyVoiceForRegularVoiceForwardLink->getVoiceName (); - } - else { - os << - "none"; - } - os << endl; - - // print the figured bass voice name if any - os << left << - setw (fieldWidth) << "figuredBassVoiceForRegularVoice" << " : "; - if (fFiguredBassVoiceForRegularVoiceForwardLink) { - os << - fFiguredBassVoiceForRegularVoiceForwardLink->getVoiceName (); - } - else { - os << - "none"; - } - os << endl; - - os << left << - setw (fieldWidth) << "voiceShortestNoteDuration" << " : " << - fVoiceShortestNoteDuration << - endl << - setw (fieldWidth) << "voiceShortestNoteTupletFactor" << " : " << - fVoiceShortestNoteTupletFactor << - endl; - - os << left << - setw (fieldWidth) << "voiceHasBeenFinalized" << " : " << - booleanAsString (fVoiceHasBeenFinalized) << - endl; - - os << left << - setw (fieldWidth) << "musicHasBeenInsertedInVoice" << " : " << - booleanAsString (fMusicHasBeenInsertedInVoice) << - endl << - setw (fieldWidth) << "voiceContainsRestMeasures" << " : " << - booleanAsString (fVoiceContainsRestMeasures) << - endl << - setw (fieldWidth) << "voiceContainsMeasuresRepeats" << " : " << - booleanAsString (fVoiceContainsMeasuresRepeats) << - endl; - - // print the voice first segment if any - os << - setw (fieldWidth) << "voiceFirstSegment" << " : "; - if (fVoiceFirstSegment) { - os << - "'" << - fVoiceFirstSegment->getSegmentAbsoluteNumber () << - "'"; - } - else { - os << - "none"; - } - os << endl; - - // print the voice current measure if any - os << - setw (fieldWidth) << "voiceCurrentMeasure" << " : "; - if (fVoiceCurrentMeasure) { - os << - "'" << - fVoiceCurrentMeasure->asShortString () << - "'"; - } - else { - os << - "none"; - } - os << endl; - - // print the voice first measure if any - os << - setw (fieldWidth) << "voiceFirstMeasure" << " : "; - if (fVoiceFirstMeasure) { - os << - "'" << - fVoiceFirstMeasure->asShortString () << - "'"; - } - else { - os << - "none"; - } - os << endl; - - // print this voice's first non-grace note - { - S_msrNote - voiceFirstNonGraceNote = - this-> - fetchVoiceFirstNonGraceNote (); - - os << - setw (fieldWidth) << - "voiceFirstNonGraceNote" << " : "; - if (voiceFirstNonGraceNote) { - os << gTab << - voiceFirstNonGraceNote->asShortString (); - } - else { - os << - "none"; - } - os << endl; - } - - // print the voice last appended note - os << - setw (fieldWidth) << - "voiceLastAppendedNote" << " : "; - if (fVoiceLastAppendedNote) { - os << gTab << - fVoiceLastAppendedNote->asShortString (); - } - else { - os << - "none"; - } - os << endl; - -#ifdef TRACE_OAH - // print the voice measures flat list - int voiceMeasuresFlatListSize = - fVoiceMeasuresFlatList.size (); - - os << - setw (fieldWidth) << - "voiceMeasuresFlatList"; - if (voiceMeasuresFlatListSize) { - os << - " : " << voiceMeasuresFlatListSize << " elements"; - } - else { - os << - " : " << "empty"; - } - os << endl; - - if (voiceMeasuresFlatListSize) { - gIndenter++; - - list::const_iterator - iBegin = fVoiceMeasuresFlatList.begin (), - iEnd = fVoiceMeasuresFlatList.end (), - i = iBegin; - - for ( ; ; ) { - // print the measure - if (gTraceOah->fTraceMeasures) { - os << (*i)->asShortString (); - } - else { - os << (*i)->getMeasureElementMeasureNumber (); - } - if (++i == iEnd) break; - os << ' '; - } // for - os << endl; - - gIndenter--; - } -#endif - - // print the voice initial elements - int voiceInitialElementsListSize = - fInitialVoiceElementsList.size (); - - os << - endl << - setw (fieldWidth) << - "voiceInitialElementsList"; - if (voiceInitialElementsListSize) { - os << " : " << voiceInitialElementsListSize << " elements"; - } - else { - os << " : " << "none"; - } - os << endl; - - if (voiceInitialElementsListSize) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fInitialVoiceElementsList.begin (), - iEnd = fInitialVoiceElementsList.end (), - i = iBegin; - - for ( ; ; ) { - // print the element - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - /* JMI - // sanity check - msrAssert ( - fVoiceLastSegment != nullptr, - "fVoiceLastSegment is null"); - */ - - // print the last segment - if (fVoiceLastSegment) { - os << - endl << - setw (fieldWidth) << - "voiceLastSegment" << - endl; - - gIndenter++; - os << - fVoiceLastSegment << - endl; - gIndenter--; - } - else { - os << - "*** voiceLastSegment is null ***" << // JMI - endl; - } - - // print the stanzas if any - if (fVoiceStanzasMap.size ()) { - os << - "Stanzas:" << - endl; - - gIndenter++; - - map::const_iterator - iBegin = fVoiceStanzasMap.begin (), - iEnd = fVoiceStanzasMap.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i).second; - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrVoice& elt) -{ - elt->print (os); - return os; -} - - -} - - /* JMI - switch (lastMeasureInLastSegment->getMeasureKind ()) { - case msrMeasure::kMeasureKindMusicallyEmpty: - { - // the last measure is musically empty: - // keep it as it is - } - break; - - default: - { - // the last measure it not musically empty: - - // append last segment to initial voice elements list - appendVoiceLastSegmentToInitialVoiceElements ( // JMI ??? - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 9"); - - // create a new last segment for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a new last segment for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentForVoice ( - inputLineNumber, - "handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice()"); - - } - break; - } // switch - */ - -/* - // finalize lastMeasureInLastSegment - lastMeasureInLastSegment-> - finalizeMeasure ( - inputLineNumber, - msrMeasure::kMeasuresRepeatContextKindNone, - "handleVoiceLevelRepeatStartInVoice() 6"); - - // append last segment to initial voice elements list - appendVoiceLastSegmentToInitialVoiceElements ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 7"); - - // create a new last segment for the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegments) { - gLogOstream << - "Creating a new last segment for voice \"" << - fVoiceName << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - createNewLastSegmentForVoice ( - inputLineNumber, - "handleVoiceLevelRepeatStartInVoice() 8"); - - // create a new measure with the same number as the voice last measure - // and append it to the voice, - createMeasureAndAppendItToVoice ( - inputLineNumber, - lastMeasureInLastSegment->getMeasureElementMeasureNumber (), - msrMeasure::kMeasureImplicitKindNo); - */ diff --git a/src/lilypond/msrVoices_MUT_DEP.h b/src/lilypond/msrVoices_MUT_DEP.h deleted file mode 100644 index 2d9cc2d19..000000000 --- a/src/lilypond/msrVoices_MUT_DEP.h +++ /dev/null @@ -1,1148 +0,0 @@ -/* - This file is to be included only by msrMutualDependencies.h, - to satisfy declarations mutual dependencies. -*/ - -//______________________________________________________________________________ -class msrVoice : public msrElement -{ - public: - - // constants - // ------------------------------------------------------ - - #define K_NO_VOICE_NUMBER -99 - #define K_VOICE_HARMONY_VOICE_BASE_NUMBER 20 - #define K_VOICE_FIGURED_BASS_VOICE_BASE_NUMBER 40 - - // data types - // ------------------------------------------------------ - - enum msrVoiceKind { - kVoiceRegular, - kVoiceHarmony, // for MusicXML , LilyPond ChordNames - kVoiceFiguredBass }; // for MusicXML , LilyPond FiguredBass - - static string voiceKindAsString ( - msrVoiceKind voiceKind); - - enum msrVoiceRepeatPhaseKind { - kVoiceRepeatPhaseNone, - kVoiceRepeatPhaseAfterCommonPart, - kVoiceRepeatPhaseAfterHookedEnding, - kVoiceRepeatPhaseAfterHooklessEnding }; - - static string voiceRepeatPhaseKindAsString ( - msrVoiceRepeatPhaseKind - afterRepeatComponentPhaseKind); - - enum msrVoiceFinalizationStatusKind { // JMI ??? - kKeepVoice, - kEraseVoice }; - - static string voiceFinalizationStatusKindAsString ( - msrVoiceFinalizationStatusKind voiceFinalizationStatusKind); - - enum msrVoiceCreateInitialLastSegmentKind { - kCreateInitialLastSegmentYes, kCreateInitialLastSegmentNo }; - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrVoiceKind voiceKind, - int voiceNumber, - msrVoiceCreateInitialLastSegmentKind - voiceCreateInitialLastSegmentKind, - S_msrStaff voiceStaffUpLink); - - SMARTP createVoiceNewbornClone ( - S_msrStaff containingStaff); - - SMARTP createVoiceDeepCopy ( - int inputLineNumber, - msrVoiceKind voiceKind, - int voiceNumber, - S_msrStaff containingStaff); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - // for regular voices - msrVoice ( - int inputLineNumber, - msrVoiceKind voiceKind, - int voiceNumber, - msrVoiceCreateInitialLastSegmentKind - voiceCreateInitialLastSegmentKind, - S_msrStaff voiceStaffUpLink); - - // destructor - virtual ~msrVoice (); - - private: - - // initialisation - // ------------------------------------------------------ - - void initializeVoice ( - msrVoiceCreateInitialLastSegmentKind - voiceCreateInitialLastSegmentKind); - - public: - - // set and get - // ------------------------------------------------------ - - // upLinks - - S_msrStaff getVoiceStaffUpLink () const - { return fVoiceStaffUpLink; } - - // voice kind - - void setVoiceKind (msrVoiceKind voiceKind) - { fVoiceKind = voiceKind; } - - msrVoiceKind getVoiceKind () const - { return fVoiceKind; } - - // voice numbers - - void setVoiceNumber (int voiceNumber) - { fVoiceNumber = voiceNumber; } - - int getVoiceNumber () const - { return fVoiceNumber; } - - void setRegularVoiceStaffSequentialNumber ( - int regularVoiceStaffSequentialNumber); - - int getRegularVoiceStaffSequentialNumber () const - { return fRegularVoiceStaffSequentialNumber; } - - // voice name - - void setVoiceNameFromNumber ( - int inputLineNumber, - int voiceNumber); - - string getVoiceName () const - { return fVoiceName; } - - // harmonies - - S_msrVoice getHarmonyVoiceForRegularVoiceForwardLink () const - { return fHarmonyVoiceForRegularVoiceForwardLink; } - - S_msrVoice getRegularVoiceForHarmonyVoiceBackwardLink () const - { return fRegularVoiceForHarmonyVoiceBackwardLink; } - - // figured bass - - S_msrVoice getFiguredBassVoiceForRegularVoiceForwardLink () const - { return fFiguredBassVoiceForRegularVoiceForwardLink; } - - S_msrVoice getRegularVoiceForFiguredBassVoiceBackwardLink () const - { return fRegularVoiceForFiguredBassVoiceBackwardLink; } - - // stanzas - - const map& - getVoiceStanzasMap () const - { return fVoiceStanzasMap; } - - // voice last segment - - void setVoiceLastSegmentInVoiceClone ( - S_msrSegment segment); - - void appendSegmentToVoiceClone ( - S_msrSegment segment); - - S_msrSegment getVoiceLastSegment () const - { return fVoiceLastSegment; } - - // voice last appended note - - S_msrNote getVoiceLastAppendedNote () const - { return fVoiceLastAppendedNote; } - - // voice shortest note - - rational getVoiceShortestNoteDuration () const - { return fVoiceShortestNoteDuration; } - - rational getVoiceShortestNoteTupletFactor () const - { return fVoiceShortestNoteTupletFactor; } - - // counters - - int getVoiceActualNotesCounter () const - { return fVoiceActualNotesCounter; } - - int getVoiceRestsCounter () const - { return fVoiceRestsCounter; } - - int getVoiceSkipsCounter () const - { return fVoiceSkipsCounter; } - - int getVoiceActualHarmoniesCounter () const - { return fVoiceActualHarmoniesCounter; } - - int getVoiceActualFiguredBassesCounter () const - { return fVoiceActualFiguredBassesCounter; } - - // has music been inserted in the voice? - - void setMusicHasBeenInsertedInVoice () - { fMusicHasBeenInsertedInVoice = true; } - - bool getMusicHasBeenInsertedInVoice () const - { return fMusicHasBeenInsertedInVoice; } - - // regular measure ends detection - - void setWholeNotesSinceLastRegularMeasureEnd ( - int inputLineNumber, - rational value); - - rational getWholeNotesSinceLastRegularMeasureEnd () const - { return fWholeNotesSinceLastRegularMeasureEnd; } - - // incomplete measures after repeats detection - - void setCurrentVoiceRepeatPhaseKind ( - int inputLineNumber, - msrVoiceRepeatPhaseKind - afterRepeatComponentPhaseKind); - - msrVoiceRepeatPhaseKind - getCurrentVoiceRepeatPhaseKind () const - { return fCurrentVoiceRepeatPhaseKind; } - - - // rests measures - - void setVoiceContainsRestMeasures ( - int inputLineNumber); - - bool getVoiceContainsRestMeasures () const - { return fVoiceContainsRestMeasures; } - - // measures repeats - - void setVoiceContainsMeasuresRepeats ( - int inputLineNumber); - - bool getVoiceContainsMeasuresRepeats () const - { return fVoiceContainsMeasuresRepeats; } - - // measures flat list - const list& - getVoiceMeasuresFlatList () const - { return fVoiceMeasuresFlatList; } - - public: - - // public services - // ------------------------------------------------------ - - // upLinks - - S_msrPart fetchVoicePartUpLink () const; - - // identity - - void changeVoiceIdentity ( // after a deep copy - int voiceNumber); - - // measures - - S_msrMeasure createMeasureAndAppendItToVoice ( - int inputLineNumber, - string measureNumber, - msrMeasure::msrMeasureImplicitKind - measureImplicitKind); - - void setNextMeasureNumberInVoice ( - int inputLineNumber, - string nextMeasureNumber); - - // forward - - void appendPaddingNoteToVoice ( - int inputLineNumber, - rational forwardStepLength); - - // backup and padding - - void padUpToPositionInMeasureInVoice ( - int inputLineNumber, - rational wholeNotesPositionInMeasure); - - void backupByWholeNotesStepLengthInVoice ( - int inputLineNumber, - rational backupTargetMeasureElementPositionInMeasure); - - // clef, key, time - - void appendClefToVoice (S_msrClef clef); - - void appendKeyToVoice (S_msrKey key); - - void appendTimeToVoice (S_msrTime time); - void appendTimeToVoiceClone (S_msrTime time); - - // notes - - S_msrNote fetchVoiceFirstNonGraceNote () const; - - void registerShortestNoteIfRelevant (S_msrNote note); - - void registerNoteAsVoiceLastAppendedNote (S_msrNote note); - - // harmonies - - S_msrVoice createHarmonyVoiceForRegularVoice ( - int inputLineNumber, - string currentMeasureNumber); - - // figured bass - - S_msrVoice createFiguredBassVoiceForRegularVoice ( - int inputLineNumber, - string currentMeasureNumber); - - // transpose - - void appendTransposeToVoice ( - S_msrTranspose transpose); - - // part name display - - void appendPartNameDisplayToVoice ( - S_msrPartNameDisplay partNameDisplay); - - // part abbreviation display - - void appendPartAbbreviationDisplayToVoice ( - S_msrPartAbbreviationDisplay partAbbreviationDisplay); - - // staff details - - void appendStaffDetailsToVoice ( - S_msrStaffDetails staffDetails); - - // tempo - - void appendTempoToVoice (S_msrTempo tempo); - - // rehearsals - - void appendRehearsalToVoice ( - S_msrRehearsal rehearsal); - - // octave shifts - - void appendOctaveShiftToVoice ( - S_msrOctaveShift octaveShift); - - // scordaturas - - void appendScordaturaToVoice ( - S_msrScordatura scordatura); - - // accordion registration - - void appendAccordionRegistrationToVoice ( - S_msrAccordionRegistration - accordionRegistration); - - // harp pedals tuning - - void appendHarpPedalsTuningToVoice ( - S_msrHarpPedalsTuning - harpPedalsTuning); - - // staff change - - void appendVoiceStaffChangeToVoice ( - S_msrVoiceStaffChange voiceStaffChange); - - // notes - - void appendNoteToVoice (S_msrNote note); - void appendNoteToVoiceClone (S_msrNote note); - - // tremolos - - void appendDoubleTremoloToVoice ( - S_msrDoubleTremolo doubleTremolo); - - // chords - - void appendChordToVoice (S_msrChord chord); - - // tuplets - - void appendTupletToVoice (S_msrTuplet tuplet); - - // harmonies - - void appendHarmonyToVoice ( - S_msrHarmony harmony); - - void appendHarmonyToVoiceClone ( - S_msrHarmony harmony); - - // figured bass - - void appendFiguredBassToVoice ( - S_msrFiguredBass figuredBass); - - void appendFiguredBassToVoiceClone ( - S_msrFiguredBass figuredBass); - - // frames - - void appendFrameToVoice ( - S_msrFrame frame); - - void appendFrameToVoiceClone ( - S_msrFrame frame); - - // grace notes - - void addGraceNotesGroupBeforeAheadOfVoiceIfNeeded ( - S_msrGraceNotesGroup graceNotesGroup); - - /* - void appendGraceNotesToVoice ( - S_msrGraceNotes graceNotes); - - void appendAfterGraceNotesToVoice ( - S_msrAfterGraceNotes afterGraceNotes); - - void prependAfterGraceNotesToVoice ( - S_msrAfterGraceNotes afterGraceNotes); - */ - - // lyrics - - void appendSyllableToVoice ( // JMI - int inputLineNumber, - string stanzaNumber, - string stanzaName, - S_msrSyllable syllable); - - // bar checks - - void appendBarCheckToVoice ( - S_msrBarCheck barCheck); - - // bar number checks - - void appendBarNumberCheckToVoice ( - S_msrBarNumberCheck barNumberCheck); - - // breaks - - void appendLineBreakToVoice (S_msrLineBreak lineBreak); - void appendPageBreakToVoice (S_msrPageBreak pageBreak); - - // bar lines - - void prependBarlineToVoice (S_msrBarline barline); - void appendBarlineToVoice (S_msrBarline barline); - - // segno - - void appendSegnoToVoice (S_msrSegno segno); - - // coda - - void appendCodaToVoice (S_msrCoda coda); - - // eyeglasses - - void appendEyeGlassesToVoice ( - S_msrEyeGlasses eyeGlasses); - - // pedal - - void appendPedalToVoice (S_msrPedal pedal); - - // damp - - void appendDampToVoice (S_msrDamp damp); - - // damp all - - void appendDampAllToVoice (S_msrDampAll dampAll); - - // other elements - - void prependOtherElementToVoice ( - S_msrMeasureElement elem); - void appendOtherElementToVoice ( - S_msrMeasureElement elem); - // for other types of elements not known - // in this header file, such as LPSR elements - - // last measure in voice - - S_msrMeasure fetchVoiceLastMeasure ( - int inputLineNumber) const; - - // last element in voice - - S_msrMeasureElement fetchVoiceLastElement ( // JMI ??? - int inputLineNumber) const; - - // removing elements from voice - - void removeNoteFromVoice ( - int inputLineNumber, - S_msrNote note); - - void removeElementFromVoice ( - int inputLineNumber, - S_msrElement element); - - S_msrMeasure removeLastMeasureFromVoice ( - int inputLineNumber); - - // segments - - void createNewLastSegmentForVoice ( - int inputLineNumber, - string context); - - void createNewLastSegmentFromItsFirstMeasureForVoice ( - int inputLineNumber, - S_msrMeasure firstMeasure, - string context); - - // repeats - - void handleRepeatEndInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - - void handleRepeatEndingStartInVoice ( - int inputLineNumber); - - void handleRepeatEndingEndInVoice ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind); - - void handleRepeatCommonPartStartInVoiceClone ( - int inputLineNumber); - - void handleRepeatCommonPartEndInVoiceClone ( - int inputLineNumber); - - void handleRepeatEndingStartInVoiceClone ( - int inputLineNumber, - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind, - string repeatEndingNumber); // may be "1, 2" - - void handleRepeatEndingEndInVoiceClone ( - int inputLineNumber, - string repeatEndingNumber, // may be "1, 2" - msrRepeatEnding::msrRepeatEndingKind - repeatEndingKind); - - void handleSegmentCloneEndInVoiceClone ( - int inputLineNumber, - S_msrSegment segmentClone); - -/* JMI - void finalizeRepeatEndInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - */ - - void handleRepeatStartInVoice ( - int inputLineNumber); - - void handleRepeatStartInVoiceClone ( - int inputLineNumber, - S_msrRepeat repeat); - - void handleRepeatEndInVoiceClone ( - int inputLineNumber); - - void appendRepeatCloneToVoiceClone ( - int inputLineNumber, - S_msrRepeat repeatCLone); - - void appendRepeatEndingCloneToVoice ( - S_msrRepeatEnding repeatEndingClone); - - // rest measures - - void appendRestMeasuresToVoiceElementsList ( - S_msrRestMeasures restMeasures); - - void createRestMeasuresInVoice ( - int inputLineNumber, - int restMeasuresNumber); - - void appendRestMeasuresToVoice ( - int inputLineNumber, - S_msrRestMeasures restMeasures); - - void appendPendingRestMeasuresToVoice ( - int inputLineNumber); - - void handleRestMeasuresStartInVoiceClone ( - int inputLineNumber, - S_msrRestMeasures restMeasures); - - void handleRestMeasuresEndInVoiceClone ( - int inputLineNumber); - - void handleRestMeasuresContentsStartInVoiceClone ( - int inputLineNumber); - - void handleRestMeasuresContentsEndInVoiceClone ( - int inputLineNumber); - - void appendRestMeasuresCloneToVoiceClone ( // JMI ??? - int inputLineNumber, - S_msrRestMeasures restMeasuresClone); - - // measures repeats - - void appendMeasuresRepeatToVoiceElementsList ( - S_msrMeasuresRepeat beatsRepeat); - - void appendMeasuresRepeatReplicaToVoice ( - int inputLineNumber); - - void createMeasuresRepeatFromItsFirstMeasuresInVoice ( - int inputLineNumber, - int beatsRepeatMeasuresNumber, - int beatsRepeatSlashesNumber); - - void appendMeasuresRepeatToVoice ( - int inputLineNumber, - S_msrMeasuresRepeat beatsRepeat); - - void appendPendingMeasuresRepeatToVoice ( - int inputLineNumber); - - void createMeasuresRepeatAndAppendItToVoiceClone ( - int inputLineNumber, - int beatsRepeatMeasuresNumber, - int beatsRepeatSlashesNumber); - - void handleMeasuresRepeatStartInVoiceClone ( - int inputLineNumber, - S_msrMeasuresRepeat beatsRepeat); - - void handleMeasuresRepeatEndInVoiceClone ( - int inputLineNumber); - - void handleMeasuresRepeatPatternStartInVoiceClone ( - int inputLineNumber); - - void handleMeasuresRepeatPatternEndInVoiceClone ( - int inputLineNumber); - - void handleMeasuresRepeatReplicasStartInVoiceClone ( - int inputLineNumber); - - void handleMeasuresRepeatReplicasEndInVoiceClone ( - int inputLineNumber); - - void appendMeasuresRepeatCloneToVoiceClone ( // JMI ??? - int inputLineNumber, - S_msrMeasuresRepeat beatsRepeatClone); - - // stanzas - - S_msrStanza addStanzaToVoiceByItsNumber ( - int inputLineNumber, - string stanzaNumber); - - void addStanzaToVoiceWithoutCatchUp ( // JMI - S_msrStanza stanza); - - void addStanzaToVoice ( - S_msrStanza stanza); - - S_msrStanza createStanzaInVoiceIfNotYetDone ( - int inputLineNumber, - string stanzaNumber, - string stanzaName); - - S_msrStanza fetchStanzaInVoice ( - int inputLineNumber, - string stanzaNumber, - string stanzaName); - - // strings - - // finalization - - void finalizeCurrentMeasureInVoice ( - int inputLineNumber); - - void finalizeVoice ( - int inputLineNumber); - - void collectVoiceMeasuresIntoFlatList ( - int inputLineNumber); - - private: - - // private services - // ------------------------------------------------------ - - // voice last segment - - void appendVoiceLastSegmentToInitialVoiceElements ( - int inputLineNumber, - string context); - - void moveVoiceLastSegmentToInitialVoiceElementsIfRelevant ( - int inputLineNumber, - string context); - - // harmonies - - void appendHarmonyToHarmonyVoice ( - S_msrHarmony harmony); - - // figured basses - - void appendFiguredBassToFiguredBassVoice ( - S_msrFiguredBass figuredBass); - - // repeats - - S_msrRepeat createARepeatAndStackIt ( - int inputLineNumber, - string context); - - S_msrRepeat createARepeatCloneAndStackIt ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void popRepeatFromRepeatDescrsStack ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void pushRepeatOntoRepeatDescrsStack ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void appendRepeatToInitialVoiceElements ( - int inputLineNumber, - S_msrRepeat repeat, - string context); - - void appendRepeatCloneToInitialVoiceElements ( - int inputLineNumber, - S_msrRepeat repeatCLone, - string context); - - void handleVoiceLevelRepeatStartInVoice ( - int inputLineNumber); - - void handleNestedRepeatStartInVoice ( - int inputLineNumber); - - void handleVoiceLevelRepeatEndWithoutStartInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - - void handleVoiceLevelContainingRepeatEndWithoutStartInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - - void handleVoiceLevelRepeatEndWithStartInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - - void handleVoiceLevelRepeatEndingStartWithoutExplicitStartInVoice ( - int inputLineNumber, - S_msrRepeat currentRepeat); - - void handleVoiceLevelRepeatEndingStartWithExplicitStartInVoice ( - int inputLineNumber); - - void nestContentsIntoNewRepeatInVoice ( - int inputLineNumber); - - void handleNestedRepeatEndingStartInVoice ( - int inputLineNumber); - - void handleNestedRepeatEndInVoice ( - int inputLineNumber, - string measureNumber, - int repeatTimes); - - void moveVoiceInitialElementsToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeatCommonPart repeatCommonPart, - string context); - - void moveVoiceLastSegmentToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeatCommonPart repeatCommonPart, - string context); - - void moveAllVoiceContentsToRepeatCommonPart ( - int inputLineNumber, - S_msrRepeatCommonPart repeatCommonPart, - string context); - - void moveVoiceLastSegmentToRepeatEnding ( - int inputLineNumber, - S_msrRepeatEnding repeatEnding, - string context); - - void handleHookedRepeatEndingEndInVoice ( - int inputLineNumber, - string repeatEndingNumber); // may be "1, 2" - - void handleHooklessRepeatEndingEndInVoice ( - int inputLineNumber, - string repeatEndingNumber); // may be "1, 2" - - void handleHookedRepeatEndingEndInVoiceClone ( - int inputLineNumber, - string repeatEndingNumber); // may be "1, 2" - - void handleHooklessRepeatEndingEndInVoiceClone ( - int inputLineNumber, - string repeatEndingNumber); // may be "1, 2" - - // rest measures - - void appendRestMeasuresToInitialVoiceElements ( - int inputLineNumber, - S_msrRestMeasures restMeasures, - string context); - - // measures repeats - - void appendMeasuresRepeatToInitialVoiceElements ( - int inputLineNumber, - S_msrMeasuresRepeat measuresRepeat, - string context); - - // beats repeats - - void appendBeatsRepeatToInitialVoiceElements ( - int inputLineNumber, - S_msrBeatsRepeat beatsRepeat, - string context); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string voiceKindAsString () const; - - string voiceNumberAsString () const; - - string regularVoiceStaffSequentialNumberAsString () const; - - string asShortString () const; - string asString () const; - - void displayVoice ( - int inputLineNumber, - string context); - - void displayVoiceRepeatsStackRestMeasuresMeasuresRepeatAndVoice ( - int inputLineNumber, - string context); - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - // upLinks - - S_msrStaff fVoiceStaffUpLink; - - // two-way links - S_msrVoice fHarmonyVoiceForRegularVoiceForwardLink; - S_msrVoice fRegularVoiceForHarmonyVoiceBackwardLink; - - S_msrVoice fFiguredBassVoiceForRegularVoiceForwardLink; - S_msrVoice fRegularVoiceForFiguredBassVoiceBackwardLink; - - // voice kind - - msrVoiceKind fVoiceKind; - - // voice numbers - - // voice numbers in MusicXML may be greater than 4 - // and there can be holes - int fVoiceNumber; - - // there can only be 4 regular voices in a staff - // (those that can contain beamed notes) - // and we need a number for the orientation of beams - int fRegularVoiceStaffSequentialNumber; - - // voice name - - string fVoiceName; - - - // counters - - static int gVoicesCounter; - - int fVoiceActualNotesCounter; - int fVoiceRestsCounter; - int fVoiceSkipsCounter; - int fVoiceActualHarmoniesCounter; - int fVoiceActualFiguredBassesCounter; - - // musically empty voices - - bool fMusicHasBeenInsertedInVoice; - - // regular measure ends detection - - rational fWholeNotesSinceLastRegularMeasureEnd; - - // incomplete measures after repeats detection - msrVoiceRepeatPhaseKind - fCurrentVoiceRepeatPhaseKind; - - // voice internal handling - - list - fInitialVoiceElementsList; - - // stanzas - - map - fVoiceStanzasMap; - - // segments - - // fVoiceLastSegment contains the music - // not yet stored in fVoiceInitialElementsList, - // it is thus logically the end of the latter, - // and is created implicitly for every voice. - // It is needed 'outside' of the 'list' - // because it is not a mere S_msrElement, but a S_msrSegment - S_msrSegment fVoiceLastSegment; - - // fVoiceFirstSegment is used to work around LilyPond issue 34 - S_msrSegment fVoiceFirstSegment; - - // measures - - // fVoiceFirstMeasure is used to number voice upbeats as measure 0 - S_msrMeasure fVoiceFirstMeasure; - - // measures flat list - // i.e. without segments nor repeats, - // gathered from fVoiceInitialElementsList and fVoiceLastSegment - // by finalizeMeasure() - list fVoiceMeasuresFlatList; - - // notes - - // fVoiceLastAppendedNote is used to build chords upon their second note - S_msrNote fVoiceLastAppendedNote; - rational fVoiceShortestNoteDuration; - - // fVoiceShortestNoteDuration and fVoiceShortestNoteTupletFactor - // are used to compute a number of divisions per quarter note - // if needed, such as when generating MusicXML from MSR - rational fVoiceShorftestNoteDuration; - rational fVoiceShortestNoteTupletFactor; - - // repeats - - public: - - // public work services - // ------------------------------------------------------ - - // clef, key, time - - void setVoiceCurrentClef (S_msrClef clef); - - S_msrClef getVoiceCurrentClef () const - { return fVoiceCurrentClef; } - - S_msrClef getVoiceFirstClef () const - { return fVoiceFirstClef; } - - void setVoiceCurrentKey (S_msrKey key); - - S_msrKey getVoiceCurrentKey () const - { return fVoiceCurrentKey; } - - void setVoiceCurrentTime (S_msrTime time); - - S_msrTime getVoiceCurrentTime () const - { return fVoiceCurrentTime; } - - // measures - - const string getVoiceCurrentMeasureNumber () const - { return fVoiceCurrentMeasureNumber; } - - void incrementVoiceCurrentMeasurePuristNumber ( - int inputLineNumber, - string context); - - void setVoiceCurrentMeasurePuristNumber ( - int measurePuristNumber) - { fVoiceCurrentMeasureNumber = measurePuristNumber; } - - const int getVoiceCurrentMeasurePuristNumber () const - { return fVoiceCurrentMeasurePuristNumber; } - - void setVoiceFirstMeasure ( - S_msrMeasure measure) - { fVoiceFirstMeasure = measure; } - - const S_msrMeasure getVoiceFirstMeasure () const - { return fVoiceFirstMeasure; } - - void appendMeasureCloneToVoiceClone ( - int inputLineNumber, - S_msrMeasure measureClone); - - private: - - // private work services - // ------------------------------------------------------ - - void displayVoiceRepeatsStackSummary ( - int inputLineNumber, - string context); - - void displayVoiceRepeatsStack ( - int inputLineNumber, - string context); - - void displayVoiceRepeatsStackAndVoice ( - int inputLineNumber, - string context); - - void displayVoiceRestMeasures ( - int inputLineNumber, - string context); - - void displayVoiceRestMeasuresAndVoice ( - int inputLineNumber, - string context); - - void displayVoiceMeasuresRepeat ( - int inputLineNumber, - string context); - - void displayVoiceMeasuresRepeatAndVoice ( - int inputLineNumber, - string context); - - private: - - // work fields - // ------------------------------------------------------ - - // clef, key, time - // needed at the voice level, because adding such to voice clones - // is done directly, without going down the part-staff-voice hierarchy - S_msrClef fVoiceCurrentClef; - - S_msrKey fVoiceCurrentKey; - - S_msrTime fVoiceCurrentTime; - - // the first in the voice is handled specifically for LilyPond code generation - S_msrClef fVoiceFirstClef; - - // measures - - string fVoiceCurrentMeasureNumber; - - int fVoiceCurrentMeasurePuristNumber; - // this is a 'purist' measure number, - // that starts at 0 if there is an anacrusis, - // and 1 otherwise, - // and is shared by incomplete (sub)measure fragments - - // fVoiceCurrentMeasure contains the last measure append to the voice - S_msrMeasure fVoiceCurrentMeasure; - - // a stack is needed to handle pending repeats, which can be nested - list - fVoicePendingRepeatDescrsStack; - - // rest measures - - // fVoicePendingRestMeasures is either null - // or the last msrRestMeasures created, - // but not yet appended to the voice - S_msrRestMeasures fVoicePendingRestMeasures; - - // fVoiceRestMeasuresWaitingForItsNextMeasureNumber is either null - // or the last msrRestMeasures created and appended to the voice, - // but with its next measure number not yet set - S_msrRestMeasures fVoiceRestMeasuresWaitingForItsNextMeasureNumber; - int fVoiceRemainingRestMeasures; - - bool fVoiceContainsRestMeasures; - - // measure repeats - - // fVoicePendingMeasuresRepeat is either null - // or the last msrMeasuresRepeat created, - // but not yet appended to the voice - S_msrMeasuresRepeat fVoicePendingMeasuresRepeat; - - bool fVoiceContainsMeasuresRepeats; - - // voice finalization - - bool fVoiceHasBeenFinalized; -}; -EXP ostream& operator<< (ostream& os, const S_msrVoice& elt); - diff --git a/src/lilypond/msrWords.cpp b/src/lilypond/msrWords.cpp deleted file mode 100644 index 784a40e55..000000000 --- a/src/lilypond/msrWords.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include -#include // setw, setprecision, ... - -#include "msrWords.h" - -#include "msrOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_msrWords msrWords::create ( - int inputLineNumber, - msrPlacementKind wordsPlacementKind, - string wordsContents, - msrJustifyKind wordsJustifyKind, - msrHorizontalAlignmentKind wordsHorizontalAlignmentKind, - msrVerticalAlignmentKind wordsVerticalAlignmentKind, - msrFontStyleKind wordsFontStyleKind, - S_msrFontSize wordsFontSize, - msrFontWeightKind wordsFontWeightKind, - msrXMLLangKind wordsXMLLangKind) -{ - msrWords* o = - new msrWords ( - inputLineNumber, - wordsPlacementKind, - wordsContents, - wordsJustifyKind, - wordsHorizontalAlignmentKind, - wordsVerticalAlignmentKind, - wordsFontStyleKind, - wordsFontSize, - wordsFontWeightKind, - wordsXMLLangKind); - assert(o!=0); - return o; -} - -msrWords::msrWords ( - int inputLineNumber, - msrPlacementKind wordsPlacementKind, - string wordsContents, - msrJustifyKind wordsJustifyKind, - msrHorizontalAlignmentKind wordsHorizontalAlignmentKind, - msrVerticalAlignmentKind wordsVerticalAlignmentKind, - msrFontStyleKind wordsFontStyleKind, - S_msrFontSize wordsFontSize, - msrFontWeightKind wordsFontWeightKind, - msrXMLLangKind wordsXMLLangKind) - : msrElement (inputLineNumber) -{ - fWordsPlacementKind = wordsPlacementKind; - - fWordsContents = wordsContents; - - fWordsJustifyKind = wordsJustifyKind; - - fWordsHorizontalAlignmentKind = wordsHorizontalAlignmentKind; - fWordsVerticalAlignmentKind = wordsVerticalAlignmentKind; - - fWordsFontStyleKind = wordsFontStyleKind; - fWordsFontSize = wordsFontSize; - fWordsFontWeightKind = wordsFontWeightKind; - - fWordsXMLLangKind = wordsXMLLangKind; -} - -msrWords::~msrWords () -{} - -void msrWords::acceptIn (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrWords::acceptIn ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrWords elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrWords::visitStart ()" << - endl; - } - p->visitStart (elem); - } -} - -void msrWords::acceptOut (basevisitor* v) -{ - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> msrWords::acceptOut ()" << - endl; - } - - if (visitor* - p = - dynamic_cast*> (v)) { - S_msrWords elem = this; - - if (gMsrOah->fTraceMsrVisitors) { - gLogOstream << - "% ==> Launching msrWords::visitEnd ()" << - endl; - } - p->visitEnd (elem); - } -} - -void msrWords::browseData (basevisitor* v) -{} - -string msrWords::wordsPlacementKindAsString () const -{ - return - msrPlacementKindAsString ( - fWordsPlacementKind); -} - -string msrWords::wordsJustifyKindAsString () const -{ - return msrJustifyKindAsString (fWordsJustifyKind); -} - -string msrWords::wordsHorizontalAlignmentKindAsString () const -{ - return - msrHorizontalAlignmentKindAsString ( - fWordsHorizontalAlignmentKind); -} - -string msrWords::wordsVerticalAlignmentKindAsString () const -{ - return - msrVerticalAlignmentKindAsString ( - fWordsVerticalAlignmentKind); -} - -string msrWords::wordsFontStyleKindAsString () const -{ - return msrFontStyleKindAsString (fWordsFontStyleKind); -} - -string msrWords::wordsFontSizeAsString () const -{ - return fWordsFontSize->fontSizeAsString (); -} - -string msrWords::wordsFontWeightKindAsString () const -{ - return msrFontWeightKindAsString (fWordsFontWeightKind); -} - -string msrWords::asString () const -{ - stringstream s; - - s << - "Words" << " " << - fWordsContents << ", placement = " << - msrPlacementKindAsString (fWordsPlacementKind); - - return s.str (); -} - -void msrWords::print (ostream& os) const -{ -// JMI os << asString () << endl; - - os << - "Words" << - endl; - - gIndenter++; - - const int fieldWidth = 29; - - os << left << - setw (fieldWidth) << - "wordsContents" << " = \"" << fWordsContents << "\"" << - endl << - setw (fieldWidth) << - "placement" << " : " << - msrPlacementKindAsString (fWordsPlacementKind) << - endl << - setw (fieldWidth) << - "wordsJustifyKind" << " : " << - msrJustifyKindAsString (fWordsJustifyKind) << - endl << - setw (fieldWidth) << - "wordsHorizontalAlignmentKind" << " : " << - msrHorizontalAlignmentKindAsString (fWordsHorizontalAlignmentKind) << - endl << - setw (fieldWidth) << - "wordsVerticalAlignmentKind" << " : " << - msrVerticalAlignmentKindAsString (fWordsVerticalAlignmentKind) << - endl << - setw (fieldWidth) << - "wordsFontStyle" << " : " << - msrFontStyleKindAsString (fWordsFontStyleKind) << - endl << - setw (fieldWidth) << - "wordsFontSize" << " : " << - fWordsFontSize->fontSizeAsString () << - endl << - setw (fieldWidth) << - "wordsFontWeight" << " : " << - msrFontWeightKindAsString (fWordsFontWeightKind) << - endl << - setw (fieldWidth) << - "wordsFontXMLLang" << " : " << - msrXMLLangKindAsString (fWordsXMLLangKind) << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_msrWords& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/msrWords.h b/src/lilypond/msrWords.h deleted file mode 100644 index c29d38ac4..000000000 --- a/src/lilypond/msrWords.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___msrWords___ -#define ___msrWords___ - -#include "msrElements.h" - -#include "msrBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class msrWords : public msrElement -{ - public: - - // data types - // ------------------------------------------------------ - - enum msrWordsFontStyleKind { - kNormalStyle, KItalicStyle }; - - static string wordsFontStyleKindAsString ( - msrWordsFontStyleKind wordsFontStyleKind); - - enum msrWordsFontWeightKind { - kNormalWeight, kBoldWeight }; - - static string msrWordsFontWeightKindAsString ( - msrWordsFontWeightKind wordsFontWeightKind); - - // creation from MusicXML - // ------------------------------------------------------ - - static SMARTP create ( - int inputLineNumber, - msrPlacementKind wordsPlacementKind, - string wordsContents, - msrJustifyKind wordsJustifyKind, - msrHorizontalAlignmentKind wordsHorizontalAlignmentKind, - msrVerticalAlignmentKind wordsVerticalAlignmentKind, - msrFontStyleKind wordsFontStyleKind, - S_msrFontSize wordsFontSize, - msrFontWeightKind wordsFontWeightKind, - msrXMLLangKind wordsXMLLangKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - msrWords ( - int inputLineNumber, - msrPlacementKind wordsPlacementKind, - string wordsContents, - msrJustifyKind wordsJustifyKind, - msrHorizontalAlignmentKind wordsHorizontalAlignmentKind, - msrVerticalAlignmentKind wordsVerticalAlignmentKind, - msrFontStyleKind wordsFontStyleKind, - S_msrFontSize wordsFontSize, - msrFontWeightKind wordsFontWeightKind, - msrXMLLangKind wordsXMLLangKind); - - virtual ~msrWords (); - - public: - - // set and get - // ------------------------------------------------------ - - msrPlacementKind getWordsPlacementKind () const - { return fWordsPlacementKind; } - - string getWordsContents () const - { return fWordsContents; } - - msrJustifyKind getWordsJustifyKind () const - { return fWordsJustifyKind; } - - msrHorizontalAlignmentKind - getWordsHorizontalAlignmentKind () const - { return fWordsHorizontalAlignmentKind; } - - msrVerticalAlignmentKind - getWordsVerticalAlignmentKind () const - { return fWordsVerticalAlignmentKind; } - - msrFontStyleKind getWordsFontStyleKind () const - { return fWordsFontStyleKind; } - - S_msrFontSize getWordsFontSize () const - { return fWordsFontSize; } - - msrFontWeightKind getWordsFontWeightKind () const - { return fWordsFontWeightKind; } - - msrXMLLangKind getWordsXMLLangKind () const - { return fWordsXMLLangKind; } - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string wordsPlacementKindAsString () const; - - string wordsJustifyKindAsString () const; - - string wordsHorizontalAlignmentKindAsString () const; - string wordsVerticalAlignmentKindAsString () const; - - string wordsFontStyleKindAsString () const; - - string wordsFontSizeAsString () const; - - string wordsFontWeightKindAsString () const; - - string asString () const; - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - msrPlacementKind fWordsPlacementKind; - - string fWordsContents; - - msrJustifyKind fWordsJustifyKind; - - msrHorizontalAlignmentKind - fWordsHorizontalAlignmentKind; - msrVerticalAlignmentKind - fWordsVerticalAlignmentKind; - - msrFontStyleKind fWordsFontStyleKind; - S_msrFontSize fWordsFontSize; - msrFontWeightKind fWordsFontWeightKind; - - msrXMLLangKind fWordsXMLLangKind; -}; -typedef SMARTP S_msrWords; -EXP ostream& operator<< (ostream& os, const S_msrWords& elt); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/musicXMLOah.cpp b/src/lilypond/musicXMLOah.cpp deleted file mode 100644 index d73c8c3a6..000000000 --- a/src/lilypond/musicXMLOah.cpp +++ /dev/null @@ -1,967 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "version.h" -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "messagesHandling.h" - -#include "generalOah.h" -#include "musicXMLOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ - -S_musicXMLOah gMusicXMLOah; -S_musicXMLOah gMusicXMLOahUserChoices; -S_musicXMLOah gMusicXMLOahWithDetailedTrace; - -S_musicXMLOah musicXMLOah::create ( - S_oahHandler handlerUpLink) -{ - musicXMLOah* o = new musicXMLOah( - handlerUpLink); - assert(o!=0); - return o; -} - -musicXMLOah::musicXMLOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "MusicXML", - "hmxml", "help-musicxml", -R"(These options control the way MusicXML data is translated to MSR.)", - kElementVisibilityAlways, - handlerUpLink) -{ -/* JMI - // sanity check - msrAssert ( - handlerUpLink != nullptr, - "handlerUpLink is null"); -*/ - - // append this options group to the options handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeMusicXMLOah (false); -} - -musicXMLOah::~musicXMLOah () -{} - -#ifdef TRACE_OAH -void musicXMLOah::initializeMusicXMLTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Trace", - "hmxmlt", "help-musicxml-trace", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // fetch the 't' prefix - - S_oahPrefix - shortTracePrefix = - fHandlerUpLink-> - fetchPrefixInMapByItsName ( - "t"); - - msrAssert ( - shortTracePrefix != nullptr, - "shortTracePrefix is null"); - - // fetch the 'trace' prefix - - S_oahPrefix - longTracePrefix = - fHandlerUpLink-> - fetchPrefixInMapByItsName ( - "trace"); - - msrAssert ( - longTracePrefix != nullptr, - "longTracePrefix is null"); - - // the 'MusicXML' multiplex booleans atom - - S_oahMultiplexBooleansAtom - musicXMLMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME when analyzing MusicXML data.", - "SHORT_NAME", - "LONG_NAME", - shortTracePrefix, - longTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - musicXMLMultiplexBooleansAtom); - - // encoding - - fTraceEncoding = boolOptionsInitialValue; - - S_oahBooleanAtom - traceEncodingAtom = - oahTwoBooleansAtom::create ( - "tenc", "trace-encoding", -R"(Encoding)", - "traceEncoding", - fTraceEncoding, - gTraceOah->fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceEncodingAtom); - musicXMLMultiplexBooleansAtom-> - addBooleanAtom ( - traceEncodingAtom); - - // divisions - - fTraceDivisions = boolOptionsInitialValue; - - S_oahBooleanAtom - traceDivisionsAtom = - oahTwoBooleansAtom::create ( - "tdivs", "trace-divisions", -R"(Divisions)", - "traceDivisions", - fTraceDivisions, - gTraceOah->fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceDivisionsAtom); - musicXMLMultiplexBooleansAtom-> - addBooleanAtom ( - traceDivisionsAtom); - - // backup - - fTraceBackup = boolOptionsInitialValue; - - S_oahBooleanAtom - traceBackupAtom = - oahTwoBooleansAtom::create ( - "tbackup", "trace-backup", -R"(Backup)", - "traceBackup", - fTraceBackup, - gTraceOah->fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceBackupAtom); - musicXMLMultiplexBooleansAtom-> - addBooleanAtom ( - traceBackupAtom); - - // forward - - fTraceForward = boolOptionsInitialValue; - - S_oahBooleanAtom - traceForwardAtom = - oahTwoBooleansAtom::create ( - "tforward", "trace-forward", -R"(Forward)", - "traceForward", - fTraceForward, - gTraceOah->fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceForwardAtom); - musicXMLMultiplexBooleansAtom-> - addBooleanAtom ( - traceForwardAtom); - - // MusicXML tree visiting - - fTraceMusicXMLTreeVisitors = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "tmxmltv", "trace-musicxml-tree-visitors", -R"(Write a trace of the MusicXML tree visiting activity to standard error.)", - "traceMusicXMLTreeVisitors", - fTraceMusicXMLTreeVisitors)); -} -#endif - -void musicXMLOah::initializeMusicXMLHeaderOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Header", - "hmxmlh", "help-musicxml-header", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // file name as work title - - fUseFilenameAsWorkTitle = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ufawt", "use-filename-as-work-title", -R"(Use the file name as work title if there is none in the MusicXML data. -Standard input (-) becomes 'Standard input' in that case.)", - "useFilenameAsWorkTitle", - fUseFilenameAsWorkTitle)); - - // lyricists as poets - - fUseLyricistsAsPoets = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "ulap", "use-lyricists-as-poets", -R"(Set the 'poet' to the value of 'lyricist' in the LilyPond code \header. -This is useful because LilyPond doesn't feature a 'lyricist' variable.)", - "useLyricistsAsPoets", - fUseLyricistsAsPoets)); -} - -void musicXMLOah::initializeMusicXMLClefsKeysTimesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Clefs, keys, times", - "hmxmlckt", "help-musicxml-clefs-keys-times", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'ir' prefix - - S_oahPrefix - shortIgnoreRedundantPrefix = - oahPrefix::create ( - "ir", - "ir", - "'-ir=abc,yz' is equivalent to '-irabc, -iryz'"); - fHandlerUpLink-> - appendPrefixToHandler (shortIgnoreRedundantPrefix); - - // the 'ignore-redundant' prefix - - S_oahPrefix - longIgnoreRedundantPrefix = - oahPrefix::create ( - "ignore-redundant", - "ignore-redundant-", - "'-ignore-redundant=abc,yz' is equivalent to '-ignore-redundant-abc, -ignore-redundant-yz'"); - fHandlerUpLink-> - appendPrefixToHandler (longIgnoreRedundantPrefix); - - // the 'ignore redundant' multiplex booleans atom - - S_oahMultiplexBooleansAtom - ignoreRedundantMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Ignore ELEMENTS that are the same as the current one.", - "ELEMENTS", - "ELEMENTS", - shortIgnoreRedundantPrefix, - longIgnoreRedundantPrefix); - - subGroup-> - appendAtomToSubGroup ( - ignoreRedundantMultiplexBooleansAtom); - - // redundant clefs - - fIgnoreRedundantClefs = boolOptionsInitialValue; - - fIgnoreRedundantClefsAtom = - oahBooleanAtom::create ( - "irclefs", "ignore-redundant-clefs", -R"(Ignore clefs that are the same as the current one.)", - "ignoreRedundantClefs", - fIgnoreRedundantClefs); - subGroup-> - appendAtomToSubGroup ( - fIgnoreRedundantClefsAtom); - ignoreRedundantMultiplexBooleansAtom-> - addBooleanAtom ( - fIgnoreRedundantClefsAtom); - - // redundant keys - - fIgnoreRedundantKeys = boolOptionsInitialValue; - - fIgnoreRedundantKeysAtom = - oahBooleanAtom::create ( - "irkeys", "ignore-redundant-keys", -R"(Ignore keys that are the same as the current one.)", - "ignoreRedundantKeys", - fIgnoreRedundantKeys); - subGroup-> - appendAtomToSubGroup ( - fIgnoreRedundantKeysAtom); - ignoreRedundantMultiplexBooleansAtom-> - addBooleanAtom ( - fIgnoreRedundantKeysAtom); - - // redundant times - - fIgnoreRedundantTimes = boolOptionsInitialValue; - - fIgnoreRedundantTimesAtom = - oahBooleanAtom::create ( - "irtimes", "ignore-redundant-times", -R"(Ignore times that are the same as the current one.)", - "ignoreRedundantTimes", - fIgnoreRedundantTimes); - subGroup-> - appendAtomToSubGroup ( - fIgnoreRedundantTimesAtom); - ignoreRedundantMultiplexBooleansAtom-> - addBooleanAtom ( - fIgnoreRedundantTimesAtom); -} - -void musicXMLOah::initializeMusicXMMeasuresOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Measures", - "hmxmlm", "help-musicxml-measures", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // add empty measures - - subGroup-> - appendAtomToSubGroup ( - oahStringToIntMapAtom::create ( - "aem", "add-empty-measures", -R"###(Add empty mesure according to SPECIFICATION. -SPECIFICATION should be of the form 'MEASURE_NUMBER MEASURES_TO_ADD', -where MEASURE_NUMBER is a string, and MEASURES_TO_ADD is the number -of empty measures to add after measure MEASURE_NUMBER. -MEASURE_NUMBER should be the number of an existing, empty measure, -and MEASURES_TO_ADD should be at least 1, , such as '17 3'. -This comes in handly when MusicXML data obtained by scanning contains -a single empty measure when there were several in the original score. -This option can be used any number of times.)###", - "SPECIFICATION", - "addEmptyMeasuresStringToIntMap", - fAddEmptyMeasuresStringToIntMap)); -} - -void musicXMLOah::initializeMusicXMLDynamicsAndWedgesOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Dynamics and wedges", - "hmxmldaw", "help-musicxml-dynamics-and-wedges", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // dynamics - - fAllDynamicsBelow = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "adb", "all-dynamics-below", -R"(Ignore dynamics placement and set it to 'below'.)", - "allDynamicsBelow", - fAllDynamicsBelow)); - - // wedges - - fAllWedgesBelow = false; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "awb", "all-wedges-below", -R"(Ignore wedges placement and set it to 'below'.)", - "allWedgesBelow", - fAllWedgesBelow)); -} - -void musicXMLOah::initializeMusicXMLCombinedOptionsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Combined options", - "hmxmlco", "help-musicxml-combined-options", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // cubase - - fCubase = false; - - // create the 'cubase' combined atom - S_oahCombinedBooleansAtom - cubaseCombinedBooleansAtom = - oahCombinedBooleansAtom::create ( - "cubase", "", -R"(Useful settings for MusicXML data exported from Cubase. -This option is set by default, and can be unset by 'noCubase'.)", - "cubase", - fCubase); - - subGroup-> - appendAtomToSubGroup ( - cubaseCombinedBooleansAtom); - - // set the '-cubase' option by default - cubaseCombinedBooleansAtom-> - setCombinedBooleanVariables (fCubase); - - // populate the 'cubase' combined atom - cubaseCombinedBooleansAtom-> - addBooleanAtom ( - fIgnoreRedundantClefsAtom); - cubaseCombinedBooleansAtom-> - addBooleanAtom ( - fIgnoreRedundantKeysAtom); - cubaseCombinedBooleansAtom-> - addBooleanAtom ( - fIgnoreRedundantTimesAtom); - - // noCubase - - fNoCubase = false; - - S_oahBooleanAtom - noCubaseBooleanAtom = - oahBooleanAtom::create ( - "no-cubase", "", -R"(Prevents the default 'cubase' option.)", - "noCubase", - fNoCubase); - - subGroup-> - appendAtomToSubGroup ( - noCubaseBooleanAtom); - } - -void musicXMLOah::initializeMusicXMLLoopOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Loop", - "hmxmllo", "help-musicxml-loop-options", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // '-loop' is hidden... - - fLoopToMusicXML = boolOptionsInitialValue; - - S_oahBooleanAtom - loopOptionsBooleanAtom = - oahBooleanAtom::create ( - "loop", "loop-to-musicxml", -R"(Close the loop, generating a MusicXML file from the MSR. -The file name receives a '_loop' suffix. Currently under development.)", - "loopToMusicXML", - fLoopToMusicXML); - loopOptionsBooleanAtom-> - setIsHidden (); - - subGroup-> - appendAtomToSubGroup ( - loopOptionsBooleanAtom); -} - -void musicXMLOah::initializeMusicXMLOah ( - bool boolOptionsInitialValue) -{ -#ifdef TRACE_OAH - // trace - // -------------------------------------- - initializeMusicXMLTraceOah ( - boolOptionsInitialValue); -#endif - - // header - // -------------------------------------- - initializeMusicXMLHeaderOptions ( - boolOptionsInitialValue); - - // clefs, keys, times - // -------------------------------------- - initializeMusicXMLClefsKeysTimesOptions ( - boolOptionsInitialValue); - - // measures - // -------------------------------------- - initializeMusicXMMeasuresOptions ( - boolOptionsInitialValue); - - // dynamics and wedges - // -------------------------------------- - initializeMusicXMLDynamicsAndWedgesOptions ( - boolOptionsInitialValue); - - // combined options - // -------------------------------------- - initializeMusicXMLCombinedOptionsOptions ( - boolOptionsInitialValue); - - // loop to do JMI - // -------------------------------------- - - initializeMusicXMLLoopOptions ( - boolOptionsInitialValue); -} - -S_musicXMLOah musicXMLOah::createCloneWithDetailedTrace () -{ - S_musicXMLOah - clone = - musicXMLOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the options handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - - // header - // -------------------------------------- - - clone->fUseFilenameAsWorkTitle = - fUseFilenameAsWorkTitle; - - clone->fUseLyricistsAsPoets = - fUseLyricistsAsPoets; - - - // clefs, keys, times - // -------------------------------------- - - clone->fIgnoreRedundantClefs = - fIgnoreRedundantClefs; - clone->fIgnoreRedundantKeys = - fIgnoreRedundantKeys; - clone->fIgnoreRedundantTimes = - fIgnoreRedundantTimes; - - - // dynamics and wedges - // -------------------------------------- - - clone->fAllDynamicsBelow = - fAllDynamicsBelow; - clone->fAllWedgesBelow = - fAllWedgesBelow; - - - // combined options, cubase - // -------------------------------------- - - clone->fCubase = - fCubase; - clone->fNoCubase = - fNoCubase; - - - // loop - // -------------------------------------- - - clone->fLoopToMusicXML = - fLoopToMusicXML; - - - // trace - // -------------------------------------- - -#ifdef TRACE_OAH - clone->fTraceMusicXMLTreeVisitors = - fTraceMusicXMLTreeVisitors; - - clone->fTraceEncoding = - fTraceEncoding; - - clone->fTraceDivisions = - fTraceDivisions; - - clone->fTraceBackup = - fTraceBackup; - - clone->fTraceForward = - fTraceForward; -#endif - return clone; -} - -//______________________________________________________________________________ -void musicXMLOah::setAllMusicXMLTraceOah ( - bool boolOptionsInitialValue) -{ -#ifdef TRACE_OAH - // specific trace - - // encoding - fTraceEncoding = boolOptionsInitialValue; - - // divisions - fTraceDivisions = boolOptionsInitialValue; - - // backup - fTraceBackup = boolOptionsInitialValue; - - // forward - fTraceForward = boolOptionsInitialValue; -#endif -} - -//______________________________________________________________________________ -void musicXMLOah::enforceQuietness () -{ - fTraceMusicXMLTreeVisitors = false; -} - -//______________________________________________________________________________ -void musicXMLOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void musicXMLOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> musicXMLOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_musicXMLOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching musicXMLOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void musicXMLOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> musicXMLOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_musicXMLOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching musicXMLOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void musicXMLOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> musicXMLOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void musicXMLOah::printMusicXMLOahValues (int fieldWidth) -{ - gLogOstream << - "The MusicXML options are:" << - endl; - - gIndenter++; - - - // header - // -------------------------------------- - - gLogOstream << - "Header:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "useFilenameAsWorkTitle" << " : " << - booleanAsString (fUseFilenameAsWorkTitle) << - endl << - setw (fieldWidth) << "useLyricistsAsPoets" << " : " << - booleanAsString (fUseLyricistsAsPoets) << - endl; - - gIndenter--; - - // clefs, keys, times - // -------------------------------------- - - gLogOstream << - "Clefs, keys, times:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "ignoreRedundantClefs" << " : " << - booleanAsString (fIgnoreRedundantClefs) << - endl << - - setw (fieldWidth) << "ignoreRedundantKeys" << " : " << - booleanAsString (fIgnoreRedundantKeys) << - endl << - - setw (fieldWidth) << "ignoreRedundantTimes" << " : " << - booleanAsString (fIgnoreRedundantTimes) << - endl; - - gIndenter--; - - // measures - // -------------------------------------- - - gLogOstream << - "Measures:" << - endl; - - gIndenter++; - -// map fAddEmptyMeasuresStringToIntMap; - -/* JMI - gLogOstream << left << - setw (fieldWidth) << "ignoreRedundantClefs" << " : " << - booleanAsString (fIgnoreRedundantClefs) << - endl << - - setw (fieldWidth) << "ignoreRedundantKeys" << " : " << - booleanAsString (fIgnoreRedundantKeys) << - endl << - - setw (fieldWidth) << "ignoreRedundantTimes" << " : " << - booleanAsString (fIgnoreRedundantTimes) << - endl; -*/ - gIndenter--; - - // dynamics and wedges - // -------------------------------------- - - gLogOstream << - "Dynamics and wedges:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "allDynamicsBelow" << " : " << - booleanAsString (fAllDynamicsBelow) << - endl << - setw (fieldWidth) << "allWedgesBelow" << " : " << - booleanAsString (fAllWedgesBelow) << - endl; - - gIndenter--; - - // combined options, cubase - // -------------------------------------- - - gLogOstream << - "Cubase:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "cubase" << " : " << - booleanAsString (fCubase) << - endl << - setw (fieldWidth) << "noCubase" << " : " << - booleanAsString (fNoCubase) << - endl; - - gIndenter--; - - // loop - // -------------------------------------- - - gLogOstream << - "Loop:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "loopToMusicXML" << " : " << - booleanAsString (fLoopToMusicXML) << - endl; - - gIndenter--; - - // trace - // -------------------------------------- - - gLogOstream << - "Trace:" << - endl; - - gIndenter++; - - gLogOstream << left << -#ifdef TRACE_OAH - setw (fieldWidth) << "traceEncoding" << " : " << - booleanAsString (fTraceEncoding) << - endl << - - setw (fieldWidth) << "traceDivisions" << " : " << - booleanAsString (fTraceDivisions) << - endl << - - setw (fieldWidth) << "traceBackup" << " : " << - booleanAsString (fTraceBackup) << - endl << - - setw (fieldWidth) << "traceForward" << " : " << - booleanAsString (fTraceForward) << - endl << -#endif - - setw (fieldWidth) << "traceMusicXMLTreeVisitors" << " : " << - booleanAsString (fTraceMusicXMLTreeVisitors) << - endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_musicXMLOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeMusicXMLOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing MusicXML options handling" << - endl; - } -#endif - - // create the MusicXML options - // ------------------------------------------------------ - - gMusicXMLOahUserChoices = musicXMLOah::create ( - handler); - assert(gMusicXMLOahUserChoices != 0); - - gMusicXMLOah = - gMusicXMLOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ - -/* JMI - gMusicXMLOahWithDetailedTrace = - gMusicXMLOah-> - createCloneWithDetailedTrace (); - */ -} - - -} diff --git a/src/lilypond/musicXMLOah.h b/src/lilypond/musicXMLOah.h deleted file mode 100644 index 1564d6e41..000000000 --- a/src/lilypond/musicXMLOah.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___musicXMLOah___ -#define ___musicXMLOah___ - -#include "oahBasicTypes.h" -#include "exports.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class musicXMLOah : public oahGroup -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithDetailedTrace (); - - private: - - // initialisation - // ------------------------------------------------------ - - void initializeMusicXMLOah ( - bool boolOptionsInitialValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - musicXMLOah ( - S_oahHandler handlerUpLink); - - virtual ~musicXMLOah (); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // set and get - // ------------------------------------------------------ - - void setAllMusicXMLTraceOah ( - bool boolOptionsInitialValue); - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - -#ifdef TRACE_OAH - void initializeMusicXMLTraceOah ( - bool boolOptionsInitialValue); -#endif - - void initializeMusicXMLHeaderOptions ( - bool boolOptionsInitialValue); - - void initializeMusicXMLClefsKeysTimesOptions ( - bool boolOptionsInitialValue); - - void initializeMusicXMMeasuresOptions ( - bool boolOptionsInitialValue); - - void initializeMusicXMLDynamicsAndWedgesOptions ( - bool boolOptionsInitialValue); - - void initializeMusicXMLCombinedOptionsOptions ( - bool boolOptionsInitialValue); - - void initializeMusicXMLLoopOptions ( - bool boolOptionsInitialValue); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printMusicXMLOahHelp (); - - void printMusicXMLOahValues (int fieldWidth); - - public: - - // fields - // ------------------------------------------------------ - - // header - // -------------------------------------- - - bool fUseFilenameAsWorkTitle; - - bool fUseLyricistsAsPoets; // lyricist is unknown to LilyPond - - // clefs, keys, times - // -------------------------------------- - - bool fIgnoreRedundantClefs; - bool fIgnoreRedundantKeys; - bool fIgnoreRedundantTimes; - - S_oahBooleanAtom fIgnoreRedundantClefsAtom; - S_oahBooleanAtom fIgnoreRedundantKeysAtom; - S_oahBooleanAtom fIgnoreRedundantTimesAtom; - - // measures - // -------------------------------------- - - map fAddEmptyMeasuresStringToIntMap; - - // dynamics and wedges - // -------------------------------------- - - bool fAllDynamicsBelow; - bool fAllWedgesBelow; - - // combined options, cubase - // -------------------------------------- - - bool fCubase; // JMI ??? - bool fNoCubase; - - // loop to do JMI - // -------------------------------------- - bool fLoopToMusicXML; - -#ifdef TRACE_OAH - // specific trace JMI move to traceOah - // -------------------------------------- - - // visitors - bool fTraceMusicXMLTreeVisitors; - - // encoding - bool fTraceEncoding; - - // divisions - bool fTraceDivisions; - - // backup - bool fTraceBackup; - - // forward - bool fTraceForward; -#endif -}; -typedef SMARTP S_musicXMLOah; -EXP ostream& operator<< (ostream& os, const S_musicXMLOah& elt); - -EXP extern S_musicXMLOah gMusicXMLOah; -EXP extern S_musicXMLOah gMusicXMLOahUserChoices; -EXP extern S_musicXMLOah gMusicXMLOahWithDetailedTrace; - -//______________________________________________________________________________ -void initializeMusicXMLOahHandling ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/mxmlTree2MsrSkeletonBuilder.cpp b/src/lilypond/mxmlTree2MsrSkeletonBuilder.cpp deleted file mode 100644 index 5b38b60b7..000000000 --- a/src/lilypond/mxmlTree2MsrSkeletonBuilder.cpp +++ /dev/null @@ -1,4319 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // INT_MIN, INT_MAX -#include - -#include "messagesHandling.h" - -#include "msr2Summary.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - -#include "mxmlTree2MsrSkeletonBuilder.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_mxmlPartGroupDescr mxmlPartGroupDescr::create ( - int startInputLineNumber, - int partGroupNumber, - S_msrPartGroup partGroup, - int startPosition) -{ - mxmlPartGroupDescr* o = new - mxmlPartGroupDescr ( - startInputLineNumber, - partGroupNumber, - partGroup, - startPosition); - assert(o!=0); - return o; -} - -mxmlPartGroupDescr::mxmlPartGroupDescr ( - int startInputLineNumber, - int partGroupNumber, - S_msrPartGroup partGroup, - int startPosition) -{ - fStartInputLineNumber = startInputLineNumber; - fStopInputLineNumber = -1; - - fPartGroupNumber = partGroupNumber; - fPartGroup = partGroup; - - fStartPosition = startPosition; - fStopPosition = -1; -} - -mxmlPartGroupDescr::~mxmlPartGroupDescr () -{} - -string mxmlPartGroupDescr::partGroupDescrAsString () const -{ - stringstream s; - - s << - "'" << - fPartGroupNumber << - "' -=> " << - fPartGroup->getPartGroupCombinedName (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - s << - ", positions " << - fStartPosition << ".." << fStopPosition; - } -#endif - - s << - ", lines " << - fStartInputLineNumber << ".." << fStopInputLineNumber; - - return s.str (); -} - -void mxmlPartGroupDescr::print (ostream& os) const -{ - const int fieldWidth = 14; - - os << left << - setw (fieldWidth) << - "partGroupNumber" << " : " << - fPartGroupNumber << - endl << - setw (fieldWidth) << - "partGroup" << " : " << - fPartGroup << - endl << - setw (fieldWidth) << - "startPosition" << " : " << - fStartPosition << - endl << - setw (fieldWidth) << - "startInputLineNumber" << " : " << - fStartInputLineNumber << - endl << - "stopPosition" << " : " << - fStopPosition << - endl << - setw (fieldWidth) << - "stopInputLineNumber" << " : " << - fStopInputLineNumber << - endl; -} - -ostream& operator<< (ostream& os, const S_mxmlPartGroupDescr& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -mxmlTree2MsrSkeletonBuilder::mxmlTree2MsrSkeletonBuilder ( - indentedOstream& ios) - : fLogOutputStream (ios) -{ - // the MSR score we're building - fMsrScore = - msrScore::create (0); - - // score handling - fScoreNumberOfMeasures = 0; - - // scaling handling - fCurrentMillimeters = -1; - fCurrentTenths = -1; - - fOnGoingSystemMargins = false; - - // page layout - fOnGoingPageLayout = false; - - fOnGoingPageMargins = false; - fCurrentMarginTypeKind = kBothMargins; // default value - - fOnGoingSystemLayout = false; - - // part groups handling - fPartGroupsCounter = 0; - fOnGoingPartGroupNameDisplay = false; - - // parts handling - fCurrentNoIDPartNumber = 0; - fCurrentPartsPosition = 0; - fOnGoingPartNameDisplay = false; - - // staff handling - fCurrentStaffMusicXMLNumber = -1; - - // voice handling - fCurrentVoiceMusicXMLNumber = -1; - - // measures - fPartNumberOfMeasures = 0; - - // lyrics handling - fCurrentStanzaNumber = K_NO_STANZA_NUMBER; // JMI - fCurrentStanzaName = K_NO_STANZA_NAME; // JMI - - // harmonies handling - fThereAreHarmoniesToBeAttachedToCurrentNote = false; - fHarmonyVoicesCounter = 0; - - // figured bass handling - fThereAreFiguredBassToBeAttachedToCurrentNote = false; - fFiguredBassVoicesCounter = 0; - - // ongoing note - fOnGoingNote = false; - - // note context - fCurrentStaffMusicXMLNumber = 0; - fCurrentVoiceMusicXMLNumber = 0; - - // create an empty list for part groups starting at 0, - // i.e. for the implicit part group - fPositionStartingPartGroupDescrsVector.push_back ( - list ()); - - // create an empty list for part groups stopping at 0, - // that will remain empty - fPositionStoppingPartGroupDescrsVector.push_back ( - list ()); - - // create the implicit part group - createImplicitPartGroup (); -} - -mxmlTree2MsrSkeletonBuilder::~mxmlTree2MsrSkeletonBuilder () -{} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::browseMxmlTree ( - const Sxmlelement& mxmlTree) -{ - if (mxmlTree) { - // create a tree browser on this visitor - tree_browser browser (this); - - // browse the xmlelement tree - browser.browse (*mxmlTree); - } -} - -//______________________________________________________________________________ -S_mxmlPartGroupDescr mxmlTree2MsrSkeletonBuilder::fetchStartedPartGroupDescr ( - int partGroupNumber) -{ - S_mxmlPartGroupDescr result; - - if (fStartedPartGroupDescrsMap.count (partGroupNumber)) { - result = - fStartedPartGroupDescrsMap [partGroupNumber]; - } - - return result; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showAllPartGroupDescrsMap ( - int inputLineNumber) -{ - fLogOutputStream << - "AllPartGroupDescrsMap:" << - endl; - - if (fAllPartGroupDescrsMap.size ()) { - gIndenter++; - - map::const_iterator - iBegin = fAllPartGroupDescrsMap.begin (), - iEnd = fAllPartGroupDescrsMap.end (), - i = iBegin; - - for ( ; ; ) { - S_mxmlPartGroupDescr - partGroupDescr = (*i).second; - - S_msrPartGroup - partGroup = - partGroupDescr->getPartGroup (); - - fLogOutputStream << - partGroupDescr->partGroupDescrAsString () << - endl; - - gIndenter++; - - partGroup-> - printPartGroupParts ( - inputLineNumber, - fLogOutputStream); - - gIndenter--; - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - - else { - fLogOutputStream << - gTab << "empty map" << - endl; - } - - fLogOutputStream << - "------------------" << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showStartedPartGroupDescrsMap ( - int inputLineNumber) -{ - fLogOutputStream << - "StartedPartGroupDescrsMap:" << - endl; - - if (fStartedPartGroupDescrsMap.size ()) { - gIndenter++; - - map::const_iterator - iBegin = fStartedPartGroupDescrsMap.begin (), - iEnd = fStartedPartGroupDescrsMap.end (), - i = iBegin; - - for ( ; ; ) { - S_mxmlPartGroupDescr - partGroupDescr = (*i).second; - - S_msrPartGroup - partGroup = - partGroupDescr->getPartGroup (); - - fLogOutputStream << - partGroupDescr->partGroupDescrAsString () << - endl; - - gIndenter++; - - partGroup-> - printPartGroupParts ( - inputLineNumber, - fLogOutputStream); - - gIndenter--; - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - - else { - fLogOutputStream << - gTab << "empty map" << - endl; - } - - fLogOutputStream << - "------------------" << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showPartGroupsStack ( - int inputLineNumber) -{ - fLogOutputStream << - "PartGroupsDescrStack:" << - endl; - - if (fPartGroupsDescrStack.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fPartGroupsDescrStack.begin (), - iEnd = fPartGroupsDescrStack.end (), - i = iBegin; - - for ( ; ; ) { - fLogOutputStream << - "v " << - (*i)->partGroupDescrAsString () << - endl; - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - - else { - fLogOutputStream << - gTab << "empty stack" << - endl; - } - - fLogOutputStream << - "------------------" << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showPartGroupDescrsVector ( - int inputLineNumber) -{ - fLogOutputStream << - "PartGroupDescrsVector:" << - endl; - - gIndenter++; - - for (unsigned int i = 0; i < fPartGroupDescsVector.size (); i++) { - S_mxmlPartGroupDescr - partGroupDescr = fPartGroupDescsVector [i]; - - S_msrPartGroup - partGroup = - partGroupDescr->getPartGroup (); - - fLogOutputStream << - i + 1 << ": " << - partGroupDescr->partGroupDescrAsString () << - ", line " << inputLineNumber << - endl; - } // for - - fLogOutputStream << - "------------------" << - endl; - - gIndenter--; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showPositionStartingPartGroupDescrsVector ( - int inputLineNumber) -{ - fLogOutputStream << - "PositionStartingPartGroupDescrsVector:" << - endl; - - if (fPositionStartingPartGroupDescrsVector.size ()) { - gIndenter++; - - for (unsigned int k = 0; k < fPositionStartingPartGroupDescrsVector.size (); k++) { - fLogOutputStream << - k << ": " << - endl; - - list& - startingPartGroupDescrsList = - fPositionStartingPartGroupDescrsVector [k]; - - if (startingPartGroupDescrsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = startingPartGroupDescrsList.begin (), - iEnd = startingPartGroupDescrsList.end (), - i = iBegin; - - for ( ; ; ) { - S_mxmlPartGroupDescr - partGroupDescr = (*i); - - S_msrPartGroup - partGroup = - partGroupDescr->getPartGroup (); - - fLogOutputStream << - partGroupDescr->partGroupDescrAsString () << - ", line " << inputLineNumber << - endl; - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - - else { - fLogOutputStream << - gTab << "empty list" << - endl; - } - } - - gIndenter--; - } - - fLogOutputStream << - "------------------" << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showPositionStoppingPartGroupDescrsVector ( - int inputLineNumber) -{ - fLogOutputStream << - "PositionStoppingPartGroupDescrsVector:" << - endl; - - if (fPositionStoppingPartGroupDescrsVector.size ()) { - gIndenter++; - - for (unsigned int k = 0; k < fPositionStoppingPartGroupDescrsVector.size (); k++) { - fLogOutputStream << - k << ": " << - endl; - - list& - theList = - fPositionStoppingPartGroupDescrsVector [k]; - - if (theList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = theList.begin (), - iEnd = theList.end (), - i = iBegin; - - for ( ; ; ) { - S_mxmlPartGroupDescr - partGroupDescr = (*i); - - S_msrPartGroup - partGroup = - partGroupDescr->getPartGroup (); - - fLogOutputStream << - partGroupDescr->partGroupDescrAsString () << - ", line " << inputLineNumber << - endl; - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - - else { - fLogOutputStream << - gTab << "empty list" << - endl; - } - } - - gIndenter--; - } - - fLogOutputStream << - "------------------" << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showPartsVector ( - int inputLineNumber) -{ - fLogOutputStream << - "PartsVector:" << - endl; - - if (fPartsVector.size ()) { - gIndenter++; - - for (unsigned int i = 0; i < fPartsVector.size (); i++) { - S_msrPart - part = fPartsVector [i]; - - fLogOutputStream << - i + 1 << ": " << - part->getPartCombinedName () << - ", upLink to: "; - - S_msrPartGroup - partPartGroupUpLink = - part-> - getPartPartGroupUpLink (); - - if (partPartGroupUpLink) { - fLogOutputStream << - partPartGroupUpLink-> - getPartGroupCombinedName (); - } - else { - fLogOutputStream << - "not yet established"; - } - - fLogOutputStream << - ", line " << inputLineNumber << - endl; - } // for - - gIndenter--; - } - - else { - fLogOutputStream << - gTab << "empty vector" << - endl; - } - - fLogOutputStream << - "------------------" << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::showPartGroupsData ( - int inputLineNumber, - string context) -{ - fLogOutputStream << - endl << - context << - ", fCurrentPartsPosition = " << fCurrentPartsPosition << - ", line " << inputLineNumber << - ":" << - endl << - ">>> ================================================" << - endl; - - showAllPartGroupDescrsMap ( - inputLineNumber); - fLogOutputStream << endl; - - showStartedPartGroupDescrsMap ( - inputLineNumber); - fLogOutputStream << endl; - - showPartGroupDescrsVector ( - inputLineNumber); - fLogOutputStream << endl; - - showPositionStartingPartGroupDescrsVector ( - inputLineNumber); - fLogOutputStream << endl; - - showPositionStoppingPartGroupDescrsVector ( - inputLineNumber); - fLogOutputStream << endl; - - showPartsVector ( - inputLineNumber); - fLogOutputStream << endl; - - showPartGroupsStack ( - inputLineNumber); - fLogOutputStream << endl; - - fLogOutputStream << - "<<< ================================================" << - endl << - endl; -} - -//________________________________________________________________________ -S_mxmlPartGroupDescr mxmlTree2MsrSkeletonBuilder::fetchPartGroupDescrStackTop () -{ - S_mxmlPartGroupDescr result; - - // the current part group is the top of the stack, - // i.e. the front for the list used to implement it - if (fPartGroupsDescrStack.size () != 0) { - result = - fPartGroupsDescrStack.front (); - } - - return result; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::registerPartGroupDescrAsStarted ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Registering part group descr '" << - partGroupDescr->getPartGroupCombinedName () << - " as started" << - ", line " << inputLineNumber << - endl; - } - - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "BEFORE registering part group " + - partGroupDescr-> - partGroupDescrAsString () + - " in the data"); - } -#endif - - // register part group in part groups vector, i.e. by appearance order - fPartGroupDescsVector.push_back ( - partGroupDescr); - - // register it in fAllPartGroupDescrsMap under its position as part group, - // since its part group number may reused later by other part groups - fAllPartGroupDescrsMap [fPartGroupsCounter] = - partGroupDescr; - - // register it temporarily in fStartedPartGroupDescrsMap - // under its part group number, - int partGroupNumber = - partGroupDescr-> - getPartGroup ()-> - getPartGroupNumber (); - - fStartedPartGroupDescrsMap [partGroupNumber] = - partGroupDescr; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "AFTER registering part group " + - partGroupDescr-> - partGroupDescrAsString () + - " in the data"); - } -#endif -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::insertPartGroupDescInStartingList ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr, - list& - startingPartGroupDescrsList) -{ - // this list is created in stop position decreasing order, - // so as to have the outer-most part group descr appearing first - list::iterator - iBegin = startingPartGroupDescrsList.begin (), - iEnd = startingPartGroupDescrsList.end (), - i = iBegin; - - while (true) { - if (i == iEnd) { - // append partGroupDescr to the list -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Appending part group descr " << - partGroupDescr-> - partGroupDescrAsString () << - "' at the end of the list of part group descrs starting at position " << - fCurrentPartsPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - startingPartGroupDescrsList.push_back ( - partGroupDescr); - /* - stringstream s; - s << - "part group descr " << - partGroupDescr->partGroupDescrAsString () << - " could not be inserted in part groups to be stopped list"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - break; - } - - // fetch current element in the list - S_mxmlPartGroupDescr - currentPartGroupDescr = (*i); - - if ( - partGroupDescr->getStopPosition () - > - currentPartGroupDescr->getStopPosition () - ) { - // insert partGroupDescr before currentPartGroupDescr -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Inserting part group descr " << - currentPartGroupDescr-> - partGroupDescrAsString () << - "' in pending list before" << - partGroupDescr-> - partGroupDescrAsString () << - ", line " << inputLineNumber << - endl; - } -#endif - - startingPartGroupDescrsList.insert ( - i, partGroupDescr); - break; - } - - i++; - } // while -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::insertPartGroupDescInStoppingList ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr, - list& - stoppingPartGroupDescrsList) -{ - // this list is created in start position decreasing order, - // so as to have the inner-most part group descr appearing first - list::iterator - iBegin = stoppingPartGroupDescrsList.begin (), - iEnd = stoppingPartGroupDescrsList.end (), - i = iBegin; - - while (true) { - if (i == iEnd) { - // append partGroupDescr to the list -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Appending part group descr " << - partGroupDescr-> - partGroupDescrAsString () << - "' at the end of the list of part group descrs stopping at position " << - fCurrentPartsPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - stoppingPartGroupDescrsList.push_back ( - partGroupDescr); - /* - stringstream s; - s << - "part group descr " << - partGroupDescr->partGroupDescrAsString () << - " could not be inserted in part groups to be stopped list"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - */ - break; - } - - // fetch current element in the list - S_mxmlPartGroupDescr - currentPartGroupDescr = (*i); - - if ( - partGroupDescr->getStartPosition () - > - currentPartGroupDescr->getStartPosition () - ) { - // insert partGroupDescr before currentPartGroupDescr -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Inserting part group descr " << - currentPartGroupDescr-> - partGroupDescrAsString () << - "' in pending list before" << - partGroupDescr-> - partGroupDescrAsString () << - ", line " << inputLineNumber << - endl; - } -#endif - - stoppingPartGroupDescrsList.insert ( - i, partGroupDescr); - break; - } - - i++; - } // while -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::registerPartGroupDescrAsStoppingAtCurrentPosition ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr) -{ - // fetch the list of part group descrs stopping at - // the same position as partGroupDescr - list& - stoppingPartGroupDescrsList = - fPositionStoppingPartGroupDescrsVector [ - fCurrentPartsPosition]; - - if (stoppingPartGroupDescrsList.size () == 0) { - // first element, insert it directly - stoppingPartGroupDescrsList.push_back ( - partGroupDescr); - } - - else { - // insert the element at the right place in the stopping list - insertPartGroupDescInStoppingList ( - inputLineNumber, - partGroupDescr, - stoppingPartGroupDescrsList); - } - - // fetch the list of part group descrs starting at - // the same position as partGroupDescr - list& - startingPartGroupDescrsList = - fPositionStartingPartGroupDescrsVector [ - partGroupDescr-> - getStartPosition ()]; - - if (startingPartGroupDescrsList.size () == 0) { - // first element, insert it directly - startingPartGroupDescrsList.push_back ( - partGroupDescr); - } - - else { - // insert partGroupDescr at the right place in the starting list - insertPartGroupDescInStartingList ( - inputLineNumber, - partGroupDescr, - startingPartGroupDescrsList); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::registerPartGroupDescrAsStopped ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Registering part group descr '" << - partGroupDescr->getPartGroupCombinedName () << - " as stopped" << - ", line " << inputLineNumber << - endl; - } -#endif - - // register part group descr as stopping at current position - registerPartGroupDescrAsStoppingAtCurrentPosition ( - inputLineNumber, - partGroupDescr); - - // forget it in fStartedPartGroupDescrsMap, - // it remains in fAllPartGroupDescrsMap - fStartedPartGroupDescrsMap.erase ( - partGroupDescr-> - getPartGroup ()-> - getPartGroupNumber ()); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "AFTER forgetting part group descr " + - partGroupDescr-> - partGroupDescrAsString () + - " in the data"); - } -#endif -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::handlePartGroupStart ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Creating part group with number '" << - fCurrentPartGroupNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - fPartGroupsCounter++; - - // create the part group, - // with the current part group as part group upLink - S_msrPartGroup - partGroupToBeStarted = - msrPartGroup::create ( - inputLineNumber, - fCurrentPartGroupNumber, - fPartGroupsCounter, - fCurrentPartGroupName, - fCurrentPartGroupNameDisplayText, - fCurrentPartGroupAccidentalText, - fCurrentPartGroupAbbreviation, - fCurrentPartGroupSymbolKind, - fCurrentPartGroupSymbolDefaultX, - fCurrentPartGroupBarlineKind, - 0, // partGroupPartGroupUpLink will be set upon 'stop' - fMsrScore); - - // partGroupToBeStarted will be appended to the MSR score - // upon 'stop', once it is complete - - // create the part group descr - S_mxmlPartGroupDescr - partGroupDescr = - mxmlPartGroupDescr::create ( - inputLineNumber, - fCurrentPartGroupNumber, - partGroupToBeStarted, - fCurrentPartsPosition) ; - - // register it in the part groups data -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Adding part group descr for '" << fCurrentPartGroupNumber << - "' to visitor's part groups data" << - ", fCurrentPartsPosition = " << fCurrentPartsPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - registerPartGroupDescrAsStarted ( - inputLineNumber, - partGroupDescr); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "AFTER handlePartGroupStart()"); - } -#endif -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::handlePartGroupStop ( - int inputLineNumber) -{ - // is the part group to be stopped started? - S_mxmlPartGroupDescr - partGroupDescrToBeStopped = - fetchStartedPartGroupDescr ( - fCurrentPartGroupNumber); - - if (! partGroupDescrToBeStopped) { - // no, but we should have found it - stringstream s; - - s << - "no part group '" << fCurrentPartGroupNumber << - "' has not been started, it cannot be stopped"; - - // JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - - else { - // set the stopping position - partGroupDescrToBeStopped-> - setStopPosition ( - inputLineNumber, - fCurrentPartsPosition); - - // register partGroupDescrToBeStopped as stopped - registerPartGroupDescrAsStopped ( - inputLineNumber, - partGroupDescrToBeStopped); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "AFTER handlePartGroupStop()"); - } -#endif -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::doNestPartGroupDescrInItsContainer ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescrToBeStopped, - S_mxmlPartGroupDescr containingPartGroupDescr) -{ - // get part groups from descrs - S_msrPartGroup - partGroupToBeStopped = - partGroupDescrToBeStopped-> - getPartGroup (), - containingPartGroup = - containingPartGroupDescr-> - getPartGroup (); - - // set currentPartGroup's upLink to containingPartGroupDescr -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Setting the upLink of part group " << - partGroupToBeStopped-> - getPartGroupCombinedName () << - "' to " << - containingPartGroup-> - getPartGroupCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - partGroupToBeStopped-> - setPartGroupPartGroupUpLink ( - containingPartGroup); - - // appending currentPartGroup to containingPartGroupDescr -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Appending sub part group " << - partGroupToBeStopped-> - getPartGroupCombinedName () << - "' to " << - containingPartGroup-> - getPartGroupCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - containingPartGroup-> - appendSubPartGroupToPartGroup ( - partGroupToBeStopped); -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::createImplicitPartGroup () -{ - // an implicit part group has to be created to contain everything, - // since there can be parts out of any part group - - // sanity check - msrAssert ( - fImplicitPartGroup == 0, - "fImplicitPartGroup already exists"); - - int inputLineNumber = 0; - // this occurs independantly from the MusicXML data - - // create an implicit part group - fCurrentPartGroupNumber = 0; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Creating an implicit part group with number '" << - fCurrentPartGroupNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - fPartGroupsCounter++; - - fImplicitPartGroup = - msrPartGroup::createImplicitPartGroup ( - fCurrentPartGroupNumber, - fPartGroupsCounter, - "Implicit", // partGroupName - "", // PartGroupNameDisplayText - "", // partGroupAccidentalText - "Impl.", // partGroupAbbreviation - msrPartGroup::kPartGroupBarlineYes, - fMsrScore); - - // append it to the MSR score -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Appending implicit part group '" << - fImplicitPartGroup->getPartGroupNumber () << - "' to MSR score" << - ", fCurrentPartsPosition = " << fCurrentPartsPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - fMsrScore-> - addPartGroupToScore ( - fImplicitPartGroup); - - // create the part group descr for the implicit part group - fImplicitPartGroupDescr = - mxmlPartGroupDescr::create ( - inputLineNumber, - fCurrentPartGroupNumber, - fImplicitPartGroup, - fCurrentPartsPosition); - - // register it in the part groups data -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Adding implicit part group descr for '" << - fCurrentPartGroupNumber << - "' to the part groups data" << - ", fCurrentPartsPosition = " << fCurrentPartsPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - registerPartGroupDescrAsStarted ( - inputLineNumber, - fImplicitPartGroupDescr); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "AFTER creating fImplicitPartGroup"); - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::doPartGroupsNestingAndPartsAllocation ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "doPartGroupsNestingAndPartsAllocation:" << - endl; - } -#endif - - // this is actually a partial subpass of pass_2a, - // since we run through the contents of , - // stored in the data we've built, a second time - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "BEFORE doPartGroupsNestingAndPartsAllocation"); - } -#endif - - // handle each position in turn - for (int k = 0; k <= fCurrentPartsPosition; k++) { - - if (k > 0) { - // parts actual positions start at 1 - // append part to current part group, i.e. to the top of the stack - S_msrPart - part = - fPartsVector [k - 1]; - - // fetch the part group descr stack top - S_mxmlPartGroupDescr - partGroupsDescrStackTop = - fetchPartGroupDescrStackTop (); - - if (! partGroupsDescrStackTop) { - stringstream s; - - s << - "Cannot append part " << - part->getPartCombinedName () << - " to any part group " << - " at position " << k << - ", since the stack is empty"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // append part to current part group - S_msrPartGroup - currentPartGroup = - partGroupsDescrStackTop-> - getPartGroup (); - - currentPartGroup-> - appendPartToPartGroup ( - part); - } - - // handle the part groups descrs stopping at position k - if (fPositionStoppingPartGroupDescrsVector.size ()) { - list& - stoppingPartGroupDescrsList = - fPositionStoppingPartGroupDescrsVector [k]; - - if (stoppingPartGroupDescrsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = stoppingPartGroupDescrsList.begin (), - iEnd = stoppingPartGroupDescrsList.end (), - i = iBegin; - - for ( ; ; ) { - S_mxmlPartGroupDescr - partGroupDescr = (*i); - - int stopInputLineNumber = - partGroupDescr->getStopInputLineNumber (); - - S_msrPartGroup - partGroup = - partGroupDescr->getPartGroup (); - - // fetch the part group descr stack top - S_mxmlPartGroupDescr - partGroupsDescrStackTop = - fetchPartGroupDescrStackTop (); - - if (! partGroupsDescrStackTop) { - stringstream s; - - s << - "Cannot 'stop' part group descr " << - partGroupDescr->getPartGroupCombinedName () << - " at position " << k << - ", since the stack is empty"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - stopInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (partGroupsDescrStackTop == partGroupDescr) { - // pop partGroupDescrToBeStopped from the stack - S_mxmlPartGroupDescr - partGroupsDescrStackTop = - fPartGroupsDescrStack.front (); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Popping part group " << - partGroupDescr-> - getPartGroupCombinedName () << - "' from the stack" << - ", line " << stopInputLineNumber << - endl; - } -#endif - - fPartGroupsDescrStack.pop_front (); - - // the implicit part group isn't contained in any other - if (partGroupDescr != fImplicitPartGroupDescr) { - // fetch new current part group - S_mxmlPartGroupDescr - newPartGroupDescrStackTop = - fetchPartGroupDescrStackTop (); - - if (! newPartGroupDescrStackTop) { - stringstream s; - - s << - "there is no part group in the stack to nest part group descr " << - partGroupDescr->partGroupDescrAsString () << - fCurrentPartID << "\"" << - " into"; - - msrInternalError ( - gOahOah->fInputSourceName, - stopInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // partGroupDescr is nested in newPartGroupDescrStackTop, - // do the nesting - doNestPartGroupDescrInItsContainer ( - stopInputLineNumber, - partGroupDescr, - newPartGroupDescrStackTop); - } - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - showPartGroupsData ( - stopInputLineNumber, - "UPON overlapping part groups"); - } -#endif - - stringstream s; - - s << - endl << - "There are overlapping part groups, namely: " << - endl << - gTab << partGroupDescr->partGroupDescrAsString () << - endl << - "and" << - endl << - gTab << partGroupsDescrStackTop->partGroupDescrAsString () << - endl; - -/* JMI - // fetch the positions in the intersection - int - startOne = - partGroupDescr->getStartPosition (), - startTwo = - partGroupsDescrStackTop->getStartPosition (), - stopOne = - partGroupDescr->getStopPosition (), - stopTwo = - partGroupsDescrStackTop->getStopPosition (); - - int firstCommonPosision = startOne; - if (startTwo > startOne) { - firstCommonPosision = startTwo; - } - - int lastCommonPosision = stopOne; - if (stopTwo < stopOne) { - lastCommonPosision = stopTwo; - } - - s << - endl << - "The parts they share are:" << - endl; - - s << - "(positions range is " << - firstCommonPosision << ".." << lastCommonPosision << - ")" << - endl; - - for (int m = firstCommonPosision; m <= lastCommonPosision; m++) { - S_msrPart - part = - fPartsVector [m]; - - s << - gTab << - part->getPartCombinedName () << - ", line " << part->getInputLineNumber () << - endl; - } // for -*/ - - s << - endl << - replaceSubstringInString ( -R"(Please contact the maintainers of libmusicxml2 (see option '-c, -contact'): - either you found a bug in the EXECUTABLE translator, - or this MusicXML data is the first-ever real-world case - of a score exhibiting overlapping part groups.)", - "EXECUTABLE", - gOahOah->fHandlerExecutableName); - - msrMusicXMLError ( - gOahOah->fInputSourceName, - stopInputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - } - - // handle the part groups descrs starting at position k - if (fPositionStartingPartGroupDescrsVector.size ()) { - list& - startingPartGroupDescrsList = - fPositionStartingPartGroupDescrsVector [k]; - - if (startingPartGroupDescrsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = startingPartGroupDescrsList.begin (), - iEnd = startingPartGroupDescrsList.end (), - i = iBegin; - - for ( ; ; ) { - S_mxmlPartGroupDescr - partGroupDescr = (*i); - - S_msrPartGroup - partGroup = - partGroupDescr->getPartGroup (); - - // make it the new current part group -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Pushing part group descr '" << - partGroupDescr->partGroupDescrAsString () << - "' onto the part group stack" << - ", line " << inputLineNumber << - endl; - } -#endif - - fPartGroupsDescrStack.push_front ( - partGroupDescr); - - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - stringstream s; - - s << - "AT position " << k; - - showPartGroupsData ( - inputLineNumber, - s.str ()); - } -#endif - - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "AFTER doPartGroupsNestingAndPartsAllocation"); - } -#endif -} - -//______________________________________________________________________________ -S_msrStaff mxmlTree2MsrSkeletonBuilder::createStaffInCurrentPartIfNotYetDone ( - int inputLineNumber, - int staffNumber) -{ - // is staffNumber already present in part? - S_msrStaff - staff = - fCurrentPart-> - fetchStaffFromPart (staffNumber); - - if (! staff) { - // no, add it to fCurrentPart - staff = - fCurrentPart-> - addStaffToPartByItsNumber ( - inputLineNumber, - msrStaff::kStaffRegular, - staffNumber); - } - - return staff; -} - -//______________________________________________________________________________ -S_msrVoice mxmlTree2MsrSkeletonBuilder::createRegularVoiceInStaffIfNotYetDone ( - int inputLineNumber, - int staffNumber, - int voiceNumber) -{ - // the voice number is relative to a part, - - // create the staff if not yet done - S_msrStaff - staff = - createStaffInCurrentPartIfNotYetDone ( - inputLineNumber, - staffNumber); - - // is voice already present in staff? - S_msrVoice - voice = - staff-> - fetchVoiceFromStaffByItsNumber ( - inputLineNumber, - voiceNumber); - - if (! voice) { - // create the voice and append it to the staff - voice = - staff-> - createVoiceInStaffByItsNumber ( - inputLineNumber, - msrVoice::kVoiceRegular, - voiceNumber, - fCurrentMeasureNumber); - } - - return voice; -} - -//______________________________________________________________________________ -S_msrVoice mxmlTree2MsrSkeletonBuilder::fetchFirstRegularVoiceFromStaff ( - int inputLineNumber, - int staffNumber) -{ - // the voice number is relative to a part, - - // create the staff if not yet done - S_msrStaff - staff = - createStaffInCurrentPartIfNotYetDone ( - inputLineNumber, - staffNumber); - - // fetch the first regular - S_msrVoice - voice = - staff-> - fetchFirstRegularVoiceFromStaff ( - inputLineNumber); - - return voice; -} - -//______________________________________________________________________________ -S_msrVoice mxmlTree2MsrSkeletonBuilder::createHarmonyVoiceForVoiceIfNotYetDone ( - int inputLineNumber, - S_msrVoice voice) -{ - // is the harmony voice already present in voice? - S_msrVoice - harmonyVoice = - voice-> - getHarmonyVoiceForRegularVoiceForwardLink (); - - if (! harmonyVoice) { - // create the voice and append it to the staff - harmonyVoice = - voice-> - createHarmonyVoiceForRegularVoice ( - inputLineNumber, - fCurrentMeasureNumber); - } - - return harmonyVoice; -} - -//______________________________________________________________________________ -S_msrVoice mxmlTree2MsrSkeletonBuilder::createFiguredBassVoiceForVoiceIfNotYetDone ( - int inputLineNumber, - S_msrVoice voice) -{ - // is the figured bass voice already present in voice? - S_msrVoice - figuredBassVoice = - voice-> - getFiguredBassVoiceForRegularVoiceForwardLink (); - - if (! figuredBassVoice) { - // create the voice and append it to the staff - figuredBassVoice = - voice-> - createFiguredBassVoiceForRegularVoice ( - inputLineNumber, - fCurrentMeasureNumber); - } - - return figuredBassVoice; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_score_partwise& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_score_partwise" << - ", line " << elt->getInputLineNumber () << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "Analysing the score partwise" << - endl; - } -#endif - - fScoreNumberOfMeasures = 0; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_score_partwise& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_score_partwise" << - ", line " << inputLineNumber << - endl; - } - - // register the number of measures - fMsrScore-> - setScoreNumberOfMeasures ( - fScoreNumberOfMeasures); - - // fetch the identification from the credits if any - fMsrScore -> - fetchIdentificationFromCreditsIfAny ( - inputLineNumber); -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_work_number& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_work_number" << - ", line " << inputLineNumber << - endl; - } - - fMsrScore->getIdentification () -> - setWorkNumber ( - inputLineNumber, - elt->getValue ()); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_work_title& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_work_title" << - ", line " << inputLineNumber << - endl; - } - - string workTitle = elt->getValue (); - - fMsrScore->getIdentification () -> - setWorkTitle ( - inputLineNumber, - workTitle); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_movement_number& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_movement_number" << - ", line " << inputLineNumber << - endl; - } - - fMsrScore->getIdentification () -> - setMovementNumber ( - inputLineNumber, - elt->getValue ()); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_movement_title& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_movement_title" << - ", line " << inputLineNumber << - endl; - } - - string movementTitle = elt->getValue (); - - // remove HTML entities if any // JMI option for that? -/* - convertHTMLEntitiesToPlainCharacters ( - movementTitle); - */ - - fMsrScore->getIdentification () -> - setMovementTitle ( - inputLineNumber, - movementTitle); -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_identification& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_identification" << - ", line " << inputLineNumber << - endl; - } -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_identification& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_identification" << - ", line " << inputLineNumber << - endl; - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_creator& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_creator" << - ", line " << inputLineNumber << - endl; - } - - string creatorType = elt->getAttributeValue ("type"); - string creatorValue = elt->getValue (); - - if (creatorType == "composer") { - fMsrScore->getIdentification () -> - addComposer ( - inputLineNumber, - creatorValue); - } - - else if (creatorType == "arranger") { - fMsrScore->getIdentification () -> - addArranger ( - inputLineNumber, - creatorValue); - } - - else if (creatorType == "lyricist") { - fMsrScore->getIdentification () -> - addLyricist ( - inputLineNumber, - creatorValue); - - // should we use lyricists as poets? - if (gMusicXMLOah->fUseLyricistsAsPoets) { - fMsrScore->getIdentification () -> - addPoet ( - inputLineNumber, - elt->getValue ()); - } - } - - else if (creatorType == "poet") { - fMsrScore->getIdentification () -> - addPoet ( - inputLineNumber, - elt->getValue ()); - } - - else if (creatorType == "translator") { - fMsrScore->getIdentification () -> - addTranslator ( - inputLineNumber, - creatorValue); - } - - else if (creatorType == "artist") { - fMsrScore->getIdentification () -> - addArtist ( - inputLineNumber, - creatorValue); - } - - else { - stringstream s; - - s << - "creator type \"" << creatorType << - "\" is unknown"; - -// JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, -// __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_rights& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_rights" << - ", line " << inputLineNumber << - endl; - } - - string rightsValue = elt->getValue (); - - convertHTMLEntitiesToPlainCharacters (rightsValue); // JMI © - - fMsrScore->getIdentification () -> - addRights ( - inputLineNumber, - rightsValue); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_source& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_source" << - ", line " << inputLineNumber << - endl; - } - -/* JMI - string rightsValue = elt->getValue (); - - convertHTMLEntitiesToPlainCharacters (rightsValue); // JMI © - - fMsrScore->getIdentification () -> - addRights ( - inputLineNumber, - rightsValue); - */ -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_relation& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_relation" << - ", line " << inputLineNumber << - endl; - } - -/* JMI - string rightsValue = elt->getValue (); - - convertHTMLEntitiesToPlainCharacters (rightsValue); // JMI © - - fMsrScore->getIdentification () -> - addRights ( - inputLineNumber, - rightsValue); - */ -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_encoding& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_encoding" << - ", line " << elt->getInputLineNumber () << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "*** Analysing S_encoding ***" << - ", " << elt->getValue () << - endl; - } -#endif - - fScoreNumberOfMeasures = 0; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_encoding& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_encoding" << - ", line " << inputLineNumber << - endl; - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_encoding_date& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_encoding_date" << - ", line " << inputLineNumber << - endl; - } - - fMsrScore->getIdentification () -> - setEncodingDate ( - inputLineNumber, - elt->getValue ()); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_encoder& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_encoder" << - ", line " << inputLineNumber << - endl; - } - -/* JMI - fMsrScore->getIdentification () -> - setEncodingDate ( - inputLineNumber, - elt->getValue ()); - */ -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_software& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_software" << - ", line " << inputLineNumber << - endl; - } - - string softwareValue = elt->getValue (); - - // convert clef to upper case for analysis - string softwareValueToLower = softwareValue; - - transform ( - softwareValueToLower.begin (), - softwareValueToLower.end (), - softwareValueToLower.begin (), - ::tolower); - - if (softwareValueToLower.find ("cubase") != string::npos) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - " contains 'Cubase'"); - - // the '-cubase' option is set by default, - // unless '-noCubase' is explicitly set - - if (! gMusicXMLOah->fNoCubase) { - // set the '-cubase' option - S_oahElement - cubaseOption = - gMusicXMLOah-> - getHandlerUpLink ()-> - fetchElementFromMap ("cubase"); - - if ( - // combined booleans atom? - S_oahCombinedBooleansAtom - combinedBooleanAtom = - dynamic_cast(&(*cubaseOption)) - ) { - // handle it at once -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - fLogOutputStream << - "Setting '-cubase' option" << - endl; - } -#endif - - combinedBooleanAtom-> - setCombinedBooleanVariables (true); - } - - gMusicXMLOah->fCubase = true; - } - } - - fMsrScore->getIdentification () -> - addSoftware ( - inputLineNumber, - softwareValue); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_encoding_description& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_encoding_description" << - ", line " << inputLineNumber << - endl; - } - -/* JMI - fMsrScore->getIdentification () -> - setEncodingDate ( - inputLineNumber, - elt->getValue ()); - */ -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_supports& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_supports" << - ", line " << inputLineNumber << - endl; - } - -/* JMI - fMsrScore->getIdentification () -> - setEncodingDate ( - inputLineNumber, - elt->getValue ()); - */ -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_miscellaneous& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_miscellaneous" << - ", line " << inputLineNumber << - endl; - } - -/* JMI - string miscellaneousFielValue = elt->getValue (); - - convertHTMLEntitiesToPlainCharacters ( - miscellaneousFielValue); - - fMsrScore->getIdentification () -> - setMiscellaneousField ( - inputLineNumber, - miscellaneousFielValue); - */ -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_miscellaneous& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_miscellaneous" << - ", line " << inputLineNumber << - endl; - } -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_miscellaneous_field& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_miscellaneous_field" << - ", line " << inputLineNumber << - endl; - } - - string miscellaneousFielValue = elt->getValue (); - - convertHTMLEntitiesToPlainCharacters ( - miscellaneousFielValue); - - fMsrScore->getIdentification () -> - setMiscellaneousField ( - inputLineNumber, - miscellaneousFielValue); -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_millimeters& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_millimeters" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentMillimeters = (float)(*elt); - - fMsrScore-> - getScaling ()-> - setMillimeters (fCurrentMillimeters); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_tenths& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tenths" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentTenths = (int)(*elt); - - fMsrScore-> - getScaling ()-> - setTenths (fCurrentTenths); -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_scaling& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_scaling" << - ", line " << elt->getInputLineNumber () << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGeometry) { - fLogOutputStream << - "There are " << fCurrentTenths << - " tenths for " << fCurrentMillimeters << - " millimeters, hence the global staff size is " << - fMsrScore->getScaling ()->fetchGlobalStaffSize () << - endl; - } -#endif -} - -//______________________________________________________________________________ -/* JMI - - - 21.00 - 0.00 - - 170.00 - -*/ - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_system_layout& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_system_layout" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingSystemLayout = true; -} -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_system_layout& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_system_layout" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingSystemLayout = false; -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_system_margins& elt ) -{ -/* - - - 0.00 - -0.00 - - 170.00 - -*/ - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_system_margins" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (! fOnGoingSystemLayout) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } - - fOnGoingSystemMargins = true; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_system_margins& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_system_margins" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (! fOnGoingSystemLayout) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } - - fOnGoingSystemMargins = false; -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_system_distance& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_system_distance" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingSystemLayout) { -/* - float systemDistanceTenths = (float)(*elt); - - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setBetweenSystemSpace ( - msrLength::create ( - kMillimeterUnit, - systemDistanceTenths * fCurrentMillimeters / fCurrentTenths)); - */ - stringstream s; - - s << - " is not supported yet by " << - gOahOah->fHandlerExecutableName; - -/* JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - s.str ()); - */ - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_top_system_distance& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_top_system_distance" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingSystemLayout) { -/* - float topSystemDistanceTenths = (float)(*elt); - - fMsrScore-> - getScaling ()-> - setPageTopSpace ( - msrLength::create ( - kMillimeterUnit, - topSystemDistanceTenths * fCurrentMillimeters / fCurrentTenths)); - */ - stringstream s; - - s << - " is not supported yet by " << - gOahOah->fHandlerExecutableName; - -/* JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - s.str ()); - */ - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_system_dividers& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_system_dividers" << - ", line " << elt->getInputLineNumber () << - endl; - } - - stringstream s; - - s << - " is not supported yet by " << - gOahOah->fHandlerExecutableName; - -/* JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - s.str ()); - */ -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_left_divider& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_left_divider" << - ", line " << elt->getInputLineNumber () << - endl; - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_right_divider& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_right_divider" << - ", line " << elt->getInputLineNumber () << - endl; - } -} - -//______________________________________________________________________________ -/* JMI - - 1683.36 - 1190.88 - - 56.6929 - 56.6929 - 56.6929 - 113.386 - - - 56.6929 - 56.6929 - 56.6929 - 113.386 - - -*/ - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_page_layout& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_page_layout" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPageLayout = true; -} -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_page_layout& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_page_layout" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPageLayout = false; -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_page_height& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_page_height" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingPageLayout) { - float pageHeight = (float)(*elt); - - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setPageHeight ( - msrLength::create ( - kMillimeterUnit, - pageHeight * fCurrentMillimeters / fCurrentTenths)); - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_page_width& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_page_width" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingPageLayout) { - float pageWidth = (float)(*elt); - - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setPageWidth ( - msrLength::create ( - kMillimeterUnit, - pageWidth * fCurrentMillimeters / fCurrentTenths)); - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_page_margins& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_page_margins" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingPageLayout) { - string pageMarginsType = - elt->getAttributeValue ("type"); - - fCurrentMarginTypeKind = kBothMargins; // default value - - if (pageMarginsType == "odd") - fCurrentMarginTypeKind = kOddMargin; - else if (pageMarginsType == "even") - fCurrentMarginTypeKind = kEvenMargin; - else if (pageMarginsType == "both") - fCurrentMarginTypeKind = kBothMargins; - else if (pageMarginsType. size ()) { - stringstream s; - - s << - "unknown page margins type \"" << - pageMarginsType << - "\""; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - s.str ()); - } - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } - - fOnGoingPageMargins = true; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_page_margins& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_page_margins" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPageMargins = false; -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_left_margin& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_left_margin" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingPageMargins) { - float leftMargin = (float)(*elt); - - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setLeftMargin ( - msrMargin::create ( - fCurrentMarginTypeKind, - msrLength ( - kMillimeterUnit, - leftMargin * fCurrentMillimeters / fCurrentTenths))); - } - else if (fOnGoingSystemMargins) { - -/* JMI - float leftMargin = (float)(*elt); - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setLeftMargin ( - msrMargin::create ( - fCurrentMarginTypeKind, - msrLength ( - kMillimeterUnit, - leftMargin * fCurrentMillimeters / fCurrentTenths))); - */ - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_right_margin& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_right_margin" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingPageMargins) { - float rightMargin = (float)(*elt); - - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setRightMargin ( - msrMargin::create ( - fCurrentMarginTypeKind, - msrLength ( - kMillimeterUnit, - rightMargin * fCurrentMillimeters / fCurrentTenths))); - } - else if (fOnGoingSystemMargins) { - -/* JMI - float rightMargin = (float)(*elt); - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setRightMargin ( - msrMargin::create ( - fCurrentMarginTypeKind, - msrLength ( - kMillimeterUnit, - rightMargin * fCurrentMillimeters / fCurrentTenths))); - */ - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_top_margin& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_top_margin" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingPageMargins) { - float topMargin = (float)(*elt); - - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setTopMargin ( - msrMargin::create ( - fCurrentMarginTypeKind, - msrLength ( - kMillimeterUnit, - topMargin * fCurrentMillimeters / fCurrentTenths))); - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_bottom_margin& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bottom_margin" << - ", line " << elt->getInputLineNumber () << - endl; - } - - if (fOnGoingPageMargins) { - float bottomMargin = (float)(*elt); - - fMsrScore-> - getScaling ()-> - getPageLayout ()-> - setBottomMargin ( - msrMargin::create ( - fCurrentMarginTypeKind, - msrLength ( - kMillimeterUnit, - bottomMargin * fCurrentMillimeters / fCurrentTenths))); - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - __FILE__, __LINE__, - " is out of context"); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_credit& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_credit" << - ", line " << inputLineNumber << - endl; - } - - int creditPageNumber = - elt->getAttributeIntValue ("page", 0); - - fCurrentCredit = - msrCredit::create ( - inputLineNumber, - creditPageNumber); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_credit_words& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_credit_words" << - ", line " << inputLineNumber << - endl; - } - -/* - - "R E Q U I E M" from D E A T H N O T E - - - Theme from L's death. For SATB choir. - - - Yoshihisa Hirano & Hideki Taniuchi - - - arrangement and lyrics by Andrés Rojas - - */ - - string creditWordsContents = - elt->getValue (); - - // font family - string creditWordsFontFamily = - elt->getAttributeValue ("font-family"); - - // font size - float creditWordsFontSize = - elt->getAttributeFloatValue ("font-size", 0.0); - - // font weight - string creditWordsFontWeightString = - elt->getAttributeValue ("font-weight"); // JMI etc - - msrFontWeightKind - creditWordsFontWeightKind = - msrFontWeightKindFromString ( - inputLineNumber, - creditWordsFontWeightString); - - // font style - string creditWordsFontStyleString = - elt->getAttributeValue ("font-style"); - - msrFontStyleKind - creditWordsFontStyleKind = - msrFontStyleKindFromString ( - inputLineNumber, - creditWordsFontStyleString); - - // justify - string creditWordsJustifyString = - elt->getAttributeValue ("justify"); - - msrJustifyKind - creditWordsJustifyKind = - msrJustifyKindFromString ( - inputLineNumber, - creditWordsJustifyString); - - // halign - string creditWordsHAlignString = - elt->getAttributeValue ("halign"); - - msrHorizontalAlignmentKind - creditWordsHorizontalAlignment = - msrHorizontalAlignmentKindFromString ( - inputLineNumber, - creditWordsHAlignString); - - // valign - string creditWordsVAlignString = - elt->getAttributeValue ("valign"); - - msrVerticalAlignmentKind - creditWordsVerticalAlignment = - msrVerticalAlignmentKindFromString ( - inputLineNumber, - creditWordsVAlignString); - - // XMLLang - string creditWordsXMLLangString = - elt->getAttributeValue ("xml:lang"); - - msrXMLLangKind - creditWordsXMLLang = - msrXMLLangKindFromString ( - inputLineNumber, - creditWordsXMLLangString); - - // create the credit words - S_msrCreditWords - creditWords = - msrCreditWords::create ( - inputLineNumber, - creditWordsContents, - creditWordsFontFamily, - creditWordsFontSize, - creditWordsFontWeightKind, - creditWordsFontStyleKind, - creditWordsJustifyKind, - creditWordsHorizontalAlignment, - creditWordsVerticalAlignment, - creditWordsXMLLang); - - // append it to the current credit - fCurrentCredit-> - appendCreditWordsToCredit ( - creditWords); -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_credit& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_credit" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fMsrScore-> - appendCreditToScore (fCurrentCredit); - - fCurrentCredit = nullptr; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_part_list& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part_list" << - ", line " << elt->getInputLineNumber () << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "Analysing part list" << - endl; - } -#endif - - gIndenter++; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_part_list& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_part_list" << - ", line " << inputLineNumber << - endl; - } - - gIndenter--; - - // set implicit part group descr end position - fImplicitPartGroupDescr-> - setStopPosition ( - inputLineNumber, // JMI ??? - INT_MAX); - - // register implicit part group descr as stopped - registerPartGroupDescrAsStopped ( - inputLineNumber, - fImplicitPartGroupDescr); - - // do the job... - doPartGroupsNestingAndPartsAllocation ( - inputLineNumber); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - showPartGroupsData ( - inputLineNumber, - "Part groups data gathered for score skeleton"); - } -#endif - - if (gMsrOah->fDisplayPartGroups) { - fLogOutputStream << - endl << - "The implicit part group contains:" << - endl; - - gIndenter++; - - fImplicitPartGroup-> - printPartGroupParts ( - inputLineNumber, - fLogOutputStream); - - gIndenter--; - } -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_part_group& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part_group" << - ", line " << inputLineNumber << - endl; - } - - // part group number - - fCurrentPartGroupNumber = - elt->getAttributeIntValue ("number", 0); - - // part group type - - string partGroupType = elt->getAttributeValue ("type"); - - fCurrentPartGroupTypeKind = msrPartGroup::kPartGroupTypeNone; - - if (partGroupType == "start") - fCurrentPartGroupTypeKind = msrPartGroup::kPartGroupTypeStart; - else if (partGroupType == "stop") - fCurrentPartGroupTypeKind = msrPartGroup::kPartGroupTypeStop; - else { - stringstream s; - - s << - "unknown part group type \"" << - partGroupType << - "\""; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // part group print style - - string printStyle = elt->getAttributeValue ("print-style"); // JMI - - // part group print object - - string printObject = elt->getAttributeValue ("print-object"); // JMI - - // handle part group type - switch (fCurrentPartGroupTypeKind) { - - case msrPartGroup::kPartGroupTypeStart: - fCurrentPartGroupName = ""; - fCurrentPartGroupNameDisplayText = ""; - fCurrentPartGroupAccidentalText = ""; - fCurrentPartGroupAbbreviation = ""; - fCurrentPartGroupSymbolKind = msrPartGroup::kPartGroupSymbolNone; - fCurrentPartGroupSymbolDefaultX = INT_MIN; - fCurrentPartGroupBarlineKind = msrPartGroup::kPartGroupBarlineYes; - break; - - case msrPartGroup::kPartGroupTypeStop: - break; - - case msrPartGroup::kPartGroupTypeNone: - // should not occur - break; - } // switch -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_group_name& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_group_name" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentPartGroupName = elt->getValue(); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_group_name_display& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_group_name_display" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPartGroupNameDisplay = true; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_group_name_display& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_group_name_display" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPartGroupNameDisplay = false; -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_display_text& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_display_text" << - ", line " << inputLineNumber << - endl; - } - - if (fOnGoingPartGroupNameDisplay) { - fCurrentPartGroupNameDisplayText = - elt->getValue (); - } - else if (fOnGoingPartNameDisplay) { - fCurrentPartNameDisplayText = - elt->getValue (); - } - else if (fOnGoingPartAbbreviationDisplay) { - fCurrentPartAbbreviationDisplayText = - elt->getValue (); - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - " is out of context"); - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_accidental_text& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accidental_text" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentPartGroupAccidentalText = elt->getValue(); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_group_abbreviation& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_group_abbreviation" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentPartGroupAbbreviation = elt->getValue (); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_group_symbol& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_group_symbol" << - ", line " << inputLineNumber << - endl; - } - - string groupSymbol = elt->getValue (); - - fCurrentPartGroupSymbolKind = - msrPartGroup::kPartGroupSymbolNone; // default value - - if (groupSymbol == "brace") - fCurrentPartGroupSymbolKind = msrPartGroup::kPartGroupSymbolBrace; - - else if (groupSymbol == "bracket") - fCurrentPartGroupSymbolKind = msrPartGroup::kPartGroupSymbolBracket; - - else if (groupSymbol == "line") - fCurrentPartGroupSymbolKind = msrPartGroup::kPartGroupSymbolLine; - - else if (groupSymbol == "square") - fCurrentPartGroupSymbolKind = msrPartGroup::kPartGroupSymbolSquare; - - else if (groupSymbol == "none") - fCurrentPartGroupSymbolKind = msrPartGroup::kPartGroupSymbolNone; - - else { - if (groupSymbol.size ()) { - // part group type may be absent - stringstream s; - - s << - "unknown part group symbol \"" + groupSymbol + "\""; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - fCurrentPartGroupSymbolDefaultX = - elt->getAttributeIntValue ("default-x", 0); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_group_barline& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_group_barline" << - ", line " << inputLineNumber << - endl; - } - - string groupBarline = elt->getValue (); - - // check part group barline - if (groupBarline == "yes") - fCurrentPartGroupBarlineKind = msrPartGroup::kPartGroupBarlineYes; - else if (groupBarline == "no") - fCurrentPartGroupBarlineKind = msrPartGroup::kPartGroupBarlineNo; - else { - stringstream s; - - s << - "unknown part group barline \"" + groupBarline + "\""; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_part_group& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_part_group" << - ", line " << inputLineNumber << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Handling part group '" << - fCurrentPartGroupNumber << - "', type: \"" << - msrPartGroup::partGroupTypeKindAsString ( - fCurrentPartGroupTypeKind) << "\"" << - ", fCurrentPartsPosition = " << fCurrentPartsPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // handle part group type - switch (fCurrentPartGroupTypeKind) { - - case msrPartGroup::kPartGroupTypeStart: - // handle the part group start - handlePartGroupStart ( - inputLineNumber); - break; - - case msrPartGroup::kPartGroupTypeStop: - // handle the part group stop - handlePartGroupStop ( - inputLineNumber); - break; - - case msrPartGroup::kPartGroupTypeNone: - // should not occur - break; - } // switch - - gIndenter--; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_score_part& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_score_part" << - ", line " << inputLineNumber << - endl; - } - - fCurrentPartID = elt->getAttributeValue ("id"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "Found part name \"" << fCurrentPartID << "\"" << - " in part list" << - ", line " << inputLineNumber << - endl; - } -#endif - - // is the part id a pure number? - string regularExpression ( - "[[:space:]]*" - "[[:digit:]]+" - "[[:space:]]*" - ); - - regex e (regularExpression); - smatch sm; - - regex_match (fCurrentPartID, sm, e); - - if (sm.size () == 1) { - stringstream s; - - s << - "Part name \"" << fCurrentPartID << "\"" << - " is a pure number" << - ", line " << inputLineNumber; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - // initializs fields - fCurrentPartName = ""; - fCurrentPartNameDisplayText = ""; - - fCurrentPartAbbreviation = ""; - fCurrentPartAbbreviationDisplayText = ""; - - fCurrentPartInstrumentName = ""; - fCurrentPartInstrumentAbbreviation = ""; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_part_name& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part_name" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentPartName = elt->getValue (); - - string printStyle = elt->getAttributeValue ("print-style"); // JMI - if (printStyle == "JMI") { - } - - string printObject = elt->getAttributeValue ("print-object"); // JMI - if (printObject == "JMI") { - } -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_part_name_display& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part_name_display" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPartNameDisplay = true; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_part_name_display& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_part_name_display" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPartNameDisplay = false; -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_part_abbreviation& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part_abbreviation" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentPartAbbreviation = elt->getValue (); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_part_abbreviation_display& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part_abbreviation_display" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPartAbbreviationDisplay = true; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_part_abbreviation_display& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_part_abbreviation_display" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fOnGoingPartAbbreviationDisplay = false; -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_instrument_name& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_instrument_name" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentPartInstrumentName = elt->getValue(); -} - -void mxmlTree2MsrSkeletonBuilder::visitStart (S_instrument_abbreviation& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_instrument_abbreviation" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentPartInstrumentAbbreviation = elt->getValue(); -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_score_part& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_score_part" << - ", line " << inputLineNumber << - endl; - } - - fCurrentPartsPosition++; - - string partID = elt->getAttributeValue ("id"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "--------------------------------------------" << - endl << - "Handling score part name \"" << fCurrentPartID << "\"" << - ", fCurrentPartsPosition = " << fCurrentPartsPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter++; - - // create the part -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "--------------------------------------------" << - endl << - "Creating part \"" << fCurrentPartID << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrPart - part = - msrPart::create ( - inputLineNumber, - fCurrentPartID, - 0); // partPartGroupUpLink will be set later - - // populate it - part-> - setPartName ( - fCurrentPartName); - part-> - setPartNameDisplayText ( - fCurrentPartNameDisplayText); - - part-> - setPartAbbreviation ( - fCurrentPartAbbreviation); - part-> - setPartAbbreviationDisplayText ( - fCurrentPartAbbreviationDisplayText); - - part-> - setPartInstrumentName ( - fCurrentPartInstrumentName); - part-> - setPartInstrumentAbbreviation ( - fCurrentPartInstrumentAbbreviation); - - // register part in the parts data - registerPart ( - inputLineNumber, - fCurrentPartsPosition, - part); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroupsDetails) { - showPartGroupsData ( - inputLineNumber, - "AFTER handling score part \"" + partID + "\""); - } -#endif - - gIndenter--; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::registerPart ( - int inputLineNumber, - int partPosition, - S_msrPart part) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTracePartGroups) { - fLogOutputStream << - "Registering part " << - part->getPartCombinedName () << - " in the parts data" << - ", partPosition = " << partPosition << - ", line " << inputLineNumber << - endl; - } -#endif - - // register part in the parts vector - fPartsVector.push_back (part); - - // register it in the parts map - fPartsMap [part->getPartID ()] = part; - - // create an empty list for part groups starting at partPosition - fPositionStartingPartGroupDescrsVector.push_back ( - list ()); - - // create an empty list for part groups stopping at partPosition - fPositionStoppingPartGroupDescrsVector.push_back ( - list ()); -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_part& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part" << - ", line " << inputLineNumber << - endl; - } - - // fCurrentPartID is used throughout - fCurrentPartID = elt->getAttributeValue ("id"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - if (! fCurrentPartID.size ()) { - if (fPartsMap.size () == 1) { - // there's only one part in the part list, - // assume this is the one - fCurrentPartID = - (*fPartsMap.begin ()).second-> - getPartID (); - - stringstream s; - - s << - "part id is empty, using '" << - fCurrentPartID << - "' since it is the only part in the "; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - else { - fCurrentNoIDPartNumber++; - - stringstream s; - - s << - "NO_ID_PART_" << fCurrentNoIDPartNumber; - - s >> fCurrentPartID; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "part 'id' is empty, creating one as '" + fCurrentPartID + "'"); - } - } - - // is this part already known? - if (fPartsMap.count (fCurrentPartID)) { - fCurrentPart = // used thoughoutfRepeatHasBeenCreatedForCurrentPart - fPartsMap [fCurrentPartID]; - } - - else { - stringstream s; - - s << - "part \"" << - fCurrentPartID << - "\" is not known in the "; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - gIndenter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - endl << - "--------------------------------------------" << - endl << - "Analyzing part \"" << fCurrentPartID << "\" -- start" << - endl; - } -#endif - - // measures - fPartNumberOfMeasures = 0; - - // staves and voices - fCurrentStaffMusicXMLNumber = 1; // default if there are no element - fCurrentVoiceMusicXMLNumber = 1; // default if there are no element -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_part& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_part" << - ", line " << inputLineNumber << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "Analyzing part \"" << fCurrentPartID << "\" -- end" << - endl << - "--------------------------------------------" << - endl; - } -#endif - - gIndenter--; - - // handle current part number of measures - if (fScoreNumberOfMeasures == 0) { - fScoreNumberOfMeasures = - fPartNumberOfMeasures; - } - else { - // is the part number of measures consistent? - if (fPartNumberOfMeasures != fScoreNumberOfMeasures) { - stringstream s; - - s << - "part " << fCurrentPart->getPartCombinedName () << - " has " << fPartNumberOfMeasures << - " measures while the other ones have " << fScoreNumberOfMeasures; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // set current part's number of measures - fCurrentPart-> - setPartNumberOfMeasures ( - fPartNumberOfMeasures); - - // are there more staves in that specified with ? - fCurrentPart-> - addAVoiceToStavesThatHaveNone ( - inputLineNumber); - - // assign sequential numbers to the voices in the part - fCurrentPart-> - assignSequentialNumbersToRegularVoicesInPart ( - inputLineNumber); -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_staves& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_direction" << - ", line " << inputLineNumber << - endl; - } - - int stavesNumber = int(*elt); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - switch (stavesNumber) { - case 0: - fLogOutputStream << - "There isn't any explicit staff (hence 1 by default)"; // JMI - break; - - case 1: - fLogOutputStream << - "There is 1 staff"; - break; - - default: - fLogOutputStream << - "There are " << stavesNumber << " staves"; - } // switch - - fLogOutputStream << - " in part " << fCurrentPart->getPartCombinedName() << - endl; - } -#endif - - if (stavesNumber > 1) { - // add stavesNumber staves to current part - int n = 1; - - while (n <= stavesNumber) { - /* JMI - fCurrentPart-> - addStaffToPartByItsNumber ( - inputLineNumber, - msrStaff::kStaffRegular, - n); - */ - S_msrStaff - dummyStaff = // JMI - createStaffInCurrentPartIfNotYetDone ( - inputLineNumber, - n); - - n++; - } // while - } -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_staff& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff" << - ", line " << inputLineNumber << - endl; - } - - fCurrentStaffMusicXMLNumber = int(*elt); - - // the staff number should be positive - if (fCurrentStaffMusicXMLNumber <= 0) { - stringstream s; - - s << - "staff number " << fCurrentStaffMusicXMLNumber << - " is not positive" << - ", line " << inputLineNumber; - - msrAssert (false, s.str ()); - } - - if (fOnGoingNote) { // JMI - // regular staff indication in note/rest, fine - } - else { - // JMI ??? - } -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_voice& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff_details" << - ", line " << elt->getInputLineNumber () << - endl; - } - - fCurrentVoiceMusicXMLNumber = int(*elt); - - if (fOnGoingNote) { // JMI - // regular voice indication in note/rest, fine - } - else { - // JMI ??? - } - - // don't attempt to create the voice now, - // it's staff number if any comes later! - // do it upton visitEnd ( S_note& ) -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_measure& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_measure" << - ", line " << inputLineNumber << - endl; - } - -/* - Measures have a required number attribute (going from partwise to timewise, - measures are grouped via the number). -*/ - - fCurrentMeasureNumber = // JMI local variable??? - elt->getAttributeValue ("number"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasures) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - // take this measure into account - fPartNumberOfMeasures++; - - gIndenter++; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd (S_measure& elt) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_measure" << - ", line " << elt->getInputLineNumber () << - endl; - } - - gIndenter--; -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_note& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_note" << - ", line " << elt->getInputLineNumber () << - endl; - } - - // assuming staff number 1, unless S_staff states otherwise afterwards - fCurrentStaffMusicXMLNumber = 1; - - // assuming voice number 1, unless S_voice states otherwise afterwards - fCurrentVoiceMusicXMLNumber = 1; - - // lyrics - fCurrentStanzaNumber = K_NO_STANZA_NUMBER; - fCurrentStanzaName = K_NO_STANZA_NAME; - - fOnGoingNote = true; -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_note& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_note" << - ", line " << inputLineNumber << - endl; - } - - // should the staff be created? - S_msrStaff - staff = - createStaffInCurrentPartIfNotYetDone ( - inputLineNumber, - fCurrentStaffMusicXMLNumber); - - // should the voice be created? - S_msrVoice - noteVoice = - createRegularVoiceInStaffIfNotYetDone ( - inputLineNumber, - fCurrentStaffMusicXMLNumber, - fCurrentVoiceMusicXMLNumber); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "--> S_note, fCurrentStaffMusicXMLNumber = " << - fCurrentStaffMusicXMLNumber << - endl << - "--> S_note, current staff name = " << - staff->getStaffName() << - endl << - "--> S_note, fCurrentVoiceMusicXMLNumber = " << - fCurrentVoiceMusicXMLNumber << - endl << - "--> S_note, current noteVoice name = " << - noteVoice->getVoiceName() << - endl; - } -#endif - - // are there harmonies attached to the current note? - if (fThereAreHarmoniesToBeAttachedToCurrentNote) { - if (gMsrOah->fOmitHarmonies) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Omitting the harmonies" << - ", line " << - inputLineNumber << - endl; - } -#endif - } - else { - // should the harmony voice be created? - S_msrVoice - harmonyVoice = - createHarmonyVoiceForVoiceIfNotYetDone ( - inputLineNumber, - noteVoice); - } - - fThereAreHarmoniesToBeAttachedToCurrentNote = false; - } - - // are there figured bass attached to the current note? - if (fThereAreFiguredBassToBeAttachedToCurrentNote) { - if (gMsrOah->fOmitFiguredBasses) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - fLogOutputStream << - "Omitting the figured basses" << - ", line " << - inputLineNumber << - endl; - } -#endif - } - else { - // should the figured bass voice be created? - S_msrVoice - figuredBassVoice = - createFiguredBassVoiceForVoiceIfNotYetDone ( - inputLineNumber, - noteVoice); - } - - fThereAreFiguredBassToBeAttachedToCurrentNote = false; - } - - fOnGoingNote = false; -} - -//________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart (S_lyric& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_lyric" << - ", line " << inputLineNumber << - endl; - } - - // number - - { - fCurrentStanzaNumber = - elt->getAttributeValue ("number"); - - if (fCurrentStanzaNumber.size () == 0) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "lyric number is empty, using \"1\" by default"); - - fCurrentStanzaNumber = "1"; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "--> setting fCurrentStanzaNumber to " << - fCurrentStanzaNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - // register it as current stanza number, JMI - // that remains set until another positive value is found, - // thus allowing a skip syllable to be generated - // for notes without lyrics - } - } - - // name - - { - fCurrentStanzaName = - elt->getAttributeValue ("name"); - - if (fCurrentStanzaName.size () == 0) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - // lyrics names are not so frequent after all... - stringstream s; - - s << - "lyric name is empty, using \"" << - K_NO_STANZA_NAME << - "\" by default"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - fCurrentStanzaName = K_NO_STANZA_NAME; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "--> setting fCurrentStanzaName to " << - fCurrentStanzaName << - ", line " << inputLineNumber << - endl; - } -#endif - - // register it as current stanza name, JMI - // that remains set another positive value is found, - // thus allowing a skip syllable to be generated - // for notes without lyrics - } - } -} - -void mxmlTree2MsrSkeletonBuilder::visitEnd ( S_lyric& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_lyric" << - ", line " << inputLineNumber << - endl; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - endl << - "visitEnd ( S_lyric& )" << - ", line = " << inputLineNumber << - ", with:" << - endl; - - gIndenter++; - - fLogOutputStream << - "Lyric data:" << - endl; - - { - gIndenter++; - - const int fieldWidth = 28; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentStanzaNumber" << " = " << fCurrentStanzaNumber << - endl; - - gIndenter--; - } - - gIndenter--; - } -#endif - - if (! gMsrOah->fOmitLyrics) { - // create current voice if need be - S_msrVoice - currentVoice = - createRegularVoiceInStaffIfNotYetDone ( - inputLineNumber, - fCurrentStaffMusicXMLNumber, - fCurrentVoiceMusicXMLNumber); - - // create stanzaNumber in current voice if need be - S_msrStanza - stanza = - currentVoice-> - createStanzaInVoiceIfNotYetDone ( - inputLineNumber, - fCurrentStanzaNumber, - fCurrentStanzaName); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_harmony& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_harmony" << - ", harmonyVoicesCounter = " << fHarmonyVoicesCounter << - ", line " << elt->getInputLineNumber () << - endl; - } - - /* - several harmonies can be attached to a given note, - leading to as many harmony voices in the current part - */ - - // take harmony voice into account - fHarmonyVoicesCounter++; // NOT USED JMI - - fThereAreHarmoniesToBeAttachedToCurrentNote = true; -} - -//______________________________________________________________________________ -void mxmlTree2MsrSkeletonBuilder::visitStart ( S_figured_bass& elt ) -{ - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_figured_bass" << - ", figuredBassVoicesCounter = " << fFiguredBassVoicesCounter << - ", line " << elt->getInputLineNumber () << - endl; - } - - /* - several figured basses can be attached to a given note, - leading to as many figured bass voices in the current part JMI TRUE??? - */ - - // take figured bass voice into account - fFiguredBassVoicesCounter++; - -/* - // append a figured bass staff and voice to the current part - fCurrentPart-> - createPartFiguredBassStaffAndVoiceIfNotYetDone ( - inputLineNumber); -*/ - - fThereAreFiguredBassToBeAttachedToCurrentNote = true; -} - - -} // namespace diff --git a/src/lilypond/mxmlTree2MsrSkeletonBuilder.h b/src/lilypond/mxmlTree2MsrSkeletonBuilder.h deleted file mode 100644 index 7465531d1..000000000 --- a/src/lilypond/mxmlTree2MsrSkeletonBuilder.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___mxmlTree2MsrSkeletonBuilder___ -#define ___mxmlTree2MsrSkeletonBuilder___ - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -struct mxmlPartGroupDescr : public smartable -{ -/* - * positions represent the order in which the parts appear in -*/ - - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - int startInputLineNumber, - int partGroupNumber, - S_msrPartGroup partGroup, - int startPosition); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - mxmlPartGroupDescr ( - int startInputLineNumber, - int partGroupNumber, - S_msrPartGroup partGroup, - int startPosition); - - virtual ~mxmlPartGroupDescr (); - - public: - - // set and get - // ------------------------------------------------------ - - int getStartInputLineNumber () const - { return fStartInputLineNumber; } - - int getStopInputLineNumber () const - { return fStopInputLineNumber; } - - int getPartGroupNumber () const - { return fPartGroupNumber; } - - S_msrPartGroup getPartGroup () const - { return fPartGroup; } - - int getStartPosition () const - { return fStartPosition; } - - void setStopPosition ( - int stopInputLineNumber, - int stopPosition) - { - fStopInputLineNumber = stopInputLineNumber; - fStopPosition = stopPosition; - } - - int getStopPosition () const - { return fStopPosition; } - - // services - // ------------------------------------------------------ - - string partGroupDescrAsString () const; - - string getPartGroupCombinedName () const - { - return - fPartGroup-> - getPartGroupCombinedName (); - } - - // print - // ------------------------------------------------------ - - virtual void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - int fStartInputLineNumber; - int fStopInputLineNumber; - - int fPartGroupNumber; // may be reused later - - S_msrPartGroup fPartGroup; - - int fStartPosition; - int fStopPosition; -}; -typedef SMARTP S_mxmlPartGroupDescr; -EXP ostream& operator<< (ostream& os, const S_mxmlPartGroupDescr& elt); - -//________________________________________________________________________ -class mxmlTree2MsrSkeletonBuilder : - - // score partwise - - public visitor, - - // rights - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - public visitor, - - // identification - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // encoding - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // miscellaneous - // ------------------------------------------------------ - - public visitor, - public visitor, - - // scaling - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - - // print - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - // layout - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // credits - // ------------------------------------------------------ - - public visitor, - public visitor, - - // parts & part groups - // ------------------------------------------------------ - - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - - public visitor, - public visitor, - - public visitor, - - // staves - // ------------------------------------------------------ - - public visitor, - public visitor, - - // voices - // ------------------------------------------------------ - - public visitor, - - // measures - // ------------------------------------------------------ - - public visitor, - - // notes - // ------------------------------------------------------ - - public visitor, - - // lyrics - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // harmonies - // ------------------------------------------------------ - - public visitor, - - // figured bass - // ------------------------------------------------------ - - public visitor - -{ - public: - - // constructors/destructor - // ------------------------------------------------------ - - mxmlTree2MsrSkeletonBuilder ( - indentedOstream& ios); - - virtual ~mxmlTree2MsrSkeletonBuilder (); - - // set and get - // ------------------------------------------------------ - - S_msrScore getMsrScore () const - { return fMsrScore; } - - - // services - // ------------------------------------------------------ - - // visitors - // ------------------------------------------------------ - - void browseMxmlTree ( - const Sxmlelement& xmlTree); - - protected: - - // score partwise - // ------------------------------------------------------ - - virtual void visitStart ( S_score_partwise& elt); - virtual void visitEnd ( S_score_partwise& elt); - - // identification - // ------------------------------------------------------ - - virtual void visitStart ( S_identification& elt); - virtual void visitEnd ( S_identification& elt); - virtual void visitStart ( S_creator& elt); - virtual void visitStart ( S_rights& elt); - virtual void visitStart ( S_source& elt); - virtual void visitStart ( S_relation& elt); - - // encoding - // ------------------------------------------------------ - - virtual void visitStart ( S_encoding& elt); - virtual void visitEnd ( S_encoding& elt); - virtual void visitStart ( S_encoding_date& elt); - virtual void visitStart ( S_encoder& elt); - virtual void visitStart ( S_software& elt); - virtual void visitStart ( S_encoding_description& elt); - virtual void visitStart ( S_supports& elt); - - - - virtual void visitStart ( S_work_number& elt); - virtual void visitStart ( S_work_title& elt); - virtual void visitStart ( S_movement_number& elt); - virtual void visitStart ( S_movement_title& elt); - - // miscellaneous - // ------------------------------------------------------ - - virtual void visitStart ( S_miscellaneous& elt); - virtual void visitEnd ( S_miscellaneous& elt); - virtual void visitStart ( S_miscellaneous_field& elt); - - // rights - // ------------------------------------------------------ - - - // scaling - // ------------------------------------------------------ - - // scaling, margins, layout, divider JMI - - virtual void visitStart ( S_millimeters& elt); - virtual void visitStart ( S_tenths& elt); - virtual void visitEnd ( S_scaling& elt); - - virtual void visitStart ( S_system_layout& elt); - virtual void visitEnd ( S_system_layout& elt); - - virtual void visitStart ( S_system_margins& elt); - virtual void visitEnd ( S_system_margins& elt); - virtual void visitStart ( S_system_distance& elt); - virtual void visitStart ( S_top_system_distance& elt); - - virtual void visitStart ( S_system_dividers& elt); - virtual void visitStart ( S_left_divider& elt); - virtual void visitStart ( S_right_divider& elt); - - // print - // ------------------------------------------------------ - - // JMI bool fOnGoingPrint; - - // layout - // ------------------------------------------------------ - - virtual void visitStart ( S_page_layout& elt); - virtual void visitEnd ( S_page_layout& elt); - virtual void visitStart ( S_page_height& elt); - virtual void visitStart ( S_page_width& elt); - virtual void visitStart ( S_page_margins& elt); - virtual void visitEnd ( S_page_margins& elt); - virtual void visitStart ( S_left_margin& elt); - virtual void visitStart ( S_right_margin& elt); - virtual void visitStart ( S_top_margin& elt); - virtual void visitStart ( S_bottom_margin& elt); - - // credits - // ------------------------------------------------------ - - virtual void visitStart ( S_credit& elt); - virtual void visitEnd ( S_credit& elt); - virtual void visitStart ( S_credit_words& elt); - - // parts & part groups - // ------------------------------------------------------ - - virtual void visitStart ( S_part_list& elt); - virtual void visitEnd ( S_part_list& elt); - - virtual void visitStart ( S_display_text& elt); - - virtual void visitStart ( S_part_group& elt); - virtual void visitEnd ( S_part_group& elt); - - virtual void visitStart ( S_group_name& elt); - virtual void visitStart ( S_group_name_display& elt); - virtual void visitEnd ( S_group_name_display& elt); - - virtual void visitStart ( S_accidental_text& elt); - virtual void visitStart ( S_group_abbreviation& elt); - virtual void visitStart ( S_group_symbol& elt); - virtual void visitStart ( S_group_barline& elt); - - virtual void visitStart ( S_score_part& elt); - virtual void visitEnd ( S_score_part& elt); - - virtual void visitStart ( S_part_name& elt); - virtual void visitStart ( S_part_name_display& elt); - virtual void visitEnd ( S_part_name_display& elt); - - virtual void visitStart ( S_part_abbreviation& elt); - virtual void visitStart ( S_part_abbreviation_display& elt); - virtual void visitEnd ( S_part_abbreviation_display& elt); - - virtual void visitStart ( S_instrument_name& elt); - virtual void visitStart ( S_instrument_abbreviation& elt); - - virtual void visitStart ( S_part& elt); - virtual void visitEnd ( S_part& elt); - - // staves - // ------------------------------------------------------ - - virtual void visitStart ( S_staves& elt); - - virtual void visitStart ( S_staff& elt); - - // voices - // ------------------------------------------------------ - - virtual void visitStart ( S_voice& elt ); - - // measures - // ------------------------------------------------------ - - virtual void visitStart ( S_measure& elt); - virtual void visitEnd ( S_measure& elt); - - // notes - // ------------------------------------------------------ - - virtual void visitStart ( S_note& elt); - virtual void visitEnd ( S_note& elt); - - // lyrics - // ------------------------------------------------------ - - virtual void visitStart ( S_lyric& elt); - virtual void visitEnd ( S_lyric& elt); - - // harmonies - // ------------------------------------------------------ - - virtual void visitStart ( S_harmony& elt); - - // figured bass - // ------------------------------------------------------ - - virtual void visitStart ( S_figured_bass& elt); - - private: - - indentedOstream& fLogOutputStream; - - - // the MSR score we're building - // ------------------------------------------------------ - - S_msrScore fMsrScore; - - - // scaling handling - // ------------------------------------------------------ - - float fCurrentMillimeters; - int fCurrentTenths; - - bool fOnGoingPageLayout; - - bool fOnGoingPageMargins; - msrMarginTypeKind fCurrentMarginTypeKind; - - bool fOnGoingSystemLayout; - - bool fOnGoingSystemMargins; - - - // credits handling - // ------------------------------------------------------ - - S_msrCredit fCurrentCredit; - - - // part groups handling - // ------------------------------------------------------ - - int fCurrentPartGroupNumber; - msrPartGroup::msrPartGroupTypeKind - fCurrentPartGroupTypeKind; - string fCurrentPartGroupName; - string fCurrentPartGroupAbbreviation; - - bool fOnGoingPartGroupNameDisplay; - string fCurrentPartGroupNameDisplayText; - - string fCurrentPartGroupAccidentalText; - msrPartGroup::msrPartGroupSymbolKind - fCurrentPartGroupSymbolKind; - msrPartGroup::msrPartGroupBarlineKind - fCurrentPartGroupBarlineKind; - int fCurrentPartGroupSymbolDefaultX; - - // an implicit part group has to be created to contain everything, - // since there can be parts out of any explicit part group - S_mxmlPartGroupDescr fImplicitPartGroupDescr; - S_msrPartGroup fImplicitPartGroup; - - void createImplicitPartGroup (); - - // part groups numbers can be re-used, they're no identifier - // we use a map to access them by part group number - int fPartGroupsCounter; - vector - fPartGroupDescsVector; - map - fAllPartGroupDescrsMap; - map - fStartedPartGroupDescrsMap; - - void showPartGroupDescrsVector ( - int inputLineNumber); - - void showAllPartGroupDescrsMap ( - int inputLineNumber); - - void showStartedPartGroupDescrsMap ( - int inputLineNumber); - - S_mxmlPartGroupDescr fetchStartedPartGroupDescr ( - int partGroupNumber); - - list - fPartGroupsDescrStack; - - void showPartGroupsStack ( - int inputLineNumber); - - S_mxmlPartGroupDescr fetchPartGroupDescrStackTop (); - - void registerPartGroupDescrAsStarted ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr); - - void registerPartGroupDescrAsStopped ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr); - - void showPartGroupsData ( - int inputLineNumber, - string context); - - void handlePartGroupStart ( - int inputLineNumber); - - void handlePartGroupStop ( - int inputLineNumber); - - vector > - fPositionStartingPartGroupDescrsVector; - vector > - fPositionStoppingPartGroupDescrsVector; - - void showPositionStartingPartGroupDescrsVector ( - int inputLineNumber); - - void showPositionStoppingPartGroupDescrsVector ( - int inputLineNumber); - - void insertPartGroupDescInStartingList ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr, - list& - startingPartGroupDescrsList); - - void insertPartGroupDescInStoppingList ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr, - list& - stoppingPartGroupDescrsList); - - void registerPartGroupDescrAsStoppingAtCurrentPosition ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescr); - - void registerPart ( - int inputLineNumber, - int partPosition, - S_msrPart part); - - void doNestPartGroupDescrInItsContainer ( - int inputLineNumber, - S_mxmlPartGroupDescr partGroupDescrToBeStopped, - S_mxmlPartGroupDescr containingPartGroupDescr); - - void doPartGroupsNestingAndPartsAllocation ( - int inputLineNumber); - - - - // parts handling - // ------------------------------------------------------ - - string fCurrentPartID; // used throughout - - string fCurrentPartName; - string fCurrentPartNameDisplayText; - bool fOnGoingPartNameDisplay; - - - string fCurrentPartAbbreviation; - string fCurrentPartAbbreviationDisplayText; - bool fOnGoingPartAbbreviationDisplay; - - string fCurrentPartInstrumentName; - string fCurrentPartInstrumentAbbreviation; - - map fPartsMap; - - int fCurrentNoIDPartNumber; - - // handling the part, each one incrementing the 'position' - // of the part groups, used for handling nesting/overlapping - int fCurrentPartsPosition; - vector fPartsVector; - - void showPartsVector ( - int inputLineNumber); - - S_msrPart fCurrentPart; // used throughout - - - // staff handling - // ------------------------------------------------------ - - int fCurrentStaffMusicXMLNumber; // used throughout - - S_msrStaff createStaffInCurrentPartIfNotYetDone ( - int inputLineNumber, - int staffNumber); - - - // voice handling - // ------------------------------------------------------ - - int fCurrentVoiceMusicXMLNumber; // used throughout - - S_msrVoice createRegularVoiceInStaffIfNotYetDone ( - int inputLineNumber, - int staffNumber, - int voiceNumber); - - S_msrVoice fetchFirstRegularVoiceFromStaff ( - int inputLineNumber, - int staffNumber); - - - // measures - // ------------------------------------------------------ - - string fCurrentMeasureNumber; - - int fScoreNumberOfMeasures; - int fPartNumberOfMeasures; - - // notes handling - // ------------------------------------------------------ - - bool fOnGoingNote; - - - // lyrics handling - // ------------------------------------------------------ - - string fCurrentStanzaNumber; - string fCurrentStanzaName; - - - // harmonies handling - // ------------------------------------------------------ - - bool fThereAreHarmoniesToBeAttachedToCurrentNote; - int fHarmonyVoicesCounter; - - S_msrVoice createHarmonyVoiceForVoiceIfNotYetDone ( - int inputLineNumber, - S_msrVoice voice); - - - // figured bass handling - // ------------------------------------------------------ - - bool fThereAreFiguredBassToBeAttachedToCurrentNote; - int fFiguredBassVoicesCounter; - - S_msrVoice createFiguredBassVoiceForVoiceIfNotYetDone ( - int inputLineNumber, - S_msrVoice voice); -}; - - -} - -#endif diff --git a/src/lilypond/mxmlTree2MsrTranslator.cpp b/src/lilypond/mxmlTree2MsrTranslator.cpp deleted file mode 100644 index 69cd5607e..000000000 --- a/src/lilypond/mxmlTree2MsrTranslator.cpp +++ /dev/null @@ -1,22536 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // INT_MIN, INT_MAX -#include // setw, setprecision, ... -#include // for_each - -#include "xml_tree_browser.h" - -#include "conversions.h" - -#include "utilities.h" - -#include "msr.h" - -#include "generalOah.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "musicXMLOah.h" -#include "msrOah.h" - -#include "mxmlTree2MsrTranslator.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -mxmlTree2MsrTranslator::mxmlTree2MsrTranslator ( - S_msrScore scoreSkeleton, - indentedOstream& ios) - : fLogOutputStream (ios) -{ - // initialize note data to a neutral state - initializeNoteData (); - - // the MSR score we're populating - fMsrScore = scoreSkeleton; - - // divisions - fCurrentDivisionsPerQuarterNote = 1; - - // part handling - - // print - - fCurrentDisplayText = ""; - fOnGoingPrint = false; - - // measure style handling - fCurrentSlashTypeKind = k_NoSlashType; - fCurrentUseDotsKind = k_NoUseDots; - fCurrentSlashUseStemsKind = k_NoSlashUseStems; - - fCurrentBeatRepeatSlashes = -1; - - fCurrentMeasuresRepeatKind = - msrMeasuresRepeat::k_NoMeasuresRepeat; - - fCurrentMeasuresRepeatMeasuresNumber = -1; - fCurrentMeasuresRepeatSlashesNumber = -1; - - fCurrentRestMeasuresMeasuresNumber = 0; - fRemainingRestMeasuresMeasuresNumber = 0; - fOnGoingRestMeasures = false; - fCurrentRestMeasuresHasBeenCreated = false; - - fCurrentSlashDotsNumber = -1; - fCurrentSlashGraphicDurationKind = k_NoDuration; - - // staff details handling - fStaffDetailsStaffNumber = K_NO_STAFF_NUMBER; - - fCurrentStaffTypeKind = - msrStaffDetails::kRegularStaffType; - - fCurrentShowFretsKind = - msrStaffDetails::kShowFretsNumbers; // default value - - fCurrentPrintObjectKind = - kPrintObjectYes; // default value - - fCurrentPrintSpacingKind = - msrStaffDetails::kPrintSpacingNo; // default value ??? JMI - - // staff tuning handling - fCurrentStaffTuningAlterationKind = k_NoAlteration; - fCurrentStaffTuningOctave = -1; - - fCurrentStaffDetailsCapo = 0; - fCurrentStaffDetailsStaffSize = 0; - - fOnGoingStaffTuning = false; - - // scordatura handling - - fCurrentStringTuningNumber = -1; - fCurrentStringTuningDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentStringTuningAlterationKind = k_NoAlteration; - fCurrentStringTuningOctave = -1; - - fOnGoingAccord = false; - - // staff handling - fPreviousNoteMusicXMLStaffNumber = K_NO_STAFF_NUMBER; - fCurrentMusicXMLStaffNumber = K_NO_STAFF_NUMBER; - - // staff change detection - fCurrentStaffNumberToInsertInto = 1; // default value JMI K_NO_STAFF_NUMBER; - - // cross staff chords - fCurrentChordStaffNumber = K_NO_STAFF_NUMBER; - fCurrentNoteIsCrossStaves = false; - - // voice handling - fCurrentMusicXMLVoiceNumber = K_NO_VOICE_NUMBER; - - // clef handling - fCurrentClefStaffNumber = K_NO_STAFF_NUMBER; - fCurrentClefSign = ""; - fCurrentClefLine = -1; - fCurrentClefOctaveChange = -77; - - // key handling - fCurrentKeyKind = msrKey::kTraditionalKind; - - fCurrentKeyStaffNumber = K_NO_STAFF_NUMBER; - fCurrentKeyFifths = -1; - fCurrentKeyCancelFifths = -37; - fCurrentKeyModeKind = msrKey::kMajorMode; - - // time handling - fCurrentTimeSymbolKind = - msrTime::kTimeSymbolNone; // default value - - fOnGoingInterchangeable = false; - - // measures - fPartMeasuresCounter = 0; - fScoreFirstMeasureNumber = ""; - fPartFirstMeasureNumber = ""; - fCurrentMeasureNumber = "???"; - - // transpose handling - fCurrentTransposeNumber = -213; - fCurrentTransposeDiatonic = -214; - fCurrentTransposeChromatic = -215; - - // direction handling - fCurrentDirectionStaffNumber = 1; // it may be absent - fCurrentDirectionVoiceNumber = 1; // it may be absent - fOnGoingDirection = false; - - // direction-type handling - fOnGoingDirectionType = false; - - // accordion-registration handling - fCurrentAccordionHigh = 0; - fCurrentAccordionMiddle = 0; - fCurrentAccordionLow = 0; - - fCurrentAccordionNumbersCounter = 0; - - // metronome handling - fCurrentMetrenomePerMinute = ""; - fCurrentMetronomeParenthesedKind = msrTempo::kTempoParenthesizedNo; - - fCurrentMetrenomeDotsNumber = 0; - fCurrentMetrenomeRelationKind = msrTempo::kTempoRelationNone; - fCurrentMetronomeDurationKind = k_NoDuration; - fCurrentMetronomeBeamValue = ""; - - fOnGoingMetronomeTuplet = false; - fCurrentMetrenomeNormalDotsNumber = 0; - - // time handling - fCurrentTimeStaffNumber = K_NO_STAFF_NUMBER; - fCurrentTimeBeats = ""; - - // lyrics handling - fOnGoingLyric = false; - - fCurrentStanzaNumber = K_NO_STANZA_NUMBER; - fCurrentStanzaName = K_NO_STANZA_NAME; - - fCurrentSyllabic = ""; - - fCurrentSyllableKind = msrSyllable::kSyllableNone; - fCurrentSyllableExtendKind = msrSyllable::kSyllableExtendNone; - fOnGoingSyllableExtend = false; - - fFirstSyllableInSlurKind = msrSyllable::kSyllableNone; - fFirstSyllableInLigatureKind = msrSyllable::kSyllableNone; - - fCurrentNoteHasLyrics = false; - fASkipSyllableHasBeenGeneratedForcurrentNote = false; - fLastHandledNoteInVoiceHasLyrics = false; - - // scordatura handling - fOnGoingAccord = false; - - // harmonies handling - fHarmonyVoicesCounter = 0; - - fCurrentHarmonyRootDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentHarmonyRootAlterationKind = k_NoAlteration; - fCurrentHarmonyKind = k_NoHarmony; - fCurrentHarmonyKindText = ""; - fCurrentHarmonyBassDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentHarmonyBassAlterationKind = k_NoAlteration; - fCurrentHarmonyDegreeValue = -1; - fCurrentHarmonyDegreeAlterationKind = k_NoAlteration; - - fCurrentHarmonyStaffNumber = K_NO_STAFF_NUMBER; - - fCurrentHarmonyWholeNotesOffset = rational (0, 1); - - fOnGoingHarmony = true; - - // figured bass handling - fFiguredBassVoicesCounter = 0; - - fOnGoingFiguredBass = false; - // JMI fPendingFiguredBass = false; - fCurrentFiguredBassSoundingWholeNotes = rational (0, 1); - fCurrentFiguredBassDisplayWholeNotes = rational (0, 1); - fCurrentFiguredBassParenthesesKind = - msrFiguredBass::kFiguredBassParenthesesNo; // default value - fCurrentFigureNumber = -1; - - // frames handling - fCurrentFrameStrings = -1; - fCurrentFrameFrets = -1; - fCurrentFrameFirstFret = -1; - fCurrentFrameNoteStringNumber = -1; - fCurrentFrameNoteFretNumber = -1; - fCurrentFrameNoteFingering = -1; - fCurrentFrameNoteBarreTypeKind = msrFrameNote::kBarreTypeNone; - - fOnGoingFrame = false; - fOnGoingFrameNote = false; - - // barline handling - fCurrentBarlineEndingNumber = ""; // may be "1, 2" - fCurrentBarlineHasSegnoKind = msrBarline::kBarlineHasSegnoNo; - fCurrentBarlineHasCodaKind = msrBarline::kBarlineHasCodaNo; - - fCurrentBarlineLocationKind = msrBarline::kBarlineLocationNone; - fCurrentBarlineStyleKind = msrBarline::kBarlineStyleNone; - fCurrentBarlineEndingTypeKind = msrBarline::kBarlineEndingNone; - fCurrentBarlineRepeatDirectionKind = msrBarline::kBarlineRepeatDirectionNone; - fCurrentBarlineRepeatWingedKind = msrBarline::kBarlineRepeatWingedNone; - - fOnGoingBarline = false; - - // repeats handling - fRepeatEndCounter = 0; - fCurrentRepeatStartMeasureNumber = ""; - fCurrentRepeatEndingStartBarline = nullptr; - - // MusicXML notes handling - fCurrentNoteDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentNoteAlterationKind = k_NoAlteration; - - // note print kind - fCurrentNotePrintObjectKind = kPrintObjectYes; - - // note head - fCurrentNoteHeadKind = msrNote::kNoteHeadNormal; - fCurrentNoteHeadFilledKind = msrNote::kNoteHeadFilledYes; - fCurrentNoteHeadParenthesesKind = msrNote::kNoteHeadParenthesesNo; - - // ongoing note - fOnGoingNote = false; - - // voice - fCurrentMusicXMLVoiceNumber = K_NO_VOICE_NUMBER; - - // technicals handling - fOnGoingTechnical = false; - fBendAlterValue = -39.3; - - // ornaments handling - - // grace notes handling - - // tremolos handling - fCurrentNoteBelongsToADoubleTremolo = false; - fCurrentTremoloTypeKind = k_NoTremoloType; - - // chords handling - fOnGoingChord = false; - - // tuplets handling - fCurrentTupletNumber = -1; - fPreviousTupletNumber = -1; - fCurrentATupletStopIsPending = false; - - fOnGoingTupletActual = false; - fCurrentTupletActualNumber = -1; - fCurrentTupletActualType = "?"; - fCurrentTupletActualDotsNumber = -1; - - fOnGoingTupletNormal = false; - fCurrentTupletNormalNumber = -1; - fCurrentTupletNormalType = "?"; - fCurrentTupletNormalDotsNumber = -1; - - fOnGoingTupletActual = false; - fCurrentTupletActualNumber = -1; - fCurrentTupletActualType = ""; - fCurrentTupletActualDotsNumber = 0; - - fOnGoingTupletNormal = false; - fCurrentTupletNormalNumber = -1; - fCurrentTupletNormalType = ""; - fCurrentTupletNormalDotsNumber = 0; - - // ties handling - - // slurs handling - fOnGoingSlur = false; - fOnGoingSlurHasStanza = false; - - // ligatures handling - fOnGoingLigature = false; - fOnGoingLigatureHasStanza = false; - - // backup handling - fCurrentBackupDivisions = -1; - fOnGoingBackup = false; - - // forward handling - fCurrentForwardDivisions = 1; - - fCurrentForwardStaffNumber = K_NO_STAFF_NUMBER; - fCurrentForwardVoiceNumber = K_NO_VOICE_NUMBER; - - fOnGoingForward = false; -} - -mxmlTree2MsrTranslator::~mxmlTree2MsrTranslator () -{} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::browseMxmlTree ( - const Sxmlelement& mxmlTree) -{ - if (mxmlTree) { - // create a tree browser on this visitor - tree_browser browser (this); - - // browse the xmlelement tree - browser.browse (*mxmlTree); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::initializeNoteData () -{ - // basic note description - -// JMI fCurrentNoteKind = k_NoNoteKind; - - fCurrentNoteQuarterTonesPitchKind = k_NoQuarterTonesPitch_QTP; - - fCurrentNoteSoundingWholeNotes = rational (-13, 1); - fCurrentNoteSoundingWholeNotesFromDuration = rational (-17, 1); - - fCurrentNoteDisplayWholeNotes = rational (-25, 1); - fCurrentNoteDisplayWholeNotesFromType = rational (-29, 1); - - fCurrentNoteDotsNumber = 0; - - fCurrentNoteGraphicDurationKind = k_NoDuration; - - fCurrentNoteOctave = K_NO_OCTAVE; - - fCurrentNoteQuarterTonesDisplayPitchKind = k_NoQuarterTonesPitch_QTP; - fCurrentDisplayDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentDisplayOctave = K_NO_OCTAVE; - - // rests - - fCurrentNoteIsARest = false; - fCurrentRestMeasure = false; - - // unpitched notes - - fCurrentNoteIsUnpitched = false; - - // cue notes - - fCurrentNoteIsACueNote = false; - - // grace notes - - fCurrentNoteIsAGraceNote = false; - - // accidentals - - fCurrentNoteAccidentalKind = - msrNote::kNoteAccidentalNone; // default value - - fCurrentNoteEditorialAccidentalKind = - msrNote::kNoteEditorialAccidentalNo; // default value - - fCurrentNoteCautionaryAccidentalKind = - msrNote::kNoteCautionaryAccidentalNo; // default value - - // current note staff number - fCurrentMusicXMLStaffNumber = 1; // default value, it may be absent - - // current note voice number - fCurrentMusicXMLVoiceNumber = 1; // default value, it may be absent - - // staff change detection - // fCurrentStaffNumberToInsertInto = 1; // JMI ??? - - // time modification - fCurrentNoteHasATimeModification = false; - - // tuplets - - fCurrentNoteBelongsToATuplet = false; - - fCurrentNoteActualNotes = -1; - fCurrentNoteNormalNotes = -1; - - fCurrentTupletActualNumber = -1; - fCurrentTupletActualType = ""; - fCurrentTupletActualDotsNumber = 0; - - fCurrentTupletNormalNumber = -1; - fCurrentTupletNormalType = ""; - fCurrentTupletNormalDotsNumber = 0; - - // chords - - fCurrentNoteBelongsToAChord = false; - - - // note lyrics - -// JMI fCurrentNoteSyllableExtendKind = kSyllableExtendNone; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::printVoicesLastMetNoteMap ( - int inputLineNumber, - string context) -{ - int - voicesLastMetNoteMapSize = - fVoicesLastMetNoteMap.size (); - - fLogOutputStream << - endl << - "fVoicesLastMetNoteMap contains " << - singularOrPlural ( - voicesLastMetNoteMapSize, "element", "elements") << - ", context: " << context << - ", line " << inputLineNumber << - ":" << - endl; - - if (voicesLastMetNoteMapSize) { - gIndenter++; - -// map::const_iterator - map, S_msrNote>::const_iterator - iBegin = fVoicesLastMetNoteMap.begin (), - iEnd = fVoicesLastMetNoteMap.end (), - i = iBegin; - for ( ; ; ) { - fLogOutputStream << - // (*i).first->getVoiceName () << - "staff " << (*i).first.first << - ", voice " << (*i).first.second << - ":" << - endl; - - gIndenter++; - - fLogOutputStream << - (*i).second << - endl; - - gIndenter--; - - if (++i == iEnd) break; - - fLogOutputStream << endl; - } // for - - gIndenter--; - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::checkStep ( - int inputLineNumber, - string stepValue) -{ - if (stepValue.size () == 1) { - char firstChar = stepValue [0]; - - if (firstChar < 'A' || firstChar > 'G') { - stringstream s; - - s << - "step value " << firstChar << - " is not a letter from A to G"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else { - stringstream s; - - s << - "root step value " << stepValue << - " should be a single letter from A to G"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -//______________________________________________________________________________ -S_msrStaff mxmlTree2MsrTranslator::fetchStaffFromCurrentPart ( - int inputLineNumber, - int staffNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - fLogOutputStream << - "Fetching staff " << - staffNumber << - " from current part" << - ", line " << inputLineNumber << - endl; - } -#endif - - // fetch the staff from current part - S_msrStaff - staff = - fCurrentPart-> - fetchStaffFromPart (staffNumber); - - // sanity check - if (! staff) { - stringstream s; - - s << - "staff '" << staffNumber << - "' not found in score skeleton's part " << - fCurrentPart->getPartCombinedName (); - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - fLogOutputStream << - "--> fetchStaffFromCurrentPart returns " << - staff->getStaffName () << - endl; - } -#endif - - return staff; -} - -//______________________________________________________________________________ -S_msrVoice mxmlTree2MsrTranslator::fetchVoiceFromCurrentPart ( - int inputLineNumber, - int staffNumber, - int voiceNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - fLogOutputStream << - "Fetching voice " << - voiceNumber << - " in staff " << - staffNumber << - " from current part" << - ", line " << inputLineNumber << - endl; - } -#endif - - // the voice number is relative to a part, - - // fetch the staff from current part - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, - staffNumber); - - // fetch the voice from the staff - S_msrVoice - voice = - staff-> - fetchVoiceFromStaffByItsNumber ( - inputLineNumber, - voiceNumber); - - // sanity check - if (! voice) { - stringstream s; - - s << - "voice '" << voiceNumber << - "' not found in score skeleton's staff \"" << - staff->getStaffName () << - "\""; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - /* JMI - // fetch registered voice displaying staff number - int voiceDisplayingStaffNumber = 1; //K_NO_VOICE_NUMBER; JMI - // default, there may be no markups - */ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - fLogOutputStream << - "--> fetchVoiceFromCurrentPart() returns " << - voice->getVoiceName () << - endl; - } -#endif - - return voice; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_part& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_part" << - ", line " << inputLineNumber << - endl; - } -#endif - - string partID = elt->getAttributeValue ("id"); - -#ifdef TRACE_OAH - if (gTraceOah->fTracePasses) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - // fetch current part from its partID - fCurrentPart = - fMsrScore-> - fetchPartFromScoreByItsPartID ( - inputLineNumber, - partID); - - // sanity check - if (! fCurrentPart) { - // fetch fMsrScore's part list - list partsList; - - fMsrScore-> - collectScorePartsList ( - inputLineNumber, - partsList); - - if (partsList.size () == 1) { - // there's only one part in the part list, - // assume this is the one - fCurrentPart = - partsList.front (); - - partID = - fCurrentPart-> - getPartID (); - - stringstream s; - - s << - "part 'id' is empty, using '" << - partID << - "' since it is the only part in the "; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - else { - stringstream s; - - s << - "part \"" << partID << - "\" not found in score skeleton"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "--------------------------------------------" << - endl << - "Analyzing part " << - fCurrentPart-> - getPartCombinedName () << - " -- start" << - endl; - } -#endif - - // no time has been defined yet - fCurrentTime = nullptr; - - // staff numbers - fPreviousNoteMusicXMLStaffNumber = K_NO_STAFF_NUMBER; - fCurrentMusicXMLStaffNumber = K_NO_STAFF_NUMBER; - - // staff change detection - fCurrentStaffNumberToInsertInto = 1; // default value JMI K_NO_STAFF_NUMBER; - - // cross staff chords - fCurrentNoteIsCrossStaves = false; - - // get this part's staves map - map - partStavesMap = - fCurrentPart-> - getPartStavesMap (); - - // repeats - fCurrentRepeatStartMeasureNumber = ""; - fCurrentRepeatEndingStartBarline = nullptr; - - // measures - fPartMeasuresCounter = 0; - fScoreFirstMeasureNumber = ""; - fPartFirstMeasureNumber = ""; - fCurrentMeasureNumber = "???"; - - fCurrentMusicXMLStaffNumber = K_NO_STAFF_NUMBER; - fCurrentMusicXMLVoiceNumber = K_NO_VOICE_NUMBER; - - gIndenter++; -} - -void mxmlTree2MsrTranslator::visitEnd (S_part& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_part" << - ", line " << inputLineNumber << - endl; - } -#endif - - gIndenter--; - -/* -#ifdef TRACE_OAH - if (gTraceOah->fTraceParts) { - fLogOutputStream << - "Analyzing part " << - fCurrentPart-> - getPartCombinedName () << - " -- end" << - endl << - "--------------------------------------------" << - endl << - endl; - } -#endif -*/ - -/* JMI - // handle it - // JMI ??? handleRepeatEnd (barline); - handleRepeatHooklessEndingEnd (barline); - } - */ - - // finalize the current part - fCurrentPart-> - finalizePart ( - inputLineNumber); - - // is this part name in the parts omit IDs set? - if (gMsrOah->fPartsOmitIDSet.size ()) { - set::iterator - it = - gMsrOah->fPartsOmitIDSet.find ( - fCurrentPart-> - getPartID ()); - - if (it != gMsrOah->fPartsOmitIDSet.end ()) { - // the simplest way to omit this part - // is to remove it from its part-group - // now that is has been completely built and populated - fCurrentPart-> - getPartPartGroupUpLink ()-> - removePartFromPartGroup ( - inputLineNumber, - fCurrentPart); - } - } - - // is this part name in the parts keep IDs set? - if (gMsrOah->fPartsKeepIDSet.size ()) { - set::iterator - it = - gMsrOah->fPartsKeepIDSet.find ( - fCurrentPart-> - getPartID ()); - - if (it == gMsrOah->fPartsKeepIDSet.end ()) { - // the simplest way not to keep this part - // is to remove it from its part-group - // now that is has been completely built and populated - fCurrentPart-> - getPartPartGroupUpLink ()-> - removePartFromPartGroup ( - inputLineNumber, - fCurrentPart); - } - } - - // is this part name in the parts omit names set? - if (gMsrOah->fPartsOmitNameSet.size ()) { - set::iterator - it = - gMsrOah->fPartsOmitNameSet.find ( - fCurrentPart-> - getPartName ()); - - if (it != gMsrOah->fPartsOmitNameSet.end ()) { - // the simplest way to omit this part - // is to remove it from its part-group - // now that is has been completely built and populated - fCurrentPart-> - getPartPartGroupUpLink ()-> - removePartFromPartGroup ( - inputLineNumber, - fCurrentPart); - } - } - - // is this part name in the parts keep names set? - if (gMsrOah->fPartsKeepNameSet.size ()) { - set::iterator - it = - gMsrOah->fPartsKeepNameSet.find ( - fCurrentPart-> - getPartName ()); - - if (it == gMsrOah->fPartsKeepNameSet.end ()) { - // the simplest way not to keep this part - // is to remove it from its part-group - // now that is has been completely built and populated - fCurrentPart-> - getPartPartGroupUpLink ()-> - removePartFromPartGroup ( - inputLineNumber, - fCurrentPart); - } - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_attributes& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_attributes" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitEnd (S_attributes& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_attributes" << - ", line " << inputLineNumber << - endl; - } -#endif - - // have the divisions been defined alright? - if (! fCurrentDivisions) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "no markup found in MusicXML data, exiting"); - } - - // JMI and if there's no ??? - // time is crucially needed for measures management, - // we cannot stay without any - if (! fCurrentTime) { - /* JMI - // create the default 4/4 time - fCurrentTime = - msrTime::createFourQuartersTime ( - inputLineNumber); - - // register time in staff - fCurrentPart-> - appendTimeToPart (fCurrentTime); - */ - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_divisions& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_divisions" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentDivisionsPerQuarterNote = (int)(*elt); - - if ( - fCurrentDivisionsPerQuarterNote < 1 - || - fCurrentDivisionsPerQuarterNote > 16383 - ) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "divisions per quarter note should be between 1 and 16383"); - } - - // set current part's divisions per quarter note -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceDivisions) { - if (fCurrentDivisionsPerQuarterNote == 1) { - fLogOutputStream << - "There is 1 division"; - } - else { - fLogOutputStream << - "There are " << - fCurrentDivisionsPerQuarterNote << - " divisions"; - } - - fLogOutputStream << - " per quarter note in part " << - fCurrentPart->getPartCombinedName() << - ", line " << inputLineNumber << - endl; - } -#endif - - // create current divisions - fCurrentDivisions = - msrDivisions::create ( - inputLineNumber, - fCurrentDivisionsPerQuarterNote); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_clef& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_clef" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // https://usermanuals.musicxml.com/MusicXML/Content/EL-MusicXML-clef.htm - - // The optional number attribute refers to staff numbers. - // If absent (0), apply to all part staves. - - fCurrentClefStaffNumber = - elt->getAttributeIntValue ("number", 0); - - fCurrentClefLine = 0; - fCurrentClefOctaveChange = 0; - fCurrentClefSign = ""; -} - -void mxmlTree2MsrTranslator::visitStart ( S_sign& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sign" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentClefSign = elt->getValue(); -} - -void mxmlTree2MsrTranslator::visitStart ( S_line& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_line" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentClefLine = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_clef_octave_change& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_clef_octave_change" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentClefOctaveChange = (int)(*elt); - - if (fCurrentClefOctaveChange < -2 || fCurrentClefOctaveChange > 2) { - stringstream s; - - s << - "clef-octave-change \"" << fCurrentClefOctaveChange << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitEnd ( S_clef& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_clef" << - ", line " << inputLineNumber << - endl; - } -#endif - - // convert clef to upper case for analysis - transform ( - fCurrentClefSign.begin (), - fCurrentClefSign.end (), - fCurrentClefSign.begin (), - ::toupper); - - msrClef::msrClefKind clefKind = msrClef::k_NoClef; - - if (fCurrentClefSign == "G") { - - if (fCurrentClefLine == 2) { - switch (fCurrentClefOctaveChange) { - case -2: - clefKind = msrClef::kTrebleMinus15Clef; - break; - case -1: - clefKind = msrClef::kTrebleMinus8Clef; - break; - case 0: - clefKind = msrClef::kTrebleClef; - break; - case +1: - clefKind = msrClef::kTreblePlus8Clef; - break; - case +2: - clefKind = msrClef::kTreblePlus15Clef; - break; - default: - { - // should not occur - } - } // switch - } - - else if (fCurrentClefLine == 1) - clefKind = msrClef::kTrebleLine1Clef; - - else { - stringstream s; - - s << - "'G' clef line \"" << fCurrentClefLine << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else if (fCurrentClefSign == "F") { - - if ( fCurrentClefLine == 4 ) { - switch (fCurrentClefOctaveChange) { - case -2: - clefKind = msrClef::kBassMinus15Clef; - break; - case -1: - clefKind = msrClef::kBassMinus8Clef; - break; - case 0: - clefKind = msrClef::kBassClef; - break; - case +1: - clefKind = msrClef::kBassPlus8Clef; - break; - case +2: - clefKind = msrClef::kBassPlus15Clef; - break; - default: - { - // should not occur - } - } // switch - } - - else if ( fCurrentClefLine == 3 ) { - clefKind = msrClef::kVarbaritoneClef; - /* JMI - switch (fCurrentClefOctaveChange) { - case -2: - clefKind = msrClef::kBassMinus15Clef; - break; - case -1: - clefKind = msrClef::kBassMinus8Clef; - break; - case 0: - clefKind = msrClef::kBassClef; - break; - case +1: - clefKind = msrClef::kBassPlus8Clef; - break; - case +2: - clefKind = msrClef::kBassPlus15Clef; - break; - default: - { - // should not occur - } - } // switch - */ - } - - else { - stringstream s; - - s << - "'F' clef line \"" << fCurrentClefLine << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - else if (fCurrentClefSign == "C") { - - switch (fCurrentClefLine) { - case 1: - clefKind = msrClef::kSopranoClef; - break; - case 2: - clefKind = msrClef::kMezzoSopranoClef; - break; - case 3: - clefKind = msrClef::kAltoClef; - break; - case 4: - clefKind = msrClef::kTenorClef; - break; - case 5: - clefKind = msrClef::kBaritoneClef; - break; - default: - { - stringstream s; - - s << - "'C' clef line \"" << fCurrentClefLine << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // switch - } - - else if (fCurrentClefSign == "TAB" || fCurrentClefSign == "tab") { - - switch (fCurrentClefLine) { - case 4: - clefKind = msrClef::kTablature4Clef; - break; - case 5: - clefKind = msrClef::kTablature5Clef; - break; - case 6: - clefKind = msrClef::kTablature6Clef; - break; - case 7: - clefKind = msrClef::kTablature7Clef; - break; - default: - { - stringstream s; - - s << - "tablature line \"" << fCurrentClefLine << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // switch - } - - else if (fCurrentClefSign == "percussion" || fCurrentClefSign == "PERCUSSION") { - clefKind = msrClef::kPercussionClef; - } - - else if (fCurrentClefSign == "jianpu") { - clefKind = msrClef::kJianpuClef; - } - - else if (fCurrentClefSign == "none" || fCurrentClefSign == "NONE") { - clefKind = msrClef::k_NoClef; - } - - else { - // unknown clef sign - stringstream s; - - s << - "clef sign \"" << fCurrentClefSign << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create clef - S_msrClef - clef = - msrClef::create ( - inputLineNumber, - clefKind); - - // register clef in part or staff - if (fCurrentClefStaffNumber == 0) - fCurrentPart-> - appendClefToPart (clef); - - else { - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, - fCurrentClefStaffNumber); - - staff-> - appendClefToStaff (clef); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_key& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_key" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // The optional number attribute refers to staff numbers. - // If absent (0), apply to all part staves. - fCurrentKeyStaffNumber = - elt->getAttributeIntValue ("number", 0); - - fCurrentKeyKind = msrKey::kTraditionalKind; - - // traditional - fCurrentKeyFifths = 0; - fCurrentKeyCancelFifths = 0; - - fCurrentKeyModeKind = msrKey::kMajorMode; - - // Humdrum-Scot - - fCurrentHumdrumScotKeyItem = nullptr; -} - -void mxmlTree2MsrTranslator::visitStart ( S_cancel& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_cancel" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentKeyCancelFifths = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_fifths& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fifths" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentKeyKind = msrKey::kTraditionalKind; - - fCurrentKeyFifths = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_mode& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_mode" << - ", line " << inputLineNumber << - endl; - } -#endif - - string mode = elt->getValue(); - - if (mode == "major") { - fCurrentKeyModeKind = msrKey::kMajorMode; - } - else if (mode == "minor") { - fCurrentKeyModeKind = msrKey::kMinorMode; - } - else if (mode == "ionian") { - fCurrentKeyModeKind = msrKey::kIonianMode; - } - else if (mode == "dorian") { - fCurrentKeyModeKind = msrKey::kDorianMode; - } - else if (mode == "phrygian") { - fCurrentKeyModeKind = msrKey::kPhrygianMode; - } - else if (mode == "lydian") { - fCurrentKeyModeKind = msrKey::kLydianMode; - } - else if (mode == "mixolydian") { - fCurrentKeyModeKind = msrKey::kMixolydianMode; - } - else if (mode == "aeolian") { - fCurrentKeyModeKind = msrKey::kAeolianMode; - } - else if (mode == "locrian") { - fCurrentKeyModeKind = msrKey::kLocrianMode; - } - else { - stringstream s; - - s << - "mode " << mode << " is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_key_step& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_key_step" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fCurrentHumdrumScotKeyItem) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "Humdrum/Scot key step found while another one is being handled"); - } - - fCurrentKeyKind = msrKey::kHumdrumScotKind; - - string step = elt->getValue(); - - // check the step value - checkStep ( - inputLineNumber, - step); - - // determine diatonic pitch - msrDiatonicPitchKind keyDiatonicPitchKind = - msrDiatonicPitchKindFromString (step [0]); - - // create the Humdrum/Scot item - fCurrentHumdrumScotKeyItem = - msrHumdrumScotKeyItem::create ( - inputLineNumber); - - // populate it with the diatonic pitch - fCurrentHumdrumScotKeyItem-> - setKeyItemDiatonicPitchKind ( - keyDiatonicPitchKind); - - // insert it into the items vector - fCurrentHumdrumScotKeyItemsVector. - insert ( - fCurrentHumdrumScotKeyItemsVector.end (), - fCurrentHumdrumScotKeyItem); -} - -void mxmlTree2MsrTranslator::visitStart ( S_key_alter& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_key_alter" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (! fCurrentHumdrumScotKeyItem) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "Humdrum/Scot key alter found while no key step is being handled"); - } - - float keyAlter = (float)(*elt); - - // determine the alteration - msrAlterationKind - keyAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - keyAlter); - - if (keyAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "key alter '" << keyAlter << "'" - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // complement the current Humdrum/Scot item with the alteration - fCurrentHumdrumScotKeyItem-> - setKeyItemAlterationKind ( - keyAlterationKind); - - // forget about this item - fCurrentHumdrumScotKeyItem = nullptr; -} - -void mxmlTree2MsrTranslator::visitStart ( S_key_octave& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_key_octave" << - ", line " << inputLineNumber << - endl; - } -#endif - - int keyOctave = (int)(*elt); - - int number = elt->getAttributeIntValue ("number", 0); - -/* JMI -If the cancel attribute is - set to yes, then this number refers to an element specified - by the cancel element. It is no by default. -*/ - - // fetch Humdrum/Scot item with 'number' in the vector - S_msrHumdrumScotKeyItem item; - - try { - // indices start at 0 - item = fCurrentHumdrumScotKeyItemsVector [number - 1]; - } - catch (int e) { - stringstream s; - - s << - "item " << number << - " not found in Humdrum/Scot key items" << - endl << - "An exception number " << e << " occurred"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (! item) { // JMI - - fLogOutputStream << "----------------" << endl; - int counter = 0; - for ( - vector::const_iterator i= - fCurrentHumdrumScotKeyItemsVector.begin (); - i!=fCurrentHumdrumScotKeyItemsVector.end (); - i++ - ) { - fLogOutputStream << - ++counter << ": " << (*i) << - endl; - } // for - fLogOutputStream << "----------------" << endl; - - stringstream s; - - s << - "item " << number << - " not found in Humdrum/Scot key items"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // complement the item with the octave - item-> - setKeyItemOctave ( - keyOctave); -} - -void mxmlTree2MsrTranslator::visitEnd ( S_key& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_key" << - ", line " << inputLineNumber << - endl; - } -#endif - - // handle key - S_msrKey key; - - switch (fCurrentKeyKind) { - case msrKey::kTraditionalKind: - key = - handleTraditionalKey (inputLineNumber); - break; - - case msrKey::kHumdrumScotKind: - key = - handleHumdrumScotKey (inputLineNumber); - break; - } // switch - - // register key in part or staff - if (fCurrentKeyStaffNumber == 0) - fCurrentPart-> - appendKeyToPart (key); - - else { - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, fCurrentKeyStaffNumber); - - staff-> - appendKeyToStaff (key); - } -} - -S_msrKey mxmlTree2MsrTranslator::handleTraditionalKey ( - int inputLineNumber) -{ - // key fifths number - msrQuarterTonesPitchKind - keyTonicPitchKind = - k_NoQuarterTonesPitch_QTP; - - switch (fCurrentKeyFifths) { - case 0: - keyTonicPitchKind = kC_Natural_QTP; - break; - case 1: - keyTonicPitchKind = kG_Natural_QTP; - break; - case 2: - keyTonicPitchKind = kD_Natural_QTP; - break; - case 3: - keyTonicPitchKind = kA_Natural_QTP; - break; - case 4: - keyTonicPitchKind = kE_Natural_QTP; - break; - case 5: - keyTonicPitchKind = kB_Natural_QTP; - break; - case 6: - keyTonicPitchKind = kF_Sharp_QTP; - break; - case 7: - keyTonicPitchKind = kC_Sharp_QTP; - break; - - case 8: // JMI - keyTonicPitchKind = kG_Sharp_QTP; - break; - case 9: - keyTonicPitchKind = kD_Sharp_QTP; - break; - case 10: - keyTonicPitchKind = kA_Sharp_QTP; - break; - case 11: - keyTonicPitchKind = kE_Sharp_QTP; - break; - - case -1: - keyTonicPitchKind = kF_Natural_QTP; - break; - case -2: - keyTonicPitchKind = kB_Flat_QTP; - break; - case -3: - keyTonicPitchKind = kE_Flat_QTP; - break; - case -4: - keyTonicPitchKind = kA_Flat_QTP; - break; - case -5: - keyTonicPitchKind = kD_Flat_QTP; - break; - case -6: - keyTonicPitchKind = kG_Flat_QTP; - break; - case -7: - keyTonicPitchKind = kC_Flat_QTP; - break; - - case -8: // JMI - keyTonicPitchKind = kF_Flat_QTP; - break; - case -9: - keyTonicPitchKind = kB_DoubleFlat_QTP; - break; - case -10: - keyTonicPitchKind = kE_DoubleFlat_QTP; - break; - case -11: - keyTonicPitchKind = kA_DoubleFlat_QTP; - break; - - default: // unknown key sign!! - { - stringstream s; - - s << - "unknown key fifths number \"" << fCurrentKeyFifths << "\""; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } // switch - - // create the key - S_msrKey - key = - msrKey::createTraditional ( - inputLineNumber, - keyTonicPitchKind, - fCurrentKeyModeKind, - fCurrentKeyCancelFifths); - - // return it - return key; -} - -S_msrKey mxmlTree2MsrTranslator::handleHumdrumScotKey ( - int inputLineNumber) -{ - // msrQuarterTonesPitch fCurrentNoteQuarterTonesPitch; // JMI BOF - - fCurrentNoteQuarterTonesPitchKind = - quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - inputLineNumber, - fCurrentNoteDiatonicPitchKind, - fCurrentNoteAlterationKind); - - // create the key - S_msrKey - key = - msrKey::createHumdrumScot ( - inputLineNumber); - - // populate the key with the Humdrum/Scot items - if (fCurrentHumdrumScotKeyItemsVector.size ()) { - for ( - vector::const_iterator i= - fCurrentHumdrumScotKeyItemsVector.begin (); - i!=fCurrentHumdrumScotKeyItemsVector.end (); - i++ - ) { - key-> - appendHumdrumScotKeyItem ((*i)); - } // for - - fCurrentHumdrumScotKeyItemsVector.clear (); - } - - else - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "Humdrum/Scot key is empty"); - - // return it - return key; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_time& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_time" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentTimeStaffNumber = - elt->getAttributeIntValue ("number", 0); - - string timeSymbol = - elt->getAttributeValue ("symbol"); - - fCurrentTimeSymbolKind = - msrTime::kTimeSymbolNone; // default value - - if (timeSymbol == "common") { - fCurrentTimeSymbolKind = msrTime::kTimeSymbolCommon; - } - else if (timeSymbol == "cut") { - fCurrentTimeSymbolKind = msrTime::kTimeSymbolCut; - } - else if (timeSymbol == "note") { - fCurrentTimeSymbolKind = msrTime::kTimeSymbolNote; - } - else if (timeSymbol == "dotted-note") { - fCurrentTimeSymbolKind = msrTime::kTimeSymbolDottedNote; - } - else if (timeSymbol == "single-number") { - fCurrentTimeSymbolKind = msrTime::kTimeSymbolSingleNumber; - } - - else { - if (timeSymbol.size ()) { - stringstream s; - - s << - "time symbol " << timeSymbol << " is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - fCurrentTimeBeats = ""; - - fOnGoingInterchangeable = false; -} - -void mxmlTree2MsrTranslator::visitStart ( S_beats& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_beats" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentTimeBeats = elt->getValue (); // can be a string such as 3+2 -} - -void mxmlTree2MsrTranslator::visitStart ( S_beat_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_beat_type" << - ", line " << inputLineNumber << - endl; - } -#endif - - int beatType = (int)(*elt); - - // extract the numbers list from the beat type - list - beatNumbers = - extractNumbersFromString ( - fCurrentTimeBeats, // may contain "1+5+3" - false); // 'true' to debug it - - // create the time item - S_msrTimeItem - timeItem = - msrTimeItem::create ( - inputLineNumber); - - // populate it - if (beatNumbers.size ()) { - // append the beats numbers to the time item - for ( - list::const_iterator i = beatNumbers.begin (); - i != beatNumbers.end (); - i++ - ) { - timeItem-> - appendBeatsNumber ((*i)); - } // for - - // set the time item beat type - timeItem-> - setTimeBeatValue (beatType); - } - - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "beat type doesn't contain any beats numbers"); - } - - // append the time item to the current time items vector - fCurrentTimeItemsVector.insert ( - fCurrentTimeItemsVector.end (), - timeItem); -} - -void mxmlTree2MsrTranslator::visitStart ( S_senza_misura& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_senza_misura" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentTimeSymbolKind = msrTime::kTimeSymbolSenzaMisura; -} - -void mxmlTree2MsrTranslator::visitStart ( S_interchangeable& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_interchangeable" << - ", line " << inputLineNumber << - endl; - } -#endif - - string interchangeableSymbol = - elt->getAttributeValue ("symbol"); - - fCurrentInterchangeableSymbolKind = - msrTime::kTimeSymbolNone; // default value - - if (interchangeableSymbol == "common") { - fCurrentInterchangeableSymbolKind = msrTime::kTimeSymbolCommon; - } - else if (interchangeableSymbol == "cut") { - fCurrentInterchangeableSymbolKind = msrTime::kTimeSymbolCut; - } - else if (interchangeableSymbol == "note") { - fCurrentInterchangeableSymbolKind = msrTime::kTimeSymbolNote; - } - else if (interchangeableSymbol == "dotted-note") { - fCurrentInterchangeableSymbolKind = msrTime::kTimeSymbolDottedNote; - } - else if (interchangeableSymbol == "single-number") { - fCurrentInterchangeableSymbolKind = msrTime::kTimeSymbolSingleNumber; - } - - else { - if (interchangeableSymbol.size ()) { - stringstream s; - - s << - "interchangeable symbol " << interchangeableSymbol << " is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - string interchangeableSeparator = - elt->getAttributeValue ("separator"); - - fCurrentInterchangeableSeparatorKind = - msrTime::kTimeSeparatorNone; // default value - - if (interchangeableSymbol == "none") { - fCurrentInterchangeableSeparatorKind = msrTime::kTimeSeparatorNone; - } - else if (interchangeableSymbol == "horizontal") { - fCurrentInterchangeableSeparatorKind = msrTime::kTimeSeparatorHorizontal; - } - else if (interchangeableSymbol == "diagonal") { - fCurrentInterchangeableSeparatorKind = msrTime::kTimeSeparatorDiagonal; - } - else if (interchangeableSymbol == "vertical") { - fCurrentInterchangeableSeparatorKind = msrTime::kTimeSeparatorVertical; - } - else if (interchangeableSymbol == "adjacent") { - fCurrentInterchangeableSeparatorKind = msrTime::kTimeSeparatorAdjacent; - } - - else { - if (interchangeableSymbol.size ()) { - stringstream s; - - s << - "interchangeable symbol " << interchangeableSymbol << " is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - fOnGoingInterchangeable = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_time_relation& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_time_relation" << - ", line " << inputLineNumber << - endl; - } -#endif - - string timeRelation = elt->getValue (); - - fCurrentInterchangeableRelationKind = - msrTime::kTimeRelationNone; // default value - - if (timeRelation == "parentheses") { - fCurrentInterchangeableRelationKind = msrTime::kTimeRelationParentheses; - } - else if (timeRelation == "bracket") { - fCurrentInterchangeableRelationKind = msrTime::kTimeRelationBracket; - } - else if (timeRelation == "equals") { - fCurrentInterchangeableRelationKind = msrTime::kTimeRelationEquals; - } - else if (timeRelation == "slash") { - fCurrentInterchangeableRelationKind = msrTime::kTimeRelationSlash; - } - else if (timeRelation == "space") { - fCurrentInterchangeableRelationKind = msrTime::kTimeRelationSpace; - } - else if (timeRelation == "hyphen") { - fCurrentInterchangeableRelationKind = msrTime::kTimeRelationHyphen; - } - - else { - if (timeRelation.size ()) { - stringstream s; - - s << - "time-relation " << timeRelation << " is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } -} - -void mxmlTree2MsrTranslator::visitEnd ( S_time& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_time" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the time - fCurrentTime = - msrTime::create ( - inputLineNumber, - fCurrentTimeSymbolKind); - - // populate the time with the time items - if (fCurrentTimeItemsVector.size ()) { - for ( - vector::const_iterator i = - fCurrentTimeItemsVector.begin (); - i!=fCurrentTimeItemsVector.end (); - i++ - ) { - fCurrentTime-> - appendTimeItem ((*i)); - } // for - - fCurrentTimeItemsVector.clear (); - } - - else { - // only a 'semza misura' time may be empty - if ( fCurrentTimeSymbolKind != msrTime::kTimeSymbolSenzaMisura) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "time is empty"); - } - } - - // register time in part or staff - if (fCurrentTimeStaffNumber == 0) - fCurrentPart-> - appendTimeToPart (fCurrentTime); - - else { - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, fCurrentTimeStaffNumber); - - staff-> - appendTimeToStaff (fCurrentTime); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_instruments& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_time" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - 2 -*/ - -// int instruments = (int)(*elt); // JMI -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_transpose& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_transpose" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentTransposeNumber = elt->getAttributeIntValue ("number", 0); - - fCurrentTransposeDiatonic = 0; - fCurrentTransposeChromatic = 0; - fCurrentTransposeOctaveChange = 0; - fCurrentTransposeDouble = false; -} - -void mxmlTree2MsrTranslator::visitStart ( S_diatonic& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_diatonic" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentTransposeDiatonic = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_chromatic& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_chromatic" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentTransposeChromatic = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_octave_change& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting octave_change" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentTransposeOctaveChange = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_double& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting double" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentTransposeDouble = true; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_transpose& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_transpose" << - ", line " << inputLineNumber << - endl; - } -#endif - - // bring the transpose chromatic value in the -11..+11 interval - if (fCurrentTransposeChromatic < -11) { - int - auxTransposeChromatic = - fCurrentTransposeChromatic, - octaveOffset = 0; - - while (auxTransposeChromatic < -11) { - auxTransposeChromatic += 12; - octaveOffset++; - } // while - - stringstream s; - - s << - "transpose: augmenting chromatic " << - fCurrentTransposeChromatic << - " to " << auxTransposeChromatic << - " and decrementing octave change by " << octaveOffset; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - fCurrentTransposeChromatic = auxTransposeChromatic; - fCurrentTransposeOctaveChange -= octaveOffset; - } - - else if (fCurrentTransposeChromatic > 11) { - int - auxTransposeChromatic = - fCurrentTransposeChromatic, - octaveOffset = 0; - - while (auxTransposeChromatic > 11) { - auxTransposeChromatic -= 12; - octaveOffset++; - } // while - - stringstream s; - - s << - "transpose: diminishing chromatic to " << - fCurrentTransposeChromatic << - " to " << auxTransposeChromatic << - " and incrementing octave change by " << octaveOffset; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - fCurrentTransposeChromatic = auxTransposeChromatic; - fCurrentTransposeOctaveChange += octaveOffset; - } - - // create msrTranspose - S_msrTranspose - transpose = - msrTranspose::create ( - inputLineNumber, - fCurrentTransposeDiatonic, - fCurrentTransposeChromatic, - fCurrentTransposeOctaveChange, - fCurrentTransposeDouble); - - if (fCurrentTransposeNumber == 0) - fCurrentPart-> - appendTransposeToPart (transpose); - - else { - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, fCurrentTransposeNumber); - - staff-> - appendTransposeToStaff (transpose); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_direction& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_direction" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - fCurrentDirectionPlacementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - fCurrentDirectionStaffNumber = 1; // it may be absent - // no possible in ??? JMI - // fCurrentDirectionVoiceNumber = 1; // it may be absent - - fCurrentMetronomeTempo = nullptr; - - fOnGoingDirection = true; -} - -void mxmlTree2MsrTranslator::visitEnd (S_direction& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_direction" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fCurrentMetronomeTempo) { - int pendingWordsSize = fPendingWordsList.size (); - - if (pendingWordsSize) { - while (fPendingWordsList.size ()) { - S_msrWords - words = - fPendingWordsList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "Attaching words '" << - words->asString () << - "' to metronome tempo '" << - fCurrentMetronomeTempo->asString () << "'" << - endl; - } -#endif - - fCurrentMetronomeTempo-> - appendWordsToTempo (words); - - // forget about this words - fPendingWordsList.pop_front(); - } // while - - // append the tempo to the pending tempos list - fPendingTemposList.push_back (fCurrentMetronomeTempo); - - fCurrentMetronomeTempo = nullptr; - } - } - - fOnGoingDirection = false; -} - -void mxmlTree2MsrTranslator::visitStart (S_direction_type& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_direction_type" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingDirectionType = true; // JMI -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_offset& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_offset" << - ", line " << inputLineNumber << - endl; - } -#endif - - int offsetValue = (int)(*elt); - - // set offset whole notes - rational - offsetWholeNotesFromDuration = - rational ( - offsetValue, - fCurrentDivisionsPerQuarterNote * 4); // hence a whole note - offsetWholeNotesFromDuration.rationalise (); - - // sound - - string offsetSound =elt->getAttributeValue ("sound"); - - bool offsetSoundValue; // JMI - - if (offsetSound.size ()) { - if (offsetSound == "yes") - offsetSoundValue = true; - - else if (offsetSound == "no") - offsetSoundValue = false; - - else { - stringstream s; - - s << - "offset sound value " << offsetSound << - " should be 'yes' or 'no'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - if (false && offsetSoundValue) { - // JMI - } - - if (fOnGoingDirection) { // JMI - } - - else if (fOnGoingHarmony) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Harmony offset \"" << offsetValue << "\"" << - ", represents = \'" << - offsetWholeNotesFromDuration << - "\' whole notes" << - endl; - } -#endif - - fCurrentHarmonyWholeNotesOffset = - offsetWholeNotesFromDuration; - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_octave_shift& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_octave_shift" << - ", line " << inputLineNumber << - endl; - } -#endif - - // size - - string octaveShiftSizeString = elt->getAttributeValue ("size"); - int octaveShiftSize = 8; - - if (! octaveShiftSizeString.size ()) { - stringstream s; - - s << - "octave shift size absent, assuming 8"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - else { - istringstream inputStream (octaveShiftSizeString); - - inputStream >> octaveShiftSize; - - if ( - octaveShiftSize != 8 - && - octaveShiftSize != 15 - /* JMI allow larger values??? - && - octaveShiftSize != 22 - && - octaveShiftSize != 27 - */ - ) { - stringstream s; - - s << - "octave-shift size \"" << octaveShiftSize << - // JMI "\" should be 8, 15, 22 or 27"; - "\" is wrong, should be 8 or 15, replaced by 8"; - - // JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - - octaveShiftSize = 8; - } - - // type - - string type = elt->getAttributeValue ("type"); - - msrOctaveShift::msrOctaveShiftKind - octaveShiftKind = msrOctaveShift::kOctaveShiftNone; - - if (type == "up") - octaveShiftKind = msrOctaveShift::kOctaveShiftUp; - else if (type == "down") - octaveShiftKind = msrOctaveShift::kOctaveShiftDown; - else if (type == "stop") - octaveShiftKind = msrOctaveShift::kOctaveShiftStop; - else if (type == "continue") - octaveShiftKind = msrOctaveShift::kOctaveShiftContinue; - - else { - stringstream s; - - s << - "octave-shift type \"" << type << - "\"" << "is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create an octave shift - S_msrOctaveShift - octaveShift = - msrOctaveShift::create ( - inputLineNumber, - octaveShiftKind, - octaveShiftSize); - - // append the octave shift to the pending octave shifts list - fPendingOctaveShiftsList.push_back (octaveShift); -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_words& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_words" << - ", line " << inputLineNumber << - endl; - } -#endif - - string wordsValue = elt->getValue (); - - // justify - string wordsJustifyString = elt->getAttributeValue ("justify"); - - msrJustifyKind - justifyKind = - msrJustifyKindFromString ( - inputLineNumber, - wordsJustifyString); - - // halign - string wordsHorizontalAlignmentString = elt->getAttributeValue ("halign"); - - msrHorizontalAlignmentKind - horizontalAlignmentKind = - msrHorizontalAlignmentKindFromString ( - inputLineNumber, - wordsHorizontalAlignmentString); - - // valign - string wordsVerticalAlignmentString = elt->getAttributeValue ("valign"); - - msrVerticalAlignmentKind - verticalAlignmentKind = - msrVerticalAlignmentKindFromString ( - inputLineNumber, - wordsVerticalAlignmentString); - - // font style - string wordsFontStyleString = elt->getAttributeValue ("font-style"); - - msrFontStyleKind fontStyleKind = kFontStyleNone; // default value - - if (wordsFontStyleString == "normal") - fontStyleKind = kFontStyleNormal; - else if (wordsFontStyleString == "italic") - fontStyleKind = KFontStyleItalic; - else { - if (wordsFontStyleString.size ()) { - stringstream s; - - s << - "font-style value " << wordsFontStyleString << - " should be 'normal' or 'italic'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // font size - string wordsFontSizeString = elt->getAttributeValue ("font-size"); - - msrFontSize::msrFontSizeKind - fontSizeKind = - msrFontSize::kFontSizeNone; // default value - - float fontSizeFloatValue = 0.0; - - if (wordsFontSizeString == "xx-smal") - fontSizeKind = msrFontSize::kFontSizeXXSmall; - else if (wordsFontSizeString == "x-small") - fontSizeKind = msrFontSize::kFontSizeXSmall; - else if (wordsFontSizeString == "small") - fontSizeKind = msrFontSize::kFontSizeSmall; - else if (wordsFontSizeString == "medium") - fontSizeKind = msrFontSize::kFontSizeMedium; - else if (wordsFontSizeString == "large") - fontSizeKind = msrFontSize::kFontSizeLarge; - else if (wordsFontSizeString == "x-large") - fontSizeKind = msrFontSize::kFontSizeXLarge; - else if (wordsFontSizeString == "xx-large") - fontSizeKind = msrFontSize::kFontSizeXXLarge; - else { - fontSizeFloatValue = - elt->getAttributeFloatValue ("font-size", 0.0); - fontSizeKind = msrFontSize::kFontSizeNumeric; - } - - S_msrFontSize fontSize; - - switch (fontSizeKind) { - case msrFontSize::kFontSizeNone: - case msrFontSize::kFontSizeXXSmall: - case msrFontSize::kFontSizeXSmall: - case msrFontSize::kFontSizeSmall: - case msrFontSize::kFontSizeMedium: - case msrFontSize::kFontSizeLarge: - case msrFontSize::kFontSizeXLarge: - case msrFontSize::kFontSizeXXLarge: - fontSize = - msrFontSize::create (fontSizeKind); - break; - - case msrFontSize::kFontSizeNumeric: - fontSize = - msrFontSize::create (fontSizeFloatValue); - break; - } // switch - - // font weight - string wordsFontWeightString = elt->getAttributeValue ("font-weight"); - - msrFontWeightKind fontWeightKind = kFontWeightNone; // default value - - if (wordsFontWeightString == "normal") - fontWeightKind = kFontWeightNormal; - else if (wordsFontWeightString == "bold") - fontWeightKind = kFontWeightBold; - else { - if (wordsFontWeightString.size ()) { - stringstream s; - - s << - "font-weight value " << wordsFontWeightString << - " should be 'normal' or 'bold'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // XMLLang - string wordsXMLLangString = elt->getAttributeValue ("xml:lang"); - - msrXMLLangKind - wordsXMLLangKind = - msrXMLLangKindFromString ( - inputLineNumber, - wordsXMLLangString); - - if (! gMsrOah->fOmitWords) { - // create the words - if (wordsValue.size ()) { - #ifdef TRACE_OAH - if (gTraceOah->fTraceWords) { - fLogOutputStream << - "Creating words \"" << wordsValue << "\"" << - ", placement = \"" << - msrPlacementKindAsString ( - fCurrentDirectionPlacementKind) << "\"" << - endl; - } - #endif - - S_msrWords - words = - msrWords::create ( - inputLineNumber, - fCurrentDirectionPlacementKind, - wordsValue, - justifyKind, - horizontalAlignmentKind, - verticalAlignmentKind, - fontStyleKind, - fontSize, - fontWeightKind, - wordsXMLLangKind); - - fPendingWordsList.push_back (words); - } - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_accordion_registration& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accordion_registration" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - - - - - 5 - - - - -*/ - - fCurrentAccordionHigh = 0; - fCurrentAccordionMiddle = 0; - fCurrentAccordionLow = 0; - - fCurrentAccordionNumbersCounter = 0; -} - -void mxmlTree2MsrTranslator::visitStart ( S_accordion_high& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accordion_high" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentAccordionHigh = 1; - - fCurrentAccordionNumbersCounter++; -} - -void mxmlTree2MsrTranslator::visitStart ( S_accordion_middle& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accordion_middle" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentAccordionMiddle = (int)(*elt); - - if (fCurrentAccordionMiddle < 1 || fCurrentAccordionMiddle > 3) { - stringstream s; - - s << - "accordion middle " << - fCurrentAccordionMiddle << " should be 1, 2 or 3" << - ", replaced by 1"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - fCurrentAccordionMiddle = 1; - } - - fCurrentAccordionNumbersCounter++; -} - -void mxmlTree2MsrTranslator::visitStart ( S_accordion_low& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accordion_low" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentAccordionLow = 1; - - fCurrentAccordionNumbersCounter++; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_accordion_registration& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_accordion_registration" << - ", line " << inputLineNumber << - endl; - } -#endif - - // An accordion-registration element needs to have - // at least one of the child elements present - - if (fCurrentAccordionNumbersCounter == 0) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "accordion-registration has 0 child element, ignoring it"); - } - - else { - // create the accordion registration - S_msrAccordionRegistration - accordionRegistration = - msrAccordionRegistration::create ( - inputLineNumber, - fCurrentAccordionHigh, - fCurrentAccordionMiddle, - fCurrentAccordionLow); - - // append it to the current part - fCurrentPart-> - appendAccordionRegistrationToPart ( - accordionRegistration); - } -} - -void mxmlTree2MsrTranslator::visitEnd (S_direction_type& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_direction_type" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingDirectionType = false; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_metronome& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_metronome" << - ", line " << inputLineNumber << - endl; - } -#endif - - string parentheses = elt->getAttributeValue ("parentheses"); - - // JMI fCurrentMetronomeParenthesedKind default value? - - if (parentheses.size ()) { - if (parentheses == "yes") - fCurrentMetronomeParenthesedKind = msrTempo::kTempoParenthesizedYes; - else if (parentheses == "no") - fCurrentMetronomeParenthesedKind = msrTempo::kTempoParenthesizedNo; - else { - stringstream s; - - s << - "parentheses value " << parentheses << - " should be 'yes' or 'no'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - fCurrentMetronomeBeatUnitsVector.clear(); - - fCurrentMetrenomePerMinute = ""; - - fCurrentMetrenomeDotsNumber = 0; - fCurrentMetrenomeRelationKind = msrTempo::kTempoRelationNone; - fCurrentMetronomeDurationKind = k_NoDuration; - fCurrentMetronomeBeamValue = ""; - - fOnGoingMetronomeTuplet = false; - fCurrentMetrenomeNormalDotsNumber = 0; - - fCurrentMetronomeRelationLeftElements = nullptr; - fCurrentMetronomeRelationRightElements = nullptr; - - fCurrentMetronomeTuplet = nullptr; -} - -void mxmlTree2MsrTranslator::visitStart ( S_beat_unit& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_beat_unit" << - ", line " << inputLineNumber << - endl; - } -#endif - - string beatUnitString = elt->getValue(); - - // the type contains a display duration - msrDurationKind - beatUnitDurationKind = - msrDurationKindFromString ( - inputLineNumber, - beatUnitString); - - // there can be several in a markup, - // register beat unit in in dotted durations list - fCurrentMetronomeBeatUnitsVector.push_back ( - msrDottedDuration ( - beatUnitDurationKind, - 0)); -} - -void mxmlTree2MsrTranslator::visitStart ( S_beat_unit_dot& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_beat_unit_dot" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fCurrentMetronomeBeatUnitsVector.size ()) { - fCurrentMetronomeBeatUnitsVector.back ().incrDotsNumber (); - } - else { - stringstream s; - - s << - "beat unit dot occurs without prior beat unit"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_per_minute& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_per_minute" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMetrenomePerMinute = elt->getValue (); -} - -void mxmlTree2MsrTranslator::visitStart ( S_metronome_note& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_metronome_note" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingMetronomeNote = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_metronome_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_metronome_type" << - ", line " << inputLineNumber << - endl; - } -#endif - - string noteType = elt->getValue(); - - // the type contains a display duration, - fCurrentMetronomeDurationKind = - msrDurationKindFromString ( - inputLineNumber, - noteType); -} - -void mxmlTree2MsrTranslator::visitStart ( S_metronome_dot& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_metronome_dot" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMetrenomeDotsNumber++; -} - -void mxmlTree2MsrTranslator::visitStart ( S_metronome_beam& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_metronome_beam" << - ", line " << inputLineNumber << - endl; - } -#endif - - // value - - fCurrentMetronomeBeamValue = elt->getValue(); - - msrBeam::msrBeamKind beamKind = msrBeam::k_NoBeam; - - if (fCurrentMetronomeBeamValue == "begin") { - beamKind = msrBeam::kBeginBeam; - } - else if (fCurrentMetronomeBeamValue == "continue") { - beamKind = msrBeam::kContinueBeam; - } - else if (fCurrentMetronomeBeamValue == "end") { - beamKind = msrBeam::kEndBeam; - } - else if (fCurrentMetronomeBeamValue == "forward hook") { - beamKind = msrBeam::kForwardHookBeam; - } - else if (fCurrentMetronomeBeamValue == "backward hook") { - beamKind = msrBeam::kBackwardHookBeam; - } - else { - stringstream s; - - s << - "metronome beam \"" << fCurrentMetronomeBeamValue << - "\"" << "is not known"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // number - - fCurrentBeamNumber = - elt->getAttributeIntValue ("number", 0); - - // create metronome note beam - S_msrBeam - beam = - msrBeam::create ( - inputLineNumber, - fCurrentBeamNumber, - beamKind); - - // register it - fPendingMetronomeBeamsList.push_back (beam); -} - -void mxmlTree2MsrTranslator::attachCurrentMetronomeBeamsToMetronomeNote ( - S_msrTempoNote tempoNote) -{ - // attach the current articulations if any to the note - if (fPendingMetronomeBeamsList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos || gTraceOah->fTraceBeams) { - fLogOutputStream << - "Attaching current beams to tempoNote " << - tempoNote->asString () << - endl; - } -#endif - - while (fPendingMetronomeBeamsList.size ()) { - S_msrBeam - beam = - fPendingMetronomeBeamsList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos || gTraceOah->fTraceBeams) { - fLogOutputStream << - "Attaching beam '" << - beam->asString () << - "' to tempoNote '" << tempoNote->asString () << "'" << - endl; - } -#endif - - tempoNote-> - appendBeamToTempoNote (beam); - - // forget about this articulation - fPendingMetronomeBeamsList.pop_front(); - } // while - } -} - -void mxmlTree2MsrTranslator::visitEnd ( S_metronome_note& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_metronome_note" << - ", line " << inputLineNumber << - endl; - } -#endif - - // convert metronome note duration into whole notes - fCurrentMetronomeNoteWholeNotesFromMetronomeType = - msrDurationKindAsWholeNotes ( - fCurrentMetronomeDurationKind); - - // take metronome dots into account if any - if (fCurrentNoteDotsNumber > 0) { - int dots = fCurrentMetrenomeDotsNumber; - - while (dots > 0) { - fCurrentMetronomeNoteWholeNotesFromMetronomeType *= - rational (3, 2); - fCurrentMetronomeNoteWholeNotesFromMetronomeType.rationalise (); - - dots--; - } // while - } - - // create the metronome note - S_msrTempoNote - tempoNote = - msrTempoNote::create ( - inputLineNumber, - fCurrentMetronomeNoteWholeNotesFromMetronomeType, - false /* tempoNoteBelongsToATuplet JMI */); - - // attach beams if any to metronome note - if (fPendingMetronomeBeamsList.size ()) { - attachCurrentMetronomeBeamsToMetronomeNote ( - tempoNote); - } - - if (fCurrentMetronomeTuplet) { - // register metronome note as metronome tuplet member - - fCurrentMetronomeTuplet-> - addTempoNoteToTempoTuplet ( - tempoNote); - } - - else { - // register stand-alone metronome note - - if (fCurrentMetrenomeRelationKind == msrTempo::kTempoRelationNone) { - // this metronome note belongs to the left elements list - - if (! fCurrentMetronomeRelationLeftElements) { - // create the relation left elements - fCurrentMetronomeRelationLeftElements = - msrTempoRelationshipElements::create ( - inputLineNumber, - msrTempoRelationshipElements::kTempoRelationshipElementsLeft); - } - - fCurrentMetronomeRelationLeftElements-> - addElementToTempoRelationshipElements ( - tempoNote); - } - else { - // this metronome note belongs to the right elements list - - if (! fCurrentMetronomeRelationRightElements) { - // create the relation right elements - fCurrentMetronomeRelationRightElements = - msrTempoRelationshipElements::create ( - inputLineNumber, - msrTempoRelationshipElements::kTempoRelationshipElementsRight); - } - - fCurrentMetronomeRelationRightElements-> - addElementToTempoRelationshipElements ( - tempoNote); - } - } - - fOnGoingMetronomeNote = false; -} - -void mxmlTree2MsrTranslator::visitStart ( S_metronome_relation& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_metronome_relation" << - ", line " << inputLineNumber << - endl; - } -#endif - - string metrenomeRelation = elt->getValue (); - - fCurrentMetrenomeRelationKind = msrTempo::kTempoRelationNone; - - if (metrenomeRelation == "equals") { - fCurrentMetrenomeRelationKind = msrTempo::kTempoRelationEquals; } - else { - stringstream s; - - s << - "metronome relation \"" << metrenomeRelation << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_metronome_tuplet& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_metronome_tuplet" << - ", line " << inputLineNumber << - endl; - } -#endif - - // number - - fCurrentTupletNumber = elt->getAttributeIntValue ("number", 0); - - // bracket - - { - string tupletBracket = elt->getAttributeValue ("bracket"); - - fCurrentTempoTupletBracketKind = msrTempoTuplet::kTempoTupletBracketYes; // option ??? JMI - - if (tupletBracket == "yes") - fCurrentTempoTupletBracketKind = msrTempoTuplet::kTempoTupletBracketYes; - else if (tupletBracket == "no") - fCurrentTempoTupletBracketKind = msrTempoTuplet::kTempoTupletBracketNo; - else { - if (tupletBracket.size ()) { - stringstream s; - - s << - "tuplet bracket \"" << tupletBracket << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - stringstream s; - - s << - "tuplet bracket is empty: this is implementation dependent," << - " \"yes\" is assumed"; // option ??? JMI - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - } - } - } - - // type - - { - string tupletType = elt->getAttributeValue ("type"); - - fCurrentTempoTupletTypeKind = msrTempoTuplet::kTempoTupletTypeNone; - - if (tupletType == "start") - fCurrentTempoTupletTypeKind = msrTempoTuplet::kTempoTupletTypeStart; - else if (tupletType == "stop") - fCurrentTempoTupletTypeKind = msrTempoTuplet::kTempoTupletTypeStop; - else { - stringstream s; - - s << - "tuplet type \"" << tupletType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // show-number - - { - string tupletShowNumber = elt->getAttributeValue ("show-number"); - - fCurrentTempoTupletShowNumberKind = - msrTempoTuplet::kTempoTupletShowNumberActual; // default value - - if (tupletShowNumber == "actual") { - fCurrentTempoTupletShowNumberKind = msrTempoTuplet::kTempoTupletShowNumberActual; - } - else if (tupletShowNumber == "both") { - fCurrentTempoTupletShowNumberKind = msrTempoTuplet::kTempoTupletShowNumberBoth; - } - else if (tupletShowNumber == "none") { - fCurrentTempoTupletShowNumberKind = msrTempoTuplet::kTempoTupletShowNumberNone; - } - else { - if (tupletShowNumber.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "tuplet show-number \"" + tupletShowNumber + "\" is unknown"); - } - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "fCurrentTempoTupletTypeKind: " << - msrTempoTuplet::tempoTupletTypeKindAsString ( - fCurrentTempoTupletTypeKind) << - "fCurrentTempoTupletBracketKind: " << - msrTempoTuplet::tempoTupletBracketKindAsString ( - fCurrentTempoTupletBracketKind) << - "fCurrentTempoTupletShowNumberKind: " << - msrTempoTuplet::tempoTupletShowNumberKindAsString ( - fCurrentTempoTupletShowNumberKind) << - endl; - } -#endif - - fOnGoingMetronomeTuplet = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_normal_dot& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_normal_dot" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentMetrenomeNormalDotsNumber++; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_metronome_tuplet& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_metronome_tuplet" << - ", line " << inputLineNumber << - endl; - } -#endif - - switch (fCurrentTempoTupletTypeKind) { - case msrTempoTuplet::kTempoTupletTypeNone: - break; - - case msrTempoTuplet::kTempoTupletTypeStart: - // create metronome tuplet - fCurrentMetronomeTuplet = - msrTempoTuplet::create ( - inputLineNumber, - fCurrentTempoTupletNumber, - fCurrentTempoTupletBracketKind, - fCurrentTempoTupletShowNumberKind, - fCurrentMetronomeNoteActualNotes, - fCurrentMetronomeNoteNormalNotes, - fCurrentMetronomeNoteWholeNotesFromMetronomeType); - - // register the metronome tuplet - if (fCurrentMetrenomeRelationKind == msrTempo::kTempoRelationNone) { - // this metronome tuplet belongs to the left elements list - - if (! fCurrentMetronomeRelationLeftElements) { - // create the relation left elements - fCurrentMetronomeRelationLeftElements = - msrTempoRelationshipElements::create ( - inputLineNumber, - msrTempoRelationshipElements::kTempoRelationshipElementsLeft); - } - - fCurrentMetronomeRelationLeftElements-> - addElementToTempoRelationshipElements ( - fCurrentMetronomeTuplet); - } - else { - // this metronome tuplet belongs to the right elements list - - if (! fCurrentMetronomeRelationRightElements) { - // create the relation right elements - fCurrentMetronomeRelationRightElements = - msrTempoRelationshipElements::create ( - inputLineNumber, - msrTempoRelationshipElements::kTempoRelationshipElementsRight); - } - - fCurrentMetronomeRelationRightElements-> - addElementToTempoRelationshipElements ( - fCurrentMetronomeTuplet); - } - break; - - case msrTempoTuplet::kTempoTupletTypeStop: - // don't set fCurrentMetronomeTuplet to nullptr here, - // it will be needed for the current metronome note a bit later - break; - } // switch - - fOnGoingMetronomeTuplet = false; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_metronome& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_metronome" << - ", line " << inputLineNumber << - endl; - } -#endif - - // fCurrentMetronomeParenthesedKind ??? JMI - - // determine tempo kind - msrTempo::msrTempoKind tempoKind = msrTempo::k_NoTempoKind; - - int beatUnitsSize = fCurrentMetronomeBeatUnitsVector.size (); - bool perMinutePresent = fCurrentMetrenomePerMinute.size () > 0; - - if (beatUnitsSize == 1 && perMinutePresent) { - tempoKind = msrTempo::kTempoBeatUnitsPerMinute; - } - else if (beatUnitsSize == 2 && ! perMinutePresent) { - tempoKind = msrTempo::kTempoBeatUnitsEquivalence; - } - else if (fCurrentMetrenomeRelationKind != msrTempo::kTempoRelationNone) { - tempoKind = msrTempo::kTempoNotesRelationShip; - } - - if (tempoKind == msrTempo::k_NoTempoKind) { - stringstream s; - - s << - "ill-formed markup: there are " << - fCurrentMetronomeBeatUnitsVector.size () << - " beat units"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // create the tempo - switch (tempoKind) { - case msrTempo::k_NoTempoKind: - break; - - case msrTempo::kTempoBeatUnitsWordsOnly: - break; - - case msrTempo::kTempoBeatUnitsPerMinute: - { - msrDottedDuration - beatUnits = - fCurrentMetronomeBeatUnitsVector [0]; - - fCurrentMetronomeTempo = - msrTempo::create ( - inputLineNumber, - beatUnits, - fCurrentMetrenomePerMinute, - fCurrentMetronomeParenthesedKind, - fCurrentDirectionPlacementKind); - } - break; - - case msrTempo::kTempoBeatUnitsEquivalence: - { - msrDottedDuration - beatUnits = - fCurrentMetronomeBeatUnitsVector [0]; - - fCurrentMetronomeTempo = - msrTempo::create ( - inputLineNumber, - beatUnits, - fCurrentMetronomeBeatUnitsVector [1], - fCurrentMetronomeParenthesedKind, - fCurrentDirectionPlacementKind); - } - break; - - case msrTempo::kTempoNotesRelationShip: - fCurrentMetronomeTempo = - msrTempo::create ( - inputLineNumber, - fCurrentMetronomeRelationLeftElements, - fCurrentMetronomeRelationRightElements, - fCurrentMetronomeParenthesedKind, - fCurrentDirectionPlacementKind); - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "Creating tempo '" << - fCurrentMetronomeTempo->asString () << - "'" << - endl; - } -#endif - - // append metrenome words to tempo if any - S_msrWords tempoWords; - - int pendingWordsSize = fPendingWordsList.size (); - - if (pendingWordsSize) { - if (pendingWordsSize > 1) { - while (fPendingWordsList.size ()) { - S_msrWords - words = - fPendingWordsList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "Attaching words '" << - words->asString () << - "' to tempo '" << - fCurrentMetronomeTempo->asString () << "'" << - endl; - } -#endif - - fCurrentMetronomeTempo-> - appendWordsToTempo (words); - - // forget about this words - fPendingWordsList.pop_front(); - } // while - - - stringstream s; - - s << - " contains " << - pendingWordsSize << - " markups"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - while (fPendingWordsList.size ()) { - S_msrWords - words = - fPendingWordsList.front (); - - // append the words to the temp - fCurrentMetronomeTempo-> - appendWordsToTempo (words); - - // remove it from the list - fPendingWordsList.pop_front (); - } // while - } - -/* if (true) { // JMI -*/ - // append the tempo to the pending tempos list - fPendingTemposList.push_back (fCurrentMetronomeTempo); - /* -} -else { - // fetch current direction's voice - S_msrVoice - currentDirectionsVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentDirectionStaffNumber, - fCurrentDirectionVoiceNumber); - - // sanity check - msrAssert ( - currentDirectionsVoice != nullptr, - "currentDirectionsVoice is null"); - - // append the tempo to the voice - currentDirectionsVoice-> - appendTempoToVoice (fCurrentMetronomeTempo); - } - */ -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_staves& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_direction" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_staff& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentMusicXMLStaffNumber = int(*elt); - - // the staff number should be positive - if (fCurrentMusicXMLStaffNumber <= 0) { - stringstream s; - - s << - "staff number " << fCurrentMusicXMLStaffNumber << - " is not positive" << - ", line " << inputLineNumber; - - msrAssert (false, s.str ()); - } - - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, fCurrentMusicXMLStaffNumber); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - fLogOutputStream << - "--> S_staff, fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - endl << - "--> S_staff, current staff name = " << - staff->getStaffName() << - endl; - } -#endif - - if (fOnGoingForward) { - fCurrentForwardStaffNumber = fCurrentMusicXMLStaffNumber; - } - - else if (fOnGoingNote) { - // regular staff indication in note/rest, fine - } - - else if (fOnGoingDirection) { - fCurrentDirectionStaffNumber = fCurrentMusicXMLStaffNumber; - } - - else if (fOnGoingHarmony) { - fCurrentHarmonyStaffNumber = fCurrentMusicXMLStaffNumber; - } - - else { - stringstream s; - - s << "staff " << fCurrentMusicXMLStaffNumber << " is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_staff_details& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff_details" << - ", line " << inputLineNumber << - endl; - } -#endif - - // number - - fStaffDetailsStaffNumber = - elt->getAttributeIntValue ("number", 1); // default value is 1, as for clef - - // show-frets - - { - string showFrets = elt->getAttributeValue ("show-frets"); - - fCurrentShowFretsKind = - msrStaffDetails::kShowFretsNumbers; // default value - - if (showFrets == "numbers") { - - fCurrentShowFretsKind = - msrStaffDetails::kShowFretsNumbers; - - } - else if (showFrets == "letters") { - - fCurrentShowFretsKind = - msrStaffDetails::kShowFretsLetters; - - } - else { - if (showFrets.size ()) { - stringstream s; - - s << "show-frets " << showFrets << " unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // print-object - - string - printObjectString = - elt->getAttributeValue ("print-object"); - - fCurrentPrintObjectKind = - msrPrintObjectKindFromString ( - inputLineNumber, - printObjectString); - - // print-spacing - - string - printSpacing = - elt->getAttributeValue ("print-spacing"); - - fCurrentPrintSpacingKind = - msrStaffDetails::kPrintSpacingNo; // default value ??? JMI - - if (printSpacing == "yes") { - fCurrentPrintSpacingKind = - msrStaffDetails::kPrintSpacingYes; - } - else if (printSpacing == "no") { - fCurrentPrintSpacingKind = - msrStaffDetails::kPrintSpacingNo; - } - else { - if (printSpacing.size ()) { - stringstream s; - - s << "print-spacing " << printSpacing << " is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - fLogOutputStream << - "Handling staff details:" << - endl << - gTab << "StaffDetailsStaffNumber" << " = " << - fStaffDetailsStaffNumber << - endl; - } -#endif - - fCurrentStaffTypeKind = - msrStaffDetails::kRegularStaffType; - - fCurrentStaffTuningAlterationKind = k_NoAlteration; - fCurrentStaffTuningOctave = -1; - - fCurrentStaffDetailsStaffSize = 0; - - fCurrentStaffLinesNumber = 5; // default value - - fCurrentStaffDetailsCapo = 0; - - // create the staff details - fCurrentStaffDetails = - msrStaffDetails::create ( - inputLineNumber, - fCurrentStaffTypeKind, - fCurrentShowFretsKind, - fCurrentPrintObjectKind, - fCurrentPrintSpacingKind); - - gIndenter++; -} - -void mxmlTree2MsrTranslator::visitStart (S_staff_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff_type" << - ", line " << inputLineNumber << - endl; - } -#endif - - string staffType = elt->getValue (); - - if (staffType == "ossia") { - - fCurrentStaffTypeKind = - msrStaffDetails::kOssiaStaffType; - - } - else if (staffType == "cue") { - - fCurrentStaffTypeKind = - msrStaffDetails::kCueStaffType; - - } - else if (staffType == "editorial") { - - fCurrentStaffTypeKind = - msrStaffDetails::kEditorialStaffType; - - } - else if (staffType == "regular") { - - fCurrentStaffTypeKind = - msrStaffDetails::kRegularStaffType; - - } - else if (staffType == "alternate") { - - fCurrentStaffTypeKind = - msrStaffDetails::kAlternateStaffType; - - } - else { - stringstream s; - - s << "staff-type" << staffType << "unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart (S_staff_lines& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff_lines" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentStaffLinesNumber = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart (S_staff_tuning& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff_tuning" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentStaffTuningLine = - elt->getAttributeIntValue ("line", 0); - - fCurrentStaffTuningAlterationKind = kNatural; // may be absent - fCurrentStaffTuningOctave = -1; - - fOnGoingStaffTuning = true; -} - -void mxmlTree2MsrTranslator::visitStart (S_tuning_step& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuning_step" << - ", line " << inputLineNumber << - endl; - } -#endif - - string tuningStep = elt->getValue(); - - checkStep ( - inputLineNumber, - tuningStep); - - msrDiatonicPitchKind - tuningDiatonicKind = - msrDiatonicPitchKindFromString ( - tuningStep [0]); - - if (fOnGoingStaffTuning) { - fCurrentStaffTuningDiatonicPitchKind = tuningDiatonicKind; - } - else if (fOnGoingAccord) { - fCurrentStringTuningDiatonicPitchKind = tuningDiatonicKind; - } - else { - stringstream s; - - s << "tuning step " << tuningStep << " is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart (S_tuning_octave& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuning_octave" << - ", line " << inputLineNumber << - endl; - } -#endif - - int tuningOctave = (int)(*elt); - - if (fOnGoingStaffTuning) { - fCurrentStaffTuningOctave = tuningOctave; - } - else if (fOnGoingAccord) { - fCurrentStringTuningOctave = tuningOctave; - } - else { - stringstream s; - - s << "tuning octave " << tuningOctave << " is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart (S_tuning_alter& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuning_alter" << - ", line " << inputLineNumber << - endl; - } -#endif - - float tuningAlter = (float)(*elt); - - msrAlterationKind - tuningAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - tuningAlter); - - if (tuningAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "tuning alter '" << tuningAlter << - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - if (fOnGoingStaffTuning) { - fCurrentStaffTuningAlterationKind = tuningAlterationKind; - } - else if (fOnGoingAccord) { - fCurrentStringTuningAlterationKind = tuningAlterationKind; - } - else { - stringstream s; - - s << "tuning alter " << tuningAlter << " is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitEnd (S_staff_tuning& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_staff_tuning" << - ", line " << inputLineNumber << - endl; - } -#endif - - // fetch relevant staff - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, - fStaffDetailsStaffNumber); // test its value??? JMI - - msrQuarterTonesPitchKind - quarterTonesPitchKind = - quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - inputLineNumber, - fCurrentStaffTuningDiatonicPitchKind, - fCurrentStaffTuningAlterationKind); - - // create the staff tuning -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffDetails) { - fLogOutputStream << - "Creating staff tuning:" << - endl; - - gIndenter++; - - const int fieldWidth = 32; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentStaffTuningLine" << " = " << - fCurrentStaffTuningLine << - endl << - setw (fieldWidth) << - "fCurrentStaffTuningDiatonicPitch" << " = " << - msrDiatonicPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fCurrentStaffTuningDiatonicPitchKind) << - endl << - setw (fieldWidth) << - "fCurrentStaffTuningAlteration" << " = " << - msrAlterationKindAsString ( - fCurrentStaffTuningAlterationKind) << - endl << - setw (fieldWidth) << - "quarterTonesPitch" << " = " << - msrQuarterTonesPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - quarterTonesPitchKind) << - endl << - setw (fieldWidth) << - "CurrentStaffTuningOctave" << " = " << - fCurrentStaffTuningOctave << - endl; - - gIndenter--; - } -#endif - - // create the staff tuning - S_msrStaffTuning - staffTuning = - msrStaffTuning::create ( - inputLineNumber, - fCurrentStaffTuningLine, - quarterTonesPitchKind, - fCurrentStaffTuningOctave); - - // add it to the current staff details - fCurrentStaffDetails-> - addStaffTuningToStaffDetails ( - staffTuning); - - fOnGoingStaffTuning = false; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_voice& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff_details" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentMusicXMLVoiceNumber = int(*elt); - - // the voice number can be out of 1..4 range - - if (fOnGoingForward) { - fCurrentForwardVoiceNumber = fCurrentMusicXMLVoiceNumber; - } - - else if (fOnGoingNote) { - // regular voice indication in note/rest, fine - } - - else if (fOnGoingDirection) { - fCurrentDirectionVoiceNumber = fCurrentMusicXMLVoiceNumber; - } - - else { - stringstream s; - - s << "voice " << fCurrentMusicXMLVoiceNumber << " is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_backup& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_backup" << - ", line " << inputLineNumber << - endl; - } -#endif - - fOnGoingBackup = true; -} - -void mxmlTree2MsrTranslator::visitEnd (S_backup& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_backup" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceBackup) { - fLogOutputStream << - "Backup by " << fCurrentBackupDivisions << - " divisions becomes pending" << - "\", fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - ", line " << inputLineNumber << - endl; - } -#endif - - // reset notes staff numbers - fPreviousNoteMusicXMLStaffNumber = K_NO_STAFF_NUMBER; - fCurrentMusicXMLStaffNumber = K_NO_STAFF_NUMBER; - - // reset staff change detection - fCurrentStaffNumberToInsertInto = K_NO_STAFF_NUMBER; - - fOnGoingBackup = false; - - // handle the backup right now: - handleBackup ( - inputLineNumber); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_forward& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_forward" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -//* JMI ??? - // the element is present only - // in case of a staff change - fCurrentForwardStaffNumber = 1; // JMI default value??? fCurrentMusicXMLStaffNumber; - - // the element is present only - // in case of a voice change - fCurrentForwardVoiceNumber = 1; // JMI default value??? fCurrentMusicXMLVoiceNumber; -//*/ - - fOnGoingForward = true; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_forward& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_forward" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceForward) { - fLogOutputStream << - "Handling 'forward <<< " << fCurrentBackupDivisions << - " divisions >>>" << - ", fCurrentForwardStaffNumber = " << - fCurrentForwardStaffNumber << - ", fCurrentForwardVoiceNumber = " << - fCurrentForwardVoiceNumber << - "', line " << inputLineNumber << - endl; - } -#endif - - // the staff number should be positive - if (fCurrentForwardStaffNumber <= 0) { - stringstream s; - - s << - "staff number " << fCurrentForwardStaffNumber << - " is not positive" << - ", line " << inputLineNumber; - - msrAssert (false, s.str ()); - } - - // fetch the voice to be forwarded - S_msrVoice - voiceToBeForwarded = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentForwardStaffNumber, - fCurrentForwardVoiceNumber); - - // sanity check - msrAssert ( - voiceToBeForwarded != nullptr, - "voiceToBeForwarded is null"); - - // compute the forward step length -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceForward) { - fLogOutputStream << - "--> current forward divisions: " << - fCurrentForwardDivisions << - endl; - } -#endif - - rational - forwardStepLength = - rational ( - fCurrentForwardDivisions, - fCurrentDivisionsPerQuarterNote * 4); // hence a whole note - forwardStepLength.rationalise (); - - // append a padding note to the voice to be forwarded - voiceToBeForwarded -> - appendPaddingNoteToVoice ( - inputLineNumber, - forwardStepLength); - - // reset staff change detection - // fCurrentStaffNumberToInsertInto = 1; // default value JMI K_NO_STAFF_NUMBER; - fCurrentStaffNumberToInsertInto = K_NO_STAFF_NUMBER; // JMI ??? no if forward is followed by backup??? - - fOnGoingForward = false; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_tied& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tied" << - ", line " << inputLineNumber << - endl; - } -#endif - -// - - // type - - string tiedType = - elt->getAttributeValue ("type"); - - fCurrentTiedOrientation = - elt->getAttributeValue ("orientation"); - - fCurrentTieKind = msrTie::kTieNone; - - if (tiedType == "start") { - fCurrentTieKind = msrTie::kTieStart; - } - else if (tiedType == "continue") { - fCurrentTieKind = msrTie::kTieContinue; - } - else if (tiedType == "stop") { - fCurrentTieKind = msrTie::kTieStop; - } - else { - - // inner tied notes may miss the "continue" type: - // let' complain on slur notes outside of slurs - if (! fOnGoingSlur) { - if (tiedType.size ()) { - stringstream s; - - s << "tied type '" << fCurrentSlurType << "' inside a slur is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // inner tied notes may miss the "continue" type: - // let' complain on ligature notes outside of ligatures - if (! fOnGoingLigature) { - if (tiedType.size ()) { - stringstream s; - - s << "tied type '" << fCurrentSlurType << "' inside a ligature is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - } - - // color JMI - - if (fCurrentTieKind != msrTie::kTieNone) { - if (! gMsrOah->fOmitTies) { - fCurrentTie = - msrTie::create ( - inputLineNumber, - fCurrentTieKind); - } - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::displaySlurStartsStack ( - string context) -{ - fLogOutputStream << - endl << - ">>++++++++++++++++ " << - "The slurs starts stack contains:" << - endl; - - if (fSlurStartsStack.size ()) { - list::const_iterator - iBegin = fSlurStartsStack.begin (), - iEnd = fSlurStartsStack.end (), - i = iBegin; - - gIndenter++; - - for ( ; ; ) { - fLogOutputStream << "v " << (*i); - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - - fLogOutputStream << - "<<++++++++++++++++ " << - endl << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::displayTupletsStack ( - string context) -{ - int tupletsStackSize = fTupletsStack.size (); - - fLogOutputStream << - endl << - ">>++++++++++++++++ " << - "The tuplets stack contains " << tupletsStackSize << " elements:" << - endl; - - if (tupletsStackSize) { - list::const_iterator - iBegin = fTupletsStack.begin (), - iEnd = fTupletsStack.end (), - i = iBegin; - - S_msrTuplet tuplet = (*i); - - gIndenter++; - - int n = tupletsStackSize; - for ( ; ; ) { - fLogOutputStream << - "v (" << n << ")" << - endl; - - gIndenter++; - tuplet->printShort (fLogOutputStream); - gIndenter--; - - n--; - - if (++i == iEnd) break; - - fLogOutputStream << endl; - } // for - - gIndenter--; - } - - fLogOutputStream << - "<<++++++++++++++++ " << - endl << - endl; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_slur& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_slur" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlurs) { - displaySlurStartsStack ("BEFORE handling slur"); - } -#endif - - /* - Only the first note of the chord should get the slur notation. - Some applications print out the slur for all notes, - i.e. a stop and a start in sequqnce: - these should be ignored - */ - if (fCurrentNoteBelongsToAChord) { - stringstream s; - - s << - "ignoring a slur in a chord member note other than the first one"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - else { - - // number - - int slurNumber = elt->getAttributeIntValue ("number", 0); - - // type - - fCurrentSlurType = elt->getAttributeValue ("type"); - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - fCurrentDirectionPlacementKind = // use it JMI ??? - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // a phrasing slur is recognized as such - // when the nested regular slur start is found - - int slurStartsStackSize = fSlurStartsStack.size (); - - if (fCurrentSlurType == "start") { - switch (slurStartsStackSize) { - case 0: - fCurrentSlurTypeKind = msrSlur::kRegularSlurStart; - break; - - case 1: - { - S_msrSlur - containingSlur = - fSlurStartsStack.front (); - - fCurrentSlurTypeKind = msrSlur::kRegularSlurStart; - -/* JMI BUGGED? - // the stack top is in fact a phrasing slur start -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlurs) { - fLogOutputStream << - "The slur start '" << - containingSlur->asString () << - "' contains a nested slur, it is thus a phrasing slur start" << - ", line " << inputLineNumber << - endl; - } -#endif - - containingSlur-> - setSlurTypeKind ( - msrSlur::kPhrasingSlurStart); - */ - } - break; - - default: - { - stringstream s; - - s << - "only one slur nesting level is meaningfull"; - - // msrMusicXMLError ( // JMI - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - } // switch - - fOnGoingSlur = true; - } - - else if (fCurrentSlurType == "continue") { - fCurrentSlurTypeKind = msrSlur::kSlurContinue; - } - - else if (fCurrentSlurType == "stop") { - fCurrentSlurTypeKind = msrSlur::kRegularSlurStop; - switch (slurStartsStackSize) { - case 0: - { - stringstream s; - - s << - "a standalone slur 'stop' is meaningless, ignoring it"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - break; - - case 1: - /* JMI - // the current slur stop is regular - fCurrentSlurTypeKind = msrSlur::kRegularSlurStop; - - // pop the top element off the stack - fSlurStartsStack.pop_front (); - break; - */ - case 2: - // the current slur stop kind depends on that of the stack's top - switch (fSlurStartsStack.front ()->getSlurTypeKind ()) { - case msrSlur::kRegularSlurStart: - fCurrentSlurTypeKind = msrSlur::kRegularSlurStop; - break; - - case msrSlur::kPhrasingSlurStart: - // the stack top is in fact a phrasing slur start -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlurs) { - fLogOutputStream << - "A slur stop matches a phrasing slur start, it is thus a phrasing slur stop" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentSlurTypeKind = msrSlur::kPhrasingSlurStop; - break; - - default: - ; // should not occur - } // switch - - // pop the top element off the stack - fSlurStartsStack.pop_front (); - break; - - default: - ; // should not occur - } // switch - - fOnGoingSlur = false; - } - - else { - // inner slur notes may miss the "continue" type: - // let' complain only on slur notes outside of slurs - if (! fOnGoingSlur) { - if (fCurrentSlurType.size ()) { - stringstream s; - - s << - "slur type \"" << fCurrentSlurType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // line-type - - string slurLineType = elt->getAttributeValue ("line-type"); - - msrLineTypeKind - slurLineTypeKind = - kLineTypeSolid; // default value - - if (slurLineType == "solid") { - slurLineTypeKind = kLineTypeSolid; - } - else if (slurLineType == "dashed") { - slurLineTypeKind = kLineTypeDashed; - } - else if (slurLineType == "dotted") { - slurLineTypeKind = kLineTypeDotted; - } - else if (slurLineType == "wavy") { - slurLineTypeKind = kLineTypeWavy; - } - else { - if (slurLineType.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "slur line-type \"" + slurLineType + "\" is unknown"); - } - } - - // color JMI - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlurs) { - fLogOutputStream << - "slurNumber: " << - slurNumber << - "slurTypeKind: " << - msrSlur::slurTypeKindAsString ( - fCurrentSlurTypeKind) << - "slurLineType: " << - msrLineTypeKindAsString ( - slurLineTypeKind) << - endl; - } -#endif - - if (! gMsrOah->fOmitSlurs) { - S_msrSlur - slur = - msrSlur::create ( - inputLineNumber, - slurNumber, - fCurrentSlurTypeKind, - slurLineTypeKind); - - fPendingSlursList.push_back (slur); - - // push slurs starts onto the stack - switch (fCurrentSlurTypeKind) { - case msrSlur::kRegularSlurStart: - case msrSlur::kPhrasingSlurStart: - fSlurStartsStack.push_front (slur); - break; - default: - ; - } // switch - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlurs) { - displaySlurStartsStack ("AFTER handling slur"); - } -#endif -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_bracket& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bracket" << - ", line " << inputLineNumber << - endl; - } -#endif - - // number - - int ligatureNumber = - elt->getAttributeIntValue ("number", 0); - - // type - - string ligatureType = - elt->getAttributeValue ("type"); - - fCurrentLigatureKind = msrLigature::kLigatureNone; - - if (ligatureType == "start") { - fCurrentLigatureKind = msrLigature::kLigatureStart; - fOnGoingLigature = true; - } - else if (ligatureType == "continue") { - fCurrentLigatureKind = msrLigature::kLigatureContinue; - } - else if (ligatureType == "stop") { - fCurrentLigatureKind = msrLigature::kLigatureStop; - fOnGoingLigature = false; - } - else { - - // inner ligature notes may miss the "continue" type: - // let's complain on ligature notes outside of ligatures - if (! fOnGoingLigature) { - if (ligatureType.size ()) { - stringstream s; - - s << - "ligature type \"" << ligatureType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // line-end - - string ligatureLineEndValue = elt->getAttributeValue ("line-end"); - - msrLigature::msrLigatureLineEndKind - ligatureLineEndKind = msrLigature::kLigatureLineEndNone; - - if (ligatureLineEndValue == "up") { - ligatureLineEndKind = msrLigature::kLigatureLineEndUp; - } - else if (ligatureLineEndValue == "down") { - ligatureLineEndKind = msrLigature::kLigatureLineEndDown; - } - else if (ligatureLineEndValue == "both") { - ligatureLineEndKind = msrLigature::kLigatureLineEndBoth; - } - else if (ligatureLineEndValue == "arrow") { - ligatureLineEndKind = msrLigature::kLigatureLineEndArrow; - } - else if (ligatureLineEndValue == "none") { - ligatureLineEndKind = msrLigature::kLigatureLineEndNone; - } - else { - if (ligatureLineEndValue.size ()) { - stringstream s; - - s << - "ligature line-end \"" << ligatureLineEndValue << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // line-type - - string ligatureLineTypeValue = elt->getAttributeValue ("line-type"); - - msrLineTypeKind - ligatureLineTypeKind = - kLineTypeSolid; // default value - - if (ligatureLineTypeValue == "solid") { - ligatureLineTypeKind = kLineTypeSolid; - } - else if (ligatureLineTypeValue == "dashed") { - ligatureLineTypeKind = kLineTypeDashed; - } - else if (ligatureLineTypeValue == "dotted") { - ligatureLineTypeKind = kLineTypeDotted; - } - else if (ligatureLineTypeValue == "wavy") { - ligatureLineTypeKind = kLineTypeWavy; - } - else { - if (ligatureLineTypeValue.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "ligature line-type \"" + ligatureLineTypeValue + "\" is unknown"); - } - } - - // color JMI - - // create the ligature - S_msrLigature - ligature = - msrLigature::create ( - inputLineNumber, - ligatureNumber, - fCurrentLigatureKind, - ligatureLineEndKind, - ligatureLineTypeKind, - fCurrentDirectionPlacementKind); - - // append it to the pending ligatures list - fPendingLigaturesList.push_back (ligature); - - switch (fCurrentLigatureKind) { - case msrLigature::kLigatureStart: - // remember this ligature spanner start - switch (fCurrentDirectionPlacementKind) { - case msrPlacementKind::kPlacementNone: - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - stringstream s; - - s << - "Bracket start found with no placement, placing it above by default"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - ligature->setLigaturePlacementKind (kPlacementAbove); - fCurrentLigatureStartAbove = ligature; - } - break; - - case msrPlacementKind::kPlacementAbove: - fCurrentLigatureStartAbove = ligature; - break; - - case msrPlacementKind::kPlacementBelow: - fCurrentLigatureStartBelow = ligature; - break; - } // switch - break; - - case msrLigature::kLigatureStop: - // set spanner two-way sideLinks - // between both ends of the ligature spanner - - switch (fCurrentDirectionPlacementKind) { - case msrPlacementKind::kPlacementNone: - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - stringstream s; - - s << - "Bracket stop found with no placement, placing it above by default"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - ligature->setLigaturePlacementKind (kPlacementAbove); - - if (! fCurrentLigatureStartAbove) { - stringstream s; - - s << - "Bracket 'stop above' found with no corresponding bracket start, ignoring it"; // JMI cannot occur - - // JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - - else { - ligature-> - setLigatureOtherEndSideLink ( - fCurrentLigatureStartAbove); - - // forget this ligature spanner start - fCurrentLigatureStartAbove = nullptr; - } - } - break; - - case msrPlacementKind::kPlacementAbove: - if (! fCurrentLigatureStartAbove) { - stringstream s; - - s << - "Bracket 'stop above' found with no corresponding bracket start, ignoring it"; - - // JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - - else { - ligature-> - setLigatureOtherEndSideLink ( - fCurrentLigatureStartAbove); - - // forget this ligature spanner start - fCurrentLigatureStartAbove = nullptr; - } - break; - - case msrPlacementKind::kPlacementBelow: - if (! fCurrentLigatureStartBelow) { - stringstream s; - - s << - "Bracket 'stop below' found with no corresponding bracket start, ignoring it"; - - // JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - - else { - ligature-> - setLigatureOtherEndSideLink ( - fCurrentLigatureStartBelow); - - // forget this ligature spanner start - fCurrentLigatureStartBelow = nullptr; - } - break; - } // switch - break; - - case msrLigature::kLigatureContinue: - // JMI ??? - break; - - case msrLigature::kLigatureNone: - // JMI ??? - break; - } // switch -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_wedge& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_wedge" << - ", line " << inputLineNumber << - endl; - } -#endif - - // type - - string type = elt->getAttributeValue("type"); - - msrWedge::msrWedgeKind wedgeKind = msrWedge::kWedgeKindNone; - - if (type == "crescendo") { - wedgeKind = msrWedge::kWedgeCrescendo; - } - else if (type == "diminuendo") { - wedgeKind = msrWedge::kWedgeDecrescendo; - } - else if (type == "stop") { - wedgeKind = msrWedge::kWedgeStop; - } - else { - if (type.size ()) { - stringstream s; - - s << - "unknown wedge type \"" + - type + - "\", should be 'crescendo', 'diminuendo' or 'stop'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // niente - - string nienteString = elt->getAttributeValue ("niente"); - - msrWedge::msrWedgeNienteKind - wedgeNienteKind = msrWedge::kWedgeNienteNo; - - if (nienteString == "yes") { - wedgeNienteKind = msrWedge::kWedgeNienteYes; - } - else if (nienteString == "no") { - wedgeNienteKind = msrWedge::kWedgeNienteNo; - } - else { - if (nienteString.size ()) { - stringstream s; - - s << - "wedge niente \"" << nienteString << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // line-type - - string wedgeLineType = elt->getAttributeValue ("line-type"); - - msrLineTypeKind - wedgeLineTypeKind = - kLineTypeSolid; // default value - - if (wedgeLineType == "solid") { - wedgeLineTypeKind = kLineTypeSolid; - } - else if (wedgeLineType == "dashed") { - wedgeLineTypeKind = kLineTypeDashed; - } - else if (wedgeLineType == "dotted") { - wedgeLineTypeKind = kLineTypeDotted; - } - else if (wedgeLineType == "wavy") { - wedgeLineTypeKind = kLineTypeWavy; - } - else { - if (wedgeLineType.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "wedge line-type \"" + wedgeLineType + "\" is unknown"); - } - } - - // color JMI ??? - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllWedgesBelow) { - fCurrentDirectionPlacementKind = kPlacementBelow; - } - - if (! gMsrOah->fOmitWedges) { - S_msrWedge - wedge = - msrWedge::create ( - inputLineNumber, - wedgeKind, - wedgeNienteKind, - wedgeLineTypeKind, - fCurrentDirectionPlacementKind); - - fPendingWedgesList.push_back (wedge); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_lyric& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_lyric" << - ", line " << inputLineNumber << - endl; - } -#endif - - // number - - { - fCurrentStanzaNumber = - elt->getAttributeValue ("number"); - - if (fCurrentStanzaNumber.size () == 0) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "lyric number is empty, using \"1\" by default"); - - fCurrentStanzaNumber = "1"; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "Setting fCurrentStanzaNumber to " << - fCurrentStanzaNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - // register it as current stanza number, - // that remains set another positive value is found, - // thus allowing a skip syllable to be generated - // for notes without lyrics - } - - // name - - { - fCurrentStanzaName = - elt->getAttributeValue ("name"); - - if (fCurrentStanzaName.size () == 0) { - // lyrics names are not so frequent after all... -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "Lyric name is empty, using \"" << - K_NO_STANZA_NAME << - "\" by default" << - endl; - } -#endif - - fCurrentStanzaName = K_NO_STANZA_NAME; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "Setting fCurrentStanzaName to \"" << - fCurrentStanzaName << - "\", line " << inputLineNumber << - endl; - } -#endif - - // register it as current stanza name, - // that remains set another positive value is found, - // thus allowing a skip syllable to be generated - // for notes without lyrics - } - - // color JMI - - // forget about any previous texts found, - // in case there are occurrences without around them - fCurrentLyricTextsList.clear (); - - fCurrentStanzaHasText = false; - - fOnGoingLyric = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_syllabic& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_syllabic" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentSyllabic = elt->getValue(); - - fCurrentSyllableKind = msrSyllable::kSyllableNone; - - if (fCurrentSyllabic == "single") { - fCurrentSyllableKind = msrSyllable::kSyllableSingle; - } - else if (fCurrentSyllabic == "begin") { - fCurrentSyllableKind = msrSyllable::kSyllableBegin; - } - else if (fCurrentSyllabic == "middle") { - fCurrentSyllableKind = msrSyllable::kSyllableMiddle; - } - else if (fCurrentSyllabic == "end") { - fCurrentSyllableKind = msrSyllable::kSyllableEnd; - } - else { - stringstream s; - - s << - "syllabic \"" << fCurrentSyllabic << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // forget about any previous texts found - fCurrentLyricTextsList.clear (); -} - -void mxmlTree2MsrTranslator::visitStart ( S_text& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_text" << - ", line " << inputLineNumber << - endl; - } -#endif - - string textValue = elt->getValue(); - - convertHTMLEntitiesToPlainCharacters (textValue); // JMI ??? - - // color JMI - - // there can be several 's and in a row, hence the list - fCurrentLyricTextsList.push_back (textValue); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "textValue = \""<< textValue << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentNoteHasLyrics = true; - fCurrentStanzaHasText = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - gIndenter++; - - const int fieldWidth = 23; - - fLogOutputStream << left << - setw (fieldWidth) << - "line " << " = " << inputLineNumber << - endl << - setw (fieldWidth) << - "fCurrentStanzaNumber" << " = " << fCurrentStanzaNumber << - endl << - setw (fieldWidth) << - "fCurrentStanzaName" << " = \"" << fCurrentStanzaName << "\"" << - endl << - setw (fieldWidth) << - "fCurrentSyllabic" << " = " << fCurrentSyllabic << - endl << - setw (fieldWidth) << - "fCurrentLyricTextsList" << " = "; - - msrSyllable::writeTextsList ( - fCurrentLyricTextsList, - fLogOutputStream); - - fLogOutputStream << endl; - - gIndenter--; - } -#endif - - // a markup puts an end to the effect of - fCurrentSyllableExtendKind = msrSyllable::kSyllableExtendNone; -} - -void mxmlTree2MsrTranslator::visitStart ( S_elision& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_elision" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - string elisionValue = elt->getValue (); - - if (! elisionValue.size ()) { - elisionValue = " "; - } - - // color JMI - - // there can be several 's and in a row, hence the list - fCurrentLyricTextsList.push_back (elisionValue); - - fCurrentStanzaHasText = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_extend& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_extend" << - ", line " << inputLineNumber << - endl; - } -#endif - - string extendType = - elt->getAttributeValue ("type"); - - // extend - - if (fOnGoingLyric) { - fCurrentSyllableExtendKind = - msrSyllable::kSyllableExtendSingle; // default value - - if (extendType == "start") { - fCurrentSyllableExtendKind = - msrSyllable::kSyllableExtendStart; - } - else if (extendType == "continue") { - fCurrentSyllableExtendKind = - msrSyllable::kSyllableExtendContinue; - } - else if (extendType == "stop") { - fCurrentSyllableExtendKind = - msrSyllable::kSyllableExtendStop; - } - else { - if (extendType.size ()) { - stringstream s; - - s << - "extend type \"" << extendType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - else { - // JMI fOnGoingSyllableExtend = true; - } - } - } - - else if (fOnGoingFiguredBass) { // JMI - } - - // color JMI -} - -void mxmlTree2MsrTranslator::visitEnd ( S_lyric& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_lyric" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fCurrentSyllableKind == msrSyllable::kSyllableNone) { - // syllabic is not mandatory, thus: - stringstream s; - - s << - " has no component, using 'single' by default"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - fCurrentSyllableKind = msrSyllable::kSyllableSingle; - } - - if (fCurrentNoteIsARest) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - stringstream s; - - s << - "syllable "; - - msrSyllable::writeTextsList ( - fCurrentLyricTextsList, - s); - - s << - " is attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - - if (fCurrentLyricTextsList.size ()) { - // register a skip in lyrics for rests with syllables - fCurrentSyllableKind = - msrSyllable::kSyllableOnRestNote; - } - else { - // don't register a skip in lyrics for rests without syllables - fCurrentSyllableKind = - msrSyllable::kSyllableSkipRestNote; - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyricsDetails) { - fLogOutputStream << - "==> visitEnd ( S_lyric&), fCurrentSyllableKind = " << - msrSyllable::syllableKindAsString (fCurrentSyllableKind) << - ", line = " << inputLineNumber << - ", with:" << - endl; - - gIndenter++; - - fLogOutputStream << - "Lyric data:" << - endl; - - { - gIndenter++; - - const int fieldWidth = 31; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentMusicXMLStaffNumber" << " = " << fCurrentMusicXMLStaffNumber << - endl << - setw (fieldWidth) << - "fCurrentStaffNumberToInsertInto" << " = " << fCurrentStaffNumberToInsertInto << - endl << - setw (fieldWidth) << - "fCurrentStanzaNumber" << " = " << fCurrentStanzaNumber << - endl << - setw (fieldWidth) << - "fCurrentStanzaName" << " = \"" << fCurrentStanzaName << "\"" << - endl << - setw (fieldWidth) << - "fCurrentLyricTextsList" << " = "; - - msrSyllable::writeTextsList ( - fCurrentLyricTextsList, - fLogOutputStream); - - fLogOutputStream << left << - endl << - setw (fieldWidth) << - "fCurrentSyllableExtendKind" << " = " << - msrSyllable::syllableExtendKindAsString ( - fCurrentSyllableExtendKind) << - endl << - setw (fieldWidth) << - "fCurrentNoteIsARest" << " = " << - booleanAsString (fCurrentNoteIsARest) << - endl << - setw (fieldWidth) << - "fCurrentRestMeasure" << " = " << - booleanAsString (fCurrentRestMeasure) << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentTieKind" << " = \"" << - msrTie::tieKindAsString (fCurrentTieKind) << - "\"" << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentSlurTypeKind" << " = \"" << - msrSlur::slurTypeKindAsString (fCurrentSlurTypeKind) << - "\"" << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentLigatureKind" << " = \"" << - msrLigature::ligatureKindAsString ( - fCurrentLigatureKind) << - "\"" << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fOnGoingSlur" << " = " << - booleanAsString (fOnGoingSlur) << - endl << - setw (fieldWidth) << - "fOnGoingSlurHasStanza" << " = " << - booleanAsString (fOnGoingSlurHasStanza) << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fOnGoingLigature" << " = " << - booleanAsString (fOnGoingLigature) << - endl << - setw (fieldWidth) << - "fOnGoingLigatureHasStanza" << " = " << - booleanAsString (fOnGoingLigatureHasStanza) << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fFirstSyllableInSlurKind" << " = \"" << - msrSyllable::syllableKindAsString ( - fFirstSyllableInSlurKind) << - "\"" << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fFirstSyllableInLigatureKind" << " = \"" << - msrSyllable::syllableKindAsString ( - fFirstSyllableInLigatureKind) << - "\"" << - endl; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentSyllableKind" << " = \""<< - msrSyllable::syllableKindAsString ( - fCurrentSyllableKind) << - "\"" << - endl; - - gIndenter--; - } - - gIndenter--; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "==> visitEnd ( S_lyric&), fCurrentSyllableKind = " << - msrSyllable::syllableKindAsString (fCurrentSyllableKind) << - ", line = " << inputLineNumber << - ", with:" << - endl; - - gIndenter++; - - fLogOutputStream << - "Lyric data:" << - endl; - - { - gIndenter++; - - const int fieldWidth = 31; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentMusicXMLStaffNumber" << " = " << fCurrentMusicXMLStaffNumber << - endl << - setw (fieldWidth) << - "fCurrentStaffNumberToInsertInto" << " = " << fCurrentStaffNumberToInsertInto << - endl << - setw (fieldWidth) << - "fCurrentStanzaNumber" << " = " << fCurrentStanzaNumber << - endl << - setw (fieldWidth) << - "fCurrentStanzaName" << " = \"" << fCurrentStanzaName << "\"" << - endl << - setw (fieldWidth) << - "fCurrentLyricTextsList" << " = "; - - msrSyllable::writeTextsList ( - fCurrentLyricTextsList, - fLogOutputStream); - - gIndenter--; - } - - gIndenter--; - } -#endif - - if (! gMsrOah->fOmitLyrics) { - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // fetch stanzaNumber in current voice - S_msrStanza - stanza = - currentVoice-> - fetchStanzaInVoice ( - inputLineNumber, - fCurrentStanzaNumber, - fCurrentStanzaName); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "Creating a syllable '" << - msrSyllable::syllableKindAsString ( - fCurrentSyllableKind) << - "\", fCurrentLyricTextsList = \""; - - msrSyllable::writeTextsList ( - fCurrentLyricTextsList, - fLogOutputStream); - - fLogOutputStream << - "\"" << - ", whole notes: " << - fCurrentNoteSoundingWholeNotesFromDuration << - " sounding from duration, " << - fCurrentNoteDisplayWholeNotesFromType << - ", display from type" << - ", syllabic = \"" << - msrSyllable::syllableKindAsString ( - fCurrentSyllableKind) << "\"" << - ", in stanza " << stanza->getStanzaName () << - ", line " << inputLineNumber << - endl; - } -#endif - - // create a syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - fCurrentSyllableKind, - fCurrentSyllableExtendKind, - fCurrentNoteSoundingWholeNotesFromDuration, - msrTupletFactor ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes), - stanza); - - // append the lyric texts to the syllable - for ( - list::const_iterator i = fCurrentLyricTextsList.begin (); - i!=fCurrentLyricTextsList.end (); - i++ - ) { - syllable-> - appendLyricTextToSyllable ((*i)); - } // for - - // don't forget about fCurrentLyricTextsList here, - // this will be done in visitStart ( S_syllabic& ) - - // appendSyllableToNoteAndSetItsNoteUpLink() - // will be called in handleLyrics(), - // after the note has been created - - // append syllable to current note's syllables list - fCurrentNoteSyllables.push_back ( - syllable); - - // append syllable to stanza - stanza-> - appendSyllableToStanza (syllable); - } - - // DON'T register current note as having lyrics, - // it's only the case when there are inside the : - // the latter may contain only an markup, - - fOnGoingLyric = false; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_measure& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_measure" << - ", line " << inputLineNumber << - endl; - } -#endif - - // take this measure into account - fPartMeasuresCounter++; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresDetails) { - gLogOstream << - "==> visitStart (S_measure" << - ", fPartMeasuresCounter = '" << - fPartMeasuresCounter << - "', fCurrentMeasureNumber = '" << - fCurrentMeasureNumber << - "', line " << inputLineNumber << - ", in part \"" << - fCurrentPart->getPartCombinedName () << "\"" << - endl; - } -#endif - - // number - fCurrentMeasureNumber = - elt->getAttributeValue ("number"); - - // set next measure number in current part' previous measure - // if this measure is not the first one - /* JMI ??? SUPERFLOUS ??? - if (fPartMeasuresCounter > 1) { - fCurrentPart-> - setNextMeasureNumberInPart ( - inputLineNumber, - fCurrentMeasureNumber); - } - */ - - // consistency check - if (! fPartFirstMeasureNumber.size ()) { - // this is the first measure in the part - fPartFirstMeasureNumber = fCurrentMeasureNumber; - - if (! fScoreFirstMeasureNumber.size ()) { - // this is the first measure of the first part in the score - fScoreFirstMeasureNumber = fPartFirstMeasureNumber; - } - else { - if (fPartFirstMeasureNumber != fScoreFirstMeasureNumber) { - stringstream s; - - s << - "measure numbering inconsistency: first measure numbers '" << - fScoreFirstMeasureNumber << - "' and '" << - fPartFirstMeasureNumber << - "' found"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - -#ifdef TRACE_OAH -// JMI if (gTraceOah->fTraceMeasures) { - if (gTraceOah->fTracePasses) { - fLogOutputStream << - endl << - "" << - endl; - } -#endif - - // implicit - -/* - Measures with an implicit attribute set to "yes" - never display a measure number, - regardless of the measure-numbering setting. - * - The implicit attribute is set to "yes" for measures where - the measure number should never appear, such as pickup - measures and the last half of mid-measure repeats. The - value is "no" if not specified. -*/ - - string - implicit = - elt->getAttributeValue ("implicit"); - - msrMeasure::msrMeasureImplicitKind - measureImplicitKind = - msrMeasure::kMeasureImplicitKindNo; // default value - - if (implicit == "yes") { - measureImplicitKind = - msrMeasure::kMeasureImplicitKindYes; - } - else if (implicit == "no") { - measureImplicitKind = - msrMeasure::kMeasureImplicitKindNo; - } - else { - if (implicit.size ()) { - stringstream s; - - s << - "implicit \"" << implicit << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // append a new measure to the current part - fCurrentPart-> - createMeasureAndAppendItToPart ( - inputLineNumber, - fCurrentMeasureNumber, - measureImplicitKind); - - // reset staff change detection - fPreviousNoteMusicXMLStaffNumber = 1; // default value - fCurrentMusicXMLStaffNumber = 1; // default value - fCurrentStaffNumberToInsertInto = 1; // default value JMI K_NO_STAFF_NUMBER; - -/* JMI - // is this measure number in the debug set? -#ifdef TRACE_OAH - if (gTraceOah->fTraceDetailed) { - set::const_iterator - it = - gGeneralOah-> - fTraceDetailedMeasureNumbersSet.find (fMeasuresCounter); - - if (it != gTraceOah->fTraceDetailedMeasureNumbersSet.end ()) { - // yes, activate detailed trace for it - gMusicXMLOah = gMusicXMLOahWithDetailedTrace; - gGeneralOah = gGeneralOahWithDetailedTrace; - gMsrOah = gMsrOahWithDetailedTrace; - gLpsrOah = gLpsrOahWithDetailedTrace; - gLilypondOah = gLilypondOahWithDetailedTrace; - } - } -#endif - */ -} - -void mxmlTree2MsrTranslator::visitEnd (S_measure& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_measure" << - ", line " << inputLineNumber << - endl; - } -#endif - - // is there a pending grace notes group? - if (fPendingGraceNotesGroup) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - endl << - "fCurrentGraceNotes IS NOT NULL at the end of measure '" << // JMI - elt->getAttributeValue ("number") << - "'" << - endl; - - fLogOutputStream << - "+++++++++++++++++" << - fCurrentPart << - endl; - } -#endif - - // attach these grace notes group as an after grace notes group - // to the last note found in its voice - - // fetch the voice - S_msrVoice - voice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber); - - // fetch note to attach to - S_msrNote - noteToAttachTo = - /* JMI - // JMI might prove not precise enough??? - // fVoicesLastMetNoteMap [currentVoice]; - fVoicesLastMetNoteMap [ - make_pair ( - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber) - ]; - */ - voice-> - getVoiceLastAppendedNote (); // ??? JMI - - - if (! noteToAttachTo) { - stringstream s; - - s << - "cannot find voice to insert after grace notes group into: " << - "chordFirstNote is null" << - ", fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - endl << - ", fCurrentMusicXMLVoiceNumber = " << - fCurrentMusicXMLVoiceNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // set the pending grace notes group's kind to 'after' - fPendingGraceNotesGroup-> - setGraceNotesGroupKind ( - msrGraceNotesGroup::kGraceNotesGroupAfter); - - // attach it to the note - noteToAttachTo-> - setNoteGraceNotesGroupAfter ( - fPendingGraceNotesGroup); - - // forget about this grace notes group - fPendingGraceNotesGroup = nullptr; - } - - if (fCurrentATupletStopIsPending) { - if (fTupletsStack.size ()) { // JMI - // finalize the tuplet, only now - // in case the last element is actually a chord - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - } - - fCurrentATupletStopIsPending = false; - } - - // finalize current measure in the part, - // to add skips if necessary and set measure kind - fCurrentPart-> - finalizeCurrentMeasureInPart ( - inputLineNumber); - - // should empty measures be added after this one? - if (gMusicXMLOah->fAddEmptyMeasuresStringToIntMap.size ()) { - if (! fOnGoingRestMeasures) { - // ??? - } - else { - // fRemainingRestMeasuresMeasuresNumber - } - // use fCurrentTime to determine the measure length - } - - // handle an on-going multiple rest if any only now, - // JMI do it before??? - if (fOnGoingRestMeasures) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - const int fieldWidth = 37; - - fLogOutputStream << - "--> onGoingRestMeasures" << - endl; - - gIndenter++; - - fLogOutputStream << - setw (fieldWidth) << - "currentRestMeasuresHasBeenCreated " << " : " << - booleanAsString ( - fCurrentRestMeasuresHasBeenCreated) << - endl << - setw (fieldWidth) << - "remainingRestMeasuresMeasuresNumber" << " : " << - fRemainingRestMeasuresMeasuresNumber << - endl << - endl; - - gIndenter--; - } -#endif - - if (! fCurrentRestMeasuresHasBeenCreated) { - // create a pending multiple rest, - // that will be handled when fRemainingRestMeasuresMeasuresNumber - // comes down to 0 later in this same method - fCurrentPart-> - createRestMeasuresInPart ( - inputLineNumber, - fCurrentRestMeasuresMeasuresNumber); - - fCurrentRestMeasuresHasBeenCreated = true; - } - - if (fRemainingRestMeasuresMeasuresNumber <= 0) { - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "remainingRestMeasuresMeasuresNumber problem"); - } - - // account for one more rest measure in the multiple rest - fRemainingRestMeasuresMeasuresNumber--; - - if (fRemainingRestMeasuresMeasuresNumber == 0) { - // all rest measures have been found, - // the current one is the first after the multiple rest - fCurrentPart-> - appendPendingRestMeasuresToPart ( - inputLineNumber); - - if (fRemainingRestMeasuresMeasuresNumber == 1) { - fCurrentPart-> // JMI ??? BOF - setNextMeasureNumberInPart ( - inputLineNumber, - fCurrentMeasureNumber); - } - - // forget about and multiple rest having been created - fCurrentRestMeasuresHasBeenCreated = false; - - fOnGoingRestMeasures = false; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRestMeasures) { - const int fieldWidth = 37; - - fLogOutputStream << - "--> onGoingRestMeasures" << - endl; - - gIndenter++; - - fLogOutputStream << - setw (fieldWidth) << - "fCurrentRestMeasuresHasBeenCreated " << " : " << - booleanAsString ( - fCurrentRestMeasuresHasBeenCreated) << - endl << - setw (fieldWidth) << - "fRemainingRestMeasuresMeasuresNumber" << " : " << - fRemainingRestMeasuresMeasuresNumber << - endl << - setw (fieldWidth) << - "fOnGoingRestMeasures " << " : " << - booleanAsString ( - fOnGoingRestMeasures) << - endl; - - gIndenter--; - } -#endif - } - -/* JMI - // restore debug options in case they were set in visitStart() - gMusicXMLOah = gMusicXMLOahUserChoices; - gGeneralOah = gGeneralOahUserChoices; - gMsrOah = gMsrOahUserChoices; - gLpsrOah = gLpsrOahUserChoices; - gLilypondOah = gLilypondOahUserChoices; - */ -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_print& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_print" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* JMI - const int staffSpacing = - elt->getAttributeIntValue ("staff-spacing", 0); // JMI - */ - - // handle 'new-system' if present - - const string newSystem = elt->getAttributeValue ("new-system"); - - if (newSystem.size ()) { - - if (newSystem == "yes") { - // create a line break -#ifdef TRACE_OAH - if (gTraceOah->fTraceLineBreaks) { - fLogOutputStream << - "Creating a line break, " << - "line = " << inputLineNumber << - endl; - } -#endif - - S_msrLineBreak - lineBreak = - msrLineBreak::create ( - inputLineNumber, - fCurrentMeasureNumber); - - // append lineBreak to the pending line breaks - fPendingLineBreaksList.push_back (lineBreak); - } - - else if (newSystem == "no") { - // ignore it - } - - else { - stringstream s; - - s << "new-system \"" << newSystem << - "\" is unknown in '', should be 'yes', 'no' or empty"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // handle 'new-page' if present - - const string newPage = elt->getAttributeValue ("new-page"); - - if (newPage.size ()) { - - if (newPage == "yes") { // JMI - // create a page break -#ifdef TRACE_OAH - if (gTraceOah->fTracePageBreaks) { - fLogOutputStream << - "Creating a page break, " << - "line = " << inputLineNumber << - endl; - } -#endif - - S_msrPageBreak - pageBreak = - msrPageBreak::create ( - inputLineNumber); - - // append it to the pending page breaks - fPendingPageBreaksList.push_back (pageBreak); - } - - else if (newPage == "no") { - // ignore it - } - - else { - stringstream s; - - s << "new-page \"" << newPage << - "\" is unknown in '', should be 'yes', 'no' or empty"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // handle 'blank-page' if present - - const string blankPage = elt->getAttributeValue ("blank-page"); // JMI - - // handle 'page-number' if present - - const string pageNumber = elt->getAttributeValue ("page-number"); // JMI - - // print - - fCurrentDisplayText = ""; - fOnGoingPrint = true; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_print& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_print" << - ", line " << inputLineNumber << - endl; - } -#endif - - fOnGoingPrint = false; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_system_layout& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_system_layout" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* JMI - int inputLineNumber = - elt->getInputLineNumber (); - - string measureNumberingString = elt->getValue (); - - if (measureNumberingString == "none") { - // fCurrentBarlineStyleKind = - // msrBarline::kRegularStyle; - } - else if (measureNumberingString == "measure") { -// fCurrentBarlineStyleKind = - // msrBarline::kDottedStyle; - } - else if (measureNumberingString == "system") { - // fCurrentBarlineStyleKind = - // msrBarline::kDashedStyle; - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "measure-numbering \"" + measureNumberingString + "\" is unknown"); - } -*/ -} - -void mxmlTree2MsrTranslator::visitStart ( S_measure_numbering& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_measure_numbering" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // JMI -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_barline& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_barline" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentBarlineEndingNumber = ""; // may be "1, 2" - - fCurrentBarlineHasSegnoKind = msrBarline::kBarlineHasSegnoNo; - fCurrentBarlineHasCodaKind = msrBarline::kBarlineHasCodaNo; - - fCurrentBarlineLocationKind = msrBarline::kBarlineLocationNone; - fCurrentBarlineStyleKind = msrBarline::kBarlineStyleNone; - fCurrentBarlineEndingTypeKind = msrBarline::kBarlineEndingNone; - fCurrentBarlineRepeatDirectionKind = msrBarline::kBarlineRepeatDirectionNone; - fCurrentBarlineRepeatWingedKind = msrBarline::kBarlineRepeatWingedNone; - - fCurrentBarlineTimes = 2; // default value JMI ??? - - // location - - { - string - location = - elt->getAttributeValue ("location"); - - fCurrentBarlineLocationKind = - msrBarline::kBarlineLocationRight; // by default - - if (location == "left") { - fCurrentBarlineLocationKind = msrBarline::kBarlineLocationLeft; - } - else if (location == "middle") { - fCurrentBarlineLocationKind = msrBarline::kBarlineLocationMiddle; - } - else if (location == "right") { - fCurrentBarlineLocationKind = msrBarline::kBarlineLocationRight; - } - else { - stringstream s; - - s << - "barline location \"" << location << - "\" is unknown, using 'right' by default"; - - // JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - } - - fOnGoingBarline = true; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_bar_style& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bar_style" << - ", line " << inputLineNumber << - endl; - } -#endif - - // style - - string barStyle = elt->getValue(); - - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleNone; // default value - - if (barStyle == "regular") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleRegular; - } - else if (barStyle == "dotted") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleDotted; - } - else if (barStyle == "dashed") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleDashed; - } - else if (barStyle == "heavy") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleHeavy; - } - else if (barStyle == "light-light") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleLightLight; - } - else if (barStyle == "light-heavy") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleLightHeavy; - } - else if (barStyle == "heavy-light") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleHeavyLight; - } - else if (barStyle == "heavy-heavy") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleHeavyHeavy; - } - else if (barStyle == "tick") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleTick; - } - else if (barStyle == "short") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleShort; - } - else if (barStyle == "none") { - fCurrentBarlineStyleKind = - msrBarline::kBarlineStyleNone; - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "bar-style \"" + barStyle + "\" is unknown"); - } - - // color JMI -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_segno& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_segno" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fOnGoingDirectionType) { - // create the segno - S_msrSegno - segno = - msrSegno::create ( - inputLineNumber); - - // append it to the pending segnos list - fPendingSegnosList.push_back (segno); - } - - else if (fOnGoingBarline) { - fCurrentBarlineHasSegnoKind = - msrBarline::kBarlineHasSegnoYes; - } - - else { - stringstream s; - - s << "segno is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_coda& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_coda" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fOnGoingDirectionType) { - // create the coda - S_msrCoda - coda = - msrCoda::create ( - inputLineNumber); - - // append it to the pending codas list - fPendingCodasList.push_back (coda); - } - - else if (fOnGoingBarline) { - fCurrentBarlineHasCodaKind = msrBarline::kBarlineHasCodaYes; - } - - else { - stringstream s; - - s << "coda is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_eyeglasses& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_eyeglasses" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fOnGoingDirectionType) { - // create the eyeglasses - S_msrEyeGlasses - eyeGlasses = - msrEyeGlasses::create ( - inputLineNumber); - - // append it to the pending eyeglasses list - fPendingEyeGlassesList.push_back (eyeGlasses); - } - - else { - stringstream s; - - s << "eyeGlasses is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_pedal& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pedal" << - ", line " << inputLineNumber << - endl; - } -#endif - - // type - - string type = elt->getAttributeValue ("type"); - - msrPedal::msrPedalTypeKind pedalTypeKind = msrPedal::k_NoPedalType; - - if (type == "start") { - pedalTypeKind = msrPedal::kPedalStart; - } - else if (type == "continue") { - pedalTypeKind = msrPedal::kPedalContinue; - } - else if (type == "change") { - pedalTypeKind = msrPedal::kPedalChange; - } - else if (type == "stop") { - pedalTypeKind = msrPedal::kPedalStop; - } - else { - stringstream s; - - s << "pedal type '" << type << "' is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // line - - string line = elt->getAttributeValue ("line"); - - msrPedal::msrPedalLineKind pedalLineKind = msrPedal::kPedalLineNo; - - if (line == "yes") { - pedalLineKind = msrPedal::kPedalLineYes; - } - else if (line == "no") { - pedalLineKind = msrPedal::kPedalLineNo; - } - else { - if (line.size ()) { - stringstream s; - - s << - "pedal line \"" << line << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // sign - - string sign = elt->getAttributeValue ("sign"); - - msrPedal::msrPedalSignKind - pedalSignKind = - msrPedal::kPedalSignNo; - - if (sign == "yes") { - pedalSignKind = msrPedal::kPedalSignYes; - } - else if (sign == "no") { - pedalSignKind = msrPedal::kPedalSignNo; - } - else { - if (sign.size ()) { - stringstream s; - - s << - "pedal sign \"" << sign << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // create the pedal - S_msrPedal - pedal = - msrPedal::create ( - inputLineNumber, - pedalTypeKind, - pedalLineKind, - pedalSignKind); - - if (fOnGoingDirectionType) { - // append it to the pending pedals list - fPendingPedalsList.push_back (pedal); - } - else { - stringstream s; - - s << "pedal " << pedal->asShortString () << " is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_ending& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_ending" << - ", line " << inputLineNumber << - endl; - } -#endif - - // number - - { - fCurrentBarlineEndingNumber = - elt->getAttributeValue ("number"); // may be "1, 2" - - if (! fCurrentBarlineEndingNumber.size ()) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "mandatory ending number is missing, assuming \"1\""); - - fCurrentBarlineEndingNumber = "1"; - } - } - - // type - - { - string type = - elt->getAttributeValue ("type"); - - fCurrentBarlineEndingTypeKind = - msrBarline::kBarlineEndingNone; - - if (type == "start") { - fCurrentBarlineEndingTypeKind = - msrBarline::kBarlineEndingTypeStart; - } - else if (type == "stop") { - fCurrentBarlineEndingTypeKind = - msrBarline::kBarlineEndingTypeStop; - } - else if (type == "discontinue") { - fCurrentBarlineEndingTypeKind = - msrBarline::kBarlineEndingTypeDiscontinue; - } - else { - stringstream s; - - s << - "ending type \"" << type << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_repeat& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_repeat" << - ", line " << inputLineNumber << - endl; - } -#endif - - // direction - - { - string direction = elt->getAttributeValue ("direction"); - - fCurrentBarlineRepeatDirectionKind = - msrBarline::kBarlineRepeatDirectionNone; - - if (direction == "forward") { - fCurrentBarlineRepeatDirectionKind = - msrBarline::kBarlineRepeatDirectionForward; - } - else if (direction == "backward") { - fCurrentBarlineRepeatDirectionKind = - msrBarline::kBarlineRepeatDirectionBackward; - } - else { - stringstream s; - - s << - "repeat direction \"" << direction << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // winged - - { - string winged = elt->getAttributeValue ("winged"); - - fCurrentBarlineRepeatWingedKind = - msrBarline::kBarlineRepeatWingedNone; // default value - - if (winged.size ()) { - if (winged == "none") { - fCurrentBarlineRepeatWingedKind = - msrBarline::kBarlineRepeatWingedNone; - } - else if (winged == "straight") { - fCurrentBarlineRepeatWingedKind = - msrBarline::kBarlineRepeatWingedStraight; - } - else if (winged == "curved") { - fCurrentBarlineRepeatWingedKind = - msrBarline::kBarlineRepeatWingedCurved; - } - else if (winged == "double-straight") { - fCurrentBarlineRepeatWingedKind = - msrBarline::kBarlineRepeatWingedDoubleStraight; - } - else if (winged == "double-curved") { - fCurrentBarlineRepeatWingedKind = - msrBarline::kBarlineRepeatWingedDoubleCurved; - } - else { - stringstream s; - - s << - "repeat winged \"" << winged << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // times - - { - fCurrentBarlineTimes = - elt->getAttributeIntValue ("times", 2); // default value JMI ??? - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitEnd ( S_barline& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_barline" << - ", line " << inputLineNumber << - endl; - } -#endif - - // is there a pending tuplet? - if (fTupletsStack.size ()) { // JMI - // finalize the tuplet, - // for it to be created before the barline - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - } - - // create the barline - S_msrBarline - barline = - msrBarline::create ( - inputLineNumber, - fCurrentBarlineLocationKind, - fCurrentBarlineStyleKind, - fCurrentBarlineRepeatDirectionKind, - fCurrentBarlineEndingTypeKind, - fCurrentBarlineEndingNumber, - fCurrentBarlineTimes, - msrBarline::k_NoBarlineCategory, // will be set afterwards - fCurrentBarlineHasSegnoKind, - fCurrentBarlineHasCodaKind, - fCurrentBarlineRepeatWingedKind); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - fLogOutputStream << - "Creating barline in part " << - fCurrentPart->getPartCombinedName () << ":" << - endl; - - gIndenter++; - - fLogOutputStream << - barline; - - gIndenter--; - } -#endif - - // wait until its category is defined - // to append the barline to the current segment - - // handle the barline according to: JMI - // http://www.musicxml.com/tutorial/the-midi-compatible-part/repeats/ - - bool barlineHasBeenHandled = false; - - switch (fCurrentBarlineLocationKind) { - case msrBarline::kBarlineLocationNone: - // should not occur - break; - - case msrBarline::kBarlineLocationLeft: - if ( - fCurrentBarlineEndingTypeKind == msrBarline::kBarlineEndingTypeStart - ) { - // ending start, don't know yet whether it's hooked or hookless - // ------------------------------------------------------ - if (! fCurrentBarlineEndingNumber.size ()) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "mandatory ending number is missing, assuming \"1\""); - - fCurrentBarlineEndingNumber = "1"; - } - - // don't know yet whether repeat ending start barline is hooked or hookless - // remember it in fCurrentRepeatEndingStartBarline, - fCurrentRepeatEndingStartBarline = barline; - - // handle the repeat ending start - handleRepeatEndingStart (barline); - - barlineHasBeenHandled = true; - } - - else if ( - fCurrentBarlineRepeatDirectionKind == msrBarline::kBarlineRepeatDirectionForward - ) { - // repeat start - // ------------------------------------------------------ - // set the barline category - barline-> - setBarlineCategory ( - msrBarline::kBarlineCategoryRepeatStart); - - // handle the repeat start - handleRepeatStart (barline); - - barlineHasBeenHandled = true; - } - break; - - case msrBarline::kBarlineLocationMiddle: - // JMI ??? - break; - - case msrBarline::kBarlineLocationRight: - { - if ( - fCurrentBarlineEndingTypeKind == msrBarline::kBarlineEndingTypeStop - && - fCurrentBarlineEndingNumber.size () != 0 - ) { - // hooked ending end - // ------------------------------------------------------ - // set current barline ending start category - fCurrentRepeatEndingStartBarline-> - setBarlineCategory ( - msrBarline::kBarlineCategoryHookedEndingStart); - - // set this barline's category - barline-> - setBarlineCategory ( - msrBarline::kBarlineCategoryHookedEndingEnd); - - // handle the repeat hooked ending end - handleRepeatHookedEndingEnd (barline); - - barlineHasBeenHandled = true; - } - - else if ( - fCurrentBarlineRepeatDirectionKind == msrBarline::kBarlineRepeatDirectionBackward - ) { - // repeat end - // ------------------------------------------------------ - - // handle the repeat end - handleRepeatEnd (barline); - - barlineHasBeenHandled = true; - } - - else if ( - fCurrentBarlineEndingTypeKind == msrBarline::kBarlineEndingTypeDiscontinue - && - fCurrentBarlineEndingNumber.size () != 0 - ) { - // hookless ending end - // ------------------------------------------------------ - // set current barline ending start category - fCurrentRepeatEndingStartBarline-> - setBarlineCategory ( - msrBarline::kBarlineCategoryHooklessEndingStart); - - // set this barline's category - barline-> - setBarlineCategory ( - msrBarline::kBarlineCategoryHooklessEndingEnd); - - // handle the repeat hookless ending end - handleRepeatHooklessEndingEnd (barline); - - barlineHasBeenHandled = true; - } - - // forget about current repeat ending start barline - fCurrentRepeatEndingStartBarline = nullptr; - } - break; - } // switch - - // set the barline category to stand alone if not yet handled - if (! barlineHasBeenHandled) { - switch (fCurrentBarlineStyleKind) { - case msrBarline::kBarlineStyleRegular: - case msrBarline::kBarlineStyleDotted: - case msrBarline::kBarlineStyleDashed: - case msrBarline::kBarlineStyleHeavy: - case msrBarline::kBarlineStyleLightLight: - case msrBarline::kBarlineStyleLightHeavy: - case msrBarline::kBarlineStyleHeavyLight: - case msrBarline::kBarlineStyleHeavyHeavy: - case msrBarline::kBarlineStyleTick: - case msrBarline::kBarlineStyleShort: - barline-> - setBarlineCategory ( - msrBarline::kBarlineCategoryStandalone); - - // append the bar line to the current part - #ifdef TRACE_OAH - if (gTraceOah->fTraceBarlines) { - fLogOutputStream << - "Appending a standalone barline to part " << - fCurrentPart->getPartCombinedName () << ":" << - endl; - - gIndenter++; - - fLogOutputStream << - barline; - - gIndenter--; - } - #endif - - fCurrentPart-> - appendBarlineToPart (barline); - - barlineHasBeenHandled = true; - break; - - case msrBarline::kBarlineStyleNone: - stringstream s; - - s << - "barline " << - barline->asString () << - " has no barline style"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - break; - } // switch - } - - // has this barline been handled? - if (! barlineHasBeenHandled) { - stringstream s; - - s << left << - "cannot handle a barline containing: " << - barline->asString (); - - msrInternalWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - -/* JMI - // sanity check - switch (barline->getBarlineCategory ()) { - case msrBarline::k_NoBarlineCategory: - { - stringstream s; - - s << - "barline " << - barline->asString () << - " has no barline category"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - case msrBarline::kBarlineCategoryStandalone: - case msrBarline::kBarlineCategoryRepeatStart: - case msrBarline::kBarlineCategoryRepeatEnd: - case msrBarline::kBarlineCategoryHookedEndingStart: - case msrBarline::kBarlineCategoryHookedEndingEnd: - case msrBarline::kBarlineCategoryHooklessEndingStart: - case msrBarline::kBarlineCategoryHooklessEndingEnd: - break; - } // switch -*/ - - fOnGoingBarline = false; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_note& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_note" << - ", line " << inputLineNumber << - endl; - } -#endif - - // save previous note staff number - fPreviousNoteMusicXMLStaffNumber = fCurrentMusicXMLStaffNumber; - - // initialize note data to a neutral state - initializeNoteData (); - - fCurrentNoteDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentNoteAlterationKind = kNatural; - - fCurrentNoteOctave = K_NO_OCTAVE; - - fCurrentNoteSoundingWholeNotes = rational (0, 1); - fCurrentNoteSoundingWholeNotesFromDuration = rational (0, 1); - - fCurrentDisplayDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentDisplayOctave = K_NO_OCTAVE; - fCurrentNoteDisplayWholeNotes = rational (0, 1); - fCurrentNoteDisplayWholeNotesFromType = rational (0, 1); - - // note head - - fCurrentNoteHeadKind = msrNote::kNoteHeadNormal; - fCurrentNoteHeadFilledKind = msrNote::kNoteHeadFilledYes; - fCurrentNoteHeadParenthesesKind = msrNote::kNoteHeadParenthesesNo; - - // assuming staff number 1, unless S_staff states otherwise afterwards - fCurrentMusicXMLStaffNumber = 1; // JMI - - // assuming voice number 1, unless S_voice states otherwise afterwards - fCurrentMusicXMLVoiceNumber = 1; // JMI - - // tuplets - - fCurrentNoteHasATimeModification = false; - - fCurrentNoteActualNotes = -1; - fCurrentNoteNormalNotes = -1; - - // harmonies - - fCurrentHarmonyWholeNotesOffset = rational (0, 1); - - // lyrics - - fCurrentNoteHasLyrics = false; - fASkipSyllableHasBeenGeneratedForcurrentNote = false; - - fCurrentStanzaNumber = K_NO_STANZA_NUMBER; - fCurrentStanzaName = K_NO_STANZA_NAME; - - fCurrentSyllabic = ""; - // don't forget about fCurrentLyricTextsList here, - // this will be done in visitStart ( S_syllabic& ) - fCurrentSyllableKind = msrSyllable::kSyllableNone; - - if (fOnGoingSyllableExtend) { - fCurrentSyllableExtendKind = - msrSyllable::kSyllableExtendContinue; // it may be absent - } - else { - fCurrentSyllableExtendKind = - msrSyllable::kSyllableExtendNone; - } - - // stems - - fCurrentStem = nullptr; - - // tremolos - - fCurrentNoteBelongsToADoubleTremolo = false; - fCurrentTremoloTypeKind = k_NoTremoloType; - - // ties - - fCurrentTie = nullptr; - fCurrentTiedOrientation = ""; - - // slurs - - fCurrentSlurType = ""; - fCurrentSlurTypeKind = msrSlur::k_NoSlur; - - // ligatures - - fCurrentLigatureKind = msrLigature::kLigatureNone; - - // print-object - - string printObjectString = elt->getAttributeValue ("print-object"); - - fCurrentNotePrintObjectKind = - msrPrintObjectKindFromString ( - inputLineNumber, - printObjectString); - - // note color, unofficial ??? JMI - - string noteColor = elt->getAttributeValue ("color"); - - fCurrentNoteRGB = ""; - fCurrentNoteAlpha = ""; - - bool wellFormedColor = true; - - int noteColorSize = noteColor.size (); - - if (noteColorSize) { - if (noteColor [0] != '#') { - wellFormedColor = false; - } - else { - size_t - found = - noteColor.find_first_not_of ("#0123456789ABCDEF"); - - if (found != string::npos) { - wellFormedColor = false; - } - else { - switch (noteColorSize) { - case 7: // RGB - fCurrentNoteAlpha = "FF"; - fCurrentNoteRGB = noteColor.substr (1, 6); - break; - case 9: // ARGB - fCurrentNoteAlpha = noteColor.substr (1, 2); - fCurrentNoteRGB = noteColor.substr (3, 8); - break; - default: - wellFormedColor = false; - } // switch - } - } - } - - if (! wellFormedColor) { - stringstream s; - - s << - "note color \"" << noteColor << - "\" should contain 6 or 8 upper case hexadecimal digits prededed by a '#'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - fOnGoingNote = true; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_step& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_step" << - ", line " << inputLineNumber << - endl; - } -#endif - - string step = elt->getValue(); - - checkStep ( - inputLineNumber, - step); - - fCurrentNoteDiatonicPitchKind = - msrDiatonicPitchKindFromString (step [0]); -} - -void mxmlTree2MsrTranslator::visitStart ( S_alter& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_alter" << - ", line " << inputLineNumber << - endl; - } -#endif - - float alter = (float)(*elt); - - fCurrentNoteAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - alter); - - if (fCurrentNoteAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "alter '" << alter << "'" - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_octave& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_octave" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNoteOctave = (int)(*elt); - - if (fCurrentNoteOctave < 0 || fCurrentNoteOctave > 9) { - stringstream s; - - s << - "octave value '" << fCurrentNoteOctave << - "' is not in the 0..9 range, '0' is assumed"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - elt->getInputLineNumber (), - s.str ()); - - fCurrentNoteOctave = 0; - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_duration& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_duration" << - ", line " << inputLineNumber << - endl; - } -#endif - - int duration = (int)(*elt); // divisions - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "Note duration: " << duration << - endl; - } -#endif - - if (fOnGoingBackup) { - fCurrentBackupDivisions = duration; - } - - else if (fOnGoingForward) { - fCurrentForwardDivisions = duration; - } - - else if (fOnGoingNote) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "fCurrentDivisionsPerQuarterNote: " << - fCurrentDivisionsPerQuarterNote << - endl; - } -#endif - - // set current grace note whole notes - fCurrentNoteSoundingWholeNotesFromDuration = - rational ( - duration, - fCurrentDivisionsPerQuarterNote * 4); // hence a whole note - fCurrentNoteSoundingWholeNotesFromDuration.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "fCurrentNoteSoundingWholeNotesFromDuration: " << - fCurrentNoteSoundingWholeNotesFromDuration << - endl; - } -#endif - -/* JMI - // set current grace note display whole notes - // to note sounding whole notes - fCurrentNoteDisplayWholeNotes = - fCurrentNoteSoundingWholeNotesFromDuration; // by default - */ - } - - else if (fOnGoingFiguredBass) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - fLogOutputStream << - "fCurrentDivisionsPerQuarterNote: " << - fCurrentDivisionsPerQuarterNote << - endl; - } -#endif - - // set current figured bass sounding whole notes - fCurrentFiguredBassSoundingWholeNotes = - rational ( - duration, - fCurrentDivisionsPerQuarterNote * 4); // hence a whole note - fCurrentFiguredBassSoundingWholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - fLogOutputStream << - "fCurrentFiguredBassSoundingWholeNotes: " << - fCurrentFiguredBassSoundingWholeNotes << - endl; - } -#endif - - // set current figured bass display whole notes - fCurrentFiguredBassDisplayWholeNotes = - rational ( - duration, - fCurrentDivisionsPerQuarterNote * 4); // hence a whole note - fCurrentFiguredBassDisplayWholeNotes.rationalise (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - fLogOutputStream << - "fCurrentFiguredBassDisplayWholeNotes: " << - fCurrentFiguredBassDisplayWholeNotes << - endl; - } -#endif - } - - else { - stringstream s; - - s << "duration " << duration << " is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -// fLogOutputStream << "=== mxmlTree2MsrTranslator::visitStart ( S_duration& elt ), fCurrentDuration = " << fCurrentDuration << endl; JMI -} - -void mxmlTree2MsrTranslator::visitStart ( S_instrument& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_instrument" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - -*/ - string id = elt->getAttributeValue ("id"); // JMI -} - -void mxmlTree2MsrTranslator::visitStart ( S_dot& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_dot" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNoteDotsNumber++; -} - -void mxmlTree2MsrTranslator::visitStart ( S_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_type" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - Type indicates the graphic note type, Valid values (from shortest to longest) are 1024th, 512th, 256th, 128th, 64th, 32nd, 16th, eighth, quarter, half, whole, breve, long, and maxima. The size attribute indicates full, cue, or large size, with full the default for regular notes and cue the default for cue and grace notes. -*/ - - { - string noteType = elt->getValue(); - - // the type contains a display duration, - fCurrentNoteGraphicDurationKind = - msrDurationKindFromString ( - inputLineNumber, - noteType); - } - - // size - - { - string noteTypeSize = elt->getAttributeValue ("size"); - - if (noteTypeSize == "full") { - // a regular note - } - else if (noteTypeSize == "cue") { // USE IT! JMI ??? - } - - else { - if (noteTypeSize.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "note type size \"" + noteTypeSize + "\" is unknown"); - } - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - /* JMI - fLogOutputStream << - "noteType: \"" << - noteType << - "\"" << - endl << - "noteTypeSize: \"" << - noteTypeSize << - "\"" << - endl; - */ - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_notehead& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_notehead" << - ", line " << inputLineNumber << - endl; - } -#endif - - { - string noteHead = elt->getValue(); - - if (noteHead == "slash") { - fCurrentNoteHeadKind = msrNote::kNoteHeadSlash; } - else if (noteHead == "triangle") { - fCurrentNoteHeadKind = msrNote::kNoteHeadTriangle; } - else if (noteHead == "diamond") { - fCurrentNoteHeadKind = msrNote::kNoteHeadDiamond; } - else if (noteHead == "square") { - fCurrentNoteHeadKind = msrNote::kNoteHeadSquare; } - else if (noteHead == "cross") { - fCurrentNoteHeadKind = msrNote::kNoteHeadCross; } - else if (noteHead == "x") { - fCurrentNoteHeadKind = msrNote::kNoteHeadX; } - else if (noteHead == "circle-x") { - fCurrentNoteHeadKind = msrNote::kNoteHeadCircleX; } - else if (noteHead == "inverted triangle") { - fCurrentNoteHeadKind = msrNote::kNoteHeadInvertedTriangle; } - else if (noteHead == "arrow down") { - fCurrentNoteHeadKind = msrNote::kNoteHeadArrowDown; } - else if (noteHead == "arrow up") { - fCurrentNoteHeadKind = msrNote::kNoteHeadArrowUp; } - else if (noteHead == "slashed") { - fCurrentNoteHeadKind = msrNote::kNoteHeadSlashed; } - else if (noteHead == "back slashed") { - fCurrentNoteHeadKind = msrNote::kNoteHeadBackSlashed; } - else if (noteHead == "normal") { - fCurrentNoteHeadKind = msrNote::kNoteHeadNormal; } - else if (noteHead == "cluster") { - fCurrentNoteHeadKind = msrNote::kNoteHeadCluster; } - else if (noteHead == "circle dot") { - fCurrentNoteHeadKind = msrNote::kNoteHeadCircleDot; } - else if (noteHead == "left triangle") { - fCurrentNoteHeadKind = msrNote::kNoteHeadLeftTriangle; } - else if (noteHead == "rectangle") { - fCurrentNoteHeadKind = msrNote::kNoteHeadRectangle; } - else if (noteHead == "none") { - fCurrentNoteHeadKind = msrNote::kNoteHeadNone; } - else if (noteHead == "do") { - fCurrentNoteHeadKind = msrNote::kNoteHeadDo; } - else if (noteHead == "re") { - fCurrentNoteHeadKind = msrNote::kNoteHeadRe; } - else if (noteHead == "mi") { - fCurrentNoteHeadKind = msrNote::kNoteHeadMi; } - else if (noteHead == "fa") { - fCurrentNoteHeadKind = msrNote::kNoteHeadFa; } - else if (noteHead == "fa up") { - fCurrentNoteHeadKind = msrNote::kNoteHeadFaUp; } - else if (noteHead == "so") { - fCurrentNoteHeadKind = msrNote::kNoteHeadSo; } - else if (noteHead == "la") { - fCurrentNoteHeadKind = msrNote::kNoteHeadLa; } - else if (noteHead == "ti") { - fCurrentNoteHeadKind = msrNote::kNoteHeadTi; } - else { - stringstream s; - - s << - "note head \"" << noteHead << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // filled - - { - string noteHeadFilled = elt->getAttributeValue ("filled"); - - if (noteHeadFilled == "yes") - fCurrentNoteHeadFilledKind = msrNote::kNoteHeadFilledYes; - else if (noteHeadFilled == "no") - fCurrentNoteHeadFilledKind = msrNote::kNoteHeadFilledNo; - else { - if (noteHeadFilled.size ()) { - stringstream s; - - s << - "note head filled \"" << noteHeadFilled << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // parentheses - - { - string noteHeadParentheses = elt->getAttributeValue ("parentheses"); - - if (noteHeadParentheses == "yes") - fCurrentNoteHeadParenthesesKind = msrNote::kNoteHeadParenthesesYes; - else if (noteHeadParentheses == "no") - fCurrentNoteHeadParenthesesKind = msrNote::kNoteHeadParenthesesNo; - else { - if (noteHeadParentheses.size ()) { - stringstream s; - - s << - "note head parentheses \"" << noteHeadParentheses << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // color JMI - -} - -void mxmlTree2MsrTranslator::visitStart ( S_accidental& elt ) // JMI -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accidental" << - ", line " << inputLineNumber << - endl; - } -#endif - - // value - - { - string accidentalValue = elt->getValue (); - - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalNone; - - if (accidentalValue == "sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharp; - else if (accidentalValue == "natural") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalNatural; - else if (accidentalValue == "flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlat; - else if (accidentalValue == "double-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalDoubleSharp; - else if (accidentalValue == "sharp-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharpSharp; - else if (accidentalValue == "flat-flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlatFlat; - else if (accidentalValue == "natural-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalNaturalSharp; - else if (accidentalValue == "natural-flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalNaturalFlat; - else if (accidentalValue == "quarter-flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalQuarterFlat; - else if (accidentalValue == "quarter-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalQuarterSharp; - else if (accidentalValue == "three-quarters-flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalThreeQuartersFlat; - else if (accidentalValue == "three-quarters-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalThreeQuartersSharp; - - else if (accidentalValue == "sharp-down") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharpDown; - else if (accidentalValue == "sharp-up") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharpUp; - else if (accidentalValue == "natural-down") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalNaturalDown; - else if (accidentalValue == "natural-up") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalNaturalUp; - else if (accidentalValue == "flat-down") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlatDown; - else if (accidentalValue == "flat-up") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlatUp; - else if (accidentalValue == "triple-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalTripleSharp; - else if (accidentalValue == "triple-flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalTripleFlat; - else if (accidentalValue == "slash-quarter-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSlashQuarterSharp; - else if (accidentalValue == "slash-sharp") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSlashSharp; - else if (accidentalValue == "slash-flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSlashFlat; - else if (accidentalValue == "double-slash-flat") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentaldoubleSlashFlat; - else if (accidentalValue == "sharp-1") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharp_1; - else if (accidentalValue == "sharp-2") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharp_2; - else if (accidentalValue == "sharp-3") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharp_3; - else if (accidentalValue == "sharp-5") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSharp_5; - else if (accidentalValue == "flat-1") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlat_1; - else if (accidentalValue == "flat-2") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlat_2; - else if (accidentalValue == "flat-3") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlat_3; - else if (accidentalValue == "flat-4") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalFlat_4; - else if (accidentalValue == "sori") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalSori; - else if (accidentalValue == "koron") - fCurrentNoteAccidentalKind = msrNote::kNoteAccidentalKoron; - else { - if (accidentalValue.size ()) { - stringstream s; - - s << - "accidental \"" << accidentalValue << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // editorial - - { - string editorialAccidental = elt->getAttributeValue ("editorial"); - - fCurrentNoteEditorialAccidentalKind = - msrNote::kNoteEditorialAccidentalNo; // default value - - if (editorialAccidental == "yes") - fCurrentNoteEditorialAccidentalKind = - msrNote::kNoteEditorialAccidentalYes; - else if (editorialAccidental == "no") - fCurrentNoteEditorialAccidentalKind = - msrNote::kNoteEditorialAccidentalNo; - else { - if (editorialAccidental.size ()) { - stringstream s; - - s << - "editorial accidental \"" << editorialAccidental << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // cautionary - - { - string cautionaryAccidental = elt->getAttributeValue ("cautionary"); - - fCurrentNoteCautionaryAccidentalKind = - msrNote::kNoteCautionaryAccidentalNo; // default value - - if (cautionaryAccidental == "yes") - fCurrentNoteCautionaryAccidentalKind = - msrNote::kNoteCautionaryAccidentalYes; - else if (cautionaryAccidental == "no") - fCurrentNoteCautionaryAccidentalKind = - msrNote::kNoteCautionaryAccidentalNo; - else { - if (cautionaryAccidental.size ()) { - stringstream s; - - s << - "cautionary accidental \"" << cautionaryAccidental << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_stem& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_stem" << - ", line " << inputLineNumber << - endl; - } -#endif - - string stem = elt->getValue(); - - // kind - msrStem::msrStemKind stemKind = msrStem::kStemNone; - - if (stem == "up") - stemKind = msrStem::kStemUp; - - else if (stem == "down") - stemKind = msrStem::kStemDown; - - else if (stem == "none") - stemKind = msrStem::kStemNone; - - else if (stem == "double") - stemKind = msrStem::kStemDouble; - - else { - stringstream s; - - s << - "stem \"" << fCurrentBeamValue << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // color JMI - - fCurrentStem = - msrStem::create ( - inputLineNumber, - stemKind); -} - -void mxmlTree2MsrTranslator::visitStart ( S_beam& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_beam" << - ", line " << inputLineNumber << - endl; - } -#endif - - // value - - fCurrentBeamValue = elt->getValue(); - - msrBeam::msrBeamKind beamKind = msrBeam::k_NoBeam; - - if (fCurrentBeamValue == "begin") { - beamKind = msrBeam::kBeginBeam; - } - else if (fCurrentBeamValue == "continue") { - beamKind = msrBeam::kContinueBeam; - } - else if (fCurrentBeamValue == "end") { - beamKind = msrBeam::kEndBeam; - } - else if (fCurrentBeamValue == "forward hook") { - beamKind = msrBeam::kForwardHookBeam; - } - else if (fCurrentBeamValue == "backward hook") { - beamKind = msrBeam::kBackwardHookBeam; - } - else { - stringstream s; - - s << - "beam \"" << fCurrentBeamValue << - "\"" << "is not known"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // number - - fCurrentBeamNumber = - elt->getAttributeIntValue ("number", 0); - - S_msrBeam - beam = - msrBeam::create ( - inputLineNumber, - fCurrentBeamNumber, - beamKind); - - // color JMI ??? - - fPendingBeamsList.push_back (beam); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_measure_style& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_measure_style" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // color JMI -} - -void mxmlTree2MsrTranslator::visitStart ( S_beat_repeat& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_beat_repeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - - - -*/ - - // slashes - - fCurrentBeatRepeatSlashes = elt->getAttributeIntValue ("slashes", 0); - - // use-dots - - string useDotsString = elt->getAttributeValue ("use-dots"); - - fCurrentUseDotsKind = - msrUseDotsFromString ( - inputLineNumber, - useDotsString); -} - -void mxmlTree2MsrTranslator::visitStart ( S_measure_repeat& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_measure_repeat" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - The multiple-rest and measure-repeat symbols indicate the - number of measures covered in the element content. The - beat-repeat and slash elements can cover partial measures. - All but the multiple-rest element use a type attribute to - indicate starting and stopping the use of the style. The - optional number attribute specifies the staff number from - top to bottom on the system, as with clef. -*/ - - fCurrentMeasuresRepeatMeasuresNumber = (int)(*elt); - - // slashes - - fCurrentMeasuresRepeatSlashesNumber = - elt->getAttributeIntValue ("slashes", 1); // default value - - // type - - string measuresRepeatType = - elt->getAttributeValue ("type"); - - fCurrentMeasuresRepeatKind = - msrMeasuresRepeat::k_NoMeasuresRepeat; - - if (measuresRepeatType == "start") { - fCurrentMeasuresRepeatKind = - msrMeasuresRepeat::kStartMeasuresRepeat; // JMI - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Creating measures repeat from its first measures" << - "in part " << - fCurrentPart->getPartCombinedName () << - ", fCurrentMeasuresRepeatMeasuresNumber: " << - fCurrentMeasuresRepeatMeasuresNumber << - ", fCurrentMeasuresRepeatSlashesNumber: " << - fCurrentMeasuresRepeatSlashesNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentPart-> - createMeasuresRepeatFromItsFirstMeasuresInPart ( - inputLineNumber, - fCurrentMeasuresRepeatMeasuresNumber, - fCurrentMeasuresRepeatSlashesNumber); - } - - else if (measuresRepeatType == "stop") { - fCurrentMeasuresRepeatKind = - msrMeasuresRepeat::kStopMeasuresRepeat; // JMI - -#ifdef TRACE_OAH - if (gTraceOah->fTraceMeasuresRepeats) { - fLogOutputStream << - "Appending measures repeat " << - "to part " << - fCurrentPart->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentPart-> - appendPendingMeasuresRepeatToPart ( - inputLineNumber); - } - - else { - stringstream s; - - s << - "measure-repeat type \"" << measuresRepeatType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_multiple_rest& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_multiple_rest" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentRestMeasuresMeasuresNumber = (int)(*elt); - - string restMeasuresUseSymbols = elt->getAttributeValue ("use-symbols"); - - if (restMeasuresUseSymbols == "yes") { - // JMI - } - else if (restMeasuresUseSymbols == "no") { - // JMI - } - else { - if (restMeasuresUseSymbols.size ()) { - stringstream s; - - s << - "multiple rest use symbols " << - restMeasuresUseSymbols << - " is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // register number of remeaining rest measures - fRemainingRestMeasuresMeasuresNumber = - fCurrentRestMeasuresMeasuresNumber; - - // the multiple rest will created at the end of its first measure, - // so that the needed staves/voices have been created - - fOnGoingRestMeasures = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_slash& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_slash" << - ", line " << inputLineNumber << - endl; - } -#endif - - // type - - string slashType = elt->getAttributeValue ("type"); - - if (slashType == "start") - fCurrentSlashTypeKind = kSlashTypeStart; - else if (slashType == "stop") - fCurrentSlashTypeKind = kSlashTypeStop; - else { - stringstream s; - - s << - "slash type \"" << slashType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // use-dots - - string useDotsString = elt->getAttributeValue ("use-dots"); - - fCurrentUseDotsKind = - msrUseDotsFromString ( - inputLineNumber, - useDotsString); - - // use-stems - - string slashUseStems = elt->getAttributeValue ("use-stems"); - - if (slashUseStems == "yes") - fCurrentSlashUseStemsKind = kSlashUseStemsYes; - else if (slashUseStems == "no") - fCurrentSlashUseStemsKind = kSlashUseStemsNo; - else { - if (slashUseStems.size ()) { - stringstream s; - - s << - "slash use-stems \"" << slashUseStems << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - fCurrentSlashDotsNumber = 0; -} - -void mxmlTree2MsrTranslator::visitStart ( S_slash_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_slash_type" << - ", line " << inputLineNumber << - endl; - } -#endif - - string slashType = elt->getValue(); - - // the type contains a display duration, - fCurrentSlashGraphicDurationKind = - msrDurationKindFromString ( - inputLineNumber, - slashType); - - // size - - string slashTypeSize = elt->getAttributeValue ("size"); - - if (slashTypeSize == "cue") { // USE IT! JMI ??? - } - - else { - if (slashTypeSize.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "slash type size \"" + slashTypeSize + "\" is unknown"); - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlashes) { - fLogOutputStream << - "slashType: \"" << - slashType << - "\"" << - endl << - "slashTypeSize: \"" << - slashTypeSize << - "\"" << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_slash_dot& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_slash_dot" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentSlashDotsNumber++; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_slash& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_slash" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrSlash - slash = - msrSlash::create ( - inputLineNumber, - fCurrentSlashTypeKind, - fCurrentUseDotsKind, - fCurrentSlashUseStemsKind); - - fPendingSlashesList.push_back (slash); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_articulations& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_articulations" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_accent& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accent" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kAccent, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_breath_mark& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_breath_mark" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kBreathMark, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_caesura& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_caesura" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kCaesura, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_spiccato& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_spiccato" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kSpiccato, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_staccato& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staccato" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kStaccato, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_staccatissimo& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staccatissimo" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kStaccatissimo, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_stress& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_stress" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kStress, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_unstress& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_unstress" << - ", line " << inputLineNumber << - endl; - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kUnstress, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_detached_legato& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_detached_legato" << - ", line " << inputLineNumber << - endl; - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kDetachedLegato, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_strong_accent& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_strong_accent" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - // type : upright inverted (Binchois20.xml) // JMI - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kStrongAccent, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_tenuto& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tenuto" << - ", line " << inputLineNumber << - endl; - } -#endif - - // type : upright inverted (Binchois20.xml) // JMI ??? - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kTenuto, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_doit& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_doit" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kDoit, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_falloff& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_falloff" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kFalloff, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_plop& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_plop" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kPlop, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_scoop& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_scoop" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the articulation - S_msrArticulation - articulation = - msrArticulation::create ( - inputLineNumber, - msrArticulation::kScoop, - placementKind); - - if (! gMsrOah->fOmitArticulations) { - fCurrentArticulations.push_back (articulation); - } -} - -void mxmlTree2MsrTranslator::visitEnd ( S_articulations& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_articulations" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // JMI -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_arpeggiate& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_arpeggiate" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // number - - int number = elt->getAttributeIntValue ("number", 0); - - // direction - - string directionString = elt->getAttributeValue ("direction"); - - msrDirectionKind directionKind = kDirectionNone; // default value - - if (directionString == "up") - directionKind = kDirectionUp; - else if (directionString == "down") - directionKind = kDirectionDown; - else { - if (directionString.size ()) { - stringstream s; - - s << - "arpeggiate direction \"" << directionString << "\"" << "is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // color JMI - - // create the arpeggiato - S_msrArpeggiato - arpeggiato = - msrArpeggiato::create ( - inputLineNumber, - placementKind, - directionKind, - number); - - fCurrentArticulations.push_back (arpeggiato); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_non_arpeggiate& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_non_arpeggiate" << // JMI - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // type - - string typeString = elt->getAttributeValue ("type"); - - msrNonArpeggiato::msrNonArpeggiatoTypeKind - nonArpeggiatoTypeKind = - msrNonArpeggiato::kNonArpeggiatoTypeNone; // default value - - if (typeString == "top") - nonArpeggiatoTypeKind = - msrNonArpeggiato::kNonArpeggiatoTypeTop; - else if (typeString == "bottom") - nonArpeggiatoTypeKind = - msrNonArpeggiato::kNonArpeggiatoTypeBottom; - else { - if (typeString.size ()) { - - stringstream s; - - s << - "non-arpeggiate type \"" << typeString << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // number - - int number = elt->getAttributeIntValue ("number", 0); - - // color JMI - - // create the non arpeggiato - S_msrNonArpeggiato - nonArpeggiato = - msrNonArpeggiato::create ( - inputLineNumber, - placementKind, - nonArpeggiatoTypeKind, - number); - - fCurrentArticulations.push_back (nonArpeggiato); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_technical& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_technical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingTechnical = true; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_technical& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_technical" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingTechnical = false; -} - -void mxmlTree2MsrTranslator::visitStart ( S_arrow& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_arrow" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kArrow, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_bend_alter& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bend_alter" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fBendAlterValue = (float)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_bend& elt ) // JMI -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bend" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitEnd ( S_bend& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bend" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with float - S_msrTechnicalWithFloat - technicalWithFloat = - msrTechnicalWithFloat::create ( - inputLineNumber, - msrTechnicalWithFloat::kBend, - fBendAlterValue, - placementKind); - - fCurrentTechnicalWithFloatsList.push_back ( - technicalWithFloat); -} - -void mxmlTree2MsrTranslator::visitStart ( S_double_tongue& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_double_tongue" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kDoubleTongue, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_down_bow& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_down_bow" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kDownBow, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_fingering& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fingering" << - ", line " << inputLineNumber << - endl; - } -#endif - - int fingeringValue = (int)(*elt); - - if (fOnGoingTechnical) { - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with integer - S_msrTechnicalWithInteger - technicalWithInteger = - msrTechnicalWithInteger::create ( - inputLineNumber, - msrTechnicalWithInteger::kFingering, - fingeringValue, - placementKind); - - fCurrentTechnicalWithIntegersList.push_back ( - technicalWithInteger); - } - - else if (fOnGoingFrameNote) { - fCurrentFrameNoteFingering = fingeringValue; - } - - else { - stringstream s; - - s << - "fingering \"" << fingeringValue << - "\" is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_fingernails& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fingernails" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kFingernails, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_fret& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fret" << - ", line " << inputLineNumber << - endl; - } -#endif - - int fretValue = (int)(*elt); - - if (fOnGoingTechnical) { - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - fretPlacementKind = kPlacementNone; - - // color JMI ??? - - // create the technical with integer - S_msrTechnicalWithInteger - technicalWithInteger = - msrTechnicalWithInteger::create ( - inputLineNumber, - msrTechnicalWithInteger::kFret, - fretValue, - fretPlacementKind); - - fCurrentTechnicalWithIntegersList.push_back ( - technicalWithInteger); - } - - else if (fOnGoingFrameNote) { - fCurrentFrameNoteFretNumber = fretValue; - } - - else { - stringstream s; - - s << - "fret \"" << fretValue << - "\" is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_hammer_on& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_hammer_on" << - ", line " << inputLineNumber << - endl; - } -#endif - - string hammerOnValue = elt->getValue (); - - // type - - string hammerOnType = elt->getAttributeValue ("type"); - - msrTechnicalTypeKind hammerOnTechnicalTypeKind = k_NoTechnicalType; - - if (hammerOnType == "start") - hammerOnTechnicalTypeKind = kTechnicalTypeStart; - else if (hammerOnType == "stop") - hammerOnTechnicalTypeKind = kTechnicalTypeStop; - else { - if (hammerOnType.size ()) { - stringstream s; - - s << - "hammer-on type \"" << hammerOnType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with string - S_msrTechnicalWithString - technicalWithString = - msrTechnicalWithString::create ( - inputLineNumber, - msrTechnicalWithString::kHammerOn, - hammerOnTechnicalTypeKind, - hammerOnValue, - placementKind); - - fCurrentTechnicalWithStringsList.push_back (technicalWithString); -} - -void mxmlTree2MsrTranslator::visitStart ( S_handbell& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_handbell" << - ", line " << inputLineNumber << - endl; - } -#endif - - string handBellValue = elt->getValue (); - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with string - S_msrTechnicalWithString - technicalWithString = - msrTechnicalWithString::create ( - inputLineNumber, - msrTechnicalWithString::kHandbell, - k_NoTechnicalType, - handBellValue, - placementKind); - - fCurrentTechnicalWithStringsList.push_back (technicalWithString); -} - -void mxmlTree2MsrTranslator::visitStart ( S_harmonic& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_harmonic" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kHarmonic, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_heel& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_heel" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kHeel, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_hole& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_hole" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kHole, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_open_string& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_open_string" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kOpenString, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_other_technical& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_other_technical" << - ", line " << inputLineNumber << - endl; - } -#endif - - string otherTechnicalValue = elt->getValue (); - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with string - S_msrTechnicalWithString - technicalWithString = - msrTechnicalWithString::create ( - inputLineNumber, - msrTechnicalWithString::kOtherTechnical, - k_NoTechnicalType, - otherTechnicalValue, - placementKind); - - fCurrentTechnicalWithStringsList.push_back (technicalWithString); -} - -void mxmlTree2MsrTranslator::visitStart ( S_pluck& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pluck" << - ", line " << inputLineNumber << - endl; - } -#endif - - string pluckValue = elt->getValue (); - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with string - S_msrTechnicalWithString - technicalWithString = - msrTechnicalWithString::create ( - inputLineNumber, - msrTechnicalWithString::kPluck, - k_NoTechnicalType, - pluckValue, - placementKind); - - fCurrentTechnicalWithStringsList.push_back (technicalWithString); -} - -void mxmlTree2MsrTranslator::visitStart ( S_pull_off& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pull_off" << - ", line " << inputLineNumber << - endl; - } -#endif - - string pullOffValue = elt->getValue (); - - // type - - string pullOffType = elt->getAttributeValue ("type"); - - msrTechnicalTypeKind pullOffTechnicalTypeKind = k_NoTechnicalType; - - if (pullOffType == "start") - pullOffTechnicalTypeKind = kTechnicalTypeStart; - else if (pullOffType == "stop") - pullOffTechnicalTypeKind = kTechnicalTypeStop; - else { - if (pullOffType.size ()) { - stringstream s; - - s << - "pull-off type \"" << pullOffType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with string - S_msrTechnicalWithString - technicalWithString = - msrTechnicalWithString::create ( - inputLineNumber, - msrTechnicalWithString::kPullOff, - pullOffTechnicalTypeKind, - pullOffValue, - placementKind); - - fCurrentTechnicalWithStringsList.push_back (technicalWithString); -} - -void mxmlTree2MsrTranslator::visitStart ( S_snap_pizzicato& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_snap_pizzicato" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kSnapPizzicato, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_stopped& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_stopped" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kStopped, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_string& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_string" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - - - 5 - 0 - - -*/ - - string stringValue = elt->getValue(); - - int stringIntegerValue; - - istringstream inputStream (stringValue); - - inputStream >> stringIntegerValue; - - if (! stringValue.size ()) { - stringstream s; - - stringIntegerValue = 0; - - s << - "string value \"" << stringValue << - "\" is empoty, '" << stringIntegerValue << "' is assumed"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - if (fOnGoingTechnical) { - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical with integer - S_msrTechnicalWithInteger - technicalWithInteger = - msrTechnicalWithInteger::create ( - inputLineNumber, - msrTechnicalWithInteger::kString, - stringIntegerValue, - placementKind); - - fCurrentTechnicalWithIntegersList.push_back ( - technicalWithInteger); - } - - else if (fOnGoingFrame) { - fCurrentFrameNoteStringNumber = stringIntegerValue; - } - - else { - stringstream s; - - s << - "string \"" << stringValue << - "\" is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_tap& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tap" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kTap, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_thumb_position& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_thumb_position" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kThumbPosition, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_toe& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_toe" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kToe, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_triple_tongue& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_triple_tongue" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kTripleTongue, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -void mxmlTree2MsrTranslator::visitStart ( S_up_bow& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_up_bow" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the technical - S_msrTechnical - technical = - msrTechnical::create ( - inputLineNumber, - msrTechnical::kUpBow, - placementKind); - - fCurrentTechnicalsList.push_back (technical); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_fermata& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fermata" << - ", line " << inputLineNumber << - endl; - } -#endif - - string fermataTextValue = elt->getValue (); - - // kind - - msrFermata::msrFermataKind - fermataKind = - msrFermata::kNormalFermataKind; // default value - - if (fermataTextValue == "normal") - fermataKind = msrFermata::kNormalFermataKind; - - else if (fermataTextValue == "angled") - fermataKind = msrFermata::kAngledFermataKind; - - else if (fermataTextValue == "square") - fermataKind = msrFermata::kSquareFermataKind; - - else { - if (fermataTextValue.size ()) { - stringstream s; - - s << - "fermata kind \"" << fermataTextValue << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // type - - string fermataTypeValue = elt->getAttributeValue ("type"); - - msrFermata::msrFermataTypeKind - fermataTypeKind = - msrFermata::kFermataTypeNone; // default value - - if (fermataTypeValue == "upright") - fermataTypeKind = msrFermata::kFermataTypeUpright; - - else if (fermataTypeValue == "inverted") - fermataTypeKind = msrFermata::kFermataTypeInverted; - - else { - if (fermataTypeValue.size ()) { - stringstream s; - - s << - "fermata type \"" << fermataTypeValue << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // create the fermata - S_msrFermata - fermata = - msrFermata::create ( - inputLineNumber, - fermataKind, - fermataTypeKind); - - fCurrentArticulations.push_back (fermata); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_ornaments& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_ornaments" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_tremolo& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting tremolo" << - ", line " << inputLineNumber << - endl; - } -#endif - - // value (tremolo marks number) - - string tremoloMarksNumberString = - elt->getValue (); - - int tremoloMarksNumber = (int)(*elt); - - if (! tremoloMarksNumberString.size ()) { - stringstream s; - - tremoloMarksNumber = 1; - - s << - "--> tremolo value is missing, '" << tremoloMarksNumber << "' assumed"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - if (tremoloMarksNumber < 0 || tremoloMarksNumber > 8) { // JMI what does 0 mean? - stringstream s; - - s << - "tremolo value \"" << tremoloMarksNumber << - "\" should be between 0 and 8"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // type - - string tremoloType = elt->getAttributeValue ("type"); - - fCurrentTremoloTypeKind = kTremoloTypeSingle; // default value - - if (tremoloType == "single") - fCurrentTremoloTypeKind = kTremoloTypeSingle; - - else if (tremoloType == "start") - fCurrentTremoloTypeKind = kTremoloTypeStart; - - else if (tremoloType == "stop") - fCurrentTremoloTypeKind = kTremoloTypeStop; - - else if (tremoloType.size ()) { - stringstream s; - - s << - "tremolo type \"" << tremoloType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - singleTremoloPlacementKind = kPlacementNone; - - msrPlacementKind - doubleTremoloPlacementKind = kPlacementNone; - -/* JMI ??? - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); -*/ - - if (placementString == "above") { - switch (fCurrentTremoloTypeKind) { - case k_NoTremoloType: - // just to avoid a compiler message - break; - - case kTremoloTypeSingle: - singleTremoloPlacementKind = kPlacementAbove; - break; - - case kTremoloTypeStart: - case kTremoloTypeStop: - doubleTremoloPlacementKind = kPlacementAbove; - break; - } // switch - } - - else if (placementString == "below") { - switch (fCurrentTremoloTypeKind) { - case k_NoTremoloType: - // just to avoid a compiler message - break; - - case kTremoloTypeSingle: - singleTremoloPlacementKind = kPlacementBelow; - break; - - case kTremoloTypeStart: - case kTremoloTypeStop: - doubleTremoloPlacementKind = kPlacementBelow; - break; - } // switch - } - - else if (placementString.size ()) { - - stringstream s; - - s << - "tremolo placement \"" << placementString << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // handle double tremolos - switch (fCurrentTremoloTypeKind) { - case k_NoTremoloType: - // just to avoid a compiler message - break; - - case kTremoloTypeSingle: - // create a single tremolo, it will be attached to current note - // in attachCurrentSingleTremoloToNote() -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - fLogOutputStream << - "Creating a single tremolo" << - ", line " << inputLineNumber << - ", " << - singularOrPlural ( - tremoloMarksNumber, "mark", "marks") << - ", placement : " << - msrPlacementKindAsString ( - singleTremoloPlacementKind) << - endl; - } -#endif - - fCurrentSingleTremolo = - msrSingleTremolo::create ( - inputLineNumber, - tremoloMarksNumber, - singleTremoloPlacementKind); - break; - - case kTremoloTypeStart: - // if (! fCurrentDoubleTremolo) { JMI - { - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, // JMI fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // create a double tremolo start -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - fLogOutputStream << - "Creating a double tremolo" << - ", line " << inputLineNumber << - ", " << - singularOrPlural ( - tremoloMarksNumber, "mark", "marks") << - ", placement : " << - msrPlacementKindAsString ( - doubleTremoloPlacementKind) << - endl; - } -#endif - - fCurrentDoubleTremolo = - msrDoubleTremolo::create ( - inputLineNumber, - msrDoubleTremolo::kNotesDoubleTremolo, - kTremoloTypeStart, - tremoloMarksNumber, - doubleTremoloPlacementKind); - } - -/* - else { - stringstream s; - - s << - " start when a current double tremolo is already open"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -*/ - break; - - case kTremoloTypeStop: - if (fCurrentDoubleTremolo) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTremolos) { - fLogOutputStream << - "Meeting a double tremolo stop" << - ", line " << inputLineNumber << - endl; - } -#endif - - // it will be handled in - // handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest() - } - - else { - stringstream s; - - s << - " stop whit no preceeding start"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - } // switch -} - -void mxmlTree2MsrTranslator::visitStart ( S_trill_mark& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_trill_mark" << - ", line " << inputLineNumber << - endl; - } -#endif - - // type : upright inverted (Binchois20.xml) JMI - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentTrill, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_dashes& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_dashes" << - ", line " << inputLineNumber << - endl; - } -#endif - - // type : upright inverted (Binchois20.xml) JMI - - // number - - int dashesNumber = elt->getAttributeIntValue ("number", 0); // JMI - - // type - - string dashesType = elt->getAttributeValue ("type"); - - msrSpannerTypeKind fDashesSpannerTypeKind = k_NoSpannerType; - - if (dashesType == "start") - fDashesSpannerTypeKind = kSpannerTypeStart; - else if (dashesType == "continue") - fDashesSpannerTypeKind = kSpannerTypeContinue; - else if (dashesType == "stop") - fDashesSpannerTypeKind = kSpannerTypeStop; - else { - if (dashesType.size ()) { - stringstream s; - - s << - "dashes type \"" << dashesType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // color ??? JMI - - // create the spanner - S_msrSpanner - spanner = - msrSpanner::create ( - inputLineNumber, - dashesNumber, - msrSpanner::kSpannerDashes, - fDashesSpannerTypeKind, - placementKind, - nullptr); // will be set later REMOVE??? JMI - - fCurrentSpannersList.push_back (spanner); -} - -void mxmlTree2MsrTranslator::visitStart ( S_wavy_line& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_wavy_line" << - ", line " << inputLineNumber << - endl; - } -#endif - - // number - - int wavyLineNumber = elt->getAttributeIntValue ("number", 0); // JMI - - // type - - string wavyLineType = elt->getAttributeValue ("type"); - - msrSpannerTypeKind fWavyLineSpannerTypeKind = k_NoSpannerType; - - if (wavyLineType == "start") - fWavyLineSpannerTypeKind = kSpannerTypeStart; - else if (wavyLineType == "continue") - fWavyLineSpannerTypeKind = kSpannerTypeContinue; - else if (wavyLineType == "stop") - fWavyLineSpannerTypeKind = kSpannerTypeStop; - else { - if (wavyLineType.size ()) { - stringstream s; - - s << - "wavy-line type \"" << wavyLineType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // color JMI ??? - - // create the spanner - S_msrSpanner - spanner = - msrSpanner::create ( - inputLineNumber, - wavyLineNumber, - msrSpanner::kSpannerWavyLine, - fWavyLineSpannerTypeKind, - placementKind, - nullptr); // will be set later REMOVE??? JMI - - switch (fWavyLineSpannerTypeKind) { - case kSpannerTypeStart: - fCurrentSpannersList.push_back (spanner); - - // remember this wavy line spanner start - fCurrentWavyLineSpannerStart = spanner; - break; - - case kSpannerTypeStop: - // set spanner two-way sideLinks - // between both ends of the wavy line spanner - if (! fCurrentWavyLineSpannerStart) { - stringstream s; - - s << - "wavy-line stop found without corresponding start, ignoring it"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - else { - fCurrentSpannersList.push_back (spanner); - - spanner-> - setSpannerOtherEndSideLink ( - fCurrentWavyLineSpannerStart); - - // forget about this wavy line spanner start - fCurrentWavyLineSpannerStart = nullptr; - } - break; - - case kSpannerTypeContinue: - break; - - case k_NoSpannerType: - // JMI ??? - break; - } // switch -} - -void mxmlTree2MsrTranslator::visitStart ( S_turn& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_turn" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentTurn, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_inverted_turn& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_inverted_turn" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentInvertedTurn, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_delayed_turn& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_delayed_turn" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentDelayedTurn, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_delayed_inverted_turn& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_delayed_inverted_turn" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentDelayedInvertedTurn, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_vertical_turn& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_vertical_turn" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentVerticalTurn, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_mordent& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_mordent" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentMordent, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_inverted_mordent& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_inverted_mordent" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentInvertedMordent, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_schleifer& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_schleifer" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentSchleifer, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_shake& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_shake" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentShake, - placementKind); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_accidental_mark& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accidental_mark" << - ", line " << inputLineNumber << - endl; - } -#endif - - string accidentalMark = elt->getValue (); - - msrAlterationKind - currentOrnamentAccidentalMark = - k_NoAlteration; - - if (accidentalMark == "double-flat") - currentOrnamentAccidentalMark = kDoubleFlat; - - else if (accidentalMark == "three-quarters-flat") - currentOrnamentAccidentalMark = kSesquiFlat; - - else if (accidentalMark == "flat") - currentOrnamentAccidentalMark = kFlat; - - else if (accidentalMark == "quarter-flat") - currentOrnamentAccidentalMark = kSemiFlat; - - else if (accidentalMark == "natural") - currentOrnamentAccidentalMark = kNatural; - - else if (accidentalMark == "quarter-sharp") - currentOrnamentAccidentalMark = kSemiSharp; - - else if (accidentalMark == "sharp") - currentOrnamentAccidentalMark = kSharp; - - else if (accidentalMark == "three-quarters-sharp") - currentOrnamentAccidentalMark = kSesquiSharp; - - else if (accidentalMark == "double-sharp") - currentOrnamentAccidentalMark = kDoubleSharp; - - else if (accidentalMark.size ()) { - stringstream s; - - s << - "accidental-mark \"" << accidentalMark << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // create the ornament - S_msrOrnament - ornament = - msrOrnament::create ( - inputLineNumber, - msrOrnament::kOrnamentAccidentalMark, - placementKind); - - ornament-> - setOrnamentAccidentalMarkKind ( - currentOrnamentAccidentalMark); - - if (! gMsrOah->fOmitOrnaments) { - fCurrentOrnamentsList.push_back (ornament); - } -} - -void mxmlTree2MsrTranslator::visitEnd ( S_ornaments& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_ornaments" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart( S_f& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_f" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_ff& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_ff" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kFF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_fff& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fff" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kFFF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_ffff& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_ffff" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kFFFF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_fffff& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fffff" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kFFFFF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_ffffff& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_ffffff" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kFFFFFF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_p& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_p" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_pp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kPP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_ppp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_ppp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kPPP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_pppp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pppp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kPPPP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_ppppp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_ppppp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kPPPPP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_pppppp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pppppp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kPPPPPP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - - -void mxmlTree2MsrTranslator::visitStart( S_mf& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_mf" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kMF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_mp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_mp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kMP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_fp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kFP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} -void mxmlTree2MsrTranslator::visitStart( S_fz& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_fz" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kFZ, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_rf& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_rf" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kRF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_sf& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sf" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kSF, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_rfz& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_rfz" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kRFZ, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_sfz& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sfz" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kSFZ, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_sfp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sfp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kSFP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_sfpp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sfpp" << - ", line " << inputLineNumber << - endl; - } -#endif - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kSFPP, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_sffz& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sffz" << - ", line " << inputLineNumber << - endl; - } - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrDynamics - dynamics = - msrDynamics::create ( - inputLineNumber, - msrDynamics::kSFFZ, - placementKind); - - fPendingDynamicsList.push_back(dynamics); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_other_dynamics& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_other_dynamics" << - ", line " << inputLineNumber << - endl; - } -#endif - - string otherDynamicsValue = elt->getValue (); - - // placement - - string placementString = elt->getAttributeValue ("placement"); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the other dynamics - if (! gMsrOah->fOmitDynamics) { - S_msrOtherDynamics - otherDynamics = - msrOtherDynamics::create ( - inputLineNumber, - otherDynamicsValue, - placementKind); - - fPendingOtherDynamicsList.push_back(otherDynamics); - } -} - -//______________________________________________________________________________ -/* - The damper-pedal, soft-pedal, and sostenuto-pedal - attributes effect playback of the three common piano - pedals and their MIDI controller equivalents. The yes - value indicates the pedal is depressed; no indicates - the pedal is released. A numeric value from 0 to 100 - may also be used for half pedaling. This value is the - percentage that the pedal is depressed. A value of 0 is - equivalent to no, and a value of 100 is equivalent to yes. - - damper-pedal %yes-no-number; #IMPLIED - soft-pedal %yes-no-number; #IMPLIED - sostenuto-pedal %yes-no-number; #IMPLIED -*/ - -/* -void mxmlTree2MsrTranslator::visitStart( S_damper_pedal& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_damper_pedal" << - ", line " << inputLineNumber << - endl; -#endif - - string damperPedalValue = elt->getValue (); - - // check damper pedal value - if (damperPedalValue == "yes") - fCurrentDamperPedalKind - msrDamperPedal::kDamperPedalValueYes; - - else if (damperPedalValue == "no") - fCurrentDamperPedalKind = - msrDamperPedal::kDamperPedalValueNo; - - else { - istringstream inputStream (damperPedalValue); - - inputStream >> fCurrentDamperPedalIntegerValue; - - if ( - fCurrentDamperPedalIntegerValue < 0 - && - fCurrentDamperPedalIntegerValue > 100) { - stringstream s; - - s << - "damper pedal integer value \"" << - fCurrentDamperPedalIntegerValue << - "\" should be between 0 and 100"; - - msrMusicXMLError ( - inputLineNumber, - s.str ()); - } - - fCurrentDamperPedalKind = - msrDamperPedal::kDamperPedalValueZeroToAHundred; - -/ * JMI - if (damperPedalValue.size ()) { - msrMusicXMLError ( - inputLineNumber, - "unknown damper pedal \"" + - damperPedalValue + - "\", should be 'yes', 'no' or a number from 0 to 100"); - } - * / - } - - - S_msrDamperPedal - damperPedal = - msrDamperPedal::create ( - inputLineNumber, - otherDynamicsValue); - -} - -void mxmlTree2MsrTranslator::visitStart( S_soft_pedal& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_soft_pedal" << - ", line " << inputLineNumber << - endl; - } -#endif - - string softPedalValue = elt->getValue (); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the other dynamics - S_msrOtherDynamics - otherDynamics = - msrOtherDynamics::create ( - inputLineNumber, - otherDynamicsValue); - - fPendingOtherDynamicsList.push_back(otherDynamics); -} - -void mxmlTree2MsrTranslator::visitStart( S_sostenuto_pedal& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sostenuto_pedal" << - ", line " << inputLineNumber << - endl; - } -#endif - - string sostenutoPedalValue = elt->getValue (); - - msrPlacementKind - placementKind = - msrPlacementKindFromString ( - inputLineNumber, - placementString); - - // should the placement be forced to 'below'? - if (gMusicXMLOah->fAllDynamicsBelow) { - placementKind = kPlacementBelow; - } - - // create the other dynamics - S_msrOtherDynamics - otherDynamics = - msrOtherDynamics::create ( - inputLineNumber, - otherDynamicsValue); - - fPendingOtherDynamicsList.push_back(otherDynamics); -} -*/ - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_cue& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_cue" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNoteIsACueNote = true; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_grace& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_grace" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentNoteIsAGraceNote = true; - - // slash - - string slash = elt->getAttributeValue ("slash"); - - fCurrentGraceIsSlashed = false; // default value - - // check part group barline - if (slash == "yes") - fCurrentGraceIsSlashed = true; - - else if (slash == "no") - fCurrentGraceIsSlashed = false; - - else { - if (slash.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "grace slash \"" + slash + "\" unknown, should be 'yes' or 'no'"); - } - } - - // should all grace notes be slashed? - if (gMsrOah->fSlashAllGraceNotes) { - fCurrentGraceIsSlashed = true; - } - - fCurrentStealTimeFollowing = - elt->getAttributeValue ("steal-time-following"); - - fCurrentStealTimePrevious = - elt->getAttributeValue ("steal-time-previous"); - - fCurrentMakeTime = - elt->getAttributeValue ("make-time"); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_chord& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_chord" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // the current note belongs to a chord, - // placed in the corresponding staff AND voice - fCurrentNoteBelongsToAChord = true; - - // delay the handling until 'visitEnd ( S_note& elt)', - // because we don't know yet the voice and staff numbers for sure - // (they can be specified after in the ) -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_time_modification& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_time_modification" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // there may be no '' - // in the tuplet notes after the first one, - // so we detect tuplet notes on '' ??? JMI - fCurrentNoteHasATimeModification = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_actual_notes& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_actual_notes" << - ", line " << inputLineNumber << - endl; - } -#endif - - int actualNotes = (int)(*elt); - - if (fOnGoingNote) { - fCurrentNoteActualNotes = actualNotes; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "fCurrentNoteActualNotes: " << - fCurrentNoteActualNotes << - endl; - } -#endif - - // notes inside a tuplet have no markup - // and 2 actual notes indicate a double tremolo - switch (fCurrentNoteActualNotes) { - case 2: - fCurrentNoteBelongsToADoubleTremolo = true; - break; - default: - fCurrentNoteBelongsToATuplet = true; - } // switch - } - - else if (fOnGoingMetronomeNote) { - fCurrentMetronomeNoteActualNotes = actualNotes; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "fCurrentMetronomeNoteActualNotes: " << - fCurrentMetronomeNoteActualNotes << - endl; - } -#endif - } - - else { - stringstream s; - - s << - "actual notes \"" << actualNotes << - "\" is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_normal_notes& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_normal_notes" << - ", line " << inputLineNumber << - endl; - } -#endif - - int normalNotes = (int)(*elt); - - if (fOnGoingNote) { - fCurrentNoteNormalNotes = normalNotes; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "fCurrentNoteNormalNotes: " << - fCurrentNoteNormalNotes << - endl; - } -#endif - - // notes inside a tuplet have no markup - // and 1 actual note indicates a double tremolo - switch (fCurrentNoteNormalNotes) { - case 1: - fCurrentNoteBelongsToADoubleTremolo = true; - break; - default: - fCurrentNoteBelongsToATuplet = true; - } // switch - } - - else if (fOnGoingMetronomeNote) { - fCurrentMetronomeNoteNormalNotes = normalNotes; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "fCurrentMetronomeNoteNormalNotes: " << - fCurrentMetronomeNoteNormalNotes << - endl; - } -#endif - } - - else { - stringstream s; - - s << - "normal notes \"" << normalNotes << - "\" is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_normal_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_normal_type" << - ", line " << inputLineNumber << - endl; - } -#endif - - string normalTypeString = elt->getValue(); - - if (fOnGoingNote) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "normalTypeString: " << - normalTypeString << - endl; - } -#endif - - // the type contains a display duration - fCurrentNoteNormalTypeDuration = - msrDurationKindFromString ( - inputLineNumber, - normalTypeString); - - /* - // there can be several in a markup, - // register beat unit in in dotted durations list - fCurrentMetronomeBeatUnitsVector.push_back ( - msrDottedDuration ( - fCurrentNoteNormalTypeDuration, - 0)); - */ - } - - else if (fOnGoingMetronomeNote) { // JMI ??? - fCurrentMetronomeNoteNormalType = normalTypeString; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "fCurrentMetronomeNoteNormalType: " << - fCurrentMetronomeNoteNormalType << - endl; - } -#endif - - } - - else { - stringstream s; - - s << - "normal type \"" << normalTypeString << - "\" is out of context"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_tuplet& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuplet" << - ", line " << inputLineNumber << - endl; - } -#endif - - // number - - fPreviousTupletNumber = fCurrentTupletNumber; - - fCurrentTupletNumber = elt->getAttributeIntValue ("number", 0); - - // bracket - - { - string tupletBracket = elt->getAttributeValue ("bracket"); - - fCurrentTupletBracketKind = msrTuplet::kTupletBracketYes; // option ??? JMI - - if (tupletBracket == "yes") - fCurrentTupletBracketKind = msrTuplet::kTupletBracketYes; - else if (tupletBracket == "no") - fCurrentTupletBracketKind = msrTuplet::kTupletBracketNo; - else { - if (tupletBracket.size ()) { - stringstream s; - - s << - "tuplet bracket \"" << tupletBracket << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - stringstream s; - - s << - "tuplet bracket is empty: this is implementation dependent," << - " \"yes\" is assumed"; // option ??? JMI - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -#endif - } - } - } - - // line-shape - - { - string tupletLineShape = elt->getAttributeValue ("line-shape"); - - fCurrentTupletLineShapeKind = - msrTuplet::kTupletLineShapeStraight; // default value - - if (tupletLineShape == "straight") - fCurrentTupletLineShapeKind = msrTuplet::kTupletLineShapeStraight; - else if (tupletLineShape == "curved") - fCurrentTupletLineShapeKind = msrTuplet::kTupletLineShapeCurved; - else { - if (tupletLineShape.size ()) { - stringstream s; - - s << - "tuplet line-shape \"" << tupletLineShape << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - } - - // type - - { - string tupletType = elt->getAttributeValue ("type"); - - msrTuplet::msrTupletTypeKind - previousTupletTypeKind = fCurrentTupletTypeKind; - - fCurrentTupletTypeKind = msrTuplet::kTupletTypeNone; - - if (tupletType == "start") { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> There is a tuplet start (kTupletTypeStart)" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentTupletTypeKind = msrTuplet::kTupletTypeStart; - } - else if (tupletType == "continue") { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> There is a tuplet continue (kTupletTypeContinue)" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentTupletTypeKind = msrTuplet::kTupletTypeContinue; - } - else if (tupletType == "stop") { - if ( - fPreviousTupletNumber == fCurrentTupletNumber - && - ( - previousTupletTypeKind == msrTuplet::kTupletTypeStart - // JMI || - // previousTupletTypeKind == msrTuplet::kTupletTypeContinue - ) - ) { - // this is a tuplet stop right after a tuplet start - // for one and the same tuplet number: - // possible if the note is a tremolo -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> There is a tuplet stop right after a tuplet start for tuplet nummber " << fCurrentTupletNumber << - " (kTupletTypeStartAndStopInARow)" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentTupletTypeKind = msrTuplet::kTupletTypeStartAndStopInARow; - } - else { - // this is a 'regular' tuplet stop -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> There is a tuplet stop (kTupletTypeStop)" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentTupletTypeKind = msrTuplet::kTupletTypeStop; - } - } - else { - stringstream s; - - s << - "tuplet type \"" << tupletType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - // show-number - - { - string tupletShowNumber = elt->getAttributeValue ("show-number"); - - fCurrentTupletShowNumberKind = - msrTuplet::kTupletShowNumberActual; // default value - - if (tupletShowNumber == "actual") { - fCurrentTupletShowNumberKind = msrTuplet::kTupletShowNumberActual; - } - else if (tupletShowNumber == "both") { - fCurrentTupletShowNumberKind = msrTuplet::kTupletShowNumberBoth; - } - else if (tupletShowNumber == "none") { - fCurrentTupletShowNumberKind = msrTuplet::kTupletShowNumberNone; - } - else { - if (tupletShowNumber.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "tuplet show-number \"" + tupletShowNumber + "\" is unknown"); - } - } - } - - // show-type - - { - string tupletShowType = elt->getAttributeValue ("show-type"); - - fCurrentTupletShowTypeKind = msrTuplet::kTupletShowTypeNone; // default value - - if (tupletShowType == "actual") { - fCurrentTupletShowTypeKind = msrTuplet::kTupletShowTypeActual; - } - else if (tupletShowType == "both") { - fCurrentTupletShowTypeKind = msrTuplet::kTupletShowTypeBoth; - } - else if (tupletShowType == "none") { - fCurrentTupletShowTypeKind = msrTuplet::kTupletShowTypeNone; - } - else { - if (tupletShowType.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "tuplet show-type \"" + tupletShowType + "\" is unknown"); - } - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "fCurrentTupletNumber: " << - fCurrentTupletNumber << - ", fCurrentTupletTypeKind: " << - msrTuplet::tupletTypeKindAsString ( - fCurrentTupletTypeKind) << - ", fCurrentTupletBracketKind: " << - msrTuplet::tupletBracketKindAsString ( - fCurrentTupletBracketKind) << - ", fCurrentTupletShowNumberKind: " << - msrTuplet::tupletShowNumberKindAsString ( - fCurrentTupletShowNumberKind) << - ", fCurrentTupletShowTypeKind: " << - msrTuplet::tupletShowTypeKindAsString ( - fCurrentTupletShowTypeKind) << - endl; - } -#endif - - fCurrentNoteBelongsToATuplet = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_tuplet_actual& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuplet_actual" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingTupletActual = true; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_tuplet_actual& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_tuplet_actual" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingTupletActual = false; -} - -void mxmlTree2MsrTranslator::visitStart ( S_tuplet_normal& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuplet_normal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingTupletNormal = true; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_tuplet_normal& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_tuplet_normal" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fOnGoingTupletNormal = false; -} - -void mxmlTree2MsrTranslator::visitStart ( S_tuplet_number& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuplet_number" << - ", line " << inputLineNumber << - endl; - } -#endif - - // not handled JMI - int tupletNumberValue = (int)(*elt); - - if (fOnGoingTupletActual) { - fCurrentTupletActualNumber = tupletNumberValue; - } - else if (fOnGoingTupletNormal) { - fCurrentTupletNormalNumber = tupletNumberValue; - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "found a tuplet number out of context"); - } - - // color JMI - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "tuplet number (not handled): " << - tupletNumberValue << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_tuplet_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuplet_type" << - ", line " << inputLineNumber << - endl; - } -#endif - - // not handled JMI - string tupletTypeValue = elt->getValue(); - - if (fOnGoingTupletActual) { - fCurrentTupletActualType = tupletTypeValue; - } - else if (fOnGoingTupletNormal) { - fCurrentTupletNormalType = tupletTypeValue; - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "found a tuplet number out of context"); - } - - // color JMI - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "tuplet type (not handled): " << - tupletTypeValue << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_tuplet_dot& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_tuplet_dot" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fOnGoingTupletActual) { - fCurrentTupletActualDotsNumber++; - } - else if (fOnGoingTupletNormal) { - fCurrentTupletNormalDotsNumber++; - } - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "found a tuplet dot out of context"); - } - - // color JMI -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_glissando& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_glissando" << - ", line " << inputLineNumber << - endl; - } -#endif - - // glissando text, i.e. the text along it - string glissandoTextValue = elt->getValue (); - - // number - - int glissandoNumber = elt->getAttributeIntValue ("number", 0); - - // type - - string glissandoType = elt->getAttributeValue ("type"); - - msrGlissando::msrGlissandoTypeKind - glissandoTypeKind = msrGlissando::kGlissandoTypeNone; - - if (glissandoType == "start") - glissandoTypeKind = msrGlissando::kGlissandoTypeStart; - else if (glissandoType == "stop") - glissandoTypeKind = msrGlissando::kGlissandoTypeStop; - else { - stringstream s; - - s << - "glissando type \"" << glissandoType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // line-type - - string glissandoLineType = elt->getAttributeValue ("line-type"); - - msrLineTypeKind - glissandoLineTypeKind = - kLineTypeSolid; // default value - - if (glissandoLineType == "solid") { - glissandoLineTypeKind = kLineTypeSolid; - } - else if (glissandoLineType == "dashed") { - glissandoLineTypeKind = kLineTypeDashed; - } - else if (glissandoLineType == "dotted") { - glissandoLineTypeKind = kLineTypeDotted; - } - else if (glissandoLineType == "wavy") { - glissandoLineTypeKind = kLineTypeWavy; - } - else { - if (glissandoLineType.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "glissando line-type \"" + glissandoLineType + "\" is unknown"); - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGlissandos) { - fLogOutputStream << - "glissandoNumber: " << - glissandoNumber << - "glissandoType: " << - msrGlissando::glissandoTypeKindAsString ( - glissandoTypeKind) << - "glissandoLineType: " << - msrLineTypeKindAsString ( - glissandoLineTypeKind) << - "glissandoTextValue: " << - glissandoTextValue << - endl; - } -#endif - - // create glissando - S_msrGlissando - glissando = - msrGlissando::create ( - inputLineNumber, - glissandoNumber, - glissandoTypeKind, - glissandoLineTypeKind, - glissandoTextValue); - - // register glissando in this visitor -#ifdef TRACE_OAH - if (gTraceOah->fTraceGlissandos) { - fLogOutputStream << - "Appending glissando '" << - glissando->asString () << - "' to the glissandos pending list" << - endl; - } -#endif - - fPendingGlissandosList.push_back (glissando); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_slide& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_slide" << - ", line " << inputLineNumber << - endl; - } -#endif - - // slide text, i.e. the text along it - string slideTextValue = elt->getValue (); - - // number - - int slideNumber = elt->getAttributeIntValue ("number", 0); - - // type - - string slideType = elt->getAttributeValue ("type"); - - msrSlide::msrSlideTypeKind - slideTypeKind = msrSlide::kSlideTypeNone; - - if (slideType == "start") - slideTypeKind = msrSlide::kSlideTypeStart; - else if (slideType == "stop") - slideTypeKind = msrSlide::kSlideTypeStop; - else { - stringstream s; - - s << - "slide type \"" << slideType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // line-type - - string slideLineType = elt->getAttributeValue ("line-type"); - - msrLineTypeKind - slideLineTypeKind = - kLineTypeSolid; // default value - - if (slideLineType == "solid") { - slideLineTypeKind = kLineTypeSolid; - } - else if (slideLineType == "dashed") { - slideLineTypeKind = kLineTypeDashed; - } - else if (slideLineType == "dotted") { - slideLineTypeKind = kLineTypeDotted; - } - else if (slideLineType == "wavy") { - slideLineTypeKind = kLineTypeWavy; - } - else { - if (slideLineType.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "slide line-type \"" + slideLineType + "\" is unknown"); - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlides) { - fLogOutputStream << - "slideNumber: " << - slideNumber << - "slideType: " << - msrSlide::slideTypeKindAsString ( - slideTypeKind) << - "slideLineType: " << - msrLineTypeKindAsString ( - slideLineTypeKind) << - endl; - } -#endif - - // create slide - S_msrSlide - slide = - msrSlide::create ( - inputLineNumber, - slideNumber, - slideTypeKind, - slideLineTypeKind, - slideTextValue); - - // register glissando in this visitor -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlides) { - fLogOutputStream << - "Appending slide '" << - slide->asString () << - "' to the slides pending list" << - endl; - } -#endif - - fPendingSlidesList.push_back (slide); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_rest& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_rest" << - ", line " << inputLineNumber << - endl; - } -#endif - - /* - - - - - 3072 - 1 - 1 - - - 3072 - - - - 3072 - 5 - 2 - - - - - - 24 - 1 - - - - E - 4 - - -*/ - - fCurrentNoteQuarterTonesPitchKind = k_Rest_QTP; - fCurrentNoteIsARest = true; - - string restMeasure = elt->getAttributeValue ("measure"); - - fCurrentRestMeasure = false; - - if (restMeasure == "yes") { - fCurrentRestMeasure = true; - } - else if (restMeasure == "no") { - fCurrentRestMeasure = false; - } - - else { - if (restMeasure.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "rest measure \"" + restMeasure + "\" is unknown"); - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_display_step& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_display_step" << - ", line " << inputLineNumber << - endl; - } -#endif - - string displayStep = elt->getValue(); - - checkStep ( - inputLineNumber, - displayStep); - - fCurrentDisplayDiatonicPitchKind = - msrDiatonicPitchKindFromString ( - displayStep [0]); - - // pitched rests don't allow for alterations since - // the display-step merely indicates where to place them on the staff - fCurrentNoteAlterationKind = kNatural; -} - -void mxmlTree2MsrTranslator::visitStart ( S_display_octave& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_display_octave" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentDisplayOctave = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitEnd ( S_unpitched& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_unpitched" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentNoteIsUnpitched = true; - - // fCurrentNoteDiatonicPitch = // JMI - // fCurrentHarmonyRootDiatonicPitch; -} - -//______________________________________________________________________________ -S_msrChord mxmlTree2MsrTranslator::createChordFromItsFirstNote ( - int inputLineNumber, - S_msrVoice voice, - S_msrNote chordFirstNote, - msrNote::msrNoteKind noteKind) -{ - int firstNoteInputLineNumber = - chordFirstNote->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "--> creating a chord from its first note '" << - chordFirstNote->asShortString () << - ", in voice \"" << voice->getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // chordFirstNote has been registered standalone in the part element sequence, - // but it is actually the first note of a chord - - // create a chord - S_msrChord - chord = - msrChord::create ( - firstNoteInputLineNumber, - chordFirstNote->getNoteSoundingWholeNotes (), - chordFirstNote->getNoteDisplayWholeNotes (), - chordFirstNote->getNoteGraphicDurationKind ()); - - // register note as first member of chord -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Adding first note " << - chordFirstNote-> - asShortString () << - ", line " << inputLineNumber << - ", to new chord" << - endl; - } -#endif - - chord-> - addFirstNoteToChord ( - chordFirstNote, voice); - - // set chordFirstNote's kind - chordFirstNote-> - setNoteKind (noteKind); - - // copy chordFirstNote's elements if any to the chord - copyNoteElementsToChord ( - chordFirstNote, chord); - - // get chordFirstNote's measure upLink - S_msrMeasure - chordFirstNoteMeasureUpLink = - chordFirstNote-> - getNoteMeasureUpLink (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - fLogOutputStream << // JMI - endl << - endl << - "++++++++++++++++ chordFirstNote =" << - endl << - endl << - chordFirstNote << - endl << - "+++++++++++++++++" << - endl << - endl << - "++++++++++++++++ chordFirstNote->getNoteMeasureUpLink () ="; - - if (chordFirstNoteMeasureUpLink) { - fLogOutputStream << - endl << - endl; - } - else { - fLogOutputStream << - "none"; - } - } -#endif - -/* forget about this, too early??? JMI - // grace notes cannot be cross staff - if (! chordFirstNote->getNoteIsAGraceNote ()) { // JMI - // register the chord as non cross staff - fCurrentChordStaffNumber = - chordFirstNoteMeasureUpLink-> - getMeasureSegmentUpLink ()-> - getSegmentVoiceUpLink ()-> - getVoiceStaffUpLink ()-> - getStaffNumber (); - } - */ - - return chord; -} - -//______________________________________________________________________________ -/* JMI -void mxmlTree2MsrTranslator::registerVoiceCurrentChordInMap ( - int inputLineNumber, - S_msrVoice voice, - S_msrChord chord) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Registering chord '" << - chord->asString () << - "'" << - " as current chord in voice \"" << - voice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - // fVoicesCurrentChordMap [voice] = chord; - fVoicesCurrentChordMap [ - make_pair ( - voice->getVoiceStaffUpLink ()->getStaffNumber (), - voice->getVoiceNumber ())] = - chord; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - printCurrentChord (); - } -#endif -} -*/ - -//______________________________________________________________________________ -/* JMI -void mxmlTree2MsrTranslator::printVoicesCurrentChordMap () -{ - fLogOutputStream << - "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << - endl << - "fVoicesCurrentChordMap contains " << - singularOrPlural ( - fVoicesCurrentChordMap.size (), "element", "elements") << - ":"; - - if (fVoicesCurrentChordMap.size ()) { - fLogOutputStream << endl; - - gIndenter++; - -// map::const_iterator - map, S_msrChord>::const_iterator - iBegin = fVoicesCurrentChordMap.begin (), - iEnd = fVoicesCurrentChordMap.end (), - i = iBegin; - - for ( ; ; ) { - gIndenter++; - - / * JMI - S_msrVoice voice = (*i).first; - S_msrChord chord = (*i).second; - * / - fLogOutputStream << -// voice->getVoiceName () << - "staff " << (*i).first.first << - ", voice " << (*i).first.second << - ":" << - endl; - -// * JMI - S_msrChord chord = (*i).second; - - fLogOutputStream << - chord; -// * / - - gIndenter--; - - if (++i == iEnd) break; - - fLogOutputStream << endl; - } // for - - gIndenter--; - } - - fLogOutputStream << - "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << - endl; -} -*/ - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::printCurrentChord () -{ - fLogOutputStream << - "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << - endl; - - if (fCurrentChord) { - fLogOutputStream << - "fCurrentChord contains:" << - endl; - - gIndenter++; - - fLogOutputStream << - fCurrentChord; - - gIndenter--; - } - - else { - fLogOutputStream << - "fCurrentChord is null" << - endl; - } - - fLogOutputStream << - "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << - endl; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteArticulationsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's articulations if any from the first note to chord - - list - noteArticulations = - note-> - getNoteArticulations (); - - list::const_iterator i; - for ( - i=noteArticulations.begin (); - i!=noteArticulations.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying articulation '" << - (*i)->articulationKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord->appendArticulationToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteTechnicalsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's technicals if any from the first note to chord - - list - noteTechnicals = - note-> - getNoteTechnicals (); - - list::const_iterator i; - for ( - i=noteTechnicals.begin (); - i!=noteTechnicals.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying technical '" << - (*i)->technicalKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord->appendTechnicalToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteTechnicalWithIntegersToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's technicals if any from the first note to chord - - list - noteTechnicalWithIntegers = - note-> - getNoteTechnicalWithIntegers (); - - list::const_iterator i; - for ( - i=noteTechnicalWithIntegers.begin (); - i!=noteTechnicalWithIntegers.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying technical '" << - (*i)->technicalWithIntegerKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord->appendTechnicalWithIntegerToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteTechnicalWithFloatsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's technicals if any from the first note to chord - - list - noteTechnicalWithFloats = - note-> - getNoteTechnicalWithFloats (); - - list::const_iterator i; - for ( - i=noteTechnicalWithFloats.begin (); - i!=noteTechnicalWithFloats.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying technical '" << - (*i)->technicalWithFloatKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord->appendTechnicalWithFloatToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteTechnicalWithStringsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's technicals if any from the first note to chord - - list - noteTechnicalWithStrings = - note-> - getNoteTechnicalWithStrings (); - - list::const_iterator i; - for ( - i=noteTechnicalWithStrings.begin (); - i!=noteTechnicalWithStrings.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying technical '" << - (*i)->technicalWithStringKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord->appendTechnicalWithStringToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteOrnamentsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's ornaments if any from the first note to chord - - list - noteOrnaments = - note-> - getNoteOrnaments (); - - list::const_iterator i; - for ( - i=noteOrnaments.begin (); - i!=noteOrnaments.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying ornament '" << - (*i)->ornamentKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendOrnamentToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteSpannersToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's spanners if any from the first note to chord - - list - noteSpanners = - note-> - getNoteSpanners (); - - list::const_iterator i; - for ( - i=noteSpanners.begin (); - i!=noteSpanners.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying spanner '" << - (*i)->spannerKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendSpannerToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteSingleTremoloToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's singleTremolo if any from the first note to chord - - S_msrSingleTremolo - noteSingleTremolo = - note-> - getNoteSingleTremolo (); - - if (noteSingleTremolo) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying singleTremolo '" << - noteSingleTremolo->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - setChordSingleTremolo (noteSingleTremolo); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteDynamicsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's dynamics if any from the first note to chord - - list - noteDynamics = - note-> - getNoteDynamics (); - - list::const_iterator i; - for ( - i=noteDynamics.begin (); - i!=noteDynamics.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying dynamics '" << - (*i)->dynamicsKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendDynamicsToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteOtherDynamicsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's other dynamics if any from the first note to chord - - list - noteOtherDynamics = - note-> - getNoteOtherDynamics (); - - list::const_iterator i; - for ( - i=noteOtherDynamics.begin (); - i!=noteOtherDynamics.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying other dynamics '" << - (*i)->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendOtherDynamicsToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteWordsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's words if any from the first note to chord - - list - noteWords = - note-> - getNoteWords (); - - list::const_iterator i; - for ( - i=noteWords.begin (); - i!=noteWords.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying words '" << - (*i)->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendWordsToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteStemToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's stems if any from the first note to chord - - S_msrStem - noteStem = - note-> - getNoteStem (); - - if (noteStem) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying stem '" << - noteStem->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendStemToChord (noteStem); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteBeamsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's beams if any from the first note to chord - - list - noteBeams = - note-> - getNoteBeams (); - - list::const_iterator i; - for ( - i=noteBeams.begin (); - i!=noteBeams.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying beam '" << - (*i)->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendBeamToChord ((*i)); - } // for - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "==> AFTER copying beams to chord:" << - endl; - - gIndenter++; - - fLogOutputStream << - chord << - endl; - - gIndenter--; - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteTieToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's tie if any from the first note to chord - - S_msrTie - noteTie = - note-> - getNoteTie (); - - if (noteTie) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Appending tie '" << - noteTie->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendTieToChord (noteTie); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "==> AFTER appending tie to chord:" << - endl; - - gIndenter++; - - fLogOutputStream << - chord << - endl; - - gIndenter--; - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteSlursToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's slurs if any from the first note to chord - - list - noteSlurs = - note-> - getNoteSlurs (); - - list::const_iterator i; - for ( - i=noteSlurs.begin (); - i!=noteSlurs.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying slur '" << - (*i)->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendSlurToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteLigaturesToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's ligatures if any from the first note to chord - - list - noteLigatures = - note-> - getNoteLigatures (); - - list::const_iterator i; - for ( - i=noteLigatures.begin (); - i!=noteLigatures.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying ligature '" << - (*i)->ligatureKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendLigatureToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNotePedalsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's pedals if any from the first note to chord - - list - notePedals = - note-> - getNotePedals (); - - list::const_iterator i; - for ( - i=notePedals.begin (); - i!=notePedals.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords || gTraceOah->fTracePedals) { - fLogOutputStream << - "Copying pedal '" << - (*i)->pedalTypeAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendPedalToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteSlashesToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's slashes if any from the first note to chord - - list - noteSlashes = - note-> - getNoteSlashes (); - - list::const_iterator i; - for ( - i=noteSlashes.begin (); - i!=noteSlashes.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying slash '" << - (*i)->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendSlashToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteWedgesToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's wedges if any from the first note to chord - - list - noteWedges = - note-> - getNoteWedges (); - - list::const_iterator i; - for ( - i=noteWedges.begin (); - i!=noteWedges.end (); - i++ - ) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying wedges '" << - (*i)->wedgeKindAsString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - appendWedgeToChord ((*i)); - } // for -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteOctaveShiftToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's wedges if any from the first note to chord - - S_msrOctaveShift - noteOctaveShift = - note-> - getNoteOctaveShift (); - - if (noteOctaveShift) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying octave shift '" << - noteOctaveShift->asString () << - "' from note " << note->asString () << - " to chord" << - endl; - } -#endif - - chord-> - setChordOctaveShift (noteOctaveShift); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteGraceNotesGroupsToChord ( - S_msrNote note, S_msrChord chord) -{ - S_msrGraceNotesGroup - graceNotesGroupBefore = - note-> - getNoteGraceNotesGroupBefore (); - - if (graceNotesGroupBefore) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying grace notes group before '" << - graceNotesGroupBefore->asShortString () << - "' from note " << note->asString () << - " to chord '" << chord->asString () << - "'" << - endl; - } -#endif - - chord-> - setChordGraceNotesGroupBefore (graceNotesGroupBefore); - } - - S_msrGraceNotesGroup - graceNotesGroupAfter = - note-> - getNoteGraceNotesGroupAfter (); - - if (graceNotesGroupAfter) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying grace notes group after '" << - graceNotesGroupAfter->asShortString () << - "' from note " << note->asString () << - " to chord '" << chord->asString () << - "'" << - endl; - } -#endif - - chord-> - setChordGraceNotesGroupAfter (graceNotesGroupAfter); - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteHarmoniesToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's harmony if any from the first note to chord - - const list& - noteHarmoniesList = - note->getNoteHarmoniesList (); - - if (noteHarmoniesList.size ()) { - list::const_iterator i; - for (i=noteHarmoniesList.begin (); i!=noteHarmoniesList.end (); i++) { - S_msrHarmony harmony = (*i); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Copying harmony '" << - harmony->asString () << - "' from note " << note->asString () << - " to chord '" << chord->asString () << - "'" << - endl; - } -#endif - - chord-> - appendHarmonyToChord (harmony); - - } // for - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::copyNoteElementsToChord ( - S_msrNote note, S_msrChord chord) -{ - // copy note's articulations if any to the chord - copyNoteArticulationsToChord (note, chord); - - // copy note's technicals if any to the chord - copyNoteTechnicalsToChord (note, chord); - copyNoteTechnicalWithIntegersToChord (note, chord); - copyNoteTechnicalWithFloatsToChord (note, chord); - copyNoteTechnicalWithStringsToChord (note, chord); - - // copy note's ornaments if any to the chord - copyNoteOrnamentsToChord (note, chord); - - // copy note's spanners if any to the chord - copyNoteSpannersToChord (note, chord); - - // copy note's single tremolo if any to the chord - copyNoteSingleTremoloToChord (note, chord); - - // copy note's dynamics if any to the chord - copyNoteDynamicsToChord (note, chord); - - // copy note's other dynamics if any to the chord - copyNoteOtherDynamicsToChord (note, chord); - - // copy note's words if any to the chord - copyNoteWordsToChord (note, chord); - - // copy note's stem if any to the chord - copyNoteStemToChord (note, chord); - - // copy note's beams if any to the chord - copyNoteBeamsToChord (note, chord); - - // copy note's ties if any to the chord - copyNoteTieToChord (note, chord); - - // copy note's tie if any to the chord - copyNoteSlursToChord (note, chord); - - // copy note's ligatures if any to the chord - copyNoteLigaturesToChord (note, chord); - - // copy note's pedals if any to the chord - copyNotePedalsToChord (note, chord); - - // copy note's slashes if any to the chord - copyNoteSlashesToChord (note, chord); - - // copy note's wedges if any to the chord - copyNoteWedgesToChord (note, chord); - - // copy note's octave shift if any to the chord - copyNoteOctaveShiftToChord (note, chord); - - // copy note's grace notes groups if any to the chord - copyNoteGraceNotesGroupsToChord (note, chord); - - // copy note's harmony if any to the chord - copyNoteHarmoniesToChord (note, chord); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::createTupletWithItsFirstNoteAndPushItToTupletsStack ( - S_msrNote firstNote) -{ - // firstNote is the first tuplet note, - // and is currently at the end of the voice - - int firstNoteInputLineNumber = - firstNote->getInputLineNumber (); - - // create a tuplet -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Creating a '" << - fCurrentNoteActualNotes << - "/" << - fCurrentNoteNormalNotes << - "' tuplet with first note " << - firstNote-> - asShortString () << - endl; - } -#endif - - // account for note duration - rational - memberNotesSoundingWholeNotes = - firstNote->getNoteSoundingWholeNotes (); - memberNotesSoundingWholeNotes.rationalise (); - - rational - memberNotesDisplayWholeNotes = - firstNote->getNoteDisplayWholeNotes (); - memberNotesDisplayWholeNotes.rationalise (); - - S_msrTuplet - tuplet = - msrTuplet::create ( - firstNoteInputLineNumber, - fCurrentMeasureNumber, - fCurrentTupletNumber, - fCurrentTupletBracketKind, - fCurrentTupletLineShapeKind, - fCurrentTupletShowNumberKind, - fCurrentTupletShowTypeKind, - msrTupletFactor ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes), - memberNotesSoundingWholeNotes, - memberNotesDisplayWholeNotes); - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - firstNoteInputLineNumber, - fCurrentStaffNumberToInsertInto, // fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // add note as first note of the stack top tuplet - tuplet-> - addNoteToTuplet ( - firstNote, - currentVoice); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - // only after addNoteToTuplet() has set the note's tuplet upLink - fLogOutputStream << - "Adding first note " << - firstNote-> - asShortString () << - " to tuplet '" << - tuplet->asString () << - "'" << - endl; - } -#endif - - // set tuplet's tuplet uplink - if (fTupletsStack.size ()) { - tuplet-> - setTupletTupletUpLink ( - fTupletsStack.front ()); - } - - // register tuplet in this visitor -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "++> pushing tuplet '" << - tuplet->asString () << - "' to tuplets stack" << - endl; - } -#endif - - fTupletsStack.push_front (tuplet); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTupletsDetails) { - displayTupletsStack ( - "############## createTupletWithItsFirstNoteAndPushItToTupletsStack() 1"); - } -#endif - -/* JMI - // set note displayed divisions - firstNote-> - applyTupletMemberDisplayFactor ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes); - */ - - - // keep track of current tuplet in the current voice, - // in case we learn later by in the next note - // that it is actually the first note of a chord ?? JMI XXL - - // register tuplet as last one found in this voice - // for chords in tuplets handling -// JMI fLastHandledTupletInVoiceMap [currentVoice] = tuplet; - fLastHandledTupletInVoiceMap [ - make_pair ( - fCurrentMusicXMLStaffNumber, // JMI fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber) - ] = - tuplet; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTupletsDetails) { - displayLastHandledTupletInVoiceMap ( - "############## createTupletWithItsFirstNoteAndPushItToTupletsStack() 2"); - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::finalizeTupletAndPopItFromTupletsStack ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "mxmlTree2MsrTranslator::finalizeTupletAndPopItFromTupletsStack(), " << - "line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - displayTupletsStack ( - "############## Before finalizeTupletAndPopItFromTupletsStack()"); - } -#endif - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, // fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // get tuplet from top of tuplet stack - S_msrTuplet - tuplet = - fTupletsStack.front (); - -/* // set note displayed divisions JMI - note-> - applyTupletMemberDisplayFactor ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes); -*/ - -/* JMI - // add lastNote to the tuplet -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "==> adding last note " << lastNote->asString () << - " to tuplets stack top " << - fTupletsStack.front ()->asString () << - endl; - } -#endif - - tuplet->addNoteToTuplet (lastNote); -*/ - - // pop from the tuplets stack -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Popping tuplet:" << - endl; - gIndenter++; - fLogOutputStream << - tuplet; - gIndenter--; - fLogOutputStream << - " from tuplets stack" << - ", line " << inputLineNumber << - endl; - } -#endif - - fTupletsStack.pop_front (); - - if (fTupletsStack.size ()) { - // tuplet is a nested tuplet -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "=== adding nested tuplet '" << - tuplet->asString () << - "' to current stack top tuplet '" << - fTupletsStack.front ()->asString () << - "'" << - ", line " << inputLineNumber << - endl; - } -#endif - - fTupletsStack.front ()-> - addTupletToTuplet (tuplet); - } - - else { - // tuplet is a top level tuplet -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Appending top level tuplet " << - tuplet->asString () << - " to voice \"" << - currentVoice->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - currentVoice-> - appendTupletToVoice (tuplet); - -/* JMI - // finalize the tuplet - tuplet-> - finalizeTuplet ( - inputLineNumber); -*/ - - // JMI BAD HERE // the tuplet stop is not to be handled later - // fCurrentATupletStopIsPending = false; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - displayTupletsStack ( - "############## After finalizeTupletAndPopItFromTupletsStack()"); - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentArticulationsToNote ( - S_msrNote note) -{ - // attach the current articulations if any to the note - if (fCurrentArticulations.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceArticulations) { - fLogOutputStream << - "Attaching current articulations to note " << - note->asString () << - endl; - } -#endif - - while (fCurrentArticulations.size ()) { - S_msrArticulation - art = - fCurrentArticulations.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Attaching articulation '" << - art->articulationKindAsString () << - "' to note " << note->asString () << - endl; - } -#endif - - note-> - appendArticulationToNote (art); - - // forget about this articulation - fCurrentArticulations.pop_front(); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentTechnicalsToNote ( - S_msrNote note) -{ - // attach the current technicals if any to the note - if (fCurrentTechnicalsList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching current technicals to note " << - note->asString () << - endl; - } -#endif - - while (fCurrentTechnicalsList.size ()) { - S_msrTechnical - tech = - fCurrentTechnicalsList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching technical '" << - tech->asString () << - "' to note " << note->asString () << - endl; - } -#endif - - note-> - appendTechnicalToNote (tech); - - // forget about this technical - fCurrentTechnicalsList.pop_front(); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentTechnicalWithIntegersToNote ( - S_msrNote note) -{ - // attach the current technicals if any to the note - if (fCurrentTechnicalWithIntegersList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching current technical with integers to note " << - note->asString () << - endl; - } -#endif - - while (fCurrentTechnicalWithIntegersList.size ()) { - S_msrTechnicalWithInteger - tech = - fCurrentTechnicalWithIntegersList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching technical with integer '" << - tech->asString () << - "' to note " << note->asString () << - endl; - } -#endif - - note-> - appendTechnicalWithIntegerToNote (tech); - - // forget about this technical - fCurrentTechnicalWithIntegersList.pop_front(); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentTechnicalWithFloatsToNote ( - S_msrNote note) -{ - // attach the current technicals if any to the note - if (fCurrentTechnicalWithFloatsList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching current technical with floats to note " << - note->asString () << - endl; - } -#endif - - while (fCurrentTechnicalWithFloatsList.size ()) { - S_msrTechnicalWithFloat - tech = - fCurrentTechnicalWithFloatsList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching technical with integer '" << - tech->asString () << - "' to note " << note->asString () << - endl; - } -#endif - - note-> - appendTechnicalWithFloatToNote (tech); - - // forget about this technical - fCurrentTechnicalWithFloatsList.pop_front(); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentTechnicalWithStringsToNote ( - S_msrNote note) -{ - // attach the current technicals if any to the note - if (fCurrentTechnicalWithStringsList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching current technical with strings to note " << - note->asString () << - endl; - } -#endif - - while (fCurrentTechnicalWithStringsList.size ()) { - S_msrTechnicalWithString - tech = - fCurrentTechnicalWithStringsList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTechnicals) { - fLogOutputStream << - "Attaching technical with string '" << - tech->asString () << - "' to note " << note->asString () << - endl; - } -#endif - - note-> - appendTechnicalWithStringToNote (tech); - - // forget about this technical - fCurrentTechnicalWithStringsList.pop_front(); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentOrnamentsToNote ( - S_msrNote note) -{ - // attach the current ornaments if any to the note - if (fCurrentOrnamentsList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOrnaments) { - fLogOutputStream << - "Attaching current ornaments to note " << - note->asString () << - endl; - } -#endif - - while (fCurrentOrnamentsList.size ()) { - S_msrOrnament - orn = - fCurrentOrnamentsList.front(); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Attaching ornament '" << - orn->ornamentKindAsString () << - "' to note " << note->asString () << - endl; - } -#endif - - note-> - appendOrnamentToNote (orn); - - // forget about this ornament - fCurrentOrnamentsList.pop_front(); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentSpannersToNote ( - S_msrNote note) -{ - // attach the current spanners if any to the note - if (fCurrentSpannersList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSpanners) { - fLogOutputStream << - "Attaching current spanners to note " << - note->asString () << - endl; - } -#endif - - bool doHandleSpanner = true; - bool spannerStopMetForThisNote = false; - - S_msrSpanner delayedStopSpanner; - - while (fCurrentSpannersList.size ()) { - S_msrSpanner - spanner = - fCurrentSpannersList.front(); - - switch (spanner->getSpannerKind ()) { - case msrSpanner::kSpannerDashes: // JMI - switch (spanner->getSpannerTypeKind ()) { - case kSpannerTypeStart: - spannerStopMetForThisNote = true; - break; - case kSpannerTypeStop: - doHandleSpanner = - ! spannerStopMetForThisNote; - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - // JMI ??? - break; - } // switch - break; - - case msrSpanner::kSpannerWavyLine: - switch (spanner->getSpannerTypeKind ()) { - case kSpannerTypeStart: - spannerStopMetForThisNote = true; - break; - case kSpannerTypeStop: - doHandleSpanner = - ! spannerStopMetForThisNote; - break; - case kSpannerTypeContinue: - break; - case k_NoSpannerType: - // JMI ??? - break; - } // switch - break; - } // switch - - if (doHandleSpanner) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceSpanners) { - fLogOutputStream << - "Attaching spanner '" << - spanner->asShortString () << - "' to note " << note->asString () << - endl; - } -#endif - - note-> - appendSpannerToNote (spanner); - - // set spanner note upLink - spanner-> - setSpannerNoteUpLink (note); - - // forget about this spanner - fCurrentSpannersList.pop_front (); - } - - else { // check it is the same spanner kind JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceSpanners) { - fLogOutputStream << - "Spanner start amd stop on one and the same note' to note " << - note->asString () << - ", delaying 'stop' until next note" << - endl; - } -#endif - - // keep track of this stop spanner - delayedStopSpanner = spanner; - - // forget about this spanner to avoid infinite loop - fCurrentSpannersList.pop_front (); - } - } // while - - // append delayed stop spanner if any again to the list - if (delayedStopSpanner) { - fCurrentSpannersList.push_back ( - delayedStopSpanner); - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentSingleTremoloToNote ( - S_msrNote note) -{ - // attach the current singleTremolo if any to the note - if (fCurrentSingleTremolo) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Attaching current singleTremolo to note " << - note->asString () << - endl; - } -#endif - - note-> - setNoteSingleTremolo (fCurrentSingleTremolo); - - // set single tremolo graphic duration kind - fCurrentSingleTremolo-> - setSingleTremoloGraphicDurationKind ( - note-> - getNoteGraphicDurationKind ()); - - // forget about this single tremolo - fCurrentSingleTremolo = nullptr; - } -} - -//______________________________________________________________________________ -/* JMI -void mxmlTree2MsrTranslator::attachCurrentArticulationsToChord ( // JMI - S_msrChord chord) -{ - if (fCurrentArticulations.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Attaching current articulations to chord " << - chord->asString () << - endl; - } -#endif - - list::const_iterator i; - for ( - i=fCurrentArticulations.begin (); - i!=fCurrentArticulations.end (); - i++ - ) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Attaching articulation " << (*i) << - " to chord " << chord << - endl; - } -#endif - - chord-> - appendArticulationToChord ((*i)); - } // for - } -} -*/ - -/* -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachCurrentOrnamentsToChord ( // JMI - S_msrChord chord) -{ - if (fCurrentOrnamentsList.size ()) { - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Attaching current ornaments to chord " << - chord->asString () << - endl; - } -#endif - - list::const_iterator i; - for ( - i=fCurrentOrnamentsList.begin (); - i!=fCurrentOrnamentsList.end (); - i++ - ) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Attaching ornament " << (*i) << " to chord " << - chord << - endl; - } -#endif - - chord-> - appendOrnamentToChord ((*i)); - } // for - } -} -*/ - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingTemposToVoice ( - S_msrVoice voice) -{ - // attach the pending tempos if any to the voice - if (fPendingTemposList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTempos) { - fLogOutputStream << - "Attaching pending tempos to voice \"" << - voice->getVoiceName () << - "\"" << - endl; - } -#endif - - while (fPendingTemposList.size ()) { - S_msrTempo - tempo = - fPendingTemposList.front (); - - voice-> - appendTempoToVoice (tempo); - - fPendingTemposList.pop_front (); - } // while - } -} - -void mxmlTree2MsrTranslator::attachPendingRehearsalsToVoice ( - S_msrVoice voice) -{ - // attach the pending rehearsals if any to the note - if (fPendingRehearsalsList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceRehearsals) { - fLogOutputStream << - "Attaching pending rehearsals to voice \"" << - voice->getVoiceName () << - "\"" << - endl; - } -#endif - - while (fPendingRehearsalsList.size ()) { - S_msrRehearsal - rehearsal = - fPendingRehearsalsList.front (); - - voice-> - appendRehearsalToVoice (rehearsal); - - fPendingRehearsalsList.pop_front (); - } // while - } -} - -void mxmlTree2MsrTranslator::attachLineBreaksToVoice ( - S_msrVoice voice) -{ - // attach the pending line breaks if any to the note - if (fPendingLineBreaksList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLineBreaks) { - fLogOutputStream << - "Attaching pending line breaks to voice \"" << - voice->getVoiceName () << - "\"" << - endl; - } -#endif - - while (fPendingLineBreaksList.size ()) { - S_msrLineBreak - lineBreak = - fPendingLineBreaksList.front (); - - // append it to the voice - voice-> - appendLineBreakToVoice (lineBreak); - - // remove it from the list - fPendingLineBreaksList.pop_front (); - } // while - } -} - -void mxmlTree2MsrTranslator::attachPageBreaksToVoice ( - S_msrVoice voice) -{ - // attach the pending page breaks if any to the note - if (fPendingPageBreaksList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTracePageBreaks) { - fLogOutputStream << - "Attaching pending page breaks to voice \"" << - voice->getVoiceName () << - "\"" << - endl; - } -#endif - - while (fPendingPageBreaksList.size ()) { - S_msrPageBreak - pageBreak = - fPendingPageBreaksList.front (); - - // append it to the voice - voice-> - appendPageBreakToVoice (pageBreak); - - // remove it from the list - fPendingPageBreaksList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingSegnosToNote ( - S_msrNote note) -{ - // attach the pending segno if any to the note - if (fPendingSegnosList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceSegnos) { - fLogOutputStream << - "Attaching pending segno to note " << - note->asString () << - endl; - } -#endif - - while (fPendingSegnosList.size ()) { - S_msrSegno - segno = - fPendingSegnosList.front (); - - note-> - appendSegnoToNote (segno); - - fPendingSegnosList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingCodasToNote ( - S_msrNote note) -{ - // attach the pending coda if any to the note - if (fPendingCodasList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceCodas) { - fLogOutputStream << - "Attaching pending Codas to note " << - note->asString () << - endl; - } -#endif - - while (fPendingCodasList.size ()) { - S_msrCoda - coda = - fPendingCodasList.front (); - - note-> - appendCodaToNote (coda); - - fPendingCodasList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingEyeGlassesToNote ( - S_msrNote note) -{ - // attach the pending eyeglasses if any to the note - if (fPendingEyeGlassesList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceEyeGlasses) { - fLogOutputStream << - "Attaching pending eyeglasses to note " << - note->asString () << - endl; - } -#endif - - while (fPendingEyeGlassesList.size ()) { - S_msrEyeGlasses - eyeGlasses = - fPendingEyeGlassesList.front (); - - note-> - appendEyeGlassesToNote (eyeGlasses); - - fPendingEyeGlassesList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingDampsToNote ( - S_msrNote note) -{ - // attach the pending damps if any to the note - if (fPendingDampsList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceDamps) { - fLogOutputStream << - "Attaching pending damps to note " << - note->asString () << - endl; - } -#endif - - while (fPendingDampsList.size ()) { - S_msrDamp - damp = - fPendingDampsList.front (); - - note-> - appendDampToNote (damp); - - fPendingDampsList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingDampAllsToNote ( - S_msrNote note) -{ - // attach the pending damp alls if any to the note - if (fPendingDampAllsList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceDampAlls) { - fLogOutputStream << - "Attaching pending damp alls to note " << - note->asString () << - endl; - } -#endif - - while (fPendingDampAllsList.size ()) { - S_msrDampAll - dampAll = - fPendingDampAllsList.front (); - - note-> - appendDampAllToNote (dampAll); - - fPendingDampAllsList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingOctaveShiftsToNote ( - S_msrNote note) -{ - // attach the pending octave shifts if any to the note - if (fPendingOctaveShiftsList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOctaveShifts) { - fLogOutputStream << - "Attaching pending octave shifts to note " << - note->asString () << - endl; - } -#endif - -/* JMI - // fetch the voice ??? JMI - S_msrVoice - voice = - fetchVoiceFromCurrentPart ( - note->getInputLineNumber (), - fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); -*/ - - while (fPendingOctaveShiftsList.size ()) { - S_msrOctaveShift - octaveShift = - fPendingOctaveShiftsList.front (); - - note-> - setNoteOctaveShift (octaveShift); - - fPendingOctaveShiftsList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingScordaturasToNote ( - S_msrNote note) -{ - // attach the pending scordatura if any to the note - if (fPendingScordaturasList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceScordaturas) { - fLogOutputStream << - "Attaching pending scordaturas to note " << - note->asString () << - endl; - } -#endif - - while (fPendingScordaturasList.size ()) { - S_msrScordatura - scordatura = - fPendingScordaturasList.front (); - - note-> - appendScordaturaToNote (scordatura); - - fPendingScordaturasList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingDynamicsToNote ( - S_msrNote note) -{ - // attach the pending dynamics if any to the note - if (fPendingDynamicsList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceDynamics) { - fLogOutputStream << - "Attaching pending dynamics to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsDynamics) { - fLogOutputStream << - "Delaying dynamics attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - stringstream s; - - int numberOfDynamics = fPendingDynamicsList.size (); - - if (numberOfDynamics > 1) { - s << - "there are " << numberOfDynamics << " dynamics"; - } - else { - s << - "there is 1 dynamics"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } -#endif - } - } - - if (! delayAttachment) { - while (fPendingDynamicsList.size ()) { - S_msrDynamics - dynamics = - fPendingDynamicsList.front (); - - note->appendDynamicsToNote (dynamics); - fPendingDynamicsList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingOtherDynamicsToNote ( - S_msrNote note) -{ - // attach the pending other dynamics if any to the note - if (fPendingOtherDynamicsList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceDynamics) { - fLogOutputStream << - "Attaching pending other dynamics to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsDynamics) { - fLogOutputStream << - "Delaying dynamics attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceDynamics) { - stringstream s; - - int numberOfOtherDynamics = fPendingOtherDynamicsList.size (); - - if (numberOfOtherDynamics > 1) { - s << - "there are " << numberOfOtherDynamics << " other dynamics"; - } - else { - s << - "there is 1 other dynamics"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } -#endif - } - } - - if (! delayAttachment) { - while (fPendingOtherDynamicsList.size ()) { - S_msrOtherDynamics - otherDynamics = - fPendingOtherDynamicsList.front (); - - note->appendOtherDynamicsToNote (otherDynamics); - fPendingOtherDynamicsList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingWordsToNote ( - S_msrNote note) -{ - // attach the pending words if any to the note - if (fPendingWordsList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWords) { - fLogOutputStream << - "Attaching pending words to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsWords) { - fLogOutputStream << - "Delaying word(s) attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceWords) { - stringstream s; - - int numberOfWords = fPendingWordsList.size (); - - if (numberOfWords > 1) { - s << - "there are " << numberOfWords << " words"; - } - else { - s << - "there is 1 word"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } -#endif - } - } - - if (! delayAttachment) { - while (fPendingWordsList.size ()) { - S_msrWords - words = - fPendingWordsList.front (); - - note->appendWordsToNote (words); - - fPendingWordsList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingBeamsToNote ( - S_msrNote note) -{ - // attach the pending beams if any to the note - if (fPendingBeamsList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeams) { - fLogOutputStream << - "Attaching pending beams to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsBeams) { - fLogOutputStream << - "Delaying beam attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceBeams) { - stringstream s; - - int numberOfBeams = fPendingBeamsList.size (); - - if (numberOfBeams > 1) { - s << - "there are " << numberOfBeams << " beams"; - } - else { - s << - "there is 1 beam"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } -#endif - } - } - - if (! delayAttachment) { - while (fPendingBeamsList.size ()) { - S_msrBeam - beam = - fPendingBeamsList.front (); - - note->appendBeamToNote (beam); - fPendingBeamsList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingSlursToNote ( - S_msrNote note) -{ - // attach the pending slurs if any to the note - if (fPendingSlursList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlurs) { - fLogOutputStream << - "Attaching pending slurs to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsSlurs) { - fLogOutputStream << - "Delaying slur attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { - stringstream s; - - int numberOfSlurs = fPendingSlursList.size (); - - if (numberOfSlurs > 1) { - s << - "there are " << numberOfSlurs << " slurs"; - } - else { - s << - "there is 1 slur"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } - } - - if (! delayAttachment) { - while (fPendingSlursList.size ()) { - S_msrSlur - slur = - fPendingSlursList.front (); - - note->appendSlurToNote (slur); - fPendingSlursList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingLigaturesToNote ( - S_msrNote note) -{ - // attach the pending ligatures if any to the note - if (fPendingLigaturesList.size ()) { - bool delayAttachment = false; - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsLigatures) { - fLogOutputStream << - "Delaying ligature attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - stringstream s; - - int numberOfLigatures = fPendingLigaturesList.size (); - - if (numberOfLigatures > 1) { - s << - "there are " << numberOfLigatures << " ligatures"; - } - else { - s << - "there is 1 ligature"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } -#endif - } - } - - if (! delayAttachment) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - stringstream s; - - int numberOfLigatures = fPendingLigaturesList.size (); - - if (numberOfLigatures > 1) { - s << - "There are " << numberOfLigatures << " pending ligatures"; - } - else { - s << - "There is 1 pending ligature"; - } - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } -#endif - - // append ligatures to note only if they belong to a suitable voice, - // i.e. above goes to voice 1 or 3, and below to voice 2 or 4 - - list::iterator - iBegin = fPendingLigaturesList.begin (), - iEnd = fPendingLigaturesList.end (), - i = iBegin; - for ( ; ; ) { - // list::iterator i; - // for (i=fPendingLigaturesList.begin (); i!=fPendingLigaturesList.end (); i++) { - - // if (i == iEnd) break; - - S_msrLigature - ligature = (*i); - - // fetch ligatures placement kind - msrPlacementKind - ligaturePlacementKind = - ligature-> - getLigaturePlacementKind (); - - // fetch note's measure - S_msrMeasure - noteMeasure = - note-> - getNoteMeasureUpLink (); - - // sanity check - msrAssert ( - noteMeasure != nullptr, - "noteMeasure is null"); - - // fetch note's segment - S_msrSegment - noteSegment = - noteMeasure-> - getMeasureSegmentUpLink (); - - // sanity check - msrAssert ( - noteSegment != nullptr, - "noteSegment is null"); - - // fetch note's voice - S_msrVoice - noteVoice = - noteSegment-> - getSegmentVoiceUpLink (); - - // sanity check - msrAssert ( - noteVoice != nullptr, - "noteVoice is null"); - - // handle ligature placement kind - switch (ligaturePlacementKind) { - case msrPlacementKind::kPlacementNone: - // should not occur - break; - - case msrPlacementKind::kPlacementAbove: - switch (noteVoice->getRegularVoiceStaffSequentialNumber ()) { - case 1: - case 3: -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - fLogOutputStream << - "Attaching pending ligature above to note '" << - note->asString () << - "' in voice \"" << - noteVoice->getVoiceName () << - "\"" << - ", line " << ligature->getInputLineNumber () << - endl; - } -#endif - - note->appendLigatureToNote (ligature); - break; - default: - ; - } // switch - break; - - case msrPlacementKind::kPlacementBelow: - switch (noteVoice->getRegularVoiceStaffSequentialNumber ()) { - case 2: - case 4: -#ifdef TRACE_OAH - if (gTraceOah->fTraceLigatures) { - fLogOutputStream << - "Attaching pending ligature below to note '" << - note->asString () << - "' in voice \"" << - noteVoice->getVoiceName () << - "\"" << - ", line " << ligature->getInputLineNumber () << - endl; - } -#endif - - note->appendLigatureToNote (ligature); - break; - default: - ; - } // switch - break; - } // switch - - i = fPendingLigaturesList.erase (i); - - if (++i == iEnd) break; - } // for - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingPedalsToNote ( - S_msrNote note) -{ - // attach the pending pedals if any to the note - if (fPendingPedalsList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTracePedals) { - fLogOutputStream << - "Attaching pending pedals to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsPedals) { - fLogOutputStream << - "Delaying pedal attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { - stringstream s; - - int numberOfPedals = fPendingPedalsList.size (); - - if (numberOfPedals > 1) { - s << - "there are " << numberOfPedals << " pedals"; - } - else { - s << - "there is 1 pedal"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } - } - - if (! delayAttachment) { - while (fPendingPedalsList.size ()) { - S_msrPedal - pedal = - fPendingPedalsList.front (); - - note->appendPedalToNote (pedal); - fPendingPedalsList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingSlashesToNote ( - S_msrNote note) -{ - // attach the pending slashes if any to the note - if (fPendingSlashesList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlashes) { - fLogOutputStream << - "Attaching pending slashes to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsSlashes) { - fLogOutputStream << - "Delaying slash attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { - stringstream s; - - int numberOfSlashes = fPendingSlashesList.size (); - - if (numberOfSlashes > 1) { - s << - "there are " << numberOfSlashes << " slashes"; - } - else { - s << - "there is 1 slash"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } - } - - if (! delayAttachment) { - while (fPendingSlashesList.size ()) { - S_msrSlash - slash = - fPendingSlashesList.front (); - - note->appendSlashToNote (slash); - fPendingSlashesList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingWedgesToNote ( - S_msrNote note) -{ - // attach the pending wedges if any to the note - if (fPendingWedgesList.size ()) { - bool delayAttachment = false; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceWedges) { - fLogOutputStream << - "Attaching pending wedges to note " << - note->asString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - if (gMsrOah->fDelayRestsWedges) { - fLogOutputStream << - "Delaying wedge attached to a rest until next note" << - endl; - - delayAttachment = true; - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceWedges) { - stringstream s; - - int numberOfWedges = fPendingWedgesList.size (); - - if (numberOfWedges > 1) { - s << - "there are " << numberOfWedges << " wedges"; - } - else { - s << - "there is 1 wedge"; - } - s << - " attached to a rest"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - note->getInputLineNumber (), - s.str ()); - } -#endif - } - } - - if (! delayAttachment) { - while (fPendingWedgesList.size ()) { - S_msrWedge - wedge = - fPendingWedgesList.front (); - - note->appendWedgeToNote (wedge); - fPendingWedgesList.pop_front (); - } // while - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingGlissandosToNote ( - S_msrNote note) -{ - // attach the pending glissandos if any to the note - if (fPendingGlissandosList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceGlissandos) { - fLogOutputStream << - "Attaching pending glissandos to note " << - note->asString () << - endl; - } -#endif - - while (fPendingGlissandosList.size ()) { - S_msrGlissando - glissando = - fPendingGlissandosList.front (); - - note-> - appendGlissandoToNote (glissando); - - // take care of no lyrics on kGlissandoTypeStop - switch (glissando->getGlissandoTypeKind ()) { - case msrGlissando::kGlissandoTypeNone: - case msrGlissando::kGlissandoTypeStart: - break; - - case msrGlissando::kGlissandoTypeStop: - int inputLineNumber = - glissando->getInputLineNumber (); - - // fetch the voice - S_msrVoice - voice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - // fCurrentMusicXMLStaffNumber, // JMI fCurrentStaffNumberToInsertInto, - fCurrentStaffNumberToInsertInto, // JMI fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // get the voice's stanzas map - const map& - voiceStanzasMap = - voice-> - getVoiceStanzasMap (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGlissandos) { - fLogOutputStream << - "--> attachPendingGlissandosToNote()" - ", voiceStanzasMap.size () = " << - voiceStanzasMap.size () << - ", fCurrentNoteHasLyrics = " << - booleanAsString (fCurrentNoteHasLyrics) << - ", line " << inputLineNumber << - endl; - } -#endif - - if (voiceStanzasMap.size ()) { - // there are lyrics in this voice - /* JMI - if (! fCurrentNoteHasLyrics) { - // append a skip to lyrics the same duration as the note -#ifdef TRACE_OAH - if (gTraceOah->fTraceGlissandos) { - fLogOutputStream << - "Attaching a skip syllable to note '" << - note->asString () << - "' that has a glissando stop and no lyrics " << - ", line " << inputLineNumber << - endl; - } -#endif - - for ( - map::const_iterator i = voiceStanzasMap.begin (); - i != voiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - // create a skip syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - msrSyllable::kSyllableSkipRest, - msrSyllable::kSyllableExtendNone, // fCurrentSyllableExtendKind, // JMI - fCurrentNoteSoundingWholeNotesFromDuration, - stanza); - - // append syllable to current note's syllables list - fCurrentNoteSyllables.push_back ( - syllable); - - // append syllable to stanza - stanza-> - appendSyllableToStanza (syllable); - } // for - - fASkipSyllableHasBeenGeneratedForcurrentNote = true; - } - */ - } - break; - } // switch - - fPendingGlissandosList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::attachPendingSlidesToNote ( - S_msrNote note) -{ - // attach the pending slides if any to the note - if (fPendingSlidesList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlides) { - fLogOutputStream << - "Attaching pending slides to note " << - note->asString () << - endl; - } -#endif - - while (fPendingSlidesList.size ()) { - S_msrSlide - slide = - fPendingSlidesList.front (); - - note-> - appendSlideToNote (slide); - - // take care of no lyrics on kSlideTypeStop - switch (slide->getSlideTypeKind ()) { - case msrSlide::kSlideTypeNone: - case msrSlide::kSlideTypeStart: - break; - - case msrSlide::kSlideTypeStop: - int inputLineNumber = - slide->getInputLineNumber (); - - // fetch the voice - S_msrVoice - voice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - // fCurrentMusicXMLStaffNumber, // JMI fCurrentStaffNumberToInsertInto, - fCurrentStaffNumberToInsertInto, // JMI fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // get the voice's stanzas map - const map& - voiceStanzasMap = - voice-> - getVoiceStanzasMap (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlides) { - fLogOutputStream << - "--> attachPendingSlidesToNote()" - ", voiceStanzasMap.size () = " << - voiceStanzasMap.size () << - ", fCurrentNoteHasLyrics = " << - booleanAsString (fCurrentNoteHasLyrics) << - ", line " << inputLineNumber << - endl; - } -#endif - - if (voiceStanzasMap.size ()) { - // there are lyrics in this voice - /* JMI - if (! fCurrentNoteHasLyrics) { - // append a skip to lyrics the same duration as the note -#ifdef TRACE_OAH - if (gTraceOah->fTraceSlides) { - fLogOutputStream << - "Attaching a skip syllable to note '" << - note->asString () << - "' that has a slide stop and no lyrics " << - ", line " << inputLineNumber << - endl; - } -#endif - - for ( - map::const_iterator i = voiceStanzasMap.begin (); - i != voiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - // create a skip syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - msrSyllable::kSyllableSkipRest, - msrSyllable::kSyllableExtendNone, // fCurrentSyllableExtendKind, // JMI - fCurrentNoteSoundingWholeNotesFromDuration, - stanza); - - // append syllable to current note's syllables list - fCurrentNoteSyllables.push_back ( - syllable); - - // append syllable to stanza - stanza-> - appendSyllableToStanza (syllable); - } // for - - fASkipSyllableHasBeenGeneratedForcurrentNote = true; - } - */ - } - break; - } // switch - - fPendingSlidesList.pop_front (); - } // while - } -} - -void mxmlTree2MsrTranslator::attachPendingVoiceLevelElementsToVoice ( - S_msrVoice voice) -{ - /* JMI - fLogOutputStream << - "attachPendingVoiceLevelElementsToVoice()" << - ", fPendingTemposList.size () = " << fPendingTemposList.size () << - ", fPendingLineBreaksList.size () = " << fPendingLineBreaksList.size () << - ", fPendingPageBreaksList.size () = " << fPendingPageBreaksList.size () << - endl; - */ - - // the elements pending since before the note - // can now be appended to the latter's voice - // prior to the note itself - - // attach pending rehearsals if any to voice - attachPendingRehearsalsToVoice (voice); - - // attach pending tempos if any to voice - attachPendingTemposToVoice (voice); - - // attach pending line breaks if any to voice - attachLineBreaksToVoice (voice); - - // attach pending page breaks if any to voice - attachPageBreaksToVoice (voice); -} - -void mxmlTree2MsrTranslator::attachPendingNoteLevelElementsToNote ( - S_msrNote note) -{ - - // attach the pending segnos, if any, to the note - attachPendingSegnosToNote (note); - - // attach the pending codas, if any, to the note - attachPendingCodasToNote (note); - - // attach the pending eyeglasses, if any, to the note - attachPendingEyeGlassesToNote (note); - - // attach the pending damps, if any, to the note - attachPendingDampsToNote (note); - - // attach the pending damp alls, if any, to the note - attachPendingDampAllsToNote (note); - - // attach the pending scordaturas, if any, to the note - attachPendingScordaturasToNote (note); - - // attach the pending octave shifts, if any, to the note - attachPendingOctaveShiftsToNote (note); - - // attach the pending dynamics, if any, to the note - attachPendingDynamicsToNote (note); - - // attach the pending other dynamics, if any, to the note - attachPendingOtherDynamicsToNote (note); - - // attach the pending words, if any, to the note - attachPendingWordsToNote (note); - - // attach the pending beams, if any, to the note - attachPendingBeamsToNote (note); - - // attach the pending slurs, if any, to the note - attachPendingSlursToNote (note); - - // attach the pending ligatures, if any, to the note - attachPendingLigaturesToNote (note); - - // attach the pending pedals, if any, to the note - attachPendingPedalsToNote (note); - - // attach the pending slashes, if any, to the note - attachPendingSlashesToNote (note); - - // attach the pending wedges, if any, to the note - attachPendingWedgesToNote (note); - - // attach the pending glissandos, if any, to the note - attachPendingGlissandosToNote (note); - - // attach the pending slides, if any, to the note - attachPendingSlidesToNote (note); -} - -//______________________________________________________________________________ -S_msrNote mxmlTree2MsrTranslator::createNote ( - int inputLineNumber) -{ - // determine quarter tones note pitch - fCurrentNoteQuarterTonesPitchKind = - quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - inputLineNumber, - fCurrentNoteDiatonicPitchKind, - fCurrentNoteAlterationKind); - - // determine quarter tones note display pitch - fCurrentNoteQuarterTonesDisplayPitchKind = - quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - inputLineNumber, - fCurrentDisplayDiatonicPitchKind, - fCurrentNoteAlterationKind); - - // has the current note graphic duration been specified - // in a '' markup? - switch (fCurrentNoteGraphicDurationKind) { - case k_NoDuration: - // use the same duration as the one from the duration - // internally ??? JMI - fCurrentNoteDisplayWholeNotesFromType = - fCurrentNoteSoundingWholeNotesFromDuration; - break; - - default: - // convert note graphic duration into whole notes - fCurrentNoteDisplayWholeNotesFromType = - msrDurationKindAsWholeNotes ( - fCurrentNoteGraphicDurationKind); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - endl << - "(1):" << - endl << - "fCurrentNoteGraphicDurationKind = " << - msrDurationKindAsString ( - fCurrentNoteGraphicDurationKind) << - endl << - "fCurrentNoteDisplayWholeNotesFromType = " << - fCurrentNoteDisplayWholeNotesFromType << - endl << - "fCurrentNoteDotsNumber = " << - fCurrentNoteDotsNumber << - endl << - endl; - } -#endif - - // take dots into account if any - if (fCurrentNoteDotsNumber > 0) { - rational - wholeNotesIncrement = - fCurrentNoteDisplayWholeNotesFromType * rational (1, 2); - int - dots = - fCurrentNoteDotsNumber; - - while (dots > 0) { - fCurrentNoteDisplayWholeNotesFromType += - wholeNotesIncrement; - - wholeNotesIncrement *= rational (1, 2); - - dots--; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - endl << - "(2):" << - endl << - "fCurrentNoteDisplayWholeNotesFromType = " << - fCurrentNoteDisplayWholeNotesFromType << - endl << - "wholeNotesIncrement = " << - wholeNotesIncrement << - endl << - "dots = " << - dots << - endl << - endl; - } -#endif - } // while - - fCurrentNoteDisplayWholeNotesFromType.rationalise (); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - endl << - "(3):" << - endl << - "fCurrentNoteGraphicDurationKind = " << - msrDurationKindAsString ( - fCurrentNoteGraphicDurationKind) << - endl << - "fCurrentNoteDisplayWholeNotesFromType = " << - fCurrentNoteDisplayWholeNotesFromType << - endl << - "fCurrentNoteDotsNumber = " << - fCurrentNoteDotsNumber << - endl << - endl; - } -#endif - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "--> Gathered note information:" << - endl; - - gIndenter++; - - const int fieldWidth = 42; - - fLogOutputStream << left << - setw (fieldWidth) << - "CurrentNoteSoundingWholeNotesFromDuration" << " = " << - fCurrentNoteSoundingWholeNotesFromDuration << - endl << - setw (fieldWidth) << - "fCurrentNoteGraphicDuration" << " : " << - msrDurationKindAsString ( - fCurrentNoteGraphicDurationKind) << - endl << - setw (fieldWidth) << - "fCurrentNoteDotsNumber" << " : " << - fCurrentNoteDotsNumber << - endl << - setw (fieldWidth) << - "fCurrentNoteDisplayWholeNotesFromType" << " = " << - fCurrentNoteDisplayWholeNotesFromType << - endl << - - setw (fieldWidth) << - "fCurrentNoteIsARest" << " = " << - booleanAsString (fCurrentNoteIsARest) << - endl << - - setw (fieldWidth) << - "fCurrentDivisionsPerQuarterNote" << " = " << - fCurrentDivisionsPerQuarterNote << - endl << - - setw (fieldWidth) << - "fCurrentNotePrintObjectKind" << " = " << - msrPrintObjectKindAsString ( - fCurrentNotePrintObjectKind) << - endl << - - setw (fieldWidth) << - "fCurrentNoteRGB" << " = " << - fCurrentNoteRGB << - endl << - setw (fieldWidth) << - "fCurrentNoteAlpha" << " = " << - fCurrentNoteAlpha << - endl << - - setw (fieldWidth) << - "fCurrentMusicXMLStaffNumber =" << " = " << - fCurrentMusicXMLStaffNumber << - endl << - setw (fieldWidth) << - "fCurrentMusicXMLStaffNumber" << " = " << - fCurrentMusicXMLStaffNumber << - endl << - - setw (fieldWidth) << - "fCurrentStaffNumberToInsertInto" << " = " << - fCurrentStaffNumberToInsertInto << - endl << - setw (fieldWidth) << - "fPreviousNoteMusicXMLStaffNumber" << " = " << - fPreviousNoteMusicXMLStaffNumber << - endl << - - setw (fieldWidth) << - "fCurrentMusicXMLVoiceNumber" << " = " << - fCurrentMusicXMLVoiceNumber << - endl << - - setw (fieldWidth) << - "inputLineNumber" << " = " << - inputLineNumber << - endl << - endl; - - gIndenter--; - } -#endif - - if (fCurrentNoteIsAGraceNote) { - // set current grace note display whole notes - fCurrentNoteDisplayWholeNotes = - fCurrentNoteDisplayWholeNotesFromType; - } - - else if ( - fCurrentTremoloTypeKind == kTremoloTypeStart - || - fCurrentTremoloTypeKind == kTremoloTypeStop - ) { - // double tremolo note - if (fCurrentNoteGraphicDurationKind == k_NoDuration) { - stringstream s; - - s << - "double tremolo note lacks a "; // JMI a completer - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // set current double tremolo note display whole notes - fCurrentNoteDisplayWholeNotes = - fCurrentNoteDisplayWholeNotesFromType; - } - - else if (fCurrentNoteIsARest) { - // rest - - // set current rest sounding and display whole notes - fCurrentNoteSoundingWholeNotes = - fCurrentNoteSoundingWholeNotesFromDuration; - - fCurrentNoteDisplayWholeNotes = - fCurrentNoteDisplayWholeNotesFromType; - -/* JMI - // set current note sounding and display whole notes - if (fCurrentNoteSoundingWholeNotesFromDuration.getNumerator () == 0) { - // only was found, no was specified - fCurrentNoteDisplayWholeNotes = - fCurrentNoteDisplayWholeNotesFromType; - - fCurrentNoteSoundingWholeNotes = - fCurrentNoteDisplayWholeNotes; // same value by default - } - else { - // was found - fCurrentNoteSoundingWholeNotes = - fCurrentNoteSoundingWholeNotesFromDuration; - - fCurrentNoteDisplayWholeNotes = - fCurrentNoteSoundingWholeNotes; // same value by default - } - */ - } - - else { - // other note - - // set current note sounding and display whole notes - fCurrentNoteSoundingWholeNotes = - fCurrentNoteSoundingWholeNotesFromDuration; - - fCurrentNoteDisplayWholeNotes = - fCurrentNoteDisplayWholeNotesFromType; - - /* JMI - if (fCurrentNoteSoundingWholeNotesFromDuration.getNumerator () == 0) { - // only was found, no was specified - fCurrentNoteDisplayWholeNotes = - fCurrentNoteDisplayWholeNotesFromType; - - fCurrentNoteSoundingWholeNotes = - fCurrentNoteDisplayWholeNotes; // same value by default - } - else { - // was found - fCurrentNoteSoundingWholeNotes = - fCurrentNoteSoundingWholeNotesFromDuration; - - fCurrentNoteDisplayWholeNotes = - fCurrentNoteSoundingWholeNotes; // same value by default - } - */ - } - - // create the (new) note - S_msrNote - newNote = - msrNote::create ( - inputLineNumber, - fCurrentMeasureNumber, - - msrNote::k_NoNoteKind, - // will be set by 'setNoteKind()' when it becomes known later - - fCurrentNoteQuarterTonesPitchKind, - - fCurrentNoteSoundingWholeNotes, - fCurrentNoteDisplayWholeNotes, - - fCurrentNoteDotsNumber, - - fCurrentNoteGraphicDurationKind, - - fCurrentNoteOctave, - - fCurrentNoteQuarterTonesDisplayPitchKind, - fCurrentDisplayOctave, - - fCurrentNoteIsARest, - fCurrentNoteIsUnpitched, - - fCurrentNoteIsACueNote, - fCurrentNoteIsAGraceNote, - - fCurrentNotePrintObjectKind, - - fCurrentNoteHeadKind, - fCurrentNoteHeadFilledKind, - fCurrentNoteHeadParenthesesKind); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - "Creating note:" << - endl; - - gIndenter++; - - fLogOutputStream << - newNote << - endl; - - gIndenter--; - } -#endif - - return newNote; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::populateNote ( - int inputLineNumber, - S_msrNote newNote) -{ - // set newNote's color if relevant - if (fCurrentNoteRGB.size () || fCurrentNoteAlpha.size ()) { - newNote->setNoteColor ( - msrAlphaRGBColor ( - fCurrentNoteRGB, - fCurrentNoteAlpha)); - } - - // set note accidentals - newNote-> - setNoteAccidentalKind ( - fCurrentNoteAccidentalKind); - - newNote-> - setNoteEditorialAccidentalKind ( - fCurrentNoteEditorialAccidentalKind); - - newNote-> - setNoteCautionaryAccidentalKind ( - fCurrentNoteCautionaryAccidentalKind); - - // check and consistency if relevant - if ( - fCurrentNoteSoundingWholeNotesFromDuration - != - fCurrentNoteDisplayWholeNotesFromType - && - ! fCurrentNoteHasATimeModification - ) { - switch (newNote->getNoteKind ()) { - case msrNote::k_NoNoteKind: - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - // JMI break; - - case msrNote::kRestNote: - case msrNote::kSkipNote: - case msrNote::kUnpitchedNote: - case msrNote::kStandaloneNote: - case msrNote::kChordMemberNote: - if (! fCurrentNoteIsAGraceNote) { - stringstream s; - - s << - "note duration inconsistency: divisions indicates " << - fCurrentNoteSoundingWholeNotesFromDuration << - " while type indicates " << - fCurrentNoteDisplayWholeNotesFromType << - ", using the latter"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - - newNote-> - setNoteSoundingWholeNotes ( - fCurrentNoteDisplayWholeNotesFromType); - break; - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - case msrNote::kDoubleTremoloMemberNote: - break; - } // switch - } - - // set newNote tie if any - if (fCurrentTie) { - newNote-> - setNoteTie (fCurrentTie); - } - - // set its stem if any - if (fCurrentStem) { - newNote-> - setNoteStem (fCurrentStem); - } - -/* JMI - // attach the beams if any to the note - if (fPendingBeamsList.size ()) { - for ( - list::const_iterator i=fPendingBeamsList.begin (); - i!=fPendingBeamsList.end (); - i++ - ) { - newNote-> - appendBeamToNote ((*i)); - } // for - - fPendingBeamsList.clear (); - } -*/ - - // attach the articulations if any to the note - attachCurrentArticulationsToNote (newNote); - - // attach the technicals if any to the note - attachCurrentTechnicalsToNote (newNote); - attachCurrentTechnicalWithIntegersToNote (newNote); - attachCurrentTechnicalWithFloatsToNote (newNote); - attachCurrentTechnicalWithStringsToNote (newNote); - - // attach the ornaments if any to the note - attachCurrentOrnamentsToNote (newNote); - - // attach the spanners if any to the note - attachCurrentSpannersToNote (newNote); - - // attach the singleTremolo if any to the note - attachCurrentSingleTremoloToNote (newNote); - - // handling the pending grace notes group if any - if (fPendingGraceNotesGroup && ! fCurrentNoteIsAGraceNote) { - // this is the first note after the grace notes group - - // attach the current grace notes to this note - switch (fPendingGraceNotesGroup->getGraceNotesGroupKind ()) { - case msrGraceNotesGroup::kGraceNotesGroupBefore: - newNote-> - setNoteGraceNotesGroupBefore ( - fPendingGraceNotesGroup); - break; - case msrGraceNotesGroup::kGraceNotesGroupAfter: - newNote-> - setNoteGraceNotesGroupAfter ( - fPendingGraceNotesGroup); - break; - } // switch - - // forget about the pending grace notes - fPendingGraceNotesGroup = nullptr; - } - -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::createAStaffChangeIfNecessary ( - int inputLineNumber, - S_msrNote newNote, - S_msrVoice voiceToInsertInto) -{ - // is there a staff change? - fCurrentStaffChangeKind = k_NoStaffChange; - - if ( - fCurrentMusicXMLStaffNumber != fPreviousNoteMusicXMLStaffNumber - && - fPreviousNoteMusicXMLStaffNumber != K_NO_STAFF_NUMBER - ) { - // yes, there is a staff change - - // fetch staff to change to - S_msrStaff - staffToChangeTo = - fetchStaffFromCurrentPart ( - inputLineNumber, - fCurrentMusicXMLStaffNumber); - - // is newNote a chord member note? - if (fCurrentNoteBelongsToAChord) { - // yes, newNote is a chord member note - fCurrentStaffChangeKind = kStaffChangeChordMemberNote; - - // register the note as cross sta - fCurrentNoteIsCrossStaves = true; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffChanges) { - fLogOutputStream << - "*** There is staff change for chord member note '" << - newNote->asShortString () << - "' in voice \"" << - voiceToInsertInto->getVoiceName () << - "\"" << - " from staff " << fPreviousNoteMusicXMLStaffNumber << - " to staff " << fCurrentMusicXMLStaffNumber << - ", \"" << staffToChangeTo->getStaffName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentStaffChangeKind = kStaffChangeChordMemberNote; - - // LilyPond doesn't support cross staff chords, JMI - // so place newNote in its 'official' staff - } - - else { - // no, newNote is another note - fCurrentStaffChangeKind = kStaffChangeOtherNote; - - // a staff change is necessary - // to remain in this staff and not use the note's one - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffChanges) { - fLogOutputStream << - "*** There is staff change for note '" << - newNote->asShortString () << - "' in voice \"" << - voiceToInsertInto->getVoiceName () << - "\"" << - " from staff " << fPreviousNoteMusicXMLStaffNumber << - " to staff " << fCurrentMusicXMLStaffNumber << - ", \"" << staffToChangeTo->getStaffName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the voice staff change - S_msrVoiceStaffChange - voiceStaffChange = - msrVoiceStaffChange::create ( - inputLineNumber, - staffToChangeTo); - - /* JMI - // fetch the voice to insert into - S_msrVoice - voiceToInsertInto = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber); -*/ - - // append it to the current sequence voice - // before the note itself is appended - voiceToInsertInto-> - appendVoiceStaffChangeToVoice ( - voiceStaffChange); - - // the actual note staff is already stored in newNote, - // now fake its belonging to the current sequence staff - // JMI BOFBOFBOF ??? fCurrentMusicXMLStaffNumber = fCurrentStaffNumberToInsertInto; - } - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleNote ( - int inputLineNumber, - S_msrNote newNote) -{ - // handle the note itself - if (fCurrentNoteBelongsToAChord) { - if (fCurrentNoteBelongsToATuplet) { - // note is the second, third, ..., member of a chord - // that is a member of a tuplet - handleNoteBelongingToAChordInATuplet ( - newNote); - } - - else if (fCurrentNoteIsAGraceNote) { - // note is the second, third, ..., member of a chord - // that is a part of grace notes - handleNoteBelongingToAChordInAGraceNotesGroup ( - newNote); - } - - else { - // note is the second, third, ..., member of a chord - // whose first member is in - // JMI ??? 'fLastHandledNoteInVoiceMap [currentVoice]' - handleNoteBelongingToAChord ( - newNote); - } - } - - else if (fCurrentNoteBelongsToATuplet) { - // note/rest is the first, second, third, ..., member of a tuplet - handleNoteBelongingToATuplet ( - newNote); - } - - else { - // note/rest is standalone or a member of grace notes - - // this terminates a tuplet if any - handlePendingTupletStopIfAny ( - inputLineNumber, - newNote); - - // handle it - handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest ( - newNote); - } - - // handling voices current chord map if needed - if (! fCurrentNoteBelongsToAChord) { - if (fOnGoingChord) { - // newNote is the first note after the chord in the current voice - -/* JMI - // finalize the current chord - fCurrentChord-> - finalizeChord ( - inputLineNumber); -*/ - - // forget about the current chord - fCurrentChord = nullptr; - - fOnGoingChord = false; - } - - if (fCurrentDoubleTremolo) { - // forget about a double tremolo containing a chord - // JMI XXL BOFS fCurrentDoubleTremolo = 0; - } - } - - // register newNote as the last found note for the current voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - /* JMI - fLogOutputStream << - "--> STORING " << - newNote->asShortString () << - " as last note found in voice " << - voiceToInsertInto->getVoiceName () << - endl << - "--> fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - endl << - "--> fCurrentMusicXMLVoiceNumber = " << - fCurrentMusicXMLVoiceNumber << - endl << - / * JMI - "--> staff name = " << - staff->getStaffName () << - endl << - * / - "--> voice name = " << - voiceToInsertInto->getVoiceName () << - endl; - */ - } -#endif - - fVoicesLastMetNoteMap [ - make_pair ( - fCurrentStaffNumberToInsertInto, // JMI fCurrentSequenceStaffNumber, - fCurrentMusicXMLVoiceNumber) - ] = - newNote; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - printVoicesLastMetNoteMap ( - inputLineNumber, - "handleNote()"); - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleBackup ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceBackup) { - fLogOutputStream << - "Handling pending backup" << - ", fCurrentBackupDivisions: " << - fCurrentBackupDivisions << - endl; - } -#endif - - // compute the backup step length - rational - backupStepLength = - rational ( - fCurrentBackupDivisions, - fCurrentDivisionsPerQuarterNote * 4); // hence a whole note - backupStepLength.rationalise (); - - // let fCurrentPart handle the backup - fCurrentPart-> - handleBackupInPart ( - inputLineNumber, - backupStepLength); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitEnd ( S_note& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_note" << - ", line " << inputLineNumber << - endl; - } -#endif - - /* - This is a complex method, due to the fact that - dynamics, wedges, chords and tuplets - are not ordered in the same way in MusicXML and LilyPond. - - Staff number is analyzed before voice number - but occurs after it in the MusicXML tree. - That's why the treatment below has been postponed until this method - */ - - /* - Staff assignment is only needed for music notated on multiple staves. - Used by both notes and directions. - Staff values are numbers, with 1 referring to the top-most staff in a part. - */ - - // create the note - S_msrNote - newNote = - createNote ( - inputLineNumber); - - // populate newNote - populateNote ( - inputLineNumber, - newNote); - - // fetch current note's voice - S_msrVoice - currentNoteVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // sanity check - msrAssert ( - currentNoteVoice != nullptr, - "currentNoteVoice is null"); - - // the elements pending since before the note if any - // can now be appended to the latter's voice - // prior to the note itself - attachPendingVoiceLevelElementsToVoice ( - currentNoteVoice); - - // set current staff number to insert into if needed JMI ??? - if (fCurrentStaffNumberToInsertInto == K_NO_STAFF_NUMBER) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceStaffChanges) { - fLogOutputStream << - "==> setting fCurrentStaffNumberToInsertInto to " << - fCurrentMusicXMLStaffNumber << - ", in voice \"" << - currentNoteVoice->getVoiceName () << - "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentStaffNumberToInsertInto = fCurrentMusicXMLStaffNumber; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceStaffChanges) { - fLogOutputStream << - "==> fetching voice to insert note into" << - ", fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - ", fPreviousNoteMusicXMLStaffNumber = " << - fPreviousNoteMusicXMLStaffNumber << - ", fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - ", fCurrentMusicXMLVoiceNumber = " << - fCurrentMusicXMLVoiceNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - // fetch voice to insert note into - S_msrVoice - voiceToInsertNoteInto = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber); - - // sanity check - msrAssert ( - voiceToInsertNoteInto != nullptr, - "voiceToInsertNoteInto is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceStaffChanges) { - fLogOutputStream << - "==> is there a staff change?" << - " fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - ", fPreviousNoteMusicXMLStaffNumber = " << - fPreviousNoteMusicXMLStaffNumber << - ", fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - ", in voice \"" << - voiceToInsertNoteInto->getVoiceName() << - "\"" << - /* JMI - ", fCurrentMusicXMLStaffNumber = " << fCurrentMusicXMLStaffNumber << - ", in staff \"" << - staff->getStaffName() << - "\"" << - */ - ", line " << inputLineNumber << - endl; - } -#endif - - // attach the pre-pending elements if any to newNote, - // before the note itself is handled, because that may cause - // tuplets or chords to be appended to the voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceStaffChanges) { - fLogOutputStream << - "==> fetching voice to insert harmonies, figured basses and/or frames into" << - ", fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - ", fPreviousNoteMusicXMLStaffNumber = " << - fPreviousNoteMusicXMLStaffNumber << - ", fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - ", fCurrentMusicXMLVoiceNumber = " << - fCurrentMusicXMLVoiceNumber << - ", line " << inputLineNumber << - endl; - } -#endif - - // fetch the staff from current part - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto); - - // fetch voice to insert harmonies, figured basses and/or frames into - S_msrVoice - voiceToInsertHarmoniesFiguredBassesAndOrFramesInto = - voiceToInsertNoteInto; - /* JMI - staff-> - fetchFirstRegularVoiceFromStaff ( - inputLineNumber); - */ - - // sanity check - msrAssert ( - voiceToInsertHarmoniesFiguredBassesAndOrFramesInto != nullptr, - "voiceToInsertHarmoniesFiguredBassesAndOrFramesInto is null"); - - attachPendingHarmoniesFiguredBassesAndOrFramesToNote ( - inputLineNumber, - newNote, - voiceToInsertHarmoniesFiguredBassesAndOrFramesInto); - - // create a staff change if necessary - createAStaffChangeIfNecessary ( - inputLineNumber, - newNote, - voiceToInsertNoteInto); - - //////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////// - // handle the note itself - //////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////// - - handleNote ( - inputLineNumber, - newNote); - - // attach the pending elements, if any, to newNote - // only now because follows and in MusicXML JMI ??? - attachPendingNoteLevelElementsToNote (newNote); - - // lyrics if any have to be handled in all cases - // only now because attachPendingNoteLevelElementsToNote() - // may append skip syllables to the notes - handleLyricsForNote ( - voiceToInsertNoteInto, - newNote); - - fOnGoingNote = false; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator:: attachPendingHarmoniesFiguredBassesAndOrFramesToNote ( - int inputLineNumber, - S_msrNote newNote, - S_msrVoice voiceToInsertInto) -{ - // handling the current pending harmonies if any, - // so that they get attached to the note right now - if (fPendingHarmoniesList.size ()) { - // handle the pending harmonies - handlePendingHarmonies ( - newNote, - voiceToInsertInto); - - // reset harmony counter - fHarmonyVoicesCounter = 0; - } - - // handling the current pending figured bass if any, - // so that it gets attached to the note right now - if (fPendingFiguredBassesList.size ()) { - // handle the pending figured basses - handlePendingFiguredBasses ( - newNote, - voiceToInsertInto); - - // reset figured bass counter - fFiguredBassVoicesCounter = 0; - - // JMI fPendingFiguredBass = false; - } - - // handling the current pending frames if any, - // so that they get attached to the note right now - if (fPendingFramesList.size ()) { - while (fPendingFramesList.size ()) { - S_msrFrame - frame = - fPendingFramesList.front (); - - // attach the frame to the note - newNote-> - setNoteFrame (frame); - - // remove it from the list - fPendingFramesList.pop_front (); - } // while - } -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handlePendingHarmonies ( - S_msrNote newNote, - S_msrVoice voiceToInsertInto) -{ - rational - newNoteSoundingWholeNotes = - newNote-> - getNoteSoundingWholeNotes (), - newNoteDisplayWholeNotes = - newNote-> - getNoteDisplayWholeNotes (); - - while (fPendingHarmoniesList.size ()) { // recompute at each iteration - S_msrHarmony - harmony = - fPendingHarmoniesList.front (); - - /* - MusicXML harmonies don't have a duration, - and MSR could follow this line, but LilyPond needs one... - So: - - we register all harmonies with the duration of the next note - - they will be sorted by position in the measure in finalizeMeasure(), - at which time their duration may be shortened - so that the offsets values are enforced - and they dont overflow the measure - It is VITAL that harmony measures are finalized - AFTER the corresponding measure in the regular voice, - since the current sounding whole notes of the latter is needed for that - */ - - // set the harmony's sounding whole notes - harmony-> - setHarmonySoundingWholeNotes ( - newNoteSoundingWholeNotes); - - // set the harmony's display whole notes JMI useless??? - harmony-> - setHarmonyDisplayWholeNotes ( - newNoteDisplayWholeNotes); - - // set the harmony's tuplet factor - harmony-> - setHarmonyTupletFactor ( - msrTupletFactor ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes)); - - // attach the harmony to newNote - newNote-> - appendNoteToNoteHarmoniesList (harmony); - - // get the harmony voice for the current voice - S_msrVoice - voiceHarmonyVoice = - voiceToInsertInto-> - getHarmonyVoiceForRegularVoiceForwardLink (); - - // sanity check - msrAssert ( - voiceHarmonyVoice != nullptr, - "voiceHarmonyVoice is null"); - - // set the harmony's voice upLink - // only now that we know which harmony voice will contain it - harmony-> - setHarmonyVoiceUpLink ( - voiceHarmonyVoice); - - // append the harmony to the harmony voice for the current voice - voiceHarmonyVoice-> - appendHarmonyToVoice ( - harmony); - - // remove it from the list - fPendingHarmoniesList.pop_front (); - } // while -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handlePendingFiguredBasses ( - S_msrNote newNote, - S_msrVoice voiceToInsertInto) -{ - rational - newNoteSoundingWholeNotes = - newNote-> - getNoteSoundingWholeNotes (), - newNoteDisplayWholeNotes = - newNote-> - getNoteDisplayWholeNotes (); - - while (fPendingFiguredBassesList.size ()) { // recompute at each iteration - S_msrFiguredBass - figuredBass = - fPendingFiguredBassesList.front (); - - /* - Figured bass elements take their position from the first - regular note (not a grace note or chord note) that follows - in score order. The optional duration element is used to - indicate changes of figures under a note. - */ - - // set the figured bass's sounding whole notes - figuredBass-> - setFiguredBassSoundingWholeNotes ( - newNoteSoundingWholeNotes); - - // set the figured bass's display whole notes JMI useless??? - figuredBass-> - setFiguredBassDisplayWholeNotes ( - newNoteDisplayWholeNotes); - - // set the figured bass's tuplet factor - figuredBass-> - setFiguredBassTupletFactor ( - msrTupletFactor ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes)); - - // attach the figured bass to newNote - newNote-> - setNoteFiguredBass (figuredBass); - - // get the figured bass voice for the current voice - S_msrVoice - voiceFiguredBassVoice = - voiceToInsertInto-> - getFiguredBassVoiceForRegularVoiceForwardLink (); - - // sanity check - msrAssert ( - voiceFiguredBassVoice != nullptr, - "voiceFiguredBassVoice is null"); - - // set the figuredBass's voice upLink - // only now that we know which figured bass voice will contain it - figuredBass-> - setFiguredBassVoiceUpLink ( - voiceFiguredBassVoice); - - // append the figured bass to the figured bass voice for the current voice - voiceFiguredBassVoice-> - appendFiguredBassToVoice ( - figuredBass); - - // remove it from the list - fPendingFiguredBassesList.pop_front (); - } // while -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest ( - S_msrNote newNote) -{ - int inputLineNumber = - newNote->getInputLineNumber (); - - // register note/rest kind right now, to have a nice trace below - if (fCurrentNoteIsAGraceNote) { - // gracenote - newNote-> - setNoteKind ( - msrNote::kGraceNote); - } - - else if ( - fCurrentTremoloTypeKind == kTremoloTypeStart - || - fCurrentTremoloTypeKind == kTremoloTypeStop - ) { - // double tremolo note - newNote-> - setNoteKind ( - msrNote::kDoubleTremoloMemberNote); - } - - else { - // standalone or unpitched note or rest - if (fCurrentNoteIsARest) { - msrNote::msrNoteKind - noteKind; - - if (fCurrentRestMeasure) { // JMI ??? - noteKind = msrNote::kRestNote; // JMI ??? myfile_utf8.xml - } - else { - noteKind = msrNote::kRestNote; - } - - newNote-> - setNoteKind ( - noteKind); - } - else if (fCurrentNoteIsUnpitched) { - newNote-> - setNoteKind ( - msrNote::kUnpitchedNote); - } - else { - newNote-> - setNoteKind ( - msrNote::kStandaloneNote); - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { // JMI - fLogOutputStream << - "handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest(), newNote = " << - endl; - gIndenter++; - fLogOutputStream << - newNote << - endl; - gIndenter--; - } -#endif - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Handling a standalone, double tremolo or grace note or rest" << - ", currentVoice = \"" << - currentVoice->getVoiceName () << - "\", line " << inputLineNumber << - ":" << - endl; - - gIndenter++; - - fLogOutputStream << - newNote->asString () << - endl; - - const int fieldWidth = 25; - - fLogOutputStream << left << - setw (fieldWidth) << "voice" << " : \"" << - currentVoice->getVoiceName () << "\"" << - endl << - setw (fieldWidth) << "line:" << " : " << - inputLineNumber << - endl << - setw (fieldWidth) << "fCurrentNoteIsAGraceNote" << " : " << - booleanAsString (fCurrentNoteIsAGraceNote) << - endl; - - if (gTraceOah->fTraceNotesDetails) { - fLogOutputStream << - setw (fieldWidth) << "fPendingGraceNotesGroup" << " : " << - endl << - "======================= handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest" << - ", line " << inputLineNumber << - endl; - fCurrentPart->print (fLogOutputStream); - fLogOutputStream << - "=======================" << - endl << - endl; - - if (fPendingGraceNotesGroup) { - fLogOutputStream << - fPendingGraceNotesGroup; - } - else { - // fLogOutputStream << - // "fCurrentGraceNotes is NULL"; // JMI - } - - fLogOutputStream << endl; - } - - gIndenter--; - } -#endif - -/* JMI ??? - // handle the pending tuplets if any, - // unless the current note is a grace note, - // i.e. it is attached to a tuplet member note JMI - if (! fCurrentNoteIsAGraceNote) { - handleTupletsPendingOnTupletsStack ( - inputLineNumber); - } - */ - - if (fCurrentNoteIsAGraceNote) { - if (! fPendingGraceNotesGroup) { - // this is the first grace note in grace notes - -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Creating grace notes for note '" << - newNote->asString () << - "' in voice \"" << - currentVoice->getVoiceName () << "\"" << - endl; - } -#endif - - // create grace notes group - fPendingGraceNotesGroup = - msrGraceNotesGroup::create ( - inputLineNumber, - msrGraceNotesGroup::kGraceNotesGroupBefore, // default value - fCurrentGraceIsSlashed, - currentVoice); - - // should all grace notes be slurred? - if (gMsrOah->fSlurAllGraceNotes) { - fPendingGraceNotesGroup->setGraceNotesGroupIsTied (); - } - -/* JMI - // register that last handled note if any is followed by grace notes - S_msrNote - lastHandledNoteInVoice = - currentVoice-> - getVoiceLastAppendedNote (); - - if (lastHandledNoteInVoice) { - lastHandledNoteInVoice-> - setNoteIsFollowedByGraceNotes (); - } -*/ - - // append the grace notes to the current voice // NO JMI - /* - currentVoice-> - appendGraceNotesToVoice ( - fCurrentGraceNotes); - // */ - } - - // register that last handled note if any is followed by grace notes JMI ??? - S_msrNote - lastHandledNoteInVoice = - currentVoice-> - getVoiceLastAppendedNote (); - - if (lastHandledNoteInVoice) { - lastHandledNoteInVoice-> - setNoteIsFollowedByGraceNotesGroup (); - } - - // append newNote to the current grace notes -#ifdef TRACE_OAH - if (gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Appending note " << - newNote->asString () << - " to grace notes in voice \"" << - currentVoice->getVoiceName () << - "\", line " << inputLineNumber << - endl; - } -#endif - - // append newNote to the pending grace notes group - fPendingGraceNotesGroup-> - appendNoteToGraceNotesGroup (newNote); - } - - else if (fCurrentTremoloTypeKind != k_NoTremoloType) { - // newNote belongs to a tremolo - - switch (fCurrentTremoloTypeKind) { - case k_NoTremoloType: - // just to avoid a compiler message - break; - - case kTremoloTypeSingle: - // append newNote to the current voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending standalone " << - newNote->asString () << - ", line " << newNote->getInputLineNumber () << - ", to voice \"" << - currentVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - currentVoice-> - appendNoteToVoice (newNote); - - // fCurrentSingleTremolo is handled in - // attachCurrentSingleTremoloToNote() - break; - - case kTremoloTypeStart: - // register newNote as first element of the current double tremolo -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Setting standalone note '" << - newNote->asString () << - "', line " << newNote->getInputLineNumber () << - ", as double tremolo first element" << - " in voice \"" << - currentVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentDoubleTremolo-> - setDoubleTremoloNoteFirstElement ( - newNote); - break; - - case kTremoloTypeStop: - // register newNote as second element of the current double tremolo -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Setting standalone note '" << - newNote->asString () << - "', line " << newNote->getInputLineNumber () << - ", as double tremolo second element" << - " in voice \"" << - currentVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - fCurrentDoubleTremolo-> - setDoubleTremoloNoteSecondElement ( - newNote); - - // append current double tremolo to current voice - currentVoice-> - appendDoubleTremoloToVoice ( - fCurrentDoubleTremolo); - - // forget about the current double tremolo - // fCurrentDoubleTremolo = 0; // JMI not if there's a chord in the double tremolo XXL BOF - break; - } // switch - } - - else { - // standalone note or rest - - // append newNote to the current voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { - fLogOutputStream << - "Appending standalone " << - newNote->asString () << - ", line " << newNote->getInputLineNumber () << - ", to voice \"" << - currentVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - currentVoice-> - appendNoteToVoice (newNote); - - if (false) { // XXL, syllable sans fSyllableNote assigne JMI - fLogOutputStream << - endl << endl << - "&&&&&&&&&&&&&&&&&& currentVoice (" << - currentVoice->getVoiceName () << - ") contents &&&&&&&&&&&&&&&&&&" << - endl << - currentVoice << - endl << endl; - } - } - - // take care of slurs JMI ??? - switch (fCurrentSlurTypeKind) { - case msrSlur::kRegularSlurStart: - case msrSlur::kPhrasingSlurStart: - fFirstSyllableInSlurKind = fCurrentSyllableKind; - break; - case msrSlur::kSlurContinue: - break; - case msrSlur::kRegularSlurStop: - case msrSlur::kPhrasingSlurStop: - fFirstSyllableInSlurKind = msrSyllable::kSyllableNone; - break; - case msrSlur::k_NoSlur: - ; - } // switch - - // take care of ligatures JMI ??? - switch (fCurrentLigatureKind) { - case msrLigature::kLigatureStart: - fFirstSyllableInLigatureKind = fCurrentSyllableKind; - break; - case msrLigature::kLigatureContinue: - break; - case msrLigature::kLigatureStop: - fFirstSyllableInLigatureKind = msrSyllable::kSyllableNone; - break; - default: - ; - } // switch -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleLyricsForNote ( - S_msrVoice currentVoice, - S_msrNote newNote) -{ - int inputLineNumber = - newNote->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyrics) { - fLogOutputStream << - "Handling lyrics for note '" << - newNote->asShortString () << - "', line " << inputLineNumber << - endl; - - gIndenter++; - - const int fieldWidth = 33; - - fLogOutputStream << - setw (fieldWidth) << - "currentVoice" << " = \"" << currentVoice->getVoiceName () <<"\"" << - endl << - setw (fieldWidth) << - "newNote" << " = \"" << newNote->asShortString () << "\"" << - endl << - setw (fieldWidth) << - "fLastHandledNoteInVoiceHasLyrics" << " = " << - booleanAsString ( - fLastHandledNoteInVoiceHasLyrics) << - endl << - setw (fieldWidth) << - "fCurrentSyllableExtendKind" << "" << " = " << - msrSyllable::syllableExtendKindAsString ( - fCurrentSyllableExtendKind) << - endl << - setw (fieldWidth) << - "fOnGoingSyllableExtend" << " = " << - booleanAsString ( - fOnGoingSyllableExtend) << - endl << - - setw (fieldWidth) << - "fCurrentNoteHasLyrics" << " = " << - booleanAsString ( - fCurrentNoteHasLyrics) << - endl << - setw (fieldWidth) << - "fASkipSyllableHasBeenGeneratedForcurrentNote" << " = " << - booleanAsString ( - fASkipSyllableHasBeenGeneratedForcurrentNote) << - endl << - - setw (fieldWidth) << - "fCurrentStanzaNumber" << " = " << fCurrentStanzaNumber << - endl << - setw (fieldWidth) << - "fCurrentStanzaName" << " = " << fCurrentStanzaName << "\"" << - endl << - setw (fieldWidth) << - "fCurrentLyricTextsList" << " = "; - - msrSyllable::writeTextsList ( - fCurrentLyricTextsList, - fLogOutputStream); - - fLogOutputStream << endl; - - gIndenter--; - } -#endif - - if (fCurrentNoteHasLyrics) { - // newNote has lyrics attached to it -#ifdef TRACE_OAH - if (gTraceOah->fTraceLyricsDetails) { - fLogOutputStream << - "Note '" << - newNote->asShortString () << - "' has lyrics attached to it" << " ***" << - endl; - } -#endif - - for ( - list::const_iterator i = - fCurrentNoteSyllables.begin (); - i != fCurrentNoteSyllables.end (); - i++ ) { - S_msrSyllable - syllable = (*i); - - // set syllable note upLink to newNote - syllable-> - appendSyllableToNoteAndSetItsNoteUpLink ( - newNote); - } // for - - // forget about all of newNote's syllables - fCurrentNoteSyllables.clear (); - } - - else { - // newNote has no lyrics attached to it: - // don't create a skip for chord note members except the first - // nor for grace notes - - bool doCreateASkipSyllable = - // ! fASkipSyllableHasBeenGeneratedForcurrentNote; JMI - ! fCurrentNoteHasLyrics; - - switch (fCurrentSyllableExtendKind) { - case msrSyllable::kSyllableExtendNone: - // doCreateASkipSyllable = true; // JMI - break; - case msrSyllable::kSyllableExtendSingle: - break; - case msrSyllable::kSyllableExtendStart: - break; - case msrSyllable::kSyllableExtendContinue: - // doCreateASkipSyllable = true; // JMI - break; - case msrSyllable::kSyllableExtendStop: - break; - } // switch - - if (doCreateASkipSyllable) { - if ( - ! (fCurrentNoteBelongsToAChord || fCurrentNoteIsAGraceNote) - ) { - // get the current voice's stanzas map - const map& - voiceStanzasMap = - currentVoice-> - getVoiceStanzasMap (); - - for ( - map::const_iterator i = voiceStanzasMap.begin (); - i != voiceStanzasMap.end (); - i++ - ) { - S_msrStanza stanza = (*i).second; - - //choose the syllable kind - msrSyllable::msrSyllableKind - syllableKind = - fCurrentNoteIsARest - ? msrSyllable::kSyllableSkipRestNote - : msrSyllable::kSyllableSkipNonRestNote; - - // create a skip syllable - S_msrSyllable - syllable = - msrSyllable::create ( - inputLineNumber, - syllableKind, - fCurrentSyllableExtendKind, - fCurrentNoteSoundingWholeNotesFromDuration, - msrTupletFactor ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes), - stanza); - - // set syllable note upLink to newNote - syllable-> - appendSyllableToNoteAndSetItsNoteUpLink ( - newNote); - - // append syllable to stanza - stanza-> - appendSyllableToStanza (syllable); - } // for - } - } - } - - // register whether the new last handled note has lyrics - fLastHandledNoteInVoiceHasLyrics = - fCurrentNoteHasLyrics; - - // take care of ongoing extends - switch (fCurrentSyllableExtendKind) { - case msrSyllable::kSyllableExtendNone: - break; - case msrSyllable::kSyllableExtendSingle: - fOnGoingSyllableExtend = true; - break; - case msrSyllable::kSyllableExtendStart: - fOnGoingSyllableExtend = true; - break; - case msrSyllable::kSyllableExtendContinue: - msrAssert ( - fOnGoingSyllableExtend, - "fOnGoingSyllableExtend is false"); - break; - case msrSyllable::kSyllableExtendStop: - fOnGoingSyllableExtend = false; - break; - } // switch -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleNoteBelongingToAChord ( - S_msrNote newChordNote) -{ - int inputLineNumber = - newChordNote->getInputLineNumber (); - - // set newChordNote kind as a chord member - newChordNote-> - setNoteKind ( - msrNote::kChordMemberNote); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Handling a note belonging to a chord" << - ", newChordNote:" << - endl; - - gIndenter++; - - fLogOutputStream << newChordNote << - endl; - - gIndenter--; - } -#endif - - if (fCurrentNoteIsARest) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "a rest cannot belong to a chord"); - } - - // fetch current voice - int staffNumberToUse = -1001; - // to avoid compiler warning for uninitialized variable - - switch (fCurrentStaffChangeKind) { - case k_NoStaffChange: - staffNumberToUse = - fCurrentStaffNumberToInsertInto; // JMI fCurrentMusicXMLStaffNumber; - break; - case kStaffChangeChordMemberNote: - if (fCurrentNoteIsCrossStaves) { - staffNumberToUse = - fCurrentStaffNumberToInsertInto; - // JMI staffNumberToUse = fCurrentMusicXMLStaffNumber; // keep it! - } - else { - // JMI staffNumberToUse = fCurrentChordStaffNumber; - staffNumberToUse = - fCurrentStaffNumberToInsertInto; - } - break; - case kStaffChangeOtherNote: - staffNumberToUse = - fCurrentStaffNumberToInsertInto; - // JMI staffNumberToUse = fCurrentMusicXMLStaffNumber; - break; - } // switch - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << // JMI - endl << - "***==> fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - ", fCurrentChordStaffNumber = " << - fCurrentChordStaffNumber << - ", fPreviousNoteMusicXMLStaffNumber = " << - fPreviousNoteMusicXMLStaffNumber << - ", fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - ", staffNumberToUse = " << - staffNumberToUse << - "', line " << inputLineNumber << - endl; - } -#endif - - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - staffNumberToUse, - fCurrentMusicXMLVoiceNumber); - - // sanity check JMI ??? - msrAssert ( - currentVoice != nullptr, - "currentVoice is null"); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Handling a chord member note" << - ", currentVoice = \"" << - currentVoice->getVoiceName () << - "\", fOnGoingChord = " << - booleanAsString (fOnGoingChord) << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - fLogOutputStream << - endl << - "======================= handleNoteBelongingToAChord" << - ", line " << inputLineNumber << - endl; - fCurrentPart->print (fLogOutputStream); - fLogOutputStream << - "=======================" << - endl << - endl; - -/* JMI - if (fCurrentGraceNotes) { - fLogOutputStream << - fCurrentGraceNotes; - } - else { -// fLogOutputStream << -// "fCurrentGraceNotes is NULL"; // JMI - } -*/ - - fLogOutputStream << endl; - } -#endif - - // should a chord be created? - if (! fOnGoingChord) { - // newChordNote is the second note of the chord to be created - - // fetch this chord's first note, - // i.e the last handled note for this voice - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - printVoicesLastMetNoteMap ( - inputLineNumber, - "handleNoteBelongingToAChord()"); - } -#endif - - S_msrNote - chordFirstNote = - // fVoicesLastMetNoteMap [currentVoice]; - fVoicesLastMetNoteMap [ - make_pair ( - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber) - ]; - /* - currentVoice-> - getVoiceLastAppendedNote (); ??? JMI - */ - - if (! chordFirstNote) { - stringstream s; - - s << - "handleNoteBelongingToAChord():" << - endl << - "chordFirstNote is null on " << - newChordNote->asString () << - endl << - "fCurrentMusicXMLStaffNumber = " << fCurrentMusicXMLStaffNumber << - endl << - "fCurrentMusicXMLVoiceNumber = " << fCurrentMusicXMLVoiceNumber; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "mxmlTree2MsrTranslator::handleNoteBelongingToAChord()" << - ", chordFirstNote:" << - endl; - - gIndenter++; - - fLogOutputStream << - chordFirstNote << - endl; - - gIndenter--; - } -#endif - - // fetch chord first note's kind before createChordFromItsFirstNote(), - // because the latter will change it to kChordMemberNote or kGraceChordMemberNote - msrNote::msrNoteKind - savedChordFirstNoteKind = - chordFirstNote->getNoteKind (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Handling a note belonging to a chord" << - ", savedChordFirstNoteKind = " << - msrNote::noteKindAsString (savedChordFirstNoteKind) << - endl; - - gIndenter++; - - fLogOutputStream << - chordFirstNote << - endl; - - gIndenter--; - } -#endif - - // create the current chord from its first note - fCurrentChord = - createChordFromItsFirstNote ( - inputLineNumber, - currentVoice, - chordFirstNote, - msrNote::kChordMemberNote); - - // handle chord's first note - switch (savedChordFirstNoteKind) { - case msrNote::kRestNote: - break; - - case msrNote::kSkipNote: - break; - - case msrNote::kUnpitchedNote: - case msrNote::kStandaloneNote: - // remove last handled (previous current) note from the current voice -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Removing chord first note " << - chordFirstNote->asShortString () << - ", line " << inputLineNumber << - ", from voice \"" << currentVoice->getVoiceName () << "\"" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - fLogOutputStream << - endl << endl << - "&&&&&&&&&&&&&&&&&& fCurrentPart contents &&&&&&&&&&&&&&&&&&" << - endl << - fCurrentPart << - endl << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaffChanges) { - fLogOutputStream << // JMI - endl << - "***==> fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - ", fPreviousNoteMusicXMLStaffNumber = " << - fPreviousNoteMusicXMLStaffNumber << - ", fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - "', line " << inputLineNumber << - endl; - } -#endif - - currentVoice-> - removeNoteFromVoice ( - inputLineNumber, - chordFirstNote); - - // add chord to the voice instead -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Appending chord " << fCurrentChord->asString () << - " to voice \"" << - currentVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - currentVoice-> - appendChordToVoice ( - fCurrentChord); - break; - - case msrNote::kDoubleTremoloMemberNote: - { - /* JMI - // fetch chordFirstNote's sounding divisions - int chordFirstNoteSoundingWholeNotes = // JMI - chordFirstNote-> - getNoteSoundingWholeNotes (); - */ - - /* JMI - // updating chord's divisions // JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes || gTraceOah->fTraceChords) { - fLogOutputStream << - "Updating sounding divisions for double tremolo chord '" << - "' " << chord->asString () << - " to '" << chordFirstNoteSoundingWholeNotes << - "' in voice \"" << - currentVoice->getVoiceName () << - "\"" << - endl; - } -#endif - - chord-> - setChordSoundingWholeNotes ( // ??? JMI - chordFirstNoteSoundingWholeNotes); - */ - - if (chordFirstNote->getNoteIsFirstNoteInADoubleTremolo ()) { - // replace double tremolo's first element by chord - fCurrentDoubleTremolo-> - setDoubleTremoloChordFirstElement ( - fCurrentChord); - } - - else if (chordFirstNote->getNoteIsSecondNoteInADoubleTremolo ()) { - // replace double tremolo's second element by chord - fCurrentDoubleTremolo-> - setDoubleTremoloChordSecondElement ( - fCurrentChord); - } - - else { - stringstream s; - - s << - "chord first note '" << - chordFirstNote->asShortString () << - "' belongs to a double tremolo, but is not marked as such"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - break; - - case msrNote::kGraceNote: - case msrNote::kGraceChordMemberNote: - break; - - case msrNote::kChordMemberNote: - // error? JMI - break; - - case msrNote::kTupletMemberNote: - case msrNote::kGraceTupletMemberNote: - case msrNote::kTupletMemberUnpitchedNote: - break; - - case msrNote::k_NoNoteKind: - break; - } // switch - - // account for chord being built - fOnGoingChord = true; - } - - else { - // is newChordNote in the same chord but in another voice, - // implying it is a member of a crossstaff chord? - -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "is newChordNote in the same chord but in another voice?" << - ", currentVoice = " << - currentVoice->getVoiceName () << - endl; - - printVoicesCurrentChordMap (); - } -#endif -*/ - - // register newChordNote as another member of chord -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Adding another note " << - newChordNote->asString() << - ", line " << inputLineNumber << - " to current chord in voice " << - currentVoice->getVoiceName () << - endl; - } -#endif - } - - // add newChordNote to current chord - fCurrentChord-> - addAnotherNoteToChord ( - newChordNote, currentVoice); - - // copy newChordNote's elements if any to the current chord - copyNoteElementsToChord ( - newChordNote, fCurrentChord); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - printCurrentChord (); - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handlePendingTupletStopIfAny ( - int inputLineNumber, - S_msrNote note) -{ - if (fCurrentATupletStopIsPending) { - // finalize the tuplet, only now - // in case the last element is a chord -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStart: handling pending tuplet stop, note '" << - note-> - asShortString () << - "', line " << inputLineNumber << - endl; - } -#endif - - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - - // the tuplet stop is not to be handled later - fCurrentATupletStopIsPending = false; - } -} - -void mxmlTree2MsrTranslator::handleNoteBelongingToATuplet ( - S_msrNote note) -{ - int inputLineNumber = - note->getInputLineNumber (); - - // register note as a tuplet member - if (fCurrentNoteIsUnpitched) { - note-> - setNoteKind (msrNote::kTupletMemberUnpitchedNote); - } - else { - note-> - setNoteKind (msrNote::kTupletMemberNote); - } - - if (fCurrentNoteSoundingWholeNotesFromDuration.getNumerator () == 0) { - // no duration has been found, - // determine sounding from display whole notes - note-> - determineTupletMemberSoundingFromDisplayWholeNotes ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Handling a note belonging to a tuplet" << - ", note: " << - note-> - asShortString () << - ", line " << inputLineNumber << - endl; - } -#endif - - // is there an ongoing chord? - if (! fOnGoingChord) { - // note is the first one after a chord in a tuplet, - // JMI - } - - switch (fCurrentTupletTypeKind) { - case msrTuplet::kTupletTypeStart: - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStart: note = '" << - note-> - asShortString () << - "', line " << inputLineNumber << - endl; - } -#endif - - handlePendingTupletStopIfAny ( - inputLineNumber, - note); - /* JMI - if (fCurrentATupletStopIsPending) { - // finalize the tuplet, only now - // in case the last element is a chord -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStart: handling pending tuplet stop, note '" << - note-> - asShortString () << - "', line " << inputLineNumber << - endl; - } -#endif - - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - - // the tuplet stop is not to be handled later - fCurrentATupletStopIsPending = false; - } - */ - - // create the tuplet - createTupletWithItsFirstNoteAndPushItToTupletsStack ( - note); - - // swith to continuation mode - // this is handy in case the forthcoming tuplet members - // are not explictly of the "continue" type - fCurrentTupletTypeKind = msrTuplet::kTupletTypeContinue; - } - break; - - case msrTuplet::kTupletTypeContinue: - { - if (fTupletsStack.size ()) { - S_msrTuplet - currentTuplet = - fTupletsStack.front (); - - // populate the tuplet at the top of the stack -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeContinue: adding tuplet member note '" << - note-> - asShortString () << - "' to stack top tuplet '" << - currentTuplet->asString () << - "', line " << inputLineNumber << - endl; - } -#endif - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, // fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // add note to tuplet - currentTuplet-> - addNoteToTuplet ( - note, - currentVoice); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTupletsDetails) { - displayTupletsStack ( - "############## kTupletTypeContinue"); - } -#endif - -/* JMI - // set note displayed divisions - note-> - applyTupletMemberDisplayFactor ( - fTupletsStack.front ()->getTupletActualNotes (), - fTupletsStack.front ()->getTupletNormalNotes ()); -*/ - } - - else { - stringstream s; - - s << - "handleNoteBelongingToATuplet():" << - endl << - "tuplet member note '" << - note-> - asShortString () << - "' cannot be added, tuplets stack is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - break; - - case msrTuplet::kTupletTypeStop: - { - switch (fTupletsStack.size ()) { - case 0: - { - stringstream s; - - s << - "handleNoteBelongingToATuplet():" << - endl << - "tuplet member note '" << - note-> - asShortString () << - "' cannot be added, tuplets stack is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - break; - - case 1: - { - // outer-most tuplet: - // add the note to to it before finalizing it - S_msrTuplet - currentTuplet = - fTupletsStack.front (); - - // populate the tuplet at the top of the stack -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStop: adding outer-most tuplet member note '" << - note-> - asShortString () << - "' to stack top tuplet '" << - currentTuplet->asString () << - "', line " << inputLineNumber << - endl; - } -#endif - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, // fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // add note to tuplet - currentTuplet-> - addNoteToTuplet ( - note, - currentVoice); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTupletsDetails) { - displayTupletsStack ( - "############## kTupletTypeStop, outer-most"); - } -#endif - - //* JMI - if (fCurrentATupletStopIsPending) { - // end of a tuplet forces handling of the pending one -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStop: finalizing pending tuplet" << - ", line " << inputLineNumber << - endl; - } -#endif - - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - - // the tuplet stop is not to be handled later - fCurrentATupletStopIsPending = false; - } - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStop: finalizing non-pending tuplet" << // JMI ??? - ", line " << inputLineNumber << - endl; - } -#endif - - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - } - //*/ - - // don't pop the inner-most tuplet from the stack yet - - // fCurrentATupletStopIsPending = true; - } - break; - - default: - { - // nested tuplet: - // finalize it before adding the note to the containing tuplet - handlePendingTupletStopIfAny ( - inputLineNumber, - note); - /* JMI - if (fCurrentATupletStopIsPending) { - // end of a tuplet forces handling of the pending one -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStop: finalizing tuplet" << - ", line " << inputLineNumber << - endl; - } -#endif - - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - - // the tuplet stop is not to be handled later - fCurrentATupletStopIsPending = false; - } - */ - - S_msrTuplet - currentTuplet = - fTupletsStack.front (); - - // populate the tuplet at the top of the stack -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStop: adding nested tuplet member note '" << - note-> - asShortString () << - "' to stack top tuplet '" << - currentTuplet->asString () << - "', line " << inputLineNumber << - endl; - } -#endif - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, // fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // add note to tuplet - currentTuplet-> - addNoteToTuplet ( - note, - currentVoice); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTupletsDetails) { - displayTupletsStack ( - "############## kTupletTypeStop, nested"); - } -#endif - - /* JMI - // set note displayed divisions - note-> - applyTupletMemberDisplayFactor ( - fTupletsStack.front ()->getTupletActualNotes (), - fTupletsStack.front ()->getTupletNormalNotes ()); - */ - } - } // switch - - // finalizeTupletAndPopItFromTupletsStack() should be delayed - // in case this note - // is the first one of a chord in a tuplet JMI XXL ??? - - // the tuplet stop hast to be handled later - fCurrentATupletStopIsPending = false; // JMI ??? - } - break; - - case msrTuplet::kTupletTypeStartAndStopInARow: - { -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "--> kTupletTypeStartAndStopInARow: note = '" << - note-> - asShortString () << - "', line " << inputLineNumber << - endl; - } -#endif - - if (fCurrentSingleTremolo) { - fCurrentTupletTypeKind = msrTuplet::kTupletTypeStartAndStopInARow; - } - else { - stringstream s; - - s << - "one-note tuplet with a non single tremolo contents found"; - - // JMI msrMusicXMLError ( - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - // __FILE__, __LINE__, - s.str ()); - } - - // create the tuplet - createTupletWithItsFirstNoteAndPushItToTupletsStack ( - note); - - // the tuplet stop is not to be handled later - // fCurrentATupletStopIsPending = false; // JMI - - // finalize it - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - } - break; - - case msrTuplet::kTupletTypeNone: - break; - } // switch - -/* JMI ??? - // forget about this tuplet type, needed for nested tuplets - fCurrentTupletTypeKind = - msrTuplet::kTupletTypeNone; - */ -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleNoteBelongingToAChordInATuplet ( - S_msrNote newChordNote) -{ - /* - The first note of a chord belonging to a tuplet - is marked in MusicXML as a tuplet member only, - it has already been appended to the voice in - handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest (), - and the following ones are marked as both a tuplet and a chord member - */ - - int inputLineNumber = - newChordNote->getInputLineNumber (); - - // set new note kind as a chord or grace chord member JMI ??? - newChordNote-> - setNoteKind ( - msrNote::kChordMemberNote); - - // apply tuplet sounding factor to note - if (fCurrentNoteSoundingWholeNotesFromDuration.getNumerator () == 0) { - // no duration has been found, - // determine sounding from display whole notes - newChordNote-> - determineTupletMemberSoundingFromDisplayWholeNotes ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes); - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Handling a note belonging to a chord in a tuplet" << - ", newChordNote: " << - newChordNote-> - asShortString () << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "a rest cannot belong to a chord"); - } - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber); - - // should a chord be created? - if (! fOnGoingChord) { - // this is the second note of the chord to be created, - - // fetch the current tuplet, i.e. the top of the stack - S_msrTuplet currentTuplet; - - /* JMI - if (fTupletsStack.size ()) { - currentTuplet = - fTupletsStack.front (); - } - else { - stringstream s; - - s << - "handleNoteBelongingToAChordInATuplet():" << - endl << - " a tuplet member chord " << - "cannot be added, tuplets stack is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - */ - - currentTuplet = - fLastHandledTupletInVoiceMap [ - make_pair ( - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber) - ]; - - // remove and fetch tupletLastNote from the current tuplet, - // it will be the first chord member note - S_msrNote - tupletLastNote = - currentTuplet-> - removeLastNoteFromTuplet ( - inputLineNumber); - -/* JMI - S_msrNote - tupletLastNote = - // fVoicesLastMetNoteMap [currentVoice]; - fVoicesLastMetNoteMap [ - make_pair (fCurrentMusicXMLStaffNumber, fCurrentMusicXMLVoiceNumber) - ]; - - currentVoice-> - removeNoteFromVoice ( - inputLineNumber, - tupletLastNote); -*/ - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTupletsDetails) { - displayTupletsStack ( - "############## After removeLastNoteFromTuplet()"); - } -#endif - - // create the current chord from its first note - fCurrentChord = - createChordFromItsFirstNote ( - inputLineNumber, - currentVoice, - tupletLastNote, - msrNote::kChordMemberNote); - - if (false) { // JMI - fLogOutputStream << - endl << endl << - "&&&&&&&&&&&&&&&&&& currentVoice (" << - currentVoice->getVoiceName () << - ") contents &&&&&&&&&&&&&&&&&&" << - endl << - currentVoice << - endl << endl; - } - - // add chord to the current tuplet instead of tupletLastNote -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords || gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Adding chord '" << - fCurrentChord->asString () << - "' to stack top tuplet '" << - currentTuplet->asString () << - "', line " << inputLineNumber << - endl; - } -#endif - - currentTuplet-> - addChordToTuplet (fCurrentChord); - - if (fCurrentNoteSoundingWholeNotesFromDuration.getNumerator () == 0) { - // no duration has been found, - // determine sounding from display whole notes - newChordNote-> - determineTupletMemberSoundingFromDisplayWholeNotes ( - fCurrentNoteActualNotes, - fCurrentNoteNormalNotes); - } - - // account for a chord being built - fOnGoingChord = true; - } - - // register note as another member of chord -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Adding another note " << - newChordNote-> - asShortString () << - ", line " << inputLineNumber << - " to current chord in voice " << - currentVoice->getVoiceName () << - endl; - } -#endif - - fCurrentChord-> - addAnotherNoteToChord ( - newChordNote, currentVoice); - - // copy newChordNote's elements if any to the chord - copyNoteElementsToChord ( - newChordNote, fCurrentChord); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - printCurrentChord (); - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleNoteBelongingToAChordInAGraceNotesGroup ( - S_msrNote newChordNote) -{ - /* - The first note of a chord belonging to a tuplet - is marked in MusicXML as a tuplet member only, - it has already been appended to the voice in - handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest (), - and the following ones are marked as both a tuplet and a chord member - */ - - int inputLineNumber = - newChordNote->getInputLineNumber (); - - // set new note kind as a grace chord member - newChordNote-> - setNoteKind ( - msrNote::kGraceChordMemberNote); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords || gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "Handling a note belonging to a chord in grace notes" << - ", newChordNote is '" << - newChordNote-> - asShortString () << - "'" << - endl; - } -#endif - - if (fCurrentNoteIsARest) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "a rest cannot belong to a chord"); - } - - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, - fCurrentMusicXMLVoiceNumber); - - // should a chord be created? - if (! fOnGoingChord) { - // this is the second note of the chord to be created - - S_msrNote chordFirstNote; - - if (fPendingGraceNotesGroup) { - // the first note of the chord is currently the last one of fPendingGraceNotesGroup - chordFirstNote = - fPendingGraceNotesGroup-> - removeLastNoteFromGraceNotesGroup ( - inputLineNumber); - } - - else { - // the last handled note for the current voice - // is the first note of the chord - - // fetch last handled note for this voice - chordFirstNote = - currentVoice-> - getVoiceLastAppendedNote (); - - if (! chordFirstNote) { - stringstream s; - - s << - "handleNoteBelongingToAChordInGraceNotes():" << - endl << - "chordFirstNote is null on " << - newChordNote->asString (); - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords || gTraceOah->fTraceGraceNotes) { - fLogOutputStream << - "The grace notes chord's first note is '" << - chordFirstNote-> - asShortString () << - "'" << - endl; - } -#endif - - // set the first note's kind as grace chord member - chordFirstNote-> - setNoteKind ( - msrNote::kGraceChordMemberNote); - - // create the current chord from its first note - fCurrentChord = - createChordFromItsFirstNote ( - inputLineNumber, - currentVoice, - chordFirstNote, - msrNote::kGraceChordMemberNote); - - if (false) { - fLogOutputStream << - endl << endl << - "&&&&&&&&&&&&&&&&&& currentVoice (" << - currentVoice->getVoiceName () << - ") contents &&&&&&&&&&&&&&&&&&" << - endl << - currentVoice << - endl << - endl; - } - - if (fPendingGraceNotesGroup) { - // append current chord to pending grace notes - fPendingGraceNotesGroup-> - appendChordToGraceNotesGroup ( - fCurrentChord); - } - else { - // append current chord to pending voice JMI ??? - currentVoice-> - appendChordToVoice ( - fCurrentChord); - } - - - /* JMI - else { - stringstream s; - - s << - "handleNoteBelongingToAChordInGraceNotes():" << - endl << - "tuplet member chord " << chord->asString () << - "cannot be added, tuplets stack is empty"; - - msrInternalError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - */ - - // account for chord being built - fOnGoingChord = true; - } - - // register note as another member of chord -#ifdef TRACE_OAH - if (gTraceOah->fTraceChords) { - fLogOutputStream << - "Adding another note " << - newChordNote-> - asShortString () << - ", line " << inputLineNumber << - " to current chord in voice " << - currentVoice->getVoiceName () << - endl; - } -#endif - - fCurrentChord-> - addAnotherNoteToChord ( - newChordNote, currentVoice); - - // copy newChordNote's elements if any to the chord - copyNoteElementsToChord ( - newChordNote, fCurrentChord); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceChordsDetails) { - printCurrentChord (); - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleTupletsPendingOnTupletsStack ( - int inputLineNumber) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceTuplets) { - fLogOutputStream << - "Handling tuplets pending on tuplet stack" << - ", fCurrentStaffNumberToInsertInto = " << - fCurrentStaffNumberToInsertInto << - ", fCurrentMusicXMLStaffNumber = " << - fCurrentMusicXMLStaffNumber << - ", line: " << inputLineNumber << - endl; - } - - if (gTraceOah->fTraceTupletsDetails) { - displayTupletsStack ( - "############## Before handleTupletsPendingOnTupletsStack()"); - } -#endif - -/* superfluous JMI - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentStaffNumberToInsertInto, // JMI fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); -*/ - - // handle tuplets pending on the tuplet stack - while (fTupletsStack.size ()) { - S_msrTuplet - pendingTuplet = - fTupletsStack.front (); - - // finalize the tuplet, thus popping it off the stack - finalizeTupletAndPopItFromTupletsStack ( - inputLineNumber); - } // while - -#ifdef TRACE_OAH - if (gTraceOah->fTraceTupletsDetails) { - displayTupletsStack ( - "############## Before handleTupletsPendingOnTupletsStack()"); - } -#endif -} - -void mxmlTree2MsrTranslator::displayLastHandledTupletInVoiceMap (string header) -{ - fLogOutputStream << - endl << - header << - ", fLastHandledTupletInVoiceMap contains:"; - - if (! fLastHandledTupletInVoiceMap.size ()) { - fLogOutputStream << - " none" << - endl; - } - - else { - map, S_msrTuplet>::const_iterator - iBegin = fLastHandledTupletInVoiceMap.begin (), - iEnd = fLastHandledTupletInVoiceMap.end (), - i = iBegin; - - fLogOutputStream << endl; - - gIndenter++; - - for ( ; ; ) { - fLogOutputStream << - "staff " << (*i).first.first << - ", voice " << (*i).first.second << - endl; -// "\"" << (*i).first->getVoiceName () << -// "\" ----> " << (*i).second->asString () const; - if (++i == iEnd) break; - fLogOutputStream << endl; - } // for - - fLogOutputStream << endl; - - gIndenter--; - } - - fLogOutputStream << endl; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleRepeatStart ( - S_msrBarline& barline) -{ - int inputLineNumber = - barline->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling repeat start" << - /* JMI - ", measure '" << - barline->getBarlineMeasureNumber () << - "', position " << - barline->getBarlinePositionInMeasure () << - */ - ", line " << inputLineNumber << - endl; - } -#endif - - // remember repeat start measure number - fCurrentRepeatStartMeasureNumber = inputLineNumber; - - // prepare for repeat in current part - fCurrentPart-> - handleRepeatStartInPart ( - inputLineNumber); - - // append the bar line to the current part - fCurrentPart-> - appendBarlineToPart (barline); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleRepeatEnd ( - S_msrBarline& barline) -{ - int inputLineNumber = - barline->getInputLineNumber (); - - string repeatStartMeasureNumber = - fCurrentRepeatStartMeasureNumber.size () - ? // there was a repeat start before hand - fCurrentRepeatStartMeasureNumber - : // there is an implicit repeat start at the beginning of the part - fPartFirstMeasureNumber; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat end in part " << - fCurrentPart->getPartCombinedName () << - ", fCurrentMeasureNumber: \"" << fCurrentMeasureNumber << - "\", fCurrentRepeatStartMeasureNumber: \"" << fCurrentRepeatStartMeasureNumber << - "\", repeatStartMeasureNumber: \"" << repeatStartMeasureNumber << - "\", line " << inputLineNumber << - endl; - } -#endif - - // append the bar line to the current part - fCurrentPart-> - appendBarlineToPart (barline); - - fCurrentPart-> - handleRepeatEndInPart ( - inputLineNumber, - repeatStartMeasureNumber, - barline->getBarlineTimes ()); - - // forget about the current repeat start barline - fCurrentRepeatStartMeasureNumber = ""; - - fRepeatEndCounter++; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleRepeatEndingStart ( - S_msrBarline& barline) -{ - int inputLineNumber = - barline->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat ending start in part " << - fCurrentPart->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeatsDetails) { - fLogOutputStream << - endl << - endl << - "****************** handleRepeatEndingStart()" << - ", line " << inputLineNumber << - endl << - fCurrentPart << - endl; - } -#endif - - // handle the repeat ending -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat ending upon its start in part " << - fCurrentPart->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentPart-> - handleRepeatEndingStartInPart ( - inputLineNumber); - - // append the bar line to the current part - fCurrentPart-> - appendBarlineToPart (barline); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleRepeatHookedEndingEnd ( - S_msrBarline& barline) -{ - int inputLineNumber = - barline-> - getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat hooked ending end in part " << - fCurrentPart->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeatsDetails) { - fLogOutputStream << - endl << - endl << - "****************** handleRepeatHookedEndingEnd()" << - ", line " << inputLineNumber << - endl << - fCurrentPart << - endl; - } -#endif - - // append the bar line to the current part - fCurrentPart-> - appendBarlineToPart (barline); - - // create a hooked repeat ending from the current segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a hooked repeat ending in part " << - fCurrentPart->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentPart-> - handleRepeatEndingEndInPart ( - inputLineNumber, - fCurrentBarlineEndingNumber, - msrRepeatEnding::kHookedEnding); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::handleRepeatHooklessEndingEnd ( - S_msrBarline& barline) -{ - /* - The discontinue value is typically used for the last ending in a set, - where there is no downward hook to mark the end of an ending: - - - - - */ - - int inputLineNumber = - barline-> - getInputLineNumber (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a repeat hookless ending end in part " << - fCurrentPart->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeatsDetails) { - fLogOutputStream << - endl << - endl << - "****************** handleRepeatHooklessEndingEnd()" << - ", line " << inputLineNumber << - endl << - fCurrentPart << - endl; - } -#endif - - // append the bar line to the current part - fCurrentPart-> - appendBarlineToPart (barline); - - // create a hookless repeat ending from the current segment -#ifdef TRACE_OAH - if (gTraceOah->fTraceRepeats) { - fLogOutputStream << - "Handling a hookless repeat ending in part " << - fCurrentPart->getPartCombinedName () << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentPart-> - handleRepeatEndingEndInPart ( - inputLineNumber, - fCurrentBarlineEndingNumber, - msrRepeatEnding::kHooklessEnding); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_rehearsal& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_rehearsal" << - ", line " << inputLineNumber << - endl; - } -#endif - - string rehearsalValue = elt->getValue(); - - string rehearsalEnclosure = - elt->getAttributeValue ("enclosure"); - - msrRehearsal::msrRehearsalKind - rehearsalKind = - msrRehearsal::kNone; // default value - - if (rehearsalEnclosure == "none") { - rehearsalKind = msrRehearsal::kNone; - } - else if (rehearsalEnclosure == "rectangle") { - rehearsalKind = msrRehearsal::kRectangle; - } - else if (rehearsalEnclosure == "oval") { - rehearsalKind = msrRehearsal::kOval; - } - else if (rehearsalEnclosure == "circle") { - rehearsalKind = msrRehearsal::kCircle; - } - else if (rehearsalEnclosure == "bracket") { - rehearsalKind = msrRehearsal::kBracket; - } - else if (rehearsalEnclosure == "triangle") { - rehearsalKind = msrRehearsal::kTriangle; - } - else if (rehearsalEnclosure == "diamond") { - rehearsalKind = msrRehearsal::kDiamond; - } - else { - if (rehearsalEnclosure.size ()) { - stringstream s; - - s << - "rehearsal enclosure \"" << rehearsalEnclosure << - "\"" << " is not handled, ignored"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } - } - - // create a rehearsal -#ifdef TRACE_OAH - if (gTraceOah->fTraceRehearsals) { - fLogOutputStream << - "Creating rehearsal \"" << rehearsalValue << "\"" << - " in part " << - fCurrentPart->getPartCombinedName () << - endl; - } -#endif - - S_msrRehearsal - rehearsal = - msrRehearsal::create ( - inputLineNumber, - rehearsalKind, - rehearsalValue, - fCurrentDirectionPlacementKind); - - // append the rehearsal to the pending tempos list - fPendingRehearsalsList.push_back (rehearsal); -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_harmony& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_harmony" << - ", line " << inputLineNumber << - endl; - } -#endif - - fHarmonyVoicesCounter++; - - fCurrentHarmonyInputLineNumber = inputLineNumber; - fCurrentHarmonyRootDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentHarmonyRootAlterationKind = kNatural; - fCurrentHarmonyKind = k_NoHarmony; - fCurrentHarmonyKindText = ""; - fCurrentHarmonyInversion = K_HARMONY_NO_INVERSION; - fCurrentHarmonyBassDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentHarmonyBassAlterationKind = kNatural; - fCurrentHarmonyDegreeValue = -1; - fCurrentHarmonyDegreeAlterationKind = kNatural; - - fCurrentHarmonyWholeNotesOffset = rational (0, 1); - - fOnGoingHarmony = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_root_step& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_root_step" << - ", line " << inputLineNumber << - endl; - } -#endif - - string step = elt->getValue (); - - checkStep ( - inputLineNumber, - step); - - fCurrentHarmonyRootDiatonicPitchKind = - msrDiatonicPitchKindFromString ( - step [0]); -} - -void mxmlTree2MsrTranslator::visitStart ( S_root_alter& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_root_alter" << - ", line " << inputLineNumber << - endl; - } -#endif - - float rootAlter = (float)(*elt); - - fCurrentHarmonyRootAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - rootAlter); - - if (fCurrentHarmonyRootAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "root alter '" << rootAlter << "'" - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_kind& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_kind" << - ", line " << inputLineNumber << - endl; - } -#endif - - // harmony kind - // ---------------------------------- - - string kind = elt->getValue (); - - fCurrentHarmonyKindText = - elt->getAttributeValue ("text"); - - // check harmony kind - if (kind == "major") - fCurrentHarmonyKind = kMajorHarmony; - else if (kind == "minor") - fCurrentHarmonyKind = kMinorHarmony; - else if (kind == "augmented") - fCurrentHarmonyKind = kAugmentedHarmony; - else if (kind == "diminished") - fCurrentHarmonyKind = kDiminishedHarmony; - - else if (kind == "dominant") - fCurrentHarmonyKind = kDominantHarmony; - else if (kind == "major-seventh") - fCurrentHarmonyKind = kMajorSeventhHarmony; - else if (kind == "minor-seventh") - fCurrentHarmonyKind = kMinorSeventhHarmony; - else if (kind == "diminished-seventh") - fCurrentHarmonyKind = kDiminishedSeventhHarmony; - - else if (kind == "augmented-seventh") - fCurrentHarmonyKind = kAugmentedSeventhHarmony; - else if (kind == "half-diminished") - fCurrentHarmonyKind = kHalfDiminishedHarmony; - else if (kind == "major-minor") - fCurrentHarmonyKind = kMinorMajorSeventhHarmony; - - else if (kind == "major-sixth") - fCurrentHarmonyKind = kMajorSixthHarmony; - else if (kind == "minor-sixth") - fCurrentHarmonyKind = kMinorSixthHarmony; - - else if (kind == "dominant-ninth") - fCurrentHarmonyKind = kDominantNinthHarmony; - else if (kind == "major-ninth") - fCurrentHarmonyKind = kMajorNinthHarmony; - else if (kind == "minor-ninth") - fCurrentHarmonyKind = kMinorNinthHarmony; - - else if (kind == "dominant-11th") - fCurrentHarmonyKind = kDominantEleventhHarmony; - else if (kind == "major-11th") - fCurrentHarmonyKind = kMajorEleventhHarmony; - else if (kind == "minor-11th") - fCurrentHarmonyKind = kMinorEleventhHarmony; - - else if (kind == "dominant-13th") - fCurrentHarmonyKind = kDominantThirteenthHarmony; - else if (kind == "major-13th") - fCurrentHarmonyKind = kMajorThirteenthHarmony; - else if (kind == "minor-13th") - fCurrentHarmonyKind = kMinorThirteenthHarmony; - - else if (kind == "suspended-second") - fCurrentHarmonyKind = kSuspendedSecondHarmony; - else if (kind == "suspended-fourth") - fCurrentHarmonyKind = kSuspendedFourthHarmony; - - else if (kind == "Neapolitan") - fCurrentHarmonyKind = kNeapolitanHarmony; - else if (kind == "Italian") - fCurrentHarmonyKind = kItalianHarmony; - else if (kind == "French") - fCurrentHarmonyKind = kFrenchHarmony; - else if (kind == "German") - fCurrentHarmonyKind = kGermanHarmony; - - else if (kind == "pedal") - fCurrentHarmonyKind = kPedalHarmony; - else if (kind == "power") - fCurrentHarmonyKind = kPowerHarmony; - else if (kind == "Tristan") - fCurrentHarmonyKind = kTristanHarmony; - else if (kind == "other") - fCurrentHarmonyKind = kOtherHarmony; - else if (kind == "none") { - fCurrentHarmonyKind = kNoneHarmony; - } - - else { - if (kind.size ()) { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "harmony kind \"" + kind + "\" os unknown"); - } - else { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "empty harmony kind, replaced by 'major'"); - - fCurrentHarmonyKind = kMajorHarmony; - } - } - - // harmony use symbols - // ---------------------------------- - - string kindUseSymbols = elt->getAttributeValue ("use-symbols"); - -/* JMI - if (kindUseSymbols == "yes") - fCurrentTupletTypeKind = msrTuplet::kStartTuplet; // JMI - else if (kindUseSymbols == "no") - fCurrentTupletTypeKind = msrTuplet::kStopTuplet; - else { - if (kindUseSymbols.size ()) { - stringstream s; - - s << - "kind use-symbols \"" << kindUseSymbols << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } -*/ - - // harmony use stack degrees - // ---------------------------------- - - string kindStackDegrees = elt->getAttributeValue ("stack-degrees"); - -/* JMI - if (kindStackDegrees == "yes") - fCurrentTupletTypeKind = msrTuplet::kStartTuplet; // JMI - else if (kindStackDegrees == "no") - fCurrentTupletTypeKind = msrTuplet::kStopTuplet; - else { - if (kindStackDegrees.size ()) { - stringstream s; - - s << - "kind stack-degrees " << kindStackDegrees << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - */ - - // harmony use parentheses degrees - // ---------------------------------- - - string kindParenthesesDegrees = elt->getAttributeValue ("parentheses-degrees"); - -/* JMI - if (kindParenthesesDegrees == "yes") - fCurrentTupletTypeKind = msrTuplet::kStartTuplet; // JMI - else if (kindParenthesesDegrees == "no") - fCurrentTupletTypeKind = msrTuplet::kStopTuplet; - else { - if (kindParenthesesDegrees.size ()) { - stringstream s; - - s << - "kind parentheses-degrees \"" << kindParenthesesDegrees << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - */ - - // harmony use bracket degrees - // ------------------ - - string kindBracketDegrees = elt->getAttributeValue ("bracket-degrees"); - -/* JMI - if (kindBracketDegrees == "yes") - fCurrentTupletTypeKind = msrTuplet::kStartTuplet; // JMI - else if (kindBracketDegrees == "no") - fCurrentTupletTypeKind = msrTuplet::kStopTuplet; - else { - if (kindBracketDegrees.size ()) { - stringstream s; - - s << - "kind bracket-degrees \"" << kindBracketDegrees << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - */ -} - -void mxmlTree2MsrTranslator::visitStart ( S_inversion& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_inversion" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - Inversion is a number indicating which inversion is used: - 0 for root position, 1 for first inversion, etc. -*/ - - fCurrentHarmonyInversion = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_bass_step& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bass_step" << - ", line " << inputLineNumber << - endl; - } -#endif - - string step = elt->getValue(); - - checkStep ( - inputLineNumber, - step); - - fCurrentHarmonyBassDiatonicPitchKind = - msrDiatonicPitchKindFromString ( - step [0]); -} - -void mxmlTree2MsrTranslator::visitStart ( S_bass_alter& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_bass_alter" << - ", line " << inputLineNumber << - endl; - } -#endif - - float bassAlter = (float)(*elt); - - fCurrentHarmonyBassAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - bassAlter); - - if (fCurrentHarmonyBassAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "bass alter '" << bassAlter << "'" - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_degree& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_degree" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_degree_value& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_degree_value" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentHarmonyDegreeValue = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_degree_alter& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_degree_alter" << - ", line " << inputLineNumber << - endl; - } -#endif - - float degreeAlter = (float)(*elt); - - fCurrentHarmonyDegreeAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - degreeAlter); - - if (fCurrentHarmonyDegreeAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "degree alter '" << degreeAlter << "'" - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_degree_type& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_degree_type" << - ", line " << inputLineNumber << - endl; - } -#endif - - string degreeType = elt->getValue (); - - // check harmony degree type - if (degreeType == "add") - fCurrentHarmonyDegreeTypeKind = - msrHarmonyDegree::kHarmonyDegreeTypeAdd; - - else if (degreeType == "alter") - fCurrentHarmonyDegreeTypeKind = - msrHarmonyDegree::kHarmonyDegreeTypeAlter; - - else if (degreeType == "subtract") - fCurrentHarmonyDegreeTypeKind = - msrHarmonyDegree::kHarmonyDegreeTypeSubstract; - - else { - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - "harmony degree-type \"" + degreeType + "\" is unknown"); - } -} - -void mxmlTree2MsrTranslator::visitEnd ( S_degree& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_degree" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create harmony degree - S_msrHarmonyDegree - harmonyDegree = - msrHarmonyDegree::create ( - inputLineNumber, - fCurrentHarmonyDegreeValue, - fCurrentHarmonyDegreeAlterationKind, - fCurrentHarmonyDegreeTypeKind); - - // register it in current harmony degrees list - fCurrentHarmonyDegreesList.push_back ( - harmonyDegree); -} - -void mxmlTree2MsrTranslator::visitEnd ( S_harmony& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_harmony" << - ", line " << inputLineNumber << - endl; - } -#endif - - // convert root diatonic pitch to a quarter tone pitch - fCurrentHarmonyRootQuarterTonesPitchKind = - quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - inputLineNumber, - fCurrentHarmonyRootDiatonicPitchKind, - fCurrentHarmonyRootAlterationKind); - - // convert bass diatonic pitch to a quarter tone pitch - fCurrentHarmonyBassQuarterTonesPitchKind = - quarterTonesPitchKindFromDiatonicPitchAndAlteration ( - inputLineNumber, - fCurrentHarmonyBassDiatonicPitchKind, - fCurrentHarmonyBassAlterationKind); - - // check data consistency - if ( - fCurrentHarmonyKind == kOtherHarmony - && - fCurrentHarmonyDegreesList.size () == 0) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "harmony kind is 'other' but there are no harmony degrees, this is strange..."); - } - - if ( - fCurrentHarmonyRootQuarterTonesPitchKind - == - fCurrentHarmonyBassQuarterTonesPitchKind) { - stringstream s; - - s << - "harmony root and bass notes are both equal to '" << - msrDiatonicPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - diatonicPitchKindFromQuarterTonesPitchKind ( - inputLineNumber, - fCurrentHarmonyRootQuarterTonesPitchKind)) << - "', ignoring the latter"; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - - fCurrentHarmonyBassQuarterTonesPitchKind = - k_NoQuarterTonesPitch_QTP; - } - - if (gMsrOah->fOmitHarmonies) { - #ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Omitting harmony" << - ", line " << - inputLineNumber << - endl; - } -#endif - } - else { - // create the harmony -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - fLogOutputStream << - "Creating a harmony" << - ", line " << inputLineNumber << ":" << - endl; - - gIndenter++; - - const int fieldWidth = 32; - - fLogOutputStream << left << - setw (fieldWidth) << "fCurrentPart" << " = " << - fCurrentPart->getPartCombinedName () << - endl << - /* JMI - setw (fieldWidth) << "harmonyVoice" << " = " << - harmonyVoice->getVoiceName () << - endl << - */ - - setw (fieldWidth) << "fCurrentHarmonyRootDiatonicPitch" << " = " << - msrDiatonicPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fCurrentHarmonyRootDiatonicPitchKind) << - endl << - setw (fieldWidth) << "fCurrentHarmonyRootAlteration" << " = " << - msrAlterationKindAsString( - fCurrentHarmonyRootAlterationKind) << - endl << - - setw (fieldWidth) << "fCurrentHarmonyKind" << " = " << - msrHarmonyKindAsString ( - fCurrentHarmonyKind) << - endl << - setw (fieldWidth) << "fCurrentHarmonyKindText" << " = " << - fCurrentHarmonyKindText << - endl << - - setw (fieldWidth) << "fCurrentHarmonyInversion" << " = " << - fCurrentHarmonyInversion << - endl << - - setw (fieldWidth) << "fCurrentHarmonyBassDiatonicPitch" << " = " << - msrDiatonicPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fCurrentHarmonyBassDiatonicPitchKind) << - endl << - - setw (fieldWidth) << "fCurrentHarmonyBassAlteration" << " = " << - msrAlterationKindAsString( - fCurrentHarmonyBassAlterationKind) << - endl << - - setw (fieldWidth) << "fCurrentNoteSoundingWholeNotes" << " = " << - fCurrentNoteSoundingWholeNotes << - endl << - - setw (fieldWidth) << "fCurrentHarmonyStaffNumber" << " = " << - fCurrentHarmonyStaffNumber << - endl << - - setw (fieldWidth) << "fCurrentHarmonyWholeNotesOffset" << " = " << - fCurrentHarmonyWholeNotesOffset << - endl; - - gIndenter--; - } -#endif - - S_msrHarmony - harmony = - msrHarmony::createWithoutVoiceUplink ( - fCurrentHarmonyInputLineNumber, - // no harmonyVoiceUpLink yet - - fCurrentHarmonyRootQuarterTonesPitchKind, - - fCurrentHarmonyKind, - fCurrentHarmonyKindText, - - fCurrentHarmonyInversion, - - fCurrentHarmonyBassQuarterTonesPitchKind, - - rational (1, 1), // harmonySoundingWholeNotes, - // will be set upon next note handling - rational (1, 1), // harmonyDisplayWholeNotes, - // will be set upon next note handling - fCurrentHarmonyStaffNumber, - msrTupletFactor (1, 1), // will be set upon next note handling - fCurrentHarmonyWholeNotesOffset); - - // append pending harmony degrees if any to the harmony - if (! fCurrentHarmonyDegreesList.size ()) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarmonies) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "harmony has no degrees contents"); - } -#endif - } - - else { - while (fCurrentHarmonyDegreesList.size ()) { - S_msrHarmonyDegree - harmonyDegree = - fCurrentHarmonyDegreesList.front (); - - // set harmony degree harmony upLink - harmonyDegree-> - setHarmonyDegreeHarmonyUpLink ( - harmony); - - // append it to harmony's degrees list - harmony-> - appendHarmonyDegreeToHarmony ( - harmonyDegree); - - // remove it from the list - fCurrentHarmonyDegreesList.pop_front (); - } // while - } - - // append the harmony to the pending harmonies list - fPendingHarmoniesList.push_back (harmony); - } - - fOnGoingHarmony = false; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_frame& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_frame" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - - - C - - major - - 6 - 4 - - 6 - 0 - - - 5 - 3 - - - 4 - 2 - - - 3 - 0 - - - 2 - 1 - - - 1 - 0 - - - -*/ - - float degreeAlter = (float)(*elt); - - // alteration - - fCurrentHarmonyDegreeAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - degreeAlter); - - if (fCurrentHarmonyDegreeAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "degree alter '" << degreeAlter << "'" - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // color JMI - - fOnGoingFrame = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_frame_strings& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_frame_strings" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFrameStrings = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_frame_frets& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_frame_frets" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFrameFrets = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart ( S_first_fret& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_first_fret" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - 12 -*/ - - fCurrentFrameFirstFret = (int)(*elt); - - // the following two are not used yet JMI - string firstFretLocation = elt->getAttributeValue ("location"); - string firstFretText = elt->getAttributeValue ("text"); -} - -void mxmlTree2MsrTranslator::visitStart ( S_frame_note& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_frame_note" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentFrameNoteStringNumber = -1; - fCurrentFrameNoteFretNumber = -1; - fCurrentFrameNoteFingering = -1; - fCurrentFrameNoteBarreTypeKind = msrFrameNote::kBarreTypeNone; - - fOnGoingFrameNote = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_barre& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_barre" << - ", line " << inputLineNumber << - endl; - } -#endif - - // type - - string barreType = elt->getAttributeValue ("type"); - - fCurrentFrameNoteBarreTypeKind = msrFrameNote::kBarreTypeNone; - - if (barreType == "start") - fCurrentFrameNoteBarreTypeKind = msrFrameNote::kBarreTypeStart; - else if (barreType == "stop") - fCurrentFrameNoteBarreTypeKind = msrFrameNote::kBarreTypeStop; - else { - stringstream s; - - s << - "barre type \"" << barreType << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - - // color JMI -} - -void mxmlTree2MsrTranslator::visitEnd ( S_frame_note& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_frame_note" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the frame note - S_msrFrameNote - frameNote = - msrFrameNote::create ( - inputLineNumber, - fCurrentFrameNoteStringNumber, - fCurrentFrameNoteFretNumber, - fCurrentFrameNoteFingering, - fCurrentFrameNoteBarreTypeKind); - - // append the frame note to the pending frame notes list - fPendingFramesNotesList.push_back (frameNote); - - fOnGoingFrameNote = false; -} - -void mxmlTree2MsrTranslator::visitEnd ( S_frame& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_frame" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the frame - S_msrFrame - frame = - msrFrame::create ( - inputLineNumber, - fCurrentFrameStrings, - fCurrentFrameFrets, - fCurrentFrameFirstFret); - - // handling the current pending frame notes if any, - // so that they get attached to the note right now - if (fPendingFramesNotesList.size ()) { - while (fPendingFramesNotesList.size ()) { - S_msrFrameNote - frameNote = - fPendingFramesNotesList.front (); - - // append the frame note to the frame - frame-> - appendFrameNoteToFrame (frameNote); - - // remove it from the list - fPendingFramesNotesList.pop_front (); - } // while - } - - // append the frame to the pending frames list - fPendingFramesList.push_back (frame); - - fOnGoingFrame = false; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_figured_bass& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_figured_bass" << - ", line " << inputLineNumber << - endl; - } -#endif - - fFiguredBassVoicesCounter++; - - string parentheses = elt->getAttributeValue("parentheses"); - - fCurrentFiguredBassParenthesesKind = - msrFiguredBass::kFiguredBassParenthesesNo; // default value - - if (parentheses.size ()) { - if (parentheses == "yes") - fCurrentFiguredBassParenthesesKind = - msrFiguredBass::kFiguredBassParenthesesYes; - - else if (parentheses == "no") - fCurrentFiguredBassParenthesesKind = - msrFiguredBass::kFiguredBassParenthesesNo; - - else { - stringstream s; - - s << - "parentheses value " << parentheses << - " should be 'yes' or 'no'"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - } - - fCurrentFiguredBassInputLineNumber = -1; - - fCurrentFigureNumber = -1; - - fCurrentFigurePrefixKind = msrFigure::k_NoFigurePrefix; - fCurrentFigureSuffixKind = msrFigure::k_NoFigureSuffix; - - fCurrentFiguredBassSoundingWholeNotes = rational (0, 1); - fCurrentFiguredBassDisplayWholeNotes = rational (0, 1); - - fOnGoingFiguredBass = true; - // JMI fPendingFiguredBass = true; -} - -void mxmlTree2MsrTranslator::visitStart ( S_figure& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_figure" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart ( S_prefix& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_prefix" << - ", line " << inputLineNumber << - endl; - } -#endif - - string prefix = - elt->getValue (); - - fCurrentFigurePrefixKind = msrFigure::k_NoFigurePrefix; - - if (prefix == "double-flat") - fCurrentFigurePrefixKind = msrFigure::kDoubleFlatPrefix; - - else if (prefix == "flat") - fCurrentFigurePrefixKind = msrFigure::kFlatPrefix; - - else if (prefix == "flat-flat") - fCurrentFigurePrefixKind = msrFigure::kFlatFlatPrefix; - - else if (prefix == "natural") - fCurrentFigurePrefixKind = msrFigure::kNaturalPrefix; - - else if (prefix == "sharp-sharp") - fCurrentFigurePrefixKind = msrFigure::kSharpSharpPrefix; - - else if (prefix == "sharp") - fCurrentFigurePrefixKind = msrFigure::kSharpPrefix; - - else if (prefix == "double-sharp") - fCurrentFigurePrefixKind = msrFigure::kDoubleSharpPrefix; - - else if (prefix.size ()) { - stringstream s; - - s << - "prefix \"" << prefix << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } - -} - -void mxmlTree2MsrTranslator::visitStart ( S_figure_number& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_figure_number" << - ", line " << inputLineNumber << - endl; - } -#endif - - fCurrentFigureNumber = (int)(*elt); - - if (fCurrentFigureNumber > 13) { - stringstream s; - - s << - "figure-number '" << fCurrentFigureNumber << - "' is greater that 13, that's strange..."; - - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitStart ( S_suffix& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_suffix" << - ", line " << inputLineNumber << - endl; - } -#endif - - string suffix = - elt->getValue (); - - fCurrentFigureSuffixKind = msrFigure::k_NoFigureSuffix; - - if (suffix == "double-flat") - fCurrentFigureSuffixKind = msrFigure::kDoubleFlatSuffix; - - else if (suffix == "flat") - fCurrentFigureSuffixKind = msrFigure::kFlatSuffix; - - else if (suffix == "flat-flat") - fCurrentFigureSuffixKind = msrFigure::kFlatFlatSuffix; - - else if (suffix == "natural") - fCurrentFigureSuffixKind = msrFigure::kNaturalSuffix; - - else if (suffix == "sharp-sharp") - fCurrentFigureSuffixKind = msrFigure::kSharpSharpSuffix; - - else if (suffix == "sharp") - fCurrentFigureSuffixKind = msrFigure::kSharpSuffix; - - else if (suffix == "double-sharp") - fCurrentFigureSuffixKind = msrFigure::kDoubleSharpSuffix; - - else if (suffix == "slash") - fCurrentFigureSuffixKind = msrFigure::kSlashSuffix; - - else if (suffix.size ()) { - stringstream s; - - s << - "suffix \"" << suffix << - "\" is unknown"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitEnd ( S_figure& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_figure" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the figure - S_msrFigure - figure = - msrFigure::create ( - inputLineNumber, - fCurrentPart, - fCurrentFigurePrefixKind, - fCurrentFigureNumber, - fCurrentFigureSuffixKind); - - // append it to the pending figures list - fPendingFiguredBassFiguresList.push_back ( - figure); -} - -void mxmlTree2MsrTranslator::visitEnd ( S_figured_bass& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_figured_bass" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create the figured bass -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - fLogOutputStream << - "Creating a figured bass" << - ", line " << inputLineNumber << ":" << - endl; - } -#endif - - // create the figured bass - // if the sounding whole notes is 0/1 (no was found), JMI ??? - // it will be set to the next note's sounding whole notes later - S_msrFiguredBass - figuredBass = - msrFiguredBass::create ( - inputLineNumber, - // JMI fCurrentPart, - fCurrentFiguredBassSoundingWholeNotes, - fCurrentFiguredBassDisplayWholeNotes, - fCurrentFiguredBassParenthesesKind, - msrTupletFactor (1, 1)); // will be set upon next note handling - - // attach pending figures to the figured bass - if (! fPendingFiguredBassFiguresList.size ()) { - msrMusicXMLWarning ( - gOahOah->fInputSourceName, - inputLineNumber, - "figured-bass has no figures contents, ignoring it"); - } - else { - // append the pending figures to the figured bass - for ( - list::const_iterator i=fPendingFiguredBassFiguresList.begin (); - i!=fPendingFiguredBassFiguresList.end (); - i++ - ) { - figuredBass-> - appendFigureToFiguredBass ((*i)); - } // for - - // forget about those pending figures - fPendingFiguredBassFiguresList.clear (); - - // append the figured bass to the pending figured basses list - fPendingFiguredBassesList.push_back (figuredBass); - } - - fOnGoingFiguredBass = false; -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_harp_pedals& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_harp_pedals" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - - - - - - - - - - - - - - - - - D - 0 - - - C - -1 - - - B - -1 - - - E - 0 - - - F - 0 - - - G - 1 - - - A - -1 - - - - -*/ - - // create the harp pedals tuning -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarpPedalsTunings) { - fLogOutputStream << - "Creating harp pedals tuning:" << - endl; - } -#endif - - fCurrentHarpPedalsTuning = - msrHarpPedalsTuning::create ( - inputLineNumber); - - - // add it to the current part - fCurrentPart-> - appendHarpPedalsTuningToPart ( - fCurrentHarpPedalsTuning); -} - -void mxmlTree2MsrTranslator::visitStart (S_pedal_tuning& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pedal_tuning" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitStart (S_pedal_step& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pedal_step" << - ", line " << inputLineNumber << - endl; - } -#endif - - string tuningStep = elt->getValue(); - - checkStep ( - inputLineNumber, - tuningStep); - - fCurrentHarpPedalDiatonicPitchKind = - msrDiatonicPitchKindFromString ( - tuningStep [0]); -} - -void mxmlTree2MsrTranslator::visitStart (S_pedal_alter& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_pedal_alter" << - ", line " << inputLineNumber << - endl; - } -#endif - - float pedalAlter = (float)(*elt); - - fCurrentHarpPedalAlterationKind = - msrAlterationKindFromMusicXMLAlter ( - pedalAlter); - - if (fCurrentHarpPedalAlterationKind == k_NoAlteration) { - stringstream s; - - s << - "pedal alter '" << pedalAlter << "'" - "' should be -3, -2, -1.5, -1, -0.5, 0, +0.5, +1, +1.5, +2 or +3"; - - msrMusicXMLError ( - gOahOah->fInputSourceName, - inputLineNumber, - __FILE__, __LINE__, - s.str ()); - } -} - -void mxmlTree2MsrTranslator::visitEnd (S_pedal_tuning& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_pedal_tuning" << - ", line " << inputLineNumber << - endl; - } -#endif - - // create a harp pedals tuning -#ifdef TRACE_OAH - if (gTraceOah->fTraceHarpPedalsTunings) { - fLogOutputStream << - "Creating harp pedal tuning:" << - endl; - - gIndenter++; - - const int fieldWidth = 31; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentHarpPedalDiatonicPitch" << " = " << - msrDiatonicPitchKindAsString ( - gMsrOah->fMsrQuarterTonesPitchesLanguageKind, - fCurrentHarpPedalDiatonicPitchKind) << - endl << - setw (fieldWidth) << - "fCurrentHarpPedalAlteration" << " = " << - msrAlterationKindAsString ( - fCurrentHarpPedalAlterationKind) << - endl; - - gIndenter--; - } -#endif - - fCurrentHarpPedalsTuning-> - addPedalTuning ( - inputLineNumber, - fCurrentHarpPedalDiatonicPitchKind, - fCurrentHarpPedalAlterationKind); -} - -void mxmlTree2MsrTranslator::visitStart( S_damp& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_damp" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fOnGoingDirectionType) { - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // create the damp - S_msrDamp - damp = - msrDamp::create ( - inputLineNumber); - - // append it to the pending damps list - fPendingDampsList.push_back (damp); - } -} - -void mxmlTree2MsrTranslator::visitStart( S_damp_all& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_damp_all" << - ", line " << inputLineNumber << - endl; - } -#endif - - if (fOnGoingDirectionType) { - // fetch current voice - S_msrVoice - currentVoice = - fetchVoiceFromCurrentPart ( - inputLineNumber, - fCurrentMusicXMLStaffNumber, - fCurrentMusicXMLVoiceNumber); - - // create the damp all - S_msrDampAll - dampAll = - msrDampAll::create ( - inputLineNumber); - - // append it to the pending damp alls list - fPendingDampAllsList.push_back (dampAll); - } -} - -//________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_capo& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_capo" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentStaffDetailsCapo = (int)(*elt); -} - -void mxmlTree2MsrTranslator::visitStart (S_staff_size& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_staff_size" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - fCurrentStaffDetailsStaffSize = (int)(*elt); - // JMI not used -} - -void mxmlTree2MsrTranslator::visitEnd (S_staff_details& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_staff_details" << - ", line " << inputLineNumber << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceStaves) { - const int fieldWidth = 29; - - fLogOutputStream << left << - setw (fieldWidth) << - "fCurrentStaffLinesNumber" << " = " << - fCurrentStaffLinesNumber << - endl << - setw (fieldWidth) << - "fStaffDetailsStaffNumber" << " = " << - fStaffDetailsStaffNumber << - endl << - setw (fieldWidth) << - "fCurrentStaffDetailsCapo" << " = " << - fCurrentStaffDetailsCapo << - endl << - setw (fieldWidth) << - "fCurrentStaffDetailsStaffSize" << " = " << - fCurrentStaffDetailsStaffSize << - endl; - } -#endif - - gIndenter--; - - // set staff details line number - fCurrentStaffDetails-> - setStaffLinesNumber ( - fCurrentStaffLinesNumber); - - // append staff details in part or staff - if (fStaffDetailsStaffNumber == 0) - fCurrentPart-> - appendStaffDetailsToPart ( - fCurrentStaffDetails); - - else { - S_msrStaff - staff = - fetchStaffFromCurrentPart ( - inputLineNumber, - fStaffDetailsStaffNumber); - - staff-> - appendStaffDetailsToStaff ( - fCurrentStaffDetails); - } - - // forget about this staff details - fCurrentStaffDetails = nullptr; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart (S_scordatura& elt ) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_scordatura" << - ", line " << inputLineNumber << - endl; - } -#endif - -/* - - - - - C - 3 - - - G - 5 - - - E< - tuning-octave>5 - - - - -*/ - - fCurrentScordatura = - msrScordatura::create ( - inputLineNumber); -} - -void mxmlTree2MsrTranslator::visitStart (S_accord& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_accord" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - - C - 3 - -*/ - - fCurrentStringTuningNumber = elt->getAttributeIntValue ("string", 0); - - fCurrentStringTuningDiatonicPitchKind = k_NoDiatonicPitch; - fCurrentStringTuningAlterationKind = kNatural; // default value - fCurrentStringTuningOctave = -1; - - fOnGoingAccord = true; -} - -void mxmlTree2MsrTranslator::visitEnd (S_accord& elt) -{ - int inputLineNumber = - elt->getInputLineNumber (); - -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_accord" << - ", line " << inputLineNumber << - endl; - } -#endif - - S_msrStringTuning - stringTuning = - msrStringTuning::create ( - inputLineNumber, - fCurrentStringTuningNumber, - fCurrentStringTuningDiatonicPitchKind, - fCurrentStringTuningAlterationKind, - fCurrentStringTuningOctave); - - fCurrentScordatura-> - addStringTuningToScordatura ( - stringTuning); -} - -void mxmlTree2MsrTranslator::visitEnd (S_scordatura& elt) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_scordatura" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - - // append the current scordatura to the pending scordatura list - fPendingScordaturasList.push_back (fCurrentScordatura); - - // forget about this scordatura - fCurrentScordatura = nullptr; -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_sound& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_sound" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -void mxmlTree2MsrTranslator::visitEnd ( S_sound& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> End visiting S_sound" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_instrument_sound& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_instrument_sound" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_virtual_instrument& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_virtual_instrument" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_midi_device& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_midi_device" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - SmartMusic SoftSynth -*/ -} - -//______________________________________________________________________________ -void mxmlTree2MsrTranslator::visitStart ( S_midi_instrument& elt ) -{ -#ifdef TRACE_OAH - if (gMusicXMLOah->fTraceMusicXMLTreeVisitors) { - fLogOutputStream << - "--> Start visiting S_midi_instrument" << - ", line " << elt->getInputLineNumber () << - endl; - } -#endif - -/* - - 2 - 70 - 80 - 4 - -*/ -} - - -} // namespace - - -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceFiguredBasses) { - fLogOutputStream << - "--> figured bass" << - ", line " << inputLineNumber << ":" << - endl; - - gIndenter++; - - const int fieldWidth = 31; - - fLogOutputStream << left << - setw (fieldWidth) << "fCurrentPart" << " = " << - fCurrentPart->getPartCombinedName () << - endl << - setw (fieldWidth) << "fCurrentFiguredBassSoundingWholeNotes" << " = " << - fCurrentFiguredBassSoundingWholeNotes << - endl; - - gIndenter--; - } -#endif - - if (fCurrentFiguredBassSoundingWholeNotes.getNumerator () == 0) { - // no duration has been found, - // use the note's sounding whole notes - fCurrentFiguredBassSoundingWholeNotes = - fCurrentNoteSoundingWholeNotes; - } - - // create the figured bass - // if the sounding whole notes is 0/1 (no was found), - // it will be set to the next note's sounding whole notes later - S_msrFiguredBass - figuredBass = - msrFiguredBass::create ( - inputLineNumber, - fCurrentPart, - fCurrentFiguredBassSoundingWholeNotes, - fCurrentFiguredBassParenthesesKind); - - // attach pending figures to the figured bass - if (fPendingFiguredBassFiguresList.size ()) { - for ( - list::const_iterator i=fPendingFiguredBassFiguresList.begin (); - i!=fPendingFiguredBassFiguresList.end (); - i++ - ) { - figuredBass-> - appendFigureToFiguredBass ((*i)); - } // for - - fPendingFiguredBassFiguresList.clear (); - } - - // append the figured bass to the current part - fCurrentPart-> - appendFiguredBassToPart ( - voiceToInsertInto, - figuredBass); - */ - -/* -group-symbol -group-barline -part-symbol -// color JMI - - -*/ - -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { // JMI - const int fieldWidth = 27; - - fLogOutputStream << left << - endl << - "==> AFTER visitEnd (S_note&) " << - newNote->asString () << - ", line " << inputLineNumber << - " we have:" << - endl << - setw (fieldWidth) << - "--> fCurrentMusicXMLStaffNumber" << " = " << - fCurrentMusicXMLStaffNumber << - endl << - setw (fieldWidth) << - "--> fCurrentMusicXMLVoiceNumber" << " = " << - fCurrentMusicXMLVoiceNumber << - endl << - setw (fieldWidth) << - "--> current voice" << " = \"" << - currentVoice->getVoiceName () << "\"" << - endl << - "<==" << - endl << - endl; - } -#endif -*/ - -/* JMI -#ifdef TRACE_OAH - if (gTraceOah->fTraceNotes) { // JMI - fLogOutputStream << - endl << - "==> BEFORE visitEnd (S_note&)" << - ", line " << inputLineNumber << - " we have:" << - endl; - - gIndenter++; - - const int fieldWidth = 27; - - fLogOutputStream << left << - setw (fieldWidth) << "--> fCurrentMusicXMLStaffNumber" << " = " << - fCurrentMusicXMLStaffNumber << - endl << - setw (fieldWidth) << "--> fCurrentMusicXMLVoiceNumber" << " = " << - fCurrentMusicXMLVoiceNumber << - endl << - setw (fieldWidth) << "--> current voice" << " = \"" << - currentVoice->getVoiceName () << "\"" << - endl; - - gIndenter--; - - fLogOutputStream << - "<==" << - endl << - * endl; - } -#endif -*/ - - /* JMI -Repeats and endings are represented by the and elements with a , as defined in the barline.mod file. - -In regular measures, there is no need to include the element. It is only need to represent repeats, endings, and graphical styles such as double barlines. - -A forward repeat mark is represented by a left barline at the beginning of the measure (following the attributes element, if there is one): - - - heavy-light - - - -The repeat element is what is used for sound generation; the bar-style element only indicates graphic appearance. - -Similarly, a backward repeat mark is represented by a right barline at the end of the measure: - - - light-heavy - - - -While repeats can have forward or backward direction, endings can have three different type attributes: start, stop, and discontinue. The start value is used at the beginning of an ending, at the beginning of a measure. A typical first ending starts like this: - - - - - -The stop value is used when the end of the ending is marked with a downward hook, as is typical for a first ending. It is usually used together with a backward repeat at the end of a measure: - - - light-heavy - - - - -The discontinue value is typically used for the last ending in a set, where there is no downward hook to mark the end of an ending: - - - - - - */ - diff --git a/src/lilypond/mxmlTree2MsrTranslator.h b/src/lilypond/mxmlTree2MsrTranslator.h deleted file mode 100644 index 7d70cd1cc..000000000 --- a/src/lilypond/mxmlTree2MsrTranslator.h +++ /dev/null @@ -1,1991 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___mxmlTree2MsrTranslator___ -#define ___mxmlTree2MsrTranslator___ - -#include "msr.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class mxmlTree2MsrTranslator : - - // score partwise - - public visitor, - - // parts - - public visitor, - - // ??? - - public visitor, - - public visitor, - - public visitor, - public visitor, - - // staff details - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // ??? - - public visitor, - - // backup & forward - - public visitor, - public visitor, - - // clefs - - public visitor, - public visitor, - public visitor, - public visitor, - - // keys - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // times - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - - // ??? - - public visitor, - - // transpose - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // directions - - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - - public visitor, - public visitor, - - // tempo - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // ties, slurs, brackets & beams - - public visitor, - public visitor, - public visitor, - public visitor, - - // lyrics - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // harmonies - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // frames - // ------------------------------------------------------ - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // figured bass - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // measures - - public visitor, - public visitor, - public visitor, - public visitor, - - // ??? - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // notes - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - - // note heads - - public visitor, - public visitor, - public visitor, - - // repeats - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // articulations - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // technicals - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // ornaments - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // tremolos - - public visitor, - - // dynamics - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - public visitor, - - public visitor, - - public visitor, - - // cue notes - - public visitor, - - // grace notes - - public visitor, - - // chords - - public visitor, - - // times - - public visitor, - public visitor, - public visitor, - public visitor, - - // tuplets - - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - public visitor, - - // glissandos - - public visitor, - - // slides - - public visitor, - - // rehearsals - - public visitor, - - // accordion registration - - public visitor, - public visitor, - public visitor, - public visitor, - - // harp pedals tuning - - public visitor, - public visitor, - public visitor, - public visitor, - - public visitor, - public visitor, - - // sound - - public visitor, - - // midi - - public visitor, - public visitor, - public visitor, - public visitor - -{ - public: - - // constructors/destructor - // ------------------------------------------------------ - - mxmlTree2MsrTranslator ( - S_msrScore scoreSkeleton, - indentedOstream& ios); - - virtual ~mxmlTree2MsrTranslator (); - - // set and get - // ------------------------------------------------------ - - S_msrScore getMsrScore () const - { return fMsrScore; } - - // services - // ------------------------------------------------------ - - void populateMsrSkeletonFromMxmlTree ( - const Sxmlelement mxmlTree); - - // visitors - // ------------------------------------------------------ - - void browseMxmlTree ( - const Sxmlelement& mxmlTree); - - protected: - - // parts - // ------------------------------------------------------ - - virtual void visitStart ( S_part& elt); - virtual void visitEnd ( S_part& elt); - - // ??? - // ------------------------------------------------------ - - virtual void visitStart ( S_attributes& elt); - virtual void visitEnd ( S_attributes& elt); - - virtual void visitStart ( S_divisions& elt); - - // staves - // ------------------------------------------------------ - - virtual void visitStart ( S_staves& elt); - - virtual void visitStart ( S_staff& elt); - - // staff details - // ------------------------------------------------------ - - virtual void visitStart ( S_staff_details& elt); - virtual void visitEnd ( S_staff_details& elt); - virtual void visitStart ( S_staff_type& elt); - virtual void visitStart ( S_staff_lines& elt); - virtual void visitStart ( S_staff_tuning& elt); - virtual void visitEnd ( S_staff_tuning& elt); - virtual void visitStart ( S_tuning_step& elt); - virtual void visitStart ( S_tuning_octave& elt); - virtual void visitStart ( S_tuning_alter& elt); - virtual void visitStart ( S_capo& elt); - virtual void visitStart ( S_staff_size& elt); - - // ??? - // ------------------------------------------------------ - - virtual void visitStart ( S_voice& elt ); - - // backup & forward - // ------------------------------------------------------ - - virtual void visitStart ( S_backup& elt ); - virtual void visitEnd ( S_backup& elt ); - virtual void visitStart ( S_forward& elt ); - virtual void visitEnd ( S_forward& elt ); - - // clefs - // ------------------------------------------------------ - - virtual void visitStart ( S_clef& elt ); - virtual void visitEnd ( S_clef& elt ); - virtual void visitStart ( S_sign& elt ); - virtual void visitStart ( S_line& elt ); - virtual void visitStart ( S_clef_octave_change& elt ); - - // keys - // ------------------------------------------------------ - - virtual void visitStart ( S_key& elt ); - virtual void visitEnd ( S_key& elt ); - virtual void visitStart ( S_cancel& elt ); - virtual void visitStart ( S_fifths& elt ); - virtual void visitStart ( S_mode& elt ); - virtual void visitStart ( S_key_step& elt ); - virtual void visitStart ( S_key_alter& elt ); - virtual void visitStart ( S_key_octave& elt ); - - // times - // ------------------------------------------------------ - - virtual void visitStart ( S_time& elt ); - virtual void visitEnd ( S_time& elt ); - virtual void visitStart ( S_beats& elt ); - virtual void visitStart ( S_beat_type& elt ); - virtual void visitStart ( S_senza_misura& elt ); - - virtual void visitStart ( S_interchangeable& elt ); - virtual void visitStart ( S_time_relation& elt ); - - // ??? - // ------------------------------------------------------ - - virtual void visitStart ( S_instruments& elt ); - - // transpose - // ------------------------------------------------------ - - virtual void visitStart ( S_transpose& elt ); - virtual void visitEnd ( S_transpose& elt ); - virtual void visitStart ( S_diatonic& elt ); - virtual void visitStart ( S_chromatic& elt ); - virtual void visitStart ( S_octave_change& elt ); - virtual void visitStart ( S_double& elt ); - - // directions - // ------------------------------------------------------ - - virtual void visitStart ( S_direction& elt ); - virtual void visitEnd ( S_direction& elt ); - virtual void visitStart ( S_direction_type& elt ); - virtual void visitEnd ( S_direction_type& elt ); - virtual void visitStart ( S_offset& elt ); - - virtual void visitStart ( S_words& elt ); - - virtual void visitStart ( S_octave_shift& elt ); - - virtual void visitStart ( S_scordatura& elt ); - virtual void visitEnd ( S_scordatura& elt ); - virtual void visitStart ( S_accord& elt ); - virtual void visitEnd ( S_accord& elt ); - - // accordion registration - // ------------------------------------------------------ - - virtual void visitStart ( S_accordion_registration& elt ); - virtual void visitEnd ( S_accordion_registration& elt ); - virtual void visitStart ( S_accordion_high& elt ); - virtual void visitStart ( S_accordion_middle& elt ); - virtual void visitStart ( S_accordion_low& elt ); - - // tempo - // ------------------------------------------------------ - - virtual void visitStart ( S_metronome& elt ); - virtual void visitEnd ( S_metronome& elt ); - virtual void visitStart ( S_beat_unit& elt ); - virtual void visitStart ( S_beat_unit_dot& elt ); - virtual void visitStart ( S_per_minute& elt ); - virtual void visitStart ( S_metronome_note& elt ); - virtual void visitEnd ( S_metronome_note& elt ); - virtual void visitStart ( S_metronome_relation& elt ); - virtual void visitStart ( S_metronome_type& elt ); - virtual void visitStart ( S_metronome_beam& elt ); - virtual void visitStart ( S_metronome_dot& elt ); - virtual void visitStart ( S_metronome_tuplet& elt ); - virtual void visitEnd ( S_metronome_tuplet& elt ); - virtual void visitStart ( S_normal_dot& elt ); - - // ties, slurs, brackets & beams - // ------------------------------------------------------ - - virtual void visitStart ( S_tied& elt); - virtual void visitStart ( S_slur& elt); - virtual void visitStart ( S_bracket& elt); - virtual void visitStart ( S_beam& elt); - - // lyrics - // ------------------------------------------------------ - - virtual void visitStart ( S_lyric& elt); - virtual void visitEnd ( S_lyric& elt); - virtual void visitStart ( S_syllabic& elt); - virtual void visitStart ( S_text& elt ); - virtual void visitStart ( S_elision& elt ); - virtual void visitStart ( S_extend& elt); - - // ??? - // ------------------------------------------------------ - - virtual void visitStart ( S_degree& elt); - virtual void visitEnd ( S_degree& elt); - virtual void visitStart ( S_degree_value& elt); - virtual void visitStart ( S_degree_alter& elt); - virtual void visitStart ( S_degree_type& elt); - - // harmonies - // ------------------------------------------------------ - - virtual void visitStart ( S_harmony& elt); - virtual void visitEnd ( S_harmony& elt); - virtual void visitStart ( S_root_step& elt); - virtual void visitStart ( S_root_alter& elt); - virtual void visitStart ( S_kind& elt); - virtual void visitStart ( S_inversion& elt); - virtual void visitStart ( S_bass_step& elt); - virtual void visitStart ( S_bass_alter& elt); - - // frames - // ------------------------------------------------------ - - virtual void visitStart ( S_frame& elt); - virtual void visitEnd ( S_frame& elt); - virtual void visitStart ( S_frame_strings& elt); - virtual void visitStart ( S_frame_frets& elt); - virtual void visitStart ( S_first_fret& elt); - virtual void visitStart ( S_frame_note& elt); - virtual void visitEnd ( S_frame_note& elt); - virtual void visitStart ( S_barre& elt); - - // figured bass - // ------------------------------------------------------ - - virtual void visitStart ( S_figured_bass& elt); - virtual void visitEnd ( S_figured_bass& elt); - virtual void visitStart ( S_figure& elt); - virtual void visitEnd ( S_figure& elt); - virtual void visitStart ( S_prefix& elt); - virtual void visitStart ( S_figure_number& elt); - virtual void visitStart ( S_suffix& elt); - - // measures - // ------------------------------------------------------ - - virtual void visitStart ( S_measure& elt); - virtual void visitEnd ( S_measure& elt); - - // print - // ------------------------------------------------------ - - virtual void visitStart ( S_print& elt); - virtual void visitEnd ( S_print& elt); - - virtual void visitStart ( S_system_layout& elt); - virtual void visitStart ( S_measure_numbering& elt); - - virtual void visitStart ( S_barline& elt); - virtual void visitStart ( S_segno& elt); - virtual void visitStart ( S_coda& elt); - virtual void visitStart ( S_eyeglasses& elt); - virtual void visitStart ( S_pedal& elt); - virtual void visitStart ( S_bar_style& elt); - virtual void visitStart ( S_repeat& elt); - virtual void visitStart ( S_ending& elt); - virtual void visitEnd ( S_barline& elt); - - // notes - // ------------------------------------------------------ - - virtual void visitStart ( S_note& elt); - virtual void visitStart ( S_step& elt); - virtual void visitStart ( S_alter& elt); - virtual void visitStart ( S_octave& elt); - virtual void visitStart ( S_duration& elt); - virtual void visitStart ( S_instrument& elt); - virtual void visitStart ( S_dot& elt ); - - // repeats - // ------------------------------------------------------ - - virtual void visitStart ( S_measure_style& elt ); - virtual void visitStart ( S_beat_repeat& elt ); - virtual void visitStart ( S_measure_repeat& elt ); - virtual void visitStart ( S_multiple_rest& elt ); - virtual void visitStart ( S_slash& elt ); - virtual void visitEnd ( S_slash& elt ); - virtual void visitStart ( S_slash_type& elt ); - virtual void visitStart ( S_slash_dot& elt ); - - // atticulations - // ------------------------------------------------------ - - virtual void visitStart ( S_articulations& elt ); - virtual void visitEnd ( S_articulations& elt ); - virtual void visitStart ( S_accent& elt ); - virtual void visitStart ( S_breath_mark& elt ); - virtual void visitStart ( S_caesura& elt ); - virtual void visitStart ( S_spiccato& elt ); - virtual void visitStart ( S_staccato& elt ); - virtual void visitStart ( S_staccatissimo& elt ); - virtual void visitStart ( S_stress& elt ); - virtual void visitStart ( S_unstress& elt ); - virtual void visitStart ( S_detached_legato& elt ); - virtual void visitStart ( S_strong_accent& elt ); - virtual void visitStart ( S_tenuto& elt ); - virtual void visitStart ( S_fermata& elt ); - virtual void visitStart ( S_arpeggiate& elt ); - virtual void visitStart ( S_non_arpeggiate& elt ); - virtual void visitStart ( S_doit& elt ); - virtual void visitStart ( S_falloff& elt ); - virtual void visitStart ( S_plop& elt ); - virtual void visitStart ( S_scoop& elt ); - - // technicals - // ------------------------------------------------------ - - virtual void visitStart ( S_technical& elt ); - virtual void visitEnd ( S_technical& elt ); - virtual void visitStart ( S_arrow& elt ); - virtual void visitStart ( S_bend& elt ); - virtual void visitEnd ( S_bend& elt ); - virtual void visitStart ( S_bend_alter& elt ); - virtual void visitStart ( S_double_tongue& elt ); - virtual void visitStart ( S_down_bow& elt ); - virtual void visitStart ( S_fingering& elt ); - virtual void visitStart ( S_fingernails& elt ); - virtual void visitStart ( S_fret& elt ); - virtual void visitStart ( S_hammer_on& elt ); - virtual void visitStart ( S_handbell& elt ); - virtual void visitStart ( S_harmonic& elt ); - virtual void visitStart ( S_heel& elt ); - virtual void visitStart ( S_hole& elt ); - virtual void visitStart ( S_open_string& elt ); - virtual void visitStart ( S_other_technical& elt ); - virtual void visitStart ( S_pluck& elt ); - virtual void visitStart ( S_pull_off& elt ); - virtual void visitStart ( S_snap_pizzicato& elt ); - virtual void visitStart ( S_stopped& elt ); - virtual void visitStart ( S_string& elt ); - virtual void visitStart ( S_tap& elt ); - virtual void visitStart ( S_thumb_position& elt ); - virtual void visitStart ( S_toe& elt ); - virtual void visitStart ( S_triple_tongue& elt ); - virtual void visitStart ( S_up_bow& elt ); - - // ornaments - // ------------------------------------------------------ - - virtual void visitStart ( S_ornaments& elt ); - virtual void visitEnd ( S_ornaments& elt ); - virtual void visitStart ( S_trill_mark& elt ); - virtual void visitStart ( S_dashes& elt ); - virtual void visitStart ( S_wavy_line& elt ); - virtual void visitStart ( S_turn& elt ); - virtual void visitStart ( S_inverted_turn& elt ); - virtual void visitStart ( S_delayed_turn& elt ); - virtual void visitStart ( S_delayed_inverted_turn& elt ); - virtual void visitStart ( S_vertical_turn& elt ); - virtual void visitStart ( S_mordent& elt ); - virtual void visitStart ( S_inverted_mordent& elt ); - virtual void visitStart ( S_schleifer& elt ); - virtual void visitStart ( S_shake& elt ); - virtual void visitStart ( S_accidental_mark& elt ); - - // tremolos - // ------------------------------------------------------ - - virtual void visitStart ( S_tremolo& elt ); - - // dynamics - // ------------------------------------------------------ - - virtual void visitStart ( S_f& elt); - virtual void visitStart ( S_ff& elt); - virtual void visitStart ( S_fff& elt); - virtual void visitStart ( S_ffff& elt); - virtual void visitStart ( S_fffff& elt); - virtual void visitStart ( S_ffffff& elt); - - virtual void visitStart ( S_p& elt); - virtual void visitStart ( S_pp& elt); - virtual void visitStart ( S_ppp& elt); - virtual void visitStart ( S_pppp& elt); - virtual void visitStart ( S_ppppp& elt); - virtual void visitStart ( S_pppppp& elt); - - virtual void visitStart ( S_mf& elt); - virtual void visitStart ( S_mp& elt); - virtual void visitStart ( S_fp& elt); - virtual void visitStart ( S_fz& elt); - - virtual void visitStart ( S_rf& elt); - virtual void visitStart ( S_sf& elt); - virtual void visitStart ( S_rfz& elt); - virtual void visitStart ( S_sfz& elt); - - virtual void visitStart ( S_sfp& elt); - virtual void visitStart ( S_sfpp& elt); - virtual void visitStart ( S_sffz& elt); - - virtual void visitStart ( S_other_dynamics& elt); - - virtual void visitStart ( S_wedge& elt); - - // harp pedals tuning - // ------------------------------------------------------ - - virtual void visitStart ( S_harp_pedals& elt); - virtual void visitStart ( S_pedal_tuning& elt); - virtual void visitEnd ( S_pedal_tuning& elt); - virtual void visitStart ( S_pedal_step& elt); - virtual void visitStart ( S_pedal_alter& elt); - - virtual void visitStart ( S_damp& elt); - virtual void visitStart ( S_damp_all& elt); - - // cue notes - // ------------------------------------------------------ - - virtual void visitStart ( S_cue& elt ); - - // grace notes - // ------------------------------------------------------ - - virtual void visitStart ( S_grace& elt ); - - // ??? - // ------------------------------------------------------ - - virtual void visitStart ( S_type& elt); - - // note heads - // ------------------------------------------------------ - - virtual void visitStart ( S_notehead& elt); - - - // notes - // ------------------------------------------------------ - - virtual void visitStart ( S_accidental& elt); - - virtual void visitStart ( S_stem& elt); - - virtual void visitEnd ( S_note& elt); - - virtual void visitStart ( S_rest& elt); - - virtual void visitEnd ( S_unpitched& elt); - virtual void visitStart ( S_display_step& elt); - virtual void visitStart ( S_display_octave& elt); - - // chords - // ------------------------------------------------------ - - virtual void visitStart ( S_chord& elt); - - // time - // ------------------------------------------------------ - - virtual void visitStart ( S_time_modification& elt); - virtual void visitStart ( S_actual_notes& elt); - virtual void visitStart ( S_normal_notes& elt); - virtual void visitStart ( S_normal_type& elt); - - // tuplets - // ------------------------------------------------------ - - virtual void visitStart ( S_tuplet& elt); - virtual void visitStart ( S_tuplet_actual& elt); - virtual void visitEnd ( S_tuplet_actual& elt); - virtual void visitStart ( S_tuplet_normal& elt); - virtual void visitEnd ( S_tuplet_normal& elt); - virtual void visitStart ( S_tuplet_number& elt); - virtual void visitStart ( S_tuplet_type& elt); - virtual void visitStart ( S_tuplet_dot& elt); - - // glissandos - // ------------------------------------------------------ - - virtual void visitStart ( S_glissando& elt); - - // slides - // ------------------------------------------------------ - - virtual void visitStart ( S_slide& elt); - - // rehearsals - // ------------------------------------------------------ - - virtual void visitStart ( S_rehearsal& elt); - - // sound & MIDI - // ------------------------------------------------------ - - virtual void visitStart ( S_sound& elt); - virtual void visitEnd ( S_sound& elt); - - virtual void visitStart ( S_instrument_sound& elt); - virtual void visitStart ( S_virtual_instrument& elt); - virtual void visitStart ( S_midi_device& elt); - virtual void visitStart ( S_midi_instrument& elt); - - private: - - - // the MSR score we are populating - // ------------------------------------------------------ - - S_msrScore fMsrScore; - - // the log output stream - // ------------------------------------------------------ - - indentedOstream& fLogOutputStream; - - // divisions per quarter note - // ------------------------------------------------------ - - int fCurrentDivisionsPerQuarterNote; - S_msrDivisions fCurrentDivisions; - - // print - // ------------------------------------------------------ - - string fCurrentDisplayText; - bool fOnGoingPrint; - - // part handling - // ------------------------------------------------------ - - S_msrPart fCurrentPart; - - // measures - // ------------------------------------------------------ - - // we need to count the measures for option fSeparatorLineEveryNMeasures, - // since measure numbers are actually strings - - int fPartMeasuresCounter; - string fScoreFirstMeasureNumber; - string fPartFirstMeasureNumber; - string fCurrentMeasureNumber; - - // measure style handling - // ------------------------------------------------------ - - msrSlashTypeKind fCurrentSlashTypeKind; - msrUseDotsKind fCurrentUseDotsKind; - msrSlashUseStemsKind fCurrentSlashUseStemsKind; - - msrDurationKind fCurrentSlashGraphicDurationKind; - int fCurrentSlashDotsNumber; - - // beats repeats - int fCurrentBeatRepeatSlashes; - - // rest measures - int fCurrentRestMeasuresMeasuresNumber; - int fRemainingRestMeasuresMeasuresNumber; - bool fOnGoingRestMeasures; - bool fCurrentRestMeasuresHasBeenCreated; - - // measures repeats - msrMeasuresRepeat::msrMeasuresRepeatKind - fCurrentMeasuresRepeatKind; - int fCurrentMeasuresRepeatMeasuresNumber; - int fCurrentMeasuresRepeatSlashesNumber; - - // staff details handling - // ------------------------------------------------------ - - msrStaffDetails::msrStaffTypeKind - fCurrentStaffTypeKind; - msrStaffDetails::msrShowFretsKind - fCurrentShowFretsKind; - msrPrintObjectKind fCurrentPrintObjectKind; - msrStaffDetails::msrPrintSpacingKind - fCurrentPrintSpacingKind; - - int fCurrentStaffDetailsCapo; - - int fCurrentStaffDetailsStaffSize; // JMI - - int fCurrentStaffLinesNumber; - - int fStaffDetailsStaffNumber; - - int fCurrentStaffTuningLine; - msrDiatonicPitchKind fCurrentStaffTuningDiatonicPitchKind; - msrAlterationKind fCurrentStaffTuningAlterationKind; - int fCurrentStaffTuningOctave; - - S_msrStaffDetails fCurrentStaffDetails; - - bool fOnGoingStaffTuning; - - // staff handling - // ------------------------------------------------------ - - int fCurrentMusicXMLStaffNumber; // used throughout - - S_msrStaff fetchStaffFromCurrentPart ( - int inputLineNumber, - int staffNumber); - - // voice handling - // ------------------------------------------------------ - - int fCurrentMusicXMLVoiceNumber; // used throughout - - S_msrVoice fetchVoiceFromCurrentPart ( - int inputLineNumber, - int staffNumber, - int voiceNumber); - - // clef handling - // ------------------------------------------------------ - - int fCurrentClefStaffNumber; - string fCurrentClefSign; - int fCurrentClefLine; - int fCurrentClefOctaveChange; - - // key handling - // ------------------------------------------------------ - - msrKey::msrKeyKind fCurrentKeyKind; - - // traditional - int fCurrentKeyStaffNumber; - int fCurrentKeyFifths; - int fCurrentKeyCancelFifths; - msrKey::msrKeyModeKind fCurrentKeyModeKind; - - S_msrKey handleTraditionalKey ( - int inputLineNumber); - - // Humdrum-Scot - S_msrHumdrumScotKeyItem fCurrentHumdrumScotKeyItem; - vector - fCurrentHumdrumScotKeyItemsVector; - - S_msrKey handleHumdrumScotKey ( - int inputLineNumber); - - // harmonies, figured basses and frames are pending - // before the note itself is found in the MusicXML data - // ------------------------------------------------------ - void attachPendingHarmoniesFiguredBassesAndOrFramesToNote ( - int inputLineNumber, - S_msrNote newNote, - S_msrVoice voiceToInsertInto); - - S_msrNote createNote ( - int inputLineNumber); - - void populateNote ( - int inputLineNumber, - S_msrNote newNote); - - void createAStaffChangeIfNecessary ( - int inputLineNumber, - S_msrNote newNote, - S_msrVoice voiceToInsertInto); - - - // transpose handling - // ------------------------------------------------------ - - int fCurrentTransposeNumber; - int fCurrentTransposeDiatonic; - int fCurrentTransposeChromatic; - int fCurrentTransposeOctaveChange; - bool fCurrentTransposeDouble; - - - // direction handling - // ------------------------------------------------------ - - int fCurrentDirectionStaffNumber; - int fCurrentDirectionVoiceNumber; - msrPlacementKind fCurrentDirectionPlacementKind; - - bool fOnGoingDirection; - - - // direction-type handling - // ------------------------------------------------------ - - bool fOnGoingDirectionType; - - void attachPendingVoiceLevelElementsToVoice ( - S_msrVoice voice); - - - // rehearsal handling - // ------------------------------------------------------ - // rehearsals remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingRehearsalsList; - - void attachPendingRehearsalsToVoice ( - S_msrVoice voice); - - - // segnos handling - // ------------------------------------------------------ - // segnos remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingSegnosList; - - void attachPendingSegnosToNote ( - S_msrNote note); - - // codas handling - // ------------------------------------------------------ - // codas remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingCodasList; - - void attachPendingCodasToNote ( - S_msrNote note); - - - // eyeglasses handling - // ------------------------------------------------------ - // eyeglasses remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingEyeGlassesList; - - void attachPendingEyeGlassesToNote ( - S_msrNote note); - - - // damp handling - // ------------------------------------------------------ - // damps remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingDampsList; - - void attachPendingDampsToNote ( - S_msrNote note); - - - // damp all handling - // ------------------------------------------------------ - // damp alls remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingDampAllsList; - - void attachPendingDampAllsToNote ( - S_msrNote note); - - - // accordion-registration handling - // ------------------------------------------------------ - - int fCurrentAccordionHigh; - int fCurrentAccordionMiddle; - int fCurrentAccordionLow; - int fCurrentAccordionNumbersCounter; - - - // metronome handling - // ------------------------------------------------------ - - msrDurationKind fCurrentMetronomeBeatUnitDurationKind; - - vector fCurrentMetronomeBeatUnitsVector; - string fCurrentMetrenomePerMinute; - msrTempo::msrTempoParenthesizedKind - fCurrentMetronomeParenthesedKind; - - int fCurrentMetrenomeDotsNumber; - msrTempo::msrTempoRelationKind - fCurrentMetrenomeRelationKind; - msrDurationKind fCurrentMetronomeDurationKind; - string fCurrentMetronomeBeamValue; - - bool fOnGoingMetronomeNote; - - list fPendingMetronomeBeamsList; // stack JMI ??? - void attachCurrentMetronomeBeamsToMetronomeNote ( - S_msrTempoNote tempoNote); - - msrTempoTuplet::msrTempoTupletTypeKind - fCurrentTempoTupletTypeKind; - msrTempoTuplet::msrTempoTupletBracketKind - fCurrentTempoTupletBracketKind; - msrTempoTuplet::msrTempoTupletShowNumberKind - fCurrentTempoTupletShowNumberKind; - - int fCurrentMetrenomeNormalDotsNumber; - int fCurrentMetronomeNoteActualNotes; - int fCurrentMetronomeNoteNormalNotes; - string fCurrentMetronomeNoteNormalType; // JMI ??? - - rational fCurrentMetronomeNoteWholeNotesFromMetronomeType; - - S_msrTempoTuplet fCurrentMetronomeTuplet; - bool fOnGoingMetronomeTuplet; - - S_msrTempoRelationshipElements - fCurrentMetronomeRelationLeftElements; - S_msrTempoRelationshipElements - fCurrentMetronomeRelationRightElements; - - S_msrTempo fCurrentMetronomeTempo; - // tempos remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingTemposList; - - void attachPendingTemposToVoice ( - S_msrVoice voice); - - - // line breaks handling - // ------------------------------------------------------ - - list fPendingLineBreaksList; - - void attachLineBreaksToVoice ( - S_msrVoice voice); - - - // page breaks handling - // ------------------------------------------------------ - - list fPendingPageBreaksList; - - void attachPageBreaksToVoice ( - S_msrVoice voice); - - - // octave shift handling - // ------------------------------------------------------ - - // octave shifts remain pending until the next note - // (they precede the note in MusicXML and - // may occur when no current voice exists) - list fPendingOctaveShiftsList; - void attachPendingOctaveShiftsToNote ( - S_msrNote note); - - - // scordatura handling - // ------------------------------------------------------ - - S_msrScordatura fCurrentScordatura; - - // scordaturas remain pending until the next note: - // in MusicXML, they precede the note and - // may occur when no current voice exists - list fPendingScordaturasList; - - void attachPendingScordaturasToNote ( - S_msrNote note); - - int fCurrentStringTuningNumber; - - msrDiatonicPitchKind fCurrentStringTuningDiatonicPitchKind; - msrAlterationKind fCurrentStringTuningAlterationKind; - int fCurrentStringTuningOctave; - - bool fOnGoingAccord; - - - // time handling - // ------------------------------------------------------ - - msrTime::msrTimeSymbolKind - fCurrentTimeSymbolKind; - - int fCurrentTimeStaffNumber; - string fCurrentTimeBeats; - bool fCurrentTimeSenzaMisura; - - vector - fCurrentTimeItemsVector; - - S_msrTime fCurrentTime; - - msrTime::msrTimeSymbolKind - fCurrentInterchangeableSymbolKind; - msrTime::msrTimeSeparatorKind - fCurrentInterchangeableSeparatorKind; - msrTime::msrTimeRelationKind - fCurrentInterchangeableRelationKind; - - bool fOnGoingInterchangeable; - - - // lyrics handling - // ------------------------------------------------------ - - bool fOnGoingLyric; - string fCurrentSyllabic; - msrSyllable::msrSyllableKind - fCurrentSyllableKind; - msrSyllable::msrSyllableKind - fFirstSyllableInSlurKind; - msrSyllable::msrSyllableKind - fFirstSyllableInLigatureKind; - list fCurrentLyricTextsList; - - msrSyllable::msrSyllableExtendKind - fCurrentSyllableExtendKind; - bool fOnGoingSyllableExtend; - - string fCurrentStanzaNumber; - string fCurrentStanzaName; - - bool fCurrentNoteHasLyrics; - bool fASkipSyllableHasBeenGeneratedForcurrentNote; - - bool fCurrentStanzaHasText; - - list fCurrentNoteSyllables; - - bool fLastHandledNoteInVoiceHasLyrics; - - void handleLyricsForNote ( - S_msrVoice currentVoice, - S_msrNote newNote); - - // harmonies handling - // ------------------------------------------------------ - - int fHarmonyVoicesCounter; - list fPendingHarmoniesList; - void handlePendingHarmonies ( - S_msrNote newNote, - S_msrVoice voiceToInsertInto); - - int fCurrentHarmonyInputLineNumber; - - msrDiatonicPitchKind fCurrentHarmonyRootDiatonicPitchKind; - msrAlterationKind fCurrentHarmonyRootAlterationKind; - - msrHarmonyKind fCurrentHarmonyKind; - string fCurrentHarmonyKindText; - - int fCurrentHarmonyInversion; - - msrDiatonicPitchKind fCurrentHarmonyBassDiatonicPitchKind; - msrAlterationKind fCurrentHarmonyBassAlterationKind; - msrHarmonyDegree::msrHarmonyDegreeTypeKind - fCurrentHarmonyDegreeTypeKind; - - list fCurrentHarmonyDegreesList; - - - int fCurrentHarmonyDegreeValue; - msrAlterationKind fCurrentHarmonyDegreeAlterationKind; - - msrQuarterTonesPitchKind fCurrentHarmonyRootQuarterTonesPitchKind; - msrQuarterTonesPitchKind fCurrentHarmonyBassQuarterTonesPitchKind; - - int fCurrentHarmonyStaffNumber; - - rational fCurrentHarmonyWholeNotesOffset; - - bool fOnGoingHarmony; - - // figured bass handling - // ------------------------------------------------------ - - int fFiguredBassVoicesCounter; - list fPendingFiguredBassesList; - void handlePendingFiguredBasses ( - S_msrNote newNote, - S_msrVoice voiceToInsertInto); - - bool fOnGoingFiguredBass; - - int fCurrentFiguredBassInputLineNumber; - - msrFigure::msrFigurePrefixKind - fCurrentFigurePrefixKind; - int fCurrentFigureNumber; - msrFigure::msrFigureSuffixKind - fCurrentFigureSuffixKind; - - rational fCurrentFiguredBassSoundingWholeNotes; - rational fCurrentFiguredBassDisplayWholeNotes; - - msrFiguredBass::msrFiguredBassParenthesesKind - fCurrentFiguredBassParenthesesKind; - - list fPendingFiguredBassFiguresList; - - // frames handling - // ------------------------------------------------------ - - int fCurrentFrameStrings; - int fCurrentFrameFrets; - int fCurrentFrameFirstFret; - bool fOnGoingFrame; - - list fPendingFramesList; - - int fCurrentFrameNoteStringNumber; - int fCurrentFrameNoteFretNumber; - int fCurrentFrameNoteFingering; - - msrFrameNote::msrBarreTypeKind - fCurrentFrameNoteBarreTypeKind; - - bool fOnGoingFrameNote; - - list fPendingFramesNotesList; - - // barline handling - // ------------------------------------------------------ - - bool fOnGoingBarline; - int fRepeatEndCounter; - - msrBarline::msrBarlineHasSegnoKind - fCurrentBarlineHasSegnoKind; - msrBarline::msrBarlineHasCodaKind - fCurrentBarlineHasCodaKind; - string fCurrentBarlineEndingNumber; // vector ??? JMI - // may be "1, 2" - - msrBarline::msrBarlineLocationKind - fCurrentBarlineLocationKind; - msrBarline::msrBarlineStyleKind - fCurrentBarlineStyleKind; - msrBarline::msrBarlineEndingTypeKind - fCurrentBarlineEndingTypeKind; - msrBarline::msrBarlineRepeatDirectionKind - fCurrentBarlineRepeatDirectionKind; - msrBarline::msrBarlineRepeatWingedKind - fCurrentBarlineRepeatWingedKind; - - int fCurrentBarlineTimes; - - // repeats handling - // ------------------------------------------------------ - - string fCurrentRepeatStartMeasureNumber; // stack ??? JMI - S_msrBarline fCurrentRepeatEndingStartBarline; // stack ??? JMI - - void handleRepeatStart ( - S_msrBarline& barline); - - void handleRepeatEnd ( - S_msrBarline& barline); - - void handleRepeatEndingStart ( - S_msrBarline& barline); - -/* JMI - void handleRepeatHookedEndingStart ( - S_barline elt, - S_msrBarline& barline); -*/ - void handleRepeatHookedEndingEnd ( - S_msrBarline& barline); - /* JMI - void handleRepeatHooklessEndingStart ( - S_barline elt, - S_msrBarline& barline); -*/ - void handleRepeatHooklessEndingEnd ( - S_msrBarline& barline); - - // notes/rests handling - // ------------------------------------------------------ - - // map seems buggy in g++ 4.9.x, - // so we use a pair containing the staff and voice numbers: - map, S_msrNote> - fVoicesLastMetNoteMap; - - void printVoicesLastMetNoteMap ( - int inputLineNumber, - string context); - - void checkStep ( - int inputLineNumber, - string stepValue); - - // notes - msrDiatonicPitchKind fCurrentNoteDiatonicPitchKind; - msrAlterationKind fCurrentNoteAlterationKind; - - int fCurrentNoteOctave; - - int fCurrentDisplayOctave; - msrDiatonicPitchKind fCurrentDisplayDiatonicPitchKind; - - // note print object kind - msrPrintObjectKind fCurrentNotePrintObjectKind; - - // note heads - msrNote::msrNoteHeadKind fCurrentNoteHeadKind; - msrNote::msrNoteHeadFilledKind - fCurrentNoteHeadFilledKind; - msrNote::msrNoteHeadParenthesesKind - fCurrentNoteHeadParenthesesKind; - - // accidentals - msrNote::msrNoteAccidentalKind - fCurrentNoteAccidentalKind; - msrNote::msrNoteEditorialAccidentalKind - fCurrentNoteEditorialAccidentalKind; - msrNote::msrNoteCautionaryAccidentalKind - fCurrentNoteCautionaryAccidentalKind; - - // note color - string fCurrentNoteRGB; - string fCurrentNoteAlpha; - - // ongoing note - bool fOnGoingNote; - - // glissandos - - // slides - - // note sound - msrQuarterTonesPitchKind fCurrentNoteQuarterTonesPitchKind; - rational fCurrentNoteSoundingWholeNotesFromDuration; - rational fCurrentNoteSoundingWholeNotes; - - // note display - msrQuarterTonesPitchKind fCurrentNoteQuarterTonesDisplayPitchKind; - rational fCurrentNoteDisplayWholeNotesFromType; - rational fCurrentNoteDisplayWholeNotes; - - // augmentation dots - int fCurrentNoteDotsNumber; - - // graphic duration - msrDurationKind fCurrentNoteGraphicDurationKind; - - // rests - bool fCurrentNoteIsARest; - bool fCurrentRestMeasure; - - // unpitched notes - bool fCurrentNoteIsUnpitched; - - // cue notes - bool fCurrentNoteIsACueNote; - - // grace notes - bool fCurrentNoteIsAGraceNote; - string fCurrentStealTimeFollowing; - string fCurrentStealTimePrevious; - string fCurrentMakeTime; - - // staff - // notes always keep their initial staff number - int fPreviousNoteMusicXMLStaffNumber; - - // staff changes - // MusicXMl contains sequences of elements on one and the same staff, - // until a or markup may change the latter; - // we keep track of the current sequence staff number - // for the previous and current notes: - // a staff change occurs when they are different, - // but the note itself keeps its staff number in that case - int fCurrentStaffNumberToInsertInto; - - // cross staff chords - int fCurrentChordStaffNumber; - bool fCurrentNoteIsCrossStaves; - - enum staffChangeKind { - k_NoStaffChange, - kStaffChangeChordMemberNote, - kStaffChangeOtherNote }; - - staffChangeKind fCurrentStaffChangeKind; - - // elements attached to the note - S_msrStem fCurrentStem; - - string fCurrentBeamValue; - int fCurrentBeamNumber; - - // initialization - void initializeNoteData (); - - // notes - void handleNote ( - int inputLineNumber, - S_msrNote newNote); - - // detailed notes handling - void handleStandaloneOrDoubleTremoloNoteOrGraceNoteOrRest ( - S_msrNote newNote); - - void handleNoteBelongingToAChord ( - S_msrNote newChordNote); - - void handleNoteBelongingToATuplet ( - S_msrNote newNote); - - void handleNoteBelongingToAChordInATuplet ( - S_msrNote newChordNote); - - void handleNoteBelongingToAChordInAGraceNotesGroup ( - S_msrNote newChordNote); - - // grace notes handling - // ------------------------------------------------------ - - bool fCurrentGraceIsSlashed; - S_msrGraceNotesGroup fPendingGraceNotesGroup; - - // articulations handling - // ------------------------------------------------------ - - list fCurrentArticulations; - - void attachCurrentArticulationsToNote ( - S_msrNote note); - - /* JMI - void attachCurrentArticulationsToChord ( // JMI - S_msrChord chord); - */ - - void copyNoteArticulationsToChord ( - S_msrNote note, S_msrChord chord); - - // dynamics, words and wedges remain pending until the next note - // (they precede the note in MusicXML but follow it in LilyPond) - // ------------------------------------------------------ - - list fPendingDynamicsList; - list fPendingOtherDynamicsList; - list fPendingWordsList; - list fPendingSlursList; - list fPendingLigaturesList; - list fPendingWedgesList; - list fPendingSlashesList; - - void attachPendingNoteLevelElementsToNote ( - S_msrNote note); - - void attachPendingDynamicsToNote ( - S_msrNote note); - void attachPendingOtherDynamicsToNote ( - S_msrNote note); - void attachPendingWordsToNote ( - S_msrNote note); - void attachPendingSlursToNote ( - S_msrNote note); - void attachPendingLigaturesToNote ( - S_msrNote note); - void attachPendingPedalsToNote ( - S_msrNote note); - void attachPendingWedgesToNote ( - S_msrNote note); - void attachPendingSlashesToNote ( - S_msrNote note); - - void attachPendingGlissandosToNote ( - S_msrNote note); - void attachPendingSlidesToNote ( - S_msrNote note); - - void copyNoteElementsToChord ( - S_msrNote note, S_msrChord chord); - - void copyNoteDynamicsToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteOtherDynamicsToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteWordsToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteTieToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteSlursToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteLigaturesToChord ( - S_msrNote note, S_msrChord chord); - void copyNotePedalsToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteSlashesToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteWedgesToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteOctaveShiftToChord ( - S_msrNote note, S_msrChord chord); - - void copyNoteGraceNotesGroupsToChord ( - S_msrNote note, S_msrChord chord); - - void copyNoteHarmoniesToChord ( - S_msrNote note, S_msrChord chord); - - // technicals handling - // ------------------------------------------------------ - - list fCurrentTechnicalsList; - list - fCurrentTechnicalWithIntegersList; - list - fCurrentTechnicalWithFloatsList; - list - fCurrentTechnicalWithStringsList; - - bool fOnGoingTechnical; - - float fBendAlterValue; - - void attachCurrentTechnicalsToNote ( - S_msrNote note); - void attachCurrentTechnicalWithIntegersToNote ( - S_msrNote note); - void attachCurrentTechnicalWithFloatsToNote ( - S_msrNote note); - void attachCurrentTechnicalWithStringsToNote ( - S_msrNote note); - -// void attachCurrentTechnicalsToChord ( // JMI - // S_msrChord chord); - - void copyNoteTechnicalsToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteTechnicalWithIntegersToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteTechnicalWithFloatsToChord ( - S_msrNote note, S_msrChord chord); - void copyNoteTechnicalWithStringsToChord ( - S_msrNote note, S_msrChord chord); - - // ornaments handling - // ------------------------------------------------------ - - list fCurrentOrnamentsList; - - void attachCurrentOrnamentsToNote ( - S_msrNote note); - -// void attachCurrentOrnamentsToChord ( // JMI - // S_msrChord chord); - - void copyNoteOrnamentsToChord ( - S_msrNote note, S_msrChord chord); - - // spanners handling - // ------------------------------------------------------ - - S_msrSpanner fCurrentWavyLineSpannerStart; - - list fCurrentSpannersList; - - void attachCurrentSpannersToNote ( - S_msrNote note); - - void copyNoteSpannersToChord ( - S_msrNote note, S_msrChord chord); - - // stems handling - // ------------------------------------------------------ - - vector fPendingStemsVector; // stack JMI ??? - - void copyNoteStemToChord ( - S_msrNote note, S_msrChord chord); - - // beams handling - // ------------------------------------------------------ - - list fPendingBeamsList; - - void attachPendingBeamsToNote ( - S_msrNote note); - void copyNoteBeamsToChord ( - S_msrNote note, S_msrChord chord); - - // glissandos handling - // ------------------------------------------------------ - - list fPendingGlissandosList; - - // slides handling - // ------------------------------------------------------ - - list fPendingSlidesList; - - // tremolos handling - // ------------------------------------------------------ - - bool fCurrentNoteBelongsToADoubleTremolo; // JMI ??? - - msrTremoloTypeKind fCurrentTremoloTypeKind; - - S_msrSingleTremolo fCurrentSingleTremolo; - - S_msrDoubleTremolo fCurrentDoubleTremolo; - - void attachCurrentSingleTremoloToNote ( - S_msrNote note); - - void copyNoteSingleTremoloToChord ( - S_msrNote note, S_msrChord chord); - - // chords handling - // ------------------------------------------------------ - - bool fCurrentNoteBelongsToAChord; - -/* JMI - // map // seems buggy in g++ 4.9.x, so - // we use a pair containing the staff and voice numbers: - map, S_msrChord> - fVoicesCurrentChordMap; - */ - - S_msrChord fCurrentChord; - bool fOnGoingChord; - - S_msrChord createChordFromItsFirstNote ( - int inputLineNumber, - S_msrVoice voice, - S_msrNote chordFirstNote, - msrNote::msrNoteKind noteKind); - -/* JMI - void registerVoiceCurrentChordInMap ( - int inputLineNumber, - S_msrVoice voice, - S_msrChord chord); - - void printVoicesCurrentChordMap (); - */ - void printCurrentChord (); - - // tuplets handling - // ------------------------------------------------------ - - bool fCurrentNoteHasATimeModification; - - int fCurrentNoteActualNotes; - int fCurrentNoteNormalNotes; - msrDurationKind fCurrentNoteNormalTypeDuration; - - // nested tuplets are numbered 1, 2, ... - int fCurrentTupletNumber; - int fPreviousTupletNumber; - - bool fOnGoingTupletActual; - int fCurrentTupletActualNumber; - string fCurrentTupletActualType; - int fCurrentTupletActualDotsNumber; - - bool fOnGoingTupletNormal; - int fCurrentTupletNormalNumber; - string fCurrentTupletNormalType; - int fCurrentTupletNormalDotsNumber; - - msrTuplet::msrTupletTypeKind - fCurrentTupletTypeKind; - msrTuplet::msrTupletLineShapeKind - fCurrentTupletLineShapeKind; - msrTuplet::msrTupletBracketKind - fCurrentTupletBracketKind; - msrTuplet::msrTupletShowNumberKind - fCurrentTupletShowNumberKind; - msrTuplet::msrTupletShowTypeKind - fCurrentTupletShowTypeKind; - int fCurrentTempoTupletNumber; - - bool fCurrentNoteBelongsToATuplet; - - list fTupletsStack; - void displayTupletsStack (string context); - - bool fCurrentATupletStopIsPending; - - void createTupletWithItsFirstNoteAndPushItToTupletsStack ( - S_msrNote note); - - void handlePendingTupletStopIfAny ( - int inputLineNumber, - S_msrNote note); - - void finalizeTupletAndPopItFromTupletsStack ( - int inputLineNumber); - - void handleTupletsPendingOnTupletsStack ( - int inputLineNumber); - - // map seems buggy in g++ 4.9.x, so - // we use a pair containing the staff and voice numbers: -// map - map, S_msrTuplet> - fLastHandledTupletInVoiceMap; - - void displayLastHandledTupletInVoiceMap ( - string header); - - // ties handling - // ------------------------------------------------------ - -// JMI string fCurrentTiedType; - msrTie::msrTieKind fCurrentTieKind; - string fCurrentTiedOrientation; // JMI - S_msrTie fCurrentTie; - - // slurs handling - // ------------------------------------------------------ - - string fCurrentSlurType; - msrSlur::msrSlurTypeKind fCurrentSlurTypeKind; - bool fOnGoingSlur; - bool fOnGoingSlurHasStanza; - - list fSlurStartsStack; - void displaySlurStartsStack ( - string context); - - // ligatures handling - // ------------------------------------------------------ - - S_msrLigature fCurrentLigatureStartAbove; - S_msrLigature fCurrentLigatureStartBelow; - - string fCurrentLigaturePlacement; - msrLigature::msrLigatureKind - fCurrentLigatureKind; - bool fOnGoingLigature; - bool fOnGoingLigatureHasStanza; - - // piano pedals handling - // ------------------------------------------------------ - - list fPendingPedalsList; - -/* JMI - msrDamperPedal::damperPedalKind - fCurrentDamperPedalKind; - int fCurrentDamperPedalIntegerValue; - - msrDamperPedal::damperPedalKind - fCurrentDamperPedalKind; - int fCurrentDamperPedalIntegerValue; - - msrDamperPedal::damperPedalKind - fCurrentDamperPedalKind; - int fCurrentDamperPedalIntegerValue; -*/ - - // harp pedals handling - // ------------------------------------------------------ - - msrDiatonicPitchKind fCurrentHarpPedalDiatonicPitchKind; - msrAlterationKind fCurrentHarpPedalAlterationKind; - S_msrHarpPedalsTuning fCurrentHarpPedalsTuning; - - // backup handling - // ------------------------------------------------------ - - int fCurrentBackupDivisions; - bool fOnGoingBackup; - - void handleBackup ( - int inputLineNumber); - - // forward handling - // ------------------------------------------------------ - - int fCurrentForwardDivisions; - int fCurrentForwardVoiceNumber; - int fCurrentForwardStaffNumber; - bool fOnGoingForward; - - - // current ongoing values display - // ------------------------------------------------------ - void displayCurrentOnGoingValues (); -}; - - -} - - -#endif diff --git a/src/lilypond/oah2ManPageGenerators.cpp b/src/lilypond/oah2ManPageGenerators.cpp deleted file mode 100644 index 5e176f225..000000000 --- a/src/lilypond/oah2ManPageGenerators.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "oah2ManPageGenerators.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -oah2ManPageGenerator::oah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oahVisitor ( - handler), - fOah2ManPageLogOstream ( - logOstream), - fOah2ManPageOutputStream ( - manPageOutputStream) -{} - -oah2ManPageGenerator::~oah2ManPageGenerator () -{} - - -} // namespace diff --git a/src/lilypond/oah2ManPageGenerators.h b/src/lilypond/oah2ManPageGenerators.h deleted file mode 100644 index f173dfd2e..000000000 --- a/src/lilypond/oah2ManPageGenerators.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___oah2ManPageGenerator___ -#define ___oah2ManPageGenerator___ - -#include "extraOah.h" - -#include "oahVisitor.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class oah2ManPageGenerator : public oahVisitor -{ - public: - - oah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~oah2ManPageGenerator (); - - protected: - - protected: - - indentedOstream& fOah2ManPageLogOstream; - ostream& fOah2ManPageOutputStream; -}; -typedef SMARTP S_oah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/oahBasicTypes.cpp b/src/lilypond/oahBasicTypes.cpp deleted file mode 100644 index ddb17e6f0..000000000 --- a/src/lilypond/oahBasicTypes.cpp +++ /dev/null @@ -1,11585 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include - -#include // INT_MIN, INT_MAX -#include // setw, setprecision, ... - -#include - -#include "utilities.h" - -#include "oahBasicTypes.h" -#include "oahOah.h" - -#include "messagesHandling.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_oahAtom oahAtom::create ( - string shortName, - string longName, - string description) -{ - oahAtom* o = new - oahAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -oahAtom::oahAtom ( - string shortName, - string longName, - string description) - : oahElement ( - shortName, - longName, - description, - kElementVisibilityAlways) -{} - -oahAtom::~oahAtom () -{} - -void oahAtom::setSubGroupUpLink ( - S_oahSubGroup subGroup) -{ - // sanity check - msrAssert ( - subGroup != nullptr, - "subGroup is null"); - - // set the upLink - fSubGroupUpLink = subGroup; -} - -void oahAtom::registerAtomInHandler ( - S_oahHandler handler) -{ - handler-> - registerElementInHandler (this); - - fHandlerUpLink = handler; -} - -void oahAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtom::browseData ()" << - endl; - } -#endif -} - -void oahAtom::print (ostream& os) const -{ - const int fieldWidth = 19; - - os << - "Atom ???:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter--; -} - -void oahAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << - "Atom values ???:" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahAtom& elt) -{ - elt->print (os); - return os; -} - -bool compareOahElements::operator() ( - const S_oahElement firstElement, - const S_oahElement secondElement) const -{ -/* - Compare: - A binary predicate that takes two arguments of the same type as the elements and returns a bool. The expression comp(a,b), where comp is an object of this type and a and b are key values, shall return true if a is considered to go before b in the strict weak ordering the function defines. - The multiset object uses this expression to determine both the order the elements follow in the container and whether two element keys are equivalent (by comparing them reflexively: they are equivalent if !comp(a,b) && !comp(b,a)). - This can be a function pointer or a function object (see constructor for an example). This defaults to less, which returns the same as applying the less-than operator (agetShortName () < secondElement->getShortName (); - } - else { - result = true; - } - } - else { - result = false; - } - - return result; -} - -//______________________________________________________________________________ -S_oahAtomSynonym oahAtomSynonym::create ( - string shortName, - string longName, - string description, - S_oahAtom originalOahAtom) -{ - oahAtomSynonym* o = new - oahAtomSynonym ( - shortName, - longName, - description, - originalOahAtom); - assert(o!=0); - return o; -} - -oahAtomSynonym::oahAtomSynonym ( - string shortName, - string longName, - string description, - S_oahAtom originalOahAtom) - : oahAtom ( - shortName, - longName, - description) -{ - // sanity check - msrAssert ( - originalOahAtom != nullptr, - "originalOahAtom is null"); - - fOriginalOahAtom = originalOahAtom; -} - -oahAtomSynonym::~oahAtomSynonym () -{} - -void oahAtomSynonym::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtomSynonym::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahAtomSynonym elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahAtomSynonym::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahAtomSynonym::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtomSynonym::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahAtomSynonym elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahAtomSynonym::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahAtomSynonym::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtomSynonym::browseData ()" << - endl; - } -#endif - - if (fOriginalOahAtom) { - // browse the original atom - oahBrowser browser (v); - browser.browse (*fOriginalOahAtom); - } -} - -void oahAtomSynonym::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "AtomSynonym:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void oahAtomSynonym::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_oahAtomSynonym& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahOptionsUsageAtom oahOptionsUsageAtom::create ( - string shortName, - string longName, - string description) -{ - oahOptionsUsageAtom* o = new - oahOptionsUsageAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -oahOptionsUsageAtom::oahOptionsUsageAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -oahOptionsUsageAtom::~oahOptionsUsageAtom () -{} - -S_oahValuedAtom oahOptionsUsageAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahOptionsUsageAtom" << - endl; - } -#endif - - // handle it at once - os << - endl << - "Options usage" << - endl << - "-------------" << - endl << - endl; - - gIndenter++; - - os << - gIndenter.indentMultiLineString ( -R"(As an argument, '-' represents standard input. - -A number of options exist to fine tune the generated LilyPond code -and limit the need for manually editing the latter. -Most options have a short and a long name for commodity. - -The options are organized in a group-subgroup-atom hierarchy. -Help can be obtained for groups or subgroups at will, -as well as for any option with the '-onh, option-name-help' option. - -A subgroup can be hidden by default, in which case its description is printed -only when the corresponding short or long names are used. - -Both '-' and '--' can be used to introduce options in the command line, -even though the help facility only shows them with '-'. - -Command line options and arguments can be placed in any order, -provided atom values immediately follow the corresponding atoms. - -Some prefixes allow shortcuts, such as '-t=voices,meas' for '-tvoices, -tmeas')") << - endl << - endl; - - gIndenter--; - - // no option value is needed - return nullptr; -} - -void oahOptionsUsageAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionsUsageAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionsUsageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahOptionsUsageAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahOptionsUsageAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionsUsageAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionsUsageAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahOptionsUsageAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahOptionsUsageAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionsUsageAtom::browseData ()" << - endl; - } -#endif -} - -void oahOptionsUsageAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsUsageAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -/* -void oahOptionsUsageAtom::printOptionsUsage (ostream& os) const -{ - os << - endl << - "Options usage" << - endl << - "-------------" << - endl << - endl; - - gIndenter++; - - os << - gIndenter.indentMultiLineString ( -R"(As an argument, '-' represents standard input. - -A number of options exist to fine tune the generated LilyPond code -and limit the need for manually editing the latter. -Most options have a short and a long name for commodity. - -The options are organized in a group-subgroup-atom hierarchy. -Help can be obtained for groups or subgroups at will, -as well as for any option with the '-onh, option-name-help' option. - -A subgroup can be hidden by default, in which case its description is printed -only when the corresponding short or long names are used. - -Both '-' and '--' can be used to introduce options in the command line, -even though the help facility only shows them with '-'. - -Command line options and arguments can be placed in any order, -provided atom values immediately follow the corresponding atoms.)") << - endl << - endl; - - gIndenter--; -} -*/ - -void oahOptionsUsageAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_oahOptionsUsageAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahOptionsSummaryAtom oahOptionsSummaryAtom::create ( - string shortName, - string longName, - string description) -{ - oahOptionsSummaryAtom* o = new - oahOptionsSummaryAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -oahOptionsSummaryAtom::oahOptionsSummaryAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -oahOptionsSummaryAtom::~oahOptionsSummaryAtom () -{} - -S_oahValuedAtom oahOptionsSummaryAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahOptionsSummaryAtom" << - endl; - } -#endif - - print (os); //JMI ??? - - // no option value is needed - return nullptr; -} - -void oahOptionsSummaryAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionsSummaryAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionsSummaryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahOptionsSummaryAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahOptionsSummaryAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionsSummaryAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionsSummaryAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahOptionsSummaryAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahOptionsSummaryAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionsSummaryAtom::browseData ()" << - endl; - } -#endif -} - -void oahOptionsSummaryAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsSummaryAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void oahOptionsSummaryAtom::printOptionsSummary (ostream& os) const -{ - os << - gOahOah->fHandlerExecutableName << - endl; -} - -void oahOptionsSummaryAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_oahOptionsSummaryAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahAtomWithVariableName oahAtomWithVariableName::create ( - string shortName, - string longName, - string description, - string variableName) -{ - oahAtomWithVariableName* o = new - oahAtomWithVariableName ( - shortName, - longName, - description, - variableName); - assert(o!=0); - return o; -} - -oahAtomWithVariableName::oahAtomWithVariableName ( - string shortName, - string longName, - string description, - string variableName) - : oahAtom ( - shortName, - longName, - description), - fVariableName ( - variableName) -{} - -oahAtomWithVariableName::~oahAtomWithVariableName () -{} - -void oahAtomWithVariableName::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtomWithVariableName::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahAtomWithVariableName elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahAtomWithVariableName::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahAtomWithVariableName::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtomWithVariableName::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahAtomWithVariableName elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahAtomWithVariableName::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahAtomWithVariableName::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahAtomWithVariableName::browseData ()" << - endl; - } -#endif -} - -void oahAtomWithVariableName::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "AtomWithVariableName:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - endl; - - gIndenter--; -} - -void oahAtomWithVariableName::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - "JMI" << // ??? - endl; -} - -ostream& operator<< (ostream& os, const S_oahAtomWithVariableName& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahBooleanAtom oahBooleanAtom::create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable) -{ - oahBooleanAtom* o = new - oahBooleanAtom ( - shortName, - longName, - description, - variableName, - booleanVariable); - assert(o!=0); - return o; -} - -oahBooleanAtom::oahBooleanAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable) - : oahAtomWithVariableName ( - shortName, - longName, - description, - variableName), - fBooleanVariable ( - booleanVariable) -{} - -oahBooleanAtom::~oahBooleanAtom () -{} - -S_oahValuedAtom oahBooleanAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahBooleanAtom" << - endl; - } -#endif - - // handle it at once - setBooleanVariable (true); - - // no option value is needed - return nullptr; -} - -void oahBooleanAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahBooleanAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahBooleanAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahBooleanAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahBooleanAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahBooleanAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahBooleanAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahBooleanAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahBooleanAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahBooleanAtom::browseData ()" << - endl; - } -#endif -} - -void oahBooleanAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "BooleanAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fBooleanVariable" << " : " << - booleanAsString (fBooleanVariable) << - endl; - - gIndenter--; -} - -void oahBooleanAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - booleanAsString (fBooleanVariable) << - endl; -} - -ostream& operator<< (ostream& os, const S_oahBooleanAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahTwoBooleansAtom oahTwoBooleansAtom::create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable) -{ - oahTwoBooleansAtom* o = new - oahTwoBooleansAtom ( - shortName, - longName, - description, - variableName, - booleanVariable, - booleanSecondaryVariable); - assert(o!=0); - return o; -} - -oahTwoBooleansAtom::oahTwoBooleansAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable) - : oahBooleanAtom ( - shortName, - longName, - description, - variableName, - booleanVariable), - fBooleanSecondaryVariable ( - booleanSecondaryVariable) -{} - -oahTwoBooleansAtom::~oahTwoBooleansAtom () -{} - -S_oahValuedAtom oahTwoBooleansAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahTwoBooleansAtom" << - endl; - } -#endif - - // handle it at once - setTwoBooleansVariables (true); - - // no option value is needed - return nullptr; -} - -void oahTwoBooleansAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahTwoBooleansAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahTwoBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahTwoBooleansAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahTwoBooleansAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahTwoBooleansAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahTwoBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahTwoBooleansAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahTwoBooleansAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahTwoBooleansAtom::browseData ()" << - endl; - } -#endif -} - -void oahTwoBooleansAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "TwoBooleansAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - os << - setw (fieldWidth) << - "fDescription" << " : " << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fBooleanVariable" << " : " << - booleanAsString ( - fBooleanVariable) << - endl << - setw (fieldWidth) << - "fBooleanSecondaryVariable" << " : " << - booleanAsString ( - fBooleanSecondaryVariable) << - endl; - - gIndenter--; -} - -void oahTwoBooleansAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - booleanAsString (fBooleanVariable) << - endl; -} - -ostream& operator<< (ostream& os, const S_oahTwoBooleansAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahThreeBooleansAtom oahThreeBooleansAtom::create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable, - bool& booleanTertiaryVariable) -{ - oahThreeBooleansAtom* o = new - oahThreeBooleansAtom ( - shortName, - longName, - description, - variableName, - booleanVariable, - booleanSecondaryVariable, - booleanTertiaryVariable); - assert(o!=0); - return o; -} - -oahThreeBooleansAtom::oahThreeBooleansAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable, - bool& booleanTertiaryVariable) - : oahBooleanAtom ( - shortName, - longName, - description, - variableName, - booleanVariable), - fBooleanSecondaryVariable ( - booleanSecondaryVariable), - fBooleanTertiaryVariable ( - booleanTertiaryVariable) -{} - -oahThreeBooleansAtom::~oahThreeBooleansAtom () -{} - -S_oahValuedAtom oahThreeBooleansAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahThreeBooleansAtom" << - endl; - } -#endif - - // handle it at once - setThreeBooleansVariables (true); - - // no option value is needed - return nullptr; -} - -void oahThreeBooleansAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahThreeBooleansAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahThreeBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahThreeBooleansAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahThreeBooleansAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahThreeBooleansAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahThreeBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahThreeBooleansAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahThreeBooleansAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahThreeBooleansAtom::browseData ()" << - endl; - } -#endif -} - -void oahThreeBooleansAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "ThreeBooleansAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - os << - setw (fieldWidth) << - "fDescription" << " : " << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fBooleanVariable" << " : " << - booleanAsString ( - fBooleanVariable) << - endl << - setw (fieldWidth) << - "fBooleanSecondaryVariable" << " : " << - booleanAsString ( - fBooleanSecondaryVariable) << - endl << - setw (fieldWidth) << - "fBooleanTertiaryVariable" << " : " << - booleanAsString ( - fBooleanTertiaryVariable) << - endl; - - gIndenter--; -} - -void oahThreeBooleansAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - booleanAsString ( - fBooleanVariable) << - endl; -} - -ostream& operator<< (ostream& os, const S_oahThreeBooleansAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahCombinedBooleansAtom oahCombinedBooleansAtom::create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable) -{ - oahCombinedBooleansAtom* o = new - oahCombinedBooleansAtom ( - shortName, - longName, - description, - variableName, - booleanVariable); - assert(o!=0); - return o; -} - -oahCombinedBooleansAtom::oahCombinedBooleansAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable) - : oahAtomWithVariableName ( - shortName, - longName, - description, - variableName), - fBooleanVariable ( - booleanVariable) -{} - -oahCombinedBooleansAtom::~oahCombinedBooleansAtom () -{} - -void oahCombinedBooleansAtom::addBooleanAtom ( - S_oahBooleanAtom booleanAtom) -{ - // sanity check - msrAssert ( - booleanAtom != nullptr, - "booleanAtom is null"); - - fBooleanAtomsList.push_back ( - booleanAtom); -} - -void oahCombinedBooleansAtom::addBooleanAtomByName ( - string name) -{ - // get the options handler - S_oahHandler - handler = - getSubGroupUpLink ()-> - getGroupUpLink ()-> - getHandlerUpLink (); - - // sanity check - msrAssert ( - handler != nullptr, - "handler is null"); - - // is name known in options map? - S_oahElement - element = - handler-> - fetchElementFromMap (name); - - if (! element) { - // no, name is unknown in the map - handler-> - printOptionsSummary (); - - stringstream s; - - s << - "INTERNAL ERROR: option name '" << name << - "' is unknown"; - - oahError (s.str ()); - } - - else { - // name is known, let's handle it - - if ( - // boolean atom? - S_oahBooleanAtom - atom = - dynamic_cast(&(*element)) - ) { - // handle the atom - fBooleanAtomsList.push_back (atom); - } - - else { - stringstream s; - - s << - "option name '" << name << "' is not that of an atom"; - - oahError (s.str ()); - } - } -} - -void oahCombinedBooleansAtom::setCombinedBooleanVariables ( - bool value) -{ - // set the combined atoms atom variable - fBooleanVariable = value; - - // set the value of the atoms in the list - if (fBooleanAtomsList.size ()) { - for ( - list::const_iterator i = - fBooleanAtomsList.begin (); - i != fBooleanAtomsList.end (); - i++ - ) { - S_oahAtom atom = (*i); - - if ( - // boolean atom? - S_oahBooleanAtom - booleanAtom = - dynamic_cast(&(*atom)) - ) { - // set the boolean variable - booleanAtom-> - setBooleanVariable (value); - } - } // for - } -} - -S_oahValuedAtom oahCombinedBooleansAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahCombinedBooleansAtom" << - endl; - } -#endif - - // handle it at once - setCombinedBooleanVariables (true); - - // no option value is needed - return nullptr; -} - -void oahCombinedBooleansAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahCombinedBooleansAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahCombinedBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahCombinedBooleansAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahCombinedBooleansAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahCombinedBooleansAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahCombinedBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahCombinedBooleansAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahCombinedBooleansAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahCombinedBooleansAtom::browseData ()" << - endl; - } -#endif - - // browse the boolean atoms - if (fBooleanAtomsList.size ()) { - for ( - list::const_iterator i = fBooleanAtomsList.begin (); - i != fBooleanAtomsList.end (); - i++ - ) { - S_oahBooleanAtom booleanAtom = (*i); - - // browse the boolean atom - oahBrowser browser (v); - browser.browse (*(booleanAtom)); - } // for - } -} - -void oahCombinedBooleansAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "CombinedBooleansAtom:" << - endl; - - gIndenter++; - - printOptionEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fBooleanAtomsList" << " : "; - - if (! fBooleanAtomsList.size ()) { - os << - "none"; - } - - else { - os << endl; - - gIndenter++; - - os << "'"; - - list::const_iterator - iBegin = fBooleanAtomsList.begin (), - iEnd = fBooleanAtomsList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << " "; - } // for - - os << "'"; - - gIndenter--; - } - - gIndenter--; - - os << endl; -} - -void oahCombinedBooleansAtom::printHelp (ostream& os) -{ - os << - fetchNames () << - endl; - - if (fDescription.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - } - - os << - "This combined option is equivalent to: "; - - if (! fBooleanAtomsList.size ()) { - os << - "none" << - endl; - } - - else { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fBooleanAtomsList.begin (), - iEnd = fBooleanAtomsList.end (), - i = iBegin; - - for ( ; ; ) { - os << - (*i)-> fetchNames (); - if (++i == iEnd) break; - os << endl; - } // for - - os << endl; - - gIndenter--; - } - - if (fDescription.size ()) { // ??? JMI - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } - - // register help print action in options handler upLink -// fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahCombinedBooleansAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - booleanAsString ( - fBooleanVariable) << - endl; - - int fieldWidth = - valueFieldWidth - gIndenter.getIndent () + 1; - - gIndenter++; // only now - - if (! fBooleanAtomsList.size ()) { - os << - "none" << - endl; - } - - else { - list::const_iterator - iBegin = fBooleanAtomsList.begin (), - iEnd = fBooleanAtomsList.end (), - i = iBegin; - - for ( ; ; ) { - S_oahAtom - atom = (*i); - - if ( - // boolean atom? - S_oahBooleanAtom - booleanAtom = - dynamic_cast(&(*atom)) - ) { - // print the boolean value - booleanAtom-> - printAtomOptionsValues ( - os, fieldWidth); - } - - if (++i == iEnd) break; - - // JMI os << endl; - } // for - } - - gIndenter--; - -} - -ostream& operator<< (ostream& os, const S_oahCombinedBooleansAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahPrefix oahPrefix::create ( - string prefixName, - string prefixErsatz, - string prefixDescription) -{ - oahPrefix* o = new - oahPrefix ( - prefixName, - prefixErsatz, - prefixDescription); - assert(o!=0); - return o; -} - -oahPrefix::oahPrefix ( - string prefixName, - string prefixErsatz, - string prefixDescription) -{ - fPrefixName = prefixName; - fPrefixErsatz = prefixErsatz; - fPrefixDescription = prefixDescription; -} - -oahPrefix::~oahPrefix () -{} - -/* JMI -S_oahPrefix oahPrefix::fetchOptionByName ( - string name) -{ - S_oahPrefix result; - - if (name == fPrefixName) { - result = this; - } - - return result; -} -*/ - -void oahPrefix::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahPrefix::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahPrefix elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahPrefix::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahPrefix::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahPrefix::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahPrefix elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahPrefix::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahPrefix::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahPrefix::browseData ()" << - endl; - } -#endif -} - -string oahPrefix::prefixNames () const -{ - stringstream s; - - if (fPrefixName.size ()) { - s << - "-" << fPrefixName; - } - - return s.str (); -} - -string oahPrefix::prefixNamesInColumns ( - int subGroupsShortNameFieldWidth) const -{ - stringstream s; - - if (fPrefixName.size ()) { - s << left << - setw (subGroupsShortNameFieldWidth) << - "-" + fPrefixName; - } - - return s.str (); -} - -string oahPrefix::prefixNamesBetweenParentheses () const -{ - stringstream s; - - s << - "(" << - prefixNames () << - ")"; - - return s.str (); -} - -string oahPrefix::prefixNamesInColumnsBetweenParentheses ( - int subGroupsShortNameFieldWidth) const -{ - stringstream s; - - s << - "(" << - prefixNamesInColumns ( - subGroupsShortNameFieldWidth) << - ")"; - - return s.str (); -} - -void oahPrefix::printPrefixHeader (ostream& os) const -{ -/* JMI - os << - "'" << fPrefixName << - "' translates to '" << fPrefixErsatz << - "':" << - endl; -*/ - - if (fPrefixDescription.size ()) { - // indent a bit more for readability - // gIndenter++; - - os << - gIndenter.indentMultiLineString ( - fPrefixDescription) << - endl; - - // gIndenter--; - } -} - -void oahPrefix::printPrefixEssentials ( - ostream& os, - int fieldWidth) const -{ - os << left << - setw (fieldWidth) << - "prefixName" << " : " << - fPrefixName << - endl << - setw (fieldWidth) << - "prefixErsatz" << " : " << - fPrefixErsatz << - endl << - setw (fieldWidth) << - "prefixDescription" << " : " << - fPrefixDescription << - endl; -} - -void oahPrefix::print (ostream& os) const -{ - os << - "??? oahPrefix ???" << - endl; - - printPrefixEssentials (os, 40); // JMI -} - -void oahPrefix::printHelp (ostream& os) -{ - os << - prefixNames () << - endl; - - if (fPrefixErsatz.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fPrefixErsatz) << - endl; - - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } - - if (fPrefixDescription.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fPrefixDescription) << - endl; - - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } - - // register help print action in options handler upLink -// fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -ostream& operator<< (ostream& os, const S_oahPrefix& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahMultiplexBooleansAtom oahMultiplexBooleansAtom::create ( - string description, - string shortSuffixDescriptor, - string longSuffixDescriptor, - S_oahPrefix shortNamesPrefix, - S_oahPrefix longNamesPrefix) -{ - oahMultiplexBooleansAtom* o = new - oahMultiplexBooleansAtom ( - description, - shortSuffixDescriptor, - longSuffixDescriptor, - shortNamesPrefix, - longNamesPrefix); - assert(o!=0); - return o; -} - -oahMultiplexBooleansAtom::oahMultiplexBooleansAtom ( - string description, - string shortSuffixDescriptor, - string longSuffixDescriptor, - S_oahPrefix shortNamesPrefix, - S_oahPrefix longNamesPrefix) - : oahAtom ( - "unusedShortName_" + shortSuffixDescriptor + "_" + description, - // should be a unique shortName - "unusedLongName_" + longSuffixDescriptor + "_" + description, - // should be a unique longName - description), - fShortNamesPrefix ( - shortNamesPrefix), - fLongNamesPrefix ( - longNamesPrefix), - fShortSuffixDescriptor ( - shortSuffixDescriptor), - fLongSuffixDescriptor ( - longSuffixDescriptor) -{ - // sanity checks - msrAssert ( - fShortNamesPrefix != nullptr, - "fShortNamesPrefix is null"); - msrAssert ( - fLongNamesPrefix != nullptr, - "fLongNamesPrefix is null"); - - // get prefixes names - fShortNamesPrefixName = - fShortNamesPrefix->getPrefixName (); - fLongNamesPrefixName = - fLongNamesPrefix->getPrefixName (); -} - -oahMultiplexBooleansAtom::~oahMultiplexBooleansAtom () -{} - -void oahMultiplexBooleansAtom::addBooleanAtom ( - S_oahBooleanAtom booleanAtom) -{ - // sanity check - msrAssert ( - booleanAtom != nullptr, - "booleanAtom is null"); - - // short name consistency check - { - string booleanAtomShortName = - booleanAtom->getShortName (); - - std::size_t found = - booleanAtomShortName.find (fShortNamesPrefixName); - - if (found == string::npos) { - stringstream s; - - s << - "INTERNAL ERROR: option short name '" << booleanAtomShortName << - "' is different that the short names prefix name '" << - fShortNamesPrefixName << - "'"; - - booleanAtom->print (s); - - oahError (s.str ()); - } - else if (found != 0) { - stringstream s; - - s << - "INTERNAL ERROR: option short name '" << booleanAtomShortName << - "' doesn't start by the short names prefix name '" << - fShortNamesPrefixName << - "'"; - - booleanAtom->print (s); - - oahError (s.str ()); - } - else { - string booleanAtomShortNameSuffix = - booleanAtomShortName.substr ( - fShortNamesPrefixName.size ()); - - if (booleanAtomShortNameSuffix.size () == 0) { - stringstream s; - - s << - "INTERNAL ERROR: option short name '" << booleanAtomShortName << - "' is nothing more than the short names prefix name '" << - fShortNamesPrefixName << - "'"; - - booleanAtom->print (s); - - oahError (s.str ()); - } - else { - // register this boolean atom's suffix in the list - fShortNamesSuffixes.push_back (booleanAtomShortNameSuffix); - } - } - } - - // long name consistency check - { - string booleanAtomLongName = - booleanAtom->getLongName (); - - if (booleanAtomLongName.size ()) { - std::size_t found = - booleanAtomLongName.find (fLongNamesPrefixName); - - if (found == string::npos) { - stringstream s; - - s << - "INTERNAL ERROR: option long name '" << booleanAtomLongName << - "' is different that the long names prefix name '" << - fLongNamesPrefixName << - "'"; - - booleanAtom->print (s); - - oahError (s.str ()); - } - else if (found != 0) { - stringstream s; - - s << - "INTERNAL ERROR: option long name '" << booleanAtomLongName << - "' doesn't start by the long names prefix name '" << - fLongNamesPrefixName << - "'"; - - booleanAtom->print (s); - - oahError (s.str ()); - } - else { - string booleanAtomLongNameSuffix = - booleanAtomLongName.substr ( - fLongNamesPrefixName.size ()); - - if (booleanAtomLongNameSuffix.size () == 0) { - stringstream s; - - s << - "INTERNAL ERROR: option long name '" << booleanAtomLongName << - "' is nothing more than the long names prefix name '" << - fLongNamesPrefixName << - "'"; - - booleanAtom->print (s); - - oahError (s.str ()); - } - else { - // register this boolean atom's suffix in the list - fLongNamesSuffixes.push_back (booleanAtomLongNameSuffix); - } - } - } - - else { - stringstream s; - - s << - "INTERNAL ERROR: option long name '" << booleanAtomLongName << - "' is empty, atom '" << - fLongNamesPrefixName << - "' cannot be used in a multiplex booleans atom"; - - booleanAtom->print (s); - - oahError (s.str ()); - } - } - - // append the boolean atom to the list - fBooleanAtomsList.push_back ( - booleanAtom); - - // hide it - booleanAtom->setIsHidden (); -} - -void oahMultiplexBooleansAtom::addBooleanAtomByName ( - string name) -{ - // get the options handler - S_oahHandler - handler = - getSubGroupUpLink ()-> - getGroupUpLink ()-> - getHandlerUpLink (); - - // sanity check - msrAssert ( - handler != nullptr, - "handler is null"); - - // is name known in options map? - S_oahElement - element = - handler-> - fetchElementFromMap (name); - - if (! element) { - // no, name is unknown in the map - handler-> - printOptionsSummary (); - - stringstream s; - - s << - "INTERNAL ERROR: option name '" << name << - "' is unknown"; - - oahError (s.str ()); - } - - else { - // name is known, let's handle it - - if ( - // boolean atom? - S_oahBooleanAtom - atom = - dynamic_cast(&(*element)) - ) { - // add the boolean atom - addBooleanAtom (atom); - } - - else { - stringstream s; - - s << - "option name '" << name << "' is not that of an atom"; - - oahError (s.str ()); - } - } -} - -S_oahValuedAtom oahMultiplexBooleansAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahMultiplexBooleansAtom" << - endl; - } -#endif - - // handle it at once JMI ??? - - // no option value is needed - return nullptr; -} - -void oahMultiplexBooleansAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahMultiplexBooleansAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahMultiplexBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahMultiplexBooleansAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahMultiplexBooleansAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahMultiplexBooleansAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahMultiplexBooleansAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahMultiplexBooleansAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahMultiplexBooleansAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahMultiplexBooleansAtom::browseData ()" << - endl; - } -#endif - - if (fShortNamesPrefix) { - // browse the short names prefix - oahBrowser browser (v); - browser.browse (*(fShortNamesPrefix)); - } - - if (fLongNamesPrefix) { - // browse the long names prefix - oahBrowser browser (v); - browser.browse (*(fLongNamesPrefix)); - } - - // browse the boolean atoms - if (fBooleanAtomsList.size ()) { - for ( - list::const_iterator i = fBooleanAtomsList.begin (); - i != fBooleanAtomsList.end (); - i++ - ) { - S_oahBooleanAtom booleanAtom = (*i); - - // browse the boolean atom - oahBrowser browser (v); - browser.browse (*(booleanAtom)); - } // for - } -} - -void oahMultiplexBooleansAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "MultiplexBooleansAtom:" << - endl; - - gIndenter++; - - printOptionEssentials ( - os, fieldWidth); - - os << left << - "shortSuffixDescriptor" << " : " << - fShortSuffixDescriptor << - endl << - "longSuffixDescriptor" << " : " << - fLongSuffixDescriptor << - endl; - - os << left << - setw (fieldWidth) << - "shortNamesPrefix" << " : "; - if (fShortNamesPrefix) { - os << fShortNamesPrefix; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << - "longNamesPrefix" << " : "; - if (fLongNamesPrefix) { - os << fLongNamesPrefix; - } - else { - os << "null" << endl; - } - - os << left << - setw (fieldWidth) << - "fBooleanAtomsList" << " : "; - - if (! fBooleanAtomsList.size ()) { - os << "none"; - } - - else { - os << endl; - - gIndenter++; - - os << "'"; - - list::const_iterator - iBegin = fBooleanAtomsList.begin (), - iEnd = fBooleanAtomsList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << " "; - } // for - - os << "'"; - - gIndenter--; - } - - gIndenter--; - - os << endl; -} - -void oahMultiplexBooleansAtom::printHelp (ostream& os) -{ - os << - "-" << fShortNamesPrefixName << "<" << fShortSuffixDescriptor << ">" << - ", " << - "-" << fLongNamesPrefixName << "<" << fLongSuffixDescriptor << ">" << - endl; - - if (fDescription.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - } - - os << - "The " << - fShortNamesSuffixes.size () << - " known " << fShortSuffixDescriptor << "s are: "; - - if (fShortNamesSuffixes.size ()) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fShortNamesSuffixes.begin (), - iEnd = fShortNamesSuffixes.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string suffix = (*i); - - os << suffix; - - cumulatedLength += suffix.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - - if (next (i) == iEnd) { - os << " and "; - } - else { - os << ", "; - } - } // for - - os << "." << endl; - gIndenter--; - } - else { - os << - "none" << - endl; - } - - if (fLongSuffixDescriptor != fShortSuffixDescriptor) { - int longNamesSuffixesCount = 0; - - { - list::const_iterator - iBegin = fLongNamesSuffixes.begin (), - iEnd = fLongNamesSuffixes.end (), - i = iBegin; - - for ( ; ; ) { - if ((*i).size ()) { - longNamesSuffixesCount++; - } - - if (++i == iEnd) break; - } // for - } - - os << - "The " << - fLongNamesSuffixes.size () << - " -- " << longNamesSuffixesCount << - " known " << fLongSuffixDescriptor << "s are: "; - - if (fLongNamesSuffixes.size ()) { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fLongNamesSuffixes.begin (), - iEnd = fLongNamesSuffixes.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string suffix = (*i); - - os << suffix; - - cumulatedLength += suffix.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - - if (next (i) == iEnd) { - os << " and "; - } - else { - os << ", "; - } - } // for - - os << "." << endl; - gIndenter--; - } - else { - os << - "none" << - endl; - } - } - - if (fDescription.size ()) { // ??? JMI - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } - - // register help print action in options handler upLink -// fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahMultiplexBooleansAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to do, these options values will be printed - // by the boolean atoms in the list -} - -ostream& operator<< (ostream& os, const S_oahMultiplexBooleansAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -/* pure virtual class -S_oahValuedAtom oahValuedAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName) -{ - oahValuedAtom* o = new - oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName); - assert(o!=0); - return o; -} -*/ - -oahValuedAtom::oahValuedAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName) - : oahAtomWithVariableName ( - shortName, - longName, - description, - variableName) -{ - fValueSpecification = valueSpecification; - - fValueIsOptional = false; -} - -oahValuedAtom::~oahValuedAtom () -{} - -void oahValuedAtom::setValueIsOptional () -{ - fValueIsOptional = true; - -/* JMI - // a valued atom with an optional value - // should not have the same name as a prefix - // since this would create an ambiguity - if (fetchPrefixInMapByItsName (fShortName)) { - stringstream s; - - s << - "values atom short name '" << fShortName << - "' is already known as a prefix " <<; - - oahError (s.str ()); - } - if (fetchPrefixInMapByItsName (fLongName)) { - stringstream s; - - s << - "values atom long name '" << fLongName << - "' is already known as a prefix " <<; - - oahError (s.str ()); - } - */ -} - -void oahValuedAtom::handleDefaultValue () -{} - -void oahValuedAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahValuedAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahValuedAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahValuedAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahValuedAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahValuedAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahValuedAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahValuedAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahValuedAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahValuedAtom::browseData ()" << - endl; - } -#endif -} - -string oahValuedAtom::oahAtomKindAsString ( - oahValuedAtom::oahValuedAtomKind oahAtomKind) -{ - string result; - - switch (oahAtomKind) { - case oahValuedAtom::kAtomHasNoArgument: - result = "atomHasNoArgument"; - break; - case oahValuedAtom::kAtomHasARequiredArgument: - result = "atomHasARequiredArgument"; - break; - case oahValuedAtom::kAtomHasAnOptionsArgument: - result = "atomHasAnOptionsArgument"; - break; - } // switch - - return result; -} - -void oahValuedAtom::printValuedAtomEssentials ( - ostream& os, - int fieldWidth) const -{ - printOptionEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fValueSpecification" << " : " << - fValueSpecification << - endl << - setw (fieldWidth) << - "fValueIsOptional" << " : " << - booleanAsString (fValueIsOptional) << - endl; -} - -void oahValuedAtom::print (ostream& os) const -{ - const int fieldWidth = 19; - - os << - "ValuedAtom ???:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - gIndenter--; -} - -void oahValuedAtom::printHelp (ostream& os) -{ - os << - fetchNames (); - - oahOptionalValuesStyleKind - optionalValuesStyleKind = - fHandlerUpLink-> - getHandlerOptionalValuesStyleKind (); - - -if (fValueIsOptional) { - switch (optionalValuesStyleKind) { - case kOptionalValuesStyleGNU: // default value - os << - "[=" << fValueSpecification << "]"; - break; - case kOptionalValuesStyleOAH: - os << - " " << fValueSpecification; - } // switch - } - else { - os << - " " << fValueSpecification; - } - - os << endl; - - if (fDescription.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } - - // register help print action in options handler upLink // JMI -// fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahValuedAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << - "ValuedAtom values ???:" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahValuedAtom& elt) -{ - elt->print (os); - return os; -} - -// optional values style -//______________________________________________________________________________ - -map - gOahOptionalValuesStyleKindsMap; - -string oahOptionalValuesStyleKindAsString ( - oahOptionalValuesStyleKind optionalValuesStyleKind) -{ - string result; - - // no CamelCase here, these strings are used in the command line options - - switch (optionalValuesStyleKind) { - case kOptionalValuesStyleGNU: // default value - result = "gnu"; - break; - case kOptionalValuesStyleOAH: - result = "oah"; - break; - } // switch - - return result; -} - -void initializeOahOptionalValuesStyleKindsMap () -{ - // register the optional values style kinds - // -------------------------------------- - - // no CamelCase here, these strings are used in the command line options - - gOahOptionalValuesStyleKindsMap ["gnu"] = kOptionalValuesStyleGNU; - gOahOptionalValuesStyleKindsMap ["oah"] = kOptionalValuesStyleOAH; -} - -string existingOahOptionalValuesStyleKinds (int namesListMaxLength) -{ - stringstream s; - - if (gOahOptionalValuesStyleKindsMap.size ()) { - map::const_iterator - iBegin = gOahOptionalValuesStyleKindsMap.begin (), - iEnd = gOahOptionalValuesStyleKindsMap.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i).first; - - s << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - s << " and "; - } - else { - s << ", "; - } - } // for - } - - return s.str (); -} - -//______________________________________________________________________________ -S_oahIntegerAtom oahIntegerAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable) -{ - oahIntegerAtom* o = new - oahIntegerAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - integerVariable); - assert(o!=0); - return o; -} - -oahIntegerAtom::oahIntegerAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fIntegerVariable ( - integerVariable) -{} - -oahIntegerAtom::~oahIntegerAtom () -{} - -S_oahValuedAtom oahIntegerAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahIntegerAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahIntegerAtom::handleValue ( - string theString, - ostream& os) -{ - // theString contains the integer value - - // check whether it is well-formed - string regularExpression ( - "([[:digit:]]+)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for integer string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - - os << endl; - } -#endif - - if (smSize) { - // leave the low level details to the STL... - int integerValue; - { - stringstream s; - s << theString; - s >> integerValue; - } - - fIntegerVariable = integerValue; - } - - else { - stringstream s; - - s << - "integer value '" << theString << - "' for option '" << fetchNames () << - "' is ill-formed"; - - oahError (s.str ()); - } -} - -void oahIntegerAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahIntegerAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahIntegerAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahIntegerAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahIntegerAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahIntegerAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahIntegerAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahIntegerAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahIntegerAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahIntegerAtom::browseData ()" << - endl; - } -#endif -} - -string oahIntegerAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << fIntegerVariable; - - return s.str (); -} - -string oahIntegerAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << fIntegerVariable; - - return s.str (); -} - -void oahIntegerAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "IntegerAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fIntegerVariable" << " : " << - fIntegerVariable << - endl; - - gIndenter--; -} - -void oahIntegerAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - fIntegerVariable << - endl; -} - -ostream& operator<< (ostream& os, const S_oahIntegerAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahTwoIntegersAtom oahTwoIntegersAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable, - int& integerSecondaryVariable) -{ - oahTwoIntegersAtom* o = new - oahTwoIntegersAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - integerVariable, - integerSecondaryVariable); - assert(o!=0); - return o; -} - -oahTwoIntegersAtom::oahTwoIntegersAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable, - int& integerSecondaryVariable) - : oahIntegerAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - integerVariable), - fIntegerSecondaryVariable ( - integerSecondaryVariable) -{} - -oahTwoIntegersAtom::~oahTwoIntegersAtom () -{} - -S_oahValuedAtom oahTwoIntegersAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahTwoIntegersAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahTwoIntegersAtom::handleValue ( - string theString, - ostream& os) -{ - // theString contains the two integer values - - // check whether it is well-formed - string regularExpression ( - "([[:digit:]]+)[[:space:]]+([[:digit:]]+)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for integer string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - - os << endl; - } -#endif - - if (smSize == 3) { - // leave the low level details to the STL... - int integerValue; - { - stringstream s; - s << sm [ 1 ]; - s >> integerValue; - } - fIntegerVariable = integerValue; - - { - stringstream s; - s << sm [ 2 ]; - s >> integerValue; - } - fIntegerSecondaryVariable = integerValue; - } - - else { - stringstream s; - - s << - "integer value '" << theString << - "' for option '" << fetchNames () << - "' is ill-formed"; - - oahError (s.str ()); - } -} - -void oahTwoIntegersAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahTwoIntegersAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahTwoIntegersAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahTwoIntegersAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahTwoIntegersAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahTwoIntegersAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahTwoIntegersAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahTwoIntegersAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahTwoIntegersAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahTwoIntegersAtom::browseData ()" << - endl; - } -#endif -} - -string oahTwoIntegersAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << - " \"" << - fIntegerVariable << - " " << - fIntegerSecondaryVariable << - "\""; - - return s.str (); -} - -string oahTwoIntegersAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << - " \"" << - fIntegerVariable << - " " << - fIntegerSecondaryVariable << - "\""; - - return s.str (); -} - -void oahTwoIntegersAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "IntegerAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fIntegerVariable" << " : " << - fIntegerVariable << - endl << - setw (fieldWidth) << - "fIntegerSecondaryVariable" << " : " << - fIntegerSecondaryVariable << - endl; - - gIndenter--; -} - -void oahTwoIntegersAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - "\"" << - fIntegerVariable << - " " << - fIntegerSecondaryVariable << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahTwoIntegersAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahFloatAtom oahFloatAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - float& floatVariable) -{ - oahFloatAtom* o = new - oahFloatAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - floatVariable); - assert(o!=0); - return o; -} - -oahFloatAtom::oahFloatAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - float& floatVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fFloatVariable ( - floatVariable) -{} - -oahFloatAtom::~oahFloatAtom () -{} - -S_oahValuedAtom oahFloatAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahFloatAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahFloatAtom::handleValue ( - string theString, - ostream& os) -{ - // theString contains the float value - - // check whether it is well-formed - string regularExpression ( - // no sign, a '-' would be handled as an option name JMI "([+|-]?)" - "([[:digit:]]+)(.[[:digit:]]*)?" - ); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for float string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - - os << endl; - } -#endif - - if (smSize == 3) { - // leave the low level details to the STL... - float floatValue; - { - stringstream s; - - s << sm [ 0 ]; - s >> floatValue; - } - - fFloatVariable = floatValue; - } - - else { - stringstream s; - - s << - "float value '" << theString << - "' for option '" << fetchNames () << - "' is ill-formed"; - - oahError (s.str ()); - } -} - -void oahFloatAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahFloatAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahFloatAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahFloatAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahFloatAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahFloatAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahFloatAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahFloatAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahFloatAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahFloatAtom::browseData ()" << - endl; - } -#endif -} - -string oahFloatAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << fFloatVariable; - - return s.str (); -} - -string oahFloatAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << fFloatVariable; - - return s.str (); -} - -void oahFloatAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "FloatAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fFloatVariable" << " : " << - fFloatVariable << - endl; - - gIndenter--; -} - -void oahFloatAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - fFloatVariable << - endl; -} - -ostream& operator<< (ostream& os, const S_oahFloatAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahStringAtom oahStringAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable) -{ - oahStringAtom* o = new - oahStringAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringVariable); - assert(o!=0); - return o; -} - -oahStringAtom::oahStringAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringVariable ( - stringVariable) -{} - -oahStringAtom::~oahStringAtom () -{} - -S_oahValuedAtom oahStringAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahStringAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahStringAtom::handleValue ( - string theString, - ostream& os) -{ - fStringVariable = theString; -} - -void oahStringAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahStringAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahStringAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAtom::browseData ()" << - endl; - } -#endif -} - -string oahStringAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " '" << fStringVariable << "'"; - - return s.str (); -} - -string oahStringAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " '" << fStringVariable << "'"; - - return s.str (); -} - -void oahStringAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "StringAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fStringVariable" << " : " << - fStringVariable << - endl; - - gIndenter--; -} - -void oahStringAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - fStringVariable << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahStringAtom& elt) -{ - os << - "StringAtom:" << - endl; - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahMonoplexStringAtom oahMonoplexStringAtom::create ( - string description, - string atomNameDescriptor, - string stringValueDescriptor) -{ - oahMonoplexStringAtom* o = new - oahMonoplexStringAtom ( - description, - atomNameDescriptor, - stringValueDescriptor); - assert(o!=0); - return o; -} - -oahMonoplexStringAtom::oahMonoplexStringAtom ( - string description, - string atomNameDescriptor, - string stringValueDescriptor) - : oahAtom ( - "unusedShortName_" + atomNameDescriptor + "_" + description, - // should be a unique shortName - "unusedLongName_" + atomNameDescriptor + "_" + description, - // should be a unique longName - description), - fAtomNameDescriptor ( - atomNameDescriptor), - fStringValueDescriptor ( - stringValueDescriptor) -{ - // sanity checks - msrAssert ( - stringValueDescriptor.size (), - "stringValueDescriptor is empty"); - msrAssert ( - stringValueDescriptor.size (), - "stringValueDescriptor is empty"); -} - -oahMonoplexStringAtom::~oahMonoplexStringAtom () -{} - -void oahMonoplexStringAtom::addStringAtom ( - S_oahStringAtom stringAtom) -{ - // sanity check - msrAssert ( - stringAtom != nullptr, - "stringAtom is null"); - - // atom short name consistency check - { - string stringAtomShortName = - stringAtom->getShortName (); - - if (stringAtomShortName.size () == 0) { - stringstream s; - - s << - "INTERNAL ERROR: option short name '" << stringAtomShortName << - "' is empty"; - - stringAtom->print (s); - - oahError (s.str ()); - } - else { - // register this string atom's suffix in the list - fAtomNamesList.push_back (stringAtomShortName); - } - } - - // atom long name consistency check - { - string stringAtomLongName = - stringAtom->getLongName (); - - if (stringAtomLongName.size () != 0) { - stringstream s; - - s << - "INTERNAL ERROR: option long name '" << stringAtomLongName << - "' is not empty"; - - stringAtom->print (s); - - oahError (s.str ()); - } - } - - // append the string atom to the list - fStringAtomsList.push_back ( - stringAtom); - - // hide it - stringAtom->setIsHidden (); -} - -void oahMonoplexStringAtom::addStringAtomByName ( - string name) -{ - // get the options handler - S_oahHandler - handler = - getSubGroupUpLink ()-> - getGroupUpLink ()-> - getHandlerUpLink (); - - // sanity check - msrAssert ( - handler != nullptr, - "handler is null"); - - // is name known in options map? - S_oahElement - element = - handler-> - fetchElementFromMap (name); - - if (! element) { - // no, name is unknown in the map - handler-> - printOptionsSummary (); - - stringstream s; - - s << - "INTERNAL ERROR: option name '" << name << - "' is unknown"; - - oahError (s.str ()); - } - - else { - // name is known, let's handle it - - if ( - // string atom? - S_oahStringAtom - atom = - dynamic_cast(&(*element)) - ) { - // add the string atom - addStringAtom (atom); - } - - else { - stringstream s; - - s << - "option name '" << name << "' is not that of an atom"; - - oahError (s.str ()); - } - } -} - -S_oahValuedAtom oahMonoplexStringAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahMonoplexStringAtom" << - endl; - } -#endif - - // handle it at once JMI ??? - - // no option value is needed - return nullptr; -} - -void oahMonoplexStringAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahMonoplexStringAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahMonoplexStringAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahMonoplexStringAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahMonoplexStringAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahMonoplexStringAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahMonoplexStringAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahMonoplexStringAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahMonoplexStringAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahMonoplexStringAtom::browseData ()" << - endl; - } -#endif - - // browse the string atoms - if (fStringAtomsList.size ()) { - for ( - list::const_iterator i = fStringAtomsList.begin (); - i != fStringAtomsList.end (); - i++ - ) { - S_oahStringAtom stringAtom = (*i); - - // browse the string atom - oahBrowser browser (v); - browser.browse (*(stringAtom)); - } // for - } -} - -void oahMonoplexStringAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "MonoplexStringAtom:" << - endl; - - gIndenter++; - - printOptionEssentials ( - os, fieldWidth); - - os << left << - "atomNameDescriptor" << " : " << - fAtomNameDescriptor << - endl << - "stringValueDescriptor" << " : " << - fStringValueDescriptor << - endl; - - os << left << - setw (fieldWidth) << - "fStringAtomsList" << " : "; - - if (! fStringAtomsList.size ()) { - os << "none"; - } - - else { - os << endl; - - gIndenter++; - - os << "'"; - - list::const_iterator - iBegin = fStringAtomsList.begin (), - iEnd = fStringAtomsList.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << " "; - } // for - - os << "'"; - - gIndenter--; - } - - gIndenter--; - - os << endl; -} - -void oahMonoplexStringAtom::printHelp (ostream& os) -{ - os << - "-" << fAtomNameDescriptor << " " << fStringValueDescriptor << - endl; - - if (fDescription.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - } - - os << - "The " << - fAtomNamesList.size () << - " known " << fAtomNameDescriptor << "s are: "; - - if (! fAtomNamesList.size ()) { - os << - "none" << - endl; - } - else { - os << endl; - gIndenter++; - - list::const_iterator - iBegin = fAtomNamesList.begin (), - iEnd = fAtomNamesList.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string suffix = (*i); - - os << suffix; - - cumulatedLength += suffix.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - if (next (i) == iEnd) { - os << " and "; - } - else { - os << ", "; - } - } // for - - os << "." << endl; - gIndenter--; - } - - if (fDescription.size ()) { // ??? JMI - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } - - // register help print action in options handler upLink -// fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahMonoplexStringAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to do, these options values will be printed - // by the string atoms in the list -} - -ostream& operator<< (ostream& os, const S_oahMonoplexStringAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahStringWithDefaultValueAtom oahStringWithDefaultValueAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultStringValue) -{ - oahStringWithDefaultValueAtom* o = new - oahStringWithDefaultValueAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringVariable, - defaultStringValue); - assert(o!=0); - return o; -} - -oahStringWithDefaultValueAtom::oahStringWithDefaultValueAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultStringValue) - : oahStringAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringVariable), - fDefaultStringValue ( - defaultStringValue) -{ - setValueIsOptional (); -} - -oahStringWithDefaultValueAtom::~oahStringWithDefaultValueAtom () -{} - -S_oahValuedAtom oahStringWithDefaultValueAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahStringWithDefaultValueAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahStringWithDefaultValueAtom::handleValue ( - string theString, - ostream& os) -{ - oahStringAtom::handleValue (theString, os); // JMI ??? -} - -void oahStringWithDefaultValueAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringWithDefaultValueAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringWithDefaultValueAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringWithDefaultValueAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahStringWithDefaultValueAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringWithDefaultValueAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringWithDefaultValueAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringWithDefaultValueAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahStringWithDefaultValueAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringWithDefaultValueAtom::browseData ()" << - endl; - } -#endif -} - -string oahStringWithDefaultValueAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << fStringVariable; - - return s.str (); -} - -string oahStringWithDefaultValueAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << fStringVariable; - - return s.str (); -} - -void oahStringWithDefaultValueAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "StringWithDefaultValueAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fStringVariable" << " : " << - fStringVariable << - endl; - - gIndenter--; -} - -void oahStringWithDefaultValueAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - fStringVariable << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahStringWithDefaultValueAtom& elt) -{ - os << - "StringWithDefaultValueAtom:" << - endl; - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahRationalAtom oahRationalAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - rational& rationalVariable) -{ - oahRationalAtom* o = new - oahRationalAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - rationalVariable); - assert(o!=0); - return o; -} - -oahRationalAtom::oahRationalAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - rational& rationalVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fRationalVariable ( - rationalVariable) -{} - -oahRationalAtom::~oahRationalAtom () -{} - -S_oahValuedAtom oahRationalAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahRationalAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahRationalAtom::handleValue ( - string theString, - ostream& os) -{ - - // theString contains the fraction: - // decipher it to extract numerator and denominator values - - string regularExpression ( - "[[:space:]]*([[:digit:]]+)[[:space:]]*" - "/" - "[[:space:]]*([[:digit:]]+)[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for rational string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - - os << endl; - } -#endif - - if (smSize == 3) { // JMI ??? - int - numerator, - denominator; - - { - stringstream s; - s << sm [1]; - s >> numerator; - } - { - stringstream s; - s << sm [2]; - s >> denominator; - } - - rational - rationalValue = - rational (numerator, denominator); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "rationalValue = " << - rationalValue << - endl; - } -#endif - - fRationalVariable = rationalValue; - } - - else { - stringstream s; - - s << - "rational atom value '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } -} - -void oahRationalAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahRationalAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahRationalAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahRationalAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahRationalAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahRationalAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahRationalAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahRationalAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahRationalAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahRationalAtom::browseData ()" << - endl; - } -#endif -} - -string oahRationalAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << fRationalVariable; - - return s.str (); -} - -string oahRationalAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << fRationalVariable; - - return s.str (); -} - -void oahRationalAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "RationalAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fRationalVariable" << " : " << - fRationalVariable << - endl; - - gIndenter--; -} - -void oahRationalAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - fRationalVariable << - endl; -} - -ostream& operator<< (ostream& os, const S_oahRationalAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahNaturalNumbersSetAtom oahNaturalNumbersSetAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& naturalNumbersSetVariable) -{ - oahNaturalNumbersSetAtom* o = new - oahNaturalNumbersSetAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - naturalNumbersSetVariable); - assert(o!=0); - return o; -} - -oahNaturalNumbersSetAtom::oahNaturalNumbersSetAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& naturalNumbersSetVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fNaturalNumbersSetVariable ( - naturalNumbersSetVariable) -{} - -oahNaturalNumbersSetAtom::~oahNaturalNumbersSetAtom () -{} - -S_oahValuedAtom oahNaturalNumbersSetAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahNaturalNumbersSetAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahNaturalNumbersSetAtom::handleValue ( - string theString, - ostream& os) -{ - fNaturalNumbersSetVariable = - decipherNaturalNumbersSetSpecification ( - theString, - false); // 'true' to debug it -} - -void oahNaturalNumbersSetAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahNaturalNumbersSetAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahNaturalNumbersSetAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahNaturalNumbersSetAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahNaturalNumbersSetAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahNaturalNumbersSetAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahNaturalNumbersSetAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahNaturalNumbersSetAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahNaturalNumbersSetAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahNaturalNumbersSetAtom::browseData ()" << - endl; - } -#endif -} - -string oahNaturalNumbersSetAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - "["; - - set::const_iterator - iBegin = fNaturalNumbersSetVariable.begin (), - iEnd = fNaturalNumbersSetVariable.end (), - i = iBegin; - - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << " "; - } // for - - s << - "]"; - - return s.str (); -} - -string oahNaturalNumbersSetAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - "["; - - set::const_iterator - iBegin = fNaturalNumbersSetVariable.begin (), - iEnd = fNaturalNumbersSetVariable.end (), - i = iBegin; - - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << " "; - } // for - - s << - "]"; - - return s.str (); -} - -void oahNaturalNumbersSetAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "NaturalNumbersSetAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fNaturalNumbersSetVariable" << " : " << - endl; - - if (! fNaturalNumbersSetVariable.size ()) { - os << - "none"; - } - - else { - os << - "'"; - - set::const_iterator - iBegin = fNaturalNumbersSetVariable.begin (), - iEnd = fNaturalNumbersSetVariable.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << " "; - } // for - - os << - "'"; - } - - os << endl; - - gIndenter--; -} - -void oahNaturalNumbersSetAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fNaturalNumbersSetVariable.size ()) { - os << - "none"; - } - - else { - os << - "'"; - - set::const_iterator - iBegin = fNaturalNumbersSetVariable.begin (), - iEnd = fNaturalNumbersSetVariable.end (), - i = iBegin; - - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << " "; - } // for - - os << - "'"; - } - - os << endl; -} - -ostream& operator<< (ostream& os, const S_oahNaturalNumbersSetAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahRGBColorAtom oahRGBColorAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrRGBColor& RGBColorVariable, - bool& hasBeenSetVariable) -{ - oahRGBColorAtom* o = new - oahRGBColorAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - RGBColorVariable, - hasBeenSetVariable); - assert(o!=0); - return o; -} - -oahRGBColorAtom::oahRGBColorAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrRGBColor& RGBColorVariable, - bool& hasBeenSetVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fRGBColorVariable ( - RGBColorVariable), - fHasBeenSetVariable ( - hasBeenSetVariable) -{ - fHasBeenSetVariable = false; - - fMultipleOccurrencesAllowed = true; -} - -oahRGBColorAtom::~oahRGBColorAtom () -{} - -S_oahValuedAtom oahRGBColorAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahRGBColorAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahRGBColorAtom::handleValue ( - string theString, - ostream& os) -{ - fRGBColorVariable = msrRGBColor (theString); - fHasBeenSetVariable = true; -} - -void oahRGBColorAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahRGBColorAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahRGBColorAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahRGBColorAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahRGBColorAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahRGBColorAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahRGBColorAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahRGBColorAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahRGBColorAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahRGBColorAtom::browseData ()" << - endl; - } -#endif -} - -string oahRGBColorAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - "[" << - fRGBColorVariable.asString () << - "]"; - - return s.str (); -} - -string oahRGBColorAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - "[" << - fRGBColorVariable.asString () << - "]"; - - return s.str (); -} - -void oahRGBColorAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "RGBColorAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fRGBColorVariable" << " : " << - fRGBColorVariable.asString () << - "fHasBeenSetVariable" << " : " << - booleanAsString (fHasBeenSetVariable) << - endl; - - gIndenter--; -} - -void oahRGBColorAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - fRGBColorVariable.asString () << - endl << - setw (valueFieldWidth) << - "hasBeenSetVariable" << - " : " << - fRGBColorVariable.asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_oahRGBColorAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahIntSetAtom oahIntSetAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& intSetVariable) -{ - oahIntSetAtom* o = new - oahIntSetAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - intSetVariable); - assert(o!=0); - return o; -} - -oahIntSetAtom::oahIntSetAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& intSetVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fIntSetVariable ( - intSetVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -oahIntSetAtom::~oahIntSetAtom () -{} - -S_oahValuedAtom oahIntSetAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahIntSetAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahIntSetAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahIntSetAtom'" << - endl; - } -#endif - - // theString contains the bar number specification - // decipher it to extract duration and perSecond values - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahIntSetAtom'" << - endl; - } -#endif - - string regularExpression ( - "([[:digit:]]+)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for reset measure number string '" << theString << - "' with regex '" << regularExpression << - "':" << - endl; - - gIndenter++; - - for (unsigned i = 0; i < smSize; ++i) { - os << - i << ": " << "\"" << sm [i] << "\"" << - endl; - } // for - os << endl; - - gIndenter--; - } -#endif - - if (smSize != 2) { - stringstream s; - - s << - "-boxAroundBarNumber argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - int lilypondMeasureNumber; - { - stringstream s; - s << sm [1]; - s >> lilypondMeasureNumber; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "lilypondMeasureNumber = " << - lilypondMeasureNumber << - endl; - } -#endif - - fIntSetVariable.insert (lilypondMeasureNumber); -} - -void oahIntSetAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahIntSetAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahIntSetAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahIntSetAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahIntSetAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahIntSetAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahIntSetAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahIntSetAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahIntSetAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahIntSetAtom::browseData ()" << - endl; - } -#endif -} - -string oahIntSetAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - if (! fIntSetVariable.size ()) { - s << "empty"; - } - else { - set::const_iterator - iBegin = fIntSetVariable.begin (), - iEnd = fIntSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -string oahIntSetAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - if (! fIntSetVariable.size ()) { - s << "empty"; - } - else { - set::const_iterator - iBegin = fIntSetVariable.begin (), - iEnd = fIntSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -void oahIntSetAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "oahIntSetAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fIntSetVariable" << " : '" << - endl; - - if (! fIntSetVariable.size ()) { - os << "empty"; - } - else { - set::const_iterator - iBegin = fIntSetVariable.begin (), - iEnd = fIntSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; - - gIndenter--; -} - -void oahIntSetAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fIntSetVariable.size ()) { - os << - "empty" << - endl; - } - else { - os << endl; - gIndenter++; - - set::const_iterator - iBegin = fIntSetVariable.begin (), - iEnd = fIntSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i) << endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_oahIntSetAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahStringSetAtom oahStringSetAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable) -{ - oahStringSetAtom* o = new - oahStringSetAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringSetVariable); - assert(o!=0); - return o; -} - -oahStringSetAtom::oahStringSetAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringSetVariable ( - stringSetVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -oahStringSetAtom::~oahStringSetAtom () -{} - -S_oahValuedAtom oahStringSetAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a oahStringSetAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahStringSetAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahStringSetAtom'" << - endl; - } -#endif - - // theString contains the name of the part to be omitted - - string partName = theString; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "--> partName = \"" << partName << "\", " << - endl; - } -#endif - - // is this part name in the part renaming map? - set::iterator - it = - fStringSetVariable.find (partName); - - if (it != fStringSetVariable.end ()) { - // yes, issue error message - stringstream s; - - s << - "Part \"" << partName << "\" occurs more that once" << - "in the '--msr-omit-part' option"; - - oahError (s.str ()); - } - - else { - fStringSetVariable.insert (partName); - } -} - -void oahStringSetAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahStringSetAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringSetAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching oahStringSetAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahStringSetAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahStringSetAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringSetAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching oahStringSetAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahStringSetAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahStringSetAtom::browseData ()" << - endl; - } -#endif -} - -string oahStringSetAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - if (! fStringSetVariable.size ()) { - s << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -string oahStringSetAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - if (! fStringSetVariable.size ()) { - s << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -void oahStringSetAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "oahStringSetAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringSetVariable" << " : " << - endl; - - if (! fStringSetVariable.size ()) { - os << "none"; - } - else { - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; -} - -void oahStringSetAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fStringSetVariable.size ()) { - os << - "none" << - endl; - } - else { - os << endl; - - gIndenter++; - - set::const_iterator - iBegin = fStringSetVariable.begin (), - iEnd = fStringSetVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - "\"" << (*i) << "\"" << - endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_oahStringSetAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahStringToIntMapAtom oahStringToIntMapAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringToIntMapVariable) -{ - oahStringToIntMapAtom* o = new - oahStringToIntMapAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringToIntMapVariable); - assert(o!=0); - return o; -} - -oahStringToIntMapAtom::oahStringToIntMapAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringToIntMapVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringToIntMapVariable ( - stringToIntMapVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -oahStringToIntMapAtom::~oahStringToIntMapAtom () -{} - -S_oahValuedAtom oahStringToIntMapAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahStringToIntMapAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahStringToIntMapAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahStringToIntMapAtom'" << - endl; - } -#endif - - // theString contains the string int map specification - // decipher it to extract duration and perSecond values - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahStringToIntMapAtom'" << - endl; - } -#endif - - string regularExpression ( - "[[:space:]]*" - "([[:w:]]+)" - "[[:space:]]*" -// "=" JMI -// "[[:space:]]*" - "([[:digit:]]+)" - "[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for reset measure number string '" << theString << - "' with regex '" << regularExpression << - "':" << - endl; - - gIndenter++; - - for (unsigned i = 0; i < smSize; ++i) { - os << - i << ": " << "\"" << sm [i] << "\"" << - endl; - } // for - os << endl; - - gIndenter--; - } -#endif - - if (smSize != 3) { - stringstream s; - - s << - "-resetMeasureElementMeasureNumber argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string musicXMLMeasureNumber = sm [1]; - - int lilypondMeasureNumber; - { - stringstream s; - s << sm [2]; - s >> lilypondMeasureNumber; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "musicXMLMeasureNumber = " << - musicXMLMeasureNumber << - endl << - "lilypondMeasureNumber = " << - lilypondMeasureNumber << - endl; - } -#endif - - fStringToIntMapVariable [musicXMLMeasureNumber] = lilypondMeasureNumber; -} - -void oahStringToIntMapAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringToIntMapAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringToIntMapAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringToIntMapAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahStringToIntMapAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringToIntMapAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringToIntMapAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringToIntMapAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahStringToIntMapAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringToIntMapAtom::browseData ()" << - endl; - } -#endif -} - -string oahStringToIntMapAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " "; - - if (! fStringToIntMapVariable.size ()) { - s << "empty"; - } - else { - map::const_iterator - iBegin = fStringToIntMapVariable.begin (), - iEnd = fStringToIntMapVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -string oahStringToIntMapAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " "; - - if (! fStringToIntMapVariable.size ()) { - s << "empty"; - } - else { - map::const_iterator - iBegin = fStringToIntMapVariable.begin (), - iEnd = fStringToIntMapVariable.end (), - i = iBegin; - for ( ; ; ) { - s << (*i).first << "=" << (*i).second; - if (++i == iEnd) break; - s << ","; - } // for - } - - return s.str (); -} - -void oahStringToIntMapAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsResetMeasureElementMeasureNumberAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringSetVariable" << " : '" << - endl; - - if (! fStringToIntMapVariable.size ()) { - os << "empty"; - } - else { - map::const_iterator - iBegin = fStringToIntMapVariable.begin (), - iEnd = fStringToIntMapVariable.end (), - i = iBegin; - for ( ; ; ) { - os << (*i).first << " --> " << (*i).second; - if (++i == iEnd) break; - os << endl; - } // for - } - - os << endl; - - gIndenter--; -} - -void oahStringToIntMapAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : "; - - if (! fStringToIntMapVariable.size ()) { - os << - "empty" << - endl; - } - else { - os << endl; - gIndenter++; - - map::const_iterator - iBegin = fStringToIntMapVariable.begin (), - iEnd = fStringToIntMapVariable.end (), - i = iBegin; - for ( ; ; ) { - os << - "\"" << - (*i).first << - "\" --> \"" << - (*i).second << - "\"" << - endl; - if (++i == iEnd) break; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_oahStringToIntMapAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahStringAndIntegerAtom oahStringAndIntegerAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string stringVariableName, - string& stringVariable, - string integerVariableName, - int& integerVariable) -{ - oahStringAndIntegerAtom* o = new - oahStringAndIntegerAtom ( - shortName, - longName, - description, - valueSpecification, - stringVariableName, - stringVariable, - integerVariableName, - integerVariable); - assert(o!=0); - return o; -} - -oahStringAndIntegerAtom::oahStringAndIntegerAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string stringVariableName, - string& stringVariable, - string integerVariableName, - int& integerVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - stringVariableName), - fStringVariableName ( - stringVariableName), - fStringVariable ( - stringVariable), - fIntegerVariableName ( - integerVariableName), - fIntegerVariable ( - integerVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -oahStringAndIntegerAtom::~oahStringAndIntegerAtom () -{} - -S_oahValuedAtom oahStringAndIntegerAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahStringAndIntegerAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahStringAndIntegerAtom::handleValue ( - string theString, - ostream& os) -{ - // theString contains the string and integer values - - // check whether it is well-formed - string regularExpression ( - "(.+)[[:space:]]+([[:digit:]]+)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for integer string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - - os << endl; - } -#endif - - if (smSize == 3) { - fStringVariable = sm [ 1 ]; - - // leave the low level details to the STL... - int integerValue; - { - stringstream s; - s << sm [ 2 ]; - s >> integerValue; - } - fIntegerVariable = integerValue; - } - - else { - stringstream s; - - s << - "integer value '" << theString << - "' for option '" << fetchNames () << - "' is ill-formed"; - - oahError (s.str ()); - } -} - -void oahStringAndIntegerAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAndIntegerAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringAndIntegerAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringAndIntegerAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahStringAndIntegerAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAndIntegerAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringAndIntegerAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringAndIntegerAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahStringAndIntegerAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAndIntegerAtom::browseData ()" << - endl; - } -#endif -} - -string oahStringAndIntegerAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - "\"" << - fStringVariable << - "\" " << - fIntegerVariable; - - return s.str (); -} - -string oahStringAndIntegerAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - "\"" << - fStringVariable << - "\" " << - fIntegerVariable; - - return s.str (); -} - -void oahStringAndIntegerAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "StringAndIntegerAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "stringVariableName" << " : " << - fStringVariableName << - endl << - setw (fieldWidth) << - "stringVariable" << " : " << - "\"" << fStringVariable << "\"" << - endl << - - setw (fieldWidth) << - "integerVariableName" << " : " << - fIntegerVariableName << - endl << - setw (fieldWidth) << - "integerVariable" << " : " << - fIntegerVariable << - endl; - - gIndenter--; -} - -void oahStringAndIntegerAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fStringVariableName << - " : " << - "\"" << fStringVariable << "\"" << - endl << - - setw (valueFieldWidth) << - fIntegerVariableName << - " : " << - "\"" << fIntegerVariable << "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahStringAndIntegerAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahStringAndTwoIntegersAtom oahStringAndTwoIntegersAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - int& primaryIntegerVariable, - int& secondaryIntegerVariable) -{ - oahStringAndTwoIntegersAtom* o = new - oahStringAndTwoIntegersAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringVariable, - primaryIntegerVariable, - secondaryIntegerVariable); - assert(o!=0); - return o; -} - -oahStringAndTwoIntegersAtom::oahStringAndTwoIntegersAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - int& primaryIntegerVariable, - int& secondaryIntegerVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fStringVariable ( - stringVariable), - fPrimaryIntegerVariable ( - primaryIntegerVariable), - fSecondaryIntegerVariable ( - secondaryIntegerVariable) -{ - fMultipleOccurrencesAllowed = true; -} - -oahStringAndTwoIntegersAtom::~oahStringAndTwoIntegersAtom () -{} - -S_oahValuedAtom oahStringAndTwoIntegersAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahStringAndTwoIntegersAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahStringAndTwoIntegersAtom::handleValue ( - string theString, - ostream& os) -{ - // theString contains the string and integer values - - // check whether it is well-formed - string regularExpression ( - "([[:alpha:]]+)[[:space:]]+([[:digit:]]+)[[:space:]]+([[:digit:]]+)"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for integer string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - - os << endl; - } -#endif - - if (smSize == 4) { - fStringVariable = sm [ 1 ]; - - // leave the low level details to the STL... - int integerValue; - { - stringstream s; - s << sm [ 2 ]; - s >> integerValue; - } - fPrimaryIntegerVariable = integerValue; // JMI - - { - stringstream s; - s << sm [ 3 ]; - s >> integerValue; - } - fSecondaryIntegerVariable = integerValue; - } - - else { - stringstream s; - - s << - "integer value '" << theString << - "' for option '" << fetchNames () << - "' is ill-formed"; - - oahError (s.str ()); - } -} - -void oahStringAndTwoIntegersAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAndTwoIntegersAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringAndTwoIntegersAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringAndTwoIntegersAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahStringAndTwoIntegersAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAndTwoIntegersAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahStringAndTwoIntegersAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahStringAndTwoIntegersAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahStringAndTwoIntegersAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahStringAndTwoIntegersAtom::browseData ()" << - endl; - } -#endif -} - -string oahStringAndTwoIntegersAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - "\"" << - fStringVariable << - "\" " << - fPrimaryIntegerVariable << - " " << - fSecondaryIntegerVariable; - - return s.str (); -} - -string oahStringAndTwoIntegersAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - "\"" << - fStringVariable << - "\" " << - fPrimaryIntegerVariable << - " " << - fSecondaryIntegerVariable; - - return s.str (); -} - -void oahStringAndTwoIntegersAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "StringAndIntegerAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fStringVariable" << " : " << - "\"" << fStringVariable << "\"" << - "fPrimaryIntegerVariable" << " : " << - fPrimaryIntegerVariable << - "fSecondaryIntegerVariable" << " : " << - fSecondaryIntegerVariable << - endl; - - gIndenter--; -} - -void oahStringAndTwoIntegersAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - "\"" << fStringVariable << "\"" << - endl << - setw (valueFieldWidth) << - "stringVariable" << - " : " << - "\"" << fStringVariable << "\"" << - endl << - setw (valueFieldWidth) << - "primaryIntegerVariable" << - " : " << - fPrimaryIntegerVariable << - endl << - setw (valueFieldWidth) << - "secondaryIntegerVariable" << - " : " << - fSecondaryIntegerVariable << - endl; -} - -ostream& operator<< (ostream& os, const S_oahStringAndTwoIntegersAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahLengthUnitKindAtom oahLengthUnitKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLengthUnitKind& lengthUnitKindVariable) -{ - oahLengthUnitKindAtom* o = new - oahLengthUnitKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lengthUnitKindVariable); - assert(o!=0); - return o; -} - -oahLengthUnitKindAtom::oahLengthUnitKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLengthUnitKind& lengthUnitKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLengthUnitKindVariable ( - lengthUnitKindVariable) -{} - -oahLengthUnitKindAtom::~oahLengthUnitKindAtom () -{} - -S_oahValuedAtom oahLengthUnitKindAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahLengthUnitKindAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahLengthUnitKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahLengthUnitKindAtom'" << - endl; - } -#endif - - // theString contains the score output kind: - // is it in the score output kinds map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahLengthUnitKindAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gMsrLengthUnitKindsMap.find ( - theString); - - if (it == gMsrLengthUnitKindsMap.end ()) { - // no, score output kind is unknown in the map - - stringstream s; - - s << - "LPSR score output kind '" << theString << - "' is unknown" << - endl << - "The " << - gMsrLengthUnitKindsMap.size () << - " known LPSR score output kinds are:" << - endl; - - gIndenter++; - - s << - existingMsrLengthUnitKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setLengthUnitKindVariable ( - (*it).second); -} - -void oahLengthUnitKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahLengthUnitKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahLengthUnitKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahLengthUnitKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahLengthUnitKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahLengthUnitKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahLengthUnitKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahLengthUnitKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahLengthUnitKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahLengthUnitKindAtom::browseData ()" << - endl; - } -#endif -} - -string oahLengthUnitKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - msrLengthUnitKindAsString (fLengthUnitKindVariable); - - return s.str (); -} - -string oahLengthUnitKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - msrLengthUnitKindAsString (fLengthUnitKindVariable); - - return s.str (); -} - -void oahLengthUnitKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsMsrLengthUnitKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fOptionsLengthUnitKindVariable" << " : \"" << - msrLengthUnitKindAsString ( - fLengthUnitKindVariable) << - "\"" << - endl; -} - -void oahLengthUnitKindAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : \"" << - msrLengthUnitKindAsString ( - fLengthUnitKindVariable) << - "\"" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahLengthUnitKindAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahLengthAtom oahLengthAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLength& lengthVariable) -{ - oahLengthAtom* o = new - oahLengthAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - lengthVariable); - assert(o!=0); - return o; -} - -oahLengthAtom::oahLengthAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLength& lengthVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fLengthVariable ( - lengthVariable) -{} - -oahLengthAtom::~oahLengthAtom () -{} - -S_oahValuedAtom oahLengthAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahLengthAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahLengthAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahLengthAtom'" << - endl; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahLengthAtom'" << - endl; - } -#endif - - // theString contains the score output kind: - - // check whether it is well-formed - // no sign, a '-' would be handled as an option name JMI "([+|-]?)" - string regularExpression ( - "([[:digit:]]+)(.[[:digit:]]*)?([[:alpha:]]{2,})" - ); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for integer string '" << theString << - "' with regex '" << regularExpression << - "'" << - endl; - - for (unsigned i = 0; i < smSize; ++i) { - os << - "[" << sm [i] << "] "; - } // for - - os << endl; - } -#endif - - if (smSize == 4) { - // leave the low level details to the STL... - float floatValue; - { - stringstream s; - // concatenate the integer and decimal parts - s << sm [ 1 ] << sm [ 2 ]; - s >> floatValue; - } - - string lengthUnitName = sm [ 3 ]; - - // is lengthUnitName known in the the length unit names map? - map::const_iterator - it = - gMsrLengthUnitKindsMap.find ( - lengthUnitName); - - if (it == gMsrLengthUnitKindsMap.end ()) { - // no, length unit name is unknown in the map - - stringstream s; - - s << - "length unit name '" << lengthUnitName << - "' is unknown" << - endl << - "The " << - gMsrLengthUnitKindsMap.size () << - " known length unit names are:" << - endl; - - gIndenter++; - - s << - existingMsrLengthUnitKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setLengthVariable ( - msrLength ( - (*it).second, - floatValue)); - } - - else { - stringstream s; - - s << - "length value '" << theString << - "' for option '" << fetchNames () << - "' is ill-formed"; - - oahError (s.str ()); - } -} - -void oahLengthAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahLengthAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahLengthAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahLengthAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahLengthAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahLengthAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahLengthAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahLengthAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahLengthAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahLengthAtom::browseData ()" << - endl; - } -#endif -} - -string oahLengthAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - fLengthVariable.asString (); - - return s.str (); -} - -string oahLengthAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - fLengthVariable.asString (); - - return s.str (); -} - -void oahLengthAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsMsrLengthAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fOptionsLengthVariable" << " : " << - fLengthVariable.asString () << - endl; -} - -void oahLengthAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : " << - fLengthVariable.asString () << - endl; -} - -ostream& operator<< (ostream& os, const S_oahLengthAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahMidiTempoAtom oahMidiTempoAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrMidiTempo& midiTempoVariable) -{ - oahMidiTempoAtom* o = new - oahMidiTempoAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - midiTempoVariable); - assert(o!=0); - return o; -} - -oahMidiTempoAtom::oahMidiTempoAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrMidiTempo& midiTempoVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fMidiTempoAtomVariable ( - midiTempoVariable) -{} - -oahMidiTempoAtom::~oahMidiTempoAtom () -{} - -S_oahValuedAtom oahMidiTempoAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a oahMidiTempoAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahMidiTempoAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahMidiTempoAtom'" << - endl; - } -#endif - - // theString contains the midi tempo specification - // decipher it to extract duration and perSecond values - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahMidiTempoAtom'" << - endl; - } -#endif - - string regularExpression ( - "[[:space:]]*" - "([[:digit:]]+\\.*)" - "[[:space:]]*" - "=" - "[[:space:]]*" - "([[:digit:]]+)" - "[[:space:]]*"); - - regex e (regularExpression); - smatch sm; - - regex_match (theString, sm, e); - - unsigned smSize = sm.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "There are " << smSize << " matches" << - " for MIDI tempo string '" << theString << - "' with regex '" << regularExpression << - "':" << - endl; - - gIndenter++; - - for (unsigned i = 0; i < smSize; ++i) { - os << - i << ": " << "\"" << sm [i] << "\"" << - endl; - } // for - os << endl; - - gIndenter--; - } -#endif - - if (smSize != 3) { - stringstream s; - - s << - "-midiTempo argument '" << theString << - "' is ill-formed"; - - oahError (s.str ()); - } - - string midiTempoDuration = sm [1]; - - int midiTempoPerSecond; - { - stringstream s; - s << sm [2]; - s >> midiTempoPerSecond; - } - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "midiTempoDuration = " << - midiTempoDuration << - endl << - "midiTempoPerSecond = " << - midiTempoPerSecond << - endl; - - fMidiTempoAtomVariable = - msrMidiTempo ( - 0, // inputLineNumber - midiTempoDuration, - midiTempoPerSecond); - } -#endif -} - -void oahMidiTempoAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahMidiTempoAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahMidiTempoAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching oahMidiTempoAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahMidiTempoAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahMidiTempoAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahMidiTempoAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching oahMidiTempoAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahMidiTempoAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahMidiTempoAtom::browseData ()" << - endl; - } -#endif -} - -string oahMidiTempoAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - fMidiTempoAtomVariable.asString (); - - return s.str (); -} - -string oahMidiTempoAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - fMidiTempoAtomVariable.asString (); - - return s.str (); -} - -void oahMidiTempoAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "MidiTempoAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - setw (fieldWidth) << - "fMidiTempoAtomVariable" << " : '" << - fMidiTempoAtomVariable.asString () << - "'" << - endl; - - gIndenter--; -} - -void oahMidiTempoAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - setw (valueFieldWidth) << - fVariableName << - " : '" << - fMidiTempoAtomVariable.asString () << - "'" << - endl; -} - -ostream& operator<< (ostream& os, const S_oahMidiTempoAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahOptionNameHelpAtom oahOptionNameHelpAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultOptionName) -{ - oahOptionNameHelpAtom* o = new - oahOptionNameHelpAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringVariable, - defaultOptionName); - assert(o!=0); - return o; -} - -oahOptionNameHelpAtom::oahOptionNameHelpAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultOptionName) - : oahStringWithDefaultValueAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - stringVariable, - defaultOptionName) -{} - -oahOptionNameHelpAtom::~oahOptionNameHelpAtom () -{} - -S_oahValuedAtom oahOptionNameHelpAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahOptionNameHelpAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahOptionNameHelpAtom::handleValue ( - string theString, - ostream& os) -{ - // delegate this to the handler - fHandlerUpLink-> - printOptionNameIntrospectiveHelp ( - os, - theString); - - // register 'option name help' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void oahOptionNameHelpAtom::handleDefaultValue () -{ - // delegate this to the handler - fHandlerUpLink-> - printOptionNameIntrospectiveHelp ( - fHandlerUpLink->getHandlerLogOstream (), - fDefaultStringValue); -} - -void oahOptionNameHelpAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionNameHelpAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionNameHelpAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahOptionNameHelpAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahOptionNameHelpAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionNameHelpAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionNameHelpAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahOptionNameHelpAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahOptionNameHelpAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahOptionNameHelpAtom::browseData ()" << - endl; - } -#endif -} - -string oahOptionNameHelpAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << fVariableName; - - return s.str (); -} - -string oahOptionNameHelpAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << fVariableName; - - return s.str (); -} - -void oahOptionNameHelpAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionNameHelpAtom:" << - endl; - - gIndenter++; - - printOptionEssentials ( - os, fieldWidth); - - gIndenter--; -} - -void oahOptionNameHelpAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_oahOptionNameHelpAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahSubGroup oahSubGroup::create ( - string subGroupHeader, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahGroup groupUpLink) -{ - oahSubGroup* o = new - oahSubGroup ( - subGroupHeader, - shortName, - longName, - description, - optionVisibilityKind, - groupUpLink); - assert(o!=0); - return o; -} - -oahSubGroup::oahSubGroup ( - string subGroupHeader, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahGroup groupUpLink) - : oahElement ( - shortName, - longName, - description, - optionVisibilityKind) -{ - fGroupUpLink = groupUpLink; - - fSubGroupHeader = subGroupHeader; -} - -oahSubGroup::~oahSubGroup () -{} - -void oahSubGroup::underlineSubGroupHeader (ostream& os) const -{ - /* JMI ??? - for (unsigned int i = 0; i < fSubGroupHeader.size (); i++) { - os << "-"; - } // for - os << endl; - */ - os << "--------------------------" << endl; -} - -void oahSubGroup::registerSubGroupInHandler ( - S_oahHandler handler) -{ - handler-> - registerElementInHandler (this); - - fHandlerUpLink = handler; - - for ( - list::const_iterator - i = fAtomsList.begin (); - i != fAtomsList.end (); - i++ - ) { - // register the options sub group - (*i)-> - registerAtomInHandler ( - handler); - } // for -} - -void oahSubGroup::appendAtomToSubGroup ( - S_oahAtom oahAtom) -{ - // sanity check - msrAssert ( - oahAtom != nullptr, - "oahAtom is null"); - - // append atom - fAtomsList.push_back ( - oahAtom); - - // set atom subgroup upLink - oahAtom-> - setSubGroupUpLink (this); -} - -S_oahElement oahSubGroup::fetchOptionByName ( - string name) -{ - S_oahElement result; - - for ( - list::const_iterator - i = fAtomsList.begin (); - i != fAtomsList.end (); - i++ - ) { - // search name in the options group - result = - (*i)->fetchOptionByName (name); - - if (result) { - break; - } - } // for - - return result; -} - -void oahSubGroup::checkOptionsConsistency () -{} - -void oahSubGroup::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahSubGroup::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahSubGroup elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahSubGroup::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahSubGroup::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahSubGroup::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahSubGroup elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahSubGroup::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahSubGroup::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahSubGroup::browseData ()" << - ", " << fSubGroupHeader << - endl; - } -#endif - - // browse the atoms - if (fAtomsList.size ()) { - for ( - list::const_iterator i = fAtomsList.begin (); - i != fAtomsList.end (); - i++ - ) { - S_oahAtom atom = (*i); - - // browse the atom - /* JMI ??? - gOutputOstream << - ".\\\" ==> Going to browse atom" << - " '" << atom->fetchNames () << "'" << - endl; - */ - - oahBrowser browser (v); - browser.browse (*(atom)); - } // for - } -} - -void oahSubGroup::print (ostream& os) const -{ - const int fieldWidth = 27; - - os << - "SubGroup:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fElementVisibilityKind" << " : " << - optionVisibilityKindAsString ( - fElementVisibilityKind) << - endl << - endl; - - os << - "AtomsList (" << - singularOrPlural ( - fAtomsList.size (), "atom", "atoms") << - "):" << - endl; - - if (fAtomsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fAtomsList.begin (), - iEnd = fAtomsList.end (), - i = iBegin; - for ( ; ; ) { - // print the atom - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void oahSubGroup::printSubGroupHeader (ostream& os) const -{ - // print the header and option names - os << - fSubGroupHeader; - - os << - " " << - fetchNamesBetweenParentheses (); - - switch (fElementVisibilityKind) { - case kElementVisibilityAlways: - os << - ":"; - break; - - case kElementVisibilityHiddenByDefault: - os << - " (hidden by default)"; - break; - } // switch - - os << endl; -} - -void oahSubGroup::printSubGroupHeaderWithHeaderWidth ( - ostream& os, - int subGroupHeaderWidth) const -{ - // print the header and option names - os << left << - setw (subGroupHeaderWidth) << - fSubGroupHeader << - " " << - fetchNamesBetweenParentheses (); - - switch (fElementVisibilityKind) { - case kElementVisibilityAlways: - os << - ":"; - break; - - case kElementVisibilityHiddenByDefault: - os << - " (hidden by default)"; - break; - } // switch - - os << endl; - -} - -void oahSubGroup::printHelp (ostream& os) -{ - // print the header and option names - printSubGroupHeader (os); - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription); - gIndenter--; - - os << endl; - } - - // print the options atoms if relevant - switch (fElementVisibilityKind) { - case kElementVisibilityAlways: - if (fAtomsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fAtomsList.begin (), - iEnd = fAtomsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahAtom oahAtom = (*i); - bool - oahAtomIsHidden = - oahAtom->getIsHidden (); - - // print the atom help unless it is hidden - if (! oahAtomIsHidden) { - oahAtom-> - printHelp (os); - } - if (++i == iEnd) break; - if (! oahAtomIsHidden) { - // JMI os << endl; - } - } // for - - gIndenter--; - } - break; - - case kElementVisibilityHiddenByDefault: - break; - } // switch - - // register help print action in options groups's options handler upLink - fGroupUpLink-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void oahSubGroup::printHelpWithHeaderWidth ( - ostream& os, - int subGroupHeaderWidth) -{ - // print the header and option names - printSubGroupHeaderWithHeaderWidth ( - os, - subGroupHeaderWidth); - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription); - gIndenter--; - - os << endl; - } - - // print the options atoms if relevant - switch (fElementVisibilityKind) { - case kElementVisibilityAlways: - if (fAtomsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fAtomsList.begin (), - iEnd = fAtomsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahAtom oahAtom = (*i); - bool - oahAtomIsHidden = - oahAtom->getIsHidden (); - - // print the atom help unless it is hidden - if (! oahAtomIsHidden) { - oahAtom-> - printHelp (os); - } - if (++i == iEnd) break; - if (! oahAtomIsHidden) { - // JMI os << endl; - } - } // for - - gIndenter--; - } - break; - - case kElementVisibilityHiddenByDefault: - break; - } // switch - - // register help print action in options groups's options handler upLink - fGroupUpLink-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void oahSubGroup::printSubGroupHelp (ostream& os) const -{ - // print the header and option names - printSubGroupHeader (os); - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - os << endl; - } - - if (fAtomsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fAtomsList.begin (), - iEnd = fAtomsList.end (), - i = iBegin; - for ( ; ; ) { - // print the atom help - (*i)->printHelp (os); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - os << endl; - - // register help print action in options groups's options handler upLink - fGroupUpLink-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); - -} - -S_oahValuedAtom oahSubGroup::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahSubGroup" << - endl; - } -#endif - - printSubGroupHelp (os); - - // no option value is needed - return nullptr; -} - -void oahSubGroup::printOptionsSummary ( - ostream& os) const -{ - // fetch maximum subgroups help headers size - int maximumSubGroupsHelpHeadersSize = - getGroupUpLink ()-> - getHandlerUpLink ()-> - getMaximumSubGroupsHeadersSize (); - - // fetch maximum short name width - int maximumShortNameWidth = - getGroupUpLink ()-> - getHandlerUpLink ()-> - getMaximumShortNameWidth (); - - // print the summary - os << left << - setw (maximumSubGroupsHelpHeadersSize) << - fSubGroupHeader << - " " << - fetchNamesInColumnsBetweenParentheses ( - maximumShortNameWidth); - - switch (fElementVisibilityKind) { - case kElementVisibilityAlways: - break; - - case kElementVisibilityHiddenByDefault: - os << - " (hidden by default)"; - break; - } // switch - - os << endl; - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - } - - // register help print action in options groups's options handler upLink - fGroupUpLink-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void oahSubGroup::printSubGroupSpecificHelpOrOptionsSummary ( - ostream& os, - S_oahSubGroup subGroup) const -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << "oahSubGroup::printSubGroupSpecificHelpOrOptionsSummary" << endl; - } -#endif - - // print only the summary if this is not the desired subgroup, - // otherwise print the regular help - if (subGroup == this) { - os << endl; - printSubGroupSpecificHelpOrOptionsSummary ( - os, - subGroup); - } - else { - printOptionsSummary (os); // JMI ??? - } - } - -void oahSubGroup::printSubGroupAndAtomHelp ( - ostream& os, - S_oahAtom targetAtom) const -{ - // print the header - os << - fSubGroupHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl << - endl; - - // underline the options subgroup header -// JMI underlineSubGroupHeader (os); - - // print the subgroup atoms - if (fAtomsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fAtomsList.begin (), - iEnd = fAtomsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahAtom oahAtom = (*i); - - if (oahAtom == targetAtom) { - // print the target atom's help - // target options atom's help - (*i)-> - printHelp ( - os); - } - if (++i == iEnd) break; - if (oahAtom == targetAtom) { - os << endl; - } - } // for - - gIndenter--; - } - - // register help print action in options groups's options handler upLink - fGroupUpLink-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void oahSubGroup::printSubGroupOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // print the header - os << - fSubGroupHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // underline the options subgroup header -// JMI underlineSubGroupHeader (os); - - // print the subgroup atoms values - if (fAtomsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fAtomsList.begin (), - iEnd = fAtomsList.end (), - i = iBegin; - for ( ; ; ) { - // print the atom values - (*i)-> - printAtomOptionsValues ( - os, valueFieldWidth); - if (++i == iEnd) break; - // os << endl; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_oahSubGroup& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_oahGroup oahGroup::create ( - string header, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahHandler groupHandlerUpLink) -{ - oahGroup* o = new - oahGroup ( - header, - shortName, - longName, - description, - optionVisibilityKind, - groupHandlerUpLink); - assert(o!=0); - return o; -} - -oahGroup::oahGroup ( - string header, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahHandler groupHandlerUpLink) - : oahElement ( - shortName, - longName, - description, - optionVisibilityKind) -{ - fHandlerUpLink = groupHandlerUpLink; - - fGroupHeader = header; -} - -oahGroup::~oahGroup () -{} - -void oahGroup::underlineGroupHeader (ostream& os) const -{ - /* JMI - for (unsigned int i = 0; i < fGroupHeader.size (); i++) { - os << "-"; - } // for - os << endl; - */ - os << "--------------------------" << endl; -} - -void oahGroup::registerGroupInHandler ( - S_oahHandler handler) -{ - // sanity check - msrAssert ( - handler != nullptr, - "handler is null"); - - // set options handler upLink - fHandlerUpLink = handler; - - // register options group in options handler - handler-> - registerElementInHandler (this); - - for ( - list::const_iterator - i = fSubGroupsList.begin (); - i != fSubGroupsList.end (); - i++ - ) { - // register the options sub group - (*i)-> - registerSubGroupInHandler ( - handler); - } // for -} - -void oahGroup::appendSubGroupToGroup ( - S_oahSubGroup subGroup) -{ - // sanity check - msrAssert ( - subGroup != nullptr, - "subGroup is null"); - - // append options subgroup - fSubGroupsList.push_back ( - subGroup); - - // set options subgroup group upLink - subGroup-> - setGroupUpLink (this); -} - -S_oahElement oahGroup::fetchOptionByName ( - string name) -{ - S_oahElement result; - - for ( - list::const_iterator - i = fSubGroupsList.begin (); - i != fSubGroupsList.end (); - i++ - ) { - // search name in the options group - result = - (*i)->fetchOptionByName (name); - - if (result) { - break; - } - } // for - - return result; -} - -void oahGroup::handleAtomValue ( - ostream& os, - S_oahAtom atom, - string theString) -{ - os << - endl << - "-==> Options atom '" << - atom << - "' with value '" << - theString << - "' is not handled" << - endl << - endl; -} - -void oahGroup::checkOptionsConsistency () -{} - -void oahGroup::checkGroupSubGroupsOptionsConsistency () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "Checking the consistency of OAH group \"" << - fGroupHeader << - "\"" << - endl; - } -#endif - - gIndenter++; - - // check the subgroups options consistency - if (fSubGroupsList.size ()) { - for ( - list::const_iterator i = fSubGroupsList.begin (); - i != fSubGroupsList.end (); - i++ - ) { - S_oahSubGroup subgroup = (*i); - - // check the subgroup - subgroup-> - checkOptionsConsistency (); - } // for - } - - gIndenter--; - - // check the group's own consistency - this->checkOptionsConsistency (); -} - -void oahGroup::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahGroup::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahGroup elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahGroup::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahGroup::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahGroup::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahGroup elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahGroup::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahGroup::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahGroup::browseData ()" << - ", " << fGroupHeader << - endl; - } -#endif - - // browse the subGroups - if (fSubGroupsList.size ()) { - for ( - list::const_iterator i = fSubGroupsList.begin (); - i != fSubGroupsList.end (); - i++ - ) { - S_oahSubGroup subGroup = (*i); - - // browse the subGroup - oahBrowser browser (v); - browser.browse (*(subGroup)); - } // for - } -} - -void oahGroup::print (ostream& os) const -{ - const int fieldWidth = 27; - - os << - "Group:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - os << - "SubgroupsList (" << - singularOrPlural ( - fSubGroupsList.size (), "element", "elements") << - "):" << - endl; - - if (fSubGroupsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the options subgroup - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void oahGroup::printGroupHeader (ostream& os) const -{ - // print the header and option names - os << - fGroupHeader << - " " << - fetchNamesBetweenParentheses (); - - switch (fElementVisibilityKind) { - case kElementVisibilityAlways: - os << - ":"; - break; - - case kElementVisibilityHiddenByDefault: - os << - " (hidden by default)"; - break; - } // switch - - os << endl; -} - -void oahGroup::printHelp (ostream& os) -{ - // print the header and option names - printGroupHeader (os); - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - } - - // underline the options group header - underlineGroupHeader (os); - -/* JMI - // print the options subgroups - if (fSubGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the options subgroup help - (*i)->printHelp (os); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } -*/ - - // print the options subgroups - if (fSubGroupsList.size ()) { - // compute the maximun sub group header length - int maximumSubGroupHeaderLength = 0; - - for ( - list::const_iterator i = fSubGroupsList.begin (); - i != fSubGroupsList.end (); - i++ - ) { - string subGroupHeader = (*i)->getSubGroupHeader (); - int subGroupHeaderSize = subGroupHeader.size (); - - if (subGroupHeaderSize > maximumSubGroupHeaderLength) { - maximumSubGroupHeaderLength = subGroupHeaderSize; - } - } // for - - maximumSubGroupHeaderLength += 3; // to have some more spaces - - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahSubGroup subGroup = (*i); - - // print the options subgroup help - subGroup->printHelpWithHeaderWidth ( - os, - maximumSubGroupHeaderLength); - - if (++i == iEnd) break; - // JMI os << endl; - } // for - - gIndenter--; - } - - // register help print action in options handler upLink - fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahGroup::printGroupAndSubGroupHelp ( - ostream& os, - S_oahSubGroup targetSubGroup) const -{ - - // print the header and option names - os << - fGroupHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - os << endl; - } - - // underline the options group header - underlineGroupHeader (os); - - // print the target options subgroup - if (fSubGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahSubGroup - subGroup = (*i); - - if (subGroup == targetSubGroup) { - // print the target options subgroup help - subGroup-> - printSubGroupHelp ( - os); - } - if (++i == iEnd) break; - if (subGroup == targetSubGroup) { - os << endl; - } - } // for - - gIndenter--; - } -} - -void oahGroup::printGroupAndSubGroupAndAtomHelp ( - ostream& os, - S_oahSubGroup targetSubGroup, - S_oahAtom targetAtom) const -{ - // print the header and option names - os << - fGroupHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - os << endl; - } - - // underline the options group header - underlineGroupHeader (os); - - // print the target options subgroup - if (fSubGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahSubGroup subGroup = (*i); - - if (subGroup == targetSubGroup) { - // print the target options subgroup's - // target options targetAtom's help - subGroup-> - printSubGroupAndAtomHelp ( - os, - targetAtom); - } - if (++i == iEnd) break; - if (subGroup == targetSubGroup) { - os << endl; - } - } // for - - os << endl; - - gIndenter--; - } - - // register help print action in options handler upLink - fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -S_oahValuedAtom oahGroup::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << optionName << "' is a oahGroup" << - endl; - } -#endif - - printHelp (os); - - // no option value is needed - return nullptr; -} - -void oahGroup::printOptionsSummary (ostream& os) const -{ - // the description is the header of the information - os << - fGroupHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - } - - // underline the options group header - underlineGroupHeader (os); - - // print the options subgroups - if (fSubGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the options subgroup description - (*i)-> - printOptionsSummary (os); - if (++i == iEnd) break; - // os << endl; - } // for - - gIndenter--; - } - - // register help print action in options handler upLink - fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahGroup::printGroupAndSubGroupSpecificHelp ( - ostream& os, - S_oahSubGroup subGroup) const -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << "oahGroup::printGroupAndSubGroupSpecificHelp" << endl; - } -#endif - - // the description is the header of the information - os << - fGroupHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // print the description if any - if (fDescription.size ()) { - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - } - - // underline the options group header - underlineGroupHeader (os); - - // print the options subgroups - if (fSubGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahSubGroup subGroup = (*i); - - // print the options subgroup specific subgroup help - subGroup-> - printSubGroupSpecificHelpOrOptionsSummary ( - os, - subGroup); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - // register help print action in options handler upLink - fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahGroup::printGroupOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // print the header - os << - fGroupHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // underline the options group header - underlineGroupHeader (os); - - // print the options subgroups values - if (fSubGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fSubGroupsList.begin (), - iEnd = fSubGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the options subgroup values - (*i)-> - printSubGroupOptionsValues ( - os, valueFieldWidth); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_oahGroup& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -/* JMI -S_oahHandler oahHandler::create ( - string handlerHeader, - string handlerValuesHeader, - string handlerShortName, - string handlerLongName, - string handlerSummaryShortName, - string handlerSummaryLongName, - string handlerPreamble, - string handlerUsage, - string handlerDescription, - indentedOstream& handlerLogOstream) -{ - oahHandler* o = new - oahHandler ( - handlerHeader, - handlerValuesHeader, - handlerShortName, - handlerLongName, - handlerSummaryShortName, - handlerSummaryLongName, - handlerPreamble, - handlerUsage, - handlerDescription, - handlerLogOstream); - assert(o!=0); - return o; -} -*/ - -oahHandler::oahHandler ( - string handlerHeader, - string handlerValuesHeader, - string handlerShortName, - string handlerLongName, - string handlerSummaryShortName, - string handlerSummaryLongName, - string handlerPreamble, - string handlerUsage, - string handlerDescription, - indentedOstream& handlerLogOstream) - : oahElement ( - handlerShortName, - handlerLongName, - handlerDescription, - kElementVisibilityAlways), - fHandlerLogOstream ( - handlerLogOstream) -{ - fHandlerHeader = - handlerHeader; - - fHandlerValuesHeader = - handlerValuesHeader; - - fHandlerSummaryShortName = - handlerSummaryShortName; - fHandlerSummaryLongName = - handlerSummaryLongName; - - fHandlerPreamble = - handlerPreamble; - - fHandlerUsage = - handlerUsage; - - fNowEverythingIsAnArgument = false; - - fOahOptionsDefaultValuesStyle = kOAHStyle; - - fMaximumSubGroupsHeadersSize = 1; - - fMaximumShortNameWidth = 1; - fMaximumLongNameWidth = 1; - - fMaximumVariableNameWidth = 0; - - fHandlerFoundAHelpOption = false; - - // initialize the optional values style kinds map - initializeOahOptionalValuesStyleKindsMap (); - - // initialize the optional values style kind - fHandlerOptionalValuesStyleKind = kOptionalValuesStyleGNU; // default value -} - -oahHandler::~oahHandler () -{} - -void oahHandler::registerHandlerInItself () -{ - this-> - registerElementInHandler (this); - -/* JMI ??? - // register the help summary names in handler - registerElementNamesInHandler ( - fHandlerSummaryShortName, - fHandlerSummaryLongName, - this); -*/ - -//* JMI - for ( - list::const_iterator - i = fHandlerGroupsList.begin (); - i != fHandlerGroupsList.end (); - i++ - ) { - // register the options group - (*i)-> - registerGroupInHandler ( - this); - } // for - // */ -} - -S_oahPrefix oahHandler::fetchPrefixFromMap ( - string name) const -{ - S_oahPrefix result; - - // is name known in prefixes map? - map::const_iterator - it = - fHandlerPrefixesMap.find ( - name); - - if (it != fHandlerPrefixesMap.end ()) { - // yes, name is known in the map - result = (*it).second; - } - - return result; -} - -S_oahElement oahHandler::fetchElementFromMap ( - string name) const -{ - S_oahElement result; - - // is name known in options map? - map::const_iterator - it = - fHandlerElementsMap.find ( - name); - - if (it != fHandlerElementsMap.end ()) { - // yes, name is known in the map - result = (*it).second; - } - - return result; -} - -string oahHandler::handlerOptionNamesBetweenParentheses () const -{ - stringstream s; - - s << - "(" << - fetchNames () << - ", "; - - if ( - fHandlerSummaryShortName.size () - && - fHandlerSummaryLongName.size () - ) { - s << - "-" << fHandlerSummaryShortName << - ", " << - "-" << fHandlerSummaryLongName; - } - - else { - if (fHandlerSummaryShortName.size ()) { - s << - "-" << fHandlerSummaryShortName; - } - if (fHandlerSummaryLongName.size ()) { - s << - "-" << fHandlerSummaryLongName; - } - } - - s << - ")"; - - return s.str (); -} - -void oahHandler::registerElementNamesInHandler ( - S_oahElement element) -{ - string - elementShortName = - element->getShortName (), - elementLongName = - element->getLongName (); - - int - elementShortNameSize = - elementShortName.size (), - elementLongNameSize = - elementLongName.size (); - - if (elementShortNameSize == 0) { - stringstream s; - - s << - "element short name is empty"; - - oahError (s.str ()); - } - - if (elementShortNameSize == 0 && elementLongNameSize == 0) { - stringstream s; - - s << - "element long name and short name are both empty"; - - oahError (s.str ()); - } - - if (elementShortName == elementLongName) { - stringstream s; - - s << - "element long name '" << elementLongName << "'" << - " is the same as the short name for the same"; - - oahError (s.str ()); - } - - if (elementLongNameSize == 1) { - stringstream s; - - s << - "element long name '" << elementLongName << "'" << - " has only one character"; - - oahWarning (s.str ()); - } - - for ( - map::iterator i = - fHandlerElementsMap.begin (); - i != fHandlerElementsMap.end (); - i++ - ) { - - // is elementLongName already in the elements names map? - if ((*i).first == elementLongName) { - stringstream s; - - s << - "element long name '" << elementLongName << "'" << - " for element short name '" << elementShortName << "'" << - " is defined more that once"; - - oahError (s.str ()); - } - - // is elementShortName already in the elements names map? - if ((*i).first == elementShortName) { - if (elementShortName.size ()) { - stringstream s; - - s << - "element short name '" << elementShortName << "'" << - " for element long name '" << elementLongName << "'" << - " is defined more that once"; - - oahError (s.str ()); - } - } - } // for - - // register element's names - if (elementShortNameSize == 1) { - fSingleCharacterShortNamesSet.insert (elementShortName); - } - - if (elementLongNameSize) { - fHandlerElementsMap [elementLongName] = - element; - - if (elementLongNameSize > fMaximumLongNameWidth) { - fMaximumLongNameWidth = elementLongNameSize; - } - } - - if (elementShortNameSize) { - fHandlerElementsMap [elementShortName] = - element; - - if (elementShortNameSize > fMaximumShortNameWidth) { - fMaximumShortNameWidth = elementShortNameSize; - } - } - - // take element's display variable name length into account - int - elementVariableNameLength = - element-> - fetchVariableNameLength (); - - if ( - elementVariableNameLength - > - fMaximumVariableNameWidth - ) { - fMaximumVariableNameWidth = - elementVariableNameLength; - } -} - -void oahHandler::registerElementInHandler ( - S_oahElement element) -{ - // register the element names in handler - registerElementNamesInHandler ( - element); - - // insert element into the registered elements list - fHandlerRegisteredElementsList.push_back (element); - - if ( - // subgroup? - S_oahSubGroup - subGroup = - dynamic_cast(&(*element)) - ) { - - string - subHeader= - subGroup-> getSubGroupHeader (); - int - subHeaderSize = - subHeader.size (); - - // account for subGroup's header size - if (subHeaderSize > fMaximumSubGroupsHeadersSize) { - fMaximumSubGroupsHeadersSize = - subHeaderSize; - } - } -} - -void oahHandler::checkOptionsConsistency () -{} - -void oahHandler::checkHandlerGroupsOptionsConsistency () -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "Checking the consistency of OAH handler \"" << - fHandlerHeader << - "\"" << - endl; - } -#endif - - gIndenter++; - - // check the handler groups options consistency - if (fHandlerGroupsList.size ()) { - for ( - list::const_iterator i = fHandlerGroupsList.begin (); - i != fHandlerGroupsList.end (); - i++ - ) { - S_oahGroup group = (*i); - - // check the group - group-> - checkGroupSubGroupsOptionsConsistency (); - } // for - } - - gIndenter--; - - // the the handler's own consistency - this->checkOptionsConsistency (); -} - -void oahHandler::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahHandler::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahHandler elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahHandler::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahHandler::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahHandler::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahHandler elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> Launching oahHandler::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahHandler::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gOutputOstream << - ".\\\" ==> oahHandler::browseData ()" << - endl; - } -#endif - - // browse the prefixes - if (fHandlerPrefixesMap.size ()) { - for ( - map::const_iterator i = fHandlerPrefixesMap.begin (); - i != fHandlerPrefixesMap.end (); - i++ - ) { - S_oahPrefix prefix = (*i).second; - - // browse the prefix - oahBrowser browser (v); - browser.browse (*(prefix)); - } // for - } - - // browse the groups - if (fHandlerGroupsList.size ()) { - for ( - list::const_iterator i = fHandlerGroupsList.begin (); - i != fHandlerGroupsList.end (); - i++ - ) { - S_oahGroup group = (*i); - - // browse the group - oahBrowser browser (v); - browser.browse (*(group)); - } // for - } -} - -void oahHandler::print (ostream& os) const -{ - const int fieldWidth = 27; - - os << - "Handler:" << - endl; - - gIndenter++; - - printOptionEssentials (os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fHandlerSummaryShortName" << " : " << - fHandlerSummaryShortName << - endl << - setw (fieldWidth) << - "fHandlerSummaryLongName" << " : " << - fHandlerSummaryLongName << - endl << - - setw (fieldWidth) << - "fShortName" << " : " << - fShortName << - endl << - setw (fieldWidth) << - "fLongName" << " : " << - fLongName << - endl << - - setw (fieldWidth) << - "oahHandlerFoundAHelpOption" << " : " << - fHandlerFoundAHelpOption << - endl << - - setw (fieldWidth) << - "oahOptionsDefaultValuesStyle" << " : " << - optionsDefaultValuesStyleAsString ( - fOahOptionsDefaultValuesStyle) << - endl; - - // print the options prefixes if any - if (fHandlerPrefixesMap.size ()) { - printKnownPrefixes (); - } - - // print the single-character options if any - if (fSingleCharacterShortNamesSet.size ()) { - printKnownSingleCharacterOptions (); - } - - // print the options groups if any - if (fHandlerGroupsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fHandlerGroupsList.begin (), - iEnd = fHandlerGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the options group - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; -} - -void oahHandler::printHelp (ostream& os) -{ - // print the options handler preamble - os << - gIndenter.indentMultiLineString ( - fHandlerPreamble); - - os << endl; - - // print the options handler usage - os << - "Usage:" << - endl; - - gIndenter.indentMultiLineString ( - fHandlerUsage); - - os << endl; - - // print the options handler help header and option names - os << - fHandlerHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // print the options handler description - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription); - gIndenter--; - - os << - endl << - endl; - - // print the known options prefixes - gIndenter++; - printKnownPrefixes (); - gIndenter--; - - // print the single-character options - gIndenter++; - printKnownSingleCharacterOptions (); - gIndenter--; - - // print information about options default values - gIndenter++; - printOptionsDefaultValuesInformation (); - gIndenter--; - - os << endl; - - // print the options groups help - if (fHandlerGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fHandlerGroupsList.begin (), - iEnd = fHandlerGroupsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahGroup group = (*i); - - // print the options group help -// group->printHelp (os); - - // print the options subgroups if relevant - switch (group->getElementVisibilityKind ()) { - case kElementVisibilityAlways: - group->printHelp (os); - break; - - case kElementVisibilityHiddenByDefault: - group->printGroupHeader (os); - group->underlineGroupHeader(os); - break; - } // switch - - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - // register help print action in options handler upLink -// fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -void oahHandler::printOptionsSummary (ostream& os) const -{ - // print the options handler preamble - os << - gIndenter.indentMultiLineString ( - fHandlerPreamble); - - // print the options handler help header and option names - os << - fHandlerHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // print the options handler description - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - // print the options groups help summaries - if (fHandlerGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fHandlerGroupsList.begin (), - iEnd = fHandlerGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the options group summary - (*i)->printOptionsSummary (os); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } -} - -void oahHandler::printHandlerAndGroupAndSubGroupSpecificHelp ( - ostream& os, - S_oahSubGroup subGroup) const -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << "oahHandler::printHandlerAndGroupAndSubGroupSpecificHelp" << endl; - } -#endif - - // print the options handler help header and option names - os << - fHandlerHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - // print the optons group subgroups specific help - if (fHandlerGroupsList.size ()) { - gIndenter++; - - list::const_iterator - iBegin = fHandlerGroupsList.begin (), - iEnd = fHandlerGroupsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahGroup group = (*i); - - // print the options group specific subgroup help - group-> - printGroupAndSubGroupSpecificHelp ( - os, - subGroup); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } -} - -void oahHandler::printOptionNameIntrospectiveHelp ( - ostream& os, - string name) const -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << "oahHandler::printOptionNameIntrospectiveHelp" << endl; - } -#endif - - // is name known in options map? - S_oahElement - element = - fetchElementFromMap (name); - - if (! element) { - // name is not well handled by this options handler - stringstream s; - - s << - "option name '" << name << "' is unknown, cannot deliver specific help"; - - oahError (s.str ()); - } - - else { - // name is known, let's handle it - if ( - // handler? - S_oahHandler - handler = - dynamic_cast(&(*element)) - ) { - // print the option handler help or help summary - if ( - name == handler->getHandlerSummaryShortName () - || - name == handler->getHandlerSummaryLongName () - ) { - handler-> - printOptionsSummary ( - gOutputOstream); - } - else { - handler-> - printHelp ( - gOutputOstream); - } - - gOutputOstream << endl; - } - - else if ( - // group? - S_oahGroup - group = - dynamic_cast(&(*element)) - ) { - // print the help - gOutputOstream << - endl << - "--- Help for option '" << - name << - "' at help top level ---" << - endl << - endl; - - group-> - printHelp ( - gOutputOstream); - - gOutputOstream << endl; - } - - else if ( - // subgroup? - S_oahSubGroup - subGroup = - dynamic_cast(&(*element)) - ) { - // get the options group upLink - S_oahGroup - group = - subGroup-> - getGroupUpLink (); - - // print the help - gOutputOstream << - endl << - "--- Help for option '" << - name << - "' in group \"" << - group->getGroupHeader () << - "\" ---" << - endl << - endl; - - group-> - printGroupAndSubGroupHelp ( - gOutputOstream, - subGroup); - } - - else if ( - // atom? - S_oahAtom - atom = - dynamic_cast(&(*element)) - ) { - // get the subgroup upLink - S_oahSubGroup - subGroup = - atom-> - getSubGroupUpLink (); - - // get the group upLink - S_oahGroup - group = - subGroup-> - getGroupUpLink (); - - // print the help - gOutputOstream << - endl << - "--- Help for option '" << - name << - "' in subgroup \"" << - subGroup-> - getSubGroupHeader () << - "\"" << - " of group \"" << - group-> - getGroupHeader () << - "\" ---" << - endl << - endl; - - group-> - printGroupAndSubGroupAndAtomHelp ( - gOutputOstream, - subGroup, - atom); - } - - else { - stringstream s; - - s << - "cannot provide specific help about option name \"" << - name << - "\""; - - oahError (s.str ()); - } - } -} - -void oahHandler::printAllOahCommandLineValues ( - ostream& os) const -{ - // print the options handler values header - os << - fHandlerValuesHeader << - " " << - fetchNamesBetweenParentheses () << - ":" << - endl; - - int - handlerCommandLineElementsMultisetSize = - fHandlerCommandLineElementsMultiset.size (); - - os << - "There are " << - fHandlerElementsMap.size () << - " known options names for " << - fHandlerRegisteredElementsList.size () << - " registered elements, " << - handlerCommandLineElementsMultisetSize << - " of which " << - singularOrPluralWithoutNumber ( - handlerCommandLineElementsMultisetSize, "occurs", "occur") << - " in the command line" << - endl; - - if (fSingleCharacterShortNamesSet.size ()) { - os << - "The single character short option names are: "; - - set::const_iterator - iBegin = fSingleCharacterShortNamesSet.begin (), - iEnd = fSingleCharacterShortNamesSet.end (), - i = iBegin; - for ( ; ; ) { - // print the options group values - os << (*i); - if (++i == iEnd) break; - os << ","; - } // for - - os << endl; - } - - // print the options groups values - if (fHandlerGroupsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fHandlerGroupsList.begin (), - iEnd = fHandlerGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the options group values - (*i)-> - printGroupOptionsValues ( - os, fMaximumVariableNameWidth); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } -} - -ostream& operator<< (ostream& os, const S_oahHandler& elt) -{ - elt->print (os); - return os; -} - -void oahHandler::appendPrefixToHandler ( - S_oahPrefix prefix) -{ - // sanity check - msrAssert ( - prefix != nullptr, - "prefix is null"); - - string prefixName = prefix->getPrefixName (); - - // is prefixName already known in options map? - map::const_iterator - it = - fHandlerPrefixesMap.find ( - prefixName); - - if (it != fHandlerPrefixesMap.end ()) { - // prefixName is already known in the map - stringstream s; - - s << - "option prefix name '" << prefixName << - "' is already known"; - - oahError (s.str ()); - } - - // register prefix in the options prefixes map - fHandlerPrefixesMap [prefix->getPrefixName ()] = - prefix; -} - -S_oahPrefix oahHandler::fetchPrefixInMapByItsName ( - string prefixName) -{ - S_oahPrefix result; - - // is prefixName already known in options map? - map::const_iterator - it = - fHandlerPrefixesMap.find ( - prefixName); - - if (it != fHandlerPrefixesMap.end ()) { - // prefixName is already known in the map - result = (*it).second; - } - - return result; -} - -void oahHandler::appendGroupToHandler ( - S_oahGroup oahGroup) -{ - // sanity check - msrAssert ( - oahGroup != nullptr, - "oahGroup is null"); - - // append the options group - fHandlerGroupsList.push_back ( - oahGroup); - - // set the upLink - oahGroup-> - setHandlerUpLink (this); -} - -void oahHandler::prependGroupToHandler ( - S_oahGroup oahGroup) -{ - // sanity check - msrAssert ( - oahGroup != nullptr, - "oahGroup is null"); - - // prepend the options group - fHandlerGroupsList.push_front ( - oahGroup); - - // set the upLink - oahGroup-> - setHandlerUpLink (this); -} - -void oahHandler::printKnownPrefixes () const -{ - int oahHandlerPrefixesListSize = - fHandlerPrefixesMap.size (); - - gOutputOstream << - "There are " << - oahHandlerPrefixesListSize << - " options prefixes:" << - endl; - - // indent a bit more for readability - gIndenter++; - - if (oahHandlerPrefixesListSize) { - for ( - map::const_iterator i = - fHandlerPrefixesMap.begin (); - i != fHandlerPrefixesMap.end (); - i++ - ) { - S_oahPrefix - prefix = (*i).second; - - prefix-> - printPrefixHeader ( - gOutputOstream); - } // for - - gOutputOstream << endl; - } - else { - gOutputOstream << - "none" << - endl; - } - - gIndenter--; -} - -void oahHandler::printKnownSingleCharacterOptions () const -{ - int oahHandlerPrefixesListSize = - fSingleCharacterShortNamesSet.size (); - - gOutputOstream << - "There are " << - oahHandlerPrefixesListSize << - " single-character options:" << - endl; - - // indent a bit more for readability - gIndenter++; - - if (oahHandlerPrefixesListSize) { - set::const_iterator - iBegin = fSingleCharacterShortNamesSet.begin (), - iEnd = fSingleCharacterShortNamesSet.end (), - i = iBegin; - - int cumulatedLength = 0; - - for ( ; ; ) { - string theString = (*i); - - gOutputOstream << "-" << theString; - - cumulatedLength += theString.size (); - if (cumulatedLength >= K_NAMES_LIST_MAX_LENGTH) break; - - if (++i == iEnd) break; - - if (next (i) == iEnd) { - gOutputOstream << " and "; - } - else { - gOutputOstream << ", "; - } - } // for - - gOutputOstream << endl; - } - else { - gOutputOstream << - "none" << - endl; - } - - gIndenter--; - - gOutputOstream << - "They can be clustered, such as:" << - endl << - gTab << "'-vac'" << - endl << - "which is equivalent to:" << - endl << - gTab << "'-v, -a, -c'" << - endl; -} - -string oahHandler::optionsDefaultValuesStyleAsString ( - oahOptionsDefaultValuesStyle optionsDefaultValuesStyle) -{ - string result; - - switch (optionsDefaultValuesStyle) { - case oahHandler::kGNUStyle: - result = "GNUStyle"; - break; - case oahHandler::kOAHStyle: - result = "OAHStyle"; - break; - } // switch - - return result; -} - -void oahHandler::printOptionsDefaultValuesInformation () const -{ - gOutputOstream << - endl << - "Some options needing a value can use a default value:" << - endl; - - gIndenter++; - - gOutputOstream << - fHandlerExecutableName << - gIndenter.indentMultiLineString ( -R"( supports two styles for this, see '-ovs, -optional-values-style' option.)") << - endl; - - gIndenter--; -} - -string oahHandler::commandLineAsSuppliedAsString () const -{ - return fCommandLineAsSupplied; -} - -string oahHandler::commandLineWithShortNamesAsString () const -{ - stringstream s; - - s << - fHandlerExecutableName; - - if (fHandlerArgumentsVector.size ()) { - s << " "; - - vector::const_iterator - iBegin = fHandlerArgumentsVector.begin (), - iEnd = fHandlerArgumentsVector.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << " "; - } // for - } - - if (fHandlerCommandLineElementsList.size ()) { - s << " "; - - list::const_iterator - iBegin = fHandlerCommandLineElementsList.begin (), - iEnd = fHandlerCommandLineElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahElement element = (*i); - - s << element-> asShortNamedOptionString (); - if (++i == iEnd) break; - s << " "; - } // for - } - - return s.str (); -} - -string oahHandler::commandLineWithLongNamesAsString () const -{ - stringstream s; - - s << - fHandlerExecutableName; - - if (fHandlerArgumentsVector.size ()) { - s << " "; - - vector::const_iterator - iBegin = fHandlerArgumentsVector.begin (), - iEnd = fHandlerArgumentsVector.end (), - i = iBegin; - for ( ; ; ) { - s << (*i); - if (++i == iEnd) break; - s << " "; - } // for - } - - if (fHandlerCommandLineElementsList.size ()) { - s << " "; - - list::const_iterator - iBegin = fHandlerCommandLineElementsList.begin (), - iEnd = fHandlerCommandLineElementsList.end (), - i = iBegin; - for ( ; ; ) { - S_oahElement option = (*i); - - s << option-> asLongNamedOptionString (); - if (++i == iEnd) break; - s << " "; - } // for - } - - return s.str (); -} - -void oahHandler::printKnownOptions () const -{ - int handlerElementsMapSize = - fHandlerElementsMap.size (); - - // print the options map - gOutputOstream << - "The " << - handlerElementsMapSize << - " known options for the " << - handlerElementsMapSize << - " registered elements are:" << - endl; - - gIndenter++; - - if (handlerElementsMapSize) { - map::const_iterator - iBegin = fHandlerElementsMap.begin (), - iEnd = fHandlerElementsMap.end (), - i = iBegin; - for ( ; ; ) { - gOutputOstream << - (*i).first << "==>" << - endl; - - gIndenter++; - - (*i).second-> - printOptionHeader ( - gOutputOstream); - - if (++i == iEnd) break; - - gIndenter--; - } // for - } - else { - gOutputOstream << - "none" << - endl; - } - - gIndenter--; -} - -S_oahElement oahHandler::fetchOptionByName ( - string name) -{ - S_oahElement result; - - for ( - list::const_iterator - i = fHandlerGroupsList.begin (); - i != fHandlerGroupsList.end (); - i++ - ) { - // search name in the options group - result = - (*i)->fetchOptionByName (name); - - if (result) { - break; - } - } // for - - return result; -} - -void oahHandler::checkMissingPendingValuedAtomValue ( - string atomName, - string context) -{ - if (fPendingValuedAtom) { - switch (fHandlerOptionalValuesStyleKind) { - case kOptionalValuesStyleGNU: - // handle the valued atom using the default value - if (fPendingValuedAtom->getValueIsOptional ()) { - fPendingValuedAtom-> - handleDefaultValue (); - } - - else { - /* JMI - stringstream s; - - s << - "option name '" << atomName << - "' takes an optional value: it should be used with a '=' in GNU optional values style"; - - oahError (s.str ()); - // oahWarning (s.str ()); // JMI - */ - } - break; - - case kOptionalValuesStyleOAH: - // handle the valued atom using the default value - if (fPendingValuedAtom->getValueIsOptional ()) { - fPendingValuedAtom-> - handleDefaultValue (); - } - - else { - // an option requiring a value is expecting it, - // but another option, an argument or the end of the command line - // has been found instead - stringstream s; - - s << - "option " << - fPendingValuedAtom->asString () << - " expects a value" << - " (" << context << ")"; - - oahError (s.str ()); - } - break; - } // switch - - fPendingValuedAtom = nullptr; - } -} - -void oahHandler::handlePrefixName ( - string prefixName, - size_t equalsSignPosition, - string stringAfterEqualsSign) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "===> equalsSignPosition = '" << equalsSignPosition << - "', " << - "===> prefixName = '" << prefixName << - "', " << - "===> stringAfterEqualsSign = '" << stringAfterEqualsSign << - "'" << - endl; - } -#endif - - // split stringAfterEqualsSign into a list of strings - // using the comma as separator - list chunksList; - - splitStringIntoChunks ( - stringAfterEqualsSign, - ",", - chunksList); - - unsigned chunksListSize = chunksList.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "There are " << chunksListSize << " chunks" << - " in '" << stringAfterEqualsSign << - "'" << - endl; - - gIndenter++; - - list::const_iterator - iBegin = chunksList.begin (), - iEnd = chunksList.end (), - i = iBegin; - - for ( ; ; ) { - gOutputOstream << - "[" << (*i) << "]"; - if (++i == iEnd) break; - gOutputOstream << - " "; - } // for - - gOutputOstream << endl; - - gIndenter--; - } -#endif - - S_oahPrefix - prefix = - fetchPrefixFromMap (prefixName); - - if (prefix) { - if (chunksListSize) { - // expand the option names contained in chunksList - for ( - list::const_iterator i = - chunksList.begin (); - i != chunksList.end (); - i++ - ) { - string singleOptionName = (*i); - - // build uncontracted option name - string - uncontractedOptionName = - prefix->getPrefixErsatz () + singleOptionName; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "Expanding option '" << singleOptionName << - "' to '" << uncontractedOptionName << - "'" << - endl; - } -#endif - - // handle the uncontracted option name - handleOptionName (uncontractedOptionName); - } // for - } - } - - else { - printKnownPrefixes (); - - stringstream s; - - s << - "option prefix '" << prefixName << - "' is unknown, see help summary below"; - - oahError (s.str ()); - } -} - -bool oahHandler::optionNameIsASingleCharacterOptionsCluster ( - string optionName) -{ - bool result = true; // until the contrary is known - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "Checking whether optionName '" << optionName << "' is a single-character options cluster" << - endl; - } -#endif - - // sanity check - msrAssert ( - optionName.size () != 0, - "optionName.size () == 0"); - - list cluserElementsList; - - // collect single-character elements in cluserElementsList - for ( - string::const_iterator i = optionName.begin (); - i != optionName.end (); - i++ - ) { - string singleCharacterString (1, (*i)); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "Considering single-character '" << singleCharacterString << "'" << - endl; - } -#endif - - set::const_iterator - it = - fSingleCharacterShortNamesSet.find ( - singleCharacterString); - - if (it != fSingleCharacterShortNamesSet.end ()) { - // yes, singleCharacterString is known in the set - cluserElementsList.push_back ( - fetchOptionByName ( - singleCharacterString)); - } - else { - // no, singleCharacterString is not known in the set, - // optionName is not a cluster - result = false; // necessary if others are actually atoms short names JMI - } - } // for - - if (cluserElementsList.size () == fSingleCharacterShortNamesSet.size ()) { - // all the elements in cluserElementsList are single character options, - // handle them - for ( - list::const_iterator i = cluserElementsList.begin (); - i != cluserElementsList.end (); - i++ - ) { - S_oahElement element = (*i); - - // handle element name -#ifdef TRACE_OAH - if (true || gTraceOah->fTraceOah) { - gOutputOstream << - "handling single-character options cluster element " << - element->asString () << - endl; - } -#endif - - handleOptionName ( - element->getShortName ()); - } // for - } - - else { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "optionName '" << optionName << "' is no single-character options cluster" << - endl; - } -#endif - result = false; - } - - return result; -} - -void oahHandler::decipherOptionContainingEqualSign ( - string currentOptionName, - size_t equalsSignPosition) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "deciphering option containing equal sign" << - ", currentOptionName: '" << currentOptionName << "'" << - ", equalsSignPosition: '" << equalsSignPosition << "'" << - endl; - } -#endif - - // fetch the option name and the string after the equals sign - string name = - currentOptionName.substr (0, equalsSignPosition); - string stringAfterEqualsSign = - currentOptionName.substr (equalsSignPosition + 1); - - // prefixes have precedence over options with optional values - S_oahPrefix - prefix = - fetchPrefixFromMap (name); - - if (prefix) { - // handle prefix name -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - printKnownPrefixes (); - } -#endif - - handlePrefixName ( - name, - equalsSignPosition, - stringAfterEqualsSign); - } - - else { - // name is not the name of prefix - - // is it the name of an option? - S_oahElement - element = - fetchOptionByName (name); - - if (element) { - // name is the name of an option - if ( - // oahStringWithDefaultValueAtom? - S_oahStringWithDefaultValueAtom - stringWithDefaultValueAtom = - dynamic_cast(&(*element)) - ) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << - name << - "' is a stringWithDefaultValueAtom" << - endl; - } -#endif - - // handle the stringWithDefaultValueAtom - switch (fHandlerOptionalValuesStyleKind) { - case kOptionalValuesStyleGNU: // default value - stringWithDefaultValueAtom-> - handleValue ( - stringAfterEqualsSign, - gOutputOstream); - break; - case kOptionalValuesStyleOAH: - { - stringstream s; - - s << - "option name '" << name << - "' cannot be used with a '=' in OAH optional values style"; - - oahError (s.str ()); - } - break; - } // switch - } - else { - // name is not the name an a stringWithDefaultValueAtom - stringstream s; - - s << - "option name '" << name << - "' doesn't have a default value and thus cannot be used with a '='"; - - oahError (s.str ()); - } - } - - else { - // name is not the name of an option - stringstream s; - - s << - "option name '" << name << "' is not the name of an option"; - - oahError (s.str ()); - } - } -} - -string oahHandler::decipherOption ( - string currentString) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "deciphering currentString '" << currentString << "'" << - endl; - } -#endif - - string currentOptionName; - - string optionTrailer = - currentString.substr (1, string::npos); - - /* JMI - gOutputOstream << - "optionTrailer '" << optionTrailer << "' is preceded by a dash" << - endl; - */ - - // here, optionTrailer.size () >= 1 - - if (optionTrailer [0] == '-') { - // this is a double-dashed option, '--' has been found - - if (optionTrailer.size () == 1) { - // optionTrailer is '--' alone, that marks the end of the options - fNowEverythingIsAnArgument = true; - - return ""; - } - - else { - // optionTrailer is a double-dashed option - currentOptionName = - optionTrailer.substr (1, string::npos); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "'" << currentOptionName << "' is a double-dashed option" << - endl; - } -#endif - } - } - - else { - // it is a single-dashed option - currentOptionName = - optionTrailer; - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "'" << currentOptionName << "' is a single-dashed option" << - endl; - } -#endif - } - - // does currentOptionName contain an equal sign? - size_t equalsSignPosition = - currentOptionName.find ("="); - - if (equalsSignPosition != string::npos) { - // yes, there's an equal sign - decipherOptionContainingEqualSign ( - currentOptionName, - equalsSignPosition); - } - - else { - // no, there's no equal sign - // handle the current option name - handleOptionName (currentOptionName); - } - - return currentOptionName; -} - -const vector oahHandler::decipherOptionsAndArguments ( - int argc, - char* argv[]) -{ - // fetch program name - fHandlerExecutableName = string (argv [0]); - - fCommandLineAsSupplied = fHandlerExecutableName; - - /* JMI ??? - // print the number of option names - int handlerElementsMapSize = - fHandlerElementsMap.size (); - - gOutputOstream << - fHandlerExecutableName << - " features " << - handlerElementsMapSize << - " options names for " << - fHandlerRegisteredElementsMultiset.size () << - " registered elements" << - endl; -*/ - - // decipher the command options and arguments - int n = 1; - - string lastOptionNameFound; - - while (true) { - if (argv [n] == 0) - break; - - string currentString = string (argv [n]); - - fCommandLineAsSupplied += - " " + quoteStringIfNonAlpha (currentString); - - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - // print current option - gOutputOstream << - "Command line option " << n << - ": " << currentString << " "<< - endl; - } -#endif - - // handle current option - if (currentString [0] == '-') { - // stdin or option? - - if (currentString.size () == 1) { - // this is the stdin indicator -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "'" << currentString << - "' is the '-' stdin indicator" << - endl; - } -#endif - - fHandlerArgumentsVector.push_back (currentString); - } - - else { - // this is an option, first '-' has been found - // and currentString.size () >= 2 - - lastOptionNameFound = - decipherOption ( - currentString); - } - } - - else { - // currentString is no oahElement: - // it is an atom value or an argument - handleOptionValueOrArgument (currentString); - } - - // next please - n++; - } // while - - // is a pending valued atom value missing? - checkMissingPendingValuedAtomValue ( - lastOptionNameFound, - "last option in command line"); - - unsigned int argumentsVectorSize = - fHandlerArgumentsVector.size (); - -#ifdef TRACE_OAH - // display arc and argv only now, to wait for the options to have been handled - if (gTraceOah->fTraceOah || gOahOah->fShowOptionsAndArguments) { - gOutputOstream << - "argc: " << argc << - endl << - "argv:" << - endl; - - gIndenter++; - - for (int i = 0; i < argc; i++) { - gOutputOstream << - "argv [" << i << "]: " << argv [i] << - endl; - } // for - - gIndenter--; - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOahDetails) { - printKnownPrefixes (); - printKnownSingleCharacterOptions (); - printKnownOptions (); - } -#endif - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - // print the arguments vector - gOutputOstream << - "Arguments vector (" << - argumentsVectorSize << - " elements):" << - endl; - - if (argumentsVectorSize) { - gIndenter++; - for (unsigned int i = 0; i < argumentsVectorSize; i++) { - gOutputOstream << - fHandlerArgumentsVector [i] << - endl; - } // for - gIndenter--; - } - } -#endif - - // print the chosen options if so chosen - // ------------------------------------------------------ - -#ifdef TRACE_OAH - if (gOahOah->fDisplayOahValues) { - printAllOahCommandLineValues ( - gOutputOstream); - - gOutputOstream << endl; - } -#endif - - // was this run a 'pure help' one? -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "The value of fHandlerFoundAHelpOption is: " << - booleanAsString (fHandlerFoundAHelpOption) << - endl; - } -#endif - - if (fHandlerFoundAHelpOption) { -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> fHandlerFoundAHelpOption is true, exiting" << - endl; - } -#endif - - exit (0); - } - - // check the consistency of the options - checkHandlerGroupsOptionsConsistency (); - - // check the options and arguments - checkOptionsAndArguments (); - - // store the command line with options in gOahOah - // for whoever need them - gOahOah->fCommandLineAsSupplied = - commandLineAsSuppliedAsString (); - gOahOah->fCommandLineWithShortOptionsNames = - commandLineWithShortNamesAsString (); - gOahOah->fCommandLineWithLongOptionsNames = - commandLineWithLongNamesAsString (); - - // return arguments vector for handling by caller - return fHandlerArgumentsVector; -} - -void oahHandler::handleHandlerName ( - S_oahHandler handler, - string name) -{ - // print the handler help or help summary -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << name << "' is of type 'oahHandler'" << - endl; - } -#endif - - if ( - name == handler->getHandlerSummaryShortName () - || - name == handler->getHandlerSummaryLongName () - ) { - handler-> - printOptionsSummary ( - gOutputOstream); - } - else { - handler-> - printHelp ( - gOutputOstream); - } - - gOutputOstream << endl; -} - -void oahHandler::handleGroupName ( - S_oahGroup group, - string groupName) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << groupName << "' is of type 'oahGroup'" << - endl; - } -#endif - - // print the help - gOutputOstream << - endl << - "--- Help for group \"" << - group-> - getGroupHeader () << - "\" ---" << - endl << - endl; - - group-> - printHelp ( - gOutputOstream); -} - -void oahHandler::handleSubGroupName ( - S_oahSubGroup subGroup, - string subGroupName) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << subGroupName << "' is of type 'subGroup'" << - endl; - } -#endif - - // get the options group upLink - S_oahGroup - group = - subGroup-> - getGroupUpLink (); - - // print the help - gOutputOstream << - endl << - "--- Help for subgroup \"" << - subGroup-> - getSubGroupHeader () << - "\"" << - " in group \"" << - group-> - getGroupHeader () << - "\" ---" << - endl << - endl; - - group-> - printGroupAndSubGroupHelp ( - gOutputOstream, - subGroup); -} - -void oahHandler::handleAtomName ( - S_oahAtom atom, - string atomName) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> oahHandler: handling atomName '" << atomName << - "', atom: "<< - atom->asString () << - "'" << - endl; - } -#endif - - if ( - // atom synonym? - S_oahAtomSynonym - atomSynonym = - dynamic_cast(&(*atom)) - ) { - // yes, use the original atom instead - - S_oahAtom - originalOahAtom = - atomSynonym->getOriginalOahAtom (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << atomName << "' is a synonym for '" << - originalOahAtom->asString () << - "'" << - endl; - } -#endif - - this->handleAtomName ( - originalOahAtom, - atomSynonym->getShortName ()); - } - - else { - // atom is a plain atom - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> option '" << atomName << "' is a plain atom '" << - "'" << - endl; - } -#endif - - // is the value for a pending valued atom missing? - string context = - "before option " + atom->asString (); - - checkMissingPendingValuedAtomValue ( - atomName, - context); - - // delegate the handling to the atom - fPendingValuedAtom = - atom-> - handleOptionUnderName ( - atomName, - gOutputOstream); - } -} - -void oahHandler::handleOptionName ( - string name) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - endl << - "==> oahHandler::handleOptionName(), handling name \"" << - name << - "\"" << - endl; - } -#endif - - // is name known in options map? - S_oahElement - element = - fetchElementFromMap (name); - - if (! element) { - // name is unknown -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - endl << - "==> oahHandler::handleOptionName (), name = \"" << - name << - "\" is not known" << - endl; - } -#endif - - if ( - // is it a single-character options cluster? - name.size () > 1 - && - optionNameIsASingleCharacterOptionsCluster (name) - ) { - // the options contained in name have just been handled, - // do nothing more - } - - else { - // name is unknown to this OAH handler - - stringstream s; - - s << - "option name '" << name << "' is unknown"; - - oahError (s.str ()); - } - } - - else { - // name is a known element, let's handle it -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - endl << - "==> oahHandler::handleOptionName (), name = \"" << - name << - "\" is described by option:" << - endl; - gIndenter++; - element->print (gOutputOstream); - gIndenter--; - } -#endif - - // is this element already present in the commande line? - multiset::const_iterator - it = - fHandlerCommandLineElementsMultiset.find ( - element); - - if (it != fHandlerCommandLineElementsMultiset.end ()) { - // yes, element is known in the list - if (! element->getMultipleOccurrencesAllowed ()) { - stringstream s; - - s << - "element '" << - element->fetchNames () << - "' is already present in the command line"; - - oahWarning (s.str ()); - } - } - - // remember this element as occurring in the command line - fHandlerCommandLineElementsList.push_back (element); - fHandlerCommandLineElementsMultiset.insert (element); - - // determine element short and long names to be used, - // in case one of them (short or long) is empty - string - shortName = - element->getShortName (), - longName = - element->getLongName (); - - string - shortNameToBeUsed = shortName, - longNameToBeUsed = longName; - - // replace empty element name if any by the other one, - // since they can't both be empty - if (! shortNameToBeUsed.size ()) { - shortNameToBeUsed = longNameToBeUsed; - } - if (! longNameToBeUsed.size ()) { - longNameToBeUsed = shortNameToBeUsed; - } - - // handle the option - if ( - // options handler? - S_oahHandler - handler = - dynamic_cast(&(*element)) - ) { - handleHandlerName ( - handler, - name); - } - - else if ( - // options group? - S_oahGroup - group = - dynamic_cast(&(*element)) - ) { - handleGroupName ( - group, - name); - } - - else if ( - // options subgroup? - S_oahSubGroup - subGroup = - dynamic_cast(&(*element)) - ) { - handleSubGroupName ( - subGroup, - name); - } - - else if ( - // atom? - S_oahAtom - atom = - dynamic_cast(&(*element)) - ) { - handleAtomName ( - atom, - name); - } - - else { - stringstream s; - - s << - "INTERNAL ERROR: option name '" << name << "' cannot be handled"; - - oahError (s.str ()); - } - } -} - -void oahHandler::handleOptionValueOrArgument ( - string theString) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "==> handleOptionValueOrArgument ()" << - endl; - - gIndenter++; - - gOutputOstream << - "fPendingValuedAtom:" << - endl; - - gIndenter++; - if (fPendingValuedAtom) { - gOutputOstream << - fPendingValuedAtom; - } - else { - gOutputOstream << - "null" << - endl; - } - gIndenter--; - - gOutputOstream << - "theString:" << - endl; - - gIndenter++; - gOutputOstream << - " \"" << - theString << - "\"" << - endl; - gIndenter--; - - gIndenter--; - } -#endif - - // options are handled at once, unless they are valued, - // in which case the handling of the option and its value - // are postponed until the latter is available - if (fPendingValuedAtom) { - // theString is the value for the pending valued atom - fPendingValuedAtom->handleValue ( - theString, - gOutputOstream); - - fPendingValuedAtom = nullptr; - } - - else { - // theString is an argument - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gOutputOstream << - "'" << theString << "'" << - " is an argument, not an option" << - endl; - } -#endif - - fHandlerArgumentsVector.push_back (theString); - } -} - - -} diff --git a/src/lilypond/oahBasicTypes.h b/src/lilypond/oahBasicTypes.h deleted file mode 100644 index 2b15dc0a9..000000000 --- a/src/lilypond/oahBasicTypes.h +++ /dev/null @@ -1,3309 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___optionsBasicTypes___ -#define ___optionsBasicTypes___ - -#include "list" -#include "vector" -#include "map" -#include "set" - -#include "smartpointer.h" -#include "rational.h" - -#include "tree_browser.h" -#include "visitor.h" - -#include "msrMidi.h" - -#include "utilities.h" - -#include "msrBasicTypes.h" -#include "lpsrBasicTypes.h" - -#include "setTraceOahIfDesired.h" - -#include "oahElements.h" - -using namespace std; - -namespace MusicXML2 -{ - -// PRE-declarations for class dependencies -//______________________________________________________________________________ -class oahValuedAtom; -typedef SMARTP S_oahValuedAtom; - -class oahSubGroup; -typedef SMARTP S_oahSubGroup; - -class oahGroup; -typedef SMARTP S_oahGroup; - -class EXP oahHandler; -typedef SMARTP S_oahHandler; - -//______________________________________________________________________________ -class oahAtom : public oahElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahAtom ( - string shortName, - string longName, - string description); - - virtual ~oahAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setSubGroupUpLink ( - S_oahSubGroup subGroup); - - S_oahSubGroup getSubGroupUpLink () const - { return fSubGroupUpLink; } - - public: - - // services - // ------------------------------------------------------ - - void registerAtomInHandler ( - S_oahHandler handler); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - virtual void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - protected: - - // fields - // ------------------------------------------------------ - - S_oahSubGroup fSubGroupUpLink; -}; -typedef SMARTP S_oahAtom; -EXP ostream& operator<< (ostream& os, const S_oahAtom& elt); - -//______________________________________________________________________________ -class oahAtomSynonym : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - S_oahAtom originalOahAtom); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahAtomSynonym ( - string shortName, - string longName, - string description, - S_oahAtom originalOahAtom); - - virtual ~oahAtomSynonym (); - - public: - - // set and get - // ------------------------------------------------------ - - S_oahAtom getOriginalOahAtom () const - { return fOriginalOahAtom; } - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - S_oahAtom fOriginalOahAtom; -}; -typedef SMARTP S_oahAtomSynonym; -EXP ostream& operator<< (ostream& os, const S_oahAtomSynonym& elt); - -//______________________________________________________________________________ -class oahOptionsUsageAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahOptionsUsageAtom ( - string shortName, - string longName, - string description); - - virtual ~oahOptionsUsageAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - -// void printOptionsUsage (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_oahOptionsUsageAtom; -EXP ostream& operator<< (ostream& os, const S_oahOptionsUsageAtom& elt); - -//______________________________________________________________________________ -class oahOptionsSummaryAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahOptionsSummaryAtom ( - string shortName, - string longName, - string description); - - virtual ~oahOptionsSummaryAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printOptionsSummary (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_oahOptionsSummaryAtom; -EXP ostream& operator<< (ostream& os, const S_oahOptionsSummaryAtom& elt); - -//______________________________________________________________________________ -class oahAtomWithVariableName : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string variableName); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahAtomWithVariableName ( - string shortName, - string longName, - string description, - string variableName); - - virtual ~oahAtomWithVariableName (); - - public: - - // set and get - // ------------------------------------------------------ - - string getVariableName () const - { return fVariableName; } - - public: - - // services - // ------------------------------------------------------ - - virtual int fetchVariableNameLength () const - { return fVariableName.size (); } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - protected: - - // fields - // ------------------------------------------------------ - - string fVariableName; -}; -typedef SMARTP S_oahAtomWithVariableName; -EXP ostream& operator<< (ostream& os, const S_oahAtomWithVariableName& elt); - -//______________________________________________________________________________ -class oahBooleanAtom : public oahAtomWithVariableName -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahBooleanAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable); - - virtual ~oahBooleanAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setBooleanVariable ( - bool value) - { fBooleanVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - protected: - - // fields - // ------------------------------------------------------ - - bool& fBooleanVariable; -}; -typedef SMARTP S_oahBooleanAtom; -EXP ostream& operator<< (ostream& os, const S_oahBooleanAtom& elt); - -//______________________________________________________________________________ -class oahTwoBooleansAtom : public oahBooleanAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahTwoBooleansAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable); - - virtual ~oahTwoBooleansAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setTwoBooleansVariables ( - bool value) - { - fBooleanVariable = - value; - fBooleanSecondaryVariable = - value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bool& fBooleanSecondaryVariable; -}; -typedef SMARTP S_oahTwoBooleansAtom; -EXP ostream& operator<< (ostream& os, const S_oahTwoBooleansAtom& elt); - -//______________________________________________________________________________ -class oahThreeBooleansAtom : public oahBooleanAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable, - bool& booleanTertiaryVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahThreeBooleansAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable, - bool& booleanSecondaryVariable, - bool& booleanTertiaryVariable); - - virtual ~oahThreeBooleansAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setThreeBooleansVariables ( - bool value) - { - fBooleanVariable = - value; - fBooleanSecondaryVariable = - value; - fBooleanTertiaryVariable = - value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bool& fBooleanSecondaryVariable; - bool& fBooleanTertiaryVariable; -}; -typedef SMARTP S_oahThreeBooleansAtom; -EXP ostream& operator<< (ostream& os, const S_oahThreeBooleansAtom& elt); - -//______________________________________________________________________________ -class oahCombinedBooleansAtom : public oahAtomWithVariableName -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahCombinedBooleansAtom ( - string shortName, - string longName, - string description, - string variableName, - bool& booleanVariable); - - virtual ~oahCombinedBooleansAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - const list& - getBooleanAtomsList () - { return fBooleanAtomsList; } - - // services - // ------------------------------------------------------ - - void addBooleanAtom ( - S_oahBooleanAtom booleanAtom); - - void addBooleanAtomByName ( - string name); - - void setCombinedBooleanVariables ( - bool value); - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printHelp (ostream& os); - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - bool& fBooleanVariable; - - list - fBooleanAtomsList; -}; -typedef SMARTP S_oahCombinedBooleansAtom; -EXP ostream& operator<< (ostream& os, const S_oahCombinedBooleansAtom& elt); - -//______________________________________________________________________________ -class oahPrefix; -typedef SMARTP S_oahPrefix; - -class oahPrefix : public smartable -/* -An options prefix 'trace' --> 'trace-' allows: - -trace=abc,def,gh -to be developped into : - -trace-abc -trace-def -trace-gh -*/ -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string prefixName, - string prefixErsatz, - string prefixDescription); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahPrefix ( - string prefixName, - string prefixErsatz, - string prefixDescription); - - virtual ~oahPrefix (); - - public: - - // set and get - // ------------------------------------------------------ - - string getPrefixName () const - { return fPrefixName; } - - string getPrefixErsatz () const - { return fPrefixErsatz; } - - string getPrefixDescription () const - { return fPrefixDescription; } - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - string prefixNames () const; - string prefixNamesInColumns ( - int subGroupsShortNameFieldWidth) const; - - string prefixNamesBetweenParentheses () const; - string prefixNamesInColumnsBetweenParentheses ( - int subGroupsShortNameFieldWidth) const; - - string operator () () const - { return fPrefixErsatz; } - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void printPrefixHeader (ostream& os) const; - - virtual void printPrefixEssentials ( - ostream& os, - int fieldWidth) const; - - virtual void print (ostream& os) const; - - virtual void printHelp (ostream& os); - - protected: - - // fields - // ------------------------------------------------------ - - string fPrefixName; - string fPrefixErsatz; - string fPrefixDescription; -}; -EXP ostream& operator<< (ostream& os, const S_oahPrefix& elt); - -//______________________________________________________________________________ -class oahMultiplexBooleansAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string description, - string shortSuffixDescriptor, - string longSuffixDescriptor, - S_oahPrefix shortNamesPrefix, - S_oahPrefix longNamesPrefix); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahMultiplexBooleansAtom ( - string description, - string shortSuffixDescriptor, - string longSuffixDescriptor, - S_oahPrefix shortNamesPrefix, - S_oahPrefix longNamesPrefix); - - virtual ~oahMultiplexBooleansAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - const list& - getBooleanAtomsList () - { return fBooleanAtomsList; } - - // services - // ------------------------------------------------------ - - void addBooleanAtom ( - S_oahBooleanAtom booleanAtom); - - void addBooleanAtomByName ( - string name); - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printHelp (ostream& os); - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - S_oahPrefix fShortNamesPrefix; - S_oahPrefix fLongNamesPrefix; - - string fShortSuffixDescriptor; - string fLongSuffixDescriptor; - - list - fBooleanAtomsList; - - string fShortNamesPrefixName; - string fLongNamesPrefixName; - - list fShortNamesSuffixes; - list fLongNamesSuffixes; -}; -typedef SMARTP S_oahMultiplexBooleansAtom; -EXP ostream& operator<< (ostream& os, const S_oahMultiplexBooleansAtom& elt); - -//______________________________________________________________________________ -class oahValuedAtom : public oahAtomWithVariableName -{ - public: - - // data types - // ------------------------------------------------------ - - enum oahValuedAtomKind { // JMI ??? - kAtomHasNoArgument, - kAtomHasARequiredArgument, - kAtomHasAnOptionsArgument }; - - static string oahAtomKindAsString ( - oahValuedAtomKind oahAtomKind); - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahValuedAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName); - - virtual ~oahValuedAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - oahValuedAtomKind - getValuedAtomKind () const - { return fValuedAtomKind; } - - string getValueSpecification () const - { return fValueSpecification; } - - void setValueIsOptional (); - - bool getValueIsOptional () const - { return fValueIsOptional; } - - public: - - // services - // ------------------------------------------------------ - - virtual void handleValue ( - string theString, - ostream& os) = 0; - - virtual void handleDefaultValue (); - // used only if fValueIsOptional is true - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual void printValuedAtomEssentials ( - ostream& os, - int fieldWidth) const; - - void print (ostream& os) const; - - void printHelp (ostream& os); - - virtual void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - protected: - - // fields - // ------------------------------------------------------ - - oahValuedAtomKind fValuedAtomKind; // JMI - - string fValueSpecification; - - bool fValueIsOptional; -}; -typedef SMARTP S_oahValuedAtom; -EXP ostream& operator<< (ostream& os, const S_oahValuedAtom& elt); - -// optional values style -//______________________________________________________________________________ -enum oahOptionalValuesStyleKind { - kOptionalValuesStyleGNU, // default value - kOptionalValuesStyleOAH }; - -string oahOptionalValuesStyleKindAsString ( - oahOptionalValuesStyleKind optionalValuesStyleKind); - -extern map - gOahOptionalValuesStyleKindsMap; - -string existingOahOptionalValuesStyleKinds (int namesListMaxLength); - -void initializeOahOptionalValuesStyleKindsMap (); - -//______________________________________________________________________________ -class oahIntegerAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahIntegerAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable); - - protected: - - - virtual ~oahIntegerAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setIntegerVariable ( - int value) - { fIntegerVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - protected: - - // fields - // ------------------------------------------------------ - - int& fIntegerVariable; -}; -typedef SMARTP S_oahIntegerAtom; -EXP ostream& operator<< (ostream& os, const S_oahIntegerAtom& elt); - -//______________________________________________________________________________ -class oahTwoIntegersAtom : public oahIntegerAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable, - int& integerSecondaryVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahTwoIntegersAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - int& integerVariable, - int& integerSecondaryVariable); - - protected: - - - virtual ~oahTwoIntegersAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setIntegerVariable ( - int value) - { fIntegerVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - private: - - // fields - // ------------------------------------------------------ - - int& fIntegerSecondaryVariable; -}; -typedef SMARTP S_oahTwoIntegersAtom; -EXP ostream& operator<< (ostream& os, const S_oahTwoIntegersAtom& elt); - -//______________________________________________________________________________ -class oahFloatAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - float& floatVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahFloatAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - float& floatVariable); - - virtual ~oahFloatAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setFloatVariable ( - float value) - { fFloatVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - float& fFloatVariable; -}; -typedef SMARTP S_oahFloatAtom; -EXP ostream& operator<< (ostream& os, const S_oahFloatAtom& elt); - -//______________________________________________________________________________ -class oahStringAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahStringAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable); - - virtual ~oahStringAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringVariable ( - string value) - { fStringVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - protected: - - // fields - // ------------------------------------------------------ - - string& fStringVariable; -}; -typedef SMARTP S_oahStringAtom; -EXP ostream& operator<< (ostream& os, const S_oahStringAtom& elt); - -//______________________________________________________________________________ -class oahMonoplexStringAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string description, - string atomNameDescriptor, - string stringValueDescriptor); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahMonoplexStringAtom ( - string description, - string atomNameDescriptor, - string stringValueDescriptor); - - virtual ~oahMonoplexStringAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - const list& - getStringAtomsList () - { return fStringAtomsList; } - - // services - // ------------------------------------------------------ - - void addStringAtom ( - S_oahStringAtom stringAtom); - - void addStringAtomByName ( - string name); - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printHelp (ostream& os); - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - string fAtomNameDescriptor; - string fStringValueDescriptor; - - list - fStringAtomsList; - - list fAtomNamesList; -}; -typedef SMARTP S_oahMonoplexStringAtom; -EXP ostream& operator<< (ostream& os, const S_oahMonoplexStringAtom& elt); - -//______________________________________________________________________________ -class oahStringWithDefaultValueAtom : public oahStringAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultStringValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahStringWithDefaultValueAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultStringValue); - - virtual ~oahStringWithDefaultValueAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringVariable ( - string value) - { oahStringAtom::setStringVariable (value); } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - protected: - - // fields - // ------------------------------------------------------ - - string fDefaultStringValue; -}; -typedef SMARTP S_oahStringWithDefaultValueAtom; -EXP ostream& operator<< (ostream& os, const S_oahStringWithDefaultValueAtom& elt); - -//______________________________________________________________________________ -class oahRationalAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - rational& rationalVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahRationalAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - rational& rationalVariable); - - virtual ~oahRationalAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setRationalVariable ( - rational value) - { fRationalVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - rational& fRationalVariable; -}; -typedef SMARTP S_oahRationalAtom; -EXP ostream& operator<< (ostream& os, const S_oahRationalAtom& elt); - -//______________________________________________________________________________ -class oahNaturalNumbersSetAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& naturalNumbersSetVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahNaturalNumbersSetAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& naturalNumbersSetVariable); - - virtual ~oahNaturalNumbersSetAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setNaturalNumbersSetVariable ( - set value) - { fNaturalNumbersSetVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - set& fNaturalNumbersSetVariable; -}; -typedef SMARTP S_oahNaturalNumbersSetAtom; -EXP ostream& operator<< (ostream& os, const S_oahNaturalNumbersSetAtom& elt); - -//______________________________________________________________________________ -class oahRGBColorAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrRGBColor& RGBColorVariable, - bool& hasBeenSetVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahRGBColorAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrRGBColor& RGBColorVariable, - bool& hasBeenSetVariable); - - virtual ~oahRGBColorAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setRGBColorVariable ( - msrRGBColor value) - { fRGBColorVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - msrRGBColor& fRGBColorVariable; - bool& fHasBeenSetVariable; -}; -typedef SMARTP S_oahRGBColorAtom; -EXP ostream& operator<< (ostream& os, const S_oahRGBColorAtom& elt); - -//______________________________________________________________________________ -class oahIntSetAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& intSetVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahIntSetAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& intSetVariable); - - virtual ~oahIntSetAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - const set& getIntSetVariable () - { return fIntSetVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - set& fIntSetVariable; -}; -typedef SMARTP S_oahIntSetAtom; -EXP ostream& operator<< (ostream& os, const S_oahIntSetAtom& elt); - -//______________________________________________________________________________ -class oahStringSetAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahStringSetAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - set& stringSetVariable); - - virtual ~oahStringSetAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringSetVariable ( - string partName) - { fStringSetVariable.insert (partName); } - - const set& getStringSetVariable () - { return fStringSetVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - set& fStringSetVariable; -}; -typedef SMARTP S_oahStringSetAtom; -EXP ostream& operator<< (ostream& os, const S_oahStringSetAtom& elt); - -//______________________________________________________________________________ -class oahStringToIntMapAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringToIntMapVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahStringToIntMapAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - map& stringToIntMapVariable); - - virtual ~oahStringToIntMapAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - const map& - getStringToIntMapVariable () - { return fStringToIntMapVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - map& fStringToIntMapVariable; -}; -typedef SMARTP S_oahStringToIntMapAtom; -EXP ostream& operator<< (ostream& os, const S_oahStringToIntMapAtom& elt); - -//______________________________________________________________________________ -class oahStringAndIntegerAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string stringVariableName, - string& stringVariable, - string integerVariableName, - int& integerVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahStringAndIntegerAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string stringVariableName, - string& stringVariable, - string integerVariableName, - int& integerVariable); - - virtual ~oahStringAndIntegerAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringVariable ( - string value) - { fStringVariable = value; } - - string getStringVariable () const - { return fStringVariable; } - - void setIntegerVariable ( - int value) - { fIntegerVariable = value; } - - int getIntegerVariable () const - { return fIntegerVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - string fStringVariableName; - string& fStringVariable; - - string fIntegerVariableName; - int& fIntegerVariable; -}; -typedef SMARTP S_oahStringAndIntegerAtom; -EXP ostream& operator<< (ostream& os, const S_oahStringAndIntegerAtom& elt); - -//______________________________________________________________________________ -class oahStringAndTwoIntegersAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - int& primaryIntegerVariable, - int& secondaryIntegerVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahStringAndTwoIntegersAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - int& primaryIntegerVariable, - int& secondaryIntegerVariable); - - virtual ~oahStringAndTwoIntegersAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setStringVariable ( - string value) - { fStringVariable = value; } - - string getStringVariable () const - { return fStringVariable; } - - void setPrimaryIntegerVariable ( - int value) - { fPrimaryIntegerVariable = value; } - - int getPrimaryIntegerVariable () const - { return fPrimaryIntegerVariable; } - - void setSecondaryIntegerVariable ( - int value) - { fSecondaryIntegerVariable = value; } - - int getSecondaryIntegerVariable () const - { return fSecondaryIntegerVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - string& fStringVariable; - - int& fPrimaryIntegerVariable; - int& fSecondaryIntegerVariable; -}; -typedef SMARTP S_oahStringAndTwoIntegersAtom; -EXP ostream& operator<< (ostream& os, const S_oahStringAndTwoIntegersAtom& elt); - -//______________________________________________________________________________ -class oahLengthUnitKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLengthUnitKind& lengthUnitKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahLengthUnitKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLengthUnitKind& lengthUnitKindVariable); - - virtual ~oahLengthUnitKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setLengthUnitKindVariable ( - msrLengthUnitKind value) - { fLengthUnitKindVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - msrLengthUnitKind& fLengthUnitKindVariable; -}; -typedef SMARTP S_oahLengthUnitKindAtom; -EXP ostream& operator<< (ostream& os, const S_oahLengthUnitKindAtom& elt); - -//______________________________________________________________________________ -class oahLengthAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLength& lengthVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahLengthAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrLength& lengthVariable); - - virtual ~oahLengthAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setLengthVariable ( - msrLength value) - { fLengthVariable = value; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - msrLength& fLengthVariable; -}; -typedef SMARTP S_oahLengthAtom; -EXP ostream& operator<< (ostream& os, const S_oahLengthAtom& elt); - -//______________________________________________________________________________ -class oahMidiTempoAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrMidiTempo& midiTempoVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahMidiTempoAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - msrMidiTempo& midiTempoVariable); - - virtual ~oahMidiTempoAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setMidiTempoAtomVariable ( - msrMidiTempo& value) - { fMidiTempoAtomVariable = value; } - - const msrMidiTempo& getMidiTempoAtomVariable () - { return fMidiTempoAtomVariable; } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - msrMidiTempo& fMidiTempoAtomVariable; -}; -typedef SMARTP S_oahMidiTempoAtom; -EXP ostream& operator<< (ostream& os, const S_oahMidiTempoAtom& elt); - -//______________________________________________________________________________ -class oahOptionNameHelpAtom : public oahStringWithDefaultValueAtom -{ -/* - This is where OAH is introspective: - OAH provides a way to obtain help on any option name, - be it one to print help about a group or subgroup, - or the name of a 'regular' atom. - This option is reflexive, since it can provide help about itself. -*/ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultOptionName); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahOptionNameHelpAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - string& stringVariable, - string defaultOptionName); - - protected: - - - virtual ~oahOptionNameHelpAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - void handleDefaultValue (); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - virtual void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - private: - - // fields - // ------------------------------------------------------ - - string fValueSpecification; -}; -typedef SMARTP S_oahOptionNameHelpAtom; -EXP ostream& operator<< (ostream& os, const S_oahOptionNameHelpAtom& elt); - -//_______________________________________________________________________________ -class oahSubGroup : public oahElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string subGroupHeader, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahGroup groupUpLink); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahSubGroup ( - string subGroupHeader, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahGroup groupUpLink); - - virtual ~oahSubGroup (); - - public: - - // set and get - // ------------------------------------------------------ - - void setGroupUpLink ( - S_oahGroup oahGroup) - { fGroupUpLink = oahGroup; } - - S_oahGroup getGroupUpLink () const - { return fGroupUpLink; } - - string getSubGroupHeader () const - { return fSubGroupHeader; } - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // services - // ------------------------------------------------------ - - void underlineSubGroupHeader (ostream& os) const; - - void registerSubGroupInHandler ( - S_oahHandler handler); - - void appendAtomToSubGroup ( - S_oahAtom oahAtom); - - S_oahElement fetchOptionByName ( - string name); - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printHelp (ostream& os); - - void printHelpWithHeaderWidth ( - ostream& os, - int subGroupHeaderWidth); - - void printSubGroupHeader (ostream& os) const; - void printSubGroupHeaderWithHeaderWidth ( - ostream& os, - int subGroupHeaderWidth) const; - - void printSubGroupHelp ( - ostream& os) const; - - void printSubGroupAndAtomHelp ( - ostream& os, - S_oahAtom targetAtom) const; - - void printOptionsSummary (ostream& os) const; - - void printSubGroupSpecificHelpOrOptionsSummary ( - ostream& os, - S_oahSubGroup subGroup) const; - - void printSubGroupOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ - - S_oahGroup fGroupUpLink; - - string fSubGroupHeader; - - list fAtomsList; -}; -typedef SMARTP S_oahSubGroup; -EXP ostream& operator<< (ostream& os, const S_oahSubGroup& elt); - -//_______________________________________________________________________________ -class oahGroup : public oahElement -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string header, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahHandler groupHandlerUpLink); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahGroup ( - string header, - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind, - S_oahHandler groupHandlerUpLink); - - virtual ~oahGroup (); - - public: - - // set and get - // ------------------------------------------------------ - - string getGroupHeader () const - { return fGroupHeader; } - - public: - - // consistency check - // ------------------------------------------------------ - - void checkGroupSubGroupsOptionsConsistency (); - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - void underlineGroupHeader (ostream& os) const; - - void registerGroupInHandler ( - S_oahHandler handler); - - void appendSubGroupToGroup ( - S_oahSubGroup subGroup); - - S_oahElement fetchOptionByName ( - string name); - - virtual void handleAtomValue ( - ostream& os, - S_oahAtom atom, - string theString); - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printGroupHeader (ostream& os) const; - - void printHelp (ostream& os); - - void printGroupAndSubGroupHelp ( - ostream& os, - S_oahSubGroup targetSubGroup) const; - - void printGroupAndSubGroupAndAtomHelp ( - ostream& os, - S_oahSubGroup targetSubGroup, - S_oahAtom targetAtom) const; - - void printOptionsSummary (ostream& os) const; - - void printGroupAndSubGroupSpecificHelp ( - ostream& os, - S_oahSubGroup subGroup) const; - - void printGroupOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - protected: - - // protected fields - // ------------------------------------------------------ - - string fGroupHeader; - - list fSubGroupsList; -}; -typedef SMARTP S_oahGroup; -EXP ostream& operator<< (ostream& os, const S_oahGroup& elt); - -//_______________________________________________________________________________ -class EXP oahHandler : public oahElement -{ - // data types - // ------------------------------------------------------ - - enum oahOptionsDefaultValuesStyle { - kGNUStyle, - kOAHStyle }; - - static string optionsDefaultValuesStyleAsString ( - oahOptionsDefaultValuesStyle optionsDefaultValuesStyle); - - public: - - // creation - // ------------------------------------------------------ -/* JMI this a pure virtual class - static SMARTP create ( - string handlerHeader, - string handlerValuesHeader, - string optionHoahHandlerandlerHelpShortName, - string handlerLongName, - string handlerSummaryShortName, - string handlerSummaryLongName, - string handlerPreamble, - string handlerUsage, - string handlerDescription, - indentedOstream& handlerLogOstream); -*/ - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahHandler ( - string handlerHeader, - string handlerValuesHeader, - string handlerShortName, - string handlerLongName, - string handlerSummaryShortName, - string handlerSummaryLongName, - string handlerPreamble, - string handlerUsage, - string handlerDescription, - indentedOstream& handlerLogOstream); - - virtual ~oahHandler (); - - public: - - // set and get - // ------------------------------------------------------ - - string getHandlerHeader () const - { return fHandlerHeader; } - - string getOptionsHandlerValuesHeader () const - { return fHandlerValuesHeader; } - - string getHandlerSummaryShortName () const - { return fHandlerSummaryShortName; } - - string getHandlerSummaryLongName () const - { return fHandlerSummaryLongName; } - - string getHandlerPreamble () const - { return fHandlerPreamble; } - - string getHandlerUsage () const - { return fHandlerUsage; } - - string getExecutableName () const - { return fHandlerExecutableName; } - - ostream& getHandlerLogOstream () - { return fHandlerLogOstream; } - - oahOptionalValuesStyleKind& - getHandlerOptionalValuesStyleKind () - { return fHandlerOptionalValuesStyleKind; } - - const list& - getHandlerRegisteredElementsList () const - { return fHandlerRegisteredElementsList; } - - const list& - getHandlerCommandLineElementsList () const - { return fHandlerCommandLineElementsList; } - const multiset& - getHandlerCommandLineElementsMultiset () const - { return fHandlerCommandLineElementsMultiset; } - - int getMaximumShortNameWidth () const - { return fMaximumShortNameWidth; } - - int getMaximumLongNameWidth () const - { return fMaximumLongNameWidth; } - - int getMaximumSubGroupsHeadersSize () const - { return fMaximumSubGroupsHeadersSize; } - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - void appendPrefixToHandler ( - S_oahPrefix prefix); - - S_oahPrefix fetchPrefixInMapByItsName ( - string prefixName); - - void appendGroupToHandler ( - S_oahGroup oahGroup); - void prependGroupToHandler ( - S_oahGroup oahGroup); - - void registerElementInHandler ( - S_oahElement element); - - void registerHandlerInItself (); - - S_oahPrefix fetchPrefixFromMap ( - string name) const; - - S_oahElement fetchElementFromMap ( - string name) const; - - void handlePrefixName ( - string prefixName, - size_t equalsSignPosition, - string stringAfterEqualsSign); - - bool optionNameIsASingleCharacterOptionsCluster ( - string optionName); - - const vector decipherOptionsAndArguments ( - int argc, - char* argv[]); - - string decipherOption ( - string currentString); - - void decipherOptionContainingEqualSign ( - string currentOptionName, - size_t equalsSignPosition); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string commandLineAsSuppliedAsString () const; - string commandLineWithShortNamesAsString () const; - string commandLineWithLongNamesAsString () const; - - void print (ostream& os) const; - - void printHelp (ostream& os); - - void printOptionsSummary (ostream& os) const; - void printOptionsSummary () const - { printOptionsSummary (fHandlerLogOstream); } - - void printHandlerAndGroupAndSubGroupSpecificHelp ( - ostream& os, - S_oahSubGroup subGroup) const; - - void printOptionNameIntrospectiveHelp ( - ostream& os, - string name) const; - - void printAllOahCommandLineValues ( - ostream& os) const; - - void setOptionsHandlerFoundAHelpOption () - { fHandlerFoundAHelpOption = true; } - - bool getOptionsHandlerFoundAHelpOption () const - { return fHandlerFoundAHelpOption; } - - private: - - // private services - // ------------------------------------------------------ - - string handlerOptionNamesBetweenParentheses () const; - - void registerElementNamesInHandler ( - S_oahElement element); - - void printKnownPrefixes () const; - void printKnownSingleCharacterOptions () const; - void printOptionsDefaultValuesInformation () const; - void printKnownOptions () const; - - S_oahElement fetchOptionByName ( - string name); - - void handleOptionName ( - string name); - - void handleHandlerName ( - S_oahHandler handler, - string name); - - void handleGroupName ( - S_oahGroup group, - string groupName); - - void handleSubGroupName ( - S_oahSubGroup subGroup, - string subGroupName); - - void handleAtomName ( - S_oahAtom atom, - string atomName); - - void handleOptionValueOrArgument ( - string theString); - - void checkMissingPendingValuedAtomValue ( - string atomName, - string context); - - virtual void checkOptionsAndArguments () = 0; - - void checkHandlerGroupsOptionsConsistency (); - - protected: - - // protected fields - // ------------------------------------------------------ - - string fCommandLineAsSupplied; - - string fHandlerHeader; - string fHandlerValuesHeader; - - string fHandlerSummaryShortName; - string fHandlerSummaryLongName; - - string fHandlerPreamble; - - string fHandlerUsage; - - map - fHandlerPrefixesMap; - - set fSingleCharacterShortNamesSet; - - list fHandlerGroupsList; - - map - fHandlerElementsMap; - - vector fHandlerArgumentsVector; - - string fHandlerExecutableName; - - oahOptionalValuesStyleKind - fHandlerOptionalValuesStyleKind; - - ostream& fHandlerLogOstream; - - // this is needed to exit if the executable is launched - // with one or more help options, - // i.e. options that are only used to display help to the user - bool fHandlerFoundAHelpOption; - - private: - - // private services - // ------------------------------------------------------ - - int getMaximumVariableNameWidth () const - { return fMaximumVariableNameWidth; } - - private: - - // work fields - // ------------------------------------------------------ - - // all OAH elements are registered in the handler upon initialization - list fHandlerRegisteredElementsList; - - // those ones have be used in the command line - list fHandlerCommandLineElementsList; - multiset - fHandlerCommandLineElementsMultiset; - - bool fNowEverythingIsAnArgument; - - oahOptionsDefaultValuesStyle - fOahOptionsDefaultValuesStyle; - - int fMaximumSubGroupsHeadersSize; - - int fMaximumShortNameWidth; - int fMaximumLongNameWidth; - - int fMaximumVariableNameWidth; - - S_oahValuedAtom fPendingValuedAtom; -}; -typedef SMARTP S_oahHandler; -EXP ostream& operator<< (ostream& os, const S_oahHandler& elt); - - -} - - -#endif - diff --git a/src/lilypond/oahElements.cpp b/src/lilypond/oahElements.cpp deleted file mode 100644 index 50e63dc2b..000000000 --- a/src/lilypond/oahElements.cpp +++ /dev/null @@ -1,380 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "messagesHandling.h" - -#include "oahOah.h" - -#include "oahElements.h" - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -string optionVisibilityKindAsString ( - oahElementVisibilityKind optionVisibilityKind) -{ - string result; - - switch (optionVisibilityKind) { - case kElementVisibilityAlways: - result = "elementVisibilityAlways"; - break; - - case kElementVisibilityHiddenByDefault: - result = "elementVisibilityHiddenByDefault"; - break; - } // switch - - return result; -} - -//______________________________________________________________________________ -S_oahElement oahElement::create ( - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind) -{ - oahElement* o = new - oahElement ( - shortName, - longName, - description, - optionVisibilityKind); - assert(o!=0); - return o; -} - -oahElement::oahElement ( - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind) -{ - fShortName = shortName; - fLongName = longName; - fDescription = description; - - fElementVisibilityKind = optionVisibilityKind; - - fIsHidden = false; - - fMultipleOccurrencesAllowed = false; -} - -oahElement::~oahElement () -{} - -S_oahElement oahElement::fetchOptionByName ( - string name) -{ - S_oahElement result; - - if ( - name == fShortName - || - name == fLongName) { - result = this; - } - - return result; -} - -string oahElement::fetchNames () const -{ - stringstream s; - - if ( - fShortName.size () - && - fLongName.size () - ) { - s << - "-" << fShortName << - ", " << - "-" << fLongName; - } - - else { - if (fShortName.size ()) { - s << - "-" << fShortName; - } - if (fLongName.size ()) { - s << - "-" << fLongName; - } - } - - return s.str (); -} - -string oahElement::fetchNamesInColumns ( - int subGroupsShortNameFieldWidth) const -{ - stringstream s; - - if ( - fShortName.size () - && - fLongName.size () - ) { - s << left << - setw (subGroupsShortNameFieldWidth) << - "-" + fShortName << - ", " << - "-" << fLongName; - } - - else { - if (fShortName.size ()) { - s << left << - setw (subGroupsShortNameFieldWidth) << - "-" + fShortName; - } - if (fLongName.size ()) { - s << - "-" << fLongName; - } - } - - return s.str (); -} - -string oahElement::fetchNamesBetweenParentheses () const -{ - stringstream s; - - s << - "(" << - fetchNames () << - ")"; - - return s.str (); -} - -string oahElement::fetchNamesInColumnsBetweenParentheses ( - int subGroupsShortNameFieldWidth) const -{ - stringstream s; - - s << - "(" << - fetchNamesInColumns ( - subGroupsShortNameFieldWidth) << - ")"; - - return s.str (); -} - -S_oahValuedAtom oahElement::handleOptionUnderName ( - string optionName, - ostream& os) -{ - stringstream s; - - s << - "### atom option name " << optionName << - " attached to '" << - this->asString () << - "' is not handled"; - - msrInternalError ( - gOahOah->fInputSourceName, - K_NO_INPUT_LINE_NUMBER, - __FILE__, __LINE__, - s.str ()); - - // no option value is needed - return nullptr; -} - -void oahElement::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahElement::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahElement elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching oahElement::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahElement::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahElement::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahElement elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching oahElement::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahElement::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> oahElement::browseData ()" << - endl; - } -#endif -} - -string oahElement::asShortNamedOptionString () const -{ - return "-" + fShortName; -} - -string oahElement::asActualLongNamedOptionString () const -{ - return "-" + fLongName; -} - -string oahElement::asString () const -{ - stringstream s; - - s << - "'-" << fLongName << "'"; // JMI - - return s.str (); -} - -void oahElement::printOptionHeader (ostream& os) const -{ - os << - "-" << fShortName << - endl << - "-" << fLongName << - endl; - - if (fDescription.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } -} - -void oahElement::printOptionEssentials ( - ostream& os, - int fieldWidth) const -{ - os << left << - setw (fieldWidth) << - "fShortName" << " : " << - fShortName << - endl << - setw (fieldWidth) << - "fLongName" << " : " << - fLongName << - endl << - setw (fieldWidth) << - "fDescription" << " : " << - fDescription << - endl << - setw (fieldWidth) << - "fIsHidden" << " : " << - booleanAsString ( - fIsHidden) << - endl << - setw (fieldWidth) << - "fMultipleOccurrencesAllowed" << " : " << - booleanAsString ( - fMultipleOccurrencesAllowed) << - endl; -} - -void oahElement::print (ostream& os) const -{ - os << - "??? oahElement ???" << - endl; - - printOptionEssentials (os, 40); // JMI -} - -void oahElement::printHelp (ostream& os) -{ - os << - fetchNames () << - endl; - - if (fDescription.size ()) { - // indent a bit more for readability - gIndenter.increment (K_OAH_ELEMENTS_INDENTER_OFFSET); - - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - - gIndenter.decrement (K_OAH_ELEMENTS_INDENTER_OFFSET); - } - - // register help print action in options handler upLink JMI ??? -// fHandlerUpLink->setOptionsHandlerFoundAHelpOption (); -} - -ostream& operator<< (ostream& os, const S_oahElement& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/oahElements.h b/src/lilypond/oahElements.h deleted file mode 100644 index fa748f755..000000000 --- a/src/lilypond/oahElements.h +++ /dev/null @@ -1,307 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___optionsElements___ -#define ___optionsElements___ - -using namespace std; - -namespace MusicXML2 -{ - -// layout settings -//______________________________________________________________________________ -const int K_OAH_ELEMENTS_INDENTER_OFFSET = 3; - // indent a bit more for readability - -const int K_OAH_FIELD_WIDTH = 40; - -// PRE-declarations for class dependencies -//______________________________________________________________________________ -class oahElement; -typedef SMARTP S_oahElement; - -class oahValuedAtom; -typedef SMARTP S_oahValuedAtom; - -class EXP oahHandler; -typedef SMARTP S_oahHandler; - -// data types -// ------------------------------------------------------ - -enum oahElementVisibilityKind { - kElementVisibilityAlways, - kElementVisibilityHiddenByDefault }; - -string optionVisibilityKindAsString ( - oahElementVisibilityKind optionVisibilityKind); - -//______________________________________________________________________________ -class oahElement : public smartable -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahElement ( - string shortName, - string longName, - string description, - oahElementVisibilityKind optionVisibilityKind); - - virtual ~oahElement (); - - public: - - // set and get - // ------------------------------------------------------ - - // uplink - void setHandlerUpLink ( - S_oahHandler handlerUpLink) - { fHandlerUpLink = handlerUpLink; } - - S_oahHandler getHandlerUpLink () const - { return fHandlerUpLink; } - - string getShortName () const - { return fShortName; } - - string getLongName () const - { return fLongName; } - - string getDescription () const - { return fDescription; } - - oahElementVisibilityKind - getElementVisibilityKind () const - { return fElementVisibilityKind; } - - void setIsHidden () - { fIsHidden = true; } - - bool getIsHidden () const - { return fIsHidden; } - - void setMultipleOccurrencesAllowed () - { fMultipleOccurrencesAllowed = true; } - - bool getMultipleOccurrencesAllowed () const - { return fMultipleOccurrencesAllowed; } - - public: - - // services - // ------------------------------------------------------ - - string fetchNames () const; - string fetchNamesInColumns ( - int subGroupsShortNameFieldWidth) const; - - string fetchNamesBetweenParentheses () const; - string fetchNamesInColumnsBetweenParentheses ( - int subGroupsShortNameFieldWidth) const; - - virtual int fetchVariableNameLength () const - { return 0; } - - S_oahElement fetchOptionByName ( - string name); - - virtual S_oahValuedAtom - handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - virtual string asShortNamedOptionString () const; - virtual string asActualLongNamedOptionString () const; - - string asLongNamedOptionString () const - { - if (fLongName.size ()) { - return asActualLongNamedOptionString (); - } - else { - return asShortNamedOptionString (); - } - } - - string asString () const; - - virtual void printOptionHeader (ostream& os) const; // virtual ??? JMI - - virtual void printOptionEssentials ( - ostream& os, - int fieldWidth) const; - - virtual void print (ostream& os) const; - - virtual void printHelp (ostream& os); - - protected: - - // fields - // ------------------------------------------------------ - - // uplink - S_oahHandler fHandlerUpLink; - - string fShortName; - string fLongName; - string fDescription; - - oahElementVisibilityKind - fElementVisibilityKind; - - bool fIsHidden; - - bool fMultipleOccurrencesAllowed; -}; -typedef SMARTP S_oahElement; -EXP ostream& operator<< (ostream& os, const S_oahElement& elt); - -/* -Because the set needs a comparison functor to work with. If you don't specify one, it will make a default-constructed one. In this case, since you're using a function-pointer type, the default-constructed one will be a null pointer, which can't be called; so instead, you have to provide the correct function pointer at run time. - -A better approach might be to use a function class type (a.k.a. functor type); then the function call can be resolved at compile time, and a default-constructed object will do the right thing. -*/ -struct compareOahElements { - bool operator() ( - const S_oahElement firstElement, - const S_oahElement secondElement) const; -}; - -/* JMI -//______________________________________________________________________________ -template class oahBrowser : public browser -{ - protected: - - basevisitor* fVisitor; - - virtual void enter (T& t) { t.acceptIn (fVisitor); } - virtual void leave (T& t) { t.acceptOut (fVisitor); } - - public: - - oahBrowser (basevisitor* v) : fVisitor (v) - {} - - virtual ~oahBrowser () - {} - - virtual void set (basevisitor* v) - { fVisitor = v; } - - virtual void browse (T& t) - { - enter (t); - - t.browseData (fVisitor); - - leave (t); - } -}; -*/ - -template class oahBrowser : public browser -{ - public: - - oahBrowser (basevisitor* v) : fVisitor (v) {} - - virtual ~oahBrowser () {} - - public: - - virtual void set (basevisitor* v) { fVisitor = v; } - - virtual void browse (T& t) { -#ifdef TRACE_OAH - // if (gOahOah->fTraceOahVisitors) { - cout << - endl << - ".\\\" --> browse()" << - endl; - // } -#endif - - enter (t); - - t.browseData (fVisitor); - - leave (t); - } - - protected: - - basevisitor* fVisitor; - - virtual void enter (T& t) { -#ifdef TRACE_OAH - // if (gOahOah->fTraceOahVisitors) { - cout << - endl << - ".\\\" --> enter()" << - endl; - // } -#endif - - t.acceptIn (fVisitor); - } - virtual void leave (T& t) { -#ifdef TRACE_OAH - // if (gOahOah->fTraceOahVisitors) { - cout << - endl << - ".\\\" --> leave()" << - endl; - // } -#endif - - t.acceptOut (fVisitor); - } -}; - - -} - - -#endif diff --git a/src/lilypond/oahOah.cpp b/src/lilypond/oahOah.cpp deleted file mode 100644 index ffd01ef26..000000000 --- a/src/lilypond/oahOah.cpp +++ /dev/null @@ -1,729 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "oahOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_oahOptionalValuesStyleKindAtom oahOptionalValuesStyleKindAtom::create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - oahOptionalValuesStyleKind& - oahOptionalValuesStyleKindVariable) -{ - oahOptionalValuesStyleKindAtom* o = new - oahOptionalValuesStyleKindAtom ( - shortName, - longName, - description, - valueSpecification, - variableName, - oahOptionalValuesStyleKindVariable); - assert(o!=0); - return o; -} - -oahOptionalValuesStyleKindAtom::oahOptionalValuesStyleKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - oahOptionalValuesStyleKind& - oahOptionalValuesStyleKindVariable) - : oahValuedAtom ( - shortName, - longName, - description, - valueSpecification, - variableName), - fOahOptionalValuesStyleKindVariable ( - oahOptionalValuesStyleKindVariable) -{} - -oahOptionalValuesStyleKindAtom::~oahOptionalValuesStyleKindAtom () -{} - -S_oahValuedAtom oahOptionalValuesStyleKindAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a oahOptionalValuesStyleKindAtom" << - endl; - } -#endif - - // an option value is needed - return this; -} - -void oahOptionalValuesStyleKindAtom::handleValue ( - string theString, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahOptionalValuesStyleKindAtom'" << - endl; - } -#endif - - // theString contains the language name: - // is it in the optional values style kinds map? - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - os << - "==> oahAtom is of type 'oahOptionalValuesStyleKindAtom'" << - endl; - } -#endif - - map::const_iterator - it = - gOahOptionalValuesStyleKindsMap.find ( - theString); - - if (it == gOahOptionalValuesStyleKindsMap.end ()) { - // no, optional values style kind is unknown in the map - stringstream s; - - s << - "OAH optional values style kind '" << theString << - "' is unknown" << - endl << - "The " << - gOahOptionalValuesStyleKindsMap.size () - 1 << - " known OAH optional values style kind are:" << - endl; - - gIndenter++; - - s << - existingOahOptionalValuesStyleKinds (K_NAMES_LIST_MAX_LENGTH); - - gIndenter--; - - oahError (s.str ()); - } - - setOahOptionalValuesStyleKindVariable ( - (*it).second); -} - -void oahOptionalValuesStyleKindAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> oahOptionalValuesStyleKindAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionalValuesStyleKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> Launching oahOptionalValuesStyleKindAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahOptionalValuesStyleKindAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> oahOptionalValuesStyleKindAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOptionalValuesStyleKindAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> Launching oahOptionalValuesStyleKindAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahOptionalValuesStyleKindAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> oahOptionalValuesStyleKindAtom::browseData ()" << - endl; - } -#endif -} - -string oahOptionalValuesStyleKindAtom::asShortNamedOptionString () const -{ - stringstream s; - - s << - "-" << fShortName << " " << - oahOptionalValuesStyleKindAsString (fOahOptionalValuesStyleKindVariable); - - return s.str (); -} - -string oahOptionalValuesStyleKindAtom::asActualLongNamedOptionString () const -{ - stringstream s; - - s << - "-" << fLongName << " " << - oahOptionalValuesStyleKindAsString (fOahOptionalValuesStyleKindVariable); - - return s.str (); -} - -void oahOptionalValuesStyleKindAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "OptionsOptionalValuesStyleKindAtom:" << - endl; - - gIndenter++; - - printValuedAtomEssentials ( - os, fieldWidth); - - os << left << - setw (fieldWidth) << - "fVariableName" << " : " << - fVariableName << - endl << - setw (fieldWidth) << - "fOahOptionalValuesStyleKindVariable" << " : \"" << - oahOptionalValuesStyleKindAsString ( - fOahOptionalValuesStyleKindVariable) << - "\"" << - endl; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_oahOptionalValuesStyleKindAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_oahOah gOahOah; -S_oahOah gOahOahUserChoices; - -S_oahOah oahOah::create ( - string executableName, - S_oahHandler handlerUpLink) -{ - oahOah* o = new oahOah ( - executableName, - handlerUpLink); - assert(o!=0); - - return o; -} - -oahOah::oahOah ( - string executableName, - S_oahHandler handlerUpLink) - : oahGroup ( - "Options and help", - "hoah", "help-options-and-help", -R"()", - kElementVisibilityAlways, - handlerUpLink), - fHandlerExecutableName (executableName) -{ - // append this options group to the options handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeOahOah (false); -} - -oahOah::~oahOah () -{} - -void oahOah::initializeOahBasicHelpOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Options help", - "hoh", "help-options-help", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // help options - - subGroup-> - appendAtomToSubGroup ( - oahOptionsUsageAtom::create ( - "ho", "help-options", -R"(Print options usage help.)")); - - // help summary - - subGroup-> - appendAtomToSubGroup ( - oahOptionsSummaryAtom::create ( - "hs", "help-summary", -R"(Display a help summary and exit.)")); - - // option name help - - string defaultOptionName = "onh"; - - fOptionName = defaultOptionName; - - S_oahOptionNameHelpAtom - optionNameHelpAtom = - oahOptionNameHelpAtom::create ( - "onh", "option-name-help", - replaceSubstringInString ( -R"(Print help about OPTION_NAME. -OPTION_NAME is optional, and the default value is 'DEFAULT_VALUE'.)", - "DEFAULT_VALUE", - defaultOptionName), - "OPTION_NAME", - "optionName", - fOptionName, - defaultOptionName); - - optionNameHelpAtom-> - setValueIsOptional (); - - subGroup-> - appendAtomToSubGroup ( - optionNameHelpAtom); - - // options values - - fDisplayOahValues = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "dov", "display-options-values", -R"(Write the chosen options values to standard error. -This option is best placed early in the command line)", - "displayOptionsValues", - fDisplayOahValues)); - - // options handler - - fDisplayOptionsHandler = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "doh", "display-options-handler", -R"(Write the contents of the options handler to standard error.)", - "displayOptionsHandler", - fDisplayOptionsHandler)); -} - -void oahOah::initializeOahOahAndArgumentsOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Options and arguments", - "oaa", "options-and-arguments", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // options and arguments - - fShowOptionsAndArguments = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "soaa", "show-options-and-arguments", - replaceSubstringInString ( -R"(Print the options and arguments to EXECUTABLE.)", - "EXECUTABLE", - fHandlerExecutableName), - "showOptionsAndArguments", - fShowOptionsAndArguments)); - - // optional values style - - const oahOptionalValuesStyleKind - oahOptionalValuesStyleKindDefaultValue = - kOptionalValuesStyleGNU; // default value - - // the variable to set is in the handler actually - oahOptionalValuesStyleKind& - optionalValuesStyleKind = - fHandlerUpLink-> - getHandlerOptionalValuesStyleKind (); - - optionalValuesStyleKind = oahOptionalValuesStyleKindDefaultValue; - - subGroup-> - appendAtomToSubGroup ( - oahOptionalValuesStyleKindAtom::create ( - "ovs", "optional-values-style", - replaceSubstringInString ( - replaceSubstringInString ( - replaceSubstringInString ( -R"(The NUMBER OAH optional values STYLEs available are: -OPTIONAL_VALUES_STYLES. -The default is 'DEFAULT_VALUE'. -In GNU style: - - the options name alone used the default value; - - another value can be supplied with '=VALUE' right after the option name, - without any space in-between. -InOAH style: - - the option name followed by another option or that is the last one - in the command line uses the default value; - - otherwise, the following argument supplies the option value.)", - "NUMBER", - to_string (gOahOptionalValuesStyleKindsMap.size ())), - "OPTIONAL_VALUES_STYLES", - existingOahOptionalValuesStyleKinds (K_NAMES_LIST_MAX_LENGTH)), - "DEFAULT_VALUE", - oahOptionalValuesStyleKindAsString ( - oahOptionalValuesStyleKindDefaultValue)), - "STYLE", - "optionalValuesStyleKind", - optionalValuesStyleKind)); -} - -#ifdef TRACE_OAH -void oahOah::initializeOahTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Options visitors trace", - "htov", "help-trace-options-visitors", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // trace oah visitors - - fTraceOahVisitors = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "toahv", "trace-oah-visitors", -R"(Write a trace of the OAH tree visiting activity to standard error.)", - "traceOahVisitors", - fTraceOahVisitors)); -} -#endif - -void oahOah::initializeOahOah ( - bool boolOptionsInitialValue) -{ - // help - // -------------------------------------- - initializeOahBasicHelpOptions ( - boolOptionsInitialValue); - - // options and arguments - // -------------------------------------- - initializeOahOahAndArgumentsOptions ( - boolOptionsInitialValue); - -#ifdef TRACE_OAH - // trace - // -------------------------------------- - initializeOahTraceOah ( - boolOptionsInitialValue); -#endif -} - -S_oahOah oahOah::createCloneWithTrueValues () -{ - S_oahOah - clone = - oahOah::create ( - fHandlerExecutableName, - nullptr); - // nullptr not to have it inserted twice in the option handler - - // set the options handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - // command line - // -------------------------------------- - - clone->fHandlerExecutableName = - fHandlerExecutableName; - - clone->fShowOptionsAndArguments = - fShowOptionsAndArguments; - - clone->fCommandLineAsSupplied = - fCommandLineAsSupplied; - clone->fCommandLineWithShortOptionsNames = - fCommandLineWithShortOptionsNames; - clone->fCommandLineWithLongOptionsNames = - fCommandLineWithLongOptionsNames; - - // options and help display - // -------------------------------------- - - clone->fDisplayOahValues = - fDisplayOahValues; - clone->fDisplayOptionsHandler = - fDisplayOptionsHandler; - - // trace - // -------------------------------------- - - clone->fTraceOahVisitors = - fTraceOahVisitors; - - return clone; -} - -//______________________________________________________________________________ -void oahOah::enforceQuietness () -{ - // JMI -} - -//______________________________________________________________________________ -void oahOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void oahOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> oahOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> Launching oahOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void oahOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> oahOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_oahOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> Launching oahOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void oahOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - "% ==> oahOah::browseData ()" << - endl; - } -#endif -} - -void oahOah::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << left << - /* JMI - setw (valueFieldWidth) << - fVariableName << - " : \"" << - oahOptionalValuesStyleKindAsString ( - fOahOptionalValuesStyleKindVariable) << - "\"" << - endl << -*/ - - setw (valueFieldWidth) << "traceOahVisitors" << " : " << - booleanAsString (fTraceOahVisitors) << - endl; -} - -//______________________________________________________________________________ -void oahOah::printOahOahValues (int valueFieldWidth) -{ - gLogOstream << - "The basic options are:" << - endl; - - gIndenter++; - - // command line - // -------------------------------------- - - gLogOstream << left << - setw (valueFieldWidth) << "Command line:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (valueFieldWidth) << "inputSourceName" << " : " << - fInputSourceName << - endl << - - setw (valueFieldWidth) << "showOptionsAndArguments" << " : " << - booleanAsString (fShowOptionsAndArguments) << - endl; - - gIndenter--; - - // options and help display - // -------------------------------------- - - gLogOstream << left << - setw (valueFieldWidth) << "Options trace and display:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (valueFieldWidth) << "displayOptionsValues" << " : " << - booleanAsString (fDisplayOahValues) << - endl << - setw (valueFieldWidth) << "displayOptionsHandler" << " : " << - booleanAsString (fDisplayOptionsHandler) << - endl << - - setw (valueFieldWidth) << "traceOahVisitors" << " : " << - booleanAsString (fTraceOahVisitors) << - endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_oahOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeOahOahHandling ( - string executableName, - S_oahHandler handler) -{ - // create the options variables - // ------------------------------------------------------ - - gOahOahUserChoices = oahOah::create ( - executableName, - handler); - assert(gOahOahUserChoices != 0); - - gOahOah = - gOahOahUserChoices; -} - - -} diff --git a/src/lilypond/oahOah.h b/src/lilypond/oahOah.h deleted file mode 100644 index 9df9a5e24..000000000 --- a/src/lilypond/oahOah.h +++ /dev/null @@ -1,257 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___oahOah___ -#define ___oahOah___ - -#include - -#include "exports.h" - -#include "oahBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class oahOptionalValuesStyleKindAtom : public oahValuedAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - oahOptionalValuesStyleKind& - oahOptionalValuesStyleKindVariable); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahOptionalValuesStyleKindAtom ( - string shortName, - string longName, - string description, - string valueSpecification, - string variableName, - oahOptionalValuesStyleKind& - oahOptionalValuesStyleKindVariable); - - virtual ~oahOptionalValuesStyleKindAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - void setOahOptionalValuesStyleKindVariable ( - oahOptionalValuesStyleKind value) - { - fOahOptionalValuesStyleKindVariable = value; - } - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - void handleValue ( - string theString, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - string asShortNamedOptionString () const; - string asActualLongNamedOptionString () const; - - void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ - - oahOptionalValuesStyleKind& - fOahOptionalValuesStyleKindVariable; -}; -typedef SMARTP S_oahOptionalValuesStyleKindAtom; -EXP ostream& operator<< (ostream& os, const S_oahOptionalValuesStyleKindAtom& elt); - -//______________________________________________________________________________ -class oahOah : public oahGroup -{ - public: - - static SMARTP create ( - string executableName, - S_oahHandler handlerUpLink); - - SMARTP createCloneWithTrueValues (); // JMI - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeOahOah ( - bool boolOptionsInitialValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - oahOah ( - string executableName, - S_oahHandler handlerUpLink); - - virtual ~oahOah (); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - void initializeOahBasicHelpOptions ( - bool boolOptionsInitialValue); - - void initializeOahOahAndArgumentsOptions ( - bool boolOptionsInitialValue); - -#ifdef TRACE_OAH - void initializeOahTraceOah ( - bool boolOptionsInitialValue); -#endif - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printOahOahHelp (); - - void printOahOahValues (int valueFieldWidth); - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - public: - - // command line - // -------------------------------------- - - string fHandlerExecutableName; - - string fInputSourceName; - - // options and arguments - // -------------------------------------- - - bool fShowOptionsAndArguments; - - string fCommandLineAsSupplied; - string fCommandLineWithShortOptionsNames; - string fCommandLineWithLongOptionsNames; - - // option name - // -------------------------------------- - - string fOptionName; // JMI - - // trace - // -------------------------------------- - - bool fTraceOahVisitors; - - // display - // -------------------------------------- - - bool fDisplayOahValues; - bool fDisplayOptionsHandler; -}; -typedef SMARTP S_oahOah; -EXP ostream& operator<< (ostream& os, const S_oahOah& elt); - -EXP extern S_oahOah gOahOah; -EXP extern S_oahOah gOahOahUserChoices; -EXP extern S_oahOah gOahOahWithDetailedTrace; - -//______________________________________________________________________________ -void initializeOahOahHandling ( - string executableName, - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/oahOah2ManPageGenerator.cpp b/src/lilypond/oahOah2ManPageGenerator.cpp deleted file mode 100644 index 64d35f2cd..000000000 --- a/src/lilypond/oahOah2ManPageGenerator.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "oahOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "version.h" - -#include "oahOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -oahOah2ManPageGenerator::oahOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -oahOah2ManPageGenerator::~oahOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void oahOah2ManPageGenerator::visitStart (S_oahOptionalValuesStyleKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting oahOptionalValuesStyleKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void oahOah2ManPageGenerator::visitEnd (S_oahOptionalValuesStyleKindAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting oahOptionalValuesStyleKindAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/oahOah2ManPageGenerator.h b/src/lilypond/oahOah2ManPageGenerator.h deleted file mode 100644 index 7b357002c..000000000 --- a/src/lilypond/oahOah2ManPageGenerator.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___oahOah2ManPageGenerator___ -#define ___oahOah2ManPageGenerator___ - -#include "oahOah.h" - -#include "oah2ManPageGenerators.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class oahOah2ManPageGenerator : virtual public oah2ManPageGenerator, - - public visitor - -{ - public: - - oahOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~oahOah2ManPageGenerator (); - - protected: - - virtual void visitStart (S_oahOptionalValuesStyleKindAtom& elt); - virtual void visitEnd (S_oahOptionalValuesStyleKindAtom& elt); -}; -typedef SMARTP S_oahOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/oahREADME.txt b/src/lilypond/oahREADME.txt deleted file mode 100644 index 15283dcd3..000000000 --- a/src/lilypond/oahREADME.txt +++ /dev/null @@ -1,87 +0,0 @@ -/* -OAH basics: - - OAH (Options And Help) is supposed to be pronouced something close to "whaaaah!" - The intonation is left to the speaker, though... - And as the saying goes: "OAH? oahy not!" - - - options handling is organized as a hierarchical, instrospective set of classes. - Options and their corresponding help are grouped in a single object. - - - oahElement is the super-class of all options types, including groups and subgroups. - It contains a short name and a long name, as well as a decription. - Short and long names can be used and mixed at will in the command line, - as well as '-' and '--'. - The short name is mandatory, but the long name may be empty. - - - prefixes such '-t=' and -help=' allow for a contracted form of options. - For example, -t=meas,notes is short for '-t-meas, -tnotes'. - An oahPrefix contains the prefix name, the ersatz by which to replace it, - and a description. - - - an oahHandler contains oahGroup's, each handled in a pair or .h/.cpp files, - such as msrOah.h and msrOah.cpp, and a list of options prefixes. - - - an oahGroup contains oahSubGroup's and an upLink to the containing oahHandler. - - - an oahSubGroup contains oahAtom's and an upLink to the containing oahGroup. - - - each oahAtom is an atomic option to the executable and its corresponding help, - and an upLink to the containing oahSubGroup. - -Features: - - partial help to be obtained, i.e. help about any group, subgroup or atom, - showing the path in the hierarchy down to the corresponding option. - - - there are various subclasses of oahAtom such as oahIntegerAtom, oahBooleanAtom - and oahRationalAtom to control options values of common types. - - - oahThreeBooleansAtom, for example, allows for three boolean settings - to be controlled at once with a single option. - - - oahValuedAtom describes options for which a value is supplied in the command line. - - - a class such as optionsLpsrPitchesLanguageOption is used - to supply a string value to be converted into an internal enumerated type. - - - oahCombinedBooleansAtom contains a list of boolean atoms to manipulate several such atoms as a single one, - see the 'cubase' combined booleans atom in musicXMLOah.cpp. - - - oahMultiplexBooleansAtom contains a list of boolean atoms sharing a common prefix to display such atoms in a compact manner, - see the 'cubase' combined booleans atom in musicXMLOah.cpp. - - - storing options and the corresponding help in oahGroup's makes it easy to re-use them. - For example, xml2ly and xml2lbr have their three first passes in common, - (up to obtaining the MSR description of the score), as well as the corresponding options and help. - -Handling: - - each optionOption must have unique short and long names, for consistency. - - - an executable main() call decipherOptionsAndArguments(), in which: - - handleOptionName() handles the option names - - handleOptionValueOrArgument() handle the values that may follow an atom name - and the arguments to the executable. - - - contracted forms are expanded in handleOptionName() before the resulting, - uncontracted options are handled. - - - handleOptionName() fetches the oahElement corresponding to the name from the map, - determines the type of the latter, - and delegates the handling to the corresponding object. - - - handleOptionValueOrArgument() associatiates the value - to the (preceding) fPendingValuedAtom if not null, - or appends it fHandlerArgumentsVector to otherwise. - - - the printOptionsSummary() methods are used when there are errors in the options used. - - - the printHelp() methods perform the actual help print work - - - options deciphering it done by the handleAtom() methods defined: - - in oahBasicTypes.h/.cpp for the predefined ones; - - in the various options groups for those specific to the latter. - - - the value following the option name, if any, is taken care of - by the handle*AtomValue() methods, using fPendingValuedAtom - to hold the valuedAtom until the corresponding value is found. -*/ - diff --git a/src/lilypond/oahVisitor.cpp b/src/lilypond/oahVisitor.cpp deleted file mode 100644 index e6799663f..000000000 --- a/src/lilypond/oahVisitor.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "oahVisitor.h" - -namespace MusicXML2 -{ - -//________________________________________________________________________ -oahVisitor::oahVisitor ( - const S_oahHandler handler) -{ - fVisitedOahHandler = handler; -} - -oahVisitor::~oahVisitor () -{} - -} diff --git a/src/lilypond/oahVisitor.h b/src/lilypond/oahVisitor.h deleted file mode 100644 index a5230b7f9..000000000 --- a/src/lilypond/oahVisitor.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef __oahVisitors__ -#define __oahVisitors__ - -#include "visitor.h" - -#include "oahBasicTypes.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class oahVisitor : public smartable, - - public visitor - -{ - public: - - oahVisitor ( - const S_oahHandler handler); - - virtual ~oahVisitor (); - - virtual void visitTheHandler () = 0; - - protected: - - S_oahHandler fVisitedOahHandler; -}; -typedef SMARTP S_oahVisitor; - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/setExtraOahIfDesired.h b/src/lilypond/setExtraOahIfDesired.h deleted file mode 100644 index 843149a9a..000000000 --- a/src/lilypond/setExtraOahIfDesired.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___setExtraOahIfDesired___ -#define ___setExtraOahIfDesired___ - - -// comment the following definition if no trace options are wanted -#define EXTRA_OAH - - -#endif diff --git a/src/lilypond/setTraceOahIfDesired.h b/src/lilypond/setTraceOahIfDesired.h deleted file mode 100644 index f364df8eb..000000000 --- a/src/lilypond/setTraceOahIfDesired.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___setTraceOahIfDesired___ -#define ___setTraceOahIfDesired___ - - -// comment the following definition if no trace options are wanted -#ifndef TRACE_OAH - #define TRACE_OAH -#endif - -#endif diff --git a/src/lilypond/traceOah.cpp b/src/lilypond/traceOah.cpp deleted file mode 100644 index 6bc51f4fb..000000000 --- a/src/lilypond/traceOah.cpp +++ /dev/null @@ -1,3774 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "traceOah.h" - -#ifdef TRACE_OAH - - -#include // setw, setprecision, ... - -#include "generalOah.h" - -#include "messagesHandling.h" - -using namespace std; - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -S_traceOah gTraceOah; -S_traceOah gTraceOahUserChoices; - -S_traceOah traceOah::create ( - S_oahHandler handlerUpLink) -{ - traceOah* o = new traceOah ( - handlerUpLink); - assert(o!=0); - - return o; -} - -traceOah::traceOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "Trace", - "ht", "help-trace", -R"(There are trace options transversal to the successive passes, -showing what's going on in the various translation activities. -They're provided as a help to the maintainers, as well as for the curious. -The options in this group can be quite verbose, use them with small input data! -All of them imply '-tpasses, -trace-passes'.)", - kElementVisibilityHiddenByDefault, - handlerUpLink) -{ - // append this options group to the options handler if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeTraceOah (false); -} - -traceOah::~traceOah () -{} - -void traceOah::initializeTranspositionsTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Transpositions", - "htt", "help-trace-transpositions", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // transpositions - - fTraceTranspositions = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceTranspositionsAtom = - oahTwoBooleansAtom::create ( - "ttransps", "trace-transpositions", -R"(Transpositions ( in MusicXML, \transposition in LilyPond))", - "traceTranspositions", - fTraceTranspositions, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTranspositionsAtom); - /* JMI - */ - - // octave shifts - - fTraceOctaveShifts = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceOctaveShiftsAtom = - oahTwoBooleansAtom::create ( - "toshifts", "trace-octaves-shifts", -R"(Octave shifts ( in MusicXML, \ottava in LilyPond))", - "traceOctaveShifts", - fTraceOctaveShifts, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceOctaveShiftsAtom); - /* JMI -*/ -} - -void traceOah::initializeAboveStaffTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Above staff", - "htas", "help-trace-above-staff", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'above staff' multiplex booleans atom - - S_oahMultiplexBooleansAtom - aboveStaffMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in above staff.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - aboveStaffMultiplexBooleansAtom); - - // rehearsals - - fTraceRehearsals = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceRehearsalsAtom = - oahTwoBooleansAtom::create ( - "trehears", "trace-rehearsals", -R"(Rehearsals)", - "traceRehearsals", - fTraceRehearsals, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceRehearsalsAtom); - aboveStaffMultiplexBooleansAtom-> - addBooleanAtom ( - traceRehearsalsAtom); - - // segnos - - fTraceSegnos = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceSegnosAtom = - oahTwoBooleansAtom::create ( - "tsegnos", "trace-segnos", -R"(Segnos)", - "traceSegnos", - fTraceSegnos, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSegnosAtom); - aboveStaffMultiplexBooleansAtom-> - addBooleanAtom ( - traceSegnosAtom); - - // codas - - fTraceCodas = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceCodasAtom = - oahTwoBooleansAtom::create ( - "tcodas", "trace-codas", -R"(Codas)", - "traceCodas", - fTraceCodas, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceCodasAtom); - aboveStaffMultiplexBooleansAtom-> - addBooleanAtom ( - traceCodasAtom); - - // eyeglasses - - fTraceEyeGlasses = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceEyeGlassesAtom = - oahTwoBooleansAtom::create ( - "teyes", "trace-eyeglasses", -R"(Eyeglasses)", - "traceEyeGlasses", - fTraceEyeGlasses, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceEyeGlassesAtom); - aboveStaffMultiplexBooleansAtom-> - addBooleanAtom ( - traceEyeGlassesAtom); -} - -void traceOah::initializeBreaksAndBarlinesTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Breaks and barlines", - "htbab", "help-trace-breaks-and-barlines", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'breaks and barlines' multiplex booleans atom - - S_oahMultiplexBooleansAtom - breaksAndBarlinesMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in breaks and barlines.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - breaksAndBarlinesMultiplexBooleansAtom); - - // line breaks - - fTraceLineBreaks = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceLineBreaksAtom = - oahTwoBooleansAtom::create ( - "tlbreaks", "trace-line-breaks", -R"(Line breaks)", - "traceLineBreaks", - fTraceLineBreaks, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceLineBreaksAtom); - breaksAndBarlinesMultiplexBooleansAtom-> - addBooleanAtom ( - traceLineBreaksAtom); - - // page breaks - - fTracePageBreaks = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - tracePageBreaksAtom = - oahTwoBooleansAtom::create ( - "tpbreaks", "trace-page-breaks", -R"(Page breaks)", - "tracePageBreaks", - fTracePageBreaks, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - tracePageBreaksAtom); - breaksAndBarlinesMultiplexBooleansAtom-> - addBooleanAtom ( - tracePageBreaksAtom); - - // barlines - - fTraceBarlines = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceBarlinesAtom = - oahTwoBooleansAtom::create ( - "tblines", "trace-barlines", -R"(Barlines)", - "traceBarlines", - fTraceBarlines, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceBarlinesAtom); - breaksAndBarlinesMultiplexBooleansAtom-> - addBooleanAtom ( - traceBarlinesAtom); - - // barlines details - - fTraceBarlinesDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceBarlinesDetailsAtom = - oahThreeBooleansAtom::create ( - "tblinesd", "trace-barlines-details", -R"(Barlines details)", - "traceBarlinesDetails", - fTraceBarlinesDetails, - fTraceBarlines, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceBarlinesDetailsAtom); - breaksAndBarlinesMultiplexBooleansAtom-> - addBooleanAtom ( - traceBarlinesDetailsAtom); - - // bar checks - - fTraceBarChecks = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceBarChecksAtom = - oahThreeBooleansAtom::create ( - "tbc", "trace-bar-checks", -R"(Bar checks)", - "traceBarChecks", - fTraceBarChecks, - fTraceBarlines, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceBarChecksAtom); - breaksAndBarlinesMultiplexBooleansAtom-> - addBooleanAtom ( - traceBarChecksAtom); - - // bar number checks - - fTraceBarNumberChecks = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceBarNumberChecksAtom = - oahThreeBooleansAtom::create ( - "tbnc", "trace-bar-number-checks", -R"(Bar number checks)", - "traceBarNumberChecks", - fTraceBarNumberChecks, - fTraceBarlines, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceBarNumberChecksAtom); - breaksAndBarlinesMultiplexBooleansAtom-> - addBooleanAtom ( - traceBarNumberChecksAtom); -} - -void traceOah::initializeClefsToTemposTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Clefs to tempos", - "htctt", "help-trace-clefs-to-tempos", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'clefs to tempo' multiplex booleans atom - - S_oahMultiplexBooleansAtom - clefsToTemposMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in clefs to tempo.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - clefsToTemposMultiplexBooleansAtom); - - // clefs - - fTraceClefs = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceClefsAtom = - oahTwoBooleansAtom::create ( - "tclefs", "trace-clefs", -R"(Clefs)", - "traceClefs", - fTraceClefs, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceClefsAtom); - clefsToTemposMultiplexBooleansAtom-> - addBooleanAtom ( - traceClefsAtom); - - // keys - - fTraceKeys = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceKeysAtom = - oahTwoBooleansAtom::create ( - "tkeys", "trace-keys", -R"(Keys)", - "traceKeys", - fTraceKeys, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceKeysAtom); - clefsToTemposMultiplexBooleansAtom-> - addBooleanAtom ( - traceKeysAtom); - - // times - - fTraceTimes = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceTimesAtom = - oahTwoBooleansAtom::create ( - "ttimes", "trace-times", -R"(Times)", - "traceTimes", - fTraceTimes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTimesAtom); - clefsToTemposMultiplexBooleansAtom-> - addBooleanAtom ( - traceTimesAtom); - - // tempos - - fTraceTempos = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceTemposAtom = - oahTwoBooleansAtom::create ( - "ttempos", "trace-tempos", -R"(Tempos)", - "traceTempos", - fTraceTempos, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTemposAtom); - clefsToTemposMultiplexBooleansAtom-> - addBooleanAtom ( - traceTemposAtom); -} - -void traceOah::initializeInterNotesTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Inter-notes", - "htin", "help-trace-inter-notes", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'inter notes' multiplex booleans atom - - S_oahMultiplexBooleansAtom - interNotesMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in inter notes.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - interNotesMultiplexBooleansAtom); - - // ties - - fTraceTies = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceTiesAtom = - oahTwoBooleansAtom::create ( - "tties", "trace-ties", -R"(Ties)", - "traceTies", - fTraceTies, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTiesAtom); - interNotesMultiplexBooleansAtom-> - addBooleanAtom ( - traceTiesAtom); - - // glissandos - - fTraceGlissandos = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceGlissandosAtom = - oahTwoBooleansAtom::create ( - "tgliss", "trace-glissandos", -R"(Glissandos)", - "traceGlissandos", - fTraceGlissandos, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceGlissandosAtom); - interNotesMultiplexBooleansAtom-> - addBooleanAtom ( - traceGlissandosAtom); -} - -void traceOah::initializeSpannersTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Spanners", - "hts", "help-trace-spanners", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'spanners' multiplex booleans atom - - S_oahMultiplexBooleansAtom - spannersMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in spanners.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - spannersMultiplexBooleansAtom); - - // spanners - - fTraceSpanners = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceSpannersAtom = - oahTwoBooleansAtom::create ( - "tspans", "trace-spanners", -R"(Spanners)", - "traceSpanners", - fTraceSpanners, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSpannersAtom); - spannersMultiplexBooleansAtom-> - addBooleanAtom ( - traceSpannersAtom); - - // wedges - - fTraceWedges = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceWedgesAtom = - oahTwoBooleansAtom::create ( - "twedges", "trace-wedges", -R"(Wedges)", - "traceWedges", - fTraceWedges, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceWedgesAtom); - spannersMultiplexBooleansAtom-> - addBooleanAtom ( - traceWedgesAtom); - - // slurs - - fTraceSlurs = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceSlursAtom = - oahTwoBooleansAtom::create ( - "tslurs", "trace-slurs", -R"(Slurs)", - "traceSlurs", - fTraceSlurs, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSlursAtom); - spannersMultiplexBooleansAtom-> - addBooleanAtom ( - traceSlursAtom); - - // ligatures - - fTraceLigatures = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceLigaturesAtom = - oahTwoBooleansAtom::create ( - "tligs", "traceLigatures", -R"(Ligatures)", - "traceLigatures", - fTraceLigatures, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceLigaturesAtom); - spannersMultiplexBooleansAtom-> - addBooleanAtom ( - traceLigaturesAtom); -} - -void traceOah::initializeHarmoniesAndFiguredBassesTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Harmonies and figured basses", - "hthafb", "help-trace-harmonies-and-figured-basses", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'harmonies and figured basses' multiplex booleans atom - - S_oahMultiplexBooleansAtom - harmoniesAndFiguredBassesMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in harmonies and figured basses.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - harmoniesAndFiguredBassesMultiplexBooleansAtom); - - // harmonies - - fTraceHarmonies = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceHarmoniesAtom = - oahTwoBooleansAtom::create ( - "tharms", "trace-harmonies", -R"( in MusicXML, \chordmode in LilyPond)", - "traceHarmonies", - fTraceHarmonies, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceHarmoniesAtom); - /* JMI - harmoniesAndFiguredBassesMultiplexBooleansAtom-> - addBooleanAtom ( - traceHarmoniesAtom); -*/ - - // figured basses - - fTraceFiguredBasses = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceFiguredBasseAtom = - oahTwoBooleansAtom::create ( - "tfigbass", "trace-figured-basses", -R"( in MusicXML, \figuremode in LilyPond)", - "traceFiguredBasses", - fTraceFiguredBasses, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceFiguredBasseAtom); - /* JMI - harmoniesAndFiguredBassesMultiplexBooleansAtom-> - addBooleanAtom ( - traceFiguredBasseAtom); - */ -} - -void traceOah::initializeCreditsToWordsTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Credits to words", - "htctw", "help-trace-credits-to-words", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'credits to words' multiplex booleans atom - - S_oahMultiplexBooleansAtom - creditsToWordsMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in credits to words.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - creditsToWordsMultiplexBooleansAtom); - - // credits - - fTraceCredits = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceCreditsBooleanAtom = - oahTwoBooleansAtom::create ( - "tcredits", "trace-credits", -R"(Credits)", - "traceCredits", - fTraceCredits, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceCreditsBooleanAtom); - creditsToWordsMultiplexBooleansAtom-> - addBooleanAtom ( - traceCreditsBooleanAtom); - - // lyrics - - fTraceLyrics = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceLyricsBooleanAtom = - oahTwoBooleansAtom::create ( - "tlyrics", "trace-lyrics", -R"(Lyrics)", - "traceLyrics", - fTraceLyrics, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceLyricsBooleanAtom); - creditsToWordsMultiplexBooleansAtom-> - addBooleanAtom ( - traceLyricsBooleanAtom); - - // lyrics details - - fTraceLyricsDetails = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceLyricsDetailsBooleanAtom = - oahTwoBooleansAtom::create ( - "tlyricsd", "trace-lyrics-details", -R"(Lyrics in MusicXML, stanzas in MSR)", - "traceLyricsDetails", - fTraceLyricsDetails, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceLyricsDetailsBooleanAtom); - creditsToWordsMultiplexBooleansAtom-> - addBooleanAtom ( - traceLyricsDetailsBooleanAtom); - - // words - - fTraceWords = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceWordsBooleanAtom = - oahTwoBooleansAtom::create ( - "twords", "trace-words", -R"(Words)", - "traceWords", - fTraceWords, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceWordsBooleanAtom); - creditsToWordsMultiplexBooleansAtom-> - addBooleanAtom ( - traceWordsBooleanAtom); -} - -void traceOah::initializeChordsAndTupletsTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Chords and tuplets", - "htcat", "help-trace-chords-and-tuplets", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'chords and tuplets' multiplex booleans atom - - S_oahMultiplexBooleansAtom - chordsAndTupletsMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in chords and tuplets.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - chordsAndTupletsMultiplexBooleansAtom); - - // chords - - fTraceChords = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - taceChordsBooleanAtom = - oahTwoBooleansAtom::create ( - "tchords", "trace-chords", -R"(Chords)", - "traceChords", - fTraceChords, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - taceChordsBooleanAtom); - chordsAndTupletsMultiplexBooleansAtom-> - addBooleanAtom ( - taceChordsBooleanAtom); - - // chords details - - fTraceChordsDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceChordsDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "tchordsd", "trace-chords-details", -R"(Chords details)", - "traceChordsDetails", - fTraceChordsDetails, - fTraceChords, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceChordsDetailsBooleanAtom); - chordsAndTupletsMultiplexBooleansAtom-> - addBooleanAtom ( - traceChordsDetailsBooleanAtom); - - // tuplets - - fTraceTuplets = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceTupletsBooleanAtom = - oahTwoBooleansAtom::create ( - "ttups", "trace-tuplets", -R"(Tuplets)", - "traceTuplets", - fTraceTuplets, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTupletsBooleanAtom); - chordsAndTupletsMultiplexBooleansAtom-> - addBooleanAtom ( - traceTupletsBooleanAtom); - - // tuplets details - - fTraceTupletsDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceTupletsDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "ttupsd", "trace-tuplets-details", -R"(Tuplets details)", - "traceTupletsDetails", - fTraceTupletsDetails, - fTraceTuplets, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTupletsDetailsBooleanAtom); - chordsAndTupletsMultiplexBooleansAtom-> - addBooleanAtom ( - traceTupletsDetailsBooleanAtom); - - // extra chords - - fTraceExtraChords = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceExtraChordsBooleanAtom = - oahTwoBooleansAtom::create ( - "tec", "trace-extra-chords", -R"(Extra chords handling)", - "traceExtraChords", - fTraceExtraChords, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceExtraChordsBooleanAtom); - chordsAndTupletsMultiplexBooleansAtom-> - addBooleanAtom ( - traceExtraChordsBooleanAtom); -} - -void traceOah::initializeInstrumentsTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Instruments", - "hti", "help-trace-instruments", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'instruments' multiplex booleans atom - - S_oahMultiplexBooleansAtom - instrumentsMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in instruments.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - instrumentsMultiplexBooleansAtom); - - // frames - - fTraceFrames = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceFramesBooleanAtom = - oahTwoBooleansAtom::create ( - "tframes", "trace-frames", -R"( in MusicXML, \fret-diagram in LilyPond)", - "traceFrames", - fTraceFrames, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceFramesBooleanAtom); - /* JMI - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceFramesBooleanAtom); - */ - - // scordaturas - - fTraceScordaturas = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceScordaturasBooleanAtom = - oahTwoBooleansAtom::create ( - "tscords", "trace-scordaturas", -R"(Scordaturas)", - "traceScordaturas", - fTraceScordaturas, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceScordaturasBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceScordaturasBooleanAtom); - - // slides - - fTraceSlides = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceSlidesBooleanAtom = - oahTwoBooleansAtom::create ( - "tslides", "trace-slides", -R"(Slides)", - "traceSlides", - fTraceSlides, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSlidesBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceSlidesBooleanAtom); - - // pedals - - fTracePedals = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - tracePedalsBooleanAtom = - oahTwoBooleansAtom::create ( - "tpedals", "trace-pedals", -R"(Pedals)", - "tracePedals", - fTracePedals, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - tracePedalsBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - tracePedalsBooleanAtom); - - // accordion registrations - - fTraceAccordionRegistrations = boolOptionsInitialValue; - - // accordion registrations - S_oahTwoBooleansAtom - traceAccordionRegistrationsBooleanAtom = - oahTwoBooleansAtom::create ( - "taccreg", "trace-accordion-registrations", -R"(Accordion registrations)", - "traceAccordionRegistrations", - fTraceAccordionRegistrations, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceAccordionRegistrationsBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceAccordionRegistrationsBooleanAtom); - - // harp pedals - - fTraceHarpPedals = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceHarpPedalsBooleanAtom = - oahTwoBooleansAtom::create ( - "thpedals", "trace-harp-pedals", -R"(Harp pedals)", - "traceHarpPedals", - fTraceHarpPedals, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceHarpPedalsBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceHarpPedalsBooleanAtom); - - // harp pedals tuning - - fTraceHarpPedalsTunings = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceHarpPedalsTuningsBooleanAtom = - oahTwoBooleansAtom::create ( - "thptuns", "traceHarpPedalsTunings", -R"(Harp pedals tuning)", - "traceHarpPedalsTunings", - fTraceHarpPedalsTunings, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceHarpPedalsTuningsBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceHarpPedalsTuningsBooleanAtom); - - // damps - - fTraceDamps = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceDampsBooleanAtom = - oahTwoBooleansAtom::create ( - "tdamps", "trace-damps", -R"(Damps)", - "traceDamps", - fTraceDamps, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceDampsBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceDampsBooleanAtom); - - // dampalls - - fTraceDampAlls = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceDampAllsBooleanAtom = - oahTwoBooleansAtom::create ( - "tdampalls", "trace-dampalls", -R"(Dampalls)", - "traceDampAlls", - fTraceDampAlls, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceDampAllsBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceDampAllsBooleanAtom); - - // MIDI - - fTraceMidi = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceMidiBooleanAtom = - oahTwoBooleansAtom::create ( - "tmidi", "trace-midi", -R"(MIDI)", - "traceMidi", - fTraceMidi, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceMidiBooleanAtom); - instrumentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceMidiBooleanAtom); -} - -void traceOah::initializeNotesAttachmentsTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Notes attachments", - "htna", "help-trace-notes-attachments", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'notes attachments' multiplex booleans atom - - S_oahMultiplexBooleansAtom - notesAttachmentsMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in notes attachments.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - notesAttachmentsMultiplexBooleansAtom); - - // stems - - fTraceStems = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceStemsBooleanAtom = - oahTwoBooleansAtom::create ( - "tstems", "trace-stems", -R"(Stems)", - "traceStems", - fTraceStems, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceStemsBooleanAtom); - notesAttachmentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceStemsBooleanAtom); - - // beams - - fTraceBeams = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceBeamsBooleanAtom = - oahTwoBooleansAtom::create ( - "tbeams", "trace-beams", -R"(Beams)", - "traceBeams", - fTraceBeams, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceBeamsBooleanAtom); - notesAttachmentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceBeamsBooleanAtom); - - // articulations - - fTraceArticulations = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceArticulationsBooleanAtom = - oahTwoBooleansAtom::create ( - "tarts", "trace-articulations", -R"(Articulations)", - "traceArticulations", - fTraceArticulations, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceArticulationsBooleanAtom); - notesAttachmentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceArticulationsBooleanAtom); - - // technicals - - fTraceTechnicals = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceTechnicalsBooleanAtom = - oahTwoBooleansAtom::create ( - "ttechs", "trace-technicals", -R"(Technicals)", - "traceTechnicals", - fTraceTechnicals, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTechnicalsBooleanAtom); - notesAttachmentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceTechnicalsBooleanAtom); - - // ornaments - - fTraceOrnaments = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceOrnamentsBooleanAtom = - oahTwoBooleansAtom::create ( - "torns", "trace-ornaments", -R"(Ornaments)", - "traceOrnaments", - fTraceOrnaments, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceOrnamentsBooleanAtom); - notesAttachmentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceOrnamentsBooleanAtom); - - // dynamics - - fTraceDynamics = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceDynamicsBooleanAtom = - oahTwoBooleansAtom::create ( - "tdyns", "trace-dynamics", -R"(Dynamics)", - "traceDynamics", - fTraceDynamics, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceDynamicsBooleanAtom); - notesAttachmentsMultiplexBooleansAtom-> - addBooleanAtom ( - traceDynamicsBooleanAtom); -} - -void traceOah::initializeSegmentsAndMeasuresTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Segments and measures", - "htsam", "help-trace-segments-and-measures", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'segments and measures' multiplex booleans atom - - S_oahMultiplexBooleansAtom - segmentsAndMeasuresMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in segments and measures.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - segmentsAndMeasuresMultiplexBooleansAtom); - - // segments - - fTraceSegments = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceSegmentsBooleanAtom = - oahTwoBooleansAtom::create ( - "tsegs", "trace-segments", -R"(Voices segments)", - "traceSegments", - fTraceSegments, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSegmentsBooleanAtom); - segmentsAndMeasuresMultiplexBooleansAtom-> - addBooleanAtom ( - traceSegmentsBooleanAtom); - - // segments details - - fTraceSegmentsDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceSegmentsDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "tsegsd", "trace-segments-details", -R"(Voices segments details)", - "traceSegments", - fTraceSegmentsDetails, - fTraceSegments, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSegmentsDetailsBooleanAtom); - segmentsAndMeasuresMultiplexBooleansAtom-> - addBooleanAtom ( - traceSegmentsDetailsBooleanAtom); - - // measure numbers - - fTraceMeasuresNumbers = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceMeasuresNumbersBooleanAtom = - oahTwoBooleansAtom::create ( - "tmn", "trace-measure-numbers", -R"(Measure numberss)", - "traceMeasuresNumbers", - fTraceMeasuresNumbers, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceMeasuresNumbersBooleanAtom); - segmentsAndMeasuresMultiplexBooleansAtom-> - addBooleanAtom ( - traceMeasuresNumbersBooleanAtom); - - // measures - - fTraceMeasures = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceMeasuresBooleanAtom = - oahTwoBooleansAtom::create ( - "tmeas", "trace-measures", -R"(Measures)", - "traceMeasures", - fTraceMeasures, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceMeasuresBooleanAtom); - segmentsAndMeasuresMultiplexBooleansAtom-> - addBooleanAtom ( - traceMeasuresBooleanAtom); - - // measures details - - fTraceMeasuresDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceMeasuresDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "tmeasd", "trace-measures-details", -R"(Measures details)", - "traceMeasuresDetails", - fTraceMeasuresDetails, - fTraceMeasures, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceMeasuresDetailsBooleanAtom); - segmentsAndMeasuresMultiplexBooleansAtom-> - addBooleanAtom ( - traceMeasuresDetailsBooleanAtom); - - // positions in measures - - fTracePositionsInMeasures = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - tracePositionsInMeasuresBooleanAtom = - oahTwoBooleansAtom::create ( - "tpim", "trace-positions-in-measures", -R"(Positions in measures)", - "tracePositionsInMeasures", - fTracePositionsInMeasures, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - tracePositionsInMeasuresBooleanAtom); - segmentsAndMeasuresMultiplexBooleansAtom-> - addBooleanAtom ( - tracePositionsInMeasuresBooleanAtom); - - // fTraceDetailedMeasureNumbersSet is empty -} - -void traceOah::initializeScoreToVoicesTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Score to voices", - "htstv", "help-trace-score-to-voices", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'score to voices' multiplex booleans atom - - S_oahMultiplexBooleansAtom - scoreToVoicesMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in score to voices.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - scoreToVoicesMultiplexBooleansAtom); - - // score - - fTraceScore = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceScoreBooleanAtom = - oahTwoBooleansAtom::create ( - "tscore", "trace-score", -R"(Score)", - "traceScore", - fTraceScore, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceScoreBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - traceScoreBooleanAtom); - - // part groups - - fTracePartGroups = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - tracePartGroupsBooleanAtom = - oahTwoBooleansAtom::create ( - "tpgroups", "trace-part-groups", -R"(Part groups)", - "tracePartGroups", - fTracePartGroups, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - tracePartGroupsBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - tracePartGroupsBooleanAtom); - - // part groups details - - fTracePartGroupsDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - tracePartGroupsDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "tpgroupsd", "trace-part-groups-details", -R"(Part groups with more details. -This option implies '-tpgrps, -trace-part-groups'.)", - "tracePartGroupsDetails", - fTracePartGroupsDetails, - fTracePartGroups, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - tracePartGroupsDetailsBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - tracePartGroupsDetailsBooleanAtom); - - // parts - - fTraceParts = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - tracePartsBooleanAtom = - oahTwoBooleansAtom::create ( - "tparts", "trace-parts", -R"(Parts)", - "traceParts", - fTraceParts, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - tracePartsBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - tracePartsBooleanAtom); - - // staves - - fTraceStaves = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceStavesBooleanAtom = - oahTwoBooleansAtom::create ( - "tstaves", "trace-staves", -R"(Staves)", - "traceStaves", - fTraceStaves, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceStavesBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - traceStavesBooleanAtom); - - // staff details - - fTraceStaffDetails = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceStaffDetailsBooleanAtom = - oahTwoBooleansAtom::create ( - "tst", "trace-staff-details", -R"(Staff details)", - "traceStaffDetails", - fTraceStaffDetails, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceStaffDetailsBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - traceStaffDetailsBooleanAtom); - - // staff changes - - fTraceStaffChanges = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceStaffChangesBooleanAtom = - oahTwoBooleansAtom::create ( - "tschanges", "trace-staff-changes", -R"(Staff changes)", - "traceStaffChanges", - fTraceStaffChanges, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceStaffChangesBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - traceStaffChangesBooleanAtom); - - // voices - - fTraceVoices = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceVoicesBooleanAtom = - oahTwoBooleansAtom::create ( - "tvoices", "trace-voices", -R"(Voices)", - "traceVoices", - fTraceVoices, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceVoicesBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - traceVoicesBooleanAtom); - - // voices details - - fTraceVoicesDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceVoicesDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "tvoicesd", "trace-voices-details", -R"(Voices with more details (quite verbose).. -This option implies '-tvoices, -trace-voices'.)", - "traceVoicesDetails", - fTraceVoicesDetails, - fTraceVoices, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceVoicesDetailsBooleanAtom); - scoreToVoicesMultiplexBooleansAtom-> - addBooleanAtom ( - traceVoicesDetailsBooleanAtom); -} - -void traceOah::initializeNotesTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Notes", - "htn", "help-trace-notes", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'notes' multiplex booleans atom - - S_oahMultiplexBooleansAtom - notesMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in notes.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - notesMultiplexBooleansAtom); - - // notes - - fTraceNotes = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceNotesBooleanAtom = - oahTwoBooleansAtom::create ( - "tnotes", "trace-notes", -R"(Notes)", - "traceNotes", - fTraceNotes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceNotesBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceNotesBooleanAtom); - - // notes details - - fTraceNotesDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceNotesDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "tnotesd", "trace-notes-details", -R"(Notes with more details, including divisions handling (quite verbose)... -This option implies '-tnotes, -trace-notes'.)", - "traceNotesDetails", - fTraceNotesDetails, - fTraceNotes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceNotesDetailsBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceNotesDetailsBooleanAtom); - - // whole notes - - fTraceWholeNotes = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceWholeNotesBooleanAtom = - oahTwoBooleansAtom::create ( - "twn", "trace-whole-notes", -R"(Whole notes computations (quite verbose)...)", - "traceWholeNotes", - fTraceWholeNotes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceWholeNotesBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceWholeNotesBooleanAtom); - - // whole notes details - - fTraceWholeNotesDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceWholeNotesDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "twnd", "trace-whole-notes-details", -R"(Whole notes computations details (event more verbose)...)", - "traceWholeNotesDetails", - fTraceWholeNotesDetails, - fTraceWholeNotes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceWholeNotesDetailsBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceWholeNotesDetailsBooleanAtom); - - // rest notes - - fTraceRestNotes = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceRestNotesBooleanAtom = - oahTwoBooleansAtom::create ( - "trn", "trace-rest-notes", -R"(Rest notes)", - "traceRestNotes", - fTraceRestNotes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceRestNotesBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceRestNotesBooleanAtom); - - // skip notes - - fTraceSkipNotes = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceSkipNotesBooleanAtom = - oahTwoBooleansAtom::create ( - "tsn", "trace-skip-notes", -R"(Skip notes)", - "traceSkipNotes", - fTraceSkipNotes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSkipNotesBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceSkipNotesBooleanAtom); - - // notes octave entry - - fTraceNotesOctaveEntry = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceNotesOctaveEntryBooleanAtom = - oahTwoBooleansAtom::create ( - "tnoe", "trace-notes-octave-entry", -R"(Notes octave entry)", - "traceNotesOctaveEntry", - fTraceNotesOctaveEntry, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceNotesOctaveEntryBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceNotesOctaveEntryBooleanAtom); - - // grace notes - - fTraceGraceNotes = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceGraceNotesBooleanAtom = - oahTwoBooleansAtom::create ( - "tgraces", "trace-gracenotes", -R"(Grace notes)", - "traceGraceNotes", - fTraceGraceNotes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceGraceNotesBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceGraceNotesBooleanAtom); - - // tremolos - - fTraceTremolos = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceTremolosBooleanAtom = - oahTwoBooleansAtom::create ( - "ttrems", "trace-tremolos", -R"(Tremolos)", - "traceTremolos", - fTraceTremolos, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceTremolosBooleanAtom); - notesMultiplexBooleansAtom-> - addBooleanAtom ( - traceTremolosBooleanAtom); -} - -void traceOah::initializeOptionsTraceAndDisplayOptions ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Options handling trace", - "htoh", "help-trace-options-handling", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // trace options - - fTraceOah = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "toah", "trace-oah", -R"(Write a trace of options and help handling to standard error. -This option should best appear first.)", - "traceOah", - fTraceOah)); - - // options details - - fTraceOahDetails = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahTwoBooleansAtom::create ( - "toahd", "trace-oah-details", -R"(Write a trace of options and help handling with more details to standard error. -This option should best appear first.)", - "traceOahDetails", - fTraceOahDetails, - fTraceOah)); - - // fTraceDetailedMeasureNumbersSet is intially empty -} - -void traceOah::initializeRepeatsToSlashesTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Repeats to slashes", - "htrts", "help-trace-repeats-to-slashes", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'repeats to slashes' multiplex booleans atom - - S_oahMultiplexBooleansAtom - repeatsToSlashesMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in repeats to slashes.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - repeatsToSlashesMultiplexBooleansAtom); - - // repeats - - fTraceRepeats = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceRepeatsBooleanAtom = - oahTwoBooleansAtom::create ( - "treps", "trace-repeats", -R"(Repeats)", - "traceRepeats", - fTraceRepeats, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceRepeatsBooleanAtom); - repeatsToSlashesMultiplexBooleansAtom-> - addBooleanAtom ( - traceRepeatsBooleanAtom); - - // repeats details - - fTraceRepeatsDetails = boolOptionsInitialValue; - - S_oahThreeBooleansAtom - traceRepeatsDetailsBooleanAtom = - oahThreeBooleansAtom::create ( - "trepsd", "trace-repeats-details", -R"(Repeats details)", - "traceRepeats", - fTraceRepeatsDetails, - fTraceRepeats, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceRepeatsDetailsBooleanAtom); - repeatsToSlashesMultiplexBooleansAtom-> - addBooleanAtom ( - traceRepeatsDetailsBooleanAtom); - - // measures repeats - - fTraceMeasuresRepeats = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceMeasuresRepeatsBooleanAtom = - oahTwoBooleansAtom::create ( - "tmreps", "trace-measures-repeats", -R"(Measures repeats)", - "traceMeasureRepeats", - fTraceMeasuresRepeats, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceMeasuresRepeatsBooleanAtom); - repeatsToSlashesMultiplexBooleansAtom-> - addBooleanAtom ( - traceMeasuresRepeatsBooleanAtom); - - // rest measures - - fTraceRestMeasures = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceRestMeasuresBooleanAtom = - oahTwoBooleansAtom::create ( - "trmeas", "trace-rest-measures", -R"(Multiple rests)", - "traceRestMeasures", - fTraceRestMeasures, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceRestMeasuresBooleanAtom); - repeatsToSlashesMultiplexBooleansAtom-> - addBooleanAtom ( - traceRestMeasuresBooleanAtom); - - // beats repeats - - fTraceBeatsRepeats = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceBeatsRepeatsBooleanAtom = - oahTwoBooleansAtom::create ( - "tbreps", "trace-beats-repeats", -R"(Beats repeatss)", - "traceBeatsRepeats", - fTraceBeatsRepeats, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceBeatsRepeatsBooleanAtom); - repeatsToSlashesMultiplexBooleansAtom-> - addBooleanAtom ( - traceBeatsRepeatsBooleanAtom); - - // slashes - - fTraceSlashes = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceSlashesBooleanAtom = - oahTwoBooleansAtom::create ( - "tslashes", "trace-slashes", -R"(Slashes)", - "traceSlashes", - fTraceSlashes, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceSlashesBooleanAtom); - repeatsToSlashesMultiplexBooleansAtom-> - addBooleanAtom ( - traceSlashesBooleanAtom); -} - -void traceOah::initializeOtherTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Other", - "hto", "help-trace-other", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // the 'other' multiplex booleans atom - - S_oahMultiplexBooleansAtom - otherMultiplexBooleansAtom = - oahMultiplexBooleansAtom::create ( - "Trace SHORT_NAME/LONG_NAME in other.", - "SHORT_NAME", - "LONG_NAME", - fShortTracePrefix, - fLongTracePrefix); - - subGroup-> - appendAtomToSubGroup ( - otherMultiplexBooleansAtom); - - // passes - - fTracePasses = boolOptionsInitialValue; // TEMP boolOptionsInitialValue; - - S_oahBooleanAtom - tracePassesBooleanAtom = - oahBooleanAtom::create ( - "tpasses", "trace-passes", -R"(Write a trace of the passes to standard error.)", - "tracePasses", - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - tracePassesBooleanAtom); - otherMultiplexBooleansAtom-> - addBooleanAtom ( - tracePassesBooleanAtom); - - // scaling - - fTraceGeometry = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceGeometryBooleanAtom = - oahTwoBooleansAtom::create ( - "tgeom", "trace-scaling", -R"(Scaling)", - "traceGeometry", - fTraceGeometry, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceGeometryBooleanAtom); - otherMultiplexBooleansAtom-> - addBooleanAtom ( - traceGeometryBooleanAtom); - - // varValAssocs - - fTraceVarValAssocs = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - traceVarValAssocsBooleanAtom = - oahTwoBooleansAtom::create ( - "tvva", "trace-var-val-assocs", -R"(VarValAssocs)", - "traceVarValAssocs", - fTraceVarValAssocs, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - traceVarValAssocsBooleanAtom); - otherMultiplexBooleansAtom-> - addBooleanAtom ( - traceVarValAssocsBooleanAtom); - - // '-tft, -trace-for-tests' is hidden... - - fTraceForTests = boolOptionsInitialValue; - - S_oahBooleanAtom - traceForTestsOahBooleanAtom = - oahBooleanAtom::create ( - "tft", "trace-for-tests", -R"(Write a trace for tests to standard error.)", - "traceForTests", - fTraceForTests); - traceForTestsOahBooleanAtom-> - setIsHidden (); - - subGroup-> - appendAtomToSubGroup ( - traceForTestsOahBooleanAtom); - -/* JMI - // MSR streams - - fTraceMsrStreams = boolOptionsInitialValue; - - S_oahTwoBooleansAtom - noCubaseBooleanAtom = - oahTwoBooleansAtom::create ( - "tms", "traceMsrStreams", -R"(MSR Streams API for applications)", - "traceMsrStreams", - fTraceMsrStreams, - fTracePasses); - subGroup-> - appendAtomToSubGroup ( - noCubaseBooleanAtom); -*/ -} - -void traceOah::initializeTraceOah ( - bool boolOptionsInitialValue) -{ - // fetch the 't' prefix - - fShortTracePrefix = - fHandlerUpLink-> - fetchPrefixInMapByItsName ( - "t"); - msrAssert ( - fShortTracePrefix != nullptr, - "fShortTracePrefix is null"); - - // fetch the 'trace' prefix - - fLongTracePrefix = - fHandlerUpLink-> - fetchPrefixInMapByItsName ( - "trace"); - msrAssert ( - fLongTracePrefix != nullptr, - "fLongTracePrefix is null"); - - // options and help trace and display - initializeOptionsTraceAndDisplayOptions ( - boolOptionsInitialValue); - - // score to voices - initializeScoreToVoicesTraceOah ( - boolOptionsInitialValue); - - // segments and measures - initializeSegmentsAndMeasuresTraceOah ( - boolOptionsInitialValue); - - // notes - initializeNotesTraceOah ( - boolOptionsInitialValue); - - // notes attachments - initializeNotesAttachmentsTraceOah ( - boolOptionsInitialValue); - - // repeats to slashes - initializeRepeatsToSlashesTraceOah ( - boolOptionsInitialValue); - - // instruments - initializeInstrumentsTraceOah ( - boolOptionsInitialValue); - - // chords and tuplets - initializeChordsAndTupletsTraceOah ( - boolOptionsInitialValue); - - // texts - initializeCreditsToWordsTraceOah ( - boolOptionsInitialValue); - - // harmonies and figured basses - initializeHarmoniesAndFiguredBassesTraceOah ( - boolOptionsInitialValue); - - // spanners - initializeSpannersTraceOah ( - boolOptionsInitialValue); - - // inter-notes - initializeInterNotesTraceOah ( - boolOptionsInitialValue); - - // clefs to tempos - initializeClefsToTemposTraceOah ( - boolOptionsInitialValue); - - // breaks - initializeBreaksAndBarlinesTraceOah ( - boolOptionsInitialValue); - - // above staff - initializeAboveStaffTraceOah ( - boolOptionsInitialValue); - - //transpositions - initializeTranspositionsTraceOah ( - boolOptionsInitialValue); - - // other trace - initializeOtherTraceOah ( - boolOptionsInitialValue); -} - -S_traceOah traceOah::createCloneWithTrueValues () -{ - S_traceOah - clone = - traceOah::create (0); - // 0 not to have it inserted twice in the option handler - - // set the options handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - - // options and help trace and display - clone->fTraceOah = - fTraceOah; - clone->fTraceOahDetails = - fTraceOahDetails; - - // passes - clone->fTracePasses = true; - - // score - clone->fTraceScore = true; - - // for tests, hidden - clone->fTraceForTests = true; - - // varValAssocs - clone->fTraceVarValAssocs = true; - - // credits - clone->fTraceCredits = true; - - // scaling - clone->fTraceGeometry = true; - - // part groups - clone->fTracePartGroups = true; - clone->fTracePartGroupsDetails = true; - - // parts - clone->fTraceParts = true; - - // staves - clone->fTraceStaves = true; - - // voices - clone->fTraceVoices = true; - clone->fTraceVoicesDetails = true; - - // measures - clone->fTraceMeasuresNumbers = true; - clone->fTraceMeasures = true; - clone->fTraceMeasuresDetails = true; - clone->fTracePositionsInMeasures = true; - clone->fTraceDetailedMeasureNumbersSet = - fTraceDetailedMeasureNumbersSet; - - // segments - clone->fTraceSegments = true; - clone->fTraceSegmentsDetails = true; - - // clefs - clone->fTraceClefs = true; - - // keys - clone->fTraceKeys = true; - - // times - clone->fTraceTimes = true; - - // tempos - clone->fTraceTempos = true; - - // rehearsals - clone->fTraceRehearsals = true; - - // line breaks - clone->fTraceLineBreaks = true; - - // page breaks - clone->fTracePageBreaks = true; - - // staff changes - clone->fTraceStaffChanges = true; - - // transpositions - clone->fTraceTranspositions = true; - - // octave shifts - clone->fTraceOctaveShifts = true; - - // barlines - clone->fTraceBarlines = true; - clone->fTraceBarlinesDetails = true; - - // bar checks - clone->fTraceBarChecks = true; - - // bar number checks - clone->fTraceBarNumberChecks = true; - - // repeats trace - clone->fTraceRepeats = true; - clone->fTraceRepeatsDetails = true; - - // measures repeats - clone->fTraceMeasuresRepeats = true; - - // rest measures - clone->fTraceRestMeasures = true; - - // slashes - clone->fTraceSlashes = true; - - // notes trace - clone->fTraceNotes = true; - clone->fTraceNotesDetails = true; - clone->fTraceWholeNotes = true; - clone->fTraceWholeNotesDetails = true; - clone->fTraceRestNotes = true; - clone->fTraceSkipNotes = true; - clone->fTraceNotesOctaveEntry = true; - - // stems - clone->fTraceStems = true; - - // beams - clone->fTraceBeams = true; - - // articulations - clone->fTraceArticulations = true; - - // technicals - clone->fTraceTechnicals = true; - - // ornaments - clone->fTraceOrnaments = true; - - // dynamics - clone->fTraceDynamics = true; - - // spanners - clone->fTraceSpanners = true; - - // words - clone->fTraceWords = true; - - // tremolos - clone->fTraceTremolos = true; - - // chords - clone->fTraceChords = true; - clone->fTraceChordsDetails = true; - - // tuplets - clone->fTraceTuplets = true; - clone->fTraceTupletsDetails = true; - - // glissandos - clone->fTraceTuplets = true; - - // eyeglases - clone->fTraceGlissandos = true; - - // damps - clone->fTraceDamps = true; - - // dampalls - clone->fTraceDampAlls = true; - - // slides - clone->fTraceSlides = true; - - // grace notes - clone->fTraceGraceNotes = true; - - // lyrics - clone->fTraceLyrics = true; - clone->fTraceLyricsDetails = true; - - // harmonies - clone->fTraceHarmonies = true; - - // frames - clone->fTraceFrames = true; - - // figured basses - clone->fTraceFiguredBasses = true; - - // ties - clone->fTraceTies = true; - - // slurs - clone->fTraceSlurs = true; - - // ligatures - clone->fTraceLigatures = true; - - // pedals - clone->fTracePedals = true; - - // wedges - clone->fTraceWedges = true; - - // staff details - clone->fTraceStaffDetails = true; - - // scordaturas - clone->fTraceScordaturas = true; - - // segnos - clone->fTraceSegnos = true; - - // codas - clone->fTraceCodas = true; - - // accordion registrations - clone->fTraceAccordionRegistrations = true; - - // harp pedals - clone->fTraceHarpPedals = true; - - // harp pedals tuning - clone->fTraceHarpPedalsTunings = true; - - // extra chords - clone->fTraceExtraChords = true; - -/* JMI - // msrStreams - clone->fTraceMsrStreams = true; -*/ - - // midi - clone->fTraceMidi = true; - - return clone; -} - -/* JMI -void traceOah::setAllGeneralTraceOah ( - bool boolOptionsInitialValue) -{ - // passes - clone->fTracePasses = boolOptionsInitialValue; - - // score - clone->fTraceScore = boolOptionsInitialValue; - - // for tests, hidden - clone->fTraceForTests = boolOptionsInitialValue; - - // varValAssocs - fTraceVarValAssocs = boolOptionsInitialValue; - - // credits - clone->fTraceCredits = boolOptionsInitialValue; - - // scaling - fTraceGeometry = boolOptionsInitialValue; - - // part groups - fTracePartGroups = boolOptionsInitialValue; - fTracePartGroupsDetails = boolOptionsInitialValue; - - // parts - fTraceParts = boolOptionsInitialValue; - - // staves - fTraceStaves = boolOptionsInitialValue; - - // voices - fTraceVoices = boolOptionsInitialValue; - fTraceVoicesDetails = boolOptionsInitialValue; - - // measures - clone->fTraceMeasuresNumbers = boolOptionsInitialValue; - clone->fTraceMeasures = boolOptionsInitialValue; - clone->fTraceMeasuresDetails = boolOptionsInitialValue; - clone->fTracePositionsInMeasures = boolOptionsInitialValue; - clone->fTraceDetailedMeasureNumbersSet = - fTraceDetailedMeasureNumbersSet; - - // segments - fTraceSegments = boolOptionsInitialValue; - fTraceSegmentsDetails = boolOptionsInitialValue; - - // clefs - fTraceClefs = boolOptionsInitialValue; - - // keys - fTraceKeys = boolOptionsInitialValue; - - // times - fTraceTimes = boolOptionsInitialValue; - - // tempos - fTraceTempos = boolOptionsInitialValue; - - // rehearsals - fTraceRehearsals = boolOptionsInitialValue; - - // line breaks - fTraceLineBreaks = boolOptionsInitialValue; - - // page breaks - fTracePageBreaks = boolOptionsInitialValue; - - // staff changes - fTraceStaffChanges = boolOptionsInitialValue; - - // transpositions - fTraceTranspositions = boolOptionsInitialValue; - - // octave shifts - fTraceOctaveShifts = boolOptionsInitialValue; - - // barlines - fTraceBarlines = boolOptionsInitialValue; - fTraceBarlinesDetails = boolOptionsInitialValue; - - // bar number checks - // -------------------------------------- - - fTraceBarChecks - bool fTraceBarNumberChecks - - // repeats - fTraceRepeats = boolOptionsInitialValue; - fTraceRepeatsDetails = boolOptionsInitialValue; - - // measures repeats - fTraceMeasuresRepeats = boolOptionsInitialValue; - - // rest measures - fTraceRestMeasures = boolOptionsInitialValue; - - // slashes - fTraceSlashes = boolOptionsInitialValue; - - // notes - fTraceNotes = boolOptionsInitialValue; - fTraceNotesDetails = boolOptionsInitialValue; - fTraceWholeNotes = boolOptionsInitialValue; - fTraceWholeNotesDetails = boolOptionsInitialValue; - fTraceRestNotes = boolOptionsInitialValue; - fTraceSkipNotes = boolOptionsInitialValue; - fTraceNotesOctaveEntry = boolOptionsInitialValue; - - // stems - fTraceStems = boolOptionsInitialValue; - - // beams - fTraceBeams = boolOptionsInitialValue; - - // articulations - fTraceArticulations = boolOptionsInitialValue; - - // technicals - fTraceTechnicals = boolOptionsInitialValue; - - // ornaments - fTraceOrnaments = boolOptionsInitialValue; - - // dynamics - fTraceDynamics = boolOptionsInitialValue; - - // spanners - fTraceSpanners = boolOptionsInitialValue; - - // words - fTraceWords = boolOptionsInitialValue; - - // tremolos - fTraceTremolos = boolOptionsInitialValue; - - // chords - fTraceChords = boolOptionsInitialValue; - fTraceChordsDetails = boolOptionsInitialValue; - - // tuplets - fTraceTuplets = boolOptionsInitialValue; - fTraceTupletsDetails = boolOptionsInitialValue; - - // glissandos - fTraceGlissandos = boolOptionsInitialValue; - - // eyeglasses - fTraceEyeGlasses = boolOptionsInitialValue; - - // damps - fTraceDamps = boolOptionsInitialValue; - - // dampalls - fTraceDampAlls = boolOptionsInitialValue; - - // slides - fTraceSlides = boolOptionsInitialValue; - - // grace notes - fTraceGraceNotes = boolOptionsInitialValue; - - // lyrics - fTraceLyrics = boolOptionsInitialValue; - fTraceLyricsDetails = boolOptionsInitialValue; - - // harmonies - fTraceHarmonies = boolOptionsInitialValue; - - // frames - fTraceFrames = boolOptionsInitialValue; - - // figured basses - fTraceFiguredBasses = boolOptionsInitialValue; - - // ties - fTraceTies = boolOptionsInitialValue; - - // slurs - fTraceSlurs = boolOptionsInitialValue; - - // ligatures - fTraceLigatures = boolOptionsInitialValue; - - // pedals - fTracePedals = boolOptionsInitialValue; - - // wedges - fTraceWedges = boolOptionsInitialValue; - - // staff details - fTraceStaffDetails = boolOptionsInitialValue; - - // scordaturas - fTraceScordaturas = boolOptionsInitialValue; - - // segnos - fTraceSegnos = boolOptionsInitialValue; - - // codas - fTraceCodas = boolOptionsInitialValue; - - // accordion registrations - fTraceAccordionRegistrations = boolOptionsInitialValue; - - // harp pedals - fTraceScordaturas = boolOptionsInitialValue; - - // harp pedals tuning - fTraceHarpPedals = boolOptionsInitialValue; - - // extra chords - fTraceExtraChords = boolOptionsInitialValue; - -/ * JMI - // msrStreams - fTraceMsrStreams = boolOptionsInitialValue; -* / - - fTraceMidi = boolOptionsInitialValue; -} - */ - -//______________________________________________________________________________ -void traceOah::enforceQuietness () -{} - -//______________________________________________________________________________ -void traceOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void traceOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> traceOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_traceOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching traceOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void traceOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> traceOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_traceOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching traceOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void traceOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> traceOah::browseData ()" << - endl; - } -#endif - - oahGroup::browseData (v); -} - -//______________________________________________________________________________ -void traceOah::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - os << - "The trace options are:" << - endl; - - gIndenter++; - - os << left << - setw (valueFieldWidth) << "Trace:" << - endl; - - gIndenter++; - - os << left << - // options and help display - setw (valueFieldWidth) << "traceOah" << " : " << - booleanAsString (fTraceOah) << - endl << - setw (valueFieldWidth) << "traceOahDetails" << " : " << - booleanAsString (fTraceOahDetails) << - endl << - - // passes - setw (valueFieldWidth) << "tracePasses" << " : " << - booleanAsString (fTracePasses) << - endl << - - // for tests, hidden - setw (valueFieldWidth) << "traceForTests" << " : " << - booleanAsString (fTraceForTests) << - endl << - - // score - setw (valueFieldWidth) << "traceScore" << " : " << - booleanAsString (fTraceScore) << - endl << - - // varValAssocs - setw (valueFieldWidth) << "traceVarValAssocs" << " : " << - booleanAsString (fTraceVarValAssocs) << - endl << - - // credits - setw (valueFieldWidth) << "traceCredits" << " : " << - booleanAsString (fTraceCredits) << - endl << - - // scaling - setw (valueFieldWidth) << "traceGeometry" << " : " << - booleanAsString (fTraceGeometry) << - endl << - - // part groups - setw (valueFieldWidth) << "tracePartGroups" << " : " << - booleanAsString (fTracePartGroups) << - endl << - setw (valueFieldWidth) << "tracePartGroupsDetails" << " : " << - booleanAsString (fTracePartGroupsDetails) << - endl << - - // parts - setw (valueFieldWidth) << "traceParts" << " : " << - booleanAsString (fTraceParts) << - endl << - - // staves - setw (valueFieldWidth) << "traceStaves" << " : " << - booleanAsString (fTraceStaves) << - endl << - - // voices - setw (valueFieldWidth) << "traceVoices" << " : " << - booleanAsString (fTraceVoices) << - endl << - setw (valueFieldWidth) << "traceVoicesDetails" << " : " << - booleanAsString (fTraceVoicesDetails) << - endl << - - // measures - setw (valueFieldWidth) << "traceMeasuresNumbers" << " : " << - booleanAsString (fTraceMeasuresNumbers) << - endl << - setw (valueFieldWidth) << "traceMeasures" << " : " << - booleanAsString (fTraceMeasures) << - endl << - setw (valueFieldWidth) << "traceMeasuresDetails" << " : " << - booleanAsString (fTraceMeasuresDetails) << - endl << - setw (valueFieldWidth) << "tracePositionsInMeasures" << " : " << - booleanAsString (fTracePositionsInMeasures) << - endl; - - os << left << - setw (valueFieldWidth) << "traceDetailedMeasureNumbersSet" << " : " << - endl; - - if (fTraceDetailedMeasureNumbersSet.size ()) { - set::const_iterator - iBegin = fTraceDetailedMeasureNumbersSet.begin (), - iEnd = fTraceDetailedMeasureNumbersSet.end (), - i = iBegin; - - gIndenter++; - - for ( ; ; ) { - os << "v " << (*i); - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - else { - os << - "none"; - } - os << endl; - - // segments - os << left << - setw (valueFieldWidth) << "traceSegments" << " : " << - booleanAsString (fTraceSegments) << - endl << - setw (valueFieldWidth) << "traceSegmentsDetails" << " : " << - booleanAsString (fTraceSegmentsDetails) << - endl << - - // clefs - setw (valueFieldWidth) << "traceClefs" << " : " << - booleanAsString (fTraceClefs) << - endl << - - // keys - setw (valueFieldWidth) << "traceKeys" << " : " << - booleanAsString (fTraceKeys) << - endl << - - // times - setw (valueFieldWidth) << "traceTimes" << " : " << - booleanAsString (fTraceTimes) << - endl << - - // tempos - setw (valueFieldWidth) << "traceTempos" << " : " << - booleanAsString (fTraceTempos) << - endl << - - // rehearsals - setw (valueFieldWidth) << "traceRehearsals" << " : " << - booleanAsString (fTraceRehearsals) << - endl << - - // line breaks - setw (valueFieldWidth) << "traceLineBreaks" << " : " << - booleanAsString (fTraceLineBreaks) << - endl << - - // page breaks - setw (valueFieldWidth) << "tracePageBreaks" << " : " << - booleanAsString (fTracePageBreaks) << - endl << - - // staff changes - setw (valueFieldWidth) << "traceStaffChanges" << " : " << - booleanAsString (fTraceStaffChanges) << - endl << - - // transpositions - setw (valueFieldWidth) << "traceTranspositions" << " : " << - booleanAsString (fTraceTranspositions) << - endl << - - // octave shifts - setw (valueFieldWidth) << "traceOctaveShifts" << " : " << - booleanAsString (fTraceOctaveShifts) << - endl << - - // barlines - setw (valueFieldWidth) << "traceBarlines" << " : " << - booleanAsString (fTraceBarlines) << - endl << - setw (valueFieldWidth) << "traceBarlinesDetails" << " : " << - booleanAsString (fTraceBarlinesDetails) << - endl << - - // bar checks - setw (valueFieldWidth) << "traceBarChecks" << " : " << - booleanAsString (fTraceBarChecks) << - endl << - - // bar number checks - setw (valueFieldWidth) << "traceBarNumberChecks" << " : " << - booleanAsString (fTraceBarNumberChecks) << - endl << - - // repeats - setw (valueFieldWidth) << "traceRepeats" << " : " << - booleanAsString (fTraceRepeats) << - endl << - setw (valueFieldWidth) << "traceRepeatsDetails" << " : " << - booleanAsString (fTraceRepeatsDetails) << - endl << - - // measures repeats - setw (valueFieldWidth) << "traceMeasuresRepeats" << " : " << - booleanAsString (fTraceMeasuresRepeats) << - endl << - - // rest measures - setw (valueFieldWidth) << "traceRestMeasures" << " : " << - booleanAsString (fTraceRestMeasures) << - endl << - - // slashes - setw (valueFieldWidth) << "traceSlashes" << " : " << - booleanAsString (fTraceSlashes) << - endl << - - // notes - setw (valueFieldWidth) << "traceNotes" << " : " << - booleanAsString (fTraceNotes) << - endl << - setw (valueFieldWidth) << "traceNotesDetails" << " : " << - booleanAsString (fTraceNotesDetails) << - endl << - setw (valueFieldWidth) << "traceWholeNotes" << " : " << - booleanAsString (fTraceWholeNotes) << - endl << - setw (valueFieldWidth) << "traceWholeNotesDetails" << " : " << - booleanAsString (fTraceWholeNotesDetails) << - endl << - setw (valueFieldWidth) << "traceRestNotes" << " : " << - booleanAsString (fTraceRestNotes) << - endl << - setw (valueFieldWidth) << "traceSkipNotes" << " : " << - booleanAsString (fTraceSkipNotes) << - endl << - setw (valueFieldWidth) << "traceNotesOctaveEntry" << " : " << - booleanAsString (fTraceNotesOctaveEntry) << - endl << - - // stems - setw (valueFieldWidth) << "traceStems" << " : " << - booleanAsString (fTraceStems) << - endl << - - // beams - setw (valueFieldWidth) << "traceBeams" << " : " << - booleanAsString (fTraceBeams) << - endl << - - // articulations - setw (valueFieldWidth) << "traceArticulations" << " : " << - booleanAsString (fTraceArticulations) << - endl << - - // technicals - setw (valueFieldWidth) << "traceTechnicals" << " : " << - booleanAsString (fTraceTechnicals) << - endl << - - // ornaments - setw (valueFieldWidth) << "traceOrnaments" << " : " << - booleanAsString (fTraceOrnaments) << - endl << - - // dynamics - setw (valueFieldWidth) << "traceGraceDynamics" << " : " << - booleanAsString (fTraceDynamics) << - endl << - - // spanners - setw (valueFieldWidth) << "traceSpanners" << " : " << - booleanAsString (fTraceSpanners) << - endl << - - // words - setw (valueFieldWidth) << "traceWords" << " : " << - booleanAsString (fTraceWords) << - endl << - - // tremolos - setw (valueFieldWidth) << "traceTremolos" << " : " << - booleanAsString (fTraceTremolos) << - endl << - - // chords - setw (valueFieldWidth) << "traceChords" << " : " << - booleanAsString (fTraceChords) << - endl << - setw (valueFieldWidth) << "traceChordsDetails" << " : " << - booleanAsString (fTraceChordsDetails) << - endl << - - // tuplets - setw (valueFieldWidth) << "traceTuplets" << " : " << - booleanAsString (fTraceTuplets) << - endl << - setw (valueFieldWidth) << "traceTupletsDetails" << " : " << - booleanAsString (fTraceTupletsDetails) << - endl << - - // glissandos - setw (valueFieldWidth) << "traceGlissandos" << " : " << - booleanAsString (fTraceGlissandos) << - endl << - - // eyeglases - setw (valueFieldWidth) << "traceEyeGlasses" << " : " << - booleanAsString (fTraceEyeGlasses) << - endl << - - // damps - setw (valueFieldWidth) << "traceDamps" << " : " << - booleanAsString (fTraceDamps) << - endl << - - // dampalls - setw (valueFieldWidth) << "traceDampAlls" << " : " << - booleanAsString (fTraceDampAlls) << - endl << - - // slides - setw (valueFieldWidth) << "traceSlides" << " : " << - booleanAsString (fTraceSlides) << - endl << - - // grace notes - setw (valueFieldWidth) << "traceGraceNotes" << " : " << - booleanAsString (fTraceGraceNotes) << - endl << - - // lyrics - setw (valueFieldWidth) << "traceLyrics" << " : " << - booleanAsString (fTraceLyrics) << - endl << - setw (valueFieldWidth) << "traceLyricsDetails" << " : " << - booleanAsString (fTraceLyricsDetails) << - endl << - - // harmonies - setw (valueFieldWidth) << "traceHarmonies" << " : " << - booleanAsString (fTraceHarmonies) << - endl << - - // frames - setw (valueFieldWidth) << "traceFrames" << " : " << - booleanAsString (fTraceFrames) << - endl << - - // figured basses - setw (valueFieldWidth) << "traceFiguredBasses" << " : " << - booleanAsString (fTraceFiguredBasses) << - endl << - - // ties - setw (valueFieldWidth) << "traceTies" << " : " << - booleanAsString (fTraceTies) << - endl << - - // slurs - setw (valueFieldWidth) << "traceSlurs" << " : " << - booleanAsString (fTraceSlurs) << - endl << - - // ligatures - setw (valueFieldWidth) << "traceLigatures" << " : " << - booleanAsString (fTraceLigatures) << - endl << - - // pedals - setw (valueFieldWidth) << "tracePedals" << " : " << - booleanAsString (fTracePedals) << - endl << - - // wedges - setw (valueFieldWidth) << "traceWedges" << " : " << - booleanAsString (fTraceWedges) << - endl << - - // staff details - setw (valueFieldWidth) << "traceStaffDetails" << " : " << - booleanAsString (fTraceStaffDetails) << - endl << - - // scordaturas - setw (valueFieldWidth) << "traceScordaturas" << " : " << - booleanAsString (fTraceScordaturas) << - endl << - - // segnos - setw (valueFieldWidth) << "traceSegnos" << " : " << - booleanAsString (fTraceSegnos) << - endl << - - // codas - setw (valueFieldWidth) << "traceCodas" << " : " << - booleanAsString (fTraceCodas) << - endl << - - // accordion registrations - setw (valueFieldWidth) << "traceAccordionRegistrations" << " : " << - booleanAsString (fTraceAccordionRegistrations) << - endl << - - // harp pedals - setw (valueFieldWidth) << "traceHarpPedals" << " : " << - booleanAsString (fTraceHarpPedals) << - endl << - - // harp pedals tuning - setw (valueFieldWidth) << "traceHarpPedalsTunings" << " : " << - booleanAsString (fTraceHarpPedalsTunings) << - endl << - - // extra chords - setw (valueFieldWidth) << "traceExtraChords" << " : " << - booleanAsString (fTraceExtraChords) << - endl << - -/* JMI - // msrStreams - setw (valueFieldWidth) << "traceMsrStreams" << " : " << - booleanAsString (fTraceMsrStreams) << - endl << -*/ - - // midi - setw (valueFieldWidth) << "traceMidi" << " : " << - booleanAsString (fTraceMidi) << - endl; - - gIndenter--; - - gIndenter--; -} - -void traceOah::printTraceOahValues (int fieldWidth) -{ - gLogOstream << - "The trace options are:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "Trace:" << - endl; - - gIndenter++; - - gLogOstream << left << - // options and help display - setw (fieldWidth) << "traceOah" << " : " << - booleanAsString (fTraceOah) << - endl << - setw (fieldWidth) << "traceOahDetails" << " : " << - booleanAsString (fTraceOahDetails) << - endl << - - // passes - setw (fieldWidth) << "tracePasses" << " : " << - booleanAsString (fTracePasses) << - endl << - - // for tests, hidden - setw (fieldWidth) << "traceForTests" << " : " << - booleanAsString (fTraceForTests) << - endl << - - // score - setw (fieldWidth) << "traceScore" << " : " << - booleanAsString (fTraceScore) << - endl << - - // varValAssocs - setw (fieldWidth) << "traceVarValAssocs" << " : " << - booleanAsString (fTraceVarValAssocs) << - endl << - - // credits - setw (fieldWidth) << "traceCredits" << " : " << - booleanAsString (fTraceCredits) << - endl << - - // scaling - setw (fieldWidth) << "traceGeometry" << " : " << - booleanAsString (fTraceGeometry) << - endl << - - // part groups - setw (fieldWidth) << "tracePartGroups" << " : " << - booleanAsString (fTracePartGroups) << - endl << - setw (fieldWidth) << "tracePartGroupsDetails" << " : " << - booleanAsString (fTracePartGroupsDetails) << - endl << - - // parts - setw (fieldWidth) << "traceParts" << " : " << - booleanAsString (fTraceParts) << - endl << - - // staves - setw (fieldWidth) << "traceStaves" << " : " << - booleanAsString (fTraceStaves) << - endl << - - // voices - setw (fieldWidth) << "traceVoices" << " : " << - booleanAsString (fTraceVoices) << - endl << - setw (fieldWidth) << "traceVoicesDetails" << " : " << - booleanAsString (fTraceVoicesDetails) << - endl << - - // measures - setw (fieldWidth) << "traceMeasuresNumbers" << " : " << - booleanAsString (fTraceMeasuresNumbers) << - endl << - setw (fieldWidth) << "traceMeasures" << " : " << - booleanAsString (fTraceMeasures) << - endl << - setw (fieldWidth) << "traceMeasuresDetails" << " : " << - booleanAsString (fTraceMeasuresDetails) << - endl << - setw (fieldWidth) << "tracePositionsInMeasures" << " : " << - booleanAsString (fTracePositionsInMeasures) << - endl; - - gLogOstream << left << - setw (fieldWidth) << "traceDetailedMeasureNumbersSet" << " : " << - endl; - - if (fTraceDetailedMeasureNumbersSet.size ()) { - set::const_iterator - iBegin = fTraceDetailedMeasureNumbersSet.begin (), - iEnd = fTraceDetailedMeasureNumbersSet.end (), - i = iBegin; - - gIndenter++; - - for ( ; ; ) { - gLogOstream << "v " << (*i); - if (++i == iEnd) break; - // no endl here - } // for - - gIndenter--; - } - else { - gLogOstream << - "none"; - } - gLogOstream << endl; - - // segments - gLogOstream << left << - setw (fieldWidth) << "traceSegments" << " : " << - booleanAsString (fTraceSegments) << - endl << - setw (fieldWidth) << "traceSegmentsDetails" << " : " << - booleanAsString (fTraceSegmentsDetails) << - endl << - - // clefs - setw (fieldWidth) << "traceClefs" << " : " << - booleanAsString (fTraceClefs) << - endl << - - // keys - setw (fieldWidth) << "traceKeys" << " : " << - booleanAsString (fTraceKeys) << - endl << - - // times - setw (fieldWidth) << "traceTimes" << " : " << - booleanAsString (fTraceTimes) << - endl << - - // tempos - setw (fieldWidth) << "traceTempos" << " : " << - booleanAsString (fTraceTempos) << - endl << - - // rehearsals - setw (fieldWidth) << "traceRehearsals" << " : " << - booleanAsString (fTraceRehearsals) << - endl << - - // line breaks - setw (fieldWidth) << "traceLineBreaks" << " : " << - booleanAsString (fTraceLineBreaks) << - endl << - - // page breaks - setw (fieldWidth) << "tracePageBreaks" << " : " << - booleanAsString (fTracePageBreaks) << - endl << - - // staff changes - setw (fieldWidth) << "traceStaffChanges" << " : " << - booleanAsString (fTraceStaffChanges) << - endl << - - // transpositions - setw (fieldWidth) << "traceTranspositions" << " : " << - booleanAsString (fTraceTranspositions) << - endl << - - // octave shifts - setw (fieldWidth) << "traceOctaveShifts" << " : " << - booleanAsString (fTraceOctaveShifts) << - endl << - - // barlines - setw (fieldWidth) << "traceBarlines" << " : " << - booleanAsString (fTraceBarlines) << - endl << - setw (fieldWidth) << "traceBarlinesDetails" << " : " << - booleanAsString (fTraceBarlinesDetails) << - endl << - - // bar checks - setw (fieldWidth) << "traceBarChecks" << " : " << - booleanAsString (fTraceBarChecks) << - endl << - - // bar number checks - setw (fieldWidth) << "traceBarNumberChecks" << " : " << - booleanAsString (fTraceBarNumberChecks) << - endl << - - // repeats - setw (fieldWidth) << "traceRepeats" << " : " << - booleanAsString (fTraceRepeats) << - endl << - setw (fieldWidth) << "traceRepeatsDetails" << " : " << - booleanAsString (fTraceRepeatsDetails) << - endl << - - // measures repeats - setw (fieldWidth) << "traceMeasuresRepeats" << " : " << - booleanAsString (fTraceMeasuresRepeats) << - endl << - - // rest measures - setw (fieldWidth) << "traceRestMeasures" << " : " << - booleanAsString (fTraceRestMeasures) << - endl << - - // slashes - setw (fieldWidth) << "traceSlashes" << " : " << - booleanAsString (fTraceSlashes) << - endl << - - // notes - setw (fieldWidth) << "traceNotes" << " : " << - booleanAsString (fTraceNotes) << - endl << - setw (fieldWidth) << "traceNotesDetails" << " : " << - booleanAsString (fTraceNotesDetails) << - endl << - setw (fieldWidth) << "traceWholeNotes" << " : " << - booleanAsString (fTraceWholeNotes) << - endl << - setw (fieldWidth) << "traceWholeNotesDetails" << " : " << - booleanAsString (fTraceWholeNotesDetails) << - endl << - setw (fieldWidth) << "traceRestNotes" << " : " << - booleanAsString (fTraceRestNotes) << - endl << - setw (fieldWidth) << "traceSkipNotes" << " : " << - booleanAsString (fTraceSkipNotes) << - endl << - setw (fieldWidth) << "traceNotesOctaveEntry" << " : " << - booleanAsString (fTraceNotesOctaveEntry) << - endl << - - // stems - setw (fieldWidth) << "traceStems" << " : " << - booleanAsString (fTraceStems) << - endl << - - // beams - setw (fieldWidth) << "traceBeams" << " : " << - booleanAsString (fTraceBeams) << - endl << - - // articulations - setw (fieldWidth) << "traceArticulations" << " : " << - booleanAsString (fTraceArticulations) << - endl << - - // technicals - setw (fieldWidth) << "traceTechnicals" << " : " << - booleanAsString (fTraceTechnicals) << - endl << - - // ornaments - setw (fieldWidth) << "traceOrnaments" << " : " << - booleanAsString (fTraceOrnaments) << - endl << - - // dynamics - setw (fieldWidth) << "traceGraceDynamics" << " : " << - booleanAsString (fTraceDynamics) << - endl << - - // spanners - setw (fieldWidth) << "traceSpanners" << " : " << - booleanAsString (fTraceSpanners) << - endl << - - // words - setw (fieldWidth) << "traceWords" << " : " << - booleanAsString (fTraceWords) << - endl << - - // tremolos - setw (fieldWidth) << "traceTremolos" << " : " << - booleanAsString (fTraceTremolos) << - endl << - - // chords - setw (fieldWidth) << "traceChords" << " : " << - booleanAsString (fTraceChords) << - endl << - setw (fieldWidth) << "traceChordsDetails" << " : " << - booleanAsString (fTraceChordsDetails) << - endl << - - // tuplets - setw (fieldWidth) << "traceTuplets" << " : " << - booleanAsString (fTraceTuplets) << - endl << - setw (fieldWidth) << "traceTupletsDetails" << " : " << - booleanAsString (fTraceTupletsDetails) << - endl << - - // glissandos - setw (fieldWidth) << "traceGlissandos" << " : " << - booleanAsString (fTraceGlissandos) << - endl << - - // eyeglases - setw (fieldWidth) << "traceEyeGlasses" << " : " << - booleanAsString (fTraceEyeGlasses) << - endl << - - // damps - setw (fieldWidth) << "traceDamps" << " : " << - booleanAsString (fTraceDamps) << - endl << - - // dampalls - setw (fieldWidth) << "traceDampAlls" << " : " << - booleanAsString (fTraceDampAlls) << - endl << - - // slides - setw (fieldWidth) << "traceSlides" << " : " << - booleanAsString (fTraceSlides) << - endl << - - // grace notes - setw (fieldWidth) << "traceGraceNotes" << " : " << - booleanAsString (fTraceGraceNotes) << - endl << - - // lyrics - setw (fieldWidth) << "traceLyrics" << " : " << - booleanAsString (fTraceLyrics) << - endl << - setw (fieldWidth) << "traceLyricsDetails" << " : " << - booleanAsString (fTraceLyricsDetails) << - endl << - - // harmonies - setw (fieldWidth) << "traceHarmonies" << " : " << - booleanAsString (fTraceHarmonies) << - endl << - - // frames - setw (fieldWidth) << "traceFrames" << " : " << - booleanAsString (fTraceFrames) << - endl << - - // figured basses - setw (fieldWidth) << "traceFiguredBasses" << " : " << - booleanAsString (fTraceFiguredBasses) << - endl << - - // ties - setw (fieldWidth) << "traceTies" << " : " << - booleanAsString (fTraceTies) << - endl << - - // slurs - setw (fieldWidth) << "traceSlurs" << " : " << - booleanAsString (fTraceSlurs) << - endl << - - // ligatures - setw (fieldWidth) << "traceLigatures" << " : " << - booleanAsString (fTraceLigatures) << - endl << - - // pedals - setw (fieldWidth) << "tracePedals" << " : " << - booleanAsString (fTracePedals) << - endl << - - // wedges - setw (fieldWidth) << "traceWedges" << " : " << - booleanAsString (fTraceWedges) << - endl << - - // staff details - setw (fieldWidth) << "traceStaffDetails" << " : " << - booleanAsString (fTraceStaffDetails) << - endl << - - // scordaturas - setw (fieldWidth) << "traceScordaturas" << " : " << - booleanAsString (fTraceScordaturas) << - endl << - - // segnos - setw (fieldWidth) << "traceSegnos" << " : " << - booleanAsString (fTraceSegnos) << - endl << - - // codas - setw (fieldWidth) << "traceCodas" << " : " << - booleanAsString (fTraceCodas) << - endl << - - // accordion registrations - setw (fieldWidth) << "traceAccordionRegistrations" << " : " << - booleanAsString (fTraceAccordionRegistrations) << - endl << - - // harp pedals - setw (fieldWidth) << "traceHarpPedals" << " : " << - booleanAsString (fTraceHarpPedals) << - endl << - - // harp pedals tuning - setw (fieldWidth) << "traceHarpPedalsTunings" << " : " << - booleanAsString (fTraceHarpPedalsTunings) << - endl << - - // extra chords - setw (fieldWidth) << "traceExtraChords" << " : " << - booleanAsString (fTraceExtraChords) << - endl << - -/* JMI - // msrStreams - setw (fieldWidth) << "traceMsrStreams" << " : " << - booleanAsString (fTraceMsrStreams) << - endl << -*/ - - // midi - setw (fieldWidth) << "traceMidi" << " : " << - booleanAsString (fTraceMidi) << - endl; - - gIndenter--; - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_traceOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeTraceOahHandling ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (false && ! gGeneralOah->fQuiet) { // JMI - gLogOstream << - "Initializing trace options handling" << - endl; - } -#endif - - // create the options variables - // ------------------------------------------------------ - - gTraceOahUserChoices = traceOah::create ( - handler); - assert(gTraceOahUserChoices != 0); - - gTraceOah = - gTraceOahUserChoices; -} - - -} - -#endif - - -/* JMI - // traceDetailedMeasureNumbersSet - // -------------------------------------- - - { - S_oahSubGroup - traceAndDisplaySubGroup = - oahSubGroup::create ( - "Trace and display", - "htd", "help-trace-and-display", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (traceAndDisplaySubGroup); - - // detailed measure numbers set - - // fTraceDetailedMeasureNumbersSet is empty - - traceAndDisplaySubGroup-> - appendAtomToSubGroup ( - oahNaturalNumbersSetAtom::create ( - "tdetail", "trace-detailed", -R"('measureNumbersSet' has a form such as '0,2-14,^8-10', -where '^' excludes the corresponding numbers interval -and 0 applies to the '' and anacrusis if present. -The measure numbers should be those of the produced score, -since MusicXML measure numbers are arbitrary strings. -Generate a detailed trace of the activity and print additional -debugging information to standard error for the specified measures.)", - "measureNumbersSet", - "traceDetailedMeasureNumbersSet", - fTraceDetailedMeasureNumbersSet)); - } -*/ - diff --git a/src/lilypond/traceOah.h b/src/lilypond/traceOah.h deleted file mode 100644 index 89993a23b..000000000 --- a/src/lilypond/traceOah.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___traceOah___ -#define ___traceOah___ - - -#include "setTraceOahIfDesired.h" - -#ifdef TRACE_OAH - - -#include - -#include "exports.h" - -#include "oahBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class traceOah : public oahGroup -{ - public: - - static SMARTP create ( - S_oahHandler handlerUpLink); - - SMARTP createCloneWithTrueValues (); // JMI - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeTraceOah ( - bool boolOptionsInitialValue); - - void initializeOptionsTraceAndDisplayOptions ( - bool boolOptionsInitialValue); - - void initializeRepeatsToSlashesTraceOah ( - bool boolOptionsInitialValue); - - void initializeNotesTraceOah ( - bool boolOptionsInitialValue); - - void initializeNotesAttachmentsTraceOah ( - bool boolOptionsInitialValue); - - void initializeScoreToVoicesTraceOah ( - bool boolOptionsInitialValue); - - void initializeSegmentsAndMeasuresTraceOah ( - bool boolOptionsInitialValue); - - void initializeInstrumentsTraceOah ( - bool boolOptionsInitialValue); - - void initializeChordsAndTupletsTraceOah ( - bool boolOptionsInitialValue); - - void initializeCreditsToWordsTraceOah ( - bool boolOptionsInitialValue); - - void initializeHarmoniesAndFiguredBassesTraceOah ( - bool boolOptionsInitialValue); - - void initializeSpannersTraceOah ( - bool boolOptionsInitialValue); - - void initializeInterNotesTraceOah ( - bool boolOptionsInitialValue); - - void initializeClefsToTemposTraceOah ( - bool boolOptionsInitialValue); - - void initializeBreaksAndBarlinesTraceOah ( - bool boolOptionsInitialValue); - - void initializeAboveStaffTraceOah ( - bool boolOptionsInitialValue); - - void initializeTranspositionsTraceOah ( - bool boolOptionsInitialValue); - - void initializeOtherTraceOah ( - bool boolOptionsInitialValue); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - traceOah ( - S_oahHandler handlerUpLink); - - virtual ~traceOah (); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // set and get - // ------------------------------------------------------ - - /* JMI - void setAllGeneralTraceOah ( - bool boolOptionsInitialValue); - */ - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printTraceOahHelp (); - - void printTraceOahValues (int fieldWidth); - - virtual void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - public: - - // options and help trace - // -------------------------------------- - - bool fTraceOah; - bool fTraceOahDetails; - - // other - // -------------------------------------- - - // passes - bool fTracePasses; - // scaling - bool fTraceGeometry; - // varValAssocs - bool fTraceVarValAssocs; // specialize ??? JMI - // for tests, hidden - bool fTraceForTests; - - - // score to voices - // -------------------------------------- - - // score - bool fTraceScore; - // part groups - bool fTracePartGroups; - bool fTracePartGroupsDetails; - // parts - bool fTraceParts; - // staves - bool fTraceStaves; - // staff details - bool fTraceStaffDetails; - // staff changes - bool fTraceStaffChanges; - // voices - bool fTraceVoices; - bool fTraceVoicesDetails; - - - // segments and measures - // -------------------------------------- - - // segments - bool fTraceSegments; - bool fTraceSegmentsDetails; - // measures - bool fTraceMeasuresNumbers; - bool fTraceMeasures; - bool fTraceMeasuresDetails; - bool fTracePositionsInMeasures; - set fTraceDetailedMeasureNumbersSet; - - - // clefs to tempos - // -------------------------------------- - - // clefs - bool fTraceClefs; - // keys - bool fTraceKeys; - // times - bool fTraceTimes; - // tempos - bool fTraceTempos; - - - // breaks and barlines - // -------------------------------------- - - // line breaks - bool fTraceLineBreaks; - // page breaks - bool fTracePageBreaks; - // barlines - bool fTraceBarlines; - // barlines details - bool fTraceBarlinesDetails; - - - // bar checks - // -------------------------------------- - - bool fTraceBarChecks; - - - // bar number checks - // -------------------------------------- - - bool fTraceBarNumberChecks; - - - // transpositions - // -------------------------------------- - - // transpositions - bool fTraceTranspositions; - // octave shifts - bool fTraceOctaveShifts; - - - // repeats to slashes - // -------------------------------------- - - // repeats - bool fTraceRepeats; - bool fTraceRepeatsDetails; - // measures repeats - bool fTraceMeasuresRepeats; - // rest measures - bool fTraceRestMeasures; - // beats repeats - bool fTraceBeatsRepeats; - // slashes - bool fTraceSlashes; - - - // notes - // -------------------------------------- - - // notes - bool fTraceNotes; - // notes details - bool fTraceNotesDetails; - // whole notes - bool fTraceWholeNotes; - bool fTraceWholeNotesDetails; - // skip notes - bool fTraceSkipNotes; - // rest notes - bool fTraceRestNotes; - // notes octave entry - bool fTraceNotesOctaveEntry; - // grace notes - bool fTraceGraceNotes; - // tremolos - bool fTraceTremolos; - - - // note attachments - // -------------------------------------- - - // stems - bool fTraceStems; - // beams - bool fTraceBeams; - // articulations - bool fTraceArticulations; - // technicals - bool fTraceTechnicals; - // ornaments - bool fTraceOrnaments; - // dynamics - bool fTraceDynamics; - - - // spanners - // -------------------------------------- - - // spanners - bool fTraceSpanners; // ??? - // wedges - bool fTraceWedges; - // spanners - // slurs - bool fTraceSlurs; - // ligatures - bool fTraceLigatures; - - - // credits to words - // -------------------------------------- - - // credits - bool fTraceCredits; - // lyrics - bool fTraceLyrics; - bool fTraceLyricsDetails; - // words - bool fTraceWords; - - - // chords and tuplets - // -------------------------------------- - - // chords - bool fTraceChords; - bool fTraceChordsDetails; - // tuplets - bool fTraceTuplets; - bool fTraceTupletsDetails; - // extra chords - bool fTraceExtraChords; - - - // inter-notes - // -------------------------------------- - - // ties - bool fTraceTies; - // glissandos - bool fTraceGlissandos; - - - // above staff - // -------------------------------------- - - // rehearsals - bool fTraceRehearsals; - // segnos - bool fTraceSegnos; - // codas - bool fTraceCodas; - // eyeglases - bool fTraceEyeGlasses; - - - // harmonies and figured basses - // -------------------------------------- - - // harmonies - bool fTraceHarmonies; - // figured basses - bool fTraceFiguredBasses; - - - // instruments - // -------------------------------------- - - // frames - bool fTraceFrames; - // scordaturas - bool fTraceScordaturas; - // slides - bool fTraceSlides; - // pedals - bool fTracePedals; - // accordion registrations - bool fTraceAccordionRegistrations; - // harp pedals - bool fTraceHarpPedals; - // harp pedals tuning - bool fTraceHarpPedalsTunings; - // damps - bool fTraceDamps; - // dampalls - bool fTraceDampAlls; - // midi - bool fTraceMidi; - - -/* JMI - // msrStreams - // -------------------------------------- - bool fTraceMsrStreams; - - // layout -*/ - - private: - - // private work fields - // -------------------------------------- - - S_oahPrefix fShortTracePrefix; - S_oahPrefix fLongTracePrefix; -}; -typedef SMARTP S_traceOah; -EXP ostream& operator<< (ostream& os, const S_traceOah& elt); - -EXP extern S_traceOah gTraceOah; -EXP extern S_traceOah gTraceOahUserChoices; -EXP extern S_traceOah gTraceOahWithDetailedTrace; - -//______________________________________________________________________________ -void initializeTraceOahHandling ( - S_oahHandler handler); - - -} - - -#endif - - -#endif diff --git a/src/lilypond/utilities.cpp b/src/lilypond/utilities.cpp deleted file mode 100644 index 33143bf11..000000000 --- a/src/lilypond/utilities.cpp +++ /dev/null @@ -1,1961 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - - // #include "unistd.h" - -#include -#include -#include - -#include -#include - -#include // setw, ... - -#include "rational.h" -#include "utilities.h" - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_timingItem timingItem::createTimingItem ( - string activity, - string description, - timingItemKind kind, - clock_t startClock, - clock_t endClock) -{ - timingItem* o = new timingItem ( - activity, - description, - kind, - startClock, - endClock); - assert(o!=0); - return o; -} - -timingItem::timingItem ( - string activity, - string description, - timingItemKind kind, - clock_t startClock, - clock_t endClock) -{ - fActivity = activity; - fDescription = description; - fKind = kind; - fStartClock = startClock; - fEndClock = endClock; -} - -timing::timing () -{} - -timing::~timing () -{} - - -void timing::appendTimingItem ( - string activity, - string description, - timingItem::timingItemKind - kind, - clock_t startClock, - clock_t endClock) -{ - S_timingItem - timingItem = - timingItem::createTimingItem ( - activity, - description, - kind, - startClock, - endClock); - - fTimingItemsList.push_back (timingItem); -} - -ostream& operator<< (ostream& os, const timing& tim) { - tim.print(os); - return os; -} - -void timing::print (ostream& os) const -{ - const int - activityWidth = 8, - descriptionWidth = 31, - kindWidth = 9, - secondsWidth = 9, - secondsPrecision = 6; - - clock_t - totalClock = 0.0, - totalMandatoryClock = 0.0, - totalOptionalClock = 0.0; - - os << endl << "Timing information:" << endl << endl << - setw (activityWidth) << "Activity" << " " << - setw (descriptionWidth) << "Description" << " " << - setw (kindWidth) << "Kind" << " " << - setw (secondsWidth) << "CPU (sec)" << endl << - setw (activityWidth) << replicateString ("-", activityWidth) << " " << - setw (descriptionWidth) << replicateString ("-", descriptionWidth) << " " << - setw (kindWidth) << replicateString ("-", kindWidth) << " " << - setw (secondsWidth) << replicateString ("-", secondsWidth) << endl << endl; - - for ( list::const_iterator i=fTimingItemsList.begin (); i!=fTimingItemsList.end (); i++) { - clock_t timingItemClock = (*i)->fEndClock - (*i)->fStartClock; - totalClock += timingItemClock; - - os << left << - setw (activityWidth) << (*i)->fActivity << " " << - setw (descriptionWidth) << (*i)->fDescription << " "; - - switch ((*i)->fKind) { - case timingItem::kMandatory: - totalMandatoryClock += timingItemClock; - os << setw (kindWidth) << "mandatory"; - break; - case timingItem::kOptional: - totalOptionalClock += timingItemClock; - os << setw (kindWidth) << "optional"; - break; - } // switch - - os << " " << - setw (secondsWidth) << setprecision(secondsPrecision) << - left << float(timingItemClock) / CLOCKS_PER_SEC << endl; - } // for - - const int - totalClockWidth = 7, - totalMandatoryClockWidth = 9, - totalOptionalClockWidth = 10, - totalsPrecision = 6; - - os << left << - endl << - setw (totalClockWidth) << "Total" << - " " << - setw (totalMandatoryClockWidth) << "Mandatory" << - " " << - setw (totalOptionalClockWidth) << "Optional" << - endl << - - setw (totalClockWidth) << - replicateString ("-", totalClockWidth) << - " " << - setw (totalMandatoryClockWidth) << - replicateString ("-", totalMandatoryClockWidth) << - " " << - setw (secondsWidth) << - replicateString ("-", secondsWidth) << - setprecision(totalsPrecision) << - endl << - - setw (totalClockWidth) << - float(totalClock) / CLOCKS_PER_SEC << - " " << - setw (totalMandatoryClockWidth) << - float(totalMandatoryClock) / CLOCKS_PER_SEC << - " " << - setw (totalOptionalClockWidth) << - float(totalOptionalClock) / CLOCKS_PER_SEC << - endl << - endl; -} - -timing timing::gTiming; - -//______________________________________________________________________________ -//#define DEBUG_INDENTER - -indenter indenter::gIndenter; - -indenter::indenter (string spacer) -{ - fIndent = 0; - fSpacer = spacer; -} - -indenter::~indenter () -{} - -indenter& indenter::operator++ (const int value) -{ - fIndent++; - -#ifdef DEBUG_INDENTER - gLogOstream << - "% INDENTER: " << fIndent << - endl; -#endif - - return *this; -} - -indenter& indenter::operator-- (const int value) -{ - fIndent--; - - if (fIndent < 0) { - gLogOstream << - endl << - "% ### Indentation has become negative: " << fIndent << - endl << endl; - -#ifdef DEBUG_INDENTER - assert(false); -#endif - } - -#ifdef DEBUG_INDENTER - else { - gLogOstream << - "% INDENTER: " << fIndent << - endl; - } -#endif - - return *this; -} - -indenter& indenter::increment (int value) -{ - fIndent += value; - - if (fIndent < 0) { - gLogOstream << - endl << - "% ### Indentation has become negative: " << fIndent << - endl << endl; - -#ifdef DEBUG_INDENTER - assert(false); -#endif - } - -#ifdef DEBUG_INDENTER - else { - gLogOstream << - "% INDENTER: " << fIndent << - endl; - } -#endif - - return *this; -} - -indenter& indenter::decrement (int value) -{ - fIndent -= value; - - if (fIndent < 0) { - gLogOstream << - endl << - "% ### Indentation has become negative: " << fIndent << - endl << endl; - -#ifdef DEBUG_INDENTER - assert(false); -#endif - } - -#ifdef DEBUG_INDENTER - else { - gLogOstream << - "% INDENTER: " << fIndent << - endl; - } -#endif - - return *this; -} - -string indenter::indentMultiLineString (string value) -{ - stringstream s; - - // add indentation ahead of all lines inside 'value' - istringstream inputStream (value); - string line; - - while (getline (inputStream, line)) { - s << line; - - if (inputStream.eof()) break; - - s << endl; - this->print (s); - } // while - - return s.str (); -} - -ostream& operator<< (ostream& os, const indenter& idtr) { - idtr.print(os); - return os; -} - -void indenter::print (ostream& os) const -{ - int i = fIndent; - - while (i-- > 0) os << fSpacer; -} - -//______________________________________________________________________________ -int indentedStreamBuf::sync () -{ - // When we sync the stream with fOutputSteam: - // 1) output the indentation then the buffer - // 2) reset the buffer - // 3) flush the actual output stream we are using. - - std::size_t strSize = str ().size (); - - // fetch the last non-space character in the buffer - // caution: the '\n' is present as the last character! - std::size_t found = str ().find_last_not_of(' ', strSize - 2); - - // this can be uncommented to see low level informations - // fOutputSteam << "% strSize: " << strSize << ", found: " << found << '\n'; - - // output the indenter - fOutputSteam << fIndenter; - - // output the buffer - if (found == strSize - 3) { - // don't output the trailing spaces, but output the end of line - fOutputSteam << str ().substr (0, found + 1) << '\n'; - } - else { - // output the whole buffer - fOutputSteam << str (); - } - - // reset the buffer - str (""); - - // flush the output stream - fOutputSteam.flush (); - - return 0; -} - -//______________________________________________________________________________ -indentedOstream indentedOstream::gOutputIndentedOstream ( - cout, indenter::gIndenter); - -indentedOstream indentedOstream::gLogIndentedOstream ( - cerr, indenter::gIndenter); - -// code taken from: -// http://comp.lang.cpp.moderated.narkive.com/fylLGJgp/redirect-output-to-dev-null -template > -struct basic_nullbuf : std::basic_streambuf -{ - typedef std::basic_streambuf base_type; - typedef typename base_type::int_type int_type; - typedef typename base_type::traits_type traits_type; - - virtual int_type overflow (int_type c) { - return traits_type::not_eof (c); - } -}; - -// convenient typedefs -typedef basic_nullbuf nullbuf; -//typedef basic_nullbuf wnullbuf; - -// buffers and streams -nullbuf cnull_obj; -//wnullbuf wcnull_obj; - -std::ostream cnull (& cnull_obj); -//std::wostream wcnull (& wcnull_obj); - -indentedOstream indentedOstream::gNullIndentedOstream ( - cnull, indenter::gIndenter); - -//______________________________________________________________________________ -string replicateString ( - string str, - int times) -{ - string result; - - for (int i = 0; i < times; i++) - result += str; - - return result; -} - -//______________________________________________________________________________ -string replaceSubstringInString ( - std::string str, - std::string subString, - std::string ersatz) -{ - string result = str; - - size_t found = result.find (subString); - - if (found != string::npos) { - result.replace (found, subString.size (), ersatz); - } - - return result; -} - -//______________________________________________________________________________ -string int2EnglishWord (int n) -{ - stringstream s; - - if (n < 0) { - s << "Minus_"; - n = -n; - -// assert(false); // JMI - } - - if (n >= 1000) { - int nDiv1000 = n / 1000; - int nModulo1000 = n % 1000; - - return - int2EnglishWord (nDiv1000) + - "Thousand" + - int2EnglishWord (nModulo1000); - } - - else if (n >= 100) { - //return "LargerThanNinetyNine"; - int nDiv100 = n / 100; - int nModulo100 = n % 100; - - return - int2EnglishWord (nDiv100) + - "HundredAnd" + - int2EnglishWord (nModulo100); - } - - else { - switch (n) { - case 0: - s << "Zero"; - break; - case 1: - s << "One"; - break; - case 2: - s << "Two"; - break; - case 3: - s << "Three"; - break; - case 4: - s << "Four"; - break; - case 5: - s << "Five"; - break; - case 6: - s << "Six"; - break; - case 7: - s << "Seven"; - break; - case 8: - s << "Eight"; - break; - case 9: - s << "Nine"; - break; - case 10: - s << "Ten"; - break; - case 11: - s << "Eleven"; - break; - case 12: - s << "Twelve"; - break; - case 13: - s << "Thirteen"; - break; - case 14: - s << "Fourteen"; - break; - case 15: - s << "Fifteen"; - break; - case 16: - s << "Sixteen"; - break; - case 17: - s << "Seventeen"; - break; - case 18: - s << "Eighteen"; - break; - case 19: - s << "Nineteen"; - break; - - default: { - // n >= 20 - int nDiv10 = n / 10; - int nModulo10 = n % 10; - - switch (nDiv10) { - case 2: - s << "Twenty"; - break; - case 3: - s << "Thirty"; - break; - case 4: - s << "Fourty"; - break; - case 5: - s << "Fifty"; - break; - case 6: - s << "Sixty"; - break; - case 7: - s << "Seventy"; - break; - case 8: - s << "Eighty"; - break; - case 9: - s << "Ninety"; - break; - } // switch - s << int2EnglishWord (nModulo10); - } // default - } // switch - } - - return s.str (); -} - -//______________________________________________________________________________ -string stringNumbersToEnglishWords (string str) -{ - if (! str.size ()) { - return "NONE"; - } - - enum workState { - kInitialState, kWorkingOnDigits, kWorkingOnNonDigits }; - - vector chunks; - vector states; - - workState state = kInitialState; - - string::const_iterator - iBegin = str.begin (), - iEnd = str.end (), - i = iBegin; - - for ( ; ; ) { - char ch = (*i); - - if( isdigit(ch)) { - // digit - if (state != kWorkingOnDigits) { - // create a new chunck for digits - chunks.push_back (""); - states.push_back (kWorkingOnDigits); - state = kWorkingOnDigits; - } - chunks.back().push_back(ch); - } - else { - // non digit - if (state != kWorkingOnNonDigits) { - // create a new chunck for non digits - chunks.push_back (""); - states.push_back (kWorkingOnNonDigits); - state = kWorkingOnNonDigits; - } - chunks.back().push_back(ch); - } - if (++i == iEnd) break; - } // for - - string result = ""; - - for (unsigned int i = 0; i < chunks.size (); i++) { - if (states[i] == kWorkingOnDigits) { - int integerValue; - - istringstream inputStream (chunks[i]); - - inputStream >> integerValue; - - result += int2EnglishWord (integerValue); - } - else { - result += chunks[i]; - } - } // for - - return result; -}; - -//______________________________________________________________________________ -int consumeDecimalNumber ( - string::const_iterator theStringIterator, - string::const_iterator& remainingStringIterator, - bool debugMode) -{ - string::const_iterator cursor = theStringIterator; - int result = 0; - - if (! isdigit (*cursor)) { - gLogOstream << - "consumeDecimalNumber (" << *cursor << - "), " << *cursor << " is no decimal digit!" << - endl; - } - - while (isdigit (*cursor)) { - if (debugMode) { - gLogOstream << - "--> consumeDecimalNumber: cursor = |" << - *cursor << - "|" << - endl; - } - - result = result*10 + (*cursor-'0'); - - cursor++; - } // while - - remainingStringIterator = cursor; - - if (debugMode) { - gLogOstream << - "--> consumeDecimalNumber: result = " << result << - ", *remainingStringIterator = |" << *remainingStringIterator << - "|" << - endl; - } - - return result; -} - -//______________________________________________________________________________ -set decipherNaturalNumbersSetSpecification ( - string theString, - bool debugMode) -{ - // A naturalNumbersSetSpecification sample is: "7,15-19,^16-17" - - set result; - - if (debugMode) { - gLogOstream << - "--> decipherNaturalNumbersSetSpecification, theString = |" << theString << - "|" << - endl; - } - - if (theString.size ()) { - string::const_iterator - cursor = theString.begin (); - - while (1) { - if (debugMode) { - gLogOstream << - "--> decipherNaturalNumbersSetSpecification: cursor = |" << - *cursor << "|" << - endl; - } - - int negated = 0; - - if (*cursor == '^') { - cursor++; - negated = 1; - } - - int - intervalStartNumber = - consumeDecimalNumber (cursor, cursor, debugMode), - intervalEndNumber; - - if (*cursor == '-') { - cursor++; - - if (debugMode) { - gLogOstream << - "--> decipherNaturalNumbersSetSpecification after '-' : cursor = |" << - *cursor << - "|" << - endl << - endl; - } - - intervalEndNumber = - consumeDecimalNumber (cursor, cursor, debugMode); - } - - else { - intervalEndNumber = intervalStartNumber; - } - - if (debugMode) { - gLogOstream << - "--> decipherNaturalNumbersSetSpecification" << - ", intervalStartNumber = " << intervalStartNumber << - ", intervalEndNumber = " << intervalEndNumber << - ": *cursor = |" << *cursor << "|" << - endl; - } - - for (int i = intervalStartNumber; i <= intervalEndNumber; i ++) { - if (negated) { - result.erase (i); - } - else { - result.insert (i); - } - } // for - - if (*cursor != ',') { - if (debugMode) { - gLogOstream << - "--> decipherNaturalNumbersSetSpecification, after non ',' : cursor = |" << - *cursor << - "|" << - endl << - endl; - } - break; - } - - cursor++; - - if (debugMode) { - gLogOstream << - "--> decipherNaturalNumbersSetSpecification after ',' : cursor = |" << - *cursor << - "|" - << endl << - endl; - } - } // while - - if (* cursor != '\0') { - gLogOstream << - "--> Extraneous characters |" << *cursor << - "| in numbers spec" << - endl << endl; - } - } - - return result; -} - -//______________________________________________________________________________ -string consumeString ( - string::const_iterator theStringIterator, - string::const_iterator& remainingStringIterator, - bool debugMode) -{ - string result; - -/* JMI - string::const_iterator cursor = theStringIterator; - - while ((*cursor) != ',') { - if (debugMode) { - gLogOstream << - "--> consumeString: cursor = |" << - *cursor << - "|" << - endl; - } - - result += (*cursor); - - if (++cursor == theString.end ()) break; - } // while - - remainingStringIterator = cursor; - - if (debugMode) { - gLogOstream << - "--> consumeString: result = " << result << - ", *remainingStringIterator = |" << *remainingStringIterator << - "|" << - endl; - } -*/ - - return result; -} - -//______________________________________________________________________________ -std::set decipherStringsSetSpecification ( - string theString, - bool debugMode) -{ - // A integersSetSpecification sample is: "FOO,159,haLLo" - - set result; - -/* JMI - if (debugMode) { - gLogOstream << - "--> decipherStringsSetSpecification, theString = |" << theString << - "|" << - endl; - } - - string::const_iterator - cursor = theString.begin (); - - while (1) { - if (debugMode) { - gLogOstream << - "--> decipherStringsSetSpecification: cursor = |" << - *cursor << "|" << - endl; - } - - string - currentString = - consumeString (cursor, theString.end (), debugMode); - - if (debugMode) { - gLogOstream << - "--> decipherStringsSetSpecification" << - ", currentString = " << currentString << - ": *cursor = |" << *cursor << "|" << - endl; - } - - result.insert (currentString); - - if (*cursor != ',') { - if (debugMode) { - gLogOstream << - "--> decipherStringsSetSpecification, after non ',' : cursor = |" << - *cursor << - "|" << - endl << - endl; - } - break; - } - - if (++cursor == theString.end ()) break; - - if (debugMode) { - gLogOstream << - "--> decipherStringsSetSpecification after ',' : cursor = |" << - *cursor << - "|" - << endl << - endl; - } - } // while - - if (* cursor != '\0') { - gLogOstream << - "--> Extraneous characters |" << *cursor << - "| in numbers spec" << - endl << endl; - } - */ - - return result; -} - -//______________________________________________________________________________ -list extractNumbersFromString ( - string theString, // can contain "1, 2, 17" - bool debugMode) -{ - list foundNumbers; - - if (debugMode) { - gLogOstream << - "--> extractNumbersFromString, theString = |" << theString << - "|" << - endl; - } - - if (theString.size ()) { - string::const_iterator - cursor = theString.begin (); - - while (1) { - if (cursor == theString.end ()) - break; - - if (debugMode) { - gLogOstream << - "--> extractNumbersFromString: cursor = |" << - *cursor << "|" << - endl; - } - - if (isdigit (*cursor)) { - // consume a decimal number - int n = 0; - while (isdigit (*cursor)) { - n = n * 10 + (*cursor - '0'); - cursor++; - } // while - - // append the number to the list - foundNumbers.push_back (n); - } - else { - cursor++; - } - } // while - } - - return foundNumbers; -} - - -//______________________________________________________________________________ -pair extractNamesPairFromString ( - string theString, // can contain "P1 = Bassoon" - char separator, - bool debugMode) -{ - string name1; - string name2; - - if (debugMode) { - gLogOstream << - "--> extractNamesPairFromString, theString = |" << theString << - "|" << - endl; - } - - if (theString.size ()) { - string::const_iterator - cursor = theString.begin (); - - // fetch name1 - while (1) { - if (cursor == theString.end ()) - break; - - if (debugMode) { - gLogOstream << - "--> extractNamesPairFromString: cursor = |" << - *cursor << "|" << - endl; - } - - if ((*cursor) == separator) { - // found the separator - break; - } - - // append the character to name1 - name1 += *cursor; - cursor++; - } // while - - name1 = trim (name1); - if (! name1.size ()) { - // found an empty name1 - gLogOstream << - "### ERROR: the first name before the " << separator << - " separator is empty in '" << theString << "'" << - endl; - } - - if (cursor == theString.end ()) - gLogOstream << - "### ERROR: the " << separator << - " separator is missing in string '" << - theString << "'" << - endl; - else - // overtake the separator - cursor++; - - // fetch name2 - while (1) { - if (cursor == theString.end ()) - break; - - if (debugMode) { - gLogOstream << - "--> extractNamesPairFromString: cursor = |" << - *cursor << "|" << - endl; - } - - if ((*cursor) == '=') { - // found the separator - gLogOstream << - "### ERROR: the " << separator << - " separator occurs more than once in string '" << - theString << "'" << - endl; - break; - } - - // append the character to name2 - name2 += *cursor; - cursor++; - } // while - - name2 = trim (name2); - if (! name2.size ()) { - // found an empty name2 - gLogOstream << - "### ERROR: the second name after the " << separator << - " separator is empty in '" << theString << "'" << - endl; - } - } - - return make_pair (name1, name2); -} - -//______________________________________________________________________________ -string doubleQuoteStringIfNonAlpha ( - string theString) -{ - string result; - - bool stringShouldBeDoubleQuoted = false; - - if (theString.size ()) { - for ( - string::const_iterator i = theString.begin (); - i != theString.end (); - i++ - ) { - - if ( - ((*i) >= 'a' && (*i) <= 'z') - || - ((*i) >= 'A' && (*i) <= 'Z')) { - // (*i) is a letter - result += (*i); - } - - else { - // (*i) is not a letter - if ((*i) == ' ') - result += ' '; // TEMP JMI - else - result += (*i); - - stringShouldBeDoubleQuoted = true; - } - } // for - } - - if (stringShouldBeDoubleQuoted) { - return "\"" + result + "\""; - } - else { - return result; - } -} - -//______________________________________________________________________________ -string quoteStringIfNonAlpha ( - string theString) -{ - string result; - - bool stringShouldBeQuoted = false; - - if (theString.size ()) { - for ( - string::const_iterator i = theString.begin (); - i != theString.end (); - i++ - ) { - - if ( - ((*i) >= 'a' && (*i) <= 'z') - || - ((*i) >= 'A' && (*i) <= 'Z')) { - // (*i) is a letter - result += (*i); - } - - else { - // (*i) is not a letter - if ((*i) == ' ') - result += ' '; // TEMP JMI - else - result += (*i); - - stringShouldBeQuoted = true; - } - } // for - } - - if (stringShouldBeQuoted) { - return "'" + result + "'"; - } - else { - return result; - } -} - -//______________________________________________________________________________ -string doubleQuoteString ( - string theString) -{ - string result; - - if (theString.size ()) { - for ( - string::const_iterator i = theString.begin (); - i != theString.end (); - i++ - ) { - - if ( - ((*i) >= 'a' && (*i) <= 'z') - || - ((*i) >= 'A' && (*i) <= 'Z')) { - // (*i) is a letter - result += (*i); - } - - else { - // (*i) is not a letter - if ((*i) == ' ') { - result += ' '; // TEMP JMI - } - else if ((*i) == '"') { - result += "\\\""; - } - else { - result += (*i); - } - } - } // for - } - - return "\"" + result + "\""; -} - -//______________________________________________________________________________ -string quoteString ( - string theString) -{ - string result; - - if (theString.size ()) { - for ( - string::const_iterator i = theString.begin (); - i != theString.end (); - i++ - ) { - - if ( - ((*i) >= 'a' && (*i) <= 'z') - || - ((*i) >= 'A' && (*i) <= 'Z')) { - // (*i) is a letter - result += (*i); - } - - else { - // (*i) is not a letter - if ((*i) == ' ') { - result += ' '; // TEMP JMI - } - else if ((*i) == '\'') { - result += "\\\'"; - } - else { - result += (*i); - } - } - } // for - } - - return "'" + result + "'"; -} - -//______________________________________________________________________________ -string booleanAsString (bool value) -{ - return - string ( - value - ? "true" - : "false"); -} - -//______________________________________________________________________________ -string singularOrPlural ( - int number, string singularName, string pluralName) -{ - stringstream s; - - s << - number << ' '; - - if (number <= 1) { - s << - singularName; - } - else { - s << - pluralName; - } - - return s.str (); -} - -string singularOrPluralWithoutNumber ( - int number, string singularName, string pluralName) -{ - stringstream s; - - if (number <= 1) { - s << - singularName; - } - else { - s << - pluralName; - } - - return s.str (); -} - -//______________________________________________________________________________ -void oahWarning (string warningMessage) -{ - gLogOstream << - "*** WARNING in the options and help: " << - warningMessage << - endl; -} - -void oahError (string errorMessage) -{ - gLogOstream << - "### ERROR in the options and help: " << - errorMessage << - endl; - - exit (33); -} - -//______________________________________________________________________________ -string escapeDoubleQuotes (string s) -{ - string result; - - for_each ( - s.begin (), - s.end (), - stringQuoteEscaper (result)); - - // replace occurrences of '\\"' by '\"', - // in case there were already double quotes in string - string - lookedFor = "\\\\\"", - ersatz = "\\\""; - - for ( ; ; ) { - size_t found = result.find (lookedFor); - - if (found == string::npos) - break; - - result.replace (found, lookedFor.size (), ersatz); - } // for - - return result; -} - -//______________________________________________________________________________ -void convertHTMLEntitiesToPlainCharacters (string& s) -{ - map conversionMap; - - conversionMap ["&"] = "&"; - conversionMap ["\""] = """; - conversionMap ["'"] = "'"; - conversionMap ["<"] = "<"; - conversionMap [">"] = ">"; - - map::const_iterator i; - - for (i = conversionMap.begin (); i != conversionMap.end (); ++i) { - string - lookedFor = i->second, - ersatz = i->first; - - // replace all occurrences of lookedFor by ersatz - for ( ; ; ) { - size_t found = s.find (lookedFor); - - if (found == string::npos) - break; - - s.replace (found, lookedFor.size (), ersatz); - } // for - - } // for -} - -//______________________________________________________________________________ -void splitStringIntoChunks ( - std::string theString, - std::string theSeparator, - std::list& chunksList) -{ - //#define DEBUG_SPLITTING - -#ifdef DEBUG_SPLITTING - gLogOstream << - "---> splitting |" << theString << "|" << - endl << - endl; -#endif - - int theStringSize = theString.size (); - - size_t currentPosition = 0; - -#ifdef DEBUG_SPLITTING - string remainder = theString; -#endif - - int theSeparatorSize = theSeparator.size (); - - map::const_iterator i; - - while (1) { - size_t found = - theString.find (theSeparator, currentPosition); - - if (found == string::npos) { - // fetch the last chunk - // we have a last chunk - // from currentPosition to theStringSize - int chunkLength = theStringSize - currentPosition; - - string - chunk = - theString.substr ( - currentPosition, - chunkLength); - - chunksList.push_back ( - chunk); - -#ifdef DEBUG_SPLITTING - gLogOstream << - "theStringSize = " << theStringSize << - endl << - "currentPosition = " << currentPosition << - endl << - "remainder = |" << remainder << "|" << - endl << - "chunkLength = " << chunkLength << - endl << - "chunk = \"" << chunk << "\"" << - endl << - endl; -#endif - - break; - } - - else { - // we have a chunk from currentPosition to found - int chunkLength = found - currentPosition; - - string - chunk = - theString.substr ( - currentPosition, - chunkLength); - - // append it to the chunks list - chunksList.push_back ( - chunk); - - // advance the cursor - currentPosition += - chunkLength + theSeparatorSize; - - // there can be an end of line JMI - if (theString [currentPosition] == '\n') - currentPosition++; - -#ifdef DEBUG_SPLITTING - // set remainder - remainder = - theString.substr ( - currentPosition); - - gLogOstream << - "theStringSize = " << theStringSize << - endl << - "currentPosition = " << currentPosition << - endl << - "remainder = |" << remainder << "|" << - endl << - "found = " << found << - endl << - "chunkLength = " << chunkLength << - endl << - "chunk = \"" << chunk << "\"" << - endl << - endl; -#endif - } - } // while -} - -//______________________________________________________________________________ -void splitRegularStringAtEndOfLines ( - string theString, - list& chunksList) -{ -//#define DEBUG_SPLITTING - -#ifdef DEBUG_SPLITTING - gLogOstream << - "---> splitting |" << theString << "|" << - endl << - endl; -#endif - - splitStringIntoChunks ( - theString, - "\n", - chunksList); - - /* JMI - int theStringSize = theString.size (); - - size_t currentPosition = 0; - -#ifdef DEBUG_SPLITTING - string remainder = theString; -#endif - - string lookedFor = "\n"; - int lookedForSize = lookedFor.size (); - - map::const_iterator i; - - while (1) { - size_t found = - theString.find (lookedFor, currentPosition); - - if (found == string::npos) { - // fetch the last chunk - // we have a last chunk - // from currentPosition to theStringSize - int chunkLength = theStringSize - currentPosition; - - string - chunk = - theString.substr ( - currentPosition, - chunkLength); - - chunksList.push_back ( - chunk); - -#ifdef DEBUG_SPLITTING - gLogOstream << - "theStringSize = " << theStringSize << - endl << - "currentPosition = " << currentPosition << - endl << - "remainder = |" << remainder << "|" << - endl << - "chunkLength = " << chunkLength << - endl << - "chunk = \"" << chunk << "\"" << - endl << - endl; -#endif - - break; - } - - else { - // we have a chunk from currentPosition to found - int chunkLength = found - currentPosition; - - string - chunk = - theString.substr ( - currentPosition, - chunkLength); - - // append it to the chunks list - chunksList.push_back ( - chunk); - - // advance the cursor - currentPosition += - chunkLength + lookedForSize; - - // there can be an end of line JMI - if (theString [currentPosition] == '\n') - currentPosition++; - -#ifdef DEBUG_SPLITTING - // set remainder - remainder = - theString.substr ( - currentPosition); - - gLogOstream << - "theStringSize = " << theStringSize << - endl << - "currentPosition = " << currentPosition << - endl << - "remainder = |" << remainder << "|" << - endl << - "found = " << found << - endl << - "chunkLength = " << chunkLength << - endl << - "chunk = \"" << chunk << "\"" << - endl << - endl; -#endif - } - } // while - */ -} - -//______________________________________________________________________________ -void splitHTMLStringContainingEndOfLines ( - string theString, - list& chunksList) -{ -//#define DEBUG_SPLITTING - -#ifdef DEBUG_SPLITTING - gLogOstream << - "---> splitting |" << theString << "|" << - endl << - endl; -#endif - - int theStringSize = theString.size (); - - map conversionMap; // JMI - - conversionMap ["&"] = "&"; - conversionMap ["\""] = """; - conversionMap ["'"] = "'"; - conversionMap ["<"] = "<"; - conversionMap [">"] = ">"; - - size_t currentPosition = 0; - -#ifdef DEBUG_SPLITTING - string remainder = theString; -#endif - -// JMI string lookedFor = " "; - string lookedFor = "\n"; - int lookedForSize = lookedFor.size (); - - map::const_iterator i; - -/* - for (i = conversionMap.begin (); i != conversionMap.end (); ++i) { - string - lookedFor = i->second, - ersatz = i->first; - // replace all occurrences of lookedFor by ersatz - } // for -*/ - - while (1) { - size_t found = - theString.find (lookedFor, currentPosition); - - if (found == string::npos) { - // fetch the last chunk - // we have a last chunk - // from currentPosition to theStringSize - int chunkLength = theStringSize - currentPosition; - - string - chunk = - theString.substr ( - currentPosition, - chunkLength); - - chunksList.push_back ( - chunk); - -#ifdef DEBUG_SPLITTING - gLogOstream << - "theStringSize = " << theStringSize << - endl << - "currentPosition = " << currentPosition << - endl << - "remainder = |" << remainder << "|" << - endl << - "chunkLength = " << chunkLength << - endl << - "chunk = \"" << chunk << "\"" << - endl << - endl; -#endif - - break; - } - - else { - // we have a chunk from currentPosition to found - int chunkLength = found - currentPosition; - - string - chunk = - theString.substr ( - currentPosition, - chunkLength); - - // append it to the chunks list - chunksList.push_back ( - chunk); - - // advance the cursor - currentPosition += - chunkLength + lookedForSize; - - // there can be an end of line JMI - if (theString [currentPosition] == '\n') - currentPosition++; - -#ifdef DEBUG_SPLITTING - // set remainder - remainder = - theString.substr ( - currentPosition); - - gLogOstream << - "theStringSize = " << theStringSize << - endl << - "currentPosition = " << currentPosition << - endl << - "remainder = |" << remainder << "|" << - endl << - "found = " << found << - endl << - "chunkLength = " << chunkLength << - endl << - "chunk = \"" << chunk << "\"" << - endl << - endl; -#endif - } - } // while -} - -//______________________________________________________________________________ -string baseName (const string &filename) -{ - if (! filename.size ()) { - return {}; - } - - auto len = filename.length (); - auto index = filename.find_last_of ("/\\"); - - if (index == string::npos) { - return filename; - } - - if (index + 1 >= len) { - len--; - index = filename.substr (0, len).find_last_of ("/\\"); - - if (len == 0) { - return filename; - } - - if (index == 0) { - return filename.substr (1, len - 1); - } - - if (index == string::npos) { - return filename.substr (0, len); - } - - return filename.substr (index + 1, len - index - 1); - } - - return filename.substr (index + 1, len - index); -} - -//______________________________________________________________________________ -string makeSingleWordFromString (const string& theString) -{ - string result; - - if (theString.size ()) { - for ( - string::const_iterator i = theString.begin (); - i != theString.end (); - i++ - ) { - if (isalnum (*i)) { - result.push_back ((*i)); - } - } // for - } - - return result; -} - - -} - -/* JMI -//______________________________________________________________________________ -class EXP segmentedLinesOstream -{ -/ * JMI NOT DONE - // in order to avoid spaces at the end of a line, - // an end of segment causes a space to be output later, - // by the next '<<' operator - --- -* -Reference for this class: - https://stackoverflow.com/questions/2212776/overload-handling-of-stdendl - -Usage: - segmentedLinesOstream myStream (std::cout); - - myStream << - 1 << 2 << 3 << std::endl << - 5 << 6 << std::endl << - 7 << 8 << std::endl; -* / - - private: - // segmentedLinesOstream just uses an indentedOstream - indentedOstream& fIndentedOstream; - - // an end of segment causes a space to be output by the next '<<' operator - bool fAtEndOfSegment; - - public: - - // constructor - segmentedLinesOstream ( - indentedOstream& indentedOstream) - : fIndentedOstream (indentedOstream) - { fAtEndOfSegment = false; } - - // destructor - virtual ~segmentedLinesOstream () - {}; - - // flush - void flush () - { fIndentedOstream.flush (); } - - // set and get - indentedOstream& getIndentedOstream () - { return fIndentedOstream; } - - // indentation - indenter& getIndenter () - { return fIndentedOstream.getIndenter (); } - - void incrIdentation () - { fIndentedOstream.incrIdentation (); } - - void decrIdentation () - { fIndentedOstream.decrIdentation (); } - - // segments - void setAtEndOfSegment (bool value) - { fAtEndOfSegment = value; } - bool getAtEndOfSegment () - { return fAtEndOfSegment; } -}; - -// '<<' operators to implement segments -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, char ch); -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, int i); -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, unsigned int i); -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, float f); -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, const std::string& str); -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, char * str); - -// the manipulators -segmentedLinesOstream& endline (segmentedLinesOstream& os); -segmentedLinesOstream& endseg (segmentedLinesOstream& os); -*/ - - -/* JMI - segmentedLinesOstream - testSegmentedLinesOstream (fLogOutputStream); - - fLogOutputStream << - "getAtEndOfSegment: " << - booleanAsString ( - testSegmentedLinesOstream.getAtEndOfSegment ()) << - endl; - - testSegmentedLinesOstream.setAtEndOfSegment (true); - - fLogOutputStream << - "getAtEndOfSegment: " << - booleanAsString ( - testSegmentedLinesOstream.getAtEndOfSegment ()) << - endl; - - testSegmentedLinesOstream << - "FOO" << endl; // << - // endline; - - testSegmentedLinesOstream.getIndentedOstream () << flush; - */ - - -/* JMI -//______________________________________________________________________________ -// the manipulators -segmentedLinesOstream& endline (segmentedLinesOstream& os) -{ - if (! os.getAtEndOfSegment ()) { - // don't output multiple spaces after a segment - os.setAtEndOfSegment (true); - } - - os.getIndentedOstream () << endl; - - return os; -} - -segmentedLinesOstream& endseg (segmentedLinesOstream& os) -{ - if (! os.getAtEndOfSegment ()) { - // don't output multiple spaces after a segment - os.setAtEndOfSegment (true); - } - - return os; -} - -// '<<' operators to implement segments -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, char ch) -{ - if (os.getAtEndOfSegment ()) { - os << ' '; - os.setAtEndOfSegment (false); - } - - os.getIndentedOstream () << ch; - - return os; -} - -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, int i) -{ - if (os.getAtEndOfSegment ()) { - os << ' '; - os.setAtEndOfSegment (false); - } - - os.getIndentedOstream () << i; - - return os; -} - -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, unsigned int i) -{ - if (os.getAtEndOfSegment ()) { - os << ' '; - os.setAtEndOfSegment (false); - } - - os.getIndentedOstream () << i; - - return os; -} - -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, float f) -{ - if (os.getAtEndOfSegment ()) { - os << ' '; - os.setAtEndOfSegment (false); - } - - os.getIndentedOstream () << f; - - return os; -} - -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, const string& str) -{ - if (os.getAtEndOfSegment ()) { - os << ' '; - os.setAtEndOfSegment (false); - } - - os.getIndentedOstream () << str; - - return os; -} - -EXP segmentedLinesOstream& operator<< (segmentedLinesOstream& os, char * str) -{ - if (os.getAtEndOfSegment ()) { - os << ' '; - os.setAtEndOfSegment (false); - } - - os.getIndentedOstream () << str; - - return os; -} -*/ - diff --git a/src/lilypond/utilities.h b/src/lilypond/utilities.h deleted file mode 100644 index dcb18fce9..000000000 --- a/src/lilypond/utilities.h +++ /dev/null @@ -1,490 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___utilities___ -#define ___utilities___ - -#include -#include - -#include -#include - -#include - -#include -#include - -#include -#include - -#include - -/* JMI -#ifdef WIN32 - // JMI -#else - #include -#endif -*/ - -#include "smartpointer.h" -#include "basevisitor.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class EXP timingItem : public smartable -{ - public: - enum timingItemKind { kMandatory, kOptional }; - - static SMARTP createTimingItem ( - std::string activity, - std::string description, - timingItemKind kind, - std::clock_t startClock, - std::clock_t endClock); - - timingItem ( - std::string activity, - std::string description, - timingItemKind kind, - std::clock_t startClock, - std::clock_t endClock); - - std::string fActivity; - std::string fDescription; - timingItemKind fKind; - clock_t fStartClock; - clock_t fEndClock; -}; - -typedef SMARTP S_timingItem; - -class EXP timing { - public: - timing (); - virtual ~timing (); - - // global variable for general use - static timing gTiming; - - // add an item - void appendTimingItem ( - std::string activity, - std::string description, - timingItem::timingItemKind - kind, - clock_t startClock, - clock_t endClock); - - // print - void print (std::ostream& os) const; - - private: - - std::list - fTimingItemsList; -}; -EXP std::ostream& operator<< (std::ostream& os, const timing& tim); - -//______________________________________________________________________________ -class EXP indenter -{ - public: - - indenter (std::string spacer = " "); - virtual ~indenter (); - - // get the indent - int getIndent () const - { return fIndent; } - - // increase the indentation by 1 - indenter& operator++ (const int value); - - // decrease the indentation by 1 - indenter& operator-- (const int value); - - indenter& increment (int value); - indenter& decrement (int value); - - // reset the indentation - void resetToZero () - { fIndent = 0; } - - // check indentation value - bool operator == (const int &value) const - { return fIndent == value; } - bool operator != (const int &value) const - { return fIndent != value; } - - // output as much space as specified - void print (std::ostream& os) const; - - // get a spacer for adhoc uses, without increasing the indentation - std::string getSpacer () const - { return fSpacer; } - - // indent a multiline 'R"(...)"' std::string - std::string indentMultiLineString (std::string value); - - // global variable for general use - static indenter gIndenter; - - private: - int fIndent; - std::string fSpacer; -}; - -EXP std::ostream& operator<< (std::ostream& os, const indenter& idtr); - -// useful shortcut macros -#define gIndenter indenter::gIndenter -#define gTab indenter::gIndenter.getSpacer () - -//______________________________________________________________________________ -// a stream buffer that prefixes each line -// with the current indentation, i.e. spaces - -/* -std::endl declaration: - - std::endl for ostream - ostream& endl (ostream& os); - - basic template - template - basic_ostream& endl (basic_ostream& os); - - Insert newline and flush - Inserts a new-line character and flushes the stream. - - Its behavior is equivalent to calling os.put('\n') (or os.put(os.widen('\n')) for character types other than char), and then os.flush(). - --- - -Reference for this class: - https://stackoverflow.com/questions/2212776/overload-handling-of-stdendl -*/ - -class indentedStreamBuf: public std::stringbuf -{ - private: - - std::ostream& fOutputSteam; - indenter& fIndenter; - - public: - - // constructor - indentedStreamBuf ( - std::ostream& outputStream, - indenter& idtr) - : fOutputSteam (outputStream), - fIndenter (idtr) - {} - - // indentation - indenter& getIndenter () - { return fIndenter; } - - // flush - void flush () - { fOutputSteam.flush (); } - - virtual int sync (); -}; - -//______________________________________________________________________________ -class EXP indentedOstream: public std::ostream -{ -/* -Reference for this class: - https://stackoverflow.com/questions/2212776/overload-handling-of-stdendl - -Usage: - indentedOstream myStream (std::cout); - - myStream << - 1 << 2 << 3 << std::endl << - 5 << 6 << std::endl << - 7 << 8 << std::endl; -*/ - - private: - // indentedOstream just uses an indentedStreamBuf - indentedStreamBuf fIndentedStreamBuf; - - public: - - // constructor - indentedOstream ( - std::ostream& str, - indenter& idtr) - : std::ostream (&fIndentedStreamBuf), - fIndentedStreamBuf (str, idtr) - {} - - // destructor - virtual ~indentedOstream () - {}; - - // flush - void flush () - { fIndentedStreamBuf.flush (); } - - // indentation - indenter& getIndenter () - { return fIndentedStreamBuf.getIndenter (); } - - void incrIdentation () - { fIndentedStreamBuf.getIndenter ()++; } - - void decrIdentation () - { fIndentedStreamBuf.getIndenter ()--; } - - // global variables for general use - static indentedOstream - gOutputIndentedOstream; - static indentedOstream - gLogIndentedOstream; - static indentedOstream - gNullIndentedOstream; -}; - -// useful shortcut macros -#define gOutputOstream indentedOstream::gOutputIndentedOstream -#define gLogOstream indentedOstream::gLogIndentedOstream -#define gNullOstream indentedOstream::gNullIndentedOstream - -//______________________________________________________________________________ -struct stringQuoteEscaper -{ - /* usage: - string dest = ""; - for_each( source.begin (), source.end (), stringQuoteEscaper (dest)); - */ - - std::string& target; - - explicit stringQuoteEscaper (std::string& t) - : target (t) - {} - - void operator() (char ch) const - { - if( ch == '"') { - // or switch on any character that - // needs escaping like '\' itself - target.push_back ('\\'); - } - target.push_back (ch); - } -}; - -//______________________________________________________________________________ -struct stringSpaceRemover -{ - /* usage: - std::string dest = ""; - for_each ( - source.begin (), - source.end (), - stringSpaceRemover (dest)); - */ - - std::string& target; - - explicit stringSpaceRemover (std::string& t) - : target (t) - {} - - void operator() (char ch) const - { - if (ch != ' ') { - target.push_back (ch); - } - } -}; - -//______________________________________________________________________________ -struct stringSpaceReplacer -{ - /* usage: - std::string dest = ""; - for_each ( - source.begin (), - source.end (), - stringSpaceReplacer (dest, ersatz)); - */ - - std::string& target; - char ersatz; - - explicit stringSpaceReplacer (std::string& t, char ch) - : target (t), ersatz (ch) - {} - - void operator() (char ch) const - { - if (ch == ' ') - target.push_back (ersatz); - else - target.push_back (ch); - } -}; - -//______________________________________________________________________________ -std::string replicateString ( - std::string str, - int times); - -//______________________________________________________________________________ -std::string replaceSubstringInString ( - std::string str, - std::string subString, - std::string ersatz); - -//______________________________________________________________________________ -std::string int2EnglishWord (int n); - -//______________________________________________________________________________ -std::string stringNumbersToEnglishWords (std::string str); - -//______________________________________________________________________________ -std::set decipherNaturalNumbersSetSpecification ( - std::string theSpecification, - bool debugMode = false); - -//______________________________________________________________________________ -std::set decipherStringsSetSpecification ( - std::string theSpecification, - bool debugMode = false); - -//______________________________________________________________________________ -std::list extractNumbersFromString ( - std::string theString, // can contain "1, 2, 17" - bool debugMode = false); - -//______________________________________________________________________________ -// from http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring -// trim string from start -inline std::string <rim (std::string &s) { - std::function - checkSpace = - [] (int x) { return isspace (x); }; - - s.erase ( - s.begin (), - find_if ( - s.begin (), - s.end (), - std::not1 (checkSpace) - ) - ); - - return s; -} - -// trim string from end -inline std::string &rtrim (std::string &s) { - std::function - checkSpace = - [] (int x) { return isspace (x); }; - - s.erase ( - find_if ( - s.rbegin (), - s.rend (), - std::not1 (checkSpace) - ).base(), - s.end () - ); - - return s; -} - -// trim string from both ends -inline std::string &trim (std::string &s) { - return ltrim (rtrim (s)); -} - -//______________________________________________________________________________ -std::pair extractNamesPairFromString ( - std::string theString, // may contain "P1 = Bassoon" - char separator, - bool debugMode = false); - -//______________________________________________________________________________ -std::string doubleQuoteStringIfNonAlpha ( - std::string theString); - -std::string quoteStringIfNonAlpha ( - std::string theString); - -std::string doubleQuoteString ( - std::string theString); - -std::string quoteString ( - std::string theString); - -//______________________________________________________________________________ -std::string booleanAsString (bool value); - -//______________________________________________________________________________ -std::string singularOrPlural ( - int number, std::string singularName, std::string pluralName); - -std::string singularOrPluralWithoutNumber ( - int number, std::string singularName, std::string pluralName); - -//______________________________________________________________________________ -void oahWarning (std::string warningMessage); - -void oahError (std::string errorMessage); - -//______________________________________________________________________________ -std::string escapeDoubleQuotes (std::string s); - -//______________________________________________________________________________ -void convertHTMLEntitiesToPlainCharacters (std::string& s); - -//______________________________________________________________________________ -void splitStringIntoChunks ( - std::string theString, - std::string theSeparator, - std::list& chunksList); - -void splitRegularStringAtEndOfLines ( - std::string theString, - std::list& chunksList); - -void splitHTMLStringContainingEndOfLines ( // JMI - std::string theString, - std::list& chunksList); - -//______________________________________________________________________________ -std::string baseName (const std::string &filename); - // wait until c++17 for a standard library containing basename()... - -//______________________________________________________________________________ -std::string makeSingleWordFromString (const std::string& theString); - - -} // namespace MusicXML2 - - -#endif diff --git a/src/lilypond/version.cpp b/src/lilypond/version.cpp deleted file mode 100644 index 9efa4747b..000000000 --- a/src/lilypond/version.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // setw, setprecision, ... - -#include "version.h" - -#include "utilities.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -list gVersionInfoList; - -versionInfo::versionInfo ( - string versionNumber, - string versionDate, - string versionDescription) -{ - fVersionNumber = versionNumber; - fVersionDate = versionDate; - fVersionDescription = versionDescription; -} - -versionInfo::~versionInfo () -{} - -void versionInfo::print (ostream& os) const -{ - os << left << - indenter::gIndenter << - setw (7) << fVersionNumber << " " << - "(" << fVersionDate << "):" << - endl << - - indenter::gIndenter++; - - os << - indenter::gIndenter << - fVersionDescription; - - indenter::gIndenter--; - - os << endl; -} - -void enlistVersion ( - string versionNumber, - string versionDate, - string versionDescription) -{ - gVersionInfoList.push_front ( - versionInfo ( - versionNumber, - versionDate, - versionDescription)); -} - -void printVersionsHistory (ostream& os) -{ - os << - "Versions history:" << - endl; - - indenter::gIndenter++; - - list::const_iterator - iBegin = gVersionInfoList.begin (), - iEnd = gVersionInfoList.end (), - i = iBegin; - for ( ; ; ) { - (*i).print (os); - if (++i == iEnd) break; - // JMI os << endl; - } // for - - indenter::gIndenter--; -} - -string currentVersionNumber () -{ - return - gVersionInfoList.front ().fVersionNumber; -} - - -} diff --git a/src/lilypond/version.h b/src/lilypond/version.h deleted file mode 100644 index 975f43863..000000000 --- a/src/lilypond/version.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___version___ -#define ___version___ - -#include -#include - -#include "exports.h" - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class EXP versionInfo -{ - public: - - versionInfo ( - std::string versionNumber, - std::string versionDate, - std::string versionDescription); - - virtual ~versionInfo (); - - void print (std::ostream& os) const; - - public: - - std::string fVersionNumber; - std::string fVersionDate; - std::string fVersionDescription; -}; - -extern std::list gVersionInfoList; - -void enlistVersion ( - std::string versionNumber, - std::string versionDate, - std::string versionDescription); - -void printVersionsHistory (std::ostream& os); - -std::string EXP currentVersionNumber (); - - -} - - -#endif diff --git a/src/lilypond/xml2brlManPageOah.cpp b/src/lilypond/xml2brlManPageOah.cpp deleted file mode 100644 index 25f2f0325..000000000 --- a/src/lilypond/xml2brlManPageOah.cpp +++ /dev/null @@ -1,475 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // setw, setprecision, ... - -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" - -#include "xml2brlManPageOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_xml2brlManPageGenerateAtom xml2brlManPageGenerateAtom::create ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor) -{ - xml2brlManPageGenerateAtom* o = new - xml2brlManPageGenerateAtom ( - shortName, - longName, - description, - theOahVisitor); - assert(o!=0); - return o; -} - -xml2brlManPageGenerateAtom::xml2brlManPageGenerateAtom ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor) - : oahAtom ( - shortName, - longName, - description) -{ - fOahVisitor = theOahVisitor; -} - -xml2brlManPageGenerateAtom::~xml2brlManPageGenerateAtom () -{} - -S_oahValuedAtom xml2brlManPageGenerateAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2brlManPageGenerateAtom" << - endl; - } -#endif - - // handle it at once - generateManPageData (os); - - // no option value is needed - return nullptr; -} - -void xml2brlManPageGenerateAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlManPageGenerateAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlManPageGenerateAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlManPageGenerateAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2brlManPageGenerateAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlManPageGenerateAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlManPageGenerateAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlManPageGenerateAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2brlManPageGenerateAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlManPageGenerateAtom::browseData ()" << - endl; - } -#endif -} - -void xml2brlManPageGenerateAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2brlManPageGenerateAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2brlManPageGenerateAtom::generateManPageData (ostream& os) const -{ - // generate the man page from the OAH handler - fOahVisitor->visitTheHandler (); - - // register 'generate man page' action in options groups's options handler upLink - S_oahHandler - handler = - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink (); - - handler-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2brlManPageGenerateAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2brlManPageGenerateAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_xml2brlManPageOah gxml2brlManPageOah; -S_xml2brlManPageOah gxml2brlManPageOahUserChoices; -S_xml2brlManPageOah gxml2brlManPageOahWithDetailedTrace; - -S_xml2brlManPageOah xml2brlManPageOah::create ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator) -{ - xml2brlManPageOah* o = new xml2brlManPageOah ( - handlerUpLink, - theOah2ManPageGenerator); - assert(o!=0); - return o; -} - -xml2brlManPageOah::xml2brlManPageOah ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator) - : oahGroup ( - "Man page", - "hmp", "help-man-page", -R"(These options control the way the man page is generated.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this man page group to the OAH handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeXml2brlManPageOah ( - false, - theOah2ManPageGenerator); -} - -xml2brlManPageOah::~xml2brlManPageOah () -{} - -void xml2brlManPageOah::initializeManPageGenerateOptions ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Generate", - "hgmp", "help-generate-man-page", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - -/* JMI - // OAH - - fDisplayOah = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "doah", "display-oah", -R"(Write the contents of the OAH data to standard error.)", - "displayOah", - fDisplayOah)); -*/ - - // generate man page - fOah2ManPageGenerator = theOah2ManPageGenerator; - - subGroup-> - appendAtomToSubGroup ( - xml2brlManPageGenerateAtom::create ( - "gmp", "generate-man-page", -R"(Write man page data to standard output.)", - fOah2ManPageGenerator)); -} - -#ifdef TRACE_OAH -void xml2brlManPageOah::initializeManPageTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Trace", - "hmpt", "help-man-page-trace", -R"( Note: the options in this group imply '-tmp, -trace-man-page'.)", -// JMI kElementVisibilityHiddenByDefault, - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // JMI ??? -} -#endif - -void xml2brlManPageOah::initializeXml2brlManPageOah ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator) -{ - // display - // -------------------------------------- - initializeManPageGenerateOptions ( - boolOptionsInitialValue, - theOah2ManPageGenerator); - -#ifdef TRACE_OAH - // trace - // -------------------------------------- - initializeManPageTraceOah ( - boolOptionsInitialValue); -#endif -} - -S_xml2brlManPageOah xml2brlManPageOah::createCloneWithDetailedTrace () -{ - S_xml2brlManPageOah - clone = - xml2brlManPageOah::create ( - 0, // 0 not to have it inserted twice in the option handler - fOah2ManPageGenerator); - - // set the OAH handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - -/* JMI - // display - // -------------------------------------- - - clone->fDisplayOah = - true; -*/ - - return clone; -} - -//______________________________________________________________________________ -void xml2brlManPageOah::enforceQuietness () -{ -// JMI fDisplayOah = false; -} - -//______________________________________________________________________________ -void xml2brlManPageOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void xml2brlManPageOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlManPageOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlManPageOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlManPageOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2brlManPageOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlManPageOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlManPageOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlManPageOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2brlManPageOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlManPageOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void xml2brlManPageOah::printManPageOahValues (int fieldWidth) -{ - gLogOstream << - "The OAH options are:" << - endl; - - gIndenter++; - - // JMI ??? - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_xml2brlManPageOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeXml2brlManPageOahHandling ( - S_oahHandler handler, - S_oahVisitor theOah2ManPageGenerator) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing man page options handling" << - endl; - } -#endif - - // create the bsr variables - // ------------------------------------------------------ - - gxml2brlManPageOahUserChoices = xml2brlManPageOah::create ( - handler, - theOah2ManPageGenerator); - assert(gxml2brlManPageOahUserChoices != 0); - - gxml2brlManPageOah = - gxml2brlManPageOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ -/* JMI - gxml2brlManPageOahWithDetailedTrace = - gxml2brlManPageOah-> - createCloneWithDetailedTrace (); - */ -} - - -} diff --git a/src/lilypond/xml2brlManPageOah.h b/src/lilypond/xml2brlManPageOah.h deleted file mode 100644 index b1d6590ae..000000000 --- a/src/lilypond/xml2brlManPageOah.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2brlManPageOah___ -#define ___xml2brlManPageOah___ - -#include "xml2brlOah2ManPageGenerator.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class xml2brlManPageGenerateAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlManPageGenerateAtom ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor); - - virtual ~xml2brlManPageGenerateAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // public services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // private services - // ------------------------------------------------------ - - void generateManPageData (ostream& os) const; - - private: - - // fields - // -------------------------------------- - - S_oahVisitor fOahVisitor; -}; -typedef SMARTP S_xml2brlManPageGenerateAtom; -EXP ostream& operator<< (ostream& os, const S_xml2brlManPageGenerateAtom& elt); - -//______________________________________________________________________________ -class xml2brlManPageOah : public oahGroup -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator); - - SMARTP createCloneWithDetailedTrace (); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeXml2brlManPageOah ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlManPageOah ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator); - - virtual ~xml2brlManPageOah (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - void initializeManPageGenerateOptions ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator); - -#ifdef TRACE_OAH - void initializeManPageTraceOah ( - bool boolOptionsInitialValue); -#endif - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printManPageOahelp (); - - void printManPageOahValues (int fieldWidth); - - private: - - // fields - // -------------------------------------- - - S_oahVisitor - fOah2ManPageGenerator; -}; -typedef SMARTP S_xml2brlManPageOah; -EXP ostream& operator<< (ostream& os, const S_xml2brlManPageOah& elt); - -EXP extern S_xml2brlManPageOah gxml2brlManPageOah; -EXP extern S_xml2brlManPageOah gxml2brlManPageOahUserChoices; -EXP extern S_xml2brlManPageOah gxml2brlManPageOahWithDetailedTrace; - -//______________________________________________________________________________ -EXP void initializeXml2brlManPageOahHandling ( - S_oahHandler handler, - S_oahVisitor theOah2ManPageGenerator); - - -} - - -#endif diff --git a/src/lilypond/xml2brlOah.cpp b/src/lilypond/xml2brlOah.cpp deleted file mode 100644 index 71adb6dba..000000000 --- a/src/lilypond/xml2brlOah.cpp +++ /dev/null @@ -1,869 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "setTraceOahIfDesired.h" -#include "traceOah.h" - -#include "libmusicxml.h" - -#include "msr.h" -#include "bsr.h" - -#include "oahOah.h" - -#include "generalOah.h" -#include "musicXMLOah.h" -#include "msrOah.h" -#include "bsrOah.h" -#include "brailleOah.h" - -#include "version.h" - -#include "xml2brlManPageOah.h" - -#include "xml2brlOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_xml2brlOahHandler xml2brlOahHandler::create ( - string executableName, - indentedOstream& ios) -{ - xml2brlOahHandler* o = new - xml2brlOahHandler ( - executableName, - ios); - assert(o!=0); - return o; -} - -xml2brlOahHandler::xml2brlOahHandler ( - string executableName, - indentedOstream& ios) - : oahHandler ( - executableName + " available options", - "Options values", - "h", "help", - "hs", "helpSummary", -R"( Welcome to xml2brl, - the MusicXML to Braille music translator - delivered as part of the libmusicxml2 library. - https://github.com/grame-cncm/libmusicxml/tree/lilypond -)", -R"( -xml2brl [options] [MusicXMLFile|-] [options] -)", -R"( -Options can be written with '-' or '--' at will, - even though the help information below is presented with '-'. -Option '-h, -help' prints the full help, - while '-hs, -helpSummary' only prints a help summary.)", - ios) -{ - // append the help options prefixes - S_oahPrefix - helpPrefix = - oahPrefix::create ( - "help", - "help-", - "'-help=abc,yz' is equivalent to '-help-abc, -help-yz'"); - appendPrefixToHandler (helpPrefix); - - S_oahPrefix - hPrefix = - oahPrefix::create ( - "h", - "h", - "'-h=abc,wxyz' is equivalent to '-habc, -hwxyz'"); - appendPrefixToHandler (hPrefix); - - // append the trace options prefixes - S_oahPrefix - tracePrefix = - oahPrefix::create ( - "trace", - "trace-", - "'-trace=abc,yz' is equivalent to '-trace-abc, -trace-yz'"); - appendPrefixToHandler (tracePrefix); - - S_oahPrefix - tPrefix = - oahPrefix::create ( - "t", - "t", - "'-t=abc,wxyz' is equivalent to '-tabc, -twxyz'"); - appendPrefixToHandler (tPrefix); - - // create an xml2lyOah2ManPageGenerator - S_xml2brlOah2ManPageGenerator - generator = - xml2brlOah2ManPageGenerator::create ( - this, - gLogOstream, - gOutputOstream); - - // initialize the handler only now, since it may use prefixes - initializeXml2brlOptionsHandler ( - executableName, - generator); -} - -xml2brlOahHandler::~xml2brlOahHandler () -{} - -void xml2brlOahHandler::initializeXml2brlOptionsHandler ( - string executableName, - S_xml2brlOah2ManPageGenerator - theOah2ManPageGenerator) -{ - // initialize options handling, phase 1 - // ------------------------------------------------------ - -#ifdef TRACE_OAH - initializeTraceOahHandling ( - this); -#endif - - initializeOahOahHandling ( - executableName, - this); - - initializeGeneralOahHandling ( - this); - - // initialize the library - // ------------------------------------------------------ - - initializeMSR (); - initializeBSR (); - - // initialize options handling, phase 2 - // ------------------------------------------------------ - - initializeMusicXMLOahHandling ( - this); - - initializeMsrOahHandling ( - this); - - initializeBsrOahHandling ( - this); - - initializeBrailleOahHandling ( - this); - -#ifdef EXTRA_OAH - initializeExtraOahHandling ( - this); -#endif - - initializeXml2brlManPageOahHandling ( - this, - theOah2ManPageGenerator); - - initializeXml2brlOah ( - this); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - // print the options handler initial state - fHandlerLogOstream << - "xml2brlOahHandler has been initialized as:" << - endl; - - gIndenter++; - - print ( - fHandlerLogOstream); - fHandlerLogOstream << - endl << - endl; - - gIndenter--; - } -#endif - - // register options handler in itself, - // so that the 'global' help options can be handled - this-> - registerHandlerInItself (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - fHandlerLogOstream << - "xml2brlOahHandler help:" << - endl; - - this-> - printHelp ( - fHandlerLogOstream); - } -#endif -} - -void xml2brlOahHandler::checkOptionsAndArguments () -{ - unsigned int argumentsNumber = - fHandlerArgumentsVector.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - if (argumentsNumber > 0) { - fHandlerLogOstream << - singularOrPluralWithoutNumber ( - argumentsNumber, "There is", "There are") << - " " << - argumentsNumber << - " " << - singularOrPluralWithoutNumber ( - argumentsNumber, "argument", "arguments") << - ":" << - endl; - - gIndenter++; - - for (unsigned int i = 0; i < argumentsNumber; i++) { - fHandlerLogOstream << - i << " : " << fHandlerArgumentsVector [i] << - endl; - } // for - - fHandlerLogOstream << endl; - - gIndenter--; - } - else { - fHandlerLogOstream << - "There are no arguments to " << - gOahOah->fHandlerExecutableName << - endl; - } - } -#endif - - // input source name - // ------------------------------------------------------ - - switch (argumentsNumber) { - case 0: - fHandlerLogOstream << - endl << - "Input file name or '-' for standard input expected" << - endl << - endl; - - exit (1); - break; - - case 1: - // register intput file name - gOahOah->fInputSourceName = - fHandlerArgumentsVector [0]; - break; - - default: - fHandlerLogOstream << - endl << - "Several input file name supplied, only the first one, \"" << - fHandlerArgumentsVector [0] << - "\", will be translated" << - endl << - endl; - - // register intput file name - gOahOah->fInputSourceName = - fHandlerArgumentsVector [0]; - break; - } // switch - - // build potential output file name - // ------------------------------------------------------ - - string potentialOutputFileName; - - if (gOahOah->fInputSourceName != "-") { - // determine potential output file name, - // may be set differently by '--ofn, --outputFileName' option - potentialOutputFileName = - baseName ( - gOahOah->fInputSourceName); - - size_t - posInString = - potentialOutputFileName.rfind ('.'); - - // remove file extension - if (posInString != string::npos) { - potentialOutputFileName.replace ( - posInString, - potentialOutputFileName.size () - posInString, - ""); - } - - // should encoding be used by the file name? - if (! gBrailleOah->fDontUseEncodingInFileName) { - switch (gBrailleOah->fBrailleOutputKind) { - case kBrailleOutputAscii: - potentialOutputFileName += "_ASCII"; - break; - - case kBrailleOutputUTF8: - potentialOutputFileName += "_UTF8"; - /* JMI - switch (gBrailleOah->fByteOrderingKind) { - case kByteOrderingNone: - break; - case kByteOrderingBigEndian: - potentialOutputFileName += "_BE"; - break; - case kByteOrderingSmallEndian: - // should not occur JMI - break; - } // switch - */ - break; - - case kBrailleOutputUTF16: - potentialOutputFileName += "_UTF16"; - /* JMI - switch (gBrailleOah->fByteOrderingKind) { - case kByteOrderingNone: - break; - - case kByteOrderingBigEndian: - potentialOutputFileName += "_BE"; - break; - - case kByteOrderingSmallEndian: - potentialOutputFileName += "_SE"; - break; - } // switch - */ - break; - } // switch - } - - // append the file extension - switch (gBrailleOah->fBrailleOutputKind) { - case kBrailleOutputAscii: - potentialOutputFileName += ".brf"; - break; - - case kBrailleOutputUTF8: - case kBrailleOutputUTF16: - potentialOutputFileName += ".txt"; - break; - } // switch - } - - // check auto output file option usage - // ------------------------------------------------------ - - if (gXml2brlOah->fAutoOutputFile) { - if (gXml2brlOah->fOutputFileName.size ()) { - stringstream s; - - s << - "options '-aofn, -auto-output-file-name' and '-o, -output-file-name'" << - endl << - "cannot be chosen simultaneously"; - - oahError (s.str ()); - } - - else if (gOahOah->fInputSourceName == "-") { - stringstream s; - - s << - "option '-aofn, -auto-output-file-name'" << - endl << - "cannot be used when reading from standard input"; - - oahError (s.str ()); - } - - else { - gXml2brlOah->fOutputFileName = - potentialOutputFileName; - } - } - - // register command line informations in gGeneralOah - // ------------------------------------------------------ - -/* JMI - gGeneralOah->fCommandLineWithShortOptions = - fCommandLineWithShortOptions; - gGeneralOah->fCommandLineWithLongOptions = - fCommandLineWithLongOptions; - */ -} - -//______________________________________________________________________________ -void xml2brlOahHandler::enforceOahHandlerQuietness () -{ -#ifdef TRACE_OAH - gGeneralOah-> - enforceQuietness (); -#endif - - gGeneralOah-> - enforceQuietness (); - - gMusicXMLOah-> - enforceQuietness (); - - gMsrOah-> - enforceQuietness (); - - gBsrOah-> - enforceQuietness (); - - gBrailleOah-> - enforceQuietness (); - -#ifdef EXTRA_OAH - gExtraOah-> - enforceQuietness (); -#endif - - gXml2brlOah-> - enforceQuietness (); -} - -//______________________________________________________________________________ -void xml2brlOah::enforceQuietness () -{} - -//______________________________________________________________________________ -void xml2brlOah::checkOptionsConsistency () -{} - -//______________________________________________________________________________ -void xml2brlOahHandler::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlOahHandler::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlOahHandler elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlOahHandler::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2brlOahHandler::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlOahHandler::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlOahHandler elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlOahHandler::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2brlOahHandler::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlOahHandler::browseData ()" << - endl; - } -#endif - -// oahGroup::browseData (v); - oahHandler::browseData (v); - -} - -//______________________________________________________________________________ -void xml2brlOahHandler::print (ostream& os) const -{ - const int fieldWidth = 27; - - os << - "xml2brlOahHandler:" << - endl; - - gIndenter++; - - os << left << - setw (fieldWidth) << - "fShortName" << " : " << fShortName << - endl << - setw (fieldWidth) << - "fLongName" << " : " << fLongName << - endl << - setw (fieldWidth) << - "fDescription" << " : " << fDescription << - endl << - endl; - - os << - "Options groups (" << - singularOrPlural ( - fHandlerGroupsList.size (), "element", "elements") << - "):" << - endl; - - if (fHandlerGroupsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fHandlerGroupsList.begin (), - iEnd = fHandlerGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the element - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; - - os << endl; -} - -ostream& operator<< (ostream& os, const S_xml2brlOahHandler& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_xml2brlOah gXml2brlOah; - -S_xml2brlOah xml2brlOah::create ( - S_oahHandler handlerUpLink) -{ - xml2brlOah* o = new xml2brlOah ( - handlerUpLink); - assert(o!=0); - - return o; -} - -xml2brlOah::xml2brlOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "xml2brl", - "hxb", "help-xml2brl", -R"(Options that are used by xml2brl are grouped here.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this options group to the options handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - prependGroupToHandler (this); - } - - // initialize it - initializeXml2brlOah (); -} - -xml2brlOah::~xml2brlOah () -{} - -void xml2brlOah::initializeXml2brlOah () -{ - // version - // -------------------------------------- - - { - S_oahSubGroup - versionSubGroup = - oahSubGroup::create ( - "Version", - "hxv", "help-xml2brl-version", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (versionSubGroup); - - // version - - versionSubGroup-> - appendAtomToSubGroup ( - xml2brlVersionOahAtom::create ( - "v", "version", -R"(Display xml2brl's version number and history.)")); - } - - // about - // -------------------------------------- - - { - S_oahSubGroup - aboutSubGroup = - oahSubGroup::create ( - "About", - "hxa", "help-xml2brl-about", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (aboutSubGroup); - - // about - - aboutSubGroup-> - appendAtomToSubGroup ( - xml2brlAboutOahAtom::create ( - "a", "about", -R"(Display information about xml2brl.)")); - } - - // contact - // -------------------------------------- - - { - S_oahSubGroup - contactSubGroup = - oahSubGroup::create ( - "Contact", - "hxc", "help-xml2brl-contact", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (contactSubGroup); - - // contact - - contactSubGroup-> - appendAtomToSubGroup ( - xml2brlContactOahAtom::create ( - "c", "contact", -R"(Display information about how to contacct xml2brl maintainers.)")); - } - - // output file - // -------------------------------------- - - { - S_oahSubGroup - outputFileSubGroup = - oahSubGroup::create ( - "Output file", - "hxof", "help-xml2brl-output-file", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (outputFileSubGroup); - - // output filename - - outputFileSubGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "o", "output-file-name", -R"(Write Braille music to file FILENAME instead of standard output.)", - "FILENAME", - "outputFileName", - fOutputFileName)); - - // auto output filename - - fAutoOutputFile = false; - - outputFileSubGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "aofn", "auto-output-file-name", -R"(This option can only be used when reading from a file. -Write Braille music to a file in the current working directory. -The file name is derived from that of the input file, -replacing any suffix after the the '.' by 'brl' -or adding '.brl' if none is present.)", - "autoOutputFileName", - fAutoOutputFile)); - } -} - -//______________________________________________________________________________ -void xml2brlOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2brlOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2brlOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlOah::browseData ()" << - endl; - } -#endif - - oahGroup::browseData (v); - - /* - string fOutputFileName; - bool fAutoOutputFileName; - */ -} - -//______________________________________________________________________________ -void xml2brlOah::printXml2brlOahValues (int fieldWidth) -{ - gLogOstream << - "The xml2brl options are:" << - endl; - - gIndenter++; - - // output file - // -------------------------------------- - - gLogOstream << left << - setw (fieldWidth) << "Output file:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "outputFileName" << " : \"" << - fOutputFileName << - "\"" << - endl; - - gIndenter--; -} - -//______________________________________________________________________________ -void initializeXml2brlOah ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing xml2brl options handling" << - endl; - } -#endif - - // enlist versions information - // ------------------------------------------------------ - - enlistVersion ( - "Initial", "october 2018", - "Derived from xml2ly, with an embryonic BSR"); - - enlistVersion ( - musicxml2brailleVersionStr (), "Nobember 2018", - "First draft version"); - - // create the options variables - // ------------------------------------------------------ - - gXml2brlOah = xml2brlOah::create ( - handler); - assert (gXml2brlOah != 0); -} - - -} diff --git a/src/lilypond/xml2brlOah.h b/src/lilypond/xml2brlOah.h deleted file mode 100644 index 38e1587cd..000000000 --- a/src/lilypond/xml2brlOah.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2brlOah___ -#define ___xml2brlOah___ - -//#include "exports.h" - -//#include "xml2lyManPageOah.h" - -#include "xml2brlOah2ManPageGenerator.h" - - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -class EXP xml2brlOahHandler : public oahHandler -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string executableName, - indentedOstream& ios); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlOahHandler ( - string executableName, - indentedOstream& ios); - - virtual ~xml2brlOahHandler (); - - private: - - // initialization - // ------------------------------------------------------ - - void initializeXml2brlOptionsHandler ( - string executableName, - S_xml2brlOah2ManPageGenerator - theOah2ManPageGenerator); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceOahHandlerQuietness (); - - public: - - // services - // ------------------------------------------------------ - - void checkOptionsAndArguments (); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2brlOahHandler; -EXP ostream& operator<< (ostream& os, const S_xml2brlOahHandler& elt); - -//______________________________________________________________________________ -class xml2brlOah : public oahGroup -{ - public: - - static SMARTP create ( - S_oahHandler handlerUpLink); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeXml2brlOah (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlOah ( - S_oahHandler handlerUpLink); - - virtual ~xml2brlOah (); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - void checkOptionsConsistency (); - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printXml2brlOahHelp (); - - void printXml2brlOahValues (int fieldWidth); - - public: - - // input - // -------------------------------------- - - // output file - // -------------------------------------- - - string fOutputFileName; - bool fAutoOutputFile; -}; -typedef SMARTP S_xml2brlOah; -EXP ostream& operator<< (ostream& os, const S_xml2brlOah& elt); - -EXP extern S_xml2brlOah gXml2brlOah; - -//______________________________________________________________________________ -void initializeXml2brlOah ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/xml2brlOah2ManPageGenerator.cpp b/src/lilypond/xml2brlOah2ManPageGenerator.cpp deleted file mode 100644 index a8ab341cd..000000000 --- a/src/lilypond/xml2brlOah2ManPageGenerator.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "xml2brlOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "oahOah.h" - -#include "version.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -S_xml2brlOah2ManPageGenerator xml2brlOah2ManPageGenerator::create ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) -{ - xml2brlOah2ManPageGenerator* o = new - xml2brlOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream); - assert(o!=0); - return o; -} - -xml2brlOah2ManPageGenerator::xml2brlOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - basicOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - msrOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - bsrOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - brailleOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - extraOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - oahOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -xml2brlOah2ManPageGenerator::~xml2brlOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void xml2brlOah2ManPageGenerator::visitTheHandler () -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Running xml2brlOah2ManPageGenerator::visitTheHandler()" << - endl; - } -#endif - - if (fVisitedOahHandler) { - // browse the visited oahHandler - oahBrowser browser (this); - browser.browse (*fVisitedOahHandler); - } - else { - // visited handler is not well handled by this visitor - stringstream s; - - s << - "fVisitedOahHandler is null, cannot generate man page data"; - - oahError (s.str ()); - } -} - -//________________________________________________________________________ -void xml2brlOah2ManPageGenerator::visitStart (S_xml2brlVersionOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting xml2brlVersionOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - elt->fetchNamesBetweenParentheses () << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void xml2brlOah2ManPageGenerator::visitEnd (S_xml2brlVersionOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting xml2brlVersionOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void xml2brlOah2ManPageGenerator::visitStart (S_xml2brlAboutOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting xml2brlAboutOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void xml2brlOah2ManPageGenerator::visitEnd (S_xml2brlAboutOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting xml2brlAboutOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void xml2brlOah2ManPageGenerator::visitStart (S_xml2brlContactOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting xml2brlContactOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void xml2brlOah2ManPageGenerator::visitEnd (S_xml2brlContactOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting xml2brlContactOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/xml2brlOah2ManPageGenerator.h b/src/lilypond/xml2brlOah2ManPageGenerator.h deleted file mode 100644 index 9cb92b85c..000000000 --- a/src/lilypond/xml2brlOah2ManPageGenerator.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2brlOah2ManPageGenerator___ -#define ___xml2brlOah2ManPageGenerator___ - -#include "basicOah2ManPageGenerator.h" -#include "msrOah2ManPageGenerator.h" -#include "bsrOah2ManPageGenerator.h" -#include "brailleOah2ManPageGenerator.h" -#include "extraOah2ManPageGenerator.h" -#include "oahOah2ManPageGenerator.h" - -#include "xml2brlOahTypes.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class xml2brlOah2ManPageGenerator : - - // aggregate needed components' visitors - virtual public basicOah2ManPageGenerator, - virtual public msrOah2ManPageGenerator, - virtual public bsrOah2ManPageGenerator, - virtual public brailleOah2ManPageGenerator, - virtual public extraOah2ManPageGenerator, - virtual public oahOah2ManPageGenerator, - - // this man page generator's own visitors - public visitor, - - public visitor, - - public visitor - -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~xml2brlOah2ManPageGenerator (); - - protected: - - // protected services - // ------------------------------------------------------ - - virtual void visitStart (S_xml2brlVersionOahAtom& elt); - virtual void visitEnd (S_xml2brlVersionOahAtom& elt); - - virtual void visitStart (S_xml2brlContactOahAtom& elt); - virtual void visitEnd (S_xml2brlContactOahAtom& elt); - - virtual void visitStart (S_xml2brlAboutOahAtom& elt); - virtual void visitEnd (S_xml2brlAboutOahAtom& elt); - - public: - - // public services - // ------------------------------------------------------ - - virtual void visitTheHandler (); - - private: - - // private fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2brlOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/xml2brlOahTypes.cpp b/src/lilypond/xml2brlOahTypes.cpp deleted file mode 100644 index f8c37dc34..000000000 --- a/src/lilypond/xml2brlOahTypes.cpp +++ /dev/null @@ -1,542 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "oahOah.h" - -#include "xml2brlOahTypes.h" - -#include "version.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_xml2brlVersionOahAtom xml2brlVersionOahAtom::create ( - string shortName, - string longName, - string description) -{ - xml2brlVersionOahAtom* o = new - xml2brlVersionOahAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -xml2brlVersionOahAtom::xml2brlVersionOahAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -xml2brlVersionOahAtom::~xml2brlVersionOahAtom () -{} - -S_oahValuedAtom xml2brlVersionOahAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2brlVersionOahAtom" << - endl; - } -#endif - - // handle it at once - printVersion (os); - - // no option value is needed - return nullptr; -} - -void xml2brlVersionOahAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlVersionOahAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlVersionOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlVersionOahAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2brlVersionOahAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlVersionOahAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlVersionOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlVersionOahAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2brlVersionOahAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlVersionOahAtom::browseData ()" << - endl; - } -#endif -} - -void xml2brlVersionOahAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2brlVersionOahAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2brlVersionOahAtom::printVersion (ostream& os) const -{ - os << - endl << - "This is xml2brl" << - " version " << currentVersionNumber () << - endl << - endl; - - // print versions history - printVersionsHistory (os); - - // register 'print version' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2brlVersionOahAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2brlVersionOahAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_xml2brlAboutOahAtom xml2brlAboutOahAtom::create ( - string shortName, - string longName, - string description) -{ - xml2brlAboutOahAtom* o = new - xml2brlAboutOahAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -xml2brlAboutOahAtom::xml2brlAboutOahAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -xml2brlAboutOahAtom::~xml2brlAboutOahAtom () -{} - -S_oahValuedAtom xml2brlAboutOahAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2brlAboutOahAtom" << - endl; - } -#endif - - // handle it at once - printAbout (os); - - // no option value is needed - return nullptr; -} - -void xml2brlAboutOahAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlAboutOahAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlAboutOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlAboutOahAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2brlAboutOahAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlAboutOahAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlAboutOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlAboutOahAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2brlAboutOahAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlAboutOahAtom::browseData ()" << - endl; - } -#endif -} - -void xml2brlAboutOahAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2brlAboutOahAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2brlAboutOahAtom::printAbout (ostream& os) const -{ - os << - endl << -R"(What xml2brl does: - - This multi-pass translator basically performs 6 passes: - Pass 1: reads the contents of MusicXMLFile or stdin ('-') - and converts it to a MusicXML tree; - Pass 2a: converts that MusicXML tree into to - a Music Score Representation (MSR) skeleton; - Pass 2b: converts that tree and the skeleton into a - Music Score Representation (MSR); - Pass 3a: converts the MSR into a - Braille Score Representation (BSR) - containing one Braille page per MusicXML page; - Pass 3b: converts the BSR into to another BSR - with as many Braille pages as needed - to fit the line and page lengthes; - Pass 4: converts the BSR to Unicode text - and writes it to standard output. - - In this preliminary version, pass 3b merely clones the BSR it receives. - - Other passes are performed according to the options, such as - printing views of the internal data or printing a summary of the score. - - The activity log and warning/error messages go to standard error.)" << - endl; - - // register 'print about' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2brlAboutOahAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2brlAboutOahAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_xml2brlContactOahAtom xml2brlContactOahAtom::create ( - string shortName, - string longName, - string description) -{ - xml2brlContactOahAtom* o = new - xml2brlContactOahAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -xml2brlContactOahAtom::xml2brlContactOahAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -xml2brlContactOahAtom::~xml2brlContactOahAtom () -{} - -S_oahValuedAtom xml2brlContactOahAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2brlContactOahAtom" << - endl; - } -#endif - - // handle it at once - printContact (os); - - // no option value is needed - return nullptr; -} - -void xml2brlContactOahAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlContactOahAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlContactOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlContactOahAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2brlContactOahAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlContactOahAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2brlContactOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2brlContactOahAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2brlContactOahAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2brlContactOahAtom::browseData ()" << - endl; - } -#endif -} - -void xml2brlContactOahAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2brlContactOahAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2brlContactOahAtom::printContact (ostream& os) const -{ - os << - endl << -R"(To contact xml2brl maintainers: - - Send a mail to mailto:lilypond-user@gnu.org describing the problem - and error messages you obtain if relevant.)" << - endl; - - // register 'print contact' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2brlContactOahAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2brlContactOahAtom& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/xml2brlOahTypes.h b/src/lilypond/xml2brlOahTypes.h deleted file mode 100644 index c242f2ff1..000000000 --- a/src/lilypond/xml2brlOahTypes.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2brlOahTypes___ -#define ___xml2brlOahTypes___ - -#include "oahBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class xml2brlVersionOahAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlVersionOahAtom ( - string shortName, - string longName, - string description); - - virtual ~xml2brlVersionOahAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printVersion (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2brlVersionOahAtom; -EXP ostream& operator<< (ostream& os, const S_xml2brlVersionOahAtom& elt); - -//______________________________________________________________________________ -class xml2brlAboutOahAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlAboutOahAtom ( - string shortName, - string longName, - string description); - - virtual ~xml2brlAboutOahAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAbout (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2brlAboutOahAtom; -EXP ostream& operator<< (ostream& os, const S_xml2brlAboutOahAtom& elt); - -//______________________________________________________________________________ -class xml2brlContactOahAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2brlContactOahAtom ( - string shortName, - string longName, - string description); - - virtual ~xml2brlContactOahAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printContact (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2brlContactOahAtom; -EXP ostream& operator<< (ostream& os, const S_xml2brlContactOahAtom& elt); - - -} - - -#endif diff --git a/src/lilypond/xml2ly.1 b/src/lilypond/xml2ly.1 deleted file mode 100644 index 795ca915a..000000000 --- a/src/lilypond/xml2ly.1 +++ /dev/null @@ -1,1075 +0,0 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. -.TH XML2LY "1" "October 2019" "xml2ly " "User Commands" -.SH NAME -xml2ly \- manual page for xml2ly -.SH DESCRIPTION -.IP -Welcome to xml2ly, -.IP -the MusicXML to LilyPond translator -.IP -delivered as part of the libmusicxml2 library. -.IP -https://github.com/grame\-cncm/libmusicxml/tree/lilypond -.SS "Usage:" -.IP -xml2ly [options] [MusicXMLFile|\-] [options] -.PP -xml2ly available options (\fB\-h\fR, \fB\-help\fR): -.IP -Option '\-h, \fB\-help\fR' prints the full help, -.IP -while '\-hs, \fB\-helpSummary\fR' only prints a help summary. -.IP -There are 8 options prefixes: -.IP -\&'\-delay\-rests=abc,yz' is equivalent to '\-delay\-rests\-abc, \fB\-delay\-rests\-yz\fR' -\&'\-dr=abc,yz' is equivalent to '\-drabc, \fB\-dryz\fR' -\&'\-h=abc,wxyz' is equivalent to '\-habc, \fB\-hwxyz\fR' -\&'\-help=abc,yz' is equivalent to '\-help\-abc, \fB\-help\-yz\fR' -\&'\-ignore\-redundant=abc,yz' is equivalent to '\-ignore\-redundant\-abc, \fB\-ignore\-redundant\-yz\fR' -\&'\-ir=abc,yz' is equivalent to '\-irabc, \fB\-iryz\fR' -\&'\-t=abc,wxyz' is equivalent to '\-tabc, \fB\-twxyz\fR' -\&'\-trace=abc,yz' is equivalent to '\-trace\-abc, \fB\-trace\-yz\fR' -.IP -There are 6 single\-character options: -.HP -\fB\-a\fR, \fB\-c\fR, \fB\-h\fR, \fB\-o\fR, \fB\-q\fR and \fB\-v\fR -.IP -They can be clustered, such as: -.IP -\&'\-vac' -.IP -which is equivalent to: -.IP -\&'\-v, \fB\-a\fR, \fB\-c\fR' -.IP -Some options needing a value can use a default value: -.IP -xml2ly supports two styles for this, see '\-ovs, \fB\-optional\-values\-style\fR' option. -.IP -xml2ly (\fB\-hxl\fR, \fB\-help\-xml2ly\fR): -.IP -Options that are used by xml2ly are grouped here. -.HP -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.TP -Version -(\fB\-hxv\fR, \fB\-help\-xml2ly\-version\fR): -.HP -\fB\-v\fR, \fB\-version\fR -.IP -Display xml2ly's version number and history. -.TP -About -(\fB\-hxa\fR, \fB\-help\-xml2ly\-about\fR): -.HP -\fB\-a\fR, \fB\-about\fR -.IP -Display information about xml2ly. -.TP -Contact -(\fB\-hxc\fR, \fB\-help\-xml2ly\-contact\fR): -.HP -\fB\-c\fR, \fB\-contact\fR -.IP -Display information about how to contacct xml2ly maintainers. -.TP -Output file -(\fB\-hxof\fR, \fB\-help\-xml2ly\-output\-file\fR): -.HP -\fB\-o\fR, \fB\-output\-file\-name\fR FILENAME -.IP -Write LilyPond code to file FILENAME instead of standard output. -.HP -\fB\-aofn\fR, \fB\-auto\-output\-file\-name\fR -.IP -This option can only be used when reading from a file. -Write LilyPond code to a file in the current working directory. -The file name is derived from that of the input file, -replacing any suffix after the the '.' by 'ly' -or adding '.ly' if none is present. -.IP -Trace (\fB\-ht\fR, \fB\-help\-trace\fR) (hidden by default) -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.IP -Options and help (\fB\-hoah\fR, \fB\-help\-options\-and\-help\fR): -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.TP -Options help -(\fB\-hoh\fR, \fB\-help\-options\-help\fR): -.HP -\fB\-ho\fR, \fB\-help\-options\fR -.IP -Print options usage help. -.HP -\fB\-hs\fR, \fB\-help\-summary\fR -.IP -Display a help summary and exit. -.HP -\fB\-onh\fR, \fB\-option\-name\-help\fR [OPTION_NAME] -.IP -Print help about OPTION_NAME. -OPTION_NAME is optional, and the default value is 'onh'. -.HP -\fB\-dov\fR, \fB\-display\-options\-values\fR -.IP -Write the chosen options values to standard error. -This option is best placed early in the command line -.HP -\fB\-doh\fR, \fB\-display\-options\-handler\fR -.IP -Write the contents of the options handler to standard error. -.TP -Options and arguments -(\fB\-oaa\fR, \fB\-options\-and\-arguments\fR): -.HP -\fB\-soaa\fR, \fB\-show\-options\-and\-arguments\fR -.IP -Print the options and arguments to xml2ly. -.HP -\fB\-ovs\fR, \fB\-optional\-values\-style\fR STYLE -.IP -The 2 OAH optional values STYLEs available are: -gnu and oah. -The default is 'gnu'. -In GNU style: -.IP -\- the options name alone used the default value; -\- another value can be supplied with '=VALUE' right after the option name, -.IP -without any space in\-between. -.IP -InOAH style: -.IP -\- the option name followed by another option or that is the last one -.IP -in the command line uses the default value; -.IP -\- otherwise, the following argument supplies the option value. -.TP -Options visitors trace -(\fB\-htov\fR, \fB\-help\-trace\-options\-visitors\fR): -.HP -\fB\-toahv\fR, \fB\-trace\-oah\-visitors\fR -.IP -Write a trace of the OAH tree visiting activity to standard error. -.IP -General (\fB\-hg\fR, \fB\-help\-general\fR): -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.TP -Warnings and errors -(\fB\-hwae\fR, \fB\-help\-warnings\-and\-errors\fR): -.HP -\fB\-q\fR, \fB\-quiet\fR -.IP -Don't issue any warning or error messages. -.HP -\fB\-dse\fR, \fB\-dont\-show\-errors\fR -.IP -Don't show errors in the log. -.HP -\fB\-daoe\fR, \fB\-dont\-abort\-on\-errors\fR -.IP -Do not abort execution on errors and go ahead. -This may be useful when debugging xml2ly. -.HP -\fB\-dscp\fR, \fB\-display\-source\-code\-position\fR -.IP -Display the source code file name and line number -in warning and error messages. -This is useful when debugging xml2ly. -.TP -CPU usage -(\fB\-hgcpu\fR, \fB\-help\-general\-cpu\-usage\fR): -.HP -\fB\-dcpuu\fR, \fB\-display\-cpu\-usage\fR -.IP -Write information about CPU usage to standard error. -.IP -MusicXML (\fB\-hmxml\fR, \fB\-help\-musicxml\fR): -.IP -These options control the way MusicXML data is translated. -.HP -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.TP -Trace -(\fB\-hmxmlt\fR, \fB\-help\-musicxml\-trace\fR): -.HP -\fB\-t\fR, \fB\-trace\fR -.IP -Trace SHORT_NAME/LONG_NAME when analyzing MusicXML data. -The 4 known SHORT_NAMEs are: -.IP -enc, divs, backup and forward. -.IP -The 4 known LONG_NAMEs are: -.IP -\fB\-encoding\fR, \fB\-divisions\fR, \fB\-backup\fR and \fB\-forward\fR. -.HP -\fB\-tmxmltv\fR, \fB\-trace\-musicxml\-tree\-visitors\fR -.IP -Write a trace of the MusicXML tree visiting activity to standard error. -.TP -Work -(\fB\-hmxmlw\fR, \fB\-help\-musicxml\-work\fR): -.HP -\fB\-ufawt\fR, \fB\-use\-filename\-as\-work\-title\fR -.IP -Use the file name as work title if there is none in the MusicXML data. -Standard input (\-) becomes 'Standard input' in that case. -.TP -Clefs, keys, times -(\fB\-hmxmlckt\fR, \fB\-help\-musicxml\-clefs\-keys\-times\fR): -.HP -\fB\-ir\fR, \fB\-ignore\-redundant\fR -.IP -Ignore ELEMENTS that are the same as the current one. -The 3 known ELEMENTSs are: -.IP -clefs, keys and times. -.TP -Combined options -(\fB\-hmxmlco\fR, \fB\-help\-musicxml\-combined\-options\fR): -.HP -\fB\-cubase\fR -.IP -Useful settings for MusicXML data exported from Cubase. -This option is set by default, and can be unset by 'noCubase'. -This combined option is equivalent to: -.IP -\fB\-irclefs\fR, \fB\-ignore\-redundant\-clefs\fR -\fB\-irkeys\fR, \fB\-ignore\-redundant\-keys\fR -\fB\-irtimes\fR, \fB\-ignore\-redundant\-times\fR -.HP -\fB\-no\-cubase\fR -.IP -Prevents the default 'cubase' option. -.IP -MSR (\fB\-hmsr\fR, \fB\-help\-msr\fR): -.IP -These options control the way MSR data is handled. -.HP -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.TP -Trace -(\fB\-hmsrt\fR, \fB\-help\-msr\-trace\fR): -.HP -\fB\-tmsr\fR, \fB\-trace\-msr\fR -.IP -Write a trace of the LPSR graphs visiting activity to standard error. -.HP -\fB\-tmsrv\fR, \fB\-trace\-msr\-visitors\fR -.IP -Write a trace of the MSR graphs visiting activity to standard error. -.TP -Display -(\fB\-hmsrtd\fR, \fB\-help\-msr\-trace\-and\-display\fR): -.HP -\fB\-dpg\fR, \fB\-display\-partgroups\fR -.IP -Write the structure of the part groups to standard error. -.HP -\fB\-dmsr\fR, \fB\-display\-msr\fR -.IP -Write the contents of the MSR data to standard error. -.HP -\fB\-dmsrd\fR, \fB\-display\-msr\-details\fR -.IP -Write the contents of the MSR data with more details to standard error. -.HP -\fB\-dmnames\fR, \fB\-display\-msr\-names\fR -.IP -Only write a view of the names in the MSR to standard error. -This implies that no LilyPond code is generated. -.HP -\fB\-dmsum\fR, \fB\-display\-msr\-summary\fR -.IP -Only write a summary of the MSR to standard error. -This implies that no LilyPond code is generated. -.TP -Languages -(\fB\-hmsrlang\fR, \fB\-help\-msr\-languages\fR): -.HP -\fB\-mplang\fR, \fB\-msr\-pitches\-language\fR LANGUAGE -.IP -Use LANGUAGE to display note pitches in the MSR logs and text views. -The 12 LilyPond pitches languages available are: -catalan, deutsch, english, espanol, francais, italiano, nederlands. -The default is 'nederlands'. -.TP -Parts -(\fB\-hmsrp\fR, \fB\-help\-msr\-parts\fR): -.HP -\fB\-mrp\fR, \fB\-msr\-rename\-part\fR PART_RENAME_SPEC -.IP -Rename part ORIGINAL_NAME to NEW_NAME, for example after displaying -the names in the score or a summary of the latter in a first run with options -\&'\-dmnames, \fB\-display\-msr\-names\fR' or 'dmsum, \fB\-display\-msr\-summary\fR'. -PART_RENAME_SPEC can be: -\&'ORIGINAL_NAME = NEW_NAME' -or -"ORIGINAL_NAME = NEW_NAME" -The single or double quotes are used to allow spaces in the names -and around the '=' sign, otherwise they can be dispensed with. -Using double quotes allows for shell variables substitutions, as in: -DESSUS="Cor anglais" -xml2ly \fB\-msr\-rename\-part\fR "P1 = ${DESSUS}" . -There can be several occurrences of this option. -.HP -\fB\-mtp\fR, \fB\-msr\-transpose\-part\fR PART_TRANSPOSITION_SPEC -.IP -Transpose part ORIGINAL_NAME using TRANSPOSITION to tranpose in the MSR data. -PART_TRANSPOSITION_SPEC can be: -\&'ORIGINAL_NAME = TRANSPOSITION' -or -"ORIGINAL_NAME = TRANSPOSITION" -The single or double quotes are used to allow spaces in the names -and around the '=' sign, otherwise they can be dispensed with. -TRANSPOSITION should contain a diatonic pitch, followed if needed -by a sequence of ',' or '\e'' octave indications. -Such indications cannot be mixed, and they are relative to c\e', i.e. middle C. -For example, 'a', 'f' and 'bes,' can be used respectively -for instruments in 'a', 'f' and B flat respectively. -Using double quotes allows for shell variables substitutions, as in: -SAXOPHONE="bes," -EXECUTABLE \fB\-msr\-transpose\-part\fR "P1 ${SAXOPHONE}" . -There can be several occurrences of this option. -.HP -\fB\-mop\fR, \fB\-msr\-omit\-part\fR PART_NAME -.IP -Omit part PART_NAME. -There can be several occurrences of this option. -All the parts not omitted are kept. -This option is incompatible with '\-mkp, \fB\-msr\-keep\-part\fR'. -.HP -\fB\-mkp\fR, \fB\-msr\-keep\-part\fR PART_NAME -.IP -Keep part PART_NAME. -There can be several occurrences of this option. -All the parts not kept are omitted. -This option is incompatible with '\-mop, \fB\-msr\-omit\-part\fR'. -.TP -Staves -(\fB\-hmsrs\fR, \fB\-help\-msr\-staves\fR): -.HP -\fB\-cslsar\fR, \fB\-create\-single\-line\-staves\-as\-rythmic\fR -.IP -Create staves with a single line as rythmic staves. -By default, drum staves are created in this case. -.TP -Voices -(\fB\-hmsrv\fR, \fB\-help\-msr\-voices\fR): -.HP -\fB\-cvsrvn\fR, \fB\-create\-voices\-staff\-relative\-numbers\fR -.IP -Generate voices names with numbers relative to their staff. -By default, the voice numbers found are used, -which may be global to the score. -.TP -Repeats -(\fB\-hmsrr\fR, \fB\-help\-msr\-repeats\fR): -.HP -\fB\-ciirb\fR, \fB\-create\-implicit\-initial\-repeat\-barline\fR -.IP -Create an implicit repeat barline at the beginning of the stave -in case there is none, as is usual in scores. -By default, no such barline is added. -.TP -Notes -(\fB\-hmsrn\fR, \fB\-help\-msr\-notes\fR): -.HP -\fB\-dr\fR, \fB\-delay\-rests\fR -.IP -Delay SHORT_NAME/LONG_NAME that occur on a rest until the next note. -The 7 known SHORT_NAMEs are: -.IP -dyns, words, beams, slurs, ligs, peds and wedges. -.IP -The 7 known LONG_NAMEs are: -.IP -\fB\-dynamics\fR, \fB\-words\fR, \fB\-beams\fR, \fB\-slurs\fR, \fB\-ligatures\fR, \fB\-pedals\fR and \fB\-wedges\fR. -.HP -\fB\-drslashes\fR, \fB\-delay\-rests\-slashes\fR -.IP -\&'' in MusicXML -.HP -\fB\-oarts\fR, \fB\-omit\-articulations\fR -.IP -\&'' in MusicXML, '' in MusicXML, '' in MusicXML, '' in MusicXML, '', -followed by code to display it, for example: -.IP -\&' \e\esuper {"\-7(" {\e\esmall\e\eraise #0.5 \e\eflat} "5)"}'. -.IP -The LilyPond code has to escape backslashed, thus use '\e\e' to obtain '\e'. -These two elements are passed over to LilyPond verbatim, without any check. -This option can be used any number of times. -.HP -\fB\-jchd\fR, \fB\-jazz\-chords\-display\fR -.IP -Display the chords using LilyPond's chordNameExceptions -and a set of standard specifications to display them, i.e.: -.IP -1\-\emarkup { \esuper {"\-7(" {\esmall\eraise #0.5 \eflat} "5)"} } -1\-\emarkup { \esuper "7" } -1\-\emarkup { \esuper {"7(" {\esmall\eraise #0.5 \esharp} "5)"} } -1\-\emarkup { \esuper {"7(sus4)"} } -1\-\emarkup { \esuper "6/9" } -1\-\emarkup { \esuper {"7(" {\esmall\eraise #0.5 \eflat} "9)"} } -1\-\emarkup { \esuper {"9(sus4)"} } -1\-\emarkup { \esuper "9" } -1\-\emarkup { \esuper "maj9" } -1\-\emarkup { \esuper "9+" } -1\-\emarkup { \esuper "9#11" } -1\-\emarkup { \esuper "11" } -1\-\emarkup { \esuper "13" } -1\-\emarkup { \esuper {"13(" {\esmall\eraise #0.5 \esharp} "11)"} } -1\-\emarkup { \esuper "6(add9)" } -.TP -Lyrics -(\fB\-hlyrics\fR, \fB\-help\-lyrics\fR): -.HP -\fB\-la\fR, \fB\-lyrics\-alignment\fR STYLE -.IP -The 2 LilyPond lyrics alignment STYLEs available are: -automatic and manual. -The default is 'automatic'. -.TP -Fonts -(\fB\-hfonts\fR, \fB\-help\-fonts\fR): -.HP -\fB\-jazz\fR, \fB\-jazz\-fonts\fR -.IP -Use the LilyJazz font for notes, braces, text and chords. -It can be downloaded from https://github.com/OpenLilyPondFonts/lilyjazz. -This font should be installed so that LilyPond can use it, see: -https://github.com/OpenLilyPondFonts/lilyjazz/blob/master/LilyPond\-Fonts\-Installation\-And\-Usage.txt. -.TP -Code generation -(\fB\-hlpcg\fR, \fB\-help\-lilypond\-code\-generation\fR): -.HP -\fB\-xi\fR, \fB\-xml2ly\-infos\fR -.IP -Generate initial comments showing the compilation date and lilypond. -.HP -\fB\-com\fR, \fB\-comments\fR -.IP -Generate comments showing the structure of the score -such as '% part P_POne (P1). -.HP -\fB\-global\fR -.IP -Generate a 'global' empty variable and place a use of it -at the beginning of all voices. -.HP -\fB\-dm\fR, \fB\-display\-music\fR -.IP -Place the contents of all voices inside a '\edisplayMusic' block, -for LilyPond to show its internal representation of the music. -.HP -\fB\-nolpc\fR, \fB\-no\-lilypond\-code\fR -.IP -Don't generate any LilyPond code. -That can be useful if only a summary of the score is needed. -.HP -\fB\-nolpl\fR, \fB\-no\-lilypond\-lyrics\fR -.IP -Don't generate any lyrics in the LilyPond code. -.HP -\fB\-lpcd\fR, \fB\-lilypond\-compile\-date\fR -.IP -Generate code to include the compilation date -when LilyPond creates the score. -.HP -\fB\-paco\fR, \fB\-point\-and\-clic\-off\fR -.IP -Generate \epointAndClickOff at the beginning of the LilyPond code -to reduce the size of the resulting PDF file. -.HP -\fB\-wnh\fR, \fB\-white\-note\-heads\fR -.IP -Generate Scheme function 'whiteNoteHeads' -at the beginning of the LilyPond code. -.TP -Score notation -(\fB\-hlpsn\fR, \fB\-help\-lilypond\-score\-notation\fR): -.HP -\fB\-jianpu\fR -.IP -Generate the score using jianpu (numbered) notation -instead of the default western notation. -That option needs lilypond\-Jianpu to be accessible to LilyPond -(https://github.com/nybbs2003/lilypond\-Jianpu/jianpu10a.ly). -.TP -Midi -(\fB\-hlpm\fR, \fB\-help\-lilypond\-midi\fR): -.HP -\fB\-mtempo\fR, \fB\-midi\-temp\fR MIDI_TEMPO_SPEC -.IP -Generate a '\etempo' command in the \emidi block. -MIDI_TEMPO_SPEC can be: -\&'DURATION = PER_SECOND' -or -"DURATION = PER_SECOND" . -DURATION is a string such as '8.', and PER_SECOND is an integer. -The single or double quotes are used to allow spaces around the '=' sign, -otherwise they can be dispensed with. -Using double quotes allows for shell variables substitutions, as in: -PER_SECOND=66 -xml2ly \fB\-midiTempo\fR "8. ${PER_SECOND}" . -The default is '4 = 90'. -.HP -\fB\-no\-midi\fR -.IP -Generate the '\emidi' block as a comment instead of active code. -.IP -Extra (\fB\-he\fR, \fB\-help\-extra\fR): -.IP -These extra provide features not related to translation from MusicXML to other formats. -In the text below: -.IP -\- ROOT_DIATONIC_PITCH should belong to the names available in -.IP -the selected MSR pitches language, "nederlands" by default; -.IP -\- other languages can be chosen with the '\-mpl, \fB\-msrPitchesLanguage\fR' option; -\- HARMONY_NAME should be one of: -.IP -MusicXML chords: -.IP -"maj", "min", "aug", "dim", "dom", -"maj7", "min7", "dim7", "aug7", "halfdim", "minmaj7", -"maj6", "min6", "dom9", "maj9", "min9", "dom11", "maj11", "min11", -"dom13", "maj13", "min13", "sus2", "sus4", -"neapolitan", "italian", "french", "german" -.IP -Jazz\-specific chords: -.IP -"pedal", "power", "tristan", "minmaj9", "domsus4", "domaug5", -"dommin9", "domaug9dim5", "domaug9aug5", "domaug11", "maj7aug11" -.IP -The single or double quotes are used to allow spaces in the names -and around the '=' sign, otherwise they can be dispensed with. -.HP -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.TP -Chords structures -(\fB\-hecs\fR, \fB\-help\-extra\-chord\-structures\fR): -.HP -\fB\-scs\fR, \fB\-show\-chords\-structures\fR -.IP -Write all known chords structures to standard output. -.TP -Chords contents -(\fB\-hecc\fR, \fB\-help\-extra\-chords\-contents\fR): -.HP -\fB\-sacc\fR, \fB\-show\-all\-chords\-contents\fR PITCH -.IP -Write all chords contents for the given diatonic (semitones) PITCH, -supplied in the current language to standard output. -.TP -Chord details -(\fB\-hecd\fR, \fB\-help\-extra\-chords\-details\fR): -.HP -\fB\-scd\fR, \fB\-show\-chord\-details\fR CHORD_SPEC -.IP -Write the details of the chord for the given diatonic (semitones) pitch -in the current language and the given harmony to standard output. -CHORD_SPEC can be: -\&'ROOT_DIATONIC_PITCH HARMONY_NAME' -or -"ROOT_DIATONIC_PITCH = HARMONY_NAME" -Using double quotes allows for shell variables substitutions, as in: -HARMONY="maj7" -xml2ly \fB\-show\-chord\-details\fR "bes ${HARMONY}" -.TP -Chord analysis -(\fB\-heca\fR, \fB\-help\-extra\-chords\-analysis\fR): -.HP -\fB\-sca\fR, \fB\-show\-chord\-analysis\fR CHORD_SPEC -.IP -Write an analysis of the chord for the given diatonic (semitones) pitch -in the current language and the given harmony to standard output. -CHORD_SPEC can be: -\&'ROOT_DIATONIC_PITCH HARMONY_NAME INVERSION' -or -"ROOT_DIATONIC_PITCH = HARMONY_NAME INVERSION" -Using double quotes allows for shell variables substitutions, as in: -HARMONY="maj7" -INVERSION=2 -xml2ly \fB\-show\-chord\-analysis\fR "bes ${HARMONY} ${INVERSION}" -.IP -Man page (\fB\-hmp\fR, \fB\-help\-man\-page\fR): -.IP -These options control the way the man page is generated. -.HP -\fB\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\fR -.TP -Display -(\fB\-hmpd\fR, \fB\-help\-man\-page\-display\fR): -.HP -\fB\-gmp\fR, \fB\-generate\-man\-page\fR -.IP -Write man page data to standard output. -.TP -Trace -(\fB\-hmpt\fR, \fB\-help\-man\-page\-trace\fR): -.IP -Note: the options in this group imply '\-tmp, \fB\-trace\-man\-page\fR'. -.PP -This is xml2ly version 0.91 -.SS "Versions history:" -.TP -0.91 -(October 2018): -.IP -First draft version -.IP -Initial (early 2016): -.IP -Start as xml2lilypond, a clone of xml2guido -.SH "SEE ALSO" -The full documentation for -.B xml2ly -is maintained as a Texinfo manual. If the -.B info -and -.B xml2ly -programs are properly installed at your site, the command -.IP -.B info xml2ly -.PP -should give you access to the complete manual. diff --git a/src/lilypond/xml2lyManPageOah.cpp b/src/lilypond/xml2lyManPageOah.cpp deleted file mode 100644 index 9fae11c94..000000000 --- a/src/lilypond/xml2lyManPageOah.cpp +++ /dev/null @@ -1,475 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include -#include // setw, setprecision, ... - -#include "utilities.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "generalOah.h" - -#include "xml2lyManPageOah.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_xml2lyManPageGenerateAtom xml2lyManPageGenerateAtom::create ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor) -{ - xml2lyManPageGenerateAtom* o = new - xml2lyManPageGenerateAtom ( - shortName, - longName, - description, - theOahVisitor); - assert(o!=0); - return o; -} - -xml2lyManPageGenerateAtom::xml2lyManPageGenerateAtom ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor) - : oahAtom ( - shortName, - longName, - description) -{ - fOahVisitor = theOahVisitor; -} - -xml2lyManPageGenerateAtom::~xml2lyManPageGenerateAtom () -{} - -S_oahValuedAtom xml2lyManPageGenerateAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2lyManPageGenerateAtom" << - endl; - } -#endif - - // handle it at once - generateManPageData (os); - - // no option value is needed - return nullptr; -} - -void xml2lyManPageGenerateAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyManPageGenerateAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyManPageGenerateAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyManPageGenerateAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2lyManPageGenerateAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyManPageGenerateAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyManPageGenerateAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyManPageGenerateAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2lyManPageGenerateAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyManPageGenerateAtom::browseData ()" << - endl; - } -#endif -} - -void xml2lyManPageGenerateAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2lyManPageGenerateAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2lyManPageGenerateAtom::generateManPageData (ostream& os) const -{ - // generate the man page from the OAH handler - fOahVisitor->visitTheHandler (); - - // register 'generate man page' action in options groups's options handler upLink - S_oahHandler - handler = - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink (); - - handler-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2lyManPageGenerateAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2lyManPageGenerateAtom& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_xml2lyManPageOah gxml2lyManPageOah; -S_xml2lyManPageOah gxml2lyManPageOahUserChoices; -S_xml2lyManPageOah gxml2lyManPageOahWithDetailedTrace; - -S_xml2lyManPageOah xml2lyManPageOah::create ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator) -{ - xml2lyManPageOah* o = new xml2lyManPageOah ( - handlerUpLink, - theOah2ManPageGenerator); - assert(o!=0); - return o; -} - -xml2lyManPageOah::xml2lyManPageOah ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator) - : oahGroup ( - "Man page", - "hmp", "help-man-page", -R"(These options control the way the man page is generated.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this man page group to the OAH handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - appendGroupToHandler (this); - } - - // initialize it - initializeXml2lyManPageOah ( - false, - theOah2ManPageGenerator); -} - -xml2lyManPageOah::~xml2lyManPageOah () -{} - -void xml2lyManPageOah::initializeManPageGenerateOptions ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Generate", - "hgmp", "help-generate-man-page", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - -/* JMI - // OAH - - fDisplayOah = boolOptionsInitialValue; - - subGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "doah", "display-oah", -R"(Write the contents of the OAH data to standard error.)", - "displayOah", - fDisplayOah)); -*/ - - // generate man page - fOahVisitor = theOah2ManPageGenerator; - - subGroup-> - appendAtomToSubGroup ( - xml2lyManPageGenerateAtom::create ( - "gmp", "generate-man-page", -R"(Write man page data to standard output.)", - fOahVisitor)); -} - -#ifdef TRACE_OAH -void xml2lyManPageOah::initializeManPageTraceOah ( - bool boolOptionsInitialValue) -{ - S_oahSubGroup - subGroup = - oahSubGroup::create ( - "Trace", - "hmpt", "help-man-page-trace", -R"( Note: the options in this group imply '-tmp, -trace-man-page'.)", -// JMI kElementVisibilityHiddenByDefault, - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (subGroup); - - // JMI ??? -} -#endif - -void xml2lyManPageOah::initializeXml2lyManPageOah ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator) -{ - // display - // -------------------------------------- - initializeManPageGenerateOptions ( - boolOptionsInitialValue, - theOah2ManPageGenerator); - -#ifdef TRACE_OAH - // trace - // -------------------------------------- - initializeManPageTraceOah ( - boolOptionsInitialValue); -#endif -} - -S_xml2lyManPageOah xml2lyManPageOah::createCloneWithDetailedTrace () -{ - S_xml2lyManPageOah - clone = - xml2lyManPageOah::create ( - 0, // 0 not to have it inserted twice in the option handler - fOahVisitor); - - // set the OAH handler upLink - clone->fHandlerUpLink = - fHandlerUpLink; - -/* JMI - // display - // -------------------------------------- - - clone->fDisplayOah = - true; -*/ - - return clone; -} - -//______________________________________________________________________________ -void xml2lyManPageOah::enforceQuietness () -{ -// JMI fDisplayOah = false; -} - -//______________________________________________________________________________ -void xml2lyManPageOah::checkOptionsConsistency () -{ - // JMI -} - -//______________________________________________________________________________ -void xml2lyManPageOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyManPageOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyManPageOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyManPageOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2lyManPageOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyManPageOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyManPageOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyManPageOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2lyManPageOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyManPageOah::browseData ()" << - endl; - } -#endif -} - -//______________________________________________________________________________ -void xml2lyManPageOah::printManPageOahValues (int fieldWidth) -{ - gLogOstream << - "The OAH options are:" << - endl; - - gIndenter++; - - // JMI ??? - - gIndenter--; -} - -ostream& operator<< (ostream& os, const S_xml2lyManPageOah& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -void initializeXml2lyManPageOahHandling ( - S_oahHandler handler, - S_oahVisitor theOah2ManPageGenerator) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing man page options handling" << - endl; - } -#endif - - // create the bsr variables - // ------------------------------------------------------ - - gxml2lyManPageOahUserChoices = xml2lyManPageOah::create ( - handler, - theOah2ManPageGenerator); - assert(gxml2lyManPageOahUserChoices != 0); - - gxml2lyManPageOah = - gxml2lyManPageOahUserChoices; - - // prepare for measure detailed trace - // ------------------------------------------------------ -/* JMI - gxml2lyManPageOahWithDetailedTrace = - gxml2lyManPageOah-> - createCloneWithDetailedTrace (); - */ -} - - -} diff --git a/src/lilypond/xml2lyManPageOah.h b/src/lilypond/xml2lyManPageOah.h deleted file mode 100644 index dc5dc0b52..000000000 --- a/src/lilypond/xml2lyManPageOah.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2lyManPageOah___ -#define ___xml2lyManPageOah___ - -#include "oahVisitor.h" - -#include "xml2lyOah2ManPageGenerator.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class xml2lyManPageGenerateAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyManPageGenerateAtom ( - string shortName, - string longName, - string description, - S_oahVisitor theOahVisitor); - - virtual ~xml2lyManPageGenerateAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // public services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // private services - // ------------------------------------------------------ - - void generateManPageData (ostream& os) const; - - private: - - // fields - // -------------------------------------- - - S_oahVisitor fOahVisitor; -}; -typedef SMARTP S_xml2lyManPageGenerateAtom; -EXP ostream& operator<< (ostream& os, const S_xml2lyManPageGenerateAtom& elt); - -//______________________________________________________________________________ -class xml2lyManPageOah : public oahGroup -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator); - - SMARTP createCloneWithDetailedTrace (); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeXml2lyManPageOah ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyManPageOah ( - S_oahHandler handlerUpLink, - S_oahVisitor theOah2ManPageGenerator); - - virtual ~xml2lyManPageOah (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - virtual void checkOptionsConsistency (); - - public: - - // public services - // ------------------------------------------------------ - - private: - - // private services - // ------------------------------------------------------ - - void initializeManPageGenerateOptions ( - bool boolOptionsInitialValue, - S_oahVisitor - theOah2ManPageGenerator); - -#ifdef TRACE_OAH - void initializeManPageTraceOah ( - bool boolOptionsInitialValue); -#endif - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printManPageOahHelp (); - - void printManPageOahValues (int fieldWidth); - - private: - - // fields - // -------------------------------------- - - S_oahVisitor fOahVisitor; -}; -typedef SMARTP S_xml2lyManPageOah; -EXP ostream& operator<< (ostream& os, const S_xml2lyManPageOah& elt); - -EXP extern S_xml2lyManPageOah gxml2lyManPageOah; -EXP extern S_xml2lyManPageOah gxml2lyManPageOahUserChoices; -EXP extern S_xml2lyManPageOah gxml2lyManPageOahWithDetailedTrace; - -//______________________________________________________________________________ -EXP void initializeXml2lyManPageOahHandling ( - S_oahHandler handler, - S_oahVisitor theOah2ManPageGenerator); - - -} - - -#endif diff --git a/src/lilypond/xml2lyOah.cpp b/src/lilypond/xml2lyOah.cpp deleted file mode 100644 index c0357d3ac..000000000 --- a/src/lilypond/xml2lyOah.cpp +++ /dev/null @@ -1,751 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... - -#include "setTraceOahIfDesired.h" -#include "traceOah.h" - -#include "libmusicxml.h" - -#include "msr.h" -#include "lpsr.h" - -#include "oahOah.h" - -#include "generalOah.h" -#include "musicXMLOah.h" -#include "msrOah.h" -#include "lpsrOah.h" -#include "lilypondOah.h" - -#include "version.h" - -#include "xml2lyManPageOah.h" - -#include "xml2lyOah.h" - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_xml2lyOahHandler xml2lyOahHandler::create ( - string executableName, - indentedOstream& ios) -{ - xml2lyOahHandler* o = new - xml2lyOahHandler ( - executableName, - ios); - assert(o!=0); - return o; -} - -xml2lyOahHandler::xml2lyOahHandler ( - string executableName, - indentedOstream& ios) - : oahHandler ( - executableName + " available options", - "Options values", - "h", "help", - "hs", "helpSummary", -R"( Welcome to xml2ly, - the MusicXML to LilyPond translator - delivered as part of the libmusicxml2 library. - https://github.com/grame-cncm/libmusicxml/tree/lilypond -)", -R"( -xml2ly [options] [MusicXMLFile|-] [options] -)", -R"( -Option '-h, -help' prints the full help, - while '-hs, -helpSummary' only prints a help summary.)", - ios) -{ - // create and append the help options prefixes - S_oahPrefix - helpPrefix = - oahPrefix::create ( - "help", - "help-", - "'-help=abc,yz' is equivalent to '-help-abc, -help-yz'"); - appendPrefixToHandler (helpPrefix); - - S_oahPrefix - hPrefix = - oahPrefix::create ( - "h", - "h", - "'-h=abc,wxyz' is equivalent to '-habc, -hwxyz'"); - appendPrefixToHandler (hPrefix); - - // create and append the trace options prefixes - S_oahPrefix - tracePrefix = - oahPrefix::create ( - "trace", - "trace-", - "'-trace=abc,yz' is equivalent to '-trace-abc, -trace-yz'"); - appendPrefixToHandler (tracePrefix); - - S_oahPrefix - tPrefix = - oahPrefix::create ( - "t", - "t", - "'-t=abc,wxyz' is equivalent to '-tabc, -twxyz'"); - appendPrefixToHandler (tPrefix); - - // create and append the omit options prefixes - S_oahPrefix - omitPrefix = - oahPrefix::create ( - "omit", - "omit-", - "'-omit=abc,yz' is equivalent to '-omit-abc, -omit-yz'"); - appendPrefixToHandler (omitPrefix); - - S_oahPrefix - oPrefix = - oahPrefix::create ( - "o", - "o", - "'-o=abc,wxyz' is equivalent to '-oabc, -owxyz'"); - appendPrefixToHandler (oPrefix); - - // create an xml2lyOah2ManPageGenerator - S_xml2lyOah2ManPageGenerator - generator = - xml2lyOah2ManPageGenerator::create ( - this, - gLogOstream, - gOutputOstream); - - // initialize the handler only now, since it may use prefixes - initializeXml2lyOptionsHandler ( - executableName, - generator); -} - -xml2lyOahHandler::~xml2lyOahHandler () -{} - -void xml2lyOahHandler::initializeXml2lyOptionsHandler ( - string executableName, - S_xml2lyOah2ManPageGenerator - theOah2ManPageGenerator) -{ - // initialize options handling, phase 1 - // ------------------------------------------------------ - -#ifdef TRACE_OAH - initializeTraceOahHandling ( - this); -#endif - - initializeOahOahHandling ( - executableName, - this); - - initializeGeneralOahHandling ( - this); - - // initialize the library - // ------------------------------------------------------ - - initializeMSR (); - initializeLPSR (); - - // initialize options handling, phase 2 - // ------------------------------------------------------ - - initializeMusicXMLOahHandling ( - this); - - initializeMsrOahHandling ( - this); - - initializeLpsrOahHandling ( - this); - - initializeLilypondOahHandling ( - this); - -#ifdef EXTRA_OAH - initializeExtraOahHandling ( - this); -#endif - - initializeXml2lyManPageOahHandling ( - this, - theOah2ManPageGenerator); - - initializeXml2lyOah ( - this); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - // print the options handler initial state - fHandlerLogOstream << - "xml2lyOahHandler has been initialized as:" << - endl; - - gIndenter++; - - print ( - fHandlerLogOstream); - fHandlerLogOstream << - endl << - endl; - - gIndenter--; - } -#endif - - // register options handler in itself, - // so that the 'global' help options can be handled - this-> - registerHandlerInItself (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - fHandlerLogOstream << - "xml2lyOahHandler help:" << - endl; - - this-> - printHelp ( - fHandlerLogOstream); - } -#endif -} - -void xml2lyOahHandler::checkOptionsAndArguments () -{ - unsigned int argumentsNumber = - fHandlerArgumentsVector.size (); - -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - if (argumentsNumber > 0) { - fHandlerLogOstream << - singularOrPluralWithoutNumber ( - argumentsNumber, "There is", "There are") << - " " << - argumentsNumber << - " " << - singularOrPluralWithoutNumber ( - argumentsNumber, "argument", "arguments") << - ":" << - endl; - - gIndenter++; - - for (unsigned int i = 0; i < argumentsNumber; i++) { - fHandlerLogOstream << - i << " : " << fHandlerArgumentsVector [i] << - endl; - } // for - - fHandlerLogOstream << endl; - - gIndenter--; - } - else { - fHandlerLogOstream << - "There are no arguments to " << - gOahOah->fHandlerExecutableName << - endl; - } - } -#endif - - // input source name - // ------------------------------------------------------ - - switch (argumentsNumber) { - case 0: - fHandlerLogOstream << - endl << - "Input file name or '-' for standard input expected" << - endl << - endl; - - exit (1); - break; - - case 1: - // register intput file name - gOahOah->fInputSourceName = - fHandlerArgumentsVector [0]; - break; - - default: - fHandlerLogOstream << - endl << - "Several input file name supplied, only the first one, \"" << - fHandlerArgumentsVector [0] << - "\", will be translated" << - endl << - endl; - - // register intput file name - gOahOah->fInputSourceName = - fHandlerArgumentsVector [0]; - break; - } // switch - - // build potential output file name - // ------------------------------------------------------ - - string potentialOutputFileName; - - if (gOahOah->fInputSourceName != "-") { - // determine potential output file name, - // may be set differently by '--ofn, --outputFileName' option - potentialOutputFileName = - baseName ( - gOahOah->fInputSourceName); - - // set '.ly' suffix - size_t - posInString = - potentialOutputFileName.rfind ('.'); - - if (posInString != string::npos) { - potentialOutputFileName.replace ( - posInString, - potentialOutputFileName.size () - posInString, - ".ly"); - } - } - - // check auto output file option usage - // ------------------------------------------------------ - - if (gXml2lyOah->fAutoOutputFileName) { - if (gXml2lyOah->fOutputFileName.size ()) { - stringstream s; - - s << - "options '-aofn, -auto-output-file-name' and '-o, -output-file-name'" << - endl << - "cannot be chosen simultaneously"; - - oahError (s.str ()); - } - - else if (gOahOah->fInputSourceName == "-") { - stringstream s; - - s << - "option '-aofn, -auto-output-file-name'" << - endl << - "cannot be used when reading from standard input"; - - oahError (s.str ()); - } - - else { - gXml2lyOah->fOutputFileName = - potentialOutputFileName; - } - } -} - -//______________________________________________________________________________ -void xml2lyOahHandler::enforceOahHandlerQuietness () -{ -#ifdef TRACE_OAH - gGeneralOah-> - enforceQuietness (); -#endif - - gGeneralOah-> - enforceQuietness (); - - gMusicXMLOah-> - enforceQuietness (); - - gMsrOah-> - enforceQuietness (); - - gLpsrOah-> - enforceQuietness (); - - gLilypondOah-> - enforceQuietness (); - -#ifdef EXTRA_OAH - gExtraOah-> - enforceQuietness (); -#endif - - gXml2lyOah-> - enforceQuietness (); -} - -//______________________________________________________________________________ -void xml2lyOah::enforceQuietness () -{} - -//______________________________________________________________________________ -void xml2lyOah::checkOptionsConsistency () -{} - -//______________________________________________________________________________ -void xml2lyOah::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyOah::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyOah::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2lyOah::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyOah::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyOah elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyOah::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2lyOah::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyOah::browseData ()" << - endl; - } -#endif - - oahGroup::browseData (v); - - /* - string fOutputFileName; - bool fAutoOutputFileName; - */ -} - -//______________________________________________________________________________ -void xml2lyOahHandler::print (ostream& os) const -{ - const int fieldWidth = 27; - - os << - "xml2lyOahHandler:" << - endl; - - gIndenter++; - - os << left << - setw (fieldWidth) << - "fShortName" << " : " << fShortName << - endl << - setw (fieldWidth) << - "fLongName" << " : " << fLongName << - endl << - setw (fieldWidth) << - "fDescription" << " : " << fDescription << - endl << - endl; - - os << - "Options groups (" << - singularOrPlural ( - fHandlerGroupsList.size (), "element", "elements") << - "):" << - endl; - - if (fHandlerGroupsList.size ()) { - os << endl; - - gIndenter++; - - list::const_iterator - iBegin = fHandlerGroupsList.begin (), - iEnd = fHandlerGroupsList.end (), - i = iBegin; - for ( ; ; ) { - // print the element - os << (*i); - if (++i == iEnd) break; - os << endl; - } // for - - gIndenter--; - } - - gIndenter--; - - os << endl; -} - -ostream& operator<< (ostream& os, const S_xml2lyOahHandler& elt) -{ - elt->print (os); - return os; -} - -//_______________________________________________________________________________ -S_xml2lyOah gXml2lyOah; - -S_xml2lyOah xml2lyOah::create ( - S_oahHandler handlerUpLink) -{ - xml2lyOah* o = new xml2lyOah ( - handlerUpLink); - assert(o!=0); - - return o; -} - -xml2lyOah::xml2lyOah ( - S_oahHandler handlerUpLink) - : oahGroup ( - "xml2ly", - "hxl", "help-xml2ly", -R"(Options that are used by xml2ly are grouped here.)", - kElementVisibilityAlways, - handlerUpLink) -{ - // append this options group to the options handler - // if relevant - if (handlerUpLink) { - handlerUpLink-> - prependGroupToHandler (this); - } - - // initialize it - initializeXml2lyOah (); -} - -xml2lyOah::~xml2lyOah () -{} - -void xml2lyOah::initializeXml2lyOah () -{ - // version - // -------------------------------------- - - { - S_oahSubGroup - versionSubGroup = - oahSubGroup::create ( - "Version", - "hxv", "help-xml2ly-version", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (versionSubGroup); - - // version - - versionSubGroup-> - appendAtomToSubGroup ( - xml2lyVersionOahAtom::create ( - "v", "version", -R"(Display xml2ly's version number and history.)")); - } - - // about - // -------------------------------------- - - { - S_oahSubGroup - aboutSubGroup = - oahSubGroup::create ( - "About", - "hxa", "help-xml2ly-about", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (aboutSubGroup); - - // about - - aboutSubGroup-> - appendAtomToSubGroup ( - xml2lyAboutOahAtom::create ( - "a", "about", -R"(Display information about xml2ly.)")); - } - - // contact - // -------------------------------------- - - { - S_oahSubGroup - contactSubGroup = - oahSubGroup::create ( - "Contact", - "hxc", "help-xml2ly-contact", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (contactSubGroup); - - // contact - - contactSubGroup-> - appendAtomToSubGroup ( - xml2lyContactOahAtom::create ( - "c", "contact", -R"(Display information about how to contacct xml2ly maintainers.)")); - } - - // output file - // -------------------------------------- - - { - S_oahSubGroup - outputFileSubGroup = - oahSubGroup::create ( - "Output file", - "hxof", "help-xml2ly-output-file", -R"()", - kElementVisibilityAlways, - this); - - appendSubGroupToGroup (outputFileSubGroup); - - // output filename - - outputFileSubGroup-> - appendAtomToSubGroup ( - oahStringAtom::create ( - "o", "output-file-name", -R"(Write LilyPond code to file FILENAME instead of standard output.)", - "FILENAME", - "outputFileName", - fOutputFileName)); - - // auto output filename - - fAutoOutputFileName = false; - - outputFileSubGroup-> - appendAtomToSubGroup ( - oahBooleanAtom::create ( - "aofn", "auto-output-file-name", -R"(This option can only be used when reading from a file. -Write LilyPond code to a file in the current working directory. -The file name is derived from that of the input file, -replacing any suffix after the the '.' by 'ly' -or adding '.ly' if none is present.)", - "autoOutputFileName", - fAutoOutputFileName)); - } -} - -//______________________________________________________________________________ -void xml2lyOah::printXml2lyOahValues (int fieldWidth) -{ - gLogOstream << - "The xml2ly options are:" << - endl; - - gIndenter++; - - // output file - // -------------------------------------- - - gLogOstream << left << - setw (fieldWidth) << "Output file:" << - endl; - - gIndenter++; - - gLogOstream << left << - setw (fieldWidth) << "outputFileName" << " : \"" << - fOutputFileName << - "\"" << - endl; - - gIndenter--; -} - -//______________________________________________________________________________ -void initializeXml2lyOah ( - S_oahHandler handler) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah && ! gGeneralOah->fQuiet) { - gLogOstream << - "Initializing xml2ly options handling" << - endl; - } -#endif - - // enlist versions information - // ------------------------------------------------------ - - enlistVersion ( - "Initial", "early 2016", - "Start as xml2lilypond, a clone of xml2guido"); - - enlistVersion ( - musicxml2lilypondVersionStr (), "October 2018", - "First draft version"); - - // create the options variables - // ------------------------------------------------------ - - gXml2lyOah = xml2lyOah::create ( - handler); - assert (gXml2lyOah != 0); -} - - -} diff --git a/src/lilypond/xml2lyOah.h b/src/lilypond/xml2lyOah.h deleted file mode 100644 index 2db14d446..000000000 --- a/src/lilypond/xml2lyOah.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2lyOah___ -#define ___xml2lyOah___ - -//#include "exports.h" - -//#include "xml2lyManPageOah.h" - -#include "xml2lyOah2ManPageGenerator.h" - - -namespace MusicXML2 -{ - -//_______________________________________________________________________________ -class EXP xml2lyOahHandler : public oahHandler -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string executableName, - indentedOstream& ios); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyOahHandler ( - string executableName, - indentedOstream& ios); - - virtual ~xml2lyOahHandler (); - - private: - - // initialization - // ------------------------------------------------------ - - void initializeXml2lyOptionsHandler ( - string executableName, - S_xml2lyOah2ManPageGenerator - theOah2ManPageGenerator); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceOahHandlerQuietness (); - - public: - - // services - // ------------------------------------------------------ - - void checkOptionsAndArguments (); - - public: - - // visitors - // ------------------------------------------------------ - - public: - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2lyOahHandler; -EXP ostream& operator<< (ostream& os, const S_xml2lyOahHandler& elt); - -//______________________________________________________________________________ -class xml2lyOah : public oahGroup -{ - public: - - static SMARTP create ( - S_oahHandler handlerUpLink); - - public: - - // initialisation - // ------------------------------------------------------ - - void initializeXml2lyOah (); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyOah ( - S_oahHandler handlerUpLink); - - virtual ~xml2lyOah (); - - public: - - // quiet mode - // ------------------------------------------------------ - - void enforceQuietness (); - - public: - - // consistency check - // ------------------------------------------------------ - - void checkOptionsConsistency (); - - public: - - // services - // ------------------------------------------------------ - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - public: - - // print - // ------------------------------------------------------ - - void printXml2lyOahHelp (); - - void printXml2lyOahValues (int fieldWidth); - - public: - - // output file - // -------------------------------------- - - string fOutputFileName; - bool fAutoOutputFileName; -}; -typedef SMARTP S_xml2lyOah; -EXP ostream& operator<< (ostream& os, const S_xml2lyOah& elt); - -EXP extern S_xml2lyOah gXml2lyOah; - -//______________________________________________________________________________ -void initializeXml2lyOah ( - S_oahHandler handler); - - -} - - -#endif diff --git a/src/lilypond/xml2lyOah2ManPageGenerator.cpp b/src/lilypond/xml2lyOah2ManPageGenerator.cpp deleted file mode 100644 index 27fcec0af..000000000 --- a/src/lilypond/xml2lyOah2ManPageGenerator.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include // setw, setprecision, ... -#include -#include - -#include "xml2lyOah2ManPageGenerator.h" - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "oahOah.h" - -#include "version.h" - -using namespace std; - -namespace MusicXML2 -{ - -//________________________________________________________________________ -S_xml2lyOah2ManPageGenerator xml2lyOah2ManPageGenerator::create ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) -{ - xml2lyOah2ManPageGenerator* o = new - xml2lyOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream); - assert(o!=0); - return o; -} - -xml2lyOah2ManPageGenerator::xml2lyOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream) - : oah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - basicOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - msrOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - lpsrOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - lilypondOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - extraOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream), - oahOah2ManPageGenerator ( - handler, - logOstream, - manPageOutputStream) -{} - -xml2lyOah2ManPageGenerator::~xml2lyOah2ManPageGenerator () -{} - -//________________________________________________________________________ -void xml2lyOah2ManPageGenerator::visitTheHandler () -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Running xml2lyOah2ManPageGenerator::visitTheHandler()" << - endl; - } -#endif - - if (fVisitedOahHandler) { - // browse the visited oahHandler - oahBrowser browser (this); - browser.browse (*fVisitedOahHandler); - } - else { - // visited handler is not well handled by this visitor - stringstream s; - - s << - "fVisitedOahHandler is null, cannot generate man page data"; - - oahError (s.str ()); - } -} - -//________________________________________________________________________ -void xml2lyOah2ManPageGenerator::visitStart (S_xml2lyVersionOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting xml2lyVersionOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - elt->fetchNamesBetweenParentheses () << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void xml2lyOah2ManPageGenerator::visitEnd (S_xml2lyVersionOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting xml2lyVersionOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void xml2lyOah2ManPageGenerator::visitStart (S_xml2lyAboutOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting xml2lyAboutOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << - "\\fB\\-" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void xml2lyOah2ManPageGenerator::visitEnd (S_xml2lyAboutOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting xml2lyAboutOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - -//________________________________________________________________________ -void xml2lyOah2ManPageGenerator::visitStart (S_xml2lyContactOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> Start visiting xml2lyContactOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -/* - fOah2ManPageOutputStream << - ".HP" << - endl << -// JMI "\\fB\\-" << - ".IT Fl e" << - replaceSubstringInString (elt->getShortName (), "-", "\\-") << - "\\fR, " << - "\\fB\\-" << - replaceSubstringInString (elt->getLongName (), "-", "\\-") << - "\\fR, " << - endl << - - ".IP" << - endl << - elt->getDescription () << - endl; - */ -} - -void xml2lyOah2ManPageGenerator::visitEnd (S_xml2lyContactOahAtom& elt) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - fOah2ManPageLogOstream << - endl << - ".\\\" --> End visiting xml2lyContactOahAtom" << - " \"" << elt->fetchNames () << "\"" << - endl; - } -#endif -} - - -} // namespace diff --git a/src/lilypond/xml2lyOah2ManPageGenerator.h b/src/lilypond/xml2lyOah2ManPageGenerator.h deleted file mode 100644 index d271f0f01..000000000 --- a/src/lilypond/xml2lyOah2ManPageGenerator.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2lyOah2ManPageGenerator___ -#define ___xml2lyOah2ManPageGenerator___ - -#include "basicOah2ManPageGenerator.h" -#include "msrOah2ManPageGenerator.h" -#include "lpsrOah2ManPageGenerator.h" -#include "lilypondOah2ManPageGenerator.h" -#include "extraOah2ManPageGenerator.h" -#include "oahOah2ManPageGenerator.h" - -#include "xml2lyOahTypes.h" - - -namespace MusicXML2 -{ - -//________________________________________________________________________ -class xml2lyOah2ManPageGenerator : - - // aggregate needed components' visitors - virtual public basicOah2ManPageGenerator, - virtual public msrOah2ManPageGenerator, - virtual public lpsrOah2ManPageGenerator, - virtual public lilypondOah2ManPageGenerator, - virtual public extraOah2ManPageGenerator, - virtual public oahOah2ManPageGenerator, - - // this man page generator's own visitors - public visitor, - - public visitor, - - public visitor - -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - public: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyOah2ManPageGenerator ( - const S_oahHandler handler, - indentedOstream& logOstream, - ostream& manPageOutputStream); - - virtual ~xml2lyOah2ManPageGenerator (); - - protected: - - // protected services - // ------------------------------------------------------ - - virtual void visitStart (S_xml2lyVersionOahAtom& elt); - virtual void visitEnd (S_xml2lyVersionOahAtom& elt); - - virtual void visitStart (S_xml2lyContactOahAtom& elt); - virtual void visitEnd (S_xml2lyContactOahAtom& elt); - - virtual void visitStart (S_xml2lyAboutOahAtom& elt); - virtual void visitEnd (S_xml2lyAboutOahAtom& elt); - - public: - - // public services - // ------------------------------------------------------ - - virtual void visitTheHandler (); - - private: - - // private fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2lyOah2ManPageGenerator; - - -} - - -#endif diff --git a/src/lilypond/xml2lyOahTypes.cpp b/src/lilypond/xml2lyOahTypes.cpp deleted file mode 100644 index 2adddea20..000000000 --- a/src/lilypond/xml2lyOahTypes.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#include "setTraceOahIfDesired.h" -#ifdef TRACE_OAH - #include "traceOah.h" -#endif - -#include "oahOah.h" - -#include "xml2lyOahTypes.h" - -#include "version.h" - - -using namespace std; - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -S_xml2lyVersionOahAtom xml2lyVersionOahAtom::create ( - string shortName, - string longName, - string description) -{ - xml2lyVersionOahAtom* o = new - xml2lyVersionOahAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -xml2lyVersionOahAtom::xml2lyVersionOahAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -xml2lyVersionOahAtom::~xml2lyVersionOahAtom () -{} - -S_oahValuedAtom xml2lyVersionOahAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2lyVersionOahAtom" << - endl; - } -#endif - - // handle it at once - printVersion (os); - - // no option value is needed - return nullptr; -} - -void xml2lyVersionOahAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyVersionOahAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyVersionOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyVersionOahAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2lyVersionOahAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyVersionOahAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyVersionOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyVersionOahAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2lyVersionOahAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyVersionOahAtom::browseData ()" << - endl; - } -#endif -} - -void xml2lyVersionOahAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2lyVersionOahAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2lyVersionOahAtom::printVersion (ostream& os) const -{ - os << - endl << - "This is xml2ly" << - " version " << currentVersionNumber () << - endl << - endl; - - // print versions history - printVersionsHistory (os); - - // register 'print version' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2lyVersionOahAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2lyVersionOahAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_xml2lyAboutOahAtom xml2lyAboutOahAtom::create ( - string shortName, - string longName, - string description) -{ - xml2lyAboutOahAtom* o = new - xml2lyAboutOahAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -xml2lyAboutOahAtom::xml2lyAboutOahAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -xml2lyAboutOahAtom::~xml2lyAboutOahAtom () -{} - -S_oahValuedAtom xml2lyAboutOahAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2lyAboutOahAtom" << - endl; - } -#endif - - // handle it at once - printAbout (os); - - // no option value is needed - return nullptr; -} - -void xml2lyAboutOahAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyAboutOahAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyAboutOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyAboutOahAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2lyAboutOahAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyAboutOahAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyAboutOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyAboutOahAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2lyAboutOahAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyAboutOahAtom::browseData ()" << - endl; - } -#endif -} - -void xml2lyAboutOahAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2lyAboutOahAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2lyAboutOahAtom::printAbout (ostream& os) const -{ - os << - endl << -R"(What xml2ly does: - - This multi-pass translator basically performs 5 passes: - Pass 1: reads the contents of MusicXMLFile or stdin ('-') - and converts it to a MusicXML tree; - Pass 2a: converts that MusicXML tree into to - a Music Score Representation (MSR) skeleton; - Pass 2b: converts that tree and the skeleton into a - Music Score Representation (MSR); - Pass 3: converts the MSR into a - LilyPond Score Representation (LPSR); - Pass 4: converts the LPSR to LilyPond source code - and writes it to standard output. - - Other passes are performed according to the options, such as - printing views of the internal data or printing a summary of the score. - - The activity log and warning/error messages go to standard error.)" << - endl; - - // register 'print about' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2lyAboutOahAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2lyAboutOahAtom& elt) -{ - elt->print (os); - return os; -} - -//______________________________________________________________________________ -S_xml2lyContactOahAtom xml2lyContactOahAtom::create ( - string shortName, - string longName, - string description) -{ - xml2lyContactOahAtom* o = new - xml2lyContactOahAtom ( - shortName, - longName, - description); - assert(o!=0); - return o; -} - -xml2lyContactOahAtom::xml2lyContactOahAtom ( - string shortName, - string longName, - string description) - : oahAtom ( - shortName, - longName, - description) -{} - -xml2lyContactOahAtom::~xml2lyContactOahAtom () -{} - -S_oahValuedAtom xml2lyContactOahAtom::handleOptionUnderName ( - string optionName, - ostream& os) -{ -#ifdef TRACE_OAH - if (gTraceOah->fTraceOah) { - gLogOstream << - "==> option '" << optionName << "' is a xml2lyContactOahAtom" << - endl; - } -#endif - - // handle it at once - printContact (os); - - // no option value is needed - return nullptr; -} - -void xml2lyContactOahAtom::acceptIn (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyContactOahAtom::acceptIn ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyContactOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyContactOahAtom::visitStart ()" << - endl; - } -#endif - p->visitStart (elem); - } -} - -void xml2lyContactOahAtom::acceptOut (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyContactOahAtom::acceptOut ()" << - endl; - } -#endif - - if (visitor* - p = - dynamic_cast*> (v)) { - S_xml2lyContactOahAtom elem = this; - -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> Launching xml2lyContactOahAtom::visitEnd ()" << - endl; - } -#endif - p->visitEnd (elem); - } -} - -void xml2lyContactOahAtom::browseData (basevisitor* v) -{ -#ifdef TRACE_OAH - if (gOahOah->fTraceOahVisitors) { - gLogOstream << - ".\\\" ==> xml2lyContactOahAtom::browseData ()" << - endl; - } -#endif -} - -void xml2lyContactOahAtom::print (ostream& os) const -{ - const int fieldWidth = K_OAH_FIELD_WIDTH; - - os << - "xml2lyContactOahAtom:" << - endl; - - gIndenter++; - - oahElement::printOptionEssentials ( - os, fieldWidth); - - gIndenter++; - os << - gIndenter.indentMultiLineString ( - fDescription) << - endl; - gIndenter--; - - gIndenter--; -} - -void xml2lyContactOahAtom::printContact (ostream& os) const -{ - os << - endl << -R"(To contact xml2ly maintainers: - - Send a mail to mailto:lilypond-user@gnu.org describing the problem - and error messages you obtain if relevant.)" << - endl; - - // register 'print contact' action in options groups's options handler upLink - fSubGroupUpLink-> - getGroupUpLink ()-> - getHandlerUpLink ()-> - setOptionsHandlerFoundAHelpOption (); -} - -void xml2lyContactOahAtom::printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const -{ - // nothing to print here -} - -ostream& operator<< (ostream& os, const S_xml2lyContactOahAtom& elt) -{ - elt->print (os); - return os; -} - - -} diff --git a/src/lilypond/xml2lyOahTypes.h b/src/lilypond/xml2lyOahTypes.h deleted file mode 100644 index eb3cadb05..000000000 --- a/src/lilypond/xml2lyOahTypes.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - MusicXML Library - Copyright (C) Grame 2006-2013 - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - - Grame Research Laboratory, 11, cours de Verdun Gensoul 69002 Lyon - France - research@grame.fr -*/ - -#ifndef ___xml2lyOahTypes___ -#define ___xml2lyOahTypes___ - -#include "oahBasicTypes.h" - - -namespace MusicXML2 -{ - -//______________________________________________________________________________ -class xml2lyVersionOahAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyVersionOahAtom ( - string shortName, - string longName, - string description); - - virtual ~xml2lyVersionOahAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printVersion (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2lyVersionOahAtom; -EXP ostream& operator<< (ostream& os, const S_xml2lyVersionOahAtom& elt); - -//______________________________________________________________________________ -class xml2lyAboutOahAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyAboutOahAtom ( - string shortName, - string longName, - string description); - - virtual ~xml2lyAboutOahAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printAbout (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2lyAboutOahAtom; -EXP ostream& operator<< (ostream& os, const S_xml2lyAboutOahAtom& elt); - -//______________________________________________________________________________ -class xml2lyContactOahAtom : public oahAtom -{ - public: - - // creation - // ------------------------------------------------------ - - static SMARTP create ( - string shortName, - string longName, - string description); - - protected: - - // constructors/destructor - // ------------------------------------------------------ - - xml2lyContactOahAtom ( - string shortName, - string longName, - string description); - - virtual ~xml2lyContactOahAtom (); - - public: - - // set and get - // ------------------------------------------------------ - - public: - - // services - // ------------------------------------------------------ - - S_oahValuedAtom handleOptionUnderName ( - string optionName, - ostream& os); - - public: - - // visitors - // ------------------------------------------------------ - - virtual void acceptIn (basevisitor* v); - virtual void acceptOut (basevisitor* v); - - virtual void browseData (basevisitor* v); - - // print - // ------------------------------------------------------ - - void print (ostream& os) const; - - void printContact (ostream& os) const; - - void printAtomOptionsValues ( - ostream& os, - int valueFieldWidth) const; - - private: - - // fields - // ------------------------------------------------------ -}; -typedef SMARTP S_xml2lyContactOahAtom; -EXP ostream& operator<< (ostream& os, const S_xml2lyContactOahAtom& elt); - - -} - - -#endif diff --git a/validation/Makefile b/validation/Makefile index eb6bd3692..3728b5d40 100644 --- a/validation/Makefile +++ b/validation/Makefile @@ -8,64 +8,25 @@ system := $(shell echo $(system) | grep MINGW > /dev/null && echo MINGW || echo version ?= $(shell cat libmusicxmlversion.txt) xmlfiles = $(shell find ../files -name "*.xml") -xmlfilesforlilyshouldfail = $(shell find ../files -name "*.xml" | grep shouldfail) -xmlfilesforlilyjianpu = $(shell find ../files -name "*.xml" | grep jianpu) -jianpuincludefilename = "jianpu10a.ly" -jianpuinclude = $(shell find ../files -name $(jianpuincludefilename)") -xmlfilesforbrl = $(shell find ../files -name "*.xml" | grep braille) readout := $(patsubst ../%.xml, $(version)/read/%.xml, $(xmlfiles)) gmnout := $(patsubst ../%.xml, $(version)/gmn/%.gmn, $(xmlfiles)) guidosvg := $(patsubst ../%.xml, $(version)/guidosvg/%.svg, $(xmlfiles)) -lilyshouldfailout := $(patsubst ../%.xml, $(version)/lilyshouldfail/%.ly, $(xmlfilesforlilyshouldfail)) -lilyout := $(patsubst ../%.xml, $(version)/lilypond/%.ly, $(xmlfiles)) -lilypdf := $(patsubst ../%.xml, $(version)/lilypdf/%.pdf, $(xmlfiles)) -lilypng := $(patsubst ../%.xml, $(version)/lilypng/%.png, $(xmlfiles)) -lilymidi := $(patsubst ../%.xml, $(version)/lilypdf/%.midi, $(xmlfiles)) -lilyjianpuout := $(patsubst ../%.xml, $(version)/lilyjianpu/%.ly, $(xmlfilesforlilyjianpu)) -lilyjianpupdf := $(patsubst ../%.xml, $(version)/lilyjianpupdf/%.pdf, $(xmlfilesforlilyjianpu)) -lilyjianpumidi := $(patsubst ../%.xml, $(version)/lilyjianpupdf/%.midi, $(xmlfilesforlilyjianpu)) -brlout := $(patsubst ../%.xml, $(version)/braille/%.brl, $(xmlfilesforbrl)) validxml = $(patsubst %.xml, %.outxml, $(readout)) validgmn = $(patsubst %.gmn, %.outgmn, $(gmnout)) -validlilyshouldfail = $(patsubst %.ly, %.outlilyshouldfail, $(lilyshouldfailout)) -validlily = $(patsubst %.ly, %.outly, $(lilyout)) validguidosvg = $(patsubst %.svg, %.outsvg, $(guidosvg)) -validlilypdf = $(patsubst %.pdf, %.outpdf, $(lilypdf)) -validlilypng = $(patsubst %.png, %.outpng, $(lilypng)) -validlilyjianpu = $(patsubst %.ly, %.outlilyjianpu, $(lilyjianpuout)) -validlilyjianpupdf = $(patsubst %.ly, %.outlilyjianpupdf, $(lilyjianpupdf)) -validbrl = $(patsubst %.brl, %.outbrl, $(brlout)) XML2GUIDO ?= xml2guido -XML2LY ?= xml2ly -XML2BRL ?= xml2brl XMLREAD ?= xmlread MAKE ?= make -.PHONY: read guido lilyshouldfail lily lilyjianpu brl +.PHONY: read guido .DELETE_ON_ERROR: all: $(MAKE) read $(MAKE) guido - $(MAKE) lilyshouldfail - $(MAKE) lily - $(MAKE) lilypdf - $(MAKE) lilypng - $(MAKE) lilyjianpu - $(MAKE) lilyjianpupdf -# $(MAKE) brl - -clean: - $(MAKE) lilyshouldfailclean - $(MAKE) lilyclean - $(MAKE) lilypdfclean - $(MAKE) lilypngclean - $(MAKE) lilyjianpuclean - $(MAKE) lilyjianpupdfclean -# $(MAKE) brlclean travis: $(MAKE) read @@ -78,18 +39,10 @@ help: @echo "Makefile for testing the libmusicxml library output." @echo "Testing is based on the xml files located in the 'files' folder." @echo "Available targets are:" - @echo " 'all' (default) : call the 'read', 'guido', 'lilyshouldfail', 'lily' and 'lilyjianpu' targets." + @echo " 'all' (default) : call the 'read' and 'guido' targets." @echo " 'read' : reads the set of xml files and writes the corresponding output" @echo " 'guido' : converts the set of xml files to guido" @echo " 'guidosvg' : converts the output of 'guido' target to svg" - @echo " 'lilyshouldfail' : converts a subset of xml files to lilypond, but fails as expected" - @echo " 'lily' : converts the set of xml files to lilypond" - @echo " 'lilypng' : converts the output of 'lily' target to png" - @echo " 'lilypdf' : converts the output of 'lily' target to pdf" - @echo " 'lilyjianpu' : converts the a subset of xml files to lilypond code using $(jianpuinclude)" - @echo " 'lilyjianpupdf ' : converts the output of 'lilyjianpu' target to pdf" - @echo " 'lilyjianpupng' : converts the output of 'lilyjianpu' target to png" -# @echo " 'brl' : converts a subset of xml files to BRF (Braille Ready Format) music" @echo "Output files are written to the $(version) folder, " @echo "where $(version) is taken from the libmusicxmlversion.txt file that you can freely change." @echo @@ -99,8 +52,6 @@ help: @echo @echo "Options:" @echo " 'XML2GUIDO=/path/to/xml2guido" - @echo " 'XML2LY=/path/to/xml2ly" -# @echo " 'XML2BRL=/path/to/xml2brl" @echo " 'XMLREAD=/path/to/xmlread" @echo "when the above variables are not specified, the tools are taken from the current PATH env." @@ -126,127 +77,16 @@ guidosvg: doguidosvg: $(guidosvg) -######################################################################### -lilyshouldfail: - @echo "xmlfilesforlilyshouldfail: " $(xmlfilesforlilyshouldfail) - @echo "lilyshouldfailout: " $(lilyshouldfailout) - @which $(XML2LY) > /dev/null || (echo "### xml2ly (part of samples) must be available from your PATH."; false;) - $(MAKE) dolilyshouldfail - -dolilyshouldfail: $(lilyshouldfailout) - -######################################################################### -lilyshouldfailclean: - rm $(lilyshouldfailout) - -######################################################################### -lily: - @which $(XML2LY) > /dev/null || (echo "### xml2ly (part of samples) must be available from your PATH."; false;) - $(MAKE) dolily - -dolily: $(lilyout) - -######################################################################### -lilyclean: - @echo "lilyout = " $(lilyout) ", " $(shell wc < echo $(lilyout)) - rm $(lilyout) - -######################################################################### -lilypdf: - @which lilypond || (echo "### lilypond must be available from your PATH."; false;) - $(MAKE) lily - $(MAKE) dolilypdf - -dolilypdf: $(lilypdf) - -######################################################################### -lilypdfclean: - @echo "lilypdf = " $(lilypdf) ", " $(shell wc < echo $(lilypdf)) - @echo "lilymidi = " $(lilymidi) ", " $(shell wc < echo $(lilymidi)) - rm $(lilypdf) - rm $(lilymidi) - -######################################################################### -lilypng: - @which lilypond || (echo "### lilypond must be available from your PATH."; false;) - $(MAKE) lily - $(MAKE) dolilypng - -dolilypng: $(lilypng) - -######################################################################### -lilypngclean: - @echo "lilypng = " $(lilypng) ", " $(shell wc < echo $(lilypng)) - rm $(lilypng) - rm $(lilymidi) - -######################################################################### -lilyjianpu: - @which $(XML2LY) > /dev/null || (echo "### xml2ly (part of samples) must be available from your PATH."; false;) - $(MAKE) dolilyjianpu - @ls -sal $(lilyjianpuout) - -dolilyjianpu: $(lilyjianpuout) - -######################################################################### -lilyjianpuclean: - @echo "lilyjianpupdf = " $(lilyjianpupdf) ", " $(shell wc < echo $(lilyjianpupdf)) - @echo "lilyjianpumidi = " $(lilyjianpumidi) ", " $(shell wc < echo $(lilyjianpumidi)) - rm $(lilyjianpuout) - -######################################################################### -lilyjianpupdf: - $(MAKE) lilyjianpu - @echo "jianpuinclude: " $(jianpuinclude) - @test "z${jianpuinclude}" != "z" || (echo "### $(jianpuincludefilename) not found in the validation directory."; false;) - @echo "lilyjianpupdf = " $(lilyjianpupdf) ", " $(shell wc < echo $(lilyjianpupdf)) - @which lilypond || (echo "### lilypond must be available from your PATH."; false;) - $(MAKE) dolilyjianpupdf - -dolilyjianpupdf: $(lilyjianpupdf) - -######################################################################### -lilyjianpupdfclean: - @echo "lilyjianpupdf = " $(lilyjianpupdf) ", " $(shell wc < echo $(lilyjianpupdf)) - @echo "lilyjianpumidi = " $(lilyjianpumidi) ", " $(shell wc < echo $(lilyjianpumidi)) - rm $(lilyjianpupdf) - rm $(lilyjianpumidi) - -######################################################################### -brl: - @echo "xmlfilesforbrl: " $(xmlfilesforbrl) - @echo "brlout: " $(brlout) - @which $(XML2LY) > /dev/null || (echo "### xml2ly (part of samples) must be available from your PATH."; false;) - $(MAKE) dobrl - -dobrl: $(brlout) - -######################################################################### -brlclean: - @echo "brlout = " $(brlout) ", " $(shell wc < echo $(brlout)) - rm $(brlout) - ######################################################################### validate: @echo Validating version $(version) with $(VERSION) $(tmp) $(MAKE) validxml $(MAKE) validgmn - $(MAKE) validlilyshouldfail - $(MAKE) validlily - $(MAKE) validlilyjianpu -# $(MAKE) validbrl validxml: $(validxml) validgmn: $(validgmn) -validlilyshouldfail: $(validlilyshouldfail) - -validlily: $(validlily) - -validlilyjianpu: $(validlilyjianpu) - -validbrl: $(validbrl) ######################################################################### # rules for xmlread @@ -266,47 +106,6 @@ $(version)/guidosvg/%.svg: $(version)/gmn/%.gmn @[ -d $(@D) ] || mkdir -p $(@D) guido2svg -o $@ $< -######################################################################### -# rules for xml2ly -$(version)/lilypond/%.ly: ../%.xml - @[ -d $(@D) ] || mkdir -p $(@D) - $(XML2LY) -q -o $@ $< - -$(version)/lilyshouldfail/%.ly: ../%.xml - @[ -d $(@D) ] || mkdir -p $(@D) - $(XML2LY) -q -o $@ $< || true - -######################################################################### -# rules for lilypond with pdf output -$(version)/lilypdf/%.pdf: $(version)/lilypond/%.ly - @[ -d $(@D) ] || mkdir -p $(@D) - lilypond --pdf -l NONE -s -o $(basename $@) $< - -######################################################################### -# rules for lilypond with png output -$(version)/lilypng/%.png: $(version)/lilypond/%.ly - @[ -d $(@D) ] || mkdir -p $(@D) - lilypond --png -l NONE -s -o $(basename $@) $< - -######################################################################### -# rules for lilypond with jianpu inclusion in output -$(version)/lilyjianpu/%.ly: ../%.xml - @[ -d $(@D) ] || mkdir -p $(@D) - $(XML2LY) -q -jianpu -o $@ $< - -######################################################################### -# rules for lilypond pdf output in jianpu notation -$(version)/lilyjianpupdf/%.pdf: $(version)/lilyjianpu/%.ly - @[ -d $(@D) ] || mkdir -p $(@D) - cp -p $(jianpuinclude) $(@D) - lilypond --pdf -l NONE -s -o $(basename $@) $< - -######################################################################### -# rules for xml2brl -$(version)/braille/%.brl: ../%.xml - @[ -d $(@D) ] || mkdir -p $(@D) - $(XML2BRL) -q -o $@ $< - ######################################################################### # rules for xml output validation %.outxml: %.xml @@ -319,17 +118,3 @@ $(version)/braille/%.brl: ../%.xml @[ -f $(tmp) ] || echo $< : new file @diff $< $(tmp) 2>/dev/null >/dev/null || ([ -f $(tmp) ] && echo "open -t $< $(patsubst $(version)/%, $(VERSION)/%, $<) # to check changes"; true) -%.outly: %.ly - $(eval tmp := $(patsubst $(version)/%, $(VERSION)/%, $<)) - @[ -f $(tmp) ] || echo $< : new file - @diff $< $(tmp) 2>/dev/null >/dev/null || ([ -f $(tmp) ] && echo "open -t $< $(patsubst $(version)/%, $(VERSION)/%, $<) # to check changes"; true) - -%.outlilyjianpu: %.ly - $(eval tmp := $(patsubst $(version)/%, $(VERSION)/%, $<)) - @[ -f $(tmp) ] || echo $< : new file - @diff $< $(tmp) 2>/dev/null >/dev/null || ([ -f $(tmp) ] && echo "open -t $< $(patsubst $(version)/%, $(VERSION)/%, $<) # to check changes"; true) - -%.outbrl: %.brl - $(eval tmp := $(patsubst $(version)/%, $(VERSION)/%, $<)) - @[ -f $(tmp) ] || echo $< : new file - @diff $< $(tmp) 2>/dev/null >/dev/null || ([ -f $(tmp) ] && echo "open -t $< $(patsubst $(version)/%, $(VERSION)/%, $<) # to check changes"; true) From e7fe2c781892c90be0b2151f77f2282de722e38f Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Mon, 5 Apr 2021 07:37:58 +0200 Subject: [PATCH 094/164] remove old and obsolete projects --- linux/Makefile | 414 ----------- win32/codeblocks/libmusicxml.workspace | 9 - .../codeblocks/libmusicxml2/libmusicxml2.cbp | 129 ---- win32/codeblocks/randomMusic/randomMusic.cbp | 48 -- win32/codeblocks/transpose/transpose.cbp | 50 -- win32/codeblocks/xml2guido/xml2guido.cbp | 50 -- win32/devc++/countnotes.dev | 59 -- win32/devc++/libmusicxml.dev | 700 ------------------ win32/devc++/libmusicxml_private.h | 23 - win32/devc++/partsummary.dev | 59 -- win32/devc++/randomMusic.dev | 59 -- win32/devc++/transpose.dev | 59 -- win32/devc++/xml2guido.dev | 59 -- win32/devc++/xml2lilypond.dev | 59 -- win32/devc++/xml2midi.dev | 59 -- win32/devc++/xmlclone.dev | 59 -- win32/devc++/xmliter.dev | 59 -- win32/devc++/xmlread.dev | 59 -- 18 files changed, 2013 deletions(-) delete mode 100644 linux/Makefile delete mode 100644 win32/codeblocks/libmusicxml.workspace delete mode 100644 win32/codeblocks/libmusicxml2/libmusicxml2.cbp delete mode 100644 win32/codeblocks/randomMusic/randomMusic.cbp delete mode 100644 win32/codeblocks/transpose/transpose.cbp delete mode 100644 win32/codeblocks/xml2guido/xml2guido.cbp delete mode 100644 win32/devc++/countnotes.dev delete mode 100644 win32/devc++/libmusicxml.dev delete mode 100644 win32/devc++/libmusicxml_private.h delete mode 100644 win32/devc++/partsummary.dev delete mode 100644 win32/devc++/randomMusic.dev delete mode 100644 win32/devc++/transpose.dev delete mode 100644 win32/devc++/xml2guido.dev delete mode 100644 win32/devc++/xml2lilypond.dev delete mode 100644 win32/devc++/xml2midi.dev delete mode 100644 win32/devc++/xmlclone.dev delete mode 100644 win32/devc++/xmliter.dev delete mode 100644 win32/devc++/xmlread.dev diff --git a/linux/Makefile b/linux/Makefile deleted file mode 100644 index 80370df73..000000000 --- a/linux/Makefile +++ /dev/null @@ -1,414 +0,0 @@ -subprojects := ../src/elements ../src/guido ../src/interface ../src/files ../src/lib ../src/parser ../src/operations ../src/visitors - -SRC = $(wildcard ../src/*.cpp) $(wildcard ../src/*/*.cpp) -APPSRC = $(wildcard ../samples/*.cpp) -OBJ = $(SRC:.cpp=.o) - -VPATH = $(subprojects) - -CXXFLAGS := -g -O3 -Wall -Wuninitialized $(addprefix -I, $(subprojects)) - -lib := libmusicxml2.a - -all : $(lib) samples - -samples : - make -C ../samples - -$(lib): $(OBJ) - ar cru $(lib) $(OBJ) - ranlib $(lib) - -clean : -# JMI rm -f $(lib) $(OBJ) - rm -f $(OBJ) - -dep: - makedepend -- $(CXXFLAGS) -- $(SRC) - - -# DO NOT DELETE - -../src/elements/factory.o: ../src/elements/elements.h -../src/elements/factory.o: ../src/elements/factory.h ../src/lib/functor.h -../src/elements/factory.o: ../src/lib/singleton.h ../src/elements/xml.h -../src/elements/factory.o: ../src/elements/exports.h ../src/lib/ctree.h -../src/elements/factory.o: ../src/lib/smartpointer.h -../src/elements/factory.o: ../src/visitors/visitable.h -../src/elements/factory.o: ../src/visitors/basevisitor.h -../src/elements/factory.o: ../src/elements/types.h ../src/visitors/visitor.h -../src/elements/unrolled_xml_tree_browser.o: ../src/elements/unrolled_xml_tree_browser.h -../src/elements/unrolled_xml_tree_browser.o: ../src/visitors/visitor.h -../src/elements/unrolled_xml_tree_browser.o: ../src/visitors/basevisitor.h -../src/elements/unrolled_xml_tree_browser.o: ../src/elements/xml.h -../src/elements/unrolled_xml_tree_browser.o: ../src/elements/exports.h -../src/elements/unrolled_xml_tree_browser.o: ../src/lib/ctree.h -../src/elements/unrolled_xml_tree_browser.o: ../src/lib/smartpointer.h -../src/elements/unrolled_xml_tree_browser.o: ../src/visitors/visitable.h -../src/elements/unrolled_xml_tree_browser.o: ../src/lib/browser.h -../src/elements/unrolled_xml_tree_browser.o: ../src/elements/typedefs.h -../src/elements/unrolled_xml_tree_browser.o: ../src/elements/elements.h -../src/elements/unrolled_xml_tree_browser.o: ../src/elements/types.h -../src/elements/versions.o: ../src/elements/versions.h -../src/elements/versions.o: ../src/elements/exports.h -../src/elements/xml.o: /usr/include/stdlib.h /usr/include/available.h -../src/elements/xml.o: /usr/include/_types.h /usr/include/sys/_types.h -../src/elements/xml.o: /usr/include/sys/cdefs.h /usr/include/machine/_types.h -../src/elements/xml.o: /usr/include/ppc/_types.h /usr/include/sys/wait.h -../src/elements/xml.o: /usr/include/sys/signal.h -../src/elements/xml.o: /usr/include/sys/appleapiopts.h -../src/elements/xml.o: /usr/include/machine/signal.h -../src/elements/xml.o: /usr/include/ppc/signal.h /usr/include/ppc/_structs.h -../src/elements/xml.o: /usr/include/sys/_structs.h -../src/elements/xml.o: /usr/include/machine/_structs.h -../src/elements/xml.o: /usr/include/sys/resource.h -../src/elements/xml.o: /usr/include/machine/endian.h -../src/elements/xml.o: /usr/include/ppc/endian.h /usr/include/sys/_endian.h -../src/elements/xml.o: /usr/include/alloca.h /usr/include/machine/types.h -../src/elements/xml.o: /usr/include/ppc/types.h ../src/elements/xml.h -../src/elements/xml.o: ../src/elements/exports.h ../src/lib/ctree.h -../src/elements/xml.o: ../src/lib/smartpointer.h ../src/visitors/visitable.h -../src/elements/xml.o: ../src/visitors/basevisitor.h -../src/elements/xml.o: ../src/visitors/visitor.h -../src/elements/xml_tree_browser.o: ../src/elements/xml_tree_browser.h -../src/elements/xml_tree_browser.o: ../src/lib/tree_browser.h -../src/elements/xml_tree_browser.o: ../src/elements/exports.h -../src/elements/xml_tree_browser.o: ../src/visitors/basevisitor.h -../src/elements/xml_tree_browser.o: ../src/lib/browser.h ../src/lib/ctree.h -../src/elements/xml_tree_browser.o: ../src/lib/smartpointer.h -../src/elements/xml_tree_browser.o: ../src/visitors/visitable.h -../src/elements/xml_tree_browser.o: ../src/elements/xml.h -../src/files/xmlfile.o: ../src/files/xmlfile.h ../src/elements/exports.h -../src/files/xmlfile.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/files/xmlfile.o: ../src/lib/smartpointer.h ../src/visitors/visitable.h -../src/files/xmlfile.o: ../src/visitors/basevisitor.h -../src/files/xmlfile.o: ../src/visitors/xmlvisitor.h -../src/files/xmlfile.o: ../src/lib/tree_browser.h ../src/lib/browser.h -../src/files/xmlfile.o: ../src/elements/typedefs.h ../src/elements/elements.h -../src/files/xmlfile.o: ../src/elements/types.h ../src/visitors/visitor.h -../src/files/xmlreader.o: ../src/files/xmlreader.h /usr/include/stdio.h -../src/files/xmlreader.o: /usr/include/_types.h /usr/include/sys/_types.h -../src/files/xmlreader.o: /usr/include/sys/cdefs.h -../src/files/xmlreader.o: /usr/include/machine/_types.h -../src/files/xmlreader.o: /usr/include/ppc/_types.h ../src/elements/exports.h -../src/files/xmlreader.o: ../src/files/xmlfile.h ../src/elements/xml.h -../src/files/xmlreader.o: ../src/lib/ctree.h ../src/lib/smartpointer.h -../src/files/xmlreader.o: ../src/visitors/visitable.h -../src/files/xmlreader.o: ../src/visitors/basevisitor.h -../src/files/xmlreader.o: ../src/parser/reader.h ../src/elements/factory.h -../src/files/xmlreader.o: ../src/lib/functor.h ../src/lib/singleton.h -../src/guido/guido.o: ../src/guido/guido.h ../src/elements/exports.h -../src/guido/guido.o: ../src/lib/smartpointer.h -../src/guido/xml2guidovisitor.o: ../src/visitors/partsummary.h -../src/guido/xml2guidovisitor.o: ../src/visitors/notevisitor.h -../src/guido/xml2guidovisitor.o: ../src/lib/conversions.h -../src/guido/xml2guidovisitor.o: ../src/elements/exports.h -../src/guido/xml2guidovisitor.o: ../src/lib/rational.h ../src/lib/bimap.h -../src/guido/xml2guidovisitor.o: ../src/elements/typedefs.h -../src/guido/xml2guidovisitor.o: ../src/elements/elements.h -../src/guido/xml2guidovisitor.o: ../src/elements/types.h -../src/guido/xml2guidovisitor.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/guido/xml2guidovisitor.o: ../src/lib/smartpointer.h -../src/guido/xml2guidovisitor.o: ../src/visitors/visitable.h -../src/guido/xml2guidovisitor.o: ../src/visitors/basevisitor.h -../src/guido/xml2guidovisitor.o: ../src/visitors/visitor.h -../src/guido/xml2guidovisitor.o: ../src/lib/smartlist.h -../src/guido/xml2guidovisitor.o: ../src/elements/xml_tree_browser.h -../src/guido/xml2guidovisitor.o: ../src/lib/tree_browser.h -../src/guido/xml2guidovisitor.o: ../src/lib/browser.h -../src/guido/xml2guidovisitor.o: ../src/guido/xml2guidovisitor.h -../src/guido/xml2guidovisitor.o: ../src/guido/guido.h -../src/guido/xml2guidovisitor.o: ../src/guido/xmlpart2guido.h -../src/guido/xml2guidovisitor.o: ../src/visitors/clefvisitor.h -../src/guido/xml2guidovisitor.o: ../src/visitors/keysignvisitor.h -../src/guido/xml2guidovisitor.o: ../src/visitors/metronomevisitor.h -../src/guido/xml2guidovisitor.o: ../src/visitors/timesignvisitor.h -../src/guido/xmlpart2guido.o: ../src/lib/conversions.h -../src/guido/xmlpart2guido.o: ../src/elements/exports.h ../src/lib/rational.h -../src/guido/xmlpart2guido.o: ../src/lib/bimap.h -../src/guido/xmlpart2guido.o: ../src/visitors/partsummary.h -../src/guido/xmlpart2guido.o: ../src/visitors/notevisitor.h -../src/guido/xmlpart2guido.o: ../src/elements/typedefs.h -../src/guido/xmlpart2guido.o: ../src/elements/elements.h -../src/guido/xmlpart2guido.o: ../src/elements/types.h ../src/elements/xml.h -../src/guido/xmlpart2guido.o: ../src/lib/ctree.h ../src/lib/smartpointer.h -../src/guido/xmlpart2guido.o: ../src/visitors/visitable.h -../src/guido/xmlpart2guido.o: ../src/visitors/basevisitor.h -../src/guido/xmlpart2guido.o: ../src/visitors/visitor.h -../src/guido/xmlpart2guido.o: ../src/lib/smartlist.h -../src/guido/xmlpart2guido.o: ../src/guido/xml2guidovisitor.h -../src/guido/xmlpart2guido.o: ../src/guido/guido.h -../src/guido/xmlpart2guido.o: ../src/guido/xmlpart2guido.h -../src/guido/xmlpart2guido.o: ../src/visitors/clefvisitor.h -../src/guido/xmlpart2guido.o: ../src/visitors/keysignvisitor.h -../src/guido/xmlpart2guido.o: ../src/visitors/metronomevisitor.h -../src/guido/xmlpart2guido.o: ../src/visitors/timesignvisitor.h -../src/guido/xmlpart2guido.o: ../src/elements/xml_tree_browser.h -../src/guido/xmlpart2guido.o: ../src/lib/tree_browser.h ../src/lib/browser.h -../src/interface/libmusicxml.o: ../src/interface/libmusicxml.h -../src/interface/libmusicxml.o: /usr/include/stdio.h /usr/include/_types.h -../src/interface/libmusicxml.o: /usr/include/sys/_types.h -../src/interface/libmusicxml.o: /usr/include/sys/cdefs.h -../src/interface/libmusicxml.o: /usr/include/machine/_types.h -../src/interface/libmusicxml.o: /usr/include/ppc/_types.h -../src/interface/libmusicxml.o: ../src/elements/exports.h -../src/interface/libmusicxml.o: ../src/elements/versions.h -../src/interface/musicxml2guido.o: ../src/interface/libmusicxml.h -../src/interface/musicxml2guido.o: /usr/include/stdio.h /usr/include/_types.h -../src/interface/musicxml2guido.o: /usr/include/sys/_types.h -../src/interface/musicxml2guido.o: /usr/include/sys/cdefs.h -../src/interface/musicxml2guido.o: /usr/include/machine/_types.h -../src/interface/musicxml2guido.o: /usr/include/ppc/_types.h -../src/interface/musicxml2guido.o: ../src/elements/exports.h -../src/interface/musicxml2guido.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/interface/musicxml2guido.o: ../src/lib/smartpointer.h -../src/interface/musicxml2guido.o: ../src/visitors/visitable.h -../src/interface/musicxml2guido.o: ../src/visitors/basevisitor.h -../src/interface/musicxml2guido.o: ../src/files/xmlfile.h -../src/interface/musicxml2guido.o: ../src/files/xmlreader.h -../src/interface/musicxml2guido.o: ../src/parser/reader.h -../src/interface/musicxml2guido.o: ../src/guido/xml2guidovisitor.h -../src/interface/musicxml2guido.o: ../src/guido/guido.h -../src/interface/musicxml2guido.o: ../src/elements/typedefs.h -../src/interface/musicxml2guido.o: ../src/elements/elements.h -../src/interface/musicxml2guido.o: ../src/elements/types.h -../src/interface/musicxml2guido.o: ../src/visitors/visitor.h -../src/lib/conversions.o: ../src/lib/conversions.h ../src/elements/exports.h -../src/lib/conversions.o: ../src/lib/rational.h ../src/lib/bimap.h -../src/lib/rational.o: ../src/lib/rational.h ../src/elements/exports.h -../src/lib/rational.o: /usr/include/stdlib.h /usr/include/available.h -../src/lib/rational.o: /usr/include/_types.h /usr/include/sys/_types.h -../src/lib/rational.o: /usr/include/sys/cdefs.h /usr/include/machine/_types.h -../src/lib/rational.o: /usr/include/ppc/_types.h /usr/include/sys/wait.h -../src/lib/rational.o: /usr/include/sys/signal.h -../src/lib/rational.o: /usr/include/sys/appleapiopts.h -../src/lib/rational.o: /usr/include/machine/signal.h -../src/lib/rational.o: /usr/include/ppc/signal.h /usr/include/ppc/_structs.h -../src/lib/rational.o: /usr/include/sys/_structs.h -../src/lib/rational.o: /usr/include/machine/_structs.h -../src/lib/rational.o: /usr/include/sys/resource.h -../src/lib/rational.o: /usr/include/machine/endian.h -../src/lib/rational.o: /usr/include/ppc/endian.h /usr/include/sys/_endian.h -../src/lib/rational.o: /usr/include/alloca.h /usr/include/machine/types.h -../src/lib/rational.o: /usr/include/ppc/types.h /usr/include/string.h -../src/operations/transposition.o: /usr/include/math.h -../src/operations/transposition.o: /usr/include/architecture/ppc/math.h -../src/operations/transposition.o: /usr/include/sys/cdefs.h -../src/operations/transposition.o: ../src/elements/factory.h -../src/operations/transposition.o: ../src/lib/functor.h -../src/operations/transposition.o: ../src/lib/singleton.h -../src/operations/transposition.o: ../src/elements/xml.h -../src/operations/transposition.o: ../src/elements/exports.h -../src/operations/transposition.o: ../src/lib/ctree.h -../src/operations/transposition.o: ../src/lib/smartpointer.h -../src/operations/transposition.o: ../src/visitors/visitable.h -../src/operations/transposition.o: ../src/visitors/basevisitor.h -../src/operations/transposition.o: ../src/operations/transposition.h -../src/operations/transposition.o: ../src/elements/typedefs.h -../src/operations/transposition.o: ../src/elements/elements.h -../src/operations/transposition.o: ../src/elements/types.h -../src/operations/transposition.o: ../src/visitors/visitor.h -../src/operations/transposition.o: ../src/visitors/transposevisitor.h -../src/operations/transposition.o: ../src/visitors/notevisitor.h -../src/operations/transposition.o: ../src/lib/conversions.h -../src/operations/transposition.o: ../src/lib/rational.h ../src/lib/bimap.h -../src/operations/transposition.o: ../src/elements/xml_tree_browser.h -../src/operations/transposition.o: ../src/lib/tree_browser.h -../src/operations/transposition.o: ../src/lib/browser.h -../src/parser/xmlparse.o: /usr/include/stdio.h /usr/include/_types.h -../src/parser/xmlparse.o: /usr/include/sys/_types.h /usr/include/sys/cdefs.h -../src/parser/xmlparse.o: /usr/include/machine/_types.h -../src/parser/xmlparse.o: /usr/include/ppc/_types.h /usr/include/string.h -../src/parser/xmlparse.o: ../src/parser/reader.h ../src/parser/xmllex.c++ -../src/parser/xmlparse.o: /usr/include/errno.h /usr/include/sys/errno.h -../src/parser/xmlparse.o: /usr/include/stdlib.h /usr/include/available.h -../src/parser/xmlparse.o: /usr/include/sys/wait.h /usr/include/sys/signal.h -../src/parser/xmlparse.o: /usr/include/sys/appleapiopts.h -../src/parser/xmlparse.o: /usr/include/machine/signal.h -../src/parser/xmlparse.o: /usr/include/ppc/signal.h -../src/parser/xmlparse.o: /usr/include/ppc/_structs.h -../src/parser/xmlparse.o: /usr/include/sys/_structs.h -../src/parser/xmlparse.o: /usr/include/machine/_structs.h -../src/parser/xmlparse.o: /usr/include/sys/resource.h -../src/parser/xmlparse.o: /usr/include/machine/endian.h -../src/parser/xmlparse.o: /usr/include/ppc/endian.h -../src/parser/xmlparse.o: /usr/include/sys/_endian.h /usr/include/alloca.h -../src/parser/xmlparse.o: /usr/include/machine/types.h -../src/parser/xmlparse.o: /usr/include/ppc/types.h ../src/parser/xmlparse.hpp -../src/parser/xmlparse.o: /usr/include/stddef.h -../src/visitors/clefvisitor.o: ../src/visitors/clefvisitor.h -../src/visitors/clefvisitor.o: ../src/elements/typedefs.h -../src/visitors/clefvisitor.o: ../src/elements/elements.h -../src/visitors/clefvisitor.o: ../src/elements/types.h -../src/visitors/clefvisitor.o: ../src/elements/exports.h -../src/visitors/clefvisitor.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/visitors/clefvisitor.o: ../src/lib/smartpointer.h -../src/visitors/clefvisitor.o: ../src/visitors/visitable.h -../src/visitors/clefvisitor.o: ../src/visitors/basevisitor.h -../src/visitors/clefvisitor.o: ../src/visitors/visitor.h -../src/visitors/clonevisitor.o: ../src/visitors/clonevisitor.h -../src/visitors/clonevisitor.o: ../src/visitors/visitor.h -../src/visitors/clonevisitor.o: ../src/visitors/basevisitor.h -../src/visitors/clonevisitor.o: ../src/elements/xml.h -../src/visitors/clonevisitor.o: ../src/elements/exports.h ../src/lib/ctree.h -../src/visitors/clonevisitor.o: ../src/lib/smartpointer.h -../src/visitors/clonevisitor.o: ../src/visitors/visitable.h -../src/visitors/keysignvisitor.o: ../src/visitors/keysignvisitor.h -../src/visitors/keysignvisitor.o: ../src/elements/typedefs.h -../src/visitors/keysignvisitor.o: ../src/elements/elements.h -../src/visitors/keysignvisitor.o: ../src/elements/types.h -../src/visitors/keysignvisitor.o: ../src/elements/exports.h -../src/visitors/keysignvisitor.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/visitors/keysignvisitor.o: ../src/lib/smartpointer.h -../src/visitors/keysignvisitor.o: ../src/visitors/visitable.h -../src/visitors/keysignvisitor.o: ../src/visitors/basevisitor.h -../src/visitors/keysignvisitor.o: ../src/visitors/visitor.h -../src/visitors/keyvisitor.o: ../src/visitors/keyvisitor.h -../src/visitors/keyvisitor.o: ../src/elements/typedefs.h -../src/visitors/keyvisitor.o: ../src/elements/elements.h -../src/visitors/keyvisitor.o: ../src/elements/types.h -../src/visitors/keyvisitor.o: ../src/elements/exports.h ../src/elements/xml.h -../src/visitors/keyvisitor.o: ../src/lib/ctree.h ../src/lib/smartpointer.h -../src/visitors/keyvisitor.o: ../src/visitors/visitable.h -../src/visitors/keyvisitor.o: ../src/visitors/basevisitor.h -../src/visitors/keyvisitor.o: ../src/visitors/visitor.h -../src/visitors/metronomevisitor.o: ../src/visitors/metronomevisitor.h -../src/visitors/metronomevisitor.o: ../src/elements/typedefs.h -../src/visitors/metronomevisitor.o: ../src/elements/elements.h -../src/visitors/metronomevisitor.o: ../src/elements/types.h -../src/visitors/metronomevisitor.o: ../src/elements/exports.h -../src/visitors/metronomevisitor.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/visitors/metronomevisitor.o: ../src/lib/smartpointer.h -../src/visitors/metronomevisitor.o: ../src/visitors/visitable.h -../src/visitors/metronomevisitor.o: ../src/visitors/basevisitor.h -../src/visitors/metronomevisitor.o: ../src/visitors/visitor.h -../src/visitors/midicontextvisitor.o: /usr/include/stdlib.h -../src/visitors/midicontextvisitor.o: /usr/include/available.h -../src/visitors/midicontextvisitor.o: /usr/include/_types.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/_types.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/cdefs.h -../src/visitors/midicontextvisitor.o: /usr/include/machine/_types.h -../src/visitors/midicontextvisitor.o: /usr/include/ppc/_types.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/wait.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/signal.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/appleapiopts.h -../src/visitors/midicontextvisitor.o: /usr/include/machine/signal.h -../src/visitors/midicontextvisitor.o: /usr/include/ppc/signal.h -../src/visitors/midicontextvisitor.o: /usr/include/ppc/_structs.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/_structs.h -../src/visitors/midicontextvisitor.o: /usr/include/machine/_structs.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/resource.h -../src/visitors/midicontextvisitor.o: /usr/include/machine/endian.h -../src/visitors/midicontextvisitor.o: /usr/include/ppc/endian.h -../src/visitors/midicontextvisitor.o: /usr/include/sys/_endian.h -../src/visitors/midicontextvisitor.o: /usr/include/alloca.h -../src/visitors/midicontextvisitor.o: /usr/include/machine/types.h -../src/visitors/midicontextvisitor.o: /usr/include/ppc/types.h -../src/visitors/midicontextvisitor.o: /usr/include/math.h -../src/visitors/midicontextvisitor.o: /usr/include/architecture/ppc/math.h -../src/visitors/midicontextvisitor.o: ../src/visitors/midicontextvisitor.h -../src/visitors/midicontextvisitor.o: ../src/elements/xml.h -../src/visitors/midicontextvisitor.o: ../src/elements/exports.h -../src/visitors/midicontextvisitor.o: ../src/lib/ctree.h -../src/visitors/midicontextvisitor.o: ../src/lib/smartpointer.h -../src/visitors/midicontextvisitor.o: ../src/visitors/visitable.h -../src/visitors/midicontextvisitor.o: ../src/visitors/basevisitor.h -../src/visitors/midicontextvisitor.o: ../src/elements/typedefs.h -../src/visitors/midicontextvisitor.o: ../src/elements/elements.h -../src/visitors/midicontextvisitor.o: ../src/elements/types.h -../src/visitors/midicontextvisitor.o: ../src/visitors/visitor.h -../src/visitors/midicontextvisitor.o: ../src/visitors/notevisitor.h -../src/visitors/midicontextvisitor.o: ../src/lib/conversions.h -../src/visitors/midicontextvisitor.o: ../src/lib/rational.h -../src/visitors/midicontextvisitor.o: ../src/lib/bimap.h -../src/visitors/midicontextvisitor.o: ../src/visitors/transposevisitor.h -../src/visitors/notevisitor.o: ../src/visitors/notevisitor.h -../src/visitors/notevisitor.o: ../src/lib/conversions.h -../src/visitors/notevisitor.o: ../src/elements/exports.h -../src/visitors/notevisitor.o: ../src/lib/rational.h ../src/lib/bimap.h -../src/visitors/notevisitor.o: ../src/elements/typedefs.h -../src/visitors/notevisitor.o: ../src/elements/elements.h -../src/visitors/notevisitor.o: ../src/elements/types.h ../src/elements/xml.h -../src/visitors/notevisitor.o: ../src/lib/ctree.h ../src/lib/smartpointer.h -../src/visitors/notevisitor.o: ../src/visitors/visitable.h -../src/visitors/notevisitor.o: ../src/visitors/basevisitor.h -../src/visitors/notevisitor.o: ../src/visitors/visitor.h -../src/visitors/partsummary.o: ../src/visitors/partsummary.h -../src/visitors/partsummary.o: ../src/visitors/notevisitor.h -../src/visitors/partsummary.o: ../src/lib/conversions.h -../src/visitors/partsummary.o: ../src/elements/exports.h -../src/visitors/partsummary.o: ../src/lib/rational.h ../src/lib/bimap.h -../src/visitors/partsummary.o: ../src/elements/typedefs.h -../src/visitors/partsummary.o: ../src/elements/elements.h -../src/visitors/partsummary.o: ../src/elements/types.h ../src/elements/xml.h -../src/visitors/partsummary.o: ../src/lib/ctree.h ../src/lib/smartpointer.h -../src/visitors/partsummary.o: ../src/visitors/visitable.h -../src/visitors/partsummary.o: ../src/visitors/basevisitor.h -../src/visitors/partsummary.o: ../src/visitors/visitor.h -../src/visitors/partsummary.o: ../src/lib/smartlist.h -../src/visitors/timesignvisitor.o: /usr/include/stdlib.h -../src/visitors/timesignvisitor.o: /usr/include/available.h -../src/visitors/timesignvisitor.o: /usr/include/_types.h -../src/visitors/timesignvisitor.o: /usr/include/sys/_types.h -../src/visitors/timesignvisitor.o: /usr/include/sys/cdefs.h -../src/visitors/timesignvisitor.o: /usr/include/machine/_types.h -../src/visitors/timesignvisitor.o: /usr/include/ppc/_types.h -../src/visitors/timesignvisitor.o: /usr/include/sys/wait.h -../src/visitors/timesignvisitor.o: /usr/include/sys/signal.h -../src/visitors/timesignvisitor.o: /usr/include/sys/appleapiopts.h -../src/visitors/timesignvisitor.o: /usr/include/machine/signal.h -../src/visitors/timesignvisitor.o: /usr/include/ppc/signal.h -../src/visitors/timesignvisitor.o: /usr/include/ppc/_structs.h -../src/visitors/timesignvisitor.o: /usr/include/sys/_structs.h -../src/visitors/timesignvisitor.o: /usr/include/machine/_structs.h -../src/visitors/timesignvisitor.o: /usr/include/sys/resource.h -../src/visitors/timesignvisitor.o: /usr/include/machine/endian.h -../src/visitors/timesignvisitor.o: /usr/include/ppc/endian.h -../src/visitors/timesignvisitor.o: /usr/include/sys/_endian.h -../src/visitors/timesignvisitor.o: /usr/include/alloca.h -../src/visitors/timesignvisitor.o: /usr/include/machine/types.h -../src/visitors/timesignvisitor.o: /usr/include/ppc/types.h -../src/visitors/timesignvisitor.o: ../src/visitors/timesignvisitor.h -../src/visitors/timesignvisitor.o: ../src/elements/typedefs.h -../src/visitors/timesignvisitor.o: ../src/elements/elements.h -../src/visitors/timesignvisitor.o: ../src/elements/types.h -../src/visitors/timesignvisitor.o: ../src/elements/exports.h -../src/visitors/timesignvisitor.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/visitors/timesignvisitor.o: ../src/lib/smartpointer.h -../src/visitors/timesignvisitor.o: ../src/visitors/visitable.h -../src/visitors/timesignvisitor.o: ../src/visitors/basevisitor.h -../src/visitors/timesignvisitor.o: ../src/visitors/visitor.h -../src/visitors/timesignvisitor.o: ../src/lib/rational.h -../src/visitors/transposevisitor.o: ../src/visitors/transposevisitor.h -../src/visitors/transposevisitor.o: ../src/elements/typedefs.h -../src/visitors/transposevisitor.o: ../src/elements/elements.h -../src/visitors/transposevisitor.o: ../src/elements/types.h -../src/visitors/transposevisitor.o: ../src/elements/exports.h -../src/visitors/transposevisitor.o: ../src/elements/xml.h ../src/lib/ctree.h -../src/visitors/transposevisitor.o: ../src/lib/smartpointer.h -../src/visitors/transposevisitor.o: ../src/visitors/visitable.h -../src/visitors/transposevisitor.o: ../src/visitors/basevisitor.h -../src/visitors/transposevisitor.o: ../src/visitors/visitor.h -../src/visitors/unrolled_clonevisitor.o: ../src/visitors/unrolled_clonevisitor.h -../src/visitors/unrolled_clonevisitor.o: ../src/visitors/visitor.h -../src/visitors/unrolled_clonevisitor.o: ../src/visitors/basevisitor.h -../src/visitors/unrolled_clonevisitor.o: ../src/visitors/clonevisitor.h -../src/visitors/unrolled_clonevisitor.o: ../src/elements/xml.h -../src/visitors/unrolled_clonevisitor.o: ../src/elements/exports.h -../src/visitors/unrolled_clonevisitor.o: ../src/lib/ctree.h -../src/visitors/unrolled_clonevisitor.o: ../src/lib/smartpointer.h -../src/visitors/unrolled_clonevisitor.o: ../src/visitors/visitable.h -../src/visitors/unrolled_clonevisitor.o: ../src/elements/typedefs.h -../src/visitors/unrolled_clonevisitor.o: ../src/elements/elements.h -../src/visitors/unrolled_clonevisitor.o: ../src/elements/types.h -../src/visitors/xmlvisitor.o: ../src/visitors/xmlvisitor.h -../src/visitors/xmlvisitor.o: ../src/lib/tree_browser.h -../src/visitors/xmlvisitor.o: ../src/elements/exports.h -../src/visitors/xmlvisitor.o: ../src/visitors/basevisitor.h -../src/visitors/xmlvisitor.o: ../src/lib/browser.h ../src/lib/ctree.h -../src/visitors/xmlvisitor.o: ../src/lib/smartpointer.h -../src/visitors/xmlvisitor.o: ../src/visitors/visitable.h -../src/visitors/xmlvisitor.o: ../src/elements/typedefs.h -../src/visitors/xmlvisitor.o: ../src/elements/elements.h -../src/visitors/xmlvisitor.o: ../src/elements/types.h ../src/elements/xml.h -../src/visitors/xmlvisitor.o: ../src/visitors/visitor.h diff --git a/win32/codeblocks/libmusicxml.workspace b/win32/codeblocks/libmusicxml.workspace deleted file mode 100644 index 15edaef91..000000000 --- a/win32/codeblocks/libmusicxml.workspace +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/win32/codeblocks/libmusicxml2/libmusicxml2.cbp b/win32/codeblocks/libmusicxml2/libmusicxml2.cbp deleted file mode 100644 index 22c5b5de7..000000000 --- a/win32/codeblocks/libmusicxml2/libmusicxml2.cbp +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - diff --git a/win32/codeblocks/randomMusic/randomMusic.cbp b/win32/codeblocks/randomMusic/randomMusic.cbp deleted file mode 100644 index 8c8c892a0..000000000 --- a/win32/codeblocks/randomMusic/randomMusic.cbp +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - diff --git a/win32/codeblocks/transpose/transpose.cbp b/win32/codeblocks/transpose/transpose.cbp deleted file mode 100644 index 0e5670193..000000000 --- a/win32/codeblocks/transpose/transpose.cbp +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - diff --git a/win32/codeblocks/xml2guido/xml2guido.cbp b/win32/codeblocks/xml2guido/xml2guido.cbp deleted file mode 100644 index 5140e86e9..000000000 --- a/win32/codeblocks/xml2guido/xml2guido.cbp +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - diff --git a/win32/devc++/countnotes.dev b/win32/devc++/countnotes.dev deleted file mode 100644 index 6b73db4b1..000000000 --- a/win32/devc++/countnotes.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=countnotes.dev -Name=countnotes -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=countnotes.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\countnotes.cpp -CompileCpp=1 -Folder=countnotes -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/libmusicxml.dev b/win32/devc++/libmusicxml.dev deleted file mode 100644 index b9b525e08..000000000 --- a/win32/devc++/libmusicxml.dev +++ /dev/null @@ -1,700 +0,0 @@ -[Project] -FileName=libmusicxml.dev -Name=libmusicxml2 -UnitCount=63 -Type=3 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/files;../../src/guido;../../src/lilypond;../../src/lib;../../src/parser;../../src/visitors -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler=-DBUILDING_DLL=1_@@_ -CppCompiler=-DBUILDING_DLL=1_@@_-DLIBMUSICXML_EXPORTS_@@_ -Linker=--no-export-all-symbols --add-stdcall-alias_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput=obj -OverrideOutput=1 -OverrideOutputName=libmusicxml2.dll -HostApplication= -Folders=elements,files,guido,lilypond,lib,operations,parser,visitors -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\src\elements\elements.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit2] -FileName=..\..\src\elements\exports.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit3] -FileName=..\..\src\elements\factory.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit4] -FileName=..\..\src\elements\typedefs.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit5] -FileName=..\..\src\elements\types.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit6] -FileName=..\..\src\elements\xml.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit7] -FileName=..\..\src\elements\factory.cpp -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit8] -FileName=..\..\src\elements\xml.cpp -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit9] -FileName=..\..\src\files\xmlfile.h -CompileCpp=1 -Folder=files -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit10] -FileName=..\..\src\files\xmlreader.h -CompileCpp=1 -Folder=files -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit11] -FileName=..\..\src\files\xmlfile.cpp -CompileCpp=1 -Folder=files -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit12] -FileName=..\..\src\files\xmlreader.cpp -CompileCpp=1 -Folder=files -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=2 -Minor=0 -Release=0 -Build=23 -LanguageID=1033 -CharsetID=1252 -CompanyName=Grame -FileVersion= -FileDescription=C++ library to support MusicXML -InternalName= -LegalCopyright=(c) Grame 2007 -LegalTrademarks= -OriginalFilename=libmusicxml -ProductName=libmusicxml -ProductVersion=2.0.0 -AutoIncBuildNr=1 - -[Unit13] -FileName=..\..\src\guido\guido.h -CompileCpp=1 -Folder=guido -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit14] -FileName=..\..\src\guido\xml2guidovisitor.h -CompileCpp=1 -Folder=guido -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit15] -FileName=..\..\src\guido\guido.cpp -CompileCpp=1 -Folder=guido -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit16] -FileName=..\..\src\guido\xml2guidovisitor.cpp -CompileCpp=1 -Folder=guido -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit17] -FileName=..\..\src\parser\xmllex.cpp -CompileCpp=1 -Folder=parser -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit18] -FileName=..\..\src\parser\xmlparse.cpp -CompileCpp=1 -Folder=parser -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit19] -FileName=..\..\src\parser\xml.l -CompileCpp=1 -Folder=parser -Compile=0 -Link=0 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit20] -FileName=..\..\src\parser\xml.y -CompileCpp=1 -Folder=parser -Compile=0 -Link=0 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit21] -FileName=..\..\src\visitors\basevisitor.h -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= -CompileCpp=1 - -[Unit22] -FileName=..\..\src\visitors\midicontextvisitor.h -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= -CompileCpp=1 - -[Unit23] -FileName=..\..\src\visitors\notevisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit24] -FileName=..\..\src\visitors\visitable.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit25] -FileName=..\..\src\visitors\visitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit26] -FileName=..\..\src\visitors\xmlvisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit27] -FileName=..\..\src\visitors\midicontextvisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit28] -FileName=..\..\src\visitors\notevisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit29] -FileName=..\..\src\visitors\xmlvisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit30] -FileName=..\..\src\lib\functor.h -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit31] -FileName=..\..\src\lib\singleton.h -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit32] -FileName=..\..\src\lib\smartpointer.h -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit33] -FileName=..\..\src\lib\tree_browser.h -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit34] -FileName=..\..\src\lib\ctree.h -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit35] -FileName=..\..\src\lib\browser.h -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit36] -FileName=..\..\src\visitors\clonevisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit37] -FileName=..\..\src\visitors\unrolled_clonevisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit38] -FileName=..\..\src\visitors\clonevisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit39] -FileName=..\..\src\visitors\unrolled_clonevisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit40] -FileName=..\..\src\visitors\keyvisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit41] -FileName=..\..\src\visitors\timesignvisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit42] -FileName=..\..\src\visitors\transposevisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit43] -FileName=..\..\src\visitors\keyvisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit44] -FileName=..\..\src\visitors\timesignvisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit45] -FileName=..\..\src\visitors\transposevisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit46] -FileName=..\..\src\elements\unrolled_xml_tree_browser.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit47] -FileName=..\..\src\elements\xml_tree_browser.h -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit48] -FileName=..\..\src\elements\unrolled_xml_tree_browser.cpp -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit49] -FileName=..\..\src\elements\xml_tree_browser.cpp -CompileCpp=1 -Folder=elements -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit50] -FileName=..\..\src\guido\xmlpart2guido.cpp -CompileCpp=1 -Folder=guido -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit51] -FileName=..\..\src\guido\xmlpart2guido.h -CompileCpp=1 -Folder=guido -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit52] -FileName=..\..\src\lib\conversions.cpp -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit53] -FileName=..\..\src\lib\rational.cpp -CompileCpp=1 -Folder=lib -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit54] -FileName=..\..\src\visitors\clefvisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit55] -FileName=..\..\src\visitors\keysignvisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit56] -FileName=..\..\src\visitors\metronomevisitor.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit57] -FileName=..\..\src\visitors\partsummary.h -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit58] -FileName=..\..\src\visitors\clefvisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit59] -FileName=..\..\src\visitors\keysignvisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit60] -FileName=..\..\src\visitors\metronomevisitor.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit61] -FileName=..\..\src\visitors\partsummary.cpp -CompileCpp=1 -Folder=visitors -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit62] -FileName=..\..\src\operations\transposition.cpp -CompileCpp=1 -Folder=operations -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit63] -FileName=..\..\src\operations\transposition.h -CompileCpp=1 -Folder=operations -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit64] -FileName=..\..\src\lilypond\lilypond.cpp -CompileCpp=1 -Folder=lilypond -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit65] -FileName=..\..\src\lilypond\xml2lilypondvisitor.cpp -CompileCpp=1 -Folder=lilypond -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit17] diff --git a/win32/devc++/libmusicxml_private.h b/win32/devc++/libmusicxml_private.h deleted file mode 100644 index 88a2705b1..000000000 --- a/win32/devc++/libmusicxml_private.h +++ /dev/null @@ -1,23 +0,0 @@ -/* THIS FILE WILL BE OVERWRITTEN BY DEV-C++ */ -/* DO NOT EDIT ! */ - -#ifndef LIBMUSICXML_PRIVATE_H -#define LIBMUSICXML_PRIVATE_H - -/* VERSION DEFINITIONS */ -#define VER_STRING "2.0.0.2" -#define VER_MAJOR 2 -#define VER_MINOR 0 -#define VER_RELEASE 0 -#define VER_BUILD 2 -#define COMPANY_NAME "Grame" -#define FILE_VERSION "" -#define FILE_DESCRIPTION "C++ library to support MusicXML" -#define INTERNAL_NAME "" -#define LEGAL_COPYRIGHT "(c) Grame 2007" -#define LEGAL_TRADEMARKS "" -#define ORIGINAL_FILENAME "libmusicxml" -#define PRODUCT_NAME "libmusicxml" -#define PRODUCT_VERSION "2.0.0" - -#endif /*LIBMUSICXML_PRIVATE_H*/ diff --git a/win32/devc++/partsummary.dev b/win32/devc++/partsummary.dev deleted file mode 100644 index b63efd08e..000000000 --- a/win32/devc++/partsummary.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=partsummary.dev -Name=partsummary -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=partsummary.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\partsummary.cpp -CompileCpp=1 -Folder=partsummary -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/randomMusic.dev b/win32/devc++/randomMusic.dev deleted file mode 100644 index 1fd1de4b1..000000000 --- a/win32/devc++/randomMusic.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=randomMusic.dev -Name=randomMusic -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=randomMusic.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\RandomMusic.cpp -CompileCpp=1 -Folder=randomMusic -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/transpose.dev b/win32/devc++/transpose.dev deleted file mode 100644 index 6ff84277e..000000000 --- a/win32/devc++/transpose.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=transpose.dev -Name=transpose -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser;../../src/operations -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=transpose.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\transpose.cpp -CompileCpp=1 -Folder=transpose -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/xml2guido.dev b/win32/devc++/xml2guido.dev deleted file mode 100644 index 00d55bdaf..000000000 --- a/win32/devc++/xml2guido.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=xml2guido.dev -Name=xml2guido -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser;../../src/guido -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=xml2guido.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\xml2guido.cpp -CompileCpp=1 -Folder=xml2guido -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/xml2lilypond.dev b/win32/devc++/xml2lilypond.dev deleted file mode 100644 index aaa2e4b00..000000000 --- a/win32/devc++/xml2lilypond.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=xml2lilypond.dev -Name=xml2lilypond -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser;../../src/lilypond -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=xml2lilypond.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\xml2lilypond.cpp -CompileCpp=1 -Folder=xml2lilypond -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/xml2midi.dev b/win32/devc++/xml2midi.dev deleted file mode 100644 index f45397bf5..000000000 --- a/win32/devc++/xml2midi.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=xml2midi.dev -Name=xml2midi -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=xml2midi.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\xml2midi.cpp -CompileCpp=1 -Folder=xml2midi -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/xmlclone.dev b/win32/devc++/xmlclone.dev deleted file mode 100644 index 26d6ad230..000000000 --- a/win32/devc++/xmlclone.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=xmlclone.dev -Name=xmlclone -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=xmlclone.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\xmlclone.cpp -CompileCpp=1 -Folder=xmlclone -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/xmliter.dev b/win32/devc++/xmliter.dev deleted file mode 100644 index f585e7298..000000000 --- a/win32/devc++/xmliter.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=xmliter.dev -Name=xmliter -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=xmliter.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\xmliter.cpp -CompileCpp=1 -Folder=xmliter -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - diff --git a/win32/devc++/xmlread.dev b/win32/devc++/xmlread.dev deleted file mode 100644 index 810134590..000000000 --- a/win32/devc++/xmlread.dev +++ /dev/null @@ -1,59 +0,0 @@ -[Project] -FileName=xmlread.dev -Name=xmlread -UnitCount=1 -Type=1 -Ver=1 -ObjFiles= -Includes=../../src/elements;../../src/lib;../../src/visitors;../../src/files;../../src/parser -Libs= -PrivateResource= -ResourceIncludes= -MakeIncludes= -Compiler= -CppCompiler= -Linker=liblibmusicxml2.a_@@_ -IsCpp=1 -Icon= -ExeOutput= -ObjectOutput= -OverrideOutput=0 -OverrideOutputName=xmlread.exe -HostApplication= -Folders= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -CompilerSettings=0000001000000000000100 - -[Unit1] -FileName=..\..\samples\xmlread.cpp -CompileCpp=1 -Folder=xmlread -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription=Developed using the Dev-C++ IDE -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNr=0 - From 62b368f4498d2a0698acaead59ba9f97c629698a Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Mon, 5 Apr 2021 07:45:57 +0200 Subject: [PATCH 095/164] simplify --- build/Makefile | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/build/Makefile b/build/Makefile index 037aa28df..f738f21e7 100644 --- a/build/Makefile +++ b/build/Makefile @@ -8,24 +8,11 @@ MAKE ?= make CMAKE ?= cmake LIBDIR ?= libdir IOSDIR ?= iosdir +MAKEFILE ?= Makefile VERSION = 3.20 - system := $(shell uname -s) system := $(shell echo $(system) | grep MINGW > /dev/null && echo MINGW || echo $(system)) -ifeq ($(system), Darwin) - PREFIX ?= /usr/local - GENERATOR ?= -G Xcode - MAKEFILE = libmusicxml2.xcodeproj -endif -ifeq ($(system), MINGW) - MAKEFILE = Makefile -endif - -ifeq ($(system), Linux) - MAKEFILE = Makefile -endif - CMAKEOPT ?= TOOLS := xml2midi xmlread xml2guido xmlversion @@ -84,7 +71,7 @@ wasm: #=============================================================== minimal: - $(MAKE) cmake CMAKEOPT="-DGENTOOLS=off -DLILY=off -DGENSTATIC=off" + $(MAKE) cmake CMAKEOPT="-DGENTOOLS=off -DGENSTATIC=off" $(CMAKE) --build $(LIBDIR) --config Release #=============================================================== From a4888b143ccf4955250b7eb15b86f933bf3e0e3d Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Tue, 6 Apr 2021 07:31:37 +0200 Subject: [PATCH 096/164] github actions --- .github/workflows/macos.yml | 29 +++++++++++++++++++++++++++++ .github/workflows/ubuntu.yml | 29 +++++++++++++++++++++++++++++ .github/workflows/windows.yml | 32 ++++++++++++++++++++++++++++++++ .travis.yml | 22 ---------------------- appveyor.yml | 24 ------------------------ 5 files changed, 90 insertions(+), 46 deletions(-) create mode 100644 .github/workflows/macos.yml create mode 100644 .github/workflows/ubuntu.yml create mode 100644 .github/workflows/windows.yml delete mode 100644 .travis.yml delete mode 100644 appveyor.yml diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 000000000..6a7eace8f --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,29 @@ +# This is a basic workflow to help you get started with Actions + +name: MacOS + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the dev branch + push: + branches: [ dev ] + pull_request: + branches: [ dev ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: macos-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Build libmusicxml + run: make -C build diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml new file mode 100644 index 000000000..83d2e1dcf --- /dev/null +++ b/.github/workflows/ubuntu.yml @@ -0,0 +1,29 @@ +# This is a basic workflow to help you get started with Actions + +name: Ubuntu + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the dev branch + push: + branches: [ dev ] + pull_request: + branches: [ dev ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Build libmusicxml + run: make -C build diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 000000000..fe1ad4fe7 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,32 @@ +# This is a basic workflow to help you get started with Actions + +name: Windows + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the dev branch + push: + branches: [ dev ] + pull_request: + branches: [ dev ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: windows-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + - name: Get latest CMake and ninja + uses: lukka/get-cmake@latest + + - name: Build libmusicxml + run: make -C build diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ad6f1ff0d..000000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -os: linux -dist: xenial -language: cpp -compiler: clang - -before_install: - - sudo apt-get -qq update - -#branches: -# except: -# - lilypond - -#branches: -# only: -# - dev -# - master - -script: - - make -C build -j 2 - - sudo make -C build/libdir install - - export LD_LIBRARY_PATH=/usr/local/lib - - make -C validation travis diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 96a0b412a..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,24 +0,0 @@ -version: 1.0.{build} -image: Visual Studio 2015 -skip_tags: true -build_script: -- cmd: >- - cd build - - mkdir win32 win64 - - cd win64 - - cmake .. -G "Visual Studio 14 2015 Win64" - - cmake --build . --config Release - -notifications: - - provider: Email - to: - - '{{commitAuthorEmail}}' - - fober@grame.fr - subject: 'Build {{status}}: {{projectName}} {{buildVersion}}' - on_build_success: false - on_build_failure: true - on_build_status_changed: true From c99128fa10d6775183f03411afe21cb9d48d8f34 Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Tue, 6 Apr 2021 07:32:05 +0200 Subject: [PATCH 097/164] cleanup --- build/Building.md | 9 --------- build/Makefile | 12 ++---------- javascript/Makefile | 12 +++--------- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/build/Building.md b/build/Building.md index 3a3534109..761ccf954 100644 --- a/build/Building.md +++ b/build/Building.md @@ -21,14 +21,5 @@ You must have the [emscripten](http://emscripten.org) compiler installed and `e - from the build folder: run `make js` - from the javascript/build folder: run `make` -##### Note for Linux platforms: -The procedure to compile is close to the usual 'configure' 'make' 'make install' steps. Actually, you can simply do the following: - > cd /your_path_to_the_guidolib_project/build - > make - > sudo make install - -##### Note for Windows platforms: -The CMake project description is "Visual Studio" oriented. Using MingW may require some adaptation of the CMakeLists.txt file. You can benefit of the standard command line tools (make) by installing [MSYS](http://www.mingw.org/wiki/MSYS) of [MSYS2](http://www.msys2.org/). - ---------------------------- In case of trouble, contact me: diff --git a/build/Makefile b/build/Makefile index f738f21e7..adb35370a 100644 --- a/build/Makefile +++ b/build/Makefile @@ -2,8 +2,6 @@ # # -.PHONY : msys win32 win64 linux android - MAKE ?= make CMAKE ?= cmake LIBDIR ?= libdir @@ -11,8 +9,6 @@ IOSDIR ?= iosdir MAKEFILE ?= Makefile VERSION = 3.20 -system := $(shell uname -s) -system := $(shell echo $(system) | grep MINGW > /dev/null && echo MINGW || echo $(system)) CMAKEOPT ?= TOOLS := xml2midi xmlread xml2guido xmlversion @@ -45,14 +41,10 @@ help : @echo @echo "CMake options:" @echo " FMWK [MacOS only] Generates a framework on MacOS. Default is off" - @echo " GDB Activates ggdb3 option. Default is off" - @echo " LILY Include lilypond part. Default is on" - @echo "NOTE: CMake options can be passed using CMAKEOPT, e.g." - @echo " 'make cmake CMAKEOPT=-DLILY=off'" #=============================================================== -# building inscore and inscoreviewer +# building the library #=============================================================== libmusicxml: $(LIBDIR) $(LIBDIR)/$(MAKEFILE) $(CMAKE) --build $(LIBDIR) --config Release @@ -88,7 +80,7 @@ cmake : $(LIBDIR) # building the library for Android #=============================================================== android : - ndk-build -C android -j 6 + ndk-build -C android cp android/libs/armeabi-v7a/libmusicxml2.so android/libmusicxml2.armeabi-v7a.so cp android/libs/x86/libmusicxml2.so android/libmusicxml2.x86.so diff --git a/javascript/Makefile b/javascript/Makefile index 99b7b4894..c0a4ac3cc 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -9,8 +9,6 @@ # The TOTAL_MEMORY is the maximum memory allocated by emscripten. This value is specific (100663296) to be compliant with the asm.js and prevent warning at execution. # It can be increased if error occured. # -# Compilation option -Oz is discouraged, it provoke undefined results and assertion errors at runtime. -# LILY ?= no srcdir := ../src @@ -18,13 +16,9 @@ binddir := ./src npmdir := ./npm folders := factory guido lib parser elements files interface operations visitors -ifeq ($(LILY), yes) - folders := $(folders) lilypond - sources := $(wildcard $(srcdir)/*/*.cpp ) -else - sources := $(wildcard $(srcdir)/factory/*.cpp $(srcdir)/guido/*.cpp $(srcdir)/lib/*.cpp $(srcdir)/parser/*.cpp $(srcdir)/elements/*.cpp $(srcdir)/files/*.cpp $(srcdir)/operations/*.cpp $(srcdir)/visitors/*.cpp ) - sources := $(sources) $(srcdir)/interface/libmusicxml.cpp $(srcdir)/interface/musicxml2guido.cpp -endif +sources := $(wildcard $(srcdir)/factory/*.cpp $(srcdir)/guido/*.cpp $(srcdir)/lib/*.cpp $(srcdir)/parser/*.cpp $(srcdir)/elements/*.cpp $(srcdir)/files/*.cpp $(srcdir)/operations/*.cpp $(srcdir)/visitors/*.cpp ) +sources := $(sources) $(srcdir)/interface/libmusicxml.cpp $(srcdir)/interface/musicxml2guido.cpp + subprojects := $(patsubst %, $(srcdir)/%, $(folders)) bindsrc = $(wildcard $(binddir)/*.cpp) objects = $(patsubst $(srcdir)%, obj%, $(patsubst %.cpp,%.o,$(sources)) $(patsubst $(binddir)%.cpp, obj/binding%.o,$(bindsrc))) From 092a2544754c44ddbe7b2a229b7ace2d562f51cc Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Tue, 6 Apr 2021 07:32:50 +0200 Subject: [PATCH 098/164] renamed --- build/{Building.md => ReadMe.md} | 0 readme.md | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) rename build/{Building.md => ReadMe.md} (100%) diff --git a/build/Building.md b/build/ReadMe.md similarity index 100% rename from build/Building.md rename to build/ReadMe.md diff --git a/readme.md b/readme.md index 4cd7c9288..03c15a48a 100644 --- a/readme.md +++ b/readme.md @@ -4,6 +4,12 @@ Welcome to the libmusicxml project [Grame](http://www.grame.fr) - Centre National de Création Musicale ---------------------------------------------------------------------- +Build status: [![Ubuntu](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/ubuntu.yml/badge.svg)](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/ubuntu.yml) +[![MacOS](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/macos.yml/badge.svg)](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/macos.yml)[![Windows](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/windows.yml/badge.svg)](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/windows.yml) +---- + + + The MusicXML library is a portable C++ library designed close to the MusicXML format and intended to facilitate MusicXML support. [MusicXML](http://www.musicxml.com/) is a music interchange format designed for notation, analysis, retrieval, and performance applications. The MusicXML format has been initialy developed by Recordare. It is open for use by anyone under a royalty-free license. @@ -14,11 +20,5 @@ The libmusicxml library runs on the main operating systems: Linux, MacOS, iOS, W See the [libmusicxml wiki](https://github.com/grame-cncm/libmusicxml/wiki) for building instructions. ---- - -Travis build and validation status: - -Appveyor build status: [![Build status](https://ci.appveyor.com/api/projects/status/7fxl66w2bgl1fucs?svg=true)](https://ci.appveyor.com/project/dfober/libmusicxml) - ---------------------------------------------------------------------- [Dominique Fober](https://github.com/dfober) From a65a633cd1aeb28db2d9c341169d0b0cf1b86933 Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Tue, 6 Apr 2021 07:44:27 +0200 Subject: [PATCH 099/164] status badges --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 03c15a48a..ab73446ff 100644 --- a/readme.md +++ b/readme.md @@ -4,8 +4,8 @@ Welcome to the libmusicxml project [Grame](http://www.grame.fr) - Centre National de Création Musicale ---------------------------------------------------------------------- -Build status: [![Ubuntu](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/ubuntu.yml/badge.svg)](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/ubuntu.yml) -[![MacOS](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/macos.yml/badge.svg)](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/macos.yml)[![Windows](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/windows.yml/badge.svg)](https://github.com/GRAME-CNCM/libmusicxml/actions/workflows/windows.yml) +Build status: [![Ubuntu](https://github.com/grame-cncm/libmusicxml/actions/workflows/ubuntu.yml/badge.svg)](https://github.com/grame-cncm/libmusicxml/actions/workflows/ubuntu.yml) +[![MacOS](https://github.com/grame-cncm/libmusicxml/actions/workflows/macos.yml/badge.svg)](https://github.com/grame-cncm/libmusicxml/actions/workflows/macos.yml)[![Windows](https://github.com/grame-cncm/libmusicxml/actions/workflows/windows.yml/badge.svg)](https://github.com/grame-cncm/libmusicxml/actions/workflows/windows.yml) ---- From 52d7856e6ff6ccb60e4dcde53e6ae0f87e5bf35a Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Sun, 9 May 2021 18:41:13 +0200 Subject: [PATCH 100/164] set deployment target to 10.13 --- build/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index a007508b0..3bfa6f34e 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -68,6 +68,12 @@ if(APPLE) set (CMAKE_CXX_FLAGS "-miphoneos-version-min=11.2") set (libtype STATIC) set (FMWK "false") + else() + set ( DEFS ${DEFS} -DMACOS) + set (CMAKE_C++_FLAGS -mmacosx-version-min=10.13) + set (CMAKE_LDFLAGS -mmacosx-version-min=10.13) + set (CMAKE_OSX_DEPLOYMENT_TARGET 10.13) + set (MACOSX_DEPLOYMENT_TARGET 10.13) endif() # to debug: #add_definitions(-O0 -g) # JMI From eeb1a5a9540e9c5812ded5f233e582ce92cacc44 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 25 May 2021 19:45:01 +0200 Subject: [PATCH 101/164] xml2guido: Fixed an issue where incomplete measures would create noteformat dx --- src/guido/xmlpart2guido.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 20355114b..c819bdaae 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2731,8 +2731,9 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur int measureNum = fCurrentMeasure->getAttributeIntValue("number", 0); auto timePos4measure = timePositions.find(measureNum); if ( (nv.fNotehead - || ((timePos4measure != timePositions.end()) ) ) // if we need to infer default-x - && fInGrace==false ) // FIXME: Workaround for GUID-74 + || ((timePos4measure != timePositions.end()) && fPendingBar==true ) ) // if we need to infer default-x but NOT on incomplete measures + && fInGrace==false // FIXME: Workaround for GUID-74 + ) // Do not add dx noteFormat { Sguidoelement noteFormatTag = guidotag::create("noteFormat"); @@ -2749,7 +2750,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } /// check for dx inference from default_x but avoid doing this for Chords as Guido handles this automatically! - if (timePos4measure != timePositions.end() && (isProcessingChord==false)) { + if (timePos4measure != timePositions.end() && (isProcessingChord==false) && fPendingBar==true) { auto voiceInTimePosition = timePos4measure->second.find(posInMeasure); if (voiceInTimePosition != timePos4measure->second.end()) { auto minXPos = std::min_element(voiceInTimePosition->second.begin(),voiceInTimePosition->second.end() ); From 5b82a5710db847c2ae3d1e2837b3af8b242f3de2 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 25 May 2021 20:13:37 +0200 Subject: [PATCH 102/164] xml2guido: fix conflicting case between implicit xml measuring and doublebar generation --- src/guido/xmlpart2guido.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index c819bdaae..8f78e0628 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -313,7 +313,7 @@ bool xmlpart2guido::checkMeasureRange() { const string& implicit = elt->getAttributeValue ("implicit"); if (implicit == "yes") fPendingBar = false; - if (fPendingBar) { + if (fPendingBar || fDoubleBar) { // before adding a bar, we need to check that there are no repeat begin at this location ctree::iterator repeat = elt->find(k_repeat); if ((repeat == elt->end()) || (repeat->getAttributeValue("direction") != "forward")) { @@ -2733,7 +2733,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur if ( (nv.fNotehead || ((timePos4measure != timePositions.end()) && fPendingBar==true ) ) // if we need to infer default-x but NOT on incomplete measures && fInGrace==false // FIXME: Workaround for GUID-74 - ) // Do not add dx noteFormat + ) { Sguidoelement noteFormatTag = guidotag::create("noteFormat"); From a116204580eb8bda9718a7a461441b11c4f1a105 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 26 May 2021 10:35:41 +0200 Subject: [PATCH 103/164] xml2guido: Support for tied trills and non-wavy trills (GUID-24) --- files/xml2guido/GUID24-trill-wavy-nonwavy.xml | 414 ++++++++++++++++ files/xml2guido/XML2GUIDO-TiedTrill.xml | 461 ++++++++++++++++++ src/guido/xmlpart2guido.cpp | 13 +- 3 files changed, 885 insertions(+), 3 deletions(-) create mode 100644 files/xml2guido/GUID24-trill-wavy-nonwavy.xml create mode 100644 files/xml2guido/XML2GUIDO-TiedTrill.xml diff --git a/files/xml2guido/GUID24-trill-wavy-nonwavy.xml b/files/xml2guido/GUID24-trill-wavy-nonwavy.xml new file mode 100644 index 000000000..7199f9131 --- /dev/null +++ b/files/xml2guido/GUID24-trill-wavy-nonwavy.xml @@ -0,0 +1,414 @@ + + + + Mozart Clarinet Quintet A.dur K.581 1st mov. for SC-55 SHO + + + Finale v25 for Mac + 2021-05-26 + + + + + + + + + + 7.0273 + 40 + + + 1691 + 1195 + + 85 + 85 + 85 + 85 + + + + + 217 + 0 + + 103 + 78 + + + 0.9375 + 5 + 0.9375 + 1.5625 + 5 + 1.5625 + 1.5625 + 1.25 + 0.9375 + 1.25 + 60 + 60 + 120 + 8 + + + + + + + Clarinet in A + A Cl. + + Solo (2) + wind.reed.clarinet.a + + + 1 + 72 + + + + + + + + + + 22 + 0 + + 187 + + system + + + 4 + + 0 + major + + + + G + 2 + + + -2 + -3 + + + + + + E + 5 + + 6 + 1 + quarter + + down + + + + + + + + + D + 5 + + 1 + 1 + 16th + down + begin + begin + + + + E + 5 + + 1 + 1 + 16th + down + end + end + + + + F + 5 + + 6 + 1 + quarter + + down + + + + + + + + + E + 5 + + 1 + 1 + 16th + down + begin + begin + + + + F + 5 + + 1 + 1 + 16th + down + end + end + + + + + + + G + 5 + + 6 + 1 + quarter + + down + + + + + + + + + F + 5 + + 1 + 1 + 16th + down + begin + begin + + + + G + 5 + + 1 + 1 + 16th + down + end + end + + + + A + 5 + + 6 + 1 + quarter + + down + + + + + + + + + G + 5 + + 1 + 1 + 16th + down + begin + begin + + + + A + 5 + + 1 + 1 + 16th + down + end + end + + + + + + + B + 5 + + 6 + 1 + quarter + + down + + + + + + + + + A + 5 + + 1 + 1 + 16th + down + begin + begin + + + + B + 5 + + 1 + 1 + 16th + down + end + end + + + + C + 6 + + 4 + 1 + quarter + down + + + + 4 + 1 + quarter + + + + + + + D + 5 + + 16 + 1 + whole + + + + + + + + + + + C + 5 + + 1 + 16th + up + begin + begin + + + + + D + 5 + + 1 + 16th + up + end + end + + + + + + + + + + + + + 22 + 0 + + 167 + + + + + C + 5 + + 4 + 1 + quarter + down + + + + 4 + 1 + quarter + + + + 8 + 1 + half + + + light-heavy + + + + + diff --git a/files/xml2guido/XML2GUIDO-TiedTrill.xml b/files/xml2guido/XML2GUIDO-TiedTrill.xml new file mode 100644 index 000000000..f18f2d5c3 --- /dev/null +++ b/files/xml2guido/XML2GUIDO-TiedTrill.xml @@ -0,0 +1,461 @@ + + + + D’un matin de printemps + + Lili Boulanger + www.antescofo.com + + Finale v25 for Mac + 2021-05-26 + + + + + + + + + + 6.4514 + 40 + + + 1842 + 1302 + + 93 + 93 + 93 + 93 + + + + + 0 + 0 + + 154 + 104 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + D’un matin de printemps + + + composer + Lili Boulanger + + + + Violin + Vn. + + ePlayerDemo + strings.violin + + + + ARIA Player + + 1 + 1 + 80 + -63 + + + + + + + + + + 68 + 0 + + 232 + + system + + + 8 + + 0 + major + + + + G + 2 + + + + + + 1 + + + + + rubato, suivez + + + + + +

      + + + + + + + B + 3 + + 24 + + 1 + half + + up + + + + + + + + + + + + + + B + 3 + + 24 + + + 1 + half + + up + + + + + + + + + + + B + 3 + + 24 + + + 1 + half + + up + + + + + + + + + + -8 + + + + + + + + + + + + 8 + + + + + + 8 + + + + B + 3 + + 32 + + 1 + whole + + + + + + + + + + + + + + + + + + + + + B + 3 + + 24 + + 1 + half + + up + + + + + sharp + + + + + + + + + + B + 3 + + 24 + + + 1 + half + + up + + + + + + + + + + + 128 + + + + + B + 3 + + 24 + + + 1 + half + + up + + + + + + + + + + + + + + + + + + + B + 3 + + 32 + + 1 + whole + + + + + + + + + + + + + + + + + + B + 3 + + 24 + + 1 + half + + up + + + + + + + + + + + + + + + 8 + + + + B + 3 + + 32 + + + 1 + whole + + + + + + + + + + + + + + + + + + + B + 3 + + 4 + + 1 + eighth + up + + + + + + + + + + 4 + 1 + eighth + + + + 8 + 1 + quarter + + + + 8 + 1 + quarter + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 8f78e0628..423fe978f 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2146,7 +2146,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (nv.fTrill) { Sguidoelement tag; - tag = guidotag::create("trill"); + tag = guidotag::create("trillBegin"); // parse accidental-mark as it'll be used by all string accidentalMark=""; @@ -2188,20 +2188,26 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) else { // if there is no wavy-line, then the Trill should be closed in this scope! fSingleScopeTrill = true; + // remove the default wavy-line then: + tag->add(guidoparam::create("wavy=\"off\"", false)); } - push(tag); + add(tag); } } void xmlpart2guido::checkWavyTrillEnd ( const notevisitor& nv ) { - if (nv.fTrill) pop(); + Sguidoelement tag; + tag = guidotag::create("trillEnd"); if (nv.getWavylines().size() > 0) { std::vector::const_iterator i; for (i = nv.getWavylines().begin(); i != nv.getWavylines().end(); i++) { if ((*i)->getAttributeValue("type") == "stop") { + if (fWavyTrillOpened) { + add(tag); + } fWavyTrillOpened = false; } } @@ -2209,6 +2215,7 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) else if (fSingleScopeTrill) { fSingleScopeTrill = false; + add(tag); } } From 1306e3f7178387df9b3a5929776601ecd62b80ce Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 26 May 2021 10:39:54 +0200 Subject: [PATCH 104/164] xml2guido: Finalize unit tests for trill conversions --- ...CrossStaff.xml => GUID-157-CrossStaff.xml} | 0 ...avy.xml => GUID-24-trill-wavy-nonwavy.xml} | 0 files/xml2guido/GUID-67-articulatedTrill1.xml | 373 ++++++++++++++++++ 3 files changed, 373 insertions(+) rename files/xml2guido/{GUID157-CrossStaff.xml => GUID-157-CrossStaff.xml} (100%) rename files/xml2guido/{GUID24-trill-wavy-nonwavy.xml => GUID-24-trill-wavy-nonwavy.xml} (100%) create mode 100644 files/xml2guido/GUID-67-articulatedTrill1.xml diff --git a/files/xml2guido/GUID157-CrossStaff.xml b/files/xml2guido/GUID-157-CrossStaff.xml similarity index 100% rename from files/xml2guido/GUID157-CrossStaff.xml rename to files/xml2guido/GUID-157-CrossStaff.xml diff --git a/files/xml2guido/GUID24-trill-wavy-nonwavy.xml b/files/xml2guido/GUID-24-trill-wavy-nonwavy.xml similarity index 100% rename from files/xml2guido/GUID24-trill-wavy-nonwavy.xml rename to files/xml2guido/GUID-24-trill-wavy-nonwavy.xml diff --git a/files/xml2guido/GUID-67-articulatedTrill1.xml b/files/xml2guido/GUID-67-articulatedTrill1.xml new file mode 100644 index 000000000..980143ff4 --- /dev/null +++ b/files/xml2guido/GUID-67-articulatedTrill1.xml @@ -0,0 +1,373 @@ + + + + + © + + Finale 2014.5 for Mac + Dolet 6.9 for Finale + 2017-03-15 + + + + + + + + + + 7.2319 + 40 + + + 1545 + 1194 + + 140 + 70 + 70 + 70 + + + + + 0 + 0 + + 121 + 70 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + rights + © + + + Score + + + + MusicXML Part + + ARIA Player + + + Bank 1 + + 1 + 1 + 80 + 0 + + + + + + + + + + 70 + 0 + + 177 + + system + + + 8 + + 0 + major + + + + G + 2 + + + + + + + + + + + C + 6 + + 16 + 1 + half + down + + + + + flat + + + + + + + + D + -1 + 6 + + 8 + 1 + quarter + flat + down + + + + + + + + + D + 6 + + 8 + 1 + quarter + natural + down + + + + + flat + + + + + + + + E + 6 + + 8 + 1 + quarter + down + + + + + + + + + F + 6 + + 4 + 1 + eighth + down + begin + + + + + + + + + G + 6 + + 4 + 1 + eighth + down + end + + + + + flat + + + + + + + -1 + + + + + + + 5 + + + + + A + -1 + 6 + + 16 + + 1 + half + flat + down + + + + + + + + + + G + 6 + + 2 + 1 + 16th + down + begin + begin + + + + + + + F + 6 + + 2 + 1 + 16th + down + continue + continue + + + + D + -1 + 6 + + 2 + 1 + 16th + flat + down + continue + continue + + + + A + -1 + 5 + + 2 + 1 + 16th + flat + down + end + end + + + + + + + G + 5 + + 2 + 1 + 16th + down + begin + begin + + + + + + + B + 5 + + 2 + 1 + 16th + natural + down + continue + continue + + + + D + 6 + + 2 + 1 + 16th + natural + down + continue + continue + + + + F + 6 + + 2 + 1 + 16th + down + end + end + + + + + + light-heavy + + + + + From 8c840dc2496c86c1827db2e225255979db2564b8 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 26 May 2021 11:25:08 +0200 Subject: [PATCH 105/164] xml2guido: Made tempo wording parse additive (QI-199) --- src/guido/xmlpart2guido.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 423fe978f..24380c6c7 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -577,7 +577,7 @@ bool xmlpart2guido::checkMeasureRange() { } if (generateTempo) { - tempoWording = element->getValue(); + tempoWording += element->getValue(); } string wordPrefix=""; From e2a35fed16fdd307c56050095ad78e4394f98389 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 26 May 2021 12:38:20 +0200 Subject: [PATCH 106/164] xml2guido: fix size and position inheritance of composite XML S_WORDS in one S_DIRECTION --- src/guido/xmlpart2guido.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 24380c6c7..d9f486cb7 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -560,6 +560,8 @@ bool xmlpart2guido::checkMeasureRange() { if ((*iter)->getType() == k_direction_type) { + string font_size; + ctree::literator directionTypeElements; for (directionTypeElements = (*iter)->lbegin(); directionTypeElements != (*iter)->lend(); directionTypeElements++) { int elementType = (*directionTypeElements)->getType(); @@ -576,6 +578,9 @@ bool xmlpart2guido::checkMeasureRange() { generateTempo = true; } + std::stringstream wordParameters; + std::stringstream parameters; + if (generateTempo) { tempoWording += element->getValue(); } @@ -599,14 +604,19 @@ bool xmlpart2guido::checkMeasureRange() { } } - std::stringstream wordParameters; - std::stringstream parameters; - // string font_family = element->getAttributeValue("font-family"); // if (font_family.size()) // parameters << ",font=\""+font_family+"\""; - string font_size = element->getAttributeValue("font-size"); + string thisFontSize = element->getAttributeValue("font-size"); + // for composite Words, we retain only the largest font-size + if (!font_size.empty()) { + float lastFS = std::stof(font_size); + float thisFS = std::stof(thisFontSize); + if (thisFS>lastFS) { + font_size = thisFontSize; + } + } string font_weight = element->getAttributeValue("font-weight"); string font_style = element->getAttributeValue("font-style"); @@ -625,7 +635,10 @@ bool xmlpart2guido::checkMeasureRange() { if (generateTempo) { // Convert dy to Guido Tempo Tag origin which is +4hs from top of the staff float tempoDy = xml2guidovisitor::getYposition(element, -4, true); - parameters << ", dy="< commonDy) { + commonDy = tempoDy; + } + parameters << ", dy="< Date: Wed, 26 May 2021 15:39:46 +0200 Subject: [PATCH 107/164] xml2guido: consider print-object=no when generating notes + improved slur closing search --- src/guido/xmlpart2guido.cpp | 21 ++++++++++++++++++--- src/visitors/notevisitor.cpp | 7 +++++++ src/visitors/notevisitor.h | 4 ++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index d9f486cb7..5915930c6 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1580,6 +1580,8 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { //cerr<< "\t\t\t FOUND Slur stop line:"<< iterSlur->getInputLineNumber()<< " voice:"<getAttributeIntValue("number", 0)<& nvs, rational posInMeasur { // Check for Tied Begin checkTiedBegin(nv.getTied()); + + bool printObject = nv.printObject(); // Fingering is tied to single notes (in chords) int hasFingerings = 0; // 0 if none, greater otherwise! @@ -2728,11 +2737,17 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur string name = noteName(nv); guidonoteduration dur = noteDuration(nv); - Sguidoelement note = guidonote::create(fTargetVoice, name, octave, dur, accident); + Sguidoelement note; + + if (printObject) { + note = guidonote::create(fTargetVoice, name, octave, dur, accident); + }else { + note = guidonote::create(fTargetVoice, "empty", 0, dur, ""); + } /// Force Accidental if accidental XML tag is present bool forcedAccidental = false; - if (!nv.fCautionary.empty()) + if (!nv.fCautionary.empty() && printObject) { Sguidoelement accForce = guidotag::create("acc"); push(accForce); @@ -2740,7 +2755,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } /// MusicXML from Finale can skip the Cautionary and just enter Accidental for those inclued in the key! - if ((forcedAccidental==false) && (nv.fAccidental.empty() == false)) { + if ((forcedAccidental==false) && (nv.fAccidental.empty() == false) && printObject) { Sguidoelement accForce = guidotag::create("acc"); push(accForce); forcedAccidental = true; diff --git a/src/visitors/notevisitor.cpp b/src/visitors/notevisitor.cpp index d31e55ea7..6fda4bcd4 100644 --- a/src/visitors/notevisitor.cpp +++ b/src/visitors/notevisitor.cpp @@ -87,6 +87,7 @@ void notevisitor::reset () fHarmonic = (void*)0; fSnapPizzicato = (void*)0; fStaccatissimo = (void*)0; + shouldPrint = true; } //________________________________________________________________________ @@ -225,6 +226,12 @@ void notevisitor::visitStart ( S_note& elt ) fThisSNote = elt; x_default = elt->getAttributeIntValue("default-x", -1); + + if (elt->getAttributeValue("print-object")=="no") { + shouldPrint = false; + }else { + shouldPrint = true; + } } //________________________________________________________________________ diff --git a/src/visitors/notevisitor.h b/src/visitors/notevisitor.h index ea534890a..81c3fb72b 100644 --- a/src/visitors/notevisitor.h +++ b/src/visitors/notevisitor.h @@ -130,6 +130,8 @@ class EXP notevisitor : S_note getSnote() const { return fThisSNote; } float getNoteHeadDy(string fCurClef) const; std::string getNoteheadType() const; + + bool printObject() const {return shouldPrint; } /*! \brief Compute the note MIDI pitch. @@ -261,6 +263,8 @@ class EXP notevisitor : float fLyricsDy; S_note fThisSNote; + + bool shouldPrint; }; EXP std::ostream& operator<< (std::ostream& os, const notevisitor& elt); From 79c5e3bdda0bc7eee31914edc08202f58b2922f6 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 27 May 2021 10:19:31 +0200 Subject: [PATCH 108/164] xml2guido: fixed orientation inheritance from Ties --- src/guido/xmlpart2guido.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 5915930c6..8b335c14b 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1443,6 +1443,8 @@ void xmlpart2guido::parseTime(ctree::iterator &iter) { string placement = (*i)->getAttributeValue("orientation"); if (placement == "under") tag->add (guidoparam::create("curve=\"down\"", false)); + if (placement == "over") + tag->add (guidoparam::create("curve=\"up\"", false)); add(tag); } } From c620fe40e05b9d1806da697f9b0106adad0c1c9a Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 8 Jul 2021 13:32:58 +0200 Subject: [PATCH 109/164] xml2guido: Bypass notestatus avoiding octave parsing in guido note names as it conflicts with Partial rendering --- src/guido/guido.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/guido/guido.cpp b/src/guido/guido.cpp index 15d055a8f..12df87b66 100644 --- a/src/guido/guido.cpp +++ b/src/guido/guido.cpp @@ -200,12 +200,15 @@ void guidonote::set (unsigned short voice, string name, char octave, guidonotedu if (!acc.empty()) s << acc; if (name != "empty") { - if (!status) - s << (int)octave; - else if (status->fOctave != octave) { - s << (int)octave; - status->fOctave = octave; - } + // AC 2021: Not generating Octave will cause problems when parsing Partial XML + s << (int)octave; + status->fOctave = octave; +// if (!status) +// s << (int)octave; +// else if (status->fOctave != octave) { +// s << (int)octave; +// status->fOctave = octave; +// } } } //// AC Note 20/02/2017: Not generating Durations, causes problems on multi-voice scores with Pickup measures! From 698e466738525c143aebb62881db8e0314b1ff2e Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 9 Jul 2021 12:12:57 +0200 Subject: [PATCH 110/164] xml2guido: Fixed endPosition calculation for partial parsing --- src/guido/xmlpart2guido.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 8b335c14b..8010b6eee 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -398,6 +398,11 @@ bool xmlpart2guido::checkMeasureRange() { sLayout = elt->find(k_staff_layout, sLayout++); } + + /// Report ending position for partial parsing + if ((fEndMeasure>0) && (fMeasNum == fEndMeasure+fEndMeasureOffset+1)) { + fEndPosition = fCurrentScorePosition; + } } //______________________________________________________________________________ @@ -424,10 +429,6 @@ bool xmlpart2guido::checkMeasureRange() { fDoubleBar = true; } - - if ((fEndMeasure>0)&&(fEndMeasure+1 == fMeasNum)) { - fEndPosition = fCurrentScorePosition; - } } //______________________________________________________________________________ From b47bc5a7fa1c28ec885b495f48daceb7b81b3d0c Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 19 Jul 2021 15:30:04 +0200 Subject: [PATCH 111/164] xml2guido: expose musicxml pedal marks for piano to Guido --- src/guido/xmlpart2guido.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 8010b6eee..f34134fc8 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -569,6 +569,26 @@ bool xmlpart2guido::checkMeasureRange() { auto element = (*directionTypeElements); switch (elementType) { + case k_pedal: + { + // default-y for pedal is from the top line of the staff in XML, in Guido dy=0 is the C below the lowest line. + std::string pedalType = element->getAttributeValue("type"); + if ( (pedalType== "start") || (pedalType == "sostenuto")) { + tag = guidotag::create("pedalOn"); + }else + if ( (pedalType== "stop") || (pedalType == "discontinue")) { + tag = guidotag::create("pedalOff"); + } + + xml2guidovisitor::addPosY(element, tag, 14.0, 1.0); + + if (fCurrentOffset) + addDelayed(tag, fCurrentOffset); + else { + add(tag); + } + } + break; case k_words: { /// GUID-147: Detect Tempo Markups using specific substrings such as "Andante" etc. From c6021f02dc9ac3262173e21c52a7c24b51d27555 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 19 Jul 2021 18:48:25 +0200 Subject: [PATCH 112/164] xml2guido: fix relative-x for pedal positioning --- src/guido/xml2guidovisitor.cpp | 5 ++++- src/guido/xmlpart2guido.cpp | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index f64d4cc94..3f42b66a2 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -408,7 +408,10 @@ namespace MusicXML2 } void xml2guidovisitor::addRelativeX(Sxmlelement elt, Sguidoelement& tag, float xoffset){ - float posx = elt->getAttributeFloatValue("relative-x", 0); + float posx = elt->getAttributeFloatValue("relative-x", 0.0); + if (posx == 0.0) { + return; + } posx = (posx / 10) * 2; // convert to half spaces posx += xoffset; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index f34134fc8..0a53dfe10 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -581,6 +581,7 @@ bool xmlpart2guido::checkMeasureRange() { } xml2guidovisitor::addPosY(element, tag, 14.0, 1.0); + xml2guidovisitor::addRelativeX(element, tag, -2); // -2 offset estimating font width if (fCurrentOffset) addDelayed(tag, fCurrentOffset); @@ -1055,7 +1056,7 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) } const string& type = elt->getAttributeValue("type"); - int size = elt->getAttributeIntValue("size", 0); + int size = elt->getAttributeIntValue("size", 8); switch (size) { case 8: size = 1; break; From 10cbd703946447a4efce0ca1aef23c92e963f635 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 23 Jul 2021 20:00:11 +0200 Subject: [PATCH 113/164] xml2guido: improve pedal and implement pedal type "change" --- src/guido/xmlpart2guido.cpp | 38 ++++++++++++++++++++++++++++++++++--- src/guido/xmlpart2guido.h | 1 + 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 0a53dfe10..f480b3738 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -571,23 +571,55 @@ bool xmlpart2guido::checkMeasureRange() { switch (elementType) { case k_pedal: { + if (fCurrentOffset < 0) { + continue; + // FIXME: Handle negative offsets! + } + bool isPedalChange = false; // default-y for pedal is from the top line of the staff in XML, in Guido dy=0 is the C below the lowest line. std::string pedalType = element->getAttributeValue("type"); if ( (pedalType== "start") || (pedalType == "sostenuto")) { tag = guidotag::create("pedalOn"); + fPreviousPedalYPos = xml2guidovisitor::getYposition(element, 14.0, true); }else if ( (pedalType== "stop") || (pedalType == "discontinue")) { tag = guidotag::create("pedalOff"); } - - xml2guidovisitor::addPosY(element, tag, 14.0, 1.0); - xml2guidovisitor::addRelativeX(element, tag, -2); // -2 offset estimating font width + else if ( (pedalType== "change")) { + tag = guidotag::create("pedalOff"); + isPedalChange = true; + } + + if (pedalType != "change") { + xml2guidovisitor::addPosY(element, tag, 14.0, 1.0); + xml2guidovisitor::addRelativeX(element, tag, -2); // -2 offset estimating font width + }else { + if (fPreviousPedalYPos) { + stringstream s; + s << "dy=" << fPreviousPedalYPos << "hs, dx="<< -2<<"hs"; + tag->add (guidoparam::create(s.str(), false)); + } + } if (fCurrentOffset) addDelayed(tag, fCurrentOffset); else { add(tag); } + + if (isPedalChange) { + tag = guidotag::create("pedalOn"); + if (fPreviousPedalYPos) { + stringstream s; + s << "dy=" << fPreviousPedalYPos << "hs, dx="<< 0<<"hs"; + tag->add (guidoparam::create(s.str(), false)); + } + if (fCurrentOffset) + addDelayed(tag, fCurrentOffset); + else { + add(tag); + } + } } break; case k_words: diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 8d40fe9e6..bf3a321b5 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -272,6 +272,7 @@ public visitor // to get clef, division, staves, time and Sguidoelement lastKey; // Storage used for Partial Conversions Sguidoelement lastMeter; // Storage used for Partial Conversions + double fPreviousPedalYPos; // Used for musicxml pedal change }; From 2935eae5d7b6fdf20fe2e2695a3b0eed2a6fcf71 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Sat, 31 Jul 2021 08:41:04 +0200 Subject: [PATCH 114/164] xml2guido: Fix note head position inference from MusicXML --- src/guido/xml2guidovisitor.h | 2 +- src/guido/xmlpart2guido.cpp | 133 +++++++++++++++-------------------- src/guido/xmlpart2guido.h | 6 +- 3 files changed, 61 insertions(+), 80 deletions(-) diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index 645dbb91c..af8de1e76 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -115,7 +115,7 @@ public clefvisitor static int defaultStaffDistance; // xml staff-distance value in defaults /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) - std::map< int, std::map< rational, std::vector > > timePositions; + std::map< int, std::map< double, std::vector > > timePositions; std::map stavesInPart; std::map > clefsInPart; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index f480b3738..d0b2245fc 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -588,6 +588,8 @@ bool xmlpart2guido::checkMeasureRange() { else if ( (pedalType== "change")) { tag = guidotag::create("pedalOff"); isPedalChange = true; + }else { + continue; } if (pedalType != "change") { @@ -2818,11 +2820,35 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } /// Add Note head of X offset for note if necessary + bool noteFormat = checkNoteFormat(nv, posInMeasure); + + add (note); + + checkTiedEnd(nv.getTied()); + + + if (noteFormat) + pop(); + + if (forcedAccidental) + pop(); + + if (hasFingerings > 0) { + while (hasFingerings>0) { + pop(); + hasFingerings--; + } + } + + } + + bool xmlpart2guido::checkNoteFormat ( const notevisitor& nv , rational posInMeasure) + { bool noteFormat = false; int measureNum = fCurrentMeasure->getAttributeIntValue("number", 0); auto timePos4measure = timePositions.find(measureNum); if ( (nv.fNotehead - || ((timePos4measure != timePositions.end()) && fPendingBar==true ) ) // if we need to infer default-x but NOT on incomplete measures + || ((timePos4measure != timePositions.end()) && fPendingBar==false ) ) // if we need to infer default-x but NOT on incomplete measures && fInGrace==false // FIXME: Workaround for GUID-74 ) { @@ -2840,8 +2866,8 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } } - /// check for dx inference from default_x but avoid doing this for Chords as Guido handles this automatically! - if (timePos4measure != timePositions.end() && (isProcessingChord==false) && fPendingBar==true) { + /// check for dx inference from default_x but avoid doing this for Chords as Guido handles note head positions in chords automatically + if (timePos4measure != timePositions.end() && (isProcessingChord==false) && fPendingBar==false) { auto voiceInTimePosition = timePos4measure->second.find(posInMeasure); if (voiceInTimePosition != timePos4measure->second.end()) { auto minXPos = std::min_element(voiceInTimePosition->second.begin(),voiceInTimePosition->second.end() ); @@ -2861,56 +2887,8 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur push(noteFormatTag); } } - - add (note); - - checkTiedEnd(nv.getTied()); - - - if (noteFormat) - pop(); - - if (forcedAccidental) - pop(); - - if (hasFingerings > 0) { - while (hasFingerings>0) { - pop(); - hasFingerings--; - } - } - } - - int xmlpart2guido::checkNoteFormatDx ( const notevisitor& nv , rational posInMeasure) - { - int measureNum = fCurrentMeasure->getAttributeIntValue("number", 0); - auto timePos4measure = timePositions.find(measureNum); - - if ( timePos4measure != timePositions.end()) - { - Sguidoelement noteFormatTag = guidotag::create("noteFormat"); - - /// check for dx inference from default_x but avoid doing this for Chords as Guido handles this automatically! - if (timePos4measure != timePositions.end() && (isProcessingChord==false)) { - auto voiceInTimePosition = timePos4measure->second.find(posInMeasure); - if (voiceInTimePosition != timePos4measure->second.end()) { - auto minXPos = std::min_element(voiceInTimePosition->second.begin(),voiceInTimePosition->second.end() ); - if (nv.x_default != *minXPos) { - int noteDx = ( (nv.x_default - *minXPos)/ 10 ) * 2; // convert to half spaces - - stringstream s; - s << "dx=" << noteDx ; - noteFormatTag->add (guidoparam::create(s.str(), false)); - push(noteFormatTag); - }else - return 0; - }else - return 0; - } - } - - return 1; + return noteFormat; } int xmlpart2guido::checkRestFormat ( const notevisitor& nv ) @@ -2990,31 +2968,8 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur bool scanVoice = (notevisitor::getVoice() == fTargetVoice); if (!isGrace() ) { - ///Track all voice default-x parameters, as positions in measures - - if (true) { // had fNotesOnly - auto timePos4measure = timePositions.find(fMeasNum); - if (notevisitor::x_default != -1) { - if ( timePos4measure != timePositions.end()) - { - - if (timePos4measure->second.find(fCurrentVoicePosition) != timePos4measure->second.end()) - { - // Exists.. push it to vector - timePos4measure->second.find(fCurrentVoicePosition)->second.push_back(notevisitor::x_default); - }else { - // Doesn't exist.. insert with this element's x_default - timePos4measure->second.insert(std::pair > - (fCurrentVoicePosition, std::vector(1, notevisitor::x_default)) ); - } - }else { - std::map > inner; - inner.insert(std::make_pair(fCurrentVoicePosition, std::vector(1, notevisitor::x_default))); - timePositions.insert(std::make_pair(fMeasNum, inner)); - } - } - } - + addTimePosition(*this); + moveMeasureTime (getDuration(), scanVoice); checkDelayed (getDuration()); // check for delayed elements (directions with offset) } @@ -3106,6 +3061,30 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur { fCurrentDivision = (long)(*elt); } + +///Track all voice default-x parameters, as positions in measures +void xmlpart2guido::addTimePosition(const notevisitor& nv) { + auto timePos4measure = timePositions.find(fMeasNum); + double doubleVoicePosition = fCurrentVoicePosition.toDouble(); + if (nv.x_default != -1) { + if ( timePos4measure != timePositions.end()) + { + if (timePos4measure->second.find(doubleVoicePosition) != timePos4measure->second.end()) + { + // Exists.. push it to vector + timePos4measure->second.find(doubleVoicePosition)->second.push_back(nv.x_default); + }else { + // Doesn't exist.. insert with this element's x_default + timePos4measure->second.insert(std::pair > + (doubleVoicePosition, std::vector(1, nv.x_default)) ); + } + }else { + std::map > inner; + inner.insert(std::make_pair(doubleVoicePosition, std::vector(1, nv.x_default))); + timePositions.insert(std::make_pair(fMeasNum, inner)); + } + } +} // MARK: Tag Add Methods using element parsing float xmlpart2guido::xPosFromTimePos(float default_x, float relative_x) { diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index bf3a321b5..8f44c4ad8 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -164,7 +164,7 @@ public visitor // to get clef, division, staves, time and void checkTiedEnd ( const std::vector& tied ); void checkVoiceTime ( const rational& currTime, const rational& voiceTime); int checkRestFormat ( const notevisitor& nv ); - int checkNoteFormatDx ( const notevisitor& nv , rational posInMeasure); + bool checkNoteFormat ( const notevisitor& nv , rational posInMeasure); void checkWavyTrillBegin ( const notevisitor& nv ); void checkWavyTrillEnd ( const notevisitor& nv ); void checkTextEnd(); @@ -248,7 +248,7 @@ public visitor // to get clef, division, staves, time and /// Map for staffNum, measureNum, voice-Position and Clef std::multimap > > staffClefMap; /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) - std::map< int, std::map< rational, std::vector > > timePositions; + std::map< int, std::map< double, std::vector > > timePositions; rational fStartPosition, fEndPosition; @@ -273,6 +273,8 @@ public visitor // to get clef, division, staves, time and Sguidoelement lastKey; // Storage used for Partial Conversions Sguidoelement lastMeter; // Storage used for Partial Conversions double fPreviousPedalYPos; // Used for musicxml pedal change + + void addTimePosition(const notevisitor& nv); }; From b22bfaa2a7d8e9c3fcee94069098cc02408e12b2 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Sat, 31 Jul 2021 08:49:45 +0200 Subject: [PATCH 115/164] xml2guido: Avoid parsing noteFormat on Rests --- src/guido/xmlpart2guido.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index d0b2245fc..d7fd0e1fc 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2820,7 +2820,9 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } /// Add Note head of X offset for note if necessary - bool noteFormat = checkNoteFormat(nv, posInMeasure); + bool noteFormat = false; + if (nv.getType() != kRest) + noteFormat = checkNoteFormat(nv, posInMeasure); add (note); From 587417d28c8f757b6a5b975c68197669c7f53a05 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 2 Aug 2021 16:30:27 +0200 Subject: [PATCH 116/164] xml2guido: - Moved timePosition to dedicated class where partSummary provides look-ahead of default-x positions for processing during incremental visits - Added unit test for noteHeadDx - Fixed minor issue when generating wedges with positive offsets --- files/xml2guido/XML2GUIDO-noteHeadDx.xml | 479 +++++++++++++++++++++++ src/guido/timePositions.cpp | 57 +++ src/guido/timePositions.h | 54 +++ src/guido/xml2guidovisitor.cpp | 10 +- src/guido/xml2guidovisitor.h | 3 - src/guido/xmlpart2guido.cpp | 141 ++----- src/guido/xmlpart2guido.h | 15 +- src/visitors/partsummary.cpp | 44 +++ src/visitors/partsummary.h | 23 +- 9 files changed, 705 insertions(+), 121 deletions(-) create mode 100644 files/xml2guido/XML2GUIDO-noteHeadDx.xml create mode 100644 src/guido/timePositions.cpp create mode 100644 src/guido/timePositions.h diff --git a/files/xml2guido/XML2GUIDO-noteHeadDx.xml b/files/xml2guido/XML2GUIDO-noteHeadDx.xml new file mode 100644 index 000000000..5b33857a6 --- /dev/null +++ b/files/xml2guido/XML2GUIDO-noteHeadDx.xml @@ -0,0 +1,479 @@ + + + + Symphony No.5 + + Gustav Mahler + Jean-Yves Malmasson + www.antescofo.com + + Finale v25 for Mac + 2021-07-31 + + + + + + + + + + 6.35 + 40 + + + 1871 + 1323 + + 94 + 94 + 94 + 94 + + + + + 0 + 0 + + 145 + 94 + + + 80 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 8 + + + + + + + rights + www.antescofo.com + + + title + Symphony No.5 + + + composer + Gustav Mahler + + + subtitle + 4. Adagietto + + + arranger + arr. Jean-Yves Malmasson + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 63 + 0 + + 221 + + + 93 + + system + + + 2 + + -1 + major + + + 2 + + G + 2 + + + F + 4 + + + + + + G + 4 + + 8 + 1 + whole + 1 + + + 4 + + + + + 8 + + + + F + 4 + + 4 + 2 + half + down + 1 + + + + F + 4 + + 4 + 2 + half + down + 1 + + + 8 + + + + 8 + 3 + 2 + + + + + + + 8 + 1 + 1 + + + 8 + + + 4 + 3 + 2 + + + + C + 3 + + 1 + 3 + eighth + up + 2 + begin + + + + 5 + + + + + + F + 3 + + 1 + 3 + eighth + up + 2 + continue + + + + A + 3 + + 1 + 3 + eighth + up + 2 + continue + + + + F + 3 + + 1 + 3 + eighth + up + 2 + end + + + + + + 8 + + + 4 + 4 + 2 + + + + C + 3 + + 4 + 4 + half + down + 2 + + + + + + + B + 4 + + 2 + 1 + quarter + natural + up + 1 + + + + 3 + 4 + + + + + + C + 5 + + 4 + 1 + half + up + 1 + + + + E + 4 + + 1 + 1 + eighth + up + 1 + begin + + + 1 + + + + + + F + 4 + + 1 + 1 + eighth + up + 1 + end + + + + + + 8 + + + + A + 4 + + 6 + 2 + half + + down + 1 + + + 2 + 2 + 1 + + + 8 + + + + 8 + 3 + 2 + + + + + + + 8 + 1 + 1 + + + 8 + + + + C + 1 + 4 + + 2 + 3 + quarter + sharp + up + 2 + + + + 2 + 3 + + + + + + D + 4 + + 4 + 3 + half + up + 2 + + + + 1 + + + + + + B + -1 + 3 + + 2 + 3 + quarter + down + 1 + + + 1 + + + + + 8 + + + + B + -1 + 3 + + 6 + 4 + half + + down + 2 + + + + C + 3 + + 2 + 4 + quarter + down + 2 + + + 5 + + + + + light-heavy + + + + + diff --git a/src/guido/timePositions.cpp b/src/guido/timePositions.cpp new file mode 100644 index 000000000..cd76bdead --- /dev/null +++ b/src/guido/timePositions.cpp @@ -0,0 +1,57 @@ +// +// mxmlPartTimePositions.cpp +// libmusicxml2 +// +// Created by Arshia Cont on 02/08/2021. +// + +#include "timePositions.h" + +void MusicXMLTimePositions::addTimePosition(int measure, double positionInMeasure, const MusicXML2::notevisitor& nv) { + auto timePos4measure = timePositions.find(measure); + if (nv.x_default != -1) { + if ( timePos4measure != timePositions.end()) + { + VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice()); + timePos4measure->second.push_back(inner); + }else { + VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice()); + std::vector innerVec(1, inner); + timePositions.insert(std::make_pair(measure, innerVec)); + } + } +} + + +float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voiceId, long xmlOffset) { + auto timePos4measure = timePositions.find(onMeasure); + float default_x = element->getAttributeFloatValue("default-x", 0), + relative_x = element->getAttributeFloatValue("relative-x", 0); + + float xpos = default_x + relative_x; + + // MusicXML DOC: If an element within a includes a default-x attribute, the value will be ignored when determining the appearance of that element. + double finalPosition = position + (default_x == 0 ? (double)xmlOffset : 0.0); + + if (timePos4measure != timePositions.end()) { + auto it = std::find_if(timePos4measure->second.begin(), timePos4measure->second.end(), [voiceId, finalPosition] (const VoicedTimePosition& e) { + if ((voiceId > 0) && (std::get<2>(e) != voiceId) ) { + return false; + } + + return std::get<0>(e) == finalPosition; + }); + if (it != timePos4measure->second.end()) { + float minXPos = getDefaultX(*it); + if (xpos != minXPos) { + int finalDx = (relative_x/10)*2; + // apply default-x ONLY if it exists + if (default_x!=0) + finalDx = ( (xpos - minXPos)/ 10 ) * 2; // convert to half spaces + + return finalDx; + } + } + } + return -999; // This is when the xpos can not be computed +} diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h new file mode 100644 index 000000000..de1cbddc2 --- /dev/null +++ b/src/guido/timePositions.h @@ -0,0 +1,54 @@ +// +// mxmlPartTimePositions.hpp +// libmusicxml2 +// +// Created by Arshia Cont on 02/08/2021. +// + +#ifndef mxmlTimePositions_hpp +#define mxmlTimePositions_hpp + +#include +#include +#include + +#include "xml.h" +#include "notevisitor.h" + +class MusicXMLTimePositions +{ +public: + MusicXMLTimePositions() { + timePositions.clear(); + }; + MusicXMLTimePositions(const MusicXMLTimePositions &p1) { timePositions = p1.timePositions; } + + // relative position in measure (double), default_x, voice number + typedef std::tuple VoicedTimePosition; + + void addTimePosition(int measure, double positionInMeasure, const MusicXML2::notevisitor& nv); + + /// Finds appropriate Guido Dx based on default-x of a musicXML element by overlooking all elements in measure based on position and voice number + /// @param element the MusicXML element + /// @param position musical position in measure + /// @param onMeasure measure number (from musicXML) + /// @param voice voice number + /// @param xmlOffset MusicXML offset of the `element` if any + /// @return a float containing Guido dx value based on available default-x in measure + float getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voice, long xmlOffset); + + int size() { return timePositions.size(); } + +protected: + + + int getVoice(VoicedTimePosition e) { return std::get<2>(e); } + int getDefaultX(VoicedTimePosition e) { return std::get<1>(e); } + +private: + /// A map for measure number (first) to a vector Voiced Time Positions + std::map > timePositions; +}; + + +#endif /* mxmlPartTimePositions_hpp */ diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 3f42b66a2..7dc1142ec 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -40,7 +40,6 @@ namespace MusicXML2 fBeginMeasure(beginMeasure), fEndMeasure(endMeasure), fEndMeasureOffset(endMeasureOffset), fTotalMeasures(0) , fTotalDuration(0.0) { - timePositions.clear(); fPartsAvailable = 0; } @@ -211,9 +210,7 @@ namespace MusicXML2 int targetStaff = 0xffff; // initialized to a value we'll unlikely encounter bool notesOnly = false; rational currentTimeSign (0,1); - - //timePositions.clear(); - + // browse the parts voice by voice: allows to describe voices that spans over several staves for (unsigned int i = 0; i < voices->size(); i++) { int targetVoice = (*voices)[i]; @@ -225,8 +222,6 @@ namespace MusicXML2 notesOnly = false; targetStaff = mainstaff; fCurrentStaffIndex++; - /// Clear timePositions so that we only track voices on a specific Staff - timePositions.clear(); } Sguidoelement seq = guidoseq::create(); @@ -301,12 +296,11 @@ namespace MusicXML2 pv.generatePositions (fGeneratePositions); xml_tree_browser browser(&pv); pv.initialize(seq, targetStaff, fCurrentStaffIndex, targetVoice, notesOnly, currentTimeSign); - pv.timePositions = timePositions; + pv.timePositions = ps.timePositions; browser.browse(*elt); pop(); currentTimeSign = pv.getTimeSign(); previousStaffHasLyrics = pv.hasLyrics(); - timePositions = pv.timePositions; fBeginPosition = pv.fStartPosition; fEndPosition = pv.fEndPosition; diff --git a/src/guido/xml2guidovisitor.h b/src/guido/xml2guidovisitor.h index af8de1e76..0795632c2 100755 --- a/src/guido/xml2guidovisitor.h +++ b/src/guido/xml2guidovisitor.h @@ -114,9 +114,6 @@ public clefvisitor static int defaultStaffDistance; // xml staff-distance value in defaults - /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) - std::map< int, std::map< double, std::vector > > timePositions; - std::map stavesInPart; std::map > clefsInPart; std::string currentPart; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index d7fd0e1fc..25423ed79 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -434,8 +434,13 @@ bool xmlpart2guido::checkMeasureRange() { //______________________________________________________________________________ void xmlpart2guido::visitStart ( S_direction& elt ) { + // Directions can have voice! Check: + int voiceNumber = elt->getIntValue(k_voice, -1); + if (voiceNumber >0 && voiceNumber != fTargetVoice) { + fSkipDirection = true; + } // Parse Staff and Offset first - if (fNotesOnly || (elt->getIntValue(k_staff, 1) != fTargetStaff)) { + if (fNotesOnly || (elt->getIntValue(k_staff, 1) != fTargetStaff) ) { fSkipDirection = true; } else { @@ -473,7 +478,7 @@ bool xmlpart2guido::checkMeasureRange() { tag->add (guidoparam::create(rehearsalValue.c_str(), false)); //xml2guidovisitor::addPosition(elt, tag, -4, -4); // FIXME: Researsal is a Direction and its x-pos is from the beginning of measure where in Guido it is from current graphical position! - float markDx = xPosFromTimePos(elt->getAttributeFloatValue("default-x", 0), elt->getAttributeFloatValue("relative-x", 0)); + float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, fCurrentOffset); if (markDx != -999) { stringstream s; s << "dx=" << markDx ; @@ -751,7 +756,7 @@ bool xmlpart2guido::checkMeasureRange() { if ((*iter2)->getType() != k_other_dynamics) { tag = guidotag::create("intens"); tag->add (guidoparam::create((*iter2)->getName())); - float intensDx = xPosFromTimePos(element->getAttributeFloatValue("default-x", 0), element->getAttributeFloatValue("relative-x", 0)); + float intensDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, fCurrentOffset); // add pending word parameters (for "before") if (!generateAfter) { @@ -926,6 +931,15 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) Sguidoelement tag; if (type == "crescendo") { tag = guidotag::create("crescBegin"); + if (fCurrentOffset < 0) { + // FIXME: Impossible for now to handle Wedges with Direction Offset! Ignoring... . + fIgnoreWedgeWithOffset = true; + } + if (fIgnoreWedgeWithOffset) + { + cerr <<"\tIgnoring Wedge with Offset on measure "< 1) { /// fetch dx1 and dx2 value based on ending float posx1 = elt->getAttributeFloatValue("relative-x", 0); //elt->getAttributeFloatValue("default-x", 0) + @@ -2848,46 +2852,38 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur { bool noteFormat = false; int measureNum = fCurrentMeasure->getAttributeIntValue("number", 0); - auto timePos4measure = timePositions.find(measureNum); - if ( (nv.fNotehead - || ((timePos4measure != timePositions.end()) && fPendingBar==false ) ) // if we need to infer default-x but NOT on incomplete measures - && fInGrace==false // FIXME: Workaround for GUID-74 - ) - { - Sguidoelement noteFormatTag = guidotag::create("noteFormat"); + + Sguidoelement noteFormatTag = guidotag::create("noteFormat"); + + if (nv.fNotehead) { + std::string noteFormatType = nv.getNoteheadType(); - if (nv.fNotehead) { - std::string noteFormatType = nv.getNoteheadType(); - - if (noteFormatType.size()) - { - stringstream s; - s << "\"" << noteFormatType << "\""; - noteFormatTag->add (guidoparam::create(s.str(), false)); - noteFormat = true; - } + if (noteFormatType.size()) + { + stringstream s; + s << "\"" << noteFormatType << "\""; + noteFormatTag->add (guidoparam::create(s.str(), false)); + noteFormat = true; } - - /// check for dx inference from default_x but avoid doing this for Chords as Guido handles note head positions in chords automatically - if (timePos4measure != timePositions.end() && (isProcessingChord==false) && fPendingBar==false) { - auto voiceInTimePosition = timePos4measure->second.find(posInMeasure); - if (voiceInTimePosition != timePos4measure->second.end()) { - auto minXPos = std::min_element(voiceInTimePosition->second.begin(),voiceInTimePosition->second.end() ); - if (nv.x_default != *minXPos) { - int noteDx = ( (nv.x_default - *minXPos)/ 10 ) * 2; // convert to half spaces - + } + + int searchVoice = 0; + if (fTargetVoice) { + searchVoice = fTargetVoice - 1; + } + float noteDx = timePositions.getDxForElement(nv.getSnote(), posInMeasure.toDouble(), measureNum, searchVoice, 0); + // Do not infer default-x on incomplete measures, grace or Chords + if ( (noteDx != -999) && !fPendingBar && !isProcessingChord && !isGrace() ) + { stringstream s; s << "dx=" << noteDx ; noteFormatTag->add (guidoparam::create(s.str(), false)); noteFormat = true; - } - } - } + } - if (noteFormat == true) - { - push(noteFormatTag); - } + if (noteFormat == true) + { + push(noteFormatTag); } return noteFormat; @@ -2970,7 +2966,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur bool scanVoice = (notevisitor::getVoice() == fTargetVoice); if (!isGrace() ) { - addTimePosition(*this); + //addTimePosition(*this); moveMeasureTime (getDuration(), scanVoice); checkDelayed (getDuration()); // check for delayed elements (directions with offset) @@ -3064,57 +3060,6 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur fCurrentDivision = (long)(*elt); } -///Track all voice default-x parameters, as positions in measures -void xmlpart2guido::addTimePosition(const notevisitor& nv) { - auto timePos4measure = timePositions.find(fMeasNum); - double doubleVoicePosition = fCurrentVoicePosition.toDouble(); - if (nv.x_default != -1) { - if ( timePos4measure != timePositions.end()) - { - if (timePos4measure->second.find(doubleVoicePosition) != timePos4measure->second.end()) - { - // Exists.. push it to vector - timePos4measure->second.find(doubleVoicePosition)->second.push_back(nv.x_default); - }else { - // Doesn't exist.. insert with this element's x_default - timePos4measure->second.insert(std::pair > - (doubleVoicePosition, std::vector(1, nv.x_default)) ); - } - }else { - std::map > inner; - inner.insert(std::make_pair(doubleVoicePosition, std::vector(1, nv.x_default))); - timePositions.insert(std::make_pair(fMeasNum, inner)); - } - } -} - - // MARK: Tag Add Methods using element parsing - float xmlpart2guido::xPosFromTimePos(float default_x, float relative_x) { - auto timePos4measure = timePositions.find(fMeasNum); - - float xpos = default_x + relative_x; - - if ((xpos!=0.0)&&(timePos4measure != timePositions.end())) { - auto voiceInTimePosition = timePos4measure->second.find(fCurrentVoicePosition); - if (voiceInTimePosition != timePos4measure->second.end()) { - auto minXPos = std::min_element(voiceInTimePosition->second.begin(),voiceInTimePosition->second.end() ); - if (xpos != *minXPos) { - int finalDx = (relative_x/10)*2; - // apply default-x ONLY if it exists - if (default_x!=0) - finalDx = ( (xpos - *minXPos)/ 10 ) * 2; // convert to half spaces - - /// FIXME: Can't handle OFFSET with Guido! If positive, just add a small value for coherence! - if (fCurrentOffset>0) - finalDx +=3; - - return finalDx; - } - } - } - return -999; // This is when the xpos can not be computed - } - bool xmlpart2guido::findNextNote(ctree::iterator& elt, ctree::iterator &nextnote) { ctree::iterator nextnotetmp = fCurrentMeasure->find(k_note, elt); if (nextnotetmp != fCurrentMeasure->end()) nextnotetmp++; // advance one step diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 8f44c4ad8..9245f6074 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -94,9 +94,7 @@ public visitor // to get clef, division, staves, time and S_measure fCurrentMeasure; S_part fCurrentPart; - - int fStartMeasure, fEndMeasure, fEndMeasureOffset; // Starting and Ending measures for Partial conversion. Default=0 meaning non-partial. - + bool fNotesOnly; // a flag to generate notes only (used for several voices on the same staff) bool fSkipDirection; // a flag to skip direction elements (for notes only mode or due to different staff) int fCurrentStaffIndex; // the index of the current guido staff @@ -104,6 +102,8 @@ public visitor // to get clef, division, staves, time and int fTargetStaff; // the musicxml target staff (0 by default) int fTargetVoice; // the musicxml target voice (0 by default) + int fStartMeasure, fEndMeasure, fEndMeasureOffset; // Starting and Ending measures for Partial conversion. Default=0 meaning non-partial. + long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note long fCurrentOffset; // the current direction offset: represents an element relative displacement in current division unit rational fCurrentMeasureLength; // the current measure length (max of the current measure positions) @@ -232,9 +232,6 @@ public visitor // to get clef, division, staves, time and bool fIgnoreWedgeWithOffset; - // Internal Parsing facilities - float xPosFromTimePos(float default_x, float relative_x); /// Infer X-Position from TimePosition - public: xmlpart2guido(bool generateComments, bool generateStem, bool generateBar = true, int startMeasure = 0, int endMeasure = 0, int endMeasureOffset = 0); virtual ~xmlpart2guido() {} @@ -247,8 +244,8 @@ public visitor // to get clef, division, staves, time and /// Map for staffNum, measureNum, voice-Position and Clef std::multimap > > staffClefMap; - /// Containing default-x positions on a fCurrentVoicePosition (rational) of measure(int) - std::map< int, std::map< double, std::vector > > timePositions; + /// Containing default-x positions on a fCurrentVoicePosition (double) of measure(int) + MusicXMLTimePositions timePositions; rational fStartPosition, fEndPosition; @@ -273,8 +270,6 @@ public visitor // to get clef, division, staves, time and Sguidoelement lastKey; // Storage used for Partial Conversions Sguidoelement lastMeter; // Storage used for Partial Conversions double fPreviousPedalYPos; // Used for musicxml pedal change - - void addTimePosition(const notevisitor& nv); }; diff --git a/src/visitors/partsummary.cpp b/src/visitors/partsummary.cpp index 1135f7458..b337d1c80 100644 --- a/src/visitors/partsummary.cpp +++ b/src/visitors/partsummary.cpp @@ -63,11 +63,55 @@ void partsummary::visitStart ( S_staves& elt) void partsummary::visitEnd ( S_note& elt) { notevisitor::visitEnd (elt); + if (!isGrace() ) { + timePositions.addTimePosition(fCurrentMeasureNumber, fCurrentMeasurePosition.toDouble(), *this); + moveMeasureTime (getDuration()); + } fStaves[notevisitor::getStaff()]++; fVoices[notevisitor::getVoice()]++; fStaffVoices[notevisitor::getStaff()][notevisitor::getVoice()]++; } +void partsummary::visitStart ( S_measure& elt ) +{ + fCurrentMeasurePosition.set(0, 1); + std::string measNum = elt->getAttributeValue("number"); + try { + fCurrentMeasureNumber = std::stoi(measNum); + } catch(...) { + fCurrentMeasureNumber++; + } +} + +void partsummary::visitStart ( S_divisions& elt ) +{ + fCurrentDivision = (long)(*elt); +} + +//______________________________________________________________________________ +void partsummary::visitStart ( S_backup& elt ) +{ + int duration = elt->getIntValue(k_duration, 0); + if (duration) { + moveMeasureTime (-duration); + } +} + +//______________________________________________________________________________ +void partsummary::visitStart ( S_forward& elt ) +{ + int duration = elt->getIntValue(k_duration, 0); + moveMeasureTime(duration); +} + +void partsummary::moveMeasureTime (int duration) +{ + rational r(duration, fCurrentDivision*4); + r.rationalise(); + fCurrentMeasurePosition += r; + fCurrentMeasurePosition.rationalise(); +} + //________________________________________________________________________ smartlist::ptr partsummary::getStaves() const { diff --git a/src/visitors/partsummary.h b/src/visitors/partsummary.h index 6fc6c5467..12b13abbd 100755 --- a/src/visitors/partsummary.h +++ b/src/visitors/partsummary.h @@ -17,6 +17,7 @@ #include #include "notevisitor.h" +#include "timePositions.h" #include "smartlist.h" namespace MusicXML2 @@ -38,11 +39,17 @@ namespace MusicXML2 class EXP partsummary : public notevisitor, public visitor, + public visitor, public visitor, + public visitor, + public visitor, + public visitor, public visitor { public: - partsummary() : fStavesCount(1) {}; + partsummary() : fStavesCount(1), fCurrentMeasureNumber(0) { + fCurrentMeasurePosition.set(0, 1); + }; virtual ~partsummary() {}; //! returns the number of staves for the part @@ -71,13 +78,19 @@ class EXP partsummary : int getVoiceNotes (int staffid, int voiceid) const; // staff distance from S_print std::map fStaffDistances; + + MusicXMLTimePositions timePositions; protected: virtual void visitStart ( S_part& elt); virtual void visitStart ( S_staves& elt); virtual void visitStart ( S_print& elt); virtual void visitEnd ( S_note& elt); - + virtual void visitStart ( S_backup& elt ); + virtual void visitStart ( S_forward& elt ); + virtual void visitStart ( S_divisions& elt ); + virtual void visitStart ( S_measure& elt ); + private: // count of staves (from the staves element) int fStavesCount; @@ -88,6 +101,12 @@ class EXP partsummary : // staves and corresponding voices + count of notes std::map > fStaffVoices; + long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note + rational fCurrentMeasurePosition;// the current position in the measure + + void moveMeasureTime (int duration); + + int fCurrentMeasureNumber; }; /*! @} */ From ba73bd259788462006dcac9ea584ea316409da10 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 2 Aug 2021 16:51:57 +0200 Subject: [PATCH 117/164] xml2guido: Improved element with offset processing for Ranged Tags --- src/guido/xmlpart2guido.cpp | 13 ++++++++----- src/guido/xmlpart2guido.h | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 25423ed79..7493e4592 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -103,9 +103,6 @@ namespace MusicXML2 // add an element to the list of delayed elements void xmlpart2guido::addDelayed (Sguidoelement elt, long offset) { - add(elt); - return; - if (offset > 0) { delayedElement de; de.delay = offset; @@ -119,11 +116,16 @@ namespace MusicXML2 // checks ready elements in the list of delayed elements // 'time' is the time elapsed since the last check, it is expressed in // time units - void xmlpart2guido::checkDelayed (long time) + void xmlpart2guido::checkDelayed (long time, bool before) { vector::iterator it = fDelayed.begin(); while (it!=fDelayed.end()) { it->delay -= time; + if (before && (it->element->getName().find("End") != std::string::npos )) { + it++; + continue; + } + cerr<<"<<< checkDelayed "<< it->element->getName()<< " delay="<delay <delay < 0) { add (it->element); it = fDelayed.erase(it); @@ -2969,7 +2971,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur //addTimePosition(*this); moveMeasureTime (getDuration(), scanVoice); - checkDelayed (getDuration()); // check for delayed elements (directions with offset) + checkDelayed (getDuration(), true); // check for delayed elements (directions with offset) and indicated before = true } if (!scanVoice) return; @@ -3048,6 +3050,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur checkPostArticulation(*this); + checkDelayed (getDuration(), false); // check for delayed elements (directions with offset) and indicated before = false fMeasureEmpty = false; } diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 9245f6074..6442887da 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -123,7 +123,7 @@ public visitor // to get clef, division, staves, time and fStack.top()->add(elt); } void addDelayed (Sguidoelement elt, long offset); // adding elements to the delayed elements - void checkDelayed (long time); // checks the delayed elements for ready elements + void checkDelayed (long time, bool before); // checks the delayed elements for ready elements void push (Sguidoelement& elt) { if (!checkMeasureRange()) return; add(elt); fStack.push(elt); From cca56072e0de156f7ed1c49381709520c8b0aba4 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 2 Aug 2021 18:34:04 +0200 Subject: [PATCH 118/164] xml2guido: - Correct dx calculation in presence of xml offset - Pedal parsing no longer avoids Offsets - --- src/guido/timePositions.cpp | 34 ++++++++++++++++------------------ src/guido/timePositions.h | 18 ++++++++++++++++-- src/guido/xmlpart2guido.cpp | 36 +++++++++++++++++++++--------------- src/guido/xmlpart2guido.h | 2 +- 4 files changed, 54 insertions(+), 36 deletions(-) diff --git a/src/guido/timePositions.cpp b/src/guido/timePositions.cpp index cd76bdead..1bd5b8188 100644 --- a/src/guido/timePositions.cpp +++ b/src/guido/timePositions.cpp @@ -23,34 +23,32 @@ void MusicXMLTimePositions::addTimePosition(int measure, double positionInMeasur } -float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voiceId, long xmlOffset) { +float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voiceId, double xmlOffset) { auto timePos4measure = timePositions.find(onMeasure); float default_x = element->getAttributeFloatValue("default-x", 0), relative_x = element->getAttributeFloatValue("relative-x", 0); - - float xpos = default_x + relative_x; - + // MusicXML DOC: If an element within a includes a default-x attribute, the value will be ignored when determining the appearance of that element. double finalPosition = position + (default_x == 0 ? (double)xmlOffset : 0.0); if (timePos4measure != timePositions.end()) { - auto it = std::find_if(timePos4measure->second.begin(), timePos4measure->second.end(), [voiceId, finalPosition] (const VoicedTimePosition& e) { - if ((voiceId > 0) && (std::get<2>(e) != voiceId) ) { - return false; - } - - return std::get<0>(e) == finalPosition; - }); + auto it = find(timePos4measure->second, voiceId, finalPosition); if (it != timePos4measure->second.end()) { float minXPos = getDefaultX(*it); - if (xpos != minXPos) { - int finalDx = (relative_x/10)*2; - // apply default-x ONLY if it exists - if (default_x!=0) - finalDx = ( (xpos - minXPos)/ 10 ) * 2; // convert to half spaces - - return finalDx; + //if (xpos != minXPos) { + int finalDx = (relative_x/10)*2; + // apply default-x ONLY if it exists + if (default_x != 0) { + // Use default-x if it exists; convert to half spaces + finalDx += ( (default_x - minXPos)/ 10 ) * 2; } + else if (xmlOffset != 0) { + finalDx += ( (default_x - minXPos)/ 10 ) * 2; // convert to half spaces + }else { + return -999; + } + + return finalDx; } } return -999; // This is when the xpos can not be computed diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h index de1cbddc2..4c81621ba 100644 --- a/src/guido/timePositions.h +++ b/src/guido/timePositions.h @@ -25,6 +25,7 @@ class MusicXMLTimePositions // relative position in measure (double), default_x, voice number typedef std::tuple VoicedTimePosition; + typedef std::vector TimePositionList; void addTimePosition(int measure, double positionInMeasure, const MusicXML2::notevisitor& nv); @@ -35,15 +36,28 @@ class MusicXMLTimePositions /// @param voice voice number /// @param xmlOffset MusicXML offset of the `element` if any /// @return a float containing Guido dx value based on available default-x in measure - float getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voice, long xmlOffset); + float getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voice, double xmlOffset); int size() { return timePositions.size(); } protected: - int getVoice(VoicedTimePosition e) { return std::get<2>(e); } int getDefaultX(VoicedTimePosition e) { return std::get<1>(e); } + + /// Returns iterator in TimePositionList with equal voiceId and EQUAL position to query + TimePositionList::iterator find(TimePositionList &timePos4measure, int voiceId, double position) { +// cerr<<"Start Search for Position "< 0) && (std::get<2>(e) != voiceId) ) { + return false; + } +// cerr<<"\t TimePos elementPos="<(e)<(e) == position; + }); + + return it; + } private: /// A map for measure number (first) to a vector Voiced Time Positions diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 7493e4592..375154def 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -109,7 +109,6 @@ namespace MusicXML2 de.element = elt; fDelayed.push_back(de); } - else add (elt); } //________________________________________________________________________ @@ -125,7 +124,6 @@ namespace MusicXML2 it++; continue; } - cerr<<"<<< checkDelayed "<< it->element->getName()<< " delay="<delay <delay < 0) { add (it->element); it = fDelayed.erase(it); @@ -190,7 +188,7 @@ bool xmlpart2guido::checkMeasureRange() { } //______________________________________________________________________________ - void xmlpart2guido::moveMeasureTime (int duration, bool moveVoiceToo, int x_default) + void xmlpart2guido::moveMeasureTime (int duration, bool moveVoiceToo) { rational r(duration, fCurrentDivision*4); r.rationalise(); @@ -202,7 +200,6 @@ bool xmlpart2guido::checkMeasureRange() { fCurrentVoicePosition += r; fCurrentVoicePosition.rationalise(); } - //cerr<<"moveMeasureTime v:"<";fCurrentMeasurePosition.print(cerr);cerr<<" ("<< moveVoiceToo<<") fCurrentVoicePosition->";fCurrentVoicePosition.print(cerr);cerr<add (guidoparam::create(rehearsalValue.c_str(), false)); //xml2guidovisitor::addPosition(elt, tag, -4, -4); // FIXME: Researsal is a Direction and its x-pos is from the beginning of measure where in Guido it is from current graphical position! - float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, fCurrentOffset); + rational offset(fCurrentOffset, fCurrentDivision*4); + float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, offset.toDouble()); if (markDx != -999) { stringstream s; s << "dx=" << markDx ; @@ -578,10 +576,6 @@ bool xmlpart2guido::checkMeasureRange() { switch (elementType) { case k_pedal: { - if (fCurrentOffset < 0) { - continue; - // FIXME: Handle negative offsets! - } bool isPedalChange = false; // default-y for pedal is from the top line of the staff in XML, in Guido dy=0 is the C below the lowest line. std::string pedalType = element->getAttributeValue("type"); @@ -605,12 +599,19 @@ bool xmlpart2guido::checkMeasureRange() { }else { if (fPreviousPedalYPos) { stringstream s; - s << "dy=" << fPreviousPedalYPos << "hs, dx="<< -2<<"hs"; + rational offset(fCurrentOffset, fCurrentDivision*4); + float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + if (dx==-999) { + return; // Return if no corresponding default-x event is found + }else { + dx-=2; + } + s << "dy=" << fPreviousPedalYPos << "hs, dx="<< dx<<"hs"; // dx was -2 tag->add (guidoparam::create(s.str(), false)); } } - if (fCurrentOffset) + if (fCurrentOffset > 0) addDelayed(tag, fCurrentOffset); else { add(tag); @@ -620,7 +621,12 @@ bool xmlpart2guido::checkMeasureRange() { tag = guidotag::create("pedalOn"); if (fPreviousPedalYPos) { stringstream s; - s << "dy=" << fPreviousPedalYPos << "hs, dx="<< 0<<"hs"; + rational offset(fCurrentOffset, fCurrentDivision*4); + float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + if (dx==-999) { + return; + } + s << "dy=" << fPreviousPedalYPos << "hs, dx="<< dx <<"hs"; tag->add (guidoparam::create(s.str(), false)); } if (fCurrentOffset) @@ -758,7 +764,8 @@ bool xmlpart2guido::checkMeasureRange() { if ((*iter2)->getType() != k_other_dynamics) { tag = guidotag::create("intens"); tag->add (guidoparam::create((*iter2)->getName())); - float intensDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, fCurrentOffset); + rational offset(fCurrentOffset, fCurrentDivision*4); + float intensDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, offset.toDouble()); // add pending word parameters (for "before") if (!generateAfter) { @@ -939,7 +946,6 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) } if (fIgnoreWedgeWithOffset) { - cerr <<"\tIgnoring Wedge with Offset on measure "<add (guidoparam::create(s.str(), false)); - if (fCurrentOffset) { + if (fCurrentOffset > 0) { addDelayed(tag, fCurrentOffset); } else { diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 6442887da..9b0dc2432 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -133,7 +133,7 @@ public visitor // to get clef, division, staves, time and fStack.pop(); } - void moveMeasureTime (int duration, bool moveVoiceToo=false, int x_default = 0); + void moveMeasureTime (int duration, bool moveVoiceToo=false); void reset (); void stackClean (); From 5f2f0d9164455a4aafa1bcc7e15a0120d0110963 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 3 Aug 2021 00:38:48 +0200 Subject: [PATCH 119/164] xml2guido: Fixed NoteFormat positioning on chords, refactored Rehearsal Visitor --- src/guido/timePositions.cpp | 3 +- src/guido/timePositions.h | 13 ++++ src/guido/xml2guidovisitor.cpp | 4 +- src/guido/xmlpart2guido.cpp | 108 ++++++++++++++++----------------- src/guido/xmlpart2guido.h | 2 - src/visitors/partsummary.cpp | 1 + 6 files changed, 70 insertions(+), 61 deletions(-) diff --git a/src/guido/timePositions.cpp b/src/guido/timePositions.cpp index 1bd5b8188..cb13d0a90 100644 --- a/src/guido/timePositions.cpp +++ b/src/guido/timePositions.cpp @@ -10,12 +10,11 @@ void MusicXMLTimePositions::addTimePosition(int measure, double positionInMeasure, const MusicXML2::notevisitor& nv) { auto timePos4measure = timePositions.find(measure); if (nv.x_default != -1) { + VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice()); if ( timePos4measure != timePositions.end()) { - VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice()); timePos4measure->second.push_back(inner); }else { - VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice()); std::vector innerVec(1, inner); timePositions.insert(std::make_pair(measure, innerVec)); } diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h index 4c81621ba..5e7c9858e 100644 --- a/src/guido/timePositions.h +++ b/src/guido/timePositions.h @@ -58,6 +58,19 @@ class MusicXMLTimePositions return it; } + + TimePositionList::iterator findClosest(TimePositionList &timePos4measure, int voiceId, double position, int default_x) { +// cerr<<"Start Search for Position "< 0) && (std::get<2>(e) != voiceId) ) { + return false; + } +// cerr<<"\t TimePos elementPos="<(e)<(e) < position; + }); + + return it; + } private: /// A map for measure number (first) to a vector Voiced Time Positions diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 7dc1142ec..cb2d364a0 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -288,9 +288,7 @@ namespace MusicXML2 add (tag4); } } - - //// - + //// Browse XML and convert xmlpart2guido pv(fGenerateComments, fGenerateStem, fGenerateBars, fBeginMeasure, fEndMeasure, fEndMeasureOffset); pv.generatePositions (fGeneratePositions); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 375154def..ae1df5780 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -433,7 +433,7 @@ bool xmlpart2guido::checkMeasureRange() { //______________________________________________________________________________ void xmlpart2guido::visitStart ( S_direction& elt ) { - // Directions can have voice! Check: + // Directions can have voice (not encoded as of Finale v27). Check: int voiceNumber = elt->getIntValue(k_voice, -1); if (voiceNumber >0 && voiceNumber != fTargetVoice) { fSkipDirection = true; @@ -447,54 +447,6 @@ bool xmlpart2guido::checkMeasureRange() { } } - void xmlpart2guido::visitStart ( S_rehearsal& elt ) - { - if (fSkipDirection) return; - - string rehearsalValue = elt->getValue(); - rehearsalValue = "\""+rehearsalValue+"\""; - - string enclosure = elt->getAttributeValue("enclosure"); - string font_size = elt->getAttributeValue("font-size"); - string font_weight = elt->getAttributeValue("font-weight"); - string font_style = elt->getAttributeValue("font-style"); - - if (rehearsalValue.size()) - { - //// Using MARK tag: - Sguidoelement tag = guidotag::create("mark"); - if (enclosure.size()) - { - rehearsalValue += ", enclosure=\""+enclosure+"\""; - }else - { - // declare rectangle by default - rehearsalValue += ", enclosure=\"square\""; - } - if (font_size.size()) - rehearsalValue += ", fsize="+font_size+"pt"; - - tag->add (guidoparam::create(rehearsalValue.c_str(), false)); - //xml2guidovisitor::addPosition(elt, tag, -4, -4); - // FIXME: Researsal is a Direction and its x-pos is from the beginning of measure where in Guido it is from current graphical position! - rational offset(fCurrentOffset, fCurrentDivision*4); - float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, offset.toDouble()); - if (markDx != -999) { - stringstream s; - s << "dx=" << markDx ; - tag->add (guidoparam::create(s.str(), false)); - }else { - // Add a default -6 as rehearsal marks usually occur in the beginning of measure! - stringstream s; - s << "dx=" << -6.0 ; - tag->add (guidoparam::create(s.str(), false)); - } - xml2guidovisitor::addPosY(elt, tag, -4, 1); - - add (tag); - } - } - //______________________________________________________________________________ void xmlpart2guido::visitEnd ( S_direction& elt ) { @@ -854,6 +806,54 @@ bool xmlpart2guido::checkMeasureRange() { generateTempo = false; } + case k_rehearsal: + { + string rehearsalValue = element->getValue(); + rehearsalValue = "\""+rehearsalValue+"\""; + + string enclosure = element->getAttributeValue("enclosure"); + string font_size = element->getAttributeValue("font-size"); + string font_weight = element->getAttributeValue("font-weight"); + string font_style = element->getAttributeValue("font-style"); + + if (rehearsalValue.size()) + { + //// Using MARK tag: + Sguidoelement tag = guidotag::create("mark"); + if (enclosure.size()) + { + rehearsalValue += ", enclosure=\""+enclosure+"\""; + }else + { + // declare rectangle by default + rehearsalValue += ", enclosure=\"square\""; + } + if (font_size.size()) + rehearsalValue += ", fsize="+font_size+"pt"; + + tag->add (guidoparam::create(rehearsalValue.c_str(), false)); + //xml2guidovisitor::addPosition(elt, tag, -4, -4); + // FIXME: Researsal is a Direction and its x-pos is from the beginning of measure where in Guido it is from current graphical position! + rational offset(fCurrentOffset, fCurrentDivision*4); + float markDx = timePositions.getDxForElement(element, fCurrentMeasurePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + cerr<<"<<< MARK "<< element->getValue()<<" m:"< 0) && (std::get<2>(e) != voiceId) ) { - return false; - } -// cerr<<"\t TimePos elementPos="<(e)<(e) < position; - }); - - return it; - } private: /// A map for measure number (first) to a vector Voiced Time Positions diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index cb2d364a0..8a8732943 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -210,6 +210,7 @@ namespace MusicXML2 int targetStaff = 0xffff; // initialized to a value we'll unlikely encounter bool notesOnly = false; rational currentTimeSign (0,1); + std::vector processedDirections; // browse the parts voice by voice: allows to describe voices that spans over several staves for (unsigned int i = 0; i < voices->size(); i++) { @@ -294,6 +295,7 @@ namespace MusicXML2 pv.generatePositions (fGeneratePositions); xml_tree_browser browser(&pv); pv.initialize(seq, targetStaff, fCurrentStaffIndex, targetVoice, notesOnly, currentTimeSign); + pv.processedDirections = processedDirections; pv.timePositions = ps.timePositions; browser.browse(*elt); pop(); @@ -301,6 +303,7 @@ namespace MusicXML2 previousStaffHasLyrics = pv.hasLyrics(); fBeginPosition = pv.fStartPosition; fEndPosition = pv.fEndPosition; + processedDirections.insert(processedDirections.end(), pv.processedDirections.begin(), pv.processedDirections.end()); if (pv.lastMeasureNumber() > fTotalMeasures) { fTotalMeasures = pv.lastMeasureNumber(); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index ae1df5780..9adcfd990 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -91,6 +91,7 @@ namespace MusicXML2 fTremoloInProgress = false; fShouldStopOctava = false; start (seq); + processedDirections.clear(); } //________________________________________________________________________ @@ -439,11 +440,23 @@ bool xmlpart2guido::checkMeasureRange() { fSkipDirection = true; } // Parse Staff and Offset first - if (fNotesOnly || (elt->getIntValue(k_staff, 1) != fTargetStaff) ) { + if ((elt->getIntValue(k_staff, 1) != fTargetStaff) ) { //fNotesOnly || fSkipDirection = true; } - else { - fCurrentOffset = elt->getLongValue(k_offset, 0); + // Skip if current voice has scanned in this measure + if (fCurrentVoicePosition > fCurrentMeasurePosition) { + fSkipDirection = true; + } + // Check if Direction has been processed and proceed + if (!fSkipDirection) { + int lineNumber = elt->getInputLineNumber(); + auto it = std::find(processedDirections.begin(), processedDirections.end(), lineNumber); + if (it == processedDirections.end()) { + fCurrentOffset = elt->getLongValue(k_offset, 0); + processedDirections.push_back(lineNumber); + }else { + fSkipDirection = true; + } } } @@ -835,17 +848,11 @@ bool xmlpart2guido::checkMeasureRange() { //xml2guidovisitor::addPosition(elt, tag, -4, -4); // FIXME: Researsal is a Direction and its x-pos is from the beginning of measure where in Guido it is from current graphical position! rational offset(fCurrentOffset, fCurrentDivision*4); - float markDx = timePositions.getDxForElement(element, fCurrentMeasurePosition.toDouble(), fMeasNum, 0, offset.toDouble()); - cerr<<"<<< MARK "<< element->getValue()<<" m:"<add (guidoparam::create(rehearsalValue.c_str(), false)); - //xml2guidovisitor::addPosition(elt, tag, -4, -4); - // FIXME: Researsal is a Direction and its x-pos is from the beginning of measure where in Guido it is from current graphical position! + rational offset(fCurrentOffset, fCurrentDivision*4); float markDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); if (markDx != -999 && markDx != 0) { @@ -947,14 +941,6 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) Sguidoelement tag; if (type == "crescendo") { tag = guidotag::create("crescBegin"); - if (fCurrentOffset < 0) { - // FIXME: Impossible for now to handle Wedges with Direction Offset! Ignoring... . - fIgnoreWedgeWithOffset = true; - } - if (fIgnoreWedgeWithOffset) - { - return; // FIXME: Ignoring Offset wedges à la Verovio - } fCrescPending = number; } else if (type == "diminuendo") { @@ -962,10 +948,6 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) fDiminPending = number; } else if (type == "stop") { - if (fIgnoreWedgeWithOffset) { - fIgnoreWedgeWithOffset = false; - return; // FIXME: Ignore Offset Wedge à la Verovio - } if (fCrescPending == number) { tag = guidotag::create("crescEnd"); @@ -1072,8 +1054,14 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) stringstream s; s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; - tag->add (guidoparam::create(s.str(), false)); + rational offset(fCurrentOffset, fCurrentDivision*4); + float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + if (markDx != -999 && markDx != 0) { + s << ", dx=" << markDx ; + } + tag->add (guidoparam::create(s.str(), false)); + if (fCurrentOffset > 0) { addDelayed(tag, fCurrentOffset); } @@ -2573,8 +2561,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) { if (nv.isGrace()) { if (!fInGrace) { - Sguidoelement tag = guidotag::create("grace"); - push(tag); /// GUID-153: Fetch directions after grace ctree::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), nv.getSnote()); nextnote.forward_up(); // forward one element @@ -2604,6 +2590,8 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } } /// End-of Guid-153 + Sguidoelement tag = guidotag::create("grace"); + push(tag); fInGrace = true; } } diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index ae5545771..d329b966b 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -227,9 +227,7 @@ public visitor // to get clef, division, staves, time and rational durationInCue; std::map fStaffDistance; - - bool fIgnoreWedgeWithOffset; - + public: xmlpart2guido(bool generateComments, bool generateStem, bool generateBar = true, int startMeasure = 0, int endMeasure = 0, int endMeasureOffset = 0); virtual ~xmlpart2guido() {} From b1a1d47cf92063510ddf3bd24ffd241851f26adf Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 3 Aug 2021 02:17:21 +0200 Subject: [PATCH 122/164] xml2guido: Fixed horizontal positioning of Text Tags --- src/guido/xmlpart2guido.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index edb95e465..96a524dbb 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -690,12 +690,14 @@ bool xmlpart2guido::checkMeasureRange() { } tag = guidotag::create("text"); - tag->add (guidoparam::create(wordParameters.str(), false)); - - // FIXME: XML x-pos is from beginning of measure, whereas nested Text in Guido from the notehead - // Seems like we can add relative-x which is relative to its hanging position - xml2guidovisitor::addRelativeX(element, tag, 0); + rational offset(fCurrentOffset, fCurrentDivision*4); + float wordDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + if (wordDx != -999 && wordDx != 0) { + wordParameters << ", dx=" << wordDx; + } + + tag->add (guidoparam::create(wordParameters.str(), false)); // apply inherited Y-position if (commonDy != 0.0) { stringstream s; @@ -751,7 +753,7 @@ bool xmlpart2guido::checkMeasureRange() { } /// Add Tag - if (fCurrentOffset) + if (fCurrentOffset > 0) addDelayed(tag, fCurrentOffset); else { add(tag); From 8317237e577c748b7d8ae00775fbd1db0b2febe3 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 3 Aug 2021 12:51:55 +0200 Subject: [PATCH 123/164] xml2guido: Final fix for fingering positions --- src/guido/xmlpart2guido.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 96a524dbb..823a0b737 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2775,17 +2775,29 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur Sguidoelement tag = guidotag::create("fingering"); stringstream s; - /// Add Placement - std::string placement = fingerings[0]->getAttributeValue("placement"); - if (placement.size() > 0) { - s << "position=\""<getAttributeIntValue("default-y", 0); + if (default_y != 0) { + addPosYforNoteHead(nv, fingerings[0], tag, 2.0); + }else { + std::string placement = fingerings[0]->getAttributeValue("placement"); + if (placement.size() > 0) { + s << "position=\""<getAttributeIntValue("default-x", 0); + float dx = (default_x/10)*2; + if (dx != -999 & dx != 0) { + dx-=1; // offset for note head + s << "dx="<getValue(); if (i==0) { - s << ", text=\"" << fingeringText; + s << "text=\"" << fingeringText; }else { s << "," << fingeringText; } From d18a69f411c116ca8826f849e22bf214aaff915f Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 3 Aug 2021 18:38:09 +0200 Subject: [PATCH 124/164] xml2guido: Use original number attribute in TimePositions solving implicit measure copy issues --- src/guido/timePositions.cpp | 4 ++-- src/guido/timePositions.h | 6 +++--- src/guido/xmlpart2guido.cpp | 24 ++++++++++++------------ src/visitors/partsummary.cpp | 9 ++------- src/visitors/partsummary.h | 4 ++-- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/guido/timePositions.cpp b/src/guido/timePositions.cpp index cb13d0a90..f2848234d 100644 --- a/src/guido/timePositions.cpp +++ b/src/guido/timePositions.cpp @@ -7,7 +7,7 @@ #include "timePositions.h" -void MusicXMLTimePositions::addTimePosition(int measure, double positionInMeasure, const MusicXML2::notevisitor& nv) { +void MusicXMLTimePositions::addTimePosition(std::string measure, double positionInMeasure, const MusicXML2::notevisitor& nv) { auto timePos4measure = timePositions.find(measure); if (nv.x_default != -1) { VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice()); @@ -22,7 +22,7 @@ void MusicXMLTimePositions::addTimePosition(int measure, double positionInMeasur } -float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voiceId, double xmlOffset) { +float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voiceId, double xmlOffset) { auto timePos4measure = timePositions.find(onMeasure); float default_x = element->getAttributeFloatValue("default-x", 0), relative_x = element->getAttributeFloatValue("relative-x", 0); diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h index 4c81621ba..87fc8efe0 100644 --- a/src/guido/timePositions.h +++ b/src/guido/timePositions.h @@ -27,7 +27,7 @@ class MusicXMLTimePositions typedef std::tuple VoicedTimePosition; typedef std::vector TimePositionList; - void addTimePosition(int measure, double positionInMeasure, const MusicXML2::notevisitor& nv); + void addTimePosition(std::string measure, double positionInMeasure, const MusicXML2::notevisitor& nv); /// Finds appropriate Guido Dx based on default-x of a musicXML element by overlooking all elements in measure based on position and voice number /// @param element the MusicXML element @@ -36,7 +36,7 @@ class MusicXMLTimePositions /// @param voice voice number /// @param xmlOffset MusicXML offset of the `element` if any /// @return a float containing Guido dx value based on available default-x in measure - float getDxForElement(MusicXML2::xmlelement *element, double position, int onMeasure, int voice, double xmlOffset); + float getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voice, double xmlOffset); int size() { return timePositions.size(); } @@ -61,7 +61,7 @@ class MusicXMLTimePositions private: /// A map for measure number (first) to a vector Voiced Time Positions - std::map > timePositions; + std::map > timePositions; }; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 823a0b737..117424f2e 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -560,7 +560,7 @@ bool xmlpart2guido::checkMeasureRange() { if (fPreviousPedalYPos) { stringstream s; rational offset(fCurrentOffset, fCurrentDivision*4); - float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); if (dx==-999) { return; // Return if no corresponding default-x event is found }else { @@ -582,7 +582,7 @@ bool xmlpart2guido::checkMeasureRange() { if (fPreviousPedalYPos) { stringstream s; rational offset(fCurrentOffset, fCurrentDivision*4); - float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); if (dx==-999) { return; } @@ -692,7 +692,7 @@ bool xmlpart2guido::checkMeasureRange() { tag = guidotag::create("text"); rational offset(fCurrentOffset, fCurrentDivision*4); - float wordDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + float wordDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); if (wordDx != -999 && wordDx != 0) { wordParameters << ", dx=" << wordDx; } @@ -727,7 +727,7 @@ bool xmlpart2guido::checkMeasureRange() { tag = guidotag::create("intens"); tag->add (guidoparam::create((*iter2)->getName())); rational offset(fCurrentOffset, fCurrentDivision*4); - float intensDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, fTargetVoice, offset.toDouble()); + float intensDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), fTargetVoice, offset.toDouble()); // add pending word parameters (for "before") if (!generateAfter) { @@ -844,7 +844,7 @@ bool xmlpart2guido::checkMeasureRange() { tag->add (guidoparam::create(rehearsalValue.c_str(), false)); rational offset(fCurrentOffset, fCurrentDivision*4); - float markDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + float markDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); if (markDx != -999 && markDx != 0) { stringstream s; s << "dx=" << markDx ; @@ -1058,7 +1058,7 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; rational offset(fCurrentOffset, fCurrentDivision*4); - float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fMeasNum, 0, offset.toDouble()); + float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); if (markDx != -999 && markDx != 0) { s << ", dx=" << markDx ; } @@ -2564,6 +2564,8 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (nv.isGrace()) { if (!fInGrace) { /// GUID-153: Fetch directions after grace + Sguidoelement tag = guidotag::create("grace"); + push(tag); ctree::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), nv.getSnote()); nextnote.forward_up(); // forward one element while (nextnote != fCurrentMeasure->end()) { @@ -2592,8 +2594,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } } /// End-of Guid-153 - Sguidoelement tag = guidotag::create("grace"); - push(tag); fInGrace = true; } } @@ -2786,10 +2786,10 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } } - int default_x = fingerings[0]->getAttributeIntValue("default-x", 0); + float default_x = fingerings[0]->getAttributeFloatValue("default-x", 0); float dx = (default_x/10)*2; - if (dx != -999 & dx != 0) { - dx-=1; // offset for note head + if (dx != 0) { + dx-=2.0; // offset for note head s << "dx="<& nvs, rational posInMeasur if (fTargetVoice) { searchVoice = fTargetVoice - 1; } - float noteDx = timePositions.getDxForElement(nv.getSnote(), posInMeasure.toDouble(), measureNum, searchVoice, 0); + float noteDx = timePositions.getDxForElement(nv.getSnote(), posInMeasure.toDouble(), fCurrentMeasure->getAttributeValue("number"), searchVoice, 0); // Do not infer default-x on incomplete measures, grace or Chords if ( (noteDx != -999 && noteDx != 0) && !fPendingBar && !isProcessingChord && !isGrace() ) { diff --git a/src/visitors/partsummary.cpp b/src/visitors/partsummary.cpp index 7b2c6b044..f37a6399a 100644 --- a/src/visitors/partsummary.cpp +++ b/src/visitors/partsummary.cpp @@ -65,7 +65,8 @@ void partsummary::visitEnd ( S_note& elt) notevisitor::visitEnd (elt); if (inChord()) return; if (!isGrace() ) { - timePositions.addTimePosition(fCurrentMeasureNumber, fCurrentMeasurePosition.toDouble(), *this); + std::string fCurrentMeasureNumber = elt->getAttributeValue("number"); + timePositions.addTimePosition(fCurrentMeasureNumber, fCurrentMeasurePosition.toDouble(), *this); moveMeasureTime (getDuration()); } fStaves[notevisitor::getStaff()]++; @@ -76,12 +77,6 @@ void partsummary::visitEnd ( S_note& elt) void partsummary::visitStart ( S_measure& elt ) { fCurrentMeasurePosition.set(0, 1); - std::string measNum = elt->getAttributeValue("number"); - try { - fCurrentMeasureNumber = std::stoi(measNum); - } catch(...) { - fCurrentMeasureNumber++; - } } void partsummary::visitStart ( S_divisions& elt ) diff --git a/src/visitors/partsummary.h b/src/visitors/partsummary.h index 12b13abbd..a43776fcc 100755 --- a/src/visitors/partsummary.h +++ b/src/visitors/partsummary.h @@ -47,7 +47,7 @@ class EXP partsummary : public visitor { public: - partsummary() : fStavesCount(1), fCurrentMeasureNumber(0) { + partsummary() : fStavesCount(1), fCurrentMeasure(0) { fCurrentMeasurePosition.set(0, 1); }; virtual ~partsummary() {}; @@ -106,7 +106,7 @@ class EXP partsummary : void moveMeasureTime (int duration); - int fCurrentMeasureNumber; + S_measure fCurrentMeasure; }; /*! @} */ From 16f73feafee3eab9e28badd1e9aabc804665471e Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 3 Aug 2021 19:43:42 +0200 Subject: [PATCH 125/164] xml2guido: Fixed processing of offset elements --- src/guido/guido.h | 9 +++++++++ src/guido/xmlpart2guido.cpp | 14 ++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/guido/guido.h b/src/guido/guido.h index f86031f2b..9100aa64b 100755 --- a/src/guido/guido.h +++ b/src/guido/guido.h @@ -95,6 +95,15 @@ class EXP guidoelement : public smartable { virtual bool isChord () const { return false; } virtual bool isTag () const { return false; } virtual bool isNote () const { return false; } + virtual bool isRangeTag() const { + return fName.find("End") != std::string::npos || fName.find("Begin") != std::string::npos; + } + virtual bool isBeginTag() const { + return fName.find("Begin") != std::string::npos; + } + virtual bool isEndTag() const { + return fName.find("End") != std::string::npos; + } int countNotes () const; diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 117424f2e..312be16b1 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -117,8 +117,10 @@ namespace MusicXML2 { vector::iterator it = fDelayed.begin(); while (it!=fDelayed.end()) { - it->delay -= time; - if (before && (it->element->getName().find("End") != std::string::npos )) { + if (before) { + it->delay -= time; + } + if (before && it->element->isEndTag()) { it++; continue; } @@ -2788,7 +2790,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur float default_x = fingerings[0]->getAttributeFloatValue("default-x", 0); float dx = (default_x/10)*2; - if (dx != 0) { + if (dx != 0 && (default_x<20.0)) { // filter values > 20.0 as they might be erroneous offsets from FINALE! dx-=2.0; // offset for note head s << "dx="<& nvs, rational posInMeasur bool scanVoice = (notevisitor::getVoice() == fTargetVoice); if (!isGrace() ) { - //addTimePosition(*this); - moveMeasureTime (getDuration(), scanVoice); - checkDelayed (getDuration(), true); // check for delayed elements (directions with offset) and indicated before = true + if (scanVoice) { + checkDelayed (getDuration(), true); + } } if (!scanVoice) return; From 244306d5f98ca75c3ad1ae2664310d7d85cf41e0 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 3 Aug 2021 19:53:20 +0200 Subject: [PATCH 126/164] xml2guido: fix minor type issues --- src/guido/timePositions.h | 2 +- src/guido/xmlpart2guido.cpp | 3 +-- src/guido/xmlpart2guido.h | 2 +- src/visitors/partsummary.cpp | 2 +- src/visitors/partsummary.h | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h index 87fc8efe0..a9a261afa 100644 --- a/src/guido/timePositions.h +++ b/src/guido/timePositions.h @@ -38,7 +38,7 @@ class MusicXMLTimePositions /// @return a float containing Guido dx value based on available default-x in measure float getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voice, double xmlOffset); - int size() { return timePositions.size(); } + size_t size() { return timePositions.size(); } protected: diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 312be16b1..dcb082bf9 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -188,7 +188,7 @@ bool xmlpart2guido::checkMeasureRange() { } //______________________________________________________________________________ - void xmlpart2guido::moveMeasureTime (int duration, bool moveVoiceToo) + void xmlpart2guido::moveMeasureTime (long duration, bool moveVoiceToo) { rational r(duration, fCurrentDivision*4); r.rationalise(); @@ -2870,7 +2870,6 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur bool xmlpart2guido::checkNoteFormat ( const notevisitor& nv , rational posInMeasure) { bool noteFormat = false; - int measureNum = fCurrentMeasure->getAttributeIntValue("number", 0); Sguidoelement noteFormatTag = guidotag::create("noteFormat"); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index d329b966b..22a455410 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -132,7 +132,7 @@ public visitor // to get clef, division, staves, time and fStack.pop(); } - void moveMeasureTime (int duration, bool moveVoiceToo=false); + void moveMeasureTime (long duration, bool moveVoiceToo=false); void reset (); void stackClean (); diff --git a/src/visitors/partsummary.cpp b/src/visitors/partsummary.cpp index f37a6399a..e2e8bffc3 100644 --- a/src/visitors/partsummary.cpp +++ b/src/visitors/partsummary.cpp @@ -100,7 +100,7 @@ void partsummary::visitStart ( S_forward& elt ) moveMeasureTime(duration); } -void partsummary::moveMeasureTime (int duration) +void partsummary::moveMeasureTime (long duration) { rational r(duration, fCurrentDivision*4); r.rationalise(); diff --git a/src/visitors/partsummary.h b/src/visitors/partsummary.h index a43776fcc..0ef187549 100755 --- a/src/visitors/partsummary.h +++ b/src/visitors/partsummary.h @@ -104,7 +104,7 @@ class EXP partsummary : long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note rational fCurrentMeasurePosition;// the current position in the measure - void moveMeasureTime (int duration); + void moveMeasureTime (long duration); S_measure fCurrentMeasure; }; From 31a888fedd213cdffe613954712c44ea29f2145c Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 3 Aug 2021 23:01:08 +0200 Subject: [PATCH 127/164] xml2guido: fixed fingering horizontal offset --- src/guido/xmlpart2guido.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index dcb082bf9..e22bf56c9 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2791,7 +2791,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur float default_x = fingerings[0]->getAttributeFloatValue("default-x", 0); float dx = (default_x/10)*2; if (dx != 0 && (default_x<20.0)) { // filter values > 20.0 as they might be erroneous offsets from FINALE! - dx-=2.0; // offset for note head + dx-=1.0; // offset for note head s << "dx="< Date: Wed, 4 Aug 2021 12:02:22 +0200 Subject: [PATCH 128/164] xml2guido: adds missing break in switch --- src/guido/xmlpart2guido.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index e22bf56c9..2884b37be 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -817,6 +817,7 @@ bool xmlpart2guido::checkMeasureRange() { generateTempo = false; } + break; case k_rehearsal: { From ab2787f4a37da4fe54fb9a5efcecfd90d25c5fae Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 6 Aug 2021 12:45:24 +0200 Subject: [PATCH 129/164] xml2guido: Fixed fingering position in presence of Octava Shift --- src/guido/xmlpart2guido.cpp | 12 +++++++++--- src/guido/xmlpart2guido.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 2884b37be..5bb29b94f 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -48,6 +48,7 @@ namespace MusicXML2 fLyricsManualSpacing = false; fTupletOpen = 0; fTremoloInProgress = false; + fCurrentOctavaShift = 0; fShouldStopOctava = false; staffClefMap.clear(); } @@ -68,6 +69,7 @@ namespace MusicXML2 fTextTagOpen = 0; fTupletOpen = 0; fTremoloInProgress = false; + fCurrentOctavaShift = 0; fShouldStopOctava = false; fCurrentScorePosition.set(0, 1); measurePositionMap.clear(); @@ -86,6 +88,7 @@ namespace MusicXML2 fLyricsManualSpacing = false; fTupletOpen = 0; fTremoloInProgress = false; + fCurrentOctavaShift = 0; fShouldStopOctava = false; start (seq); processedDirections.clear(); @@ -1119,6 +1122,8 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) return; } + fCurrentOctavaShift = size; + Sguidoelement tag = guidotag::create("oct"); if (tag) { tag->add (guidoparam::create(size, false)); @@ -1134,7 +1139,7 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) tag->add (guidoparam::create(0, false)); add(tag); - fShouldStopOctava = false; + fCurrentOctavaShift = 0; } //______________________________________________________________________________ @@ -2792,7 +2797,8 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur float default_x = fingerings[0]->getAttributeFloatValue("default-x", 0); float dx = (default_x/10)*2; if (dx != 0 && (default_x<20.0)) { // filter values > 20.0 as they might be erroneous offsets from FINALE! - dx-=1.0; // offset for note head + if (dx < 0.0) + dx-=1.0; // offset for note head s << "dx="< // to get clef, division, staves, time and int fCrescPending, fDiminPending; // XML Number of Crescendo or Diminuedo that have been opened (0 if none) int fTextTagOpen; + int fCurrentOctavaShift; // 0 if none int fTupletOpen; // Number of opened Tuplets std::queue fTiedOpen; // Number of ongoing opened Tied From 5f8aced5aaf17462ee06caaec0fb75eba27d546d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 18 Aug 2021 15:55:20 +0200 Subject: [PATCH 130/164] xml2guido: fixed endPosition calculation in presence of offset --- src/guido/xmlpart2guido.cpp | 6 ++++-- src/visitors/partsummary.h | 6 ++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 5bb29b94f..38c2f60d5 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -402,8 +402,10 @@ bool xmlpart2guido::checkMeasureRange() { } /// Report ending position for partial parsing - if ((fEndMeasure>0) && (fMeasNum == fEndMeasure+fEndMeasureOffset+1)) { - fEndPosition = fCurrentScorePosition; + if ((fEndMeasure>0)) { + if (fMeasNum == fEndMeasure+1) { + fEndPosition = fCurrentScorePosition; + } } } diff --git a/src/visitors/partsummary.h b/src/visitors/partsummary.h index 0ef187549..5ba15f113 100755 --- a/src/visitors/partsummary.h +++ b/src/visitors/partsummary.h @@ -47,7 +47,7 @@ class EXP partsummary : public visitor { public: - partsummary() : fStavesCount(1), fCurrentMeasure(0) { + partsummary() : fStavesCount(1) { fCurrentMeasurePosition.set(0, 1); }; virtual ~partsummary() {}; @@ -104,9 +104,7 @@ class EXP partsummary : long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note rational fCurrentMeasurePosition;// the current position in the measure - void moveMeasureTime (long duration); - - S_measure fCurrentMeasure; + void moveMeasureTime (long duration); }; /*! @} */ From d25a105873a6abf043060fa1121e4d45ca2c597d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 19 Aug 2021 15:11:34 +0200 Subject: [PATCH 131/164] xml2guido: Fixed Octave-shift conversion order --- src/guido/xmlpart2guido.cpp | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 38c2f60d5..19be29818 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -433,6 +433,7 @@ bool xmlpart2guido::checkMeasureRange() { fDoubleBar = true; } + checkOctavaEnd(); } //______________________________________________________________________________ @@ -1115,21 +1116,26 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) default: return; } - if (type == "up") - size = -size; - else if (type == "stop") + if (type != "stop") { + if (type == "up") + size = -size; + fCurrentOctavaShift = size; + + Sguidoelement tag = guidotag::create("oct"); + if (tag) { + tag->add (guidoparam::create(size, false)); + add (tag); + } + } + else // Stop immediately { // in MusicXML, octava stop appears BEFORE the note it should be applied upon! We therefore keep this for the next note visit - fShouldStopOctava = true; - return; - } - - fCurrentOctavaShift = size; - - Sguidoelement tag = guidotag::create("oct"); - if (tag) { - tag->add (guidoparam::create(size, false)); - add (tag); + // Note: AS of Finale 26.3 order is parsed correctly! + //fShouldStopOctava = true; + Sguidoelement tag = guidotag::create("oct"); + tag->add (guidoparam::create(0, false)); + add(tag); + fCurrentOctavaShift = 0; } } @@ -1140,7 +1146,7 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) Sguidoelement tag = guidotag::create("oct"); tag->add (guidoparam::create(0, false)); add(tag); - + fShouldStopOctava = false; fCurrentOctavaShift = 0; } From 834a0e4cd703a57b56e00db627c508fb981dbb2d Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 20 Aug 2021 16:29:45 +0200 Subject: [PATCH 132/164] xml2guido: Fixed octava last note conversion with unit test --- files/xml2guido/XML2GUIDO-Octava.xml | 1413 ++++++++++++++++++++++++++ src/guido/xmlpart2guido.cpp | 29 +- src/guido/xmlpart2guido.h | 1 - 3 files changed, 1423 insertions(+), 20 deletions(-) create mode 100644 files/xml2guido/XML2GUIDO-Octava.xml diff --git a/files/xml2guido/XML2GUIDO-Octava.xml b/files/xml2guido/XML2GUIDO-Octava.xml new file mode 100644 index 000000000..67dcb765c --- /dev/null +++ b/files/xml2guido/XML2GUIDO-Octava.xml @@ -0,0 +1,1413 @@ + + + + D Harmonic Minor – Scale 3 Octaves + + www.antescofo.com + + Finale v26.3 for Mac + 2021-08-20 + + + + + + + + + + 6.7187 + 40 + + + 1768 + 1250 + + 76 + 76 + 83 + 83 + + + + + 0 + 0 + + 153 + 101 + + + 0.918 + 5 + 0.918 + 0.918 + 5 + 1.0807 + 0.918 + 0.918 + 0.918 + 0.918 + 60 + 60 + 120 + 7.5 + + + + + + title + D Harmonic Minor – Scale 3 Octaves + + + rights + www.antescofo.com + + + subtitle + d和声小调音阶 + + + + MusicXML Part + + SmartMusic SoftSynth + keyboard.piano + + + 1 + 15489 + 1 + 80 + 0 + + + + + + + + + + 72 + 0 + + 218 + + system + + + 2 + + -1 + minor + + + + G + 2 + + + + + + D + 4 + + 1 + 1 + eighth + up + begin + + + 1 + + + + + + E + 4 + + 1 + 1 + eighth + up + continue + + + 2 + + + + + + F + 4 + + 1 + 1 + eighth + up + end + + + 3 + + + + + + G + 4 + + 1 + 1 + eighth + up + begin + + + 1 + + + + + + A + 4 + + 1 + 1 + eighth + up + continue + + + 2 + + + + + + B + -1 + 4 + + 1 + 1 + eighth + up + end + + + 3 + + + + + + + + + C + 1 + 5 + + 1 + 1 + eighth + sharp + down + begin + + + 4 + + + + + + D + 5 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + E + 5 + + 1 + 1 + eighth + down + end + + + + F + 5 + + 1 + 1 + eighth + down + begin + + + 3 + + + + + + G + 5 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + A + 5 + + 1 + 1 + eighth + down + end + + + + + + + + + + + + B + -1 + 5 + + 1 + 1 + eighth + down + begin + + + + C + 1 + 6 + + 1 + 1 + eighth + sharp + down + continue + + + 4 + + + + + + D + 6 + + 1 + 1 + eighth + down + end + + + 1 + + + + + + E + 6 + + 1 + 1 + eighth + down + begin + + + + F + 6 + + 1 + 1 + eighth + down + continue + + + 3 + + + + + + G + 6 + + 1 + 1 + eighth + down + end + + + 1 + + + + + + + + + A + 6 + + 1 + 1 + eighth + down + begin + + + + B + -1 + 6 + + 1 + 1 + eighth + down + continue + + + + C + 1 + 7 + + 1 + 1 + eighth + sharp + down + end + + + + D + 7 + + 1 + 1 + eighth + down + begin + + + 5 + + + + + + C + 1 + 7 + + 1 + 1 + eighth + down + continue + + + + B + -1 + 6 + + 1 + 1 + eighth + down + end + + + + + + + A + 6 + + 1 + 1 + eighth + down + begin + + + + G + 6 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + F + 6 + + 1 + 1 + eighth + down + end + + + 3 + + + + + + E + 6 + + 1 + 1 + eighth + down + begin + + + + D + 6 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + C + 1 + 6 + + 1 + 1 + eighth + sharp + down + end + + + 4 + + + + + + + + + B + -1 + 5 + + 1 + 1 + eighth + up + begin + + + + A + 5 + + 1 + 1 + eighth + up + continue + + + + G + 5 + + 1 + 1 + eighth + up + end + + + 1 + + + + + + + + + + + F + 6 + + 1 + 1 + eighth + down + begin + + + 3 + + + + + + E + 5 + + 1 + 1 + eighth + down + continue + + + + D + 5 + + 1 + 1 + eighth + down + end + + + 1 + + + + + + + + + C + 1 + 5 + + 1 + 1 + eighth + sharp + down + begin + + + 4 + + + + + + B + -1 + 4 + + 1 + 1 + eighth + down + continue + + + + A + 4 + + 1 + 1 + eighth + down + end + + + + G + 4 + + 1 + 1 + eighth + up + begin + + + 1 + + + + + + F + 4 + + 1 + 1 + eighth + up + continue + + + 3 + + + + + + E + 4 + + 1 + 1 + eighth + up + end + + + + + + + 144 + + + + + D + 4 + + 1 + 1 + eighth + up + begin + + + 1 + + + + + + E + 4 + + 1 + 1 + eighth + up + continue + + + 2 + + + + + + F + 4 + + 1 + 1 + eighth + up + end + + + 3 + + + + + + G + 4 + + 1 + 1 + eighth + up + begin + + + 1 + + + + + + A + 4 + + 1 + 1 + eighth + up + continue + + + 2 + + + + + + B + -1 + 4 + + 1 + 1 + eighth + up + end + + + 3 + + + + + + + + + C + 1 + 5 + + 1 + 1 + eighth + sharp + down + begin + + + 4 + + + + + + D + 5 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + E + 5 + + 1 + 1 + eighth + down + end + + + + F + 5 + + 1 + 1 + eighth + down + begin + + + 3 + + + + + + G + 5 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + A + 5 + + 1 + 1 + eighth + down + end + + + + + + + + + + + + B + -1 + 5 + + 1 + 1 + eighth + down + begin + + + + C + 1 + 6 + + 1 + 1 + eighth + sharp + down + continue + + + 4 + + + + + + D + 6 + + 1 + 1 + eighth + down + end + + + 1 + + + + + + E + 6 + + 1 + 1 + eighth + down + begin + + + + F + 6 + + 1 + 1 + eighth + down + continue + + + 3 + + + + + + G + 6 + + 1 + 1 + eighth + down + end + + + 1 + + + + + + + + + A + 6 + + 1 + 1 + eighth + down + begin + + + + B + -1 + 6 + + 1 + 1 + eighth + down + continue + + + + C + 1 + 7 + + 1 + 1 + eighth + sharp + down + end + + + + D + 7 + + 1 + 1 + eighth + down + begin + + + 5 + + + + + + C + 1 + 7 + + 1 + 1 + eighth + down + continue + + + + B + -1 + 6 + + 1 + 1 + eighth + down + end + + + + + + + A + 6 + + 1 + 1 + eighth + down + begin + + + + G + 6 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + F + 6 + + 1 + 1 + eighth + down + end + + + 3 + + + + + + E + 6 + + 1 + 1 + eighth + down + begin + + + + D + 6 + + 1 + 1 + eighth + down + continue + + + 1 + + + + + + C + 1 + 6 + + 1 + 1 + eighth + sharp + down + end + + + 4 + + + + + + + + + B + -1 + 5 + + 1 + 1 + eighth + up + begin + + + + A + 5 + + 1 + 1 + eighth + up + continue + + + + G + 5 + + 1 + 1 + eighth + up + end + + + 1 + + + + + + + + + + + F + 6 + + 1 + 1 + eighth + down + begin + + + 3 + + + + + + E + 5 + + 1 + 1 + eighth + down + continue + + + + D + 5 + + 1 + 1 + eighth + down + end + + + 1 + + + + + + + + + C + 1 + 5 + + 1 + 1 + eighth + sharp + down + begin + + + 4 + + + + + + B + -1 + 4 + + 1 + 1 + eighth + down + continue + + + + A + 4 + + 1 + 1 + eighth + down + end + + + + G + 4 + + 1 + 1 + eighth + up + begin + + + 1 + + + + + + F + 4 + + 1 + 1 + eighth + up + continue + + + 3 + + + + + + E + 4 + + 1 + 1 + eighth + up + end + + + + + + + D + 4 + + 6 + 1 + half + + up + + + 1 + + + + + light-heavy + + + + + diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 19be29818..27f161fa2 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -433,7 +433,6 @@ bool xmlpart2guido::checkMeasureRange() { fDoubleBar = true; } - checkOctavaEnd(); } //______________________________________________________________________________ @@ -1129,26 +1128,13 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) } else // Stop immediately { - // in MusicXML, octava stop appears BEFORE the note it should be applied upon! We therefore keep this for the next note visit - // Note: AS of Finale 26.3 order is parsed correctly! - //fShouldStopOctava = true; + // Finale MusicXML Bug? octave-shift stop appears after the visual note. But it's effect on the "octave" seems to appear STILL on the next note! + fShouldStopOctava = true; Sguidoelement tag = guidotag::create("oct"); tag->add (guidoparam::create(0, false)); add(tag); - fCurrentOctavaShift = 0; } } - - void xmlpart2guido::checkOctavaEnd() { - if (!fShouldStopOctava) { - return; - } - Sguidoelement tag = guidotag::create("oct"); - tag->add (guidoparam::create(0, false)); - add(tag); - fShouldStopOctava = false; - fCurrentOctavaShift = 0; - } //______________________________________________________________________________ void xmlpart2guido::visitStart ( S_note& elt ) @@ -2233,9 +2219,6 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) xml2guidovisitor::addPosY(note.fBreathMark, tag, -3, 1); add(tag); } - - checkOctavaEnd(); - } //--------------------- @@ -2829,6 +2812,9 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } int octave = nv.getOctave() - 3; // octave offset between MusicXML and GUIDO is -3 + if (fShouldStopOctava) { + octave -= fCurrentOctavaShift; + } string accident = alter2accident(nv.getAlter()); string name = noteName(nv); guidonoteduration dur = noteDuration(nv); @@ -3058,6 +3044,11 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur newNote (*this, thisNoteHeadPosition, this->getFingerings()); } + if (fShouldStopOctava) { + fShouldStopOctava = false; + fCurrentOctavaShift = 0; + } + isProcessingChord = false; while (pendingPops--) pop(); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 4b4e346ba..b31345005 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -168,7 +168,6 @@ public visitor // to get clef, division, staves, time and void checkWavyTrillBegin ( const notevisitor& nv ); void checkWavyTrillEnd ( const notevisitor& nv ); void checkTextEnd(); - void checkOctavaEnd(); void newNote ( const notevisitor& nv, rational posInMeasure, const std::vector& fingerings); void newChord (const deque& nvs, rational posInMeasure); From 8f7a4fe50e78af19e9e117c155f6524dd0dcb573 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 1 Sep 2021 16:29:48 +0200 Subject: [PATCH 133/164] xml2guido: Fixed grouped fingering y position and ordering inference from musicXML --- src/guido/xmlpart2guido.cpp | 39 ++++++++++++++++++++++++++++++++----- src/guido/xmlpart2guido.h | 2 ++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 27f161fa2..2601a0be5 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2746,6 +2746,18 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur counter++; } + // IMPORTANT: For Guido, Fingerings should be sorted based on default-y: farthest first. + std::sort(belowFingerings.begin(), belowFingerings.end(), [](Sxmlelement a, Sxmlelement b) { + int posa = a->getAttributeIntValue("default-y", 0); + int posb = b->getAttributeIntValue("default-y", 0); + return posa < posb; + }); + std::sort(aboveFingerings.begin(), aboveFingerings.end(), [](Sxmlelement a, Sxmlelement b) { + int posa = abs(a->getAttributeIntValue("default-y", 0)); + int posb = abs(b->getAttributeIntValue("default-y", 0)); + return posa < posb; + }); + // Generate notes with correct fingering std::vector emptyFingerings; for ( int index = 0; index < nvs.size(); index++) { @@ -2775,9 +2787,20 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur stringstream s; /// Add Placement only if default-y is unavailable - int default_y = fingerings[0]->getAttributeIntValue("default-y", 0); + int default_y = 0; + // If there are multiple fingerings, choose the default-y with smallest fabs value + for (int i=0; i < fingerings.size(); i++) { + int val = fingerings[i]->getAttributeIntValue("default-y", 0); + if (default_y == 0) { + default_y = val; + } + if ((val != 0)&&(abs(val)getAttributeValue("placement"); if (placement.size() > 0) { @@ -3100,12 +3123,20 @@ bool xmlpart2guido::findNextNote(ctree::iterator& elt, ctreegetName()<<" line:"<< elt->getInputLineNumber()<<" meas:"<pos="<add (guidoparam::create(s.str(), false)); } - //cerr << "addPosYforNoteHead for "<< elt->getName()<<" line:"<< elt->getInputLineNumber()<<" meas:"<pos="< // to get clef, division, staves, time and std::string getClef(int staffIndex, rational pos, int measureNum); void addPosYforNoteHead(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag, float offset); + void addPosYforNoteHead(const notevisitor& nv, float xmlY, Sguidoelement& tag, float offset); + bool checkMeasureRange(); From 842d790bf2c16871d2cd15b616321c683a2564f4 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 2 Sep 2021 15:57:40 +0200 Subject: [PATCH 134/164] xml2guido: Fixed positioning based on note heads where incorrect Clef was being inferred for voice position. + fixed common DY grouping in XML directions. --- src/guido/xmlpart2guido.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 2601a0be5..b249448c8 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -622,7 +622,7 @@ bool xmlpart2guido::checkMeasureRange() { } string wordPrefix=""; - // in case of composite Dynamics, detemrine whether text is Before or After + // in case of composite Dynamics, determine whether text is Before or After if (generateCompositeDynamic) { auto itol = std::find(branches.begin(), branches.end(), *iter); if (itol != branches.end()) { @@ -681,6 +681,13 @@ bool xmlpart2guido::checkMeasureRange() { wordParameters << wordPrefix <<"\"" << element->getValue() << "\""<< parameters.str(); + /// Take into account group positioning + float posy = xml2guidovisitor::getYposition(element, 0, true); + if (posy != 0.0) { + // then apply and save + commonDy += xml2guidovisitor::getYposition(element, 11.0, true); // Should this be additive? + } + if (generateCompositeDynamic) { if (tag) { // This should happen when WORD is After Dynamic @@ -689,13 +696,6 @@ bool xmlpart2guido::checkMeasureRange() { wordParameterBuffer= wordParameters.str(); } }else { - /// Take into account group positioning - float posy = xml2guidovisitor::getYposition(element, 0, true); - if (posy != 0.0) { - // then apply and save - commonDy += xml2guidovisitor::getYposition(element, 11.0, true); // Should this be additive? - } - tag = guidotag::create("text"); rational offset(fCurrentOffset, fCurrentDivision*4); @@ -2799,6 +2799,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } } if (default_y != 0) { + // Fingering default-y is from the top line of staff. In Guido, it is relative to note head float posy = (default_y / 10) * 2; // convert to half space addPosYforNoteHead(nv, posy, tag, 2.0); }else { @@ -2984,7 +2985,9 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur for (auto i = staffRange.first ; i != staffRange.second; i++ ) { // Get the measure number - if (((i->second).first <= measureNum) && ((i->second).second.first <= pos )){ + if (((i->second).first < measureNum)){ + thisClef = (i->second).second.second; + }else if ( ((i->second).first == measureNum) && ((i->second).second.first <= pos )) { thisClef = (i->second).second.second; }else break; @@ -3126,8 +3129,6 @@ void xmlpart2guido::addPosYforNoteHead(const notevisitor& nv, Sxmlelement elt, S float xmlY = xml2guidovisitor::getYposition(elt, 0, true); addPosYforNoteHead(nv, xmlY, tag, offset); - - //cerr << "addPosYforNoteHead for "<< elt->getName()<<" line:"<< elt->getInputLineNumber()<<" meas:"<pos="<add (guidoparam::create(s.str(), false)); } +// cerr <<"\t addPosYforNoteHead meas:"<pos="< Date: Wed, 22 Sep 2021 15:52:36 +0200 Subject: [PATCH 135/164] xml2guido: Nested Fingerings with position --- src/guido/xmlpart2guido.cpp | 91 +++++-------------------------------- 1 file changed, 11 insertions(+), 80 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index b249448c8..8148f9c30 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2716,59 +2716,10 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) } void xmlpart2guido::newChord(const deque& nvs, rational posInMeasure) { - // Fingering treatment: Bring all fingerings together in two vectors for placement below/above. The "above" placement should be hooked to the highest pitch in the chord, and "below" to the lowest. - std::vector belowFingerings; - std::vector aboveFingerings; - int highestPitchIndex = 0, lowestPitchIndex = 0, counter =0; - float lowestPitch = 128, highestPitch = 0; - for (auto note: nvs) { - auto localFingerings = note.getFingerings(); - for (auto fingering: localFingerings) { - std::string placement = fingering->getAttributeValue("placement"); - if (placement == "below") { - belowFingerings.push_back(fingering); - }else { - aboveFingerings.push_back(fingering); - } - } - - float localPitch = note.getMidiPitch(); - if (localPitch > highestPitch) { - highestPitch = localPitch; - highestPitchIndex = counter; - } - if (localPitch < lowestPitch) { - lowestPitch = localPitch; - lowestPitchIndex = counter; - } - - // increment index counter - counter++; - } - - // IMPORTANT: For Guido, Fingerings should be sorted based on default-y: farthest first. - std::sort(belowFingerings.begin(), belowFingerings.end(), [](Sxmlelement a, Sxmlelement b) { - int posa = a->getAttributeIntValue("default-y", 0); - int posb = b->getAttributeIntValue("default-y", 0); - return posa < posb; - }); - std::sort(aboveFingerings.begin(), aboveFingerings.end(), [](Sxmlelement a, Sxmlelement b) { - int posa = abs(a->getAttributeIntValue("default-y", 0)); - int posb = abs(b->getAttributeIntValue("default-y", 0)); - return posa < posb; - }); - // Generate notes with correct fingering std::vector emptyFingerings; for ( int index = 0; index < nvs.size(); index++) { - if (index == lowestPitchIndex) { - newNote(nvs.at(index), posInMeasure, belowFingerings); - continue; - }else if (index == highestPitchIndex) { - newNote(nvs.at(index), posInMeasure, aboveFingerings); - }else { - newNote(nvs.at(index), posInMeasure, emptyFingerings); - } + newNote(nvs.at(index), posInMeasure, nvs.at(index).getFingerings()); } } @@ -2782,34 +2733,24 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur // Fingering is tied to single notes (in chords) int hasFingerings = 0; // 0 if none, greater otherwise! - if (fingerings.size()) { + + for (int i=0; i < fingerings.size(); i++) { + auto f = fingerings[i]; Sguidoelement tag = guidotag::create("fingering"); stringstream s; - - /// Add Placement only if default-y is unavailable - int default_y = 0; - // If there are multiple fingerings, choose the default-y with smallest fabs value - for (int i=0; i < fingerings.size(); i++) { - int val = fingerings[i]->getAttributeIntValue("default-y", 0); - if (default_y == 0) { - default_y = val; - } - if ((val != 0)&&(abs(val)getAttributeIntValue("default-y", 0)); if (default_y != 0) { // Fingering default-y is from the top line of staff. In Guido, it is relative to note head float posy = (default_y / 10) * 2; // convert to half space - addPosYforNoteHead(nv, posy, tag, 2.0); + addPosYforNoteHead(nv, posy, tag, 2.0 ); // offset to bypass note-head // posy > 0.0 ? 2.0 : 0.0 }else { - std::string placement = fingerings[0]->getAttributeValue("placement"); + std::string placement = f->getAttributeValue("placement"); if (placement.size() > 0) { s << "position=\""<getAttributeFloatValue("default-x", 0); + float default_x = f->getAttributeFloatValue("default-x", 0); float dx = (default_x/10)*2; if (dx != 0 && (default_x<20.0)) { // filter values > 20.0 as they might be erroneous offsets from FINALE! if (dx < 0.0) @@ -2817,19 +2758,9 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur s << "dx="<getValue(); - if (i==0) { - s << "text=\"" << fingeringText; - }else { - s << "," << fingeringText; - } - - if (i+1 == fingerings.size()) { - s << "\""; - } - } + std::string fingeringText = f->getValue(); + s << "text=\"" << fingeringText << "\""; + tag->add (guidoparam::create(s.str(), false)); push(tag); hasFingerings++; From 236f75c55a58c6cdef7df70f6956e78f14ddf568 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 22 Sep 2021 17:19:37 +0200 Subject: [PATCH 136/164] xml2guido: Ability to position Tempo S_Direction relative to beginning of the measure --- src/guido/timePositions.cpp | 32 ++++++++++++++++++++++++++++++++ src/guido/timePositions.h | 4 ++++ src/guido/xmlpart2guido.cpp | 9 +++++++++ src/visitors/partsummary.cpp | 4 +++- src/visitors/partsummary.h | 1 + 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/guido/timePositions.cpp b/src/guido/timePositions.cpp index f2848234d..8a9a4933f 100644 --- a/src/guido/timePositions.cpp +++ b/src/guido/timePositions.cpp @@ -52,3 +52,35 @@ float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, dou } return -999; // This is when the xpos can not be computed } + +float MusicXMLTimePositions::getDxRelativeToMeasureForElement(MusicXML2::xmlelement *element, std::string onMeasure, int voiceId, double xmlOffset) { + auto timePos4measure = timePositions.find(onMeasure); + float default_x = element->getAttributeFloatValue("default-x", 0), + relative_x = element->getAttributeFloatValue("relative-x", 0); + + // MusicXML DOC: If an element within a includes a default-x attribute, the value will be ignored when determining the appearance of that element. + double finalPosition = (default_x == 0 ? (double)xmlOffset : 0.0); + + if (timePos4measure != timePositions.end()) { + auto it = find(timePos4measure->second, voiceId, finalPosition); + if (it != timePos4measure->second.end()) { + float minXPos = getDefaultX(*it); + //if (xpos != minXPos) { + int finalDx = (relative_x/10)*2; + // apply default-x ONLY if it exists + if (default_x != 0) { + // Use default-x if it exists; convert to half spaces + finalDx += ( (default_x - minXPos)/ 10 ) * 2; + } + else if (xmlOffset != 0) { + finalDx += ( (default_x - minXPos)/ 10 ) * 2; // convert to half spaces + }else { + finalDx -= (minXPos/10 * 2); + } + + return finalDx; + } + } + + return -999; // This is when the xpos can not be computed +} diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h index a9a261afa..3d18a7a65 100644 --- a/src/guido/timePositions.h +++ b/src/guido/timePositions.h @@ -38,6 +38,10 @@ class MusicXMLTimePositions /// @return a float containing Guido dx value based on available default-x in measure float getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voice, double xmlOffset); + /// Finds Guido Dx for XML Directions whose default horizontal position is from the Beginning of the Measure, such as Words and Tempo. + float getDxRelativeToMeasureForElement(MusicXML2::xmlelement *element, std::string onMeasure, int voice, double xmlOffset); + + size_t size() { return timePositions.size(); } protected: diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 8148f9c30..078b7fec9 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -675,6 +675,13 @@ bool xmlpart2guido::checkMeasureRange() { commonDy = tempoDy; } parameters << ", dy="<getAttributeValue("number"), 0, offset.toDouble()); + if (wordDx != -999 && wordDx != 0) { + parameters << ", dx=" << wordDx; + } tempoTextParameters = parameters.str(); break; } @@ -1680,7 +1687,9 @@ bool xmlpart2guido::isSlurClosing(S_slur elt) { } }else { +#if DEBUG cerr<< "XML2Guido SlurEnd, measure "<getInputLineNumber() <<": Got Slur Stop with number:"<< (*i)->getAttributeIntValue("number", 0) <<" without a Slur in Stack. Skipping!"<getAttributeValue("number"); + std::string fCurrentMeasureNumber = fCurrentMeasure->getAttributeValue("number"); + timePositions.addTimePosition(fCurrentMeasureNumber, fCurrentMeasurePosition.toDouble(), *this); moveMeasureTime (getDuration()); } @@ -77,6 +78,7 @@ void partsummary::visitEnd ( S_note& elt) void partsummary::visitStart ( S_measure& elt ) { fCurrentMeasurePosition.set(0, 1); + fCurrentMeasure = elt; } void partsummary::visitStart ( S_divisions& elt ) diff --git a/src/visitors/partsummary.h b/src/visitors/partsummary.h index 5ba15f113..a14b2570e 100755 --- a/src/visitors/partsummary.h +++ b/src/visitors/partsummary.h @@ -103,6 +103,7 @@ class EXP partsummary : long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note rational fCurrentMeasurePosition;// the current position in the measure + S_measure fCurrentMeasure; void moveMeasureTime (long duration); }; From 526c3501e8fab6e4ba4088a38cdcb8debc404958 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 22 Sep 2021 17:54:49 +0200 Subject: [PATCH 137/164] xml2guido: only infer horizontal position for Tempo if asked --- src/guido/xmlpart2guido.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 078b7fec9..ee76bd132 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -676,11 +676,16 @@ bool xmlpart2guido::checkMeasureRange() { } parameters << ", dy="<getAttributeValue("number"), 0, offset.toDouble()); - if (wordDx != -999 && wordDx != 0) { - parameters << ", dx=" << wordDx; + // Determine horizontal position, if either offset, default-x or relative-x are present. + float default_x = element->getAttributeFloatValue("default-x", 0.); + float rel_x = element->getAttributeFloatValue("relative-x", 0.); + if ( (fCurrentOffset != 0)||(default_x != 0.0)||(rel_x != 0.0)) { + // For Tempo, we should always search from the BEGINNING of measure (hence position = 0.0) + rational offset(fCurrentOffset, fCurrentDivision*4); + float wordDx = timePositions.getDxRelativeToMeasureForElement(element, fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); + if (wordDx != -999 && wordDx != 0) { + parameters << ", dx=" << wordDx; + } } tempoTextParameters = parameters.str(); break; From 102af6a764f934bd15591ae8fc6b275378093428 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Fri, 24 Sep 2021 15:01:57 +0200 Subject: [PATCH 138/164] xml2guido: Fix staff change on directions. now experimenting with open dy positioning on Bow tag. --- src/guido/xmlpart2guido.cpp | 36 ++++++++++++++++++++++++++++++------ src/guido/xmlpart2guido.h | 2 ++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index ee76bd132..c58567d64 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -483,6 +483,10 @@ bool xmlpart2guido::checkMeasureRange() { } } + if (elt->find(k_staff) != elt->end()) { + checkStaff(elt->getIntValue(k_staff, 1)); + } + // Browse into all S_direction_type elements and parse, by preserving ordering AND grouped direction positions (if missing in proceedings calls) ctree::literator iter = elt->lbegin(); @@ -2368,13 +2372,17 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (note.fBowUp || note.fBowDown) { tag = guidotag::create("bow"); - stringstream s; - if (note.fBowUp) { - s << "\"up\""; - }else { - s << "\"down\""; + if (note.fBowDown) { + stringstream s; + s << "type=\"down\""; + tag->add (guidoparam::create(s.str(), false)); + addPositionOrPlacementToNote(note, note.fBowDown, tag, -2.0); + } else { + stringstream s; + s << "type=\"up\""; + tag->add (guidoparam::create(s.str(), false)); + addPositionOrPlacementToNote(note, note.fBowUp, tag, -2.0); } - tag->add (guidoparam::create(s.str(), false)); push(tag); n++; } @@ -3070,6 +3078,22 @@ bool xmlpart2guido::findNextNote(ctree::iterator& elt, ctreegetAttributeIntValue("default-y", 0)); + if (default_y != 0) { + float posy = (default_y / 10) * 2; // convert to half space + addPosYforNoteHead(nv, posy, tag, offset); // offset to bypass note-head // posy > 0.0 ? 2.0 : 0.0 + }else { + std::string placement = elt->getAttributeValue("placement"); + if (placement.size() > 0) { + stringstream s; + s << "position=\""<add (guidoparam::create(s.str(), false)); + } + } +} + + void xmlpart2guido::addPosYforNoteHead(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag, float offset) { float xmlY = xml2guidovisitor::getYposition(elt, 0, true); diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 939867092..695306642 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -262,6 +262,8 @@ public visitor // to get clef, division, staves, time and void addPosYforNoteHead(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag, float offset); void addPosYforNoteHead(const notevisitor& nv, float xmlY, Sguidoelement& tag, float offset); + /// If default-y exist and defiined with regards to staff, convert it to dY based on note head position and add to tag parameters. Otherwise, use Placement if exists. + void addPositionOrPlacementToNote(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag, float offset); bool checkMeasureRange(); From 0c6aeec91fb0c1c500a70ab10eb8056d96ece6f3 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 27 Sep 2021 17:16:07 +0200 Subject: [PATCH 139/164] xml2guido: fixed Bow symbol position using offsets --- src/guido/timePositions.cpp | 10 +++++++++- src/guido/xmlpart2guido.cpp | 14 ++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/guido/timePositions.cpp b/src/guido/timePositions.cpp index 8a9a4933f..e1afb916a 100644 --- a/src/guido/timePositions.cpp +++ b/src/guido/timePositions.cpp @@ -26,6 +26,10 @@ float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, dou auto timePos4measure = timePositions.find(onMeasure); float default_x = element->getAttributeFloatValue("default-x", 0), relative_x = element->getAttributeFloatValue("relative-x", 0); + + if ((default_x==0.0)&&(xmlOffset==0.0)) { + return (relative_x/10)*2; + } // MusicXML DOC: If an element within a includes a default-x attribute, the value will be ignored when determining the appearance of that element. double finalPosition = position + (default_x == 0 ? (double)xmlOffset : 0.0); @@ -57,6 +61,10 @@ float MusicXMLTimePositions::getDxRelativeToMeasureForElement(MusicXML2::xmlelem auto timePos4measure = timePositions.find(onMeasure); float default_x = element->getAttributeFloatValue("default-x", 0), relative_x = element->getAttributeFloatValue("relative-x", 0); + + if ((default_x==0.0)&&(xmlOffset==0.0)) { + return (relative_x/10)*2; + } // MusicXML DOC: If an element within a includes a default-x attribute, the value will be ignored when determining the appearance of that element. double finalPosition = (default_x == 0 ? (double)xmlOffset : 0.0); @@ -66,7 +74,7 @@ float MusicXMLTimePositions::getDxRelativeToMeasureForElement(MusicXML2::xmlelem if (it != timePos4measure->second.end()) { float minXPos = getDefaultX(*it); //if (xpos != minXPos) { - int finalDx = (relative_x/10)*2; + float finalDx = (relative_x/10)*2; // apply default-x ONLY if it exists if (default_x != 0) { // Use default-x if it exists; convert to half spaces diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index c58567d64..fd9386946 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2376,12 +2376,22 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) stringstream s; s << "type=\"down\""; tag->add (guidoparam::create(s.str(), false)); - addPositionOrPlacementToNote(note, note.fBowDown, tag, -2.0); + float default_y = (float)(note.fBowDown->getAttributeIntValue("default-y", 0)); + if (default_y != 0) { + xml2guidovisitor::addPosY(note.fBowDown, tag, 0.0, 1.0); + }else { + xml2guidovisitor::addPlacement(note.fBowDown, tag); + } } else { stringstream s; s << "type=\"up\""; tag->add (guidoparam::create(s.str(), false)); - addPositionOrPlacementToNote(note, note.fBowUp, tag, -2.0); + float default_y = (float)(note.fBowUp->getAttributeIntValue("default-y", 0)); + if (default_y != 0) { + xml2guidovisitor::addPosY(note.fBowUp, tag, 0.0, 1.0); + }else { + xml2guidovisitor::addPlacement(note.fBowUp, tag); + } } push(tag); n++; From 4d546e686eb6a3a6e4dc7b0054b844c2a0a7ed5f Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 28 Sep 2021 09:29:30 +0200 Subject: [PATCH 140/164] xml2guido: removed offset hacks for fingering conversions --- src/guido/xmlpart2guido.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index fd9386946..cecf3be48 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2774,7 +2774,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur if (default_y != 0) { // Fingering default-y is from the top line of staff. In Guido, it is relative to note head float posy = (default_y / 10) * 2; // convert to half space - addPosYforNoteHead(nv, posy, tag, 2.0 ); // offset to bypass note-head // posy > 0.0 ? 2.0 : 0.0 + addPosYforNoteHead(nv, posy, tag, 0.0 ); }else { std::string placement = f->getAttributeValue("placement"); if (placement.size() > 0) { @@ -2785,8 +2785,6 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur float default_x = f->getAttributeFloatValue("default-x", 0); float dx = (default_x/10)*2; if (dx != 0 && (default_x<20.0)) { // filter values > 20.0 as they might be erroneous offsets from FINALE! - if (dx < 0.0) - dx-=1.0; // offset for note head s << "dx="< Date: Wed, 29 Sep 2021 16:21:51 +0200 Subject: [PATCH 141/164] xml2guido: refactoring + correct positioning of bow articulation --- src/guido/xmlpart2guido.cpp | 64 +++++++++++++++++++++++++++---------- src/guido/xmlpart2guido.h | 7 ++++ 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index cecf3be48..99bb5632e 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2372,26 +2372,30 @@ void xmlpart2guido::checkPostArticulation ( const notevisitor& note ) if (note.fBowUp || note.fBowDown) { tag = guidotag::create("bow"); + // in MusicXML, bow default-y's origin is changed relative to the top line of the staff. Positive y is up and negative y is down. + // In Guido, vertical origin is from the top of staff IF the associated note head is BELOW the staff top and from the notehead otherwise! if (note.fBowDown) { stringstream s; s << "type=\"down\""; tag->add (guidoparam::create(s.str(), false)); float default_y = (float)(note.fBowDown->getAttributeIntValue("default-y", 0)); if (default_y != 0) { - xml2guidovisitor::addPosY(note.fBowDown, tag, 0.0, 1.0); + addDyFromNoteOrStaff(note, note.fBowDown, tag); }else { xml2guidovisitor::addPlacement(note.fBowDown, tag); } + xml2guidovisitor::addPosX(note.fBowDown, tag, 0.0); } else { stringstream s; s << "type=\"up\""; tag->add (guidoparam::create(s.str(), false)); float default_y = (float)(note.fBowUp->getAttributeIntValue("default-y", 0)); if (default_y != 0) { - xml2guidovisitor::addPosY(note.fBowUp, tag, 0.0, 1.0); + addDyFromNoteOrStaff(note, note.fBowUp, tag); }else { xml2guidovisitor::addPlacement(note.fBowUp, tag); } + xml2guidovisitor::addPosX(note.fBowUp, tag, 0.0); } push(tag); n++; @@ -3101,6 +3105,27 @@ void xmlpart2guido::addPositionOrPlacementToNote(const notevisitor& nv, Sxmlelem } } +void xmlpart2guido::addDyFromNoteOrStaff(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag) { + float default_y = (float)(elt->getAttributeIntValue("default-y", 0)); + + if (default_y != 0.0) { + float noteDistanceFromStaffTop = distanceFromStaffTopForNote(nv); + // negative distance means we are below the top staff line + if (noteDistanceFromStaffTop > 0.0) { + addPosYforNoteHead(nv, (default_y / 10.0) * 2.0, tag, 0.0); + }else { + xml2guidovisitor::addPosY(elt, tag, 0.0, 1.0); + } + +// cerr <<"\t addPosYforNoteHead meas:"< "<add (guidoparam::create(s.str(), false)); + } + +// cerr <<"\t addPosYforNoteHead meas:"<pos="<add (guidoparam::create(s.str(), false)); - } - -// cerr <<"\t addPosYforNoteHead meas:"<pos="< // to get clef, division, staves, time and /// If default-y exist and defiined with regards to staff, convert it to dY based on note head position and add to tag parameters. Otherwise, use Placement if exists. void addPositionOrPlacementToNote(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag, float offset); + /// Adds `dy` to the tag : if associated note to the element is below the top staff, it uses distance to top staff (musicxml default-y), otherwise distance to notehead. + /// Used for Bow tags. + void addDyFromNoteOrStaff(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag); + + /// returns distance of the note from top-staff in HS + float distanceFromStaffTopForNote(const notevisitor& nv); + bool checkMeasureRange(); void parseTime(ctree::iterator &iter); From ef7c0f244496b864cd828726c26a5f9e4ba079c8 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 4 Oct 2021 18:53:35 +0200 Subject: [PATCH 142/164] xml2guido: Fix cross staff chords --- src/guido/xmlpart2guido.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 99bb5632e..3bda34829 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2755,6 +2755,7 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur // Generate notes with correct fingering std::vector emptyFingerings; for ( int index = 0; index < nvs.size(); index++) { + checkStaff(nvs.at(index).getStaff()); newNote(nvs.at(index), posInMeasure, nvs.at(index).getFingerings()); } } From f38bdc7377f584a3927d90dbb233a4203d4433c1 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 6 Oct 2021 11:31:13 +0200 Subject: [PATCH 143/164] xml2guido: fix slur orientation --- src/guido/xmlpart2guido.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 3bda34829..3aceb2611 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1597,7 +1597,7 @@ void xmlpart2guido::parseTime(ctree::iterator &iter) { tagName << "slurBegin" << ":"<< lastSlurInternalNumber; Sguidoelement tag = guidotag::create(tagName.str()); string placement = (*i)->getAttributeValue("placement"); - string orientation = (*i)->getAttributeValue("placement"); + string orientation = (*i)->getAttributeValue("orientation"); if ((placement == "below")||(orientation=="under")) tag->add (guidoparam::create("curve=\"down\"", false)); if ((placement == "above")||(orientation=="over")) From 862ac0cec0934142bdbd7bcd9a9a172f3a0039f6 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 6 Oct 2021 18:56:11 +0200 Subject: [PATCH 144/164] xml2guido: fix dx inference for default_x based on staff + refactor Wedge parsing into S_direction for better inference --- src/guido/timePositions.cpp | 9 +++++---- src/guido/timePositions.h | 15 ++++++++++----- src/guido/xmlpart2guido.cpp | 37 ++++++++++++++++++++++++++----------- src/guido/xmlpart2guido.h | 4 ++-- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/guido/timePositions.cpp b/src/guido/timePositions.cpp index e1afb916a..2ac3eb36a 100644 --- a/src/guido/timePositions.cpp +++ b/src/guido/timePositions.cpp @@ -10,7 +10,7 @@ void MusicXMLTimePositions::addTimePosition(std::string measure, double positionInMeasure, const MusicXML2::notevisitor& nv) { auto timePos4measure = timePositions.find(measure); if (nv.x_default != -1) { - VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice()); + VoicedTimePosition inner = std::make_tuple(positionInMeasure, nv.x_default, nv.getVoice(), nv.getStaff()); if ( timePos4measure != timePositions.end()) { timePos4measure->second.push_back(inner); @@ -22,7 +22,8 @@ void MusicXMLTimePositions::addTimePosition(std::string measure, double position } -float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voiceId, double xmlOffset) { +float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, double position, + std::string onMeasure, int voiceId, int staff, double xmlOffset) { auto timePos4measure = timePositions.find(onMeasure); float default_x = element->getAttributeFloatValue("default-x", 0), relative_x = element->getAttributeFloatValue("relative-x", 0); @@ -35,7 +36,7 @@ float MusicXMLTimePositions::getDxForElement(MusicXML2::xmlelement *element, dou double finalPosition = position + (default_x == 0 ? (double)xmlOffset : 0.0); if (timePos4measure != timePositions.end()) { - auto it = find(timePos4measure->second, voiceId, finalPosition); + auto it = find(timePos4measure->second, voiceId, staff, finalPosition); if (it != timePos4measure->second.end()) { float minXPos = getDefaultX(*it); //if (xpos != minXPos) { @@ -70,7 +71,7 @@ float MusicXMLTimePositions::getDxRelativeToMeasureForElement(MusicXML2::xmlelem double finalPosition = (default_x == 0 ? (double)xmlOffset : 0.0); if (timePos4measure != timePositions.end()) { - auto it = find(timePos4measure->second, voiceId, finalPosition); + auto it = find(timePos4measure->second, voiceId, 0, finalPosition); if (it != timePos4measure->second.end()) { float minXPos = getDefaultX(*it); //if (xpos != minXPos) { diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h index 3d18a7a65..7f3d177c9 100644 --- a/src/guido/timePositions.h +++ b/src/guido/timePositions.h @@ -23,8 +23,8 @@ class MusicXMLTimePositions }; MusicXMLTimePositions(const MusicXMLTimePositions &p1) { timePositions = p1.timePositions; } - // relative position in measure (double), default_x, voice number - typedef std::tuple VoicedTimePosition; + // relative position in measure (double), default_x, voice number, staff number + typedef std::tuple VoicedTimePosition; typedef std::vector TimePositionList; void addTimePosition(std::string measure, double positionInMeasure, const MusicXML2::notevisitor& nv); @@ -34,9 +34,10 @@ class MusicXMLTimePositions /// @param position musical position in measure /// @param onMeasure measure number (from musicXML) /// @param voice voice number + /// @param staff staff number /// @param xmlOffset MusicXML offset of the `element` if any /// @return a float containing Guido dx value based on available default-x in measure - float getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voice, double xmlOffset); + float getDxForElement(MusicXML2::xmlelement *element, double position, std::string onMeasure, int voice, int staff, double xmlOffset); /// Finds Guido Dx for XML Directions whose default horizontal position is from the Beginning of the Measure, such as Words and Tempo. float getDxRelativeToMeasureForElement(MusicXML2::xmlelement *element, std::string onMeasure, int voice, double xmlOffset); @@ -48,14 +49,18 @@ class MusicXMLTimePositions int getVoice(VoicedTimePosition e) { return std::get<2>(e); } int getDefaultX(VoicedTimePosition e) { return std::get<1>(e); } + int getStaff(VoicedTimePosition e) { return std::get<3>(e); } /// Returns iterator in TimePositionList with equal voiceId and EQUAL position to query - TimePositionList::iterator find(TimePositionList &timePos4measure, int voiceId, double position) { + TimePositionList::iterator find(TimePositionList &timePos4measure, int voiceId, int staff, double position) { // cerr<<"Start Search for Position "< 0) && (std::get<2>(e) != voiceId) ) { return false; } + if ((staff > 0) && (std::get<3>(e) != staff) ) { + return false; + } // cerr<<"\t TimePos elementPos="<(e)<(e) == position; }); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 3aceb2611..5ebd78935 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -483,8 +483,10 @@ bool xmlpart2guido::checkMeasureRange() { } } + int directionStaff = 0; if (elt->find(k_staff) != elt->end()) { checkStaff(elt->getIntValue(k_staff, 1)); + directionStaff = elt->getIntValue(k_staff, 0); } // Browse into all S_direction_type elements and parse, by preserving ordering AND grouped direction positions (if missing in proceedings calls) @@ -571,7 +573,7 @@ bool xmlpart2guido::checkMeasureRange() { if (fPreviousPedalYPos) { stringstream s; rational offset(fCurrentOffset, fCurrentDivision*4); - float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); + float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, directionStaff, offset.toDouble()); if (dx==-999) { return; // Return if no corresponding default-x event is found }else { @@ -593,7 +595,7 @@ bool xmlpart2guido::checkMeasureRange() { if (fPreviousPedalYPos) { stringstream s; rational offset(fCurrentOffset, fCurrentDivision*4); - float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); + float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, directionStaff, offset.toDouble()); if (dx==-999) { return; } @@ -715,7 +717,7 @@ bool xmlpart2guido::checkMeasureRange() { tag = guidotag::create("text"); rational offset(fCurrentOffset, fCurrentDivision*4); - float wordDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); + float wordDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, directionStaff, offset.toDouble()); if (wordDx != -999 && wordDx != 0) { wordParameters << ", dx=" << wordDx; } @@ -750,7 +752,7 @@ bool xmlpart2guido::checkMeasureRange() { tag = guidotag::create("intens"); tag->add (guidoparam::create((*iter2)->getName())); rational offset(fCurrentOffset, fCurrentDivision*4); - float intensDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), fTargetVoice, offset.toDouble()); + float intensDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), fTargetVoice, directionStaff, offset.toDouble()); // add pending word parameters (for "before") if (!generateAfter) { @@ -868,7 +870,7 @@ bool xmlpart2guido::checkMeasureRange() { tag->add (guidoparam::create(rehearsalValue.c_str(), false)); rational offset(fCurrentOffset, fCurrentDivision*4); - float markDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); + float markDx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, directionStaff, offset.toDouble()); if (markDx != -999 && markDx != 0) { stringstream s; s << "dx=" << markDx ; @@ -881,6 +883,12 @@ bool xmlpart2guido::checkMeasureRange() { } break; + case k_wedge: + { + parseWedge(element, directionStaff); + } + break; + default: break; } @@ -957,10 +965,12 @@ bool xmlpart2guido::checkMeasureRange() { add(tag); } - //______________________________________________________________________________ -void xmlpart2guido::visitStart ( S_wedge& elt ) +void xmlpart2guido::parseWedge(MusicXML2::xmlelement *elt, int staff) { if (fSkipDirection) return; + if (elt->getType() != k_wedge) { + return; + } string type = elt->getAttributeValue("type"); int number = elt->getAttributeIntValue("number", 1); @@ -1082,9 +1092,11 @@ void xmlpart2guido::visitStart ( S_wedge& elt ) s << "dy=" << xml2guidovisitor::getYposition(elt, 13, true) << "hs"; rational offset(fCurrentOffset, fCurrentDivision*4); - float markDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, offset.toDouble()); - if (markDx != -999 && markDx != 0) { - s << ", dx=" << markDx ; + float wedgeDx = timePositions.getDxForElement(elt, fCurrentVoicePosition.toDouble(), + fCurrentMeasure->getAttributeValue("number"), + 0, staff, offset.toDouble()); + if (wedgeDx != -999 && wedgeDx != 0) { + s << ", dx=" << wedgeDx ; } tag->add (guidoparam::create(s.str(), false)); @@ -2880,7 +2892,10 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur if (fTargetVoice) { searchVoice = fTargetVoice - 1; } - float noteDx = timePositions.getDxForElement(nv.getSnote(), posInMeasure.toDouble(), fCurrentMeasure->getAttributeValue("number"), searchVoice, 0); + float noteDx = timePositions.getDxForElement(nv.getSnote(), posInMeasure.toDouble(), + fCurrentMeasure->getAttributeValue("number"), + searchVoice, nv.getStaff(), + 0); // Do not infer default-x on incomplete measures, grace or Chords if ( (noteDx != -999 && noteDx != 0) && !fPendingBar && !isProcessingChord && !isGrace() ) { diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 872e3843a..319b8c8ff 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -61,7 +61,6 @@ public visitor, public visitor, public visitor, public visitor, -public visitor, public visitor // to get clef, division, staves, time and key in order! { // the guido elements stack @@ -206,7 +205,6 @@ public visitor // to get clef, division, staves, time and virtual void visitStart( S_octave_shift& elt); virtual void visitStart( S_part& elt); virtual void visitStart( S_segno& elt); - virtual void visitStart( S_wedge& elt); virtual void visitStart( S_attributes& elt); virtual void visitEnd ( S_direction& elt); @@ -221,6 +219,8 @@ public visitor // to get clef, division, staves, time and std::string parseMetronome ( metronomevisitor &mv ); + void parseWedge(MusicXML2::xmlelement *elt, int staff); + bool findNextNote(ctree::iterator& elt, ctree::iterator &nextnote); float getNoteDistanceFromStaffTop(const notevisitor& nv); From 5c1145f849f4224a165380aedc7c95ec90540c31 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 6 Oct 2021 19:34:13 +0200 Subject: [PATCH 145/164] xml2guido: Improved pedalOff vertical positioning --- src/guido/xmlpart2guido.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 5ebd78935..9c38a2d2a 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -555,9 +555,17 @@ bool xmlpart2guido::checkMeasureRange() { if ( (pedalType== "start") || (pedalType == "sostenuto")) { tag = guidotag::create("pedalOn"); fPreviousPedalYPos = xml2guidovisitor::getYposition(element, 14.0, true); + + xml2guidovisitor::addPosY(element, tag, 14.0, 1.0); }else if ( (pedalType== "stop") || (pedalType == "discontinue")) { tag = guidotag::create("pedalOff"); + + if (element->getAttributeFloatValue("default-y", 0.0) != 0.0) { + xml2guidovisitor::addPosY(element, tag, 14.0, 1.0); + } else { + xml2guidovisitor::addPosY(element, tag, fPreviousPedalYPos, 1.0); + } } else if ( (pedalType== "change")) { tag = guidotag::create("pedalOff"); @@ -566,23 +574,26 @@ bool xmlpart2guido::checkMeasureRange() { continue; } - if (pedalType != "change") { - xml2guidovisitor::addPosY(element, tag, 14.0, 1.0); - xml2guidovisitor::addRelativeX(element, tag, -2); // -2 offset estimating font width + // Try to infer default-x position if available + stringstream s; + rational offset(fCurrentOffset, fCurrentDivision*4); + float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, directionStaff, offset.toDouble()); + if (dx==-999) { + return; // Return if no corresponding default-x event is found }else { + dx-=2; // -2 offset estimating font width + } + + if (pedalType == "change") { + dx-=2; // to allow two tags if (fPreviousPedalYPos) { - stringstream s; - rational offset(fCurrentOffset, fCurrentDivision*4); - float dx = timePositions.getDxForElement(element, fCurrentVoicePosition.toDouble(), fCurrentMeasure->getAttributeValue("number"), 0, directionStaff, offset.toDouble()); - if (dx==-999) { - return; // Return if no corresponding default-x event is found - }else { - dx-=2; - } s << "dy=" << fPreviousPedalYPos << "hs, dx="<< dx<<"hs"; // dx was -2 - tag->add (guidoparam::create(s.str(), false)); } + }else { + s << "dx="<add (guidoparam::create(s.str(), false)); if (fCurrentOffset > 0) addDelayed(tag, fCurrentOffset); From e7baf8455018b16cf7ee08578f083d3237252527 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Thu, 7 Oct 2021 19:06:26 +0200 Subject: [PATCH 146/164] xml2guido: Do not infer fingering for empty tags --- src/guido/xmlpart2guido.cpp | 54 +++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 9c38a2d2a..b34bb3bfb 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -2794,34 +2794,36 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur // Fingering is tied to single notes (in chords) int hasFingerings = 0; // 0 if none, greater otherwise! - for (int i=0; i < fingerings.size(); i++) { - auto f = fingerings[i]; - Sguidoelement tag = guidotag::create("fingering"); - stringstream s; - float default_y = (float)(f->getAttributeIntValue("default-y", 0)); - if (default_y != 0) { - // Fingering default-y is from the top line of staff. In Guido, it is relative to note head - float posy = (default_y / 10) * 2; // convert to half space - addPosYforNoteHead(nv, posy, tag, 0.0 ); - }else { - std::string placement = f->getAttributeValue("placement"); - if (placement.size() > 0) { - s << "position=\""<getAttributeIntValue("default-y", 0)); + if (default_y != 0) { + // Fingering default-y is from the top line of staff. In Guido, it is relative to note head + float posy = (default_y / 10) * 2; // convert to half space + addPosYforNoteHead(nv, posy, tag, 0.0 ); + }else { + std::string placement = f->getAttributeValue("placement"); + if (placement.size() > 0) { + s << "position=\""<getAttributeFloatValue("default-x", 0); + float dx = (default_x/10)*2; + if (dx != 0 && (default_x<20.0)) { // filter values > 20.0 as they might be erroneous offsets from FINALE! + s << "dx="<getValue(); + s << "text=\"" << fingeringText << "\""; + + tag->add (guidoparam::create(s.str(), false)); + push(tag); + hasFingerings++; } - - float default_x = f->getAttributeFloatValue("default-x", 0); - float dx = (default_x/10)*2; - if (dx != 0 && (default_x<20.0)) { // filter values > 20.0 as they might be erroneous offsets from FINALE! - s << "dx="<getValue(); - s << "text=\"" << fingeringText << "\""; - - tag->add (guidoparam::create(s.str(), false)); - push(tag); - hasFingerings++; } int octave = nv.getOctave() - 3; // octave offset between MusicXML and GUIDO is -3 From 0248fb77a98edbc2c92ecd107f8159123c7212e5 Mon Sep 17 00:00:00 2001 From: "D. Fober" Date: Mon, 8 Nov 2021 07:23:57 +0100 Subject: [PATCH 147/164] PHONY target --- build/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/Makefile b/build/Makefile index adb35370a..0e305f60b 100644 --- a/build/Makefile +++ b/build/Makefile @@ -2,6 +2,8 @@ # # +.PHONY: android + MAKE ?= make CMAKE ?= cmake LIBDIR ?= libdir From 280484abf3cb87da35767051d9db2dfe58f3c811 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 7 Dec 2021 20:48:23 +0100 Subject: [PATCH 148/164] xml2guido: solved Octave-Shift on multi-voice scores. - Guido Octava tag is now generated over all voices of a staff using a pre-calculated map in PartSummary. - Also fixed Time Mappings in multi-voice scores used for inference of S_direction horizontal positionning. --- src/guido/xml2guidovisitor.cpp | 1 + src/guido/xmlpart2guido.cpp | 117 ++++++++++++++++++++++++--------- src/guido/xmlpart2guido.h | 18 ++++- src/visitors/partsummary.cpp | 90 ++++++++++++++++++++++--- src/visitors/partsummary.h | 18 +++-- 5 files changed, 197 insertions(+), 47 deletions(-) diff --git a/src/guido/xml2guidovisitor.cpp b/src/guido/xml2guidovisitor.cpp index 8a8732943..992f79494 100755 --- a/src/guido/xml2guidovisitor.cpp +++ b/src/guido/xml2guidovisitor.cpp @@ -295,6 +295,7 @@ namespace MusicXML2 pv.generatePositions (fGeneratePositions); xml_tree_browser browser(&pv); pv.initialize(seq, targetStaff, fCurrentStaffIndex, targetVoice, notesOnly, currentTimeSign); + pv.octavas = ps.fOctavas[targetStaff]; pv.processedDirections = processedDirections; pv.timePositions = ps.timePositions; browser.browse(*elt); diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index b34bb3bfb..8929a3949 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -204,6 +204,39 @@ bool xmlpart2guido::checkMeasureRange() { fCurrentVoicePosition.rationalise(); } } + +void xmlpart2guido::checkOctavaBegin() { + // Generate Octave-shifts on current measure and current time + std::string currMeasure = fCurrentMeasure->getAttributeValue("number"); + bool found = octavas.count(currMeasure); + if (found) { + for (auto o = octavas[currMeasure].cbegin(); o != octavas[currMeasure].cend(); ) { + // o.second points to pair< time, type > + if ( o->first < fCurrentVoicePosition && o->second != 0) { + parseOctaveShift(o->second); + octavas[currMeasure].erase(o++); + }else { + ++o; + } + } + } +} + +void xmlpart2guido::checkOctavaEnd() { + std::string currMeasure = fCurrentMeasure->getAttributeValue("number"); + bool found = octavas.count(currMeasure); + if (found) { + for (auto o = octavas[currMeasure].cbegin(); o != octavas[currMeasure].cend(); ) { + // o.second points to pair< time, type > + if ( o->first <= fCurrentVoicePosition && o->second == 0) { + parseOctaveShift(o->second); + octavas[currMeasure].erase(o++); + }else { + ++o; + } + } + } +} //______________________________________________________________________________ // check the current position in the current voice: when it lags behind @@ -253,6 +286,9 @@ bool xmlpart2guido::checkMeasureRange() { Sguidoelement note = guidonote::create(fTargetVoice, "empty", 0, dur, ""); add (note); fMeasureEmpty = false; + if (fCurrentOctavaShift) { + checkOctavaEnd(); + } } } @@ -439,11 +475,11 @@ bool xmlpart2guido::checkMeasureRange() { void xmlpart2guido::visitStart ( S_direction& elt ) { // Directions can have voice (not encoded as of Finale v27). Check: - int voiceNumber = elt->getIntValue(k_voice, -1); + int voiceNumber = elt->getIntValue(k_voice, -1); // set default to -1 to skip if not available if (voiceNumber >0 && voiceNumber != fTargetVoice) { fSkipDirection = true; } - // Parse Staff and Offset first + // Skip if direction doesn't belong to target staff if ((elt->getIntValue(k_staff, 1) != fTargetStaff) ) { //fNotesOnly || fSkipDirection = true; } @@ -456,12 +492,15 @@ bool xmlpart2guido::checkMeasureRange() { int lineNumber = elt->getInputLineNumber(); auto it = std::find(processedDirections.begin(), processedDirections.end(), lineNumber); if (it == processedDirections.end()) { - fCurrentOffset = elt->getLongValue(k_offset, 0); processedDirections.push_back(lineNumber); }else { fSkipDirection = true; } } + + if (!fSkipDirection) { + fCurrentOffset = elt->getLongValue(k_offset, 0); + } } //______________________________________________________________________________ @@ -547,6 +586,11 @@ bool xmlpart2guido::checkMeasureRange() { auto element = (*directionTypeElements); switch (elementType) { + case k_octave_shift: { + //parseOctaveShift(element, directionStaff); + // IMPORTANT: DO NOT parse Octave-Shift during part visits! Now using a pre-calculated map. + } + break; case k_pedal: { bool isPedalChange = false; @@ -978,7 +1022,6 @@ bool xmlpart2guido::checkMeasureRange() { void xmlpart2guido::parseWedge(MusicXML2::xmlelement *elt, int staff) { - if (fSkipDirection) return; if (elt->getType() != k_wedge) { return; } @@ -1139,40 +1182,48 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) //______________________________________________________________________________ - void xmlpart2guido::visitStart( S_octave_shift& elt) - { - if (fSkipDirection) { - return; + void xmlpart2guido::parseOctaveShift(int type) { + Sguidoelement tag = guidotag::create("oct"); + + if (type) { + tag->add (guidoparam::create(type, false)); + fCurrentOctavaShift = type; + }else { // stop + fShouldStopOctava = true; + tag->add (guidoparam::create(0, false)); } + // Try to infer default-x position if available + stringstream s; + rational offset(fCurrentOffset, fCurrentDivision*4); + + if (fCurrentOffset > 0) { + addDelayed(tag, fCurrentOffset); + } + else { + add(tag); + } + } + + void xmlpart2guido::parseOctaveShift(MusicXML2::xmlelement *elt, int staff) + { const string& type = elt->getAttributeValue("type"); int size = elt->getAttributeIntValue("size", 8); switch (size) { - case 8: size = 1; break; - case 15: size = 2; break; - default: return; + case 8: size = 1; break; + case 15: size = 2; break; + default: return; } - if (type != "stop") { if (type == "up") size = -size; - fCurrentOctavaShift = size; - - Sguidoelement tag = guidotag::create("oct"); - if (tag) { - tag->add (guidoparam::create(size, false)); - add (tag); - } } - else // Stop immediately - { - // Finale MusicXML Bug? octave-shift stop appears after the visual note. But it's effect on the "octave" seems to appear STILL on the next note! - fShouldStopOctava = true; - Sguidoelement tag = guidotag::create("oct"); - tag->add (guidoparam::create(0, false)); - add(tag); + else { + size = 0; } + + parseOctaveShift(size); } //______________________________________________________________________________ @@ -2901,13 +2952,11 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } } - int searchVoice = 0; - if (fTargetVoice) { - searchVoice = fTargetVoice - 1; - } - float noteDx = timePositions.getDxForElement(nv.getSnote(), posInMeasure.toDouble(), + float noteDx = timePositions.getDxForElement(nv.getSnote(), + posInMeasure.toDouble(), fCurrentMeasure->getAttributeValue("number"), - searchVoice, nv.getStaff(), + nv.getVoice(), + nv.getStaff(), 0); // Do not infer default-x on incomplete measures, grace or Chords if ( (noteDx != -999 && noteDx != 0) && !fPendingBar && !isProcessingChord && !isGrace() ) @@ -3012,6 +3061,8 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur } if (!scanVoice) return; + checkOctavaBegin(); + if ((fTremoloInProgress)&&(fTremolo && (fTremolo->getAttributeValue("type")=="stop"))) { fTremoloInProgress = false; pop(); @@ -3094,6 +3145,8 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur checkDelayed (getDuration(), false); // check for delayed elements (directions with offset) and indicated before = false + checkOctavaEnd(); + fMeasureEmpty = false; } diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index 319b8c8ff..f95f064a6 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -56,7 +56,6 @@ public visitor, public visitor, public visitor, public visitor, -public visitor, public visitor, public visitor, public visitor, @@ -84,7 +83,6 @@ public visitor // to get clef, division, staves, time and int fTupletOpen; // Number of opened Tuplets std::queue fTiedOpen; // Number of ongoing opened Tied - std::queue fDirectionEraserStack; // To skip already visited Directions when looking ahead because of grace notes std::vector< std::pair > fSlurStack; // first int: Internal num, 2nd int: XML num Sguidoelement fLyricOpened; @@ -202,7 +200,6 @@ public visitor // to get clef, division, staves, time and virtual void visitStart( S_forward& elt); virtual void visitStart( S_measure& elt); virtual void visitStart( S_note& elt); - virtual void visitStart( S_octave_shift& elt); virtual void visitStart( S_part& elt); virtual void visitStart( S_segno& elt); virtual void visitStart( S_attributes& elt); @@ -221,6 +218,11 @@ public visitor // to get clef, division, staves, time and void parseWedge(MusicXML2::xmlelement *elt, int staff); + void parseOctaveShift(MusicXML2::xmlelement *elt, int staff); + /// creates an Octave Shift for Guido. + /// @param type 0 for stop, 8 for one-octave above, -8 for 1-oct below, 15 for two oct above, etc. + void parseOctaveShift(int type); + bool findNextNote(ctree::iterator& elt, ctree::iterator &nextnote); float getNoteDistanceFromStaffTop(const notevisitor& nv); @@ -254,6 +256,10 @@ public visitor // to get clef, division, staves, time and /// List of already processed Directions in other voices/staves to skip std::vector processedDirections; + // Octavas must be re-applied across voices in the same staff. This property tracks them. + /// Map containing octavas on a staff: measureNumberString, PositionInMeasure, Type (0 for stop) + std::map> octavas; + private: bool fHasLyrics; @@ -277,9 +283,15 @@ public visitor // to get clef, division, staves, time and void parseTime(ctree::iterator &iter); void parseKey(ctree::iterator &iter); + void checkOctavaBegin(); + void checkOctavaEnd(); + Sguidoelement lastKey; // Storage used for Partial Conversions Sguidoelement lastMeter; // Storage used for Partial Conversions double fPreviousPedalYPos; // Used for musicxml pedal change + + // To skip already visited Directions when looking ahead because of grace notes + std::queue fDirectionEraserStack; }; diff --git a/src/visitors/partsummary.cpp b/src/visitors/partsummary.cpp index f313bb3c0..0d71d4eeb 100644 --- a/src/visitors/partsummary.cpp +++ b/src/visitors/partsummary.cpp @@ -67,8 +67,10 @@ void partsummary::visitEnd ( S_note& elt) if (!isGrace() ) { std::string fCurrentMeasureNumber = fCurrentMeasure->getAttributeValue("number"); - timePositions.addTimePosition(fCurrentMeasureNumber, fCurrentMeasurePosition.toDouble(), *this); - moveMeasureTime (getDuration()); + timePositions.addTimePosition(fCurrentMeasureNumber, + getMeasureTime(getVoice()).toDouble(), + *this); + moveMeasureTime (getDuration(), getVoice()); } fStaves[notevisitor::getStaff()]++; fVoices[notevisitor::getVoice()]++; @@ -77,7 +79,10 @@ void partsummary::visitEnd ( S_note& elt) void partsummary::visitStart ( S_measure& elt ) { - fCurrentMeasurePosition.set(0, 1); + for (auto&& voice: fCurrentVoicedMeasurePosition ) { + voice.second.set(0, 1); + } + fCurrentMeasure = elt; } @@ -91,7 +96,12 @@ void partsummary::visitStart ( S_backup& elt ) { int duration = elt->getIntValue(k_duration, 0); if (duration) { - moveMeasureTime (-duration); + for (auto&& voice: fCurrentVoicedMeasurePosition) { + // don't back up if a voice is already zeroed + if (getMeasureTime(voice.first) > rational()) { + moveMeasureTime(-duration, voice.first); + } + } } } @@ -99,15 +109,79 @@ void partsummary::visitStart ( S_backup& elt ) void partsummary::visitStart ( S_forward& elt ) { int duration = elt->getIntValue(k_duration, 0); - moveMeasureTime(duration); + int voice = elt->getIntValue(k_voice, kUndefinedVoice); + moveMeasureTime(duration, voice); } -void partsummary::moveMeasureTime (long duration) +void partsummary::visitStart ( S_direction& elt ) +{ + if (elt->find(k_octave_shift) == elt->end()) { + return; + } + int offset = elt->getLongValue(k_offset, 0); + + int voice = elt->getIntValue(k_voice, -1); + int staff = elt->getIntValue(k_staff, 1); + std::string fCurrentMeasureNumber = fCurrentMeasure->getAttributeValue("number"); + + rational curTime = voice == -1 ? maxStaffTime(staff) : getMeasureTime(voice) ; + if (offset != 0) { + rational ratOffset(offset, fCurrentDivision*4); + curTime += ratOffset; + curTime.rationalise(); + } + + const string& type = elt->find(k_octave_shift)->getAttributeValue("type"); + int size = elt->find(k_octave_shift)->getAttributeIntValue("size", 8); + switch (size) { + case 8: size = 1; break; + case 15: size = 2; break; + case 22: size = 3; break; + default: return; + } + if (type != "stop") { + if (type == "up") + size = -size; + } + else { + size = 0; + } + + fOctavas[staff][fCurrentMeasureNumber][curTime] = size; +// cerr<<"PS added octava staff:"<, public visitor, public visitor, - public visitor + public visitor, + public visitor { public: partsummary() : fStavesCount(1) { - fCurrentMeasurePosition.set(0, 1); }; virtual ~partsummary() {}; @@ -80,6 +80,9 @@ class EXP partsummary : std::map fStaffDistances; MusicXMLTimePositions timePositions; + + // staves, measures (by string name) and their position in measure, mapped to LINE NUMBER for all Octave-Shift elements + std::map>> fOctavas; protected: virtual void visitStart ( S_part& elt); @@ -90,6 +93,7 @@ class EXP partsummary : virtual void visitStart ( S_forward& elt ); virtual void visitStart ( S_divisions& elt ); virtual void visitStart ( S_measure& elt ); + virtual void visitStart ( S_direction& elt ); private: // count of staves (from the staves element) @@ -101,11 +105,17 @@ class EXP partsummary : // staves and corresponding voices + count of notes std::map > fStaffVoices; + // Internal map for Voice-Position for on-going measure + std::map fCurrentVoicedMeasurePosition; + + long fCurrentDivision; // the current measure division, expresses the time unit in division of the quarter note - rational fCurrentMeasurePosition;// the current position in the measure S_measure fCurrentMeasure; - void moveMeasureTime (long duration); + void moveMeasureTime (long duration, int voice); + + rational getMeasureTime(int voice); + rational maxStaffTime(int staff); }; /*! @} */ From 7e6132b61450a56c62d48c66b48ef39fdfc83e72 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Wed, 8 Dec 2021 16:15:43 +0100 Subject: [PATCH 149/164] xml2guido: Fixed clef generation on multi-voice scores --- src/guido/xmlpart2guido.cpp | 21 +++++++++++++++++++++ src/guido/xmlpart2guido.h | 3 +++ 2 files changed, 24 insertions(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 8929a3949..4624d04b0 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1417,6 +1417,10 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) if ((staffnum != fTargetStaff) || fNotesOnly) { + // We should generate Empty at the boundary of Clef Change IF there's no Note event in the measure + if (!findNextNote(0, elt)) { + checkVoiceTime (fCurrentMeasurePosition, fCurrentVoicePosition); + } /// Search again for other clefs: iter++; iter = elt->find(k_clef, iter); @@ -3172,6 +3176,23 @@ bool xmlpart2guido::findNextNote(ctree::iterator& elt, ctree::iterator nextnote = find(fCurrentMeasure->begin(), fCurrentMeasure->end(), from); + if (nextnote != fCurrentMeasure->end()) nextnote++; // advance one step + while (nextnote != fCurrentMeasure->end()) { + // looking for the next note on the target staff + if ((nextnote->getType() == k_note) && (nextnote->getIntValue(k_voice,0) == fTargetVoice)) { + if (elt) { + elt = *nextnote; + } + return true; + } + nextnote++; + } + return false; + +} + void xmlpart2guido::addPositionOrPlacementToNote(const notevisitor& nv, Sxmlelement elt, Sguidoelement& tag, float offset) { float default_y = (float)(elt->getAttributeIntValue("default-y", 0)); if (default_y != 0) { diff --git a/src/guido/xmlpart2guido.h b/src/guido/xmlpart2guido.h index f95f064a6..a28883e7e 100755 --- a/src/guido/xmlpart2guido.h +++ b/src/guido/xmlpart2guido.h @@ -292,6 +292,9 @@ public visitor // to get clef, division, staves, time and // To skip already visited Directions when looking ahead because of grace notes std::queue fDirectionEraserStack; + + /// find next note in current measure from the indicated xmlelement. Returns true if found. + bool findNextNote(MusicXML2::xmlelement *elt, MusicXML2::xmlelement *from); }; From a285b80b37e966f3861161866f143540e0d14b73 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 21 Feb 2022 19:04:31 +0100 Subject: [PATCH 150/164] xml2guido: Make sure Octava is parsed on Empty voices and hidden --- src/guido/xmlpart2guido.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 4624d04b0..9077ecdeb 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -252,6 +252,7 @@ void xmlpart2guido::checkOctavaEnd() { add (note); fCurrentVoicePosition += diff; fCurrentVoicePosition.rationalise(); + checkOctavaBegin(); } // difference can be negative due to S_backup and it is normal! } @@ -1193,6 +1194,10 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) tag->add (guidoparam::create(0, false)); } + if (fNotesOnly) { + tag->add(guidoparam::create("hidden=\"on\"", false)); + } + // Try to infer default-x position if available stringstream s; rational offset(fCurrentOffset, fCurrentDivision*4); @@ -3063,10 +3068,10 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur checkDelayed (getDuration(), true); } } - if (!scanVoice) return; - checkOctavaBegin(); - + + if (!scanVoice) return; + if ((fTremoloInProgress)&&(fTremolo && (fTremolo->getAttributeValue("type")=="stop"))) { fTremoloInProgress = false; pop(); From 626853fe249ee8cfe41a380c6dd5cd478ef667f4 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Mon, 21 Feb 2022 19:11:49 +0100 Subject: [PATCH 151/164] xml2guido: Unit test for multi-voice Octava --- .../xml2guido/XML2GUIDO-OctavaMultiVoice.xml | 815 ++++++++++++++++++ 1 file changed, 815 insertions(+) create mode 100644 files/xml2guido/XML2GUIDO-OctavaMultiVoice.xml diff --git a/files/xml2guido/XML2GUIDO-OctavaMultiVoice.xml b/files/xml2guido/XML2GUIDO-OctavaMultiVoice.xml new file mode 100644 index 000000000..86b63d819 --- /dev/null +++ b/files/xml2guido/XML2GUIDO-OctavaMultiVoice.xml @@ -0,0 +1,815 @@ + + + + Kiss the Rain + + Yiruma + www.antescofo.com + + Finale v26.3 for Mac + 2022-02-21 + + + + + + + + + + 6.35 + 40 + + + 1871 + 1323 + + 94 + 94 + 94 + 94 + + + + + 0 + 0 + + 113 + 63 + + + 0.7487 + 5 + 0.7487 + 0.7487 + 5 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 0.7487 + 60 + 60 + 120 + 7.5 + + + + + + + rights + www.antescofo.com + + + title + Kiss the Rain + + + composer + Yiruma + + + + Piano + Pno. + + SmartMusic SoftSynth + keyboard.piano + + + 9 + 15489 + 1 + 80 + 0 + + + + + + + + + + 66 + 0 + + 189 + + system + + + 24 + + -4 + major + + + + G + 2 + + + + + + E + -1 + 5 + + 6 + 1 + 16th + down + begin + begin + + + + + + + A + -1 + 5 + + 6 + 1 + 16th + down + continue + continue + + + + B + -1 + 5 + + 6 + 1 + 16th + down + end + end + + + + + + + + + + G + 5 + + 12 + 1 + eighth + down + begin + + + + + + + + B + -1 + 5 + + 12 + 1 + eighth + down + + + + E + -1 + 6 + + 12 + 1 + eighth + down + end + + + + + + + G + 5 + + 48 + 1 + half + down + + + + + E + -1 + 6 + + 48 + 1 + half + down + + + + B + 4 + + 6 + 1 + 16th + + + + + + + + + E + -1 + 6 + + 6 + 1 + 16th + down + begin + begin + + + + + + + F + 6 + + 6 + 1 + 16th + down + continue + continue + + + + G + 6 + + 6 + 1 + 16th + down + end + end + + + + + + + + + + G + 6 + + 12 + 1 + eighth + down + begin + + + + + + + A + -1 + 6 + + 12 + 1 + eighth + down + end + + + + + + + A + -1 + 6 + + 24 + + 1 + quarter + down + + + + + + + + A + -1 + 6 + + 12 + + 1 + eighth + down + begin + + + + + + + B + -1 + 6 + + 12 + 1 + eighth + down + end + + + + C + 6 + + 8 + 1 + eighth + + 3 + 2 + + down + begin + + + + + + + + C + 7 + + 8 + 1 + eighth + + 3 + 2 + + down + + + + B + -1 + 6 + + 8 + 1 + eighth + + 3 + 2 + + down + continue + + + + A + -1 + 6 + + 8 + 1 + eighth + + 3 + 2 + + down + end + + + + + + + + + + 158 + + + + + G + 6 + + 48 + 1 + half + up + + + + + + + A + 5 + + 12 + 1 + eighth + + + + A + -1 + 6 + + 12 + 1 + eighth + up + begin + + + + + + + G + 6 + + 12 + 1 + eighth + up + continue + + + + E + -1 + 6 + + 12 + 1 + eighth + up + end + + + + + + 96 + + + + G + 5 + + 24 + 2 + quarter + + + + A + -1 + 5 + + 24 + 2 + quarter + down + + + + + + + C + 6 + + 48 + 2 + half + down + + + + + + + + + + E + -1 + 6 + + 12 + 1 + eighth + up + begin + + + + + + + F + 6 + + 12 + 1 + eighth + up + end + + + + 4 + + + + + + F + 6 + + 48 + + 1 + half + up + + + + + 5 + + + + + + F + 6 + + 12 + + 1 + eighth + up + begin + + + + + + + E + -1 + 6 + + 6 + 1 + 16th + up + continue + begin + + + + D + -1 + 6 + + 6 + 1 + 16th + up + end + end + + + + + + 96 + + + + G + 5 + + 24 + 2 + quarter + down + + + + + + + A + -1 + 5 + + 72 + 2 + half + + down + + + + + + + + + + D + -1 + 6 + + 12 + 1 + eighth + up + begin + + + + + + + E + -1 + 6 + + 12 + 1 + eighth + up + end + + + + + + + E + -1 + 6 + + 24 + + 1 + quarter + up + + + + + + + E + -1 + 6 + + 36 + + 1 + quarter + + up + + + + + + + + + -12 + + + + A + -1 + 5 + + 6 + 1 + 16th + up + begin + begin + + + + B + -1 + 5 + + 6 + 1 + 16th + up + end + end + + + 96 + + + 24 + 2 + + + + B + -1 + 5 + + 24 + 2 + quarter + down + + + + + + + A + -1 + 5 + + 24 + 2 + quarter + down + + + + + + + C + 4 + + 24 + 2 + quarter + + + light-heavy + + + + + From 2a3837927df276530664f5a852e84f48106a8ba9 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 22 Feb 2022 06:51:58 +0100 Subject: [PATCH 152/164] xml2guido: make sure Octava check is done when passing over Empty voices --- src/guido/xmlpart2guido.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 9077ecdeb..007010430 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -252,7 +252,10 @@ void xmlpart2guido::checkOctavaEnd() { add (note); fCurrentVoicePosition += diff; fCurrentVoicePosition.rationalise(); - checkOctavaBegin(); + if (fCurrentOctavaShift) { + checkOctavaEnd(); + }else + checkOctavaBegin(); } // difference can be negative due to S_backup and it is normal! } @@ -289,7 +292,8 @@ void xmlpart2guido::checkOctavaEnd() { fMeasureEmpty = false; if (fCurrentOctavaShift) { checkOctavaEnd(); - } + }else + checkOctavaBegin(); } } @@ -3068,9 +3072,10 @@ void xmlpart2guido::newChord(const deque& nvs, rational posInMeasur checkDelayed (getDuration(), true); } } + if (!scanVoice) return; + checkOctavaBegin(); - if (!scanVoice) return; if ((fTremoloInProgress)&&(fTremolo && (fTremolo->getAttributeValue("type")=="stop"))) { fTremoloInProgress = false; From 848b185f3947abd28c1b4a472b3c95ebc19f2860 Mon Sep 17 00:00:00 2001 From: Arshia Cont Date: Tue, 22 Feb 2022 08:13:56 +0100 Subject: [PATCH 153/164] Adds missing include for Ubuntu STD compilation --- src/guido/timePositions.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/guido/timePositions.h b/src/guido/timePositions.h index 7f3d177c9..4af462bc9 100644 --- a/src/guido/timePositions.h +++ b/src/guido/timePositions.h @@ -11,6 +11,7 @@ #include #include #include +#include #include "xml.h" #include "notevisitor.h" From 14701fdfb578d86a91b756cdd6f5c748a69df726 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Tue, 22 Feb 2022 17:21:47 +0100 Subject: [PATCH 154/164] activate wasm --- javascript/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javascript/Makefile b/javascript/Makefile index 61c17c3fc..f22bcb4da 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -67,8 +67,8 @@ $(npmdir)/$(library).js : $(library).js ############################################################## # building the library as web assembly ############################################################## -$(library).js : $(objects) - emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=0 +$(library).js : $(objects) Makefile + emcc -O3 --bind --memory-init-file 0 $(objects) -o $@ $(OPTIONS) -s WASM=1 clean: rm -f $(objects) $(target) From 1816c51483f84c7bc8e0d1ad8079e36e66e88bf7 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Tue, 22 Feb 2022 17:22:04 +0100 Subject: [PATCH 155/164] versions update + change log --- CHANGELOG.txt | 13 ++++++++++++- build/CMakeLists.txt | 6 +++--- build/Makefile | 2 +- doc/Doxyfile | 2 +- javascript/npm/package.json | 2 +- packages/Makefile | 2 +- src/elements/versions.cpp | 14 ++++---------- src/elements/versions.h | 8 +------- validation/libmusicxmlversion.txt | 2 +- win32/libmusicxml/libmusicxml.rc | 10 +++++----- 10 files changed, 30 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index e96bbf87f..fd6e8e31b 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,18 @@ MusicXML Library +---------------------------------------------------------------------------------------------------- +Version 3.21 +- xml2guido v.3.2: + - Support for Pedal, non-wavy trills tags + - Major improvements to Octava, Xml Directions, Fingerings, Wedge, Slurs, Beaming and other + articulation parsing especially for multi-voice scores + - Improvements to horizontal positioning of elements following MusicXML TimePositions + - Support for Partial generation of Guido Scores from MusicXML + - Updates for latest GuidoLib Release + Note: iOS Builds now use frameworks as it has (re)become industry standard via XCFramework since 2021. + + ---------------------------------------------------------------------------------------------------- Version 3.20 - xml2guido v.3.1: @@ -16,7 +28,6 @@ Version 3.20 - Improved grouping detection for Guido Beaming (especially nested beams) - Fixed ordering of grace notte tag creation - Ability tto parse nested Ties with correct sequencing in Guido -- xml2ly: ---------------------------------------------------------------------------------------------------- diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index b8c7ddb72..88fd95158 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -11,7 +11,7 @@ endif() # versions management set (XMLVERSION 3.1) -set (VERSION 3.2.0) +set (VERSION 3.2.1) macro (get_major_minor_patch version) string( REGEX REPLACE "([0-9]*)\\.([0-9]*)\\.([0-9]*)" "\\1" VERSION_MAJOR ${version} ) string( REGEX REPLACE "([0-9]*)\\.([0-9]*)\\.([0-9]*)" "\\2" VERSION_MINOR ${version} ) @@ -19,8 +19,8 @@ macro (get_major_minor_patch version) endmacro() get_major_minor_patch( ${VERSION} ) set (SOVERS ${VERSION_MAJOR}) -set (STRVERS "v.3.20") -set (SSTRVERS "3.20") +set (STRVERS "v.3.21") +set (SSTRVERS "3.21") message (STATUS "Configuring version ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") get_filename_component(ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) diff --git a/build/Makefile b/build/Makefile index 0e305f60b..278297414 100644 --- a/build/Makefile +++ b/build/Makefile @@ -10,7 +10,7 @@ LIBDIR ?= libdir IOSDIR ?= iosdir MAKEFILE ?= Makefile -VERSION = 3.20 +VERSION = 3.21 CMAKEOPT ?= TOOLS := xml2midi xmlread xml2guido xmlversion diff --git a/doc/Doxyfile b/doc/Doxyfile index d66f09007..b47222146 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -31,7 +31,7 @@ PROJECT_NAME = LibMusicXML # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = 3.20 +PROJECT_NUMBER = 3.21 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. diff --git a/javascript/npm/package.json b/javascript/npm/package.json index 451fc3002..5121dbe57 100644 --- a/javascript/npm/package.json +++ b/javascript/npm/package.json @@ -1,6 +1,6 @@ { "name": "@grame/libmusicxml", - "version": "3.20", + "version": "3.21", "description": "A library to support the MusicXML format.", "main": "libmusicxml.js", "directories": { diff --git a/packages/Makefile b/packages/Makefile index 77b61b1d9..e983d9c10 100644 --- a/packages/Makefile +++ b/packages/Makefile @@ -2,7 +2,7 @@ # current dtds and schema version CURRENT = 3.1 -VERSION := 3.20 +VERSION := 3.21 TAG :=-D tomorrow ROOTDIR := .. SRCDIR := $(ROOTDIR)/src diff --git a/src/elements/versions.cpp b/src/elements/versions.cpp index 37b1dc744..817bdccea 100755 --- a/src/elements/versions.cpp +++ b/src/elements/versions.cpp @@ -15,17 +15,11 @@ namespace MusicXML2 { //______________________________________________________________________________ -float versions::libVersion() { return 3.20f; } -const char* versions::libVersionStr() { return "3.20"; } +float versions::libVersion() { return 3.21f; } +const char* versions::libVersionStr() { return "3.21"; } -float versions::xml2guidoVersion() { return 3.1f; } -const char* versions::xml2guidoVersionStr() { return "3.1"; } - -float versions::xml2lilypondVersion() { return 0.92f; } -const char* versions::xml2lilypondVersionStr() { return "0.92"; } - -float versions::xml2brailleVersion() { return 0.03f; } -const char* versions::xml2brailleVersionStr() { return "0.03"; } +float versions::xml2guidoVersion() { return 3.2f; } +const char* versions::xml2guidoVersionStr() { return "3.2"; } } diff --git a/src/elements/versions.h b/src/elements/versions.h index 1680f4390..1bc7a3348 100644 --- a/src/elements/versions.h +++ b/src/elements/versions.h @@ -35,13 +35,7 @@ class EXP versions { static float xml2guidoVersion(); static const char* xml2guidoVersionStr(); - - static float xml2lilypondVersion(); - static const char* xml2lilypondVersionStr(); - - static float xml2brailleVersion(); - static const char* xml2brailleVersionStr(); - + // static float xml2antescofoVersion(); // static const char* xml2antescofoVersionStr(); }; diff --git a/validation/libmusicxmlversion.txt b/validation/libmusicxmlversion.txt index 78c8a7428..a91121ce3 100644 --- a/validation/libmusicxmlversion.txt +++ b/validation/libmusicxmlversion.txt @@ -1 +1 @@ -3.17 +3.21 diff --git a/win32/libmusicxml/libmusicxml.rc b/win32/libmusicxml/libmusicxml.rc index b35447f2c..9bf6654e5 100644 --- a/win32/libmusicxml/libmusicxml.rc +++ b/win32/libmusicxml/libmusicxml.rc @@ -53,8 +53,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,2,0,0 - PRODUCTVERSION 3,2,0,0 + FILEVERSION 3,2,1,0 + PRODUCTVERSION 3,2,1,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -71,12 +71,12 @@ BEGIN BEGIN VALUE "CompanyName", "Grame" VALUE "FileDescription", "libmusicxml library" - VALUE "FileVersion", "3, 2, 0, 0" + VALUE "FileVersion", "3, 2, 1, 0" VALUE "InternalName", "libmusicxml" - VALUE "LegalCopyright", "Copyright (C) GRAME 2008-2020" + VALUE "LegalCopyright", "Copyright (C) GRAME 2008-2022" VALUE "OriginalFilename", "libmusicxml3.dll" VALUE "ProductName", " libmusicxml" - VALUE "ProductVersion", "3, 2, 0, 0" + VALUE "ProductVersion", "3, 2, 1, 0" END END BLOCK "VarFileInfo" From 19ca656f7a6c493e787903f29ceb77e166c56feb Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Tue, 22 Mar 2022 10:07:02 +0100 Subject: [PATCH 156/164] fix target name with MSYS --- build/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 88fd95158..a9454e300 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -125,11 +125,16 @@ set_source_files_properties (${COREH} PROPERTIES HEADER_FILE_ONLY TRUE) if(WIN32 OR MSYS) enable_language(RC) set(LIBCONTENT ${CORESRC} ${COREH} ${ROOT}/win32/libmusicxml/libmusicxml.rc) + if (MSYS) + set(target musicxml) + else() + set(target libmusicxml) + endif() else() set(LIBCONTENT ${CORESRC} ${COREH}) + set(target libmusicxml) endif() -set(target libmusicxml) set(staticlib musicxml2static) if (NOT IOS) From aef4f1d6ced4ccea79cf917af938778193c1273d Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Tue, 22 Mar 2022 10:13:37 +0100 Subject: [PATCH 157/164] add types field --- javascript/npm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/npm/package.json b/javascript/npm/package.json index 5121dbe57..c934b3064 100644 --- a/javascript/npm/package.json +++ b/javascript/npm/package.json @@ -4,9 +4,9 @@ "description": "A library to support the MusicXML format.", "main": "libmusicxml.js", "directories": { - "dist": "dist" "test": "test" }, + "types": "libmusicxml.d.ts", "scripts": { "test": "cd test && node testApi.node.js" }, From ba2ba1b6f0b71196a914376b91b08344677635fb Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Tue, 22 Mar 2022 10:16:16 +0100 Subject: [PATCH 158/164] fix version + phony --- javascript/Makefile | 2 ++ javascript/npm/package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/javascript/Makefile b/javascript/Makefile index f22bcb4da..1e3c6b268 100644 --- a/javascript/Makefile +++ b/javascript/Makefile @@ -32,6 +32,8 @@ OPTIONS := -s ALLOW_MEMORY_GROWTH=0 -s TOTAL_MEMORY=134217728 -s DISABLE_EXCEPT target = $(library).js +.PHONY: npm + all : make $(target) diff --git a/javascript/npm/package.json b/javascript/npm/package.json index c934b3064..250ac2cdf 100644 --- a/javascript/npm/package.json +++ b/javascript/npm/package.json @@ -1,6 +1,6 @@ { "name": "@grame/libmusicxml", - "version": "3.21", + "version": "3.21.0", "description": "A library to support the MusicXML format.", "main": "libmusicxml.js", "directories": { From 1dac01d6200296498ceae9e9d5ef024396e11850 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Tue, 22 Mar 2022 16:25:15 +0100 Subject: [PATCH 159/164] fix MINGW target --- build/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index a9454e300..40840e38e 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -125,7 +125,7 @@ set_source_files_properties (${COREH} PROPERTIES HEADER_FILE_ONLY TRUE) if(WIN32 OR MSYS) enable_language(RC) set(LIBCONTENT ${CORESRC} ${COREH} ${ROOT}/win32/libmusicxml/libmusicxml.rc) - if (MSYS) + if (MINGW) set(target musicxml) else() set(target libmusicxml) From f639f61dc4a51c7b8121eca7a594956d2d3341a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BC=9F?= <997930294@qq.com> Date: Tue, 19 Apr 2022 19:25:06 +0800 Subject: [PATCH 160/164] fix: Solved the problem that the next note is affected after the octave shift ends #51 --- src/guido/xmlpart2guido.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index 007010430..cc172afad 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -1195,6 +1195,8 @@ std::string xmlpart2guido::parseMetronome ( metronomevisitor &mv ) fCurrentOctavaShift = type; }else { // stop fShouldStopOctava = true; + // Here the octave offset should take effect immediately, not the next time it is created + fCurrentOctavaShift = 0; tag->add (guidoparam::create(0, false)); } From 35fbfb863bde71edbc28552a8641b52fcb816e91 Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Sun, 22 May 2022 11:06:45 +0200 Subject: [PATCH 161/164] switch to C++17 change in install VS redistributable set LILY and BRL off (package) --- build/CMakeLists.txt | 18 +++--------------- build/MakePkg.bat | 2 +- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 40840e38e..1e7216953 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -49,7 +49,7 @@ set (LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/lib) ####################################### -set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD 17) if(UNIX) add_definitions(-Wall -DGCC -O3 -Wno-overloaded-virtual) @@ -313,23 +313,11 @@ install ( PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) - #################################### # install VS redistributables -if (WIN32) -if (${CMAKE_GENERATOR} STREQUAL "Visual Studio 14 2015 Win64") - set (VS "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/redist/x64/Microsoft.VC140.CRT") -elseif (${CMAKE_GENERATOR} STREQUAL "Visual Studio 15 2017 Win64") - set (VS "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Redist/MSVC/14.16.27012/x64/Microsoft.VC141.CRT") -else() - set (VS "/unknown/visual/studio/version") +if (MSVC) + include (InstallRequiredSystemLibraries) endif() -install ( - FILES "${VS}/msvcp140.dll" "${VS}/vcruntime140.dll" DESTINATION ${CMAKE_INSTALL_PREFIX}/bin - PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ -) -endif() - #################################### # cpack section diff --git a/build/MakePkg.bat b/build/MakePkg.bat index 9ab1b907f..050483f78 100644 --- a/build/MakePkg.bat +++ b/build/MakePkg.bat @@ -7,7 +7,7 @@ IF NOT EXIST libmusicxml2.sln ( ) -cmake .. -DPACK=on -DLILY=on -DBRL=on +cmake .. -DPACK=on -DLILY=off -DBRL=off cmake --build . --config Release -- /maxcpucount:4 cpack -G NSIS64 move libMusicXML-*.exe .. From c81929b18813a140669147fd688462e1bf89cc5b Mon Sep 17 00:00:00 2001 From: "Mr.Z" Date: Tue, 7 Jun 2022 16:17:52 +0800 Subject: [PATCH 162/164] =?UTF-8?q?fix=EF=BC=9ARepeat=20markers=20for=20en?= =?UTF-8?q?d=20and=20start=20are=20not=20supported=20#153?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/guido/xmlpart2guido.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/guido/xmlpart2guido.cpp b/src/guido/xmlpart2guido.cpp index cc172afad..4b08fbf2b 100755 --- a/src/guido/xmlpart2guido.cpp +++ b/src/guido/xmlpart2guido.cpp @@ -382,15 +382,17 @@ void xmlpart2guido::checkOctavaEnd() { }else if (fCurrentScorePosition.toFloat() != 0.0) { // Create a HIDDEN Bar in case of fPendingBar equal to false. // This is the case for "bar-style" equal to "none" or "implicit" measures - Sguidoelement tag = guidotag::create("bar"); - stringstream parameters; - std::string measNum = elt->getAttributeValue("number"); - if (!measNum.empty()) { - parameters << "measNum="<< measNum<<", "; + if(!fInhibitNextBar){ + Sguidoelement tag = guidotag::create("bar"); + stringstream parameters; + std::string measNum = elt->getAttributeValue("number"); + if (!measNum.empty()) { + parameters << "measNum="<< measNum<<", "; + } + parameters << "hidden=\"true\""; + tag->add(guidoparam::create(parameters.str(), false)); + add(tag); } - parameters << "hidden=\"true\""; - tag->add(guidoparam::create(parameters.str(), false)); - add(tag); } fCurrentMeasureLength.set (0, 1); From 48412663b0df20c3f0d873c8a2fe7ca4611b95bc Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Sun, 19 Jun 2022 10:26:11 +0200 Subject: [PATCH 163/164] packaging --- build/CMakeLists.txt | 2 +- build/Makefile | 4 +--- packages/README.html | 12 ++++++++---- packages/README.md | 12 ++++++++---- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 1e7216953..729feea99 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -213,7 +213,7 @@ endif() ####################################### # set sample targets set (SAMPLES xmlversion RandomMusic RandomChords xmlfactory partsummary xml2guido xmliter countnotes readunrolled xml2midi xmlread xmltranspose xmlclone) -set (TOOLS xml2guido xmlread xmltranspose xmlversion) +set (TOOLS xml2guido xmlread xml2midi xmltranspose xmlversion) if (APPLE) set (LINKTO ${staticlib}) diff --git a/build/Makefile b/build/Makefile index 278297414..2ac1f68bf 100644 --- a/build/Makefile +++ b/build/Makefile @@ -116,7 +116,7 @@ localinstall: PACKDIR := ../packages PACK := $(PACKDIR)/libmusicxml2-$(VERSION) package: - $(MAKE) $(NATIVEPACK) + cmake --build $(LIBDIR) --config Release --target package winpack: $(MAKE) win64 @@ -124,8 +124,6 @@ winpack: mv win64/libmusicxml-*.exe . macpack: $(PACKDIR)/README.html - $(MAKE) cmake CMAKEOPT="-DLILY=on -DBRL=on -DFMWK=off" - $(MAKE) macos -[ -d $(PACK) ] && rm -rf $(PACK) $(MAKE) install PREFIX=../$(PACK) hdiutil create $(PACK).dmg -fs HFS+ -srcfolder $(PACK) -format UDBZ -ov diff --git a/packages/README.html b/packages/README.html index 877405628..acfa0130c 100644 --- a/packages/README.html +++ b/packages/README.html @@ -12,14 +12,18 @@ The libmusicxml library runs on the main operating systems: Linux, MacOS, iOS, Windows, Android. It can also be compiled to JavaScript using [emscripten](http://emscripten.org) to be embedded in a web page. -This package includes the musicxml library and 3 converters: +This package includes the musicxml library and 2 converters: -- xml2guido (Dominique Fober & Arsia Cont) : converts the MusicXML format to [Guido](http://guidodoc.grame.fr/); -- xml2ly (Jacques Menu) : converts the MusicXML format to [Lilypond](http://lilypond.org/), close to version 1.0; -- xml2brl (Jacques. Menu) : converts the MusicXML format to [braille music], experimental. +- xml2guido: converts the MusicXML format to [Guido](http://guidodoc.grame.fr/); +- xml2midi: converts the MusicXML format to MIDI; + +Previous included converters are now available from the [musicformats](https://github.com/jacques-menu/musicformats) repository: +- xml2ly (Jacques Menu) : converts the MusicXML format to [Lilypond](http://lilypond.org/) +- xml2brl (Jacques. Menu) : converts the MusicXML format to [braille music] --- +Many thanks to Arsia Cont who contributed to the Guido converter in a significant way. diff --git a/packages/README.md b/packages/README.md index 04ad559d8..5e7df0d41 100644 --- a/packages/README.md +++ b/packages/README.md @@ -11,11 +11,15 @@ The MusicXML library is a portable C++ library designed close to the MusicXML fo The libmusicxml library runs on the main operating systems: Linux, MacOS, iOS, Windows, Android. It can also be compiled to JavaScript using [emscripten](http://emscripten.org) to be embedded in a web page. -This package includes the musicxml library and 3 converters: +This package includes the musicxml library and 2 converters: -- xml2guido (Dominique Fober & Arsia Cont) : converts the MusicXML format to [Guido](http://guidodoc.grame.fr/); -- xml2ly (Jacques Menu) : converts the MusicXML format to [Lilypond](http://lilypond.org/), close to version 1.0; -- xml2brl (Jacques. Menu) : converts the MusicXML format to [braille music], experimental. +- xml2guido: converts the MusicXML format to [Guido](http://guidodoc.grame.fr/); +- xml2midi: converts the MusicXML format to MIDI; + +Previous included converters are now available from the [musicformats](https://github.com/jacques-menu/musicformats) repository: +- xml2ly (Jacques Menu) : converts the MusicXML format to [Lilypond](http://lilypond.org/) +- xml2brl (Jacques. Menu) : converts the MusicXML format to [braille music] --- +Many thanks to Arsia Cont who contributed to the Guido converter in a significant way. From 14622cab516eed23faa4b7931b5b45b4276683fb Mon Sep 17 00:00:00 2001 From: Dominique Fober Date: Sun, 19 Jun 2022 10:33:47 +0200 Subject: [PATCH 164/164] packaging --- build/CMakeLists.txt | 4 +- doc/INSIDE.pdf | Bin 286835 -> 0 bytes .../TextOutputIcon.png | Bin 14643 -> 0 bytes .../libmusicxmlArchitecture.pdf | Bin 56727 -> 0 bytes .../libmusicxmlArchitecture.png | Bin 304877 -> 0 bytes .../libmusicxmlArchitecture.tex | 518 ------------------ doc/libmusicxmlArchitecture/lilypond.tex | 363 ------------ .../MaintainerSGuideToXml2ly.pdf | Bin 145235 -> 0 bytes .../MaintainerSGuideToXml2ly.tex | 212 ------- doc/userSGuideToXml2ly/userSGuideToXml2ly.pdf | Bin 192315 -> 0 bytes doc/userSGuideToXml2ly/userSGuideToXml2ly.tex | 431 --------------- 11 files changed, 1 insertion(+), 1527 deletions(-) delete mode 100644 doc/INSIDE.pdf delete mode 100644 doc/libmusicxmlArchitecture/TextOutputIcon.png delete mode 100644 doc/libmusicxmlArchitecture/libmusicxmlArchitecture.pdf delete mode 100644 doc/libmusicxmlArchitecture/libmusicxmlArchitecture.png delete mode 100644 doc/libmusicxmlArchitecture/libmusicxmlArchitecture.tex delete mode 100644 doc/libmusicxmlArchitecture/lilypond.tex delete mode 100644 doc/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.pdf delete mode 100644 doc/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.tex delete mode 100644 doc/userSGuideToXml2ly/userSGuideToXml2ly.pdf delete mode 100644 doc/userSGuideToXml2ly/userSGuideToXml2ly.tex diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 729feea99..cc35b6ad6 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -39,9 +39,7 @@ endif() ####################################### get_filename_component(ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) set (DOCDIR ${ROOT}/doc) -set (DOC ${DOCDIR}/presentation/libmusicxml2.pdf - ${DOCDIR}/userSGuideToXml2ly/userSGuideToXml2ly.pdf - ${DOCDIR}/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.pdf) +set (DOC ${DOCDIR}/presentation/libmusicxml2.pdf) set (SCHEMA ${ROOT}/dtds/${XMLVERSION}) set (BINDIR ${CMAKE_CURRENT_SOURCE_DIR}/bin) diff --git a/doc/INSIDE.pdf b/doc/INSIDE.pdf deleted file mode 100644 index beb2507ad9b234f9c5843ff819a4d862dafba244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286835 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 diff --git a/doc/libmusicxmlArchitecture/libmusicxmlArchitecture.pdf b/doc/libmusicxmlArchitecture/libmusicxmlArchitecture.pdf deleted file mode 100644 index 284f7a25bb367a3dceec4de4a8935819e45ccbdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56727 zcmcG#Wo#Wmknd||W~TU85+J1Ym- ze;x=-k~ZJnEL_N#B)^-uS%_PhIhtD_2nr&&y17`G*dutYUm55)QjRA6JgF<^as|`i zxf#;FG=;rG(A7p%BQVBIc$`zaG-=y{UH(4f_4O%vm}8(}&M`W)#aSGz@j+J?5fk%` zDe1VDeA-j%Fq1kouebpDq&ZoiBk7MK=K8}%l@X!zqrpLvVPc%#w`?Wk!P}kbUFr{9 zL^~ezoE7B7%4AU!lj>llJ~Z zsyI?+dy7-Z$Z_SS%`v0nr=Rw-|Bk~S((RACYoWTY7sgb-B>0J*@#V0zHi<>Y+(PAv zIQ-90EV_9ev)p24N@pxa6akEOUDEW=zklof7F`%?pCf+!CY>A_eY{)5TI*Se^qvPiV5cSgz(t@)EDeP8jUr~Dhiet*$5w2!>F zn)m5=v31pHM3j!Yw|e06zU$qz5ss8c>>o#B;1wt1-lOe^bHgQ99*FYiSWl0=)im2o zO7HetL#!K&>hA2&7F@r*6(wMu#ZK>IM%XI?o4rq6W|8TK>oQ7m^N`Crosi{Zg==Bt zp}o$IbXH=aVwE2G8Rfz&`5pB*qz3UQYv6!>k9;wADsfAr4FH^@^srpsS+YB-s5^OT zatT%FGlCce{|6z>RdtHaws8NomYFHK9RnT1Aw@z8O($&x%<&7U2!kRy%q3fxn5*|_ zML-+y=>crZSW2`B7^sr7S7=ur$VILlD#AM+^kS})*pC4WeJG*A3(2)s6dqJlkiS(_ zDOElf%Vu3VIkrNJA{rM^9hY`}Gc`VJb);ig-Oxk# zY>=7^@sD<7Ez;%_3rFaY>1rta)xCsC2q*CI;9phuRC0n;YVzsqmP0Pv*%2gTQ#IN}bW)K0mlMX35^=7iDbD+kGPSOz0C!7;-yND*RbLI*5` zVa${12alai;2l+yS(k99XKB)G+^t$lDgzo62Wr?Q1n}j6qAF9?wqK=Tm?ag3LEpsU zeDHy^u{8wA>U7`3=@LYqG44cVuwgng^0N+@&BxozN5pl<6f2BF`h4|wu5%(V@Z9Ml z%6$ySOBP&Wxk}8?$7~Th={T(9o~vQ-imVlAD)lV};#@Bzc{H#tq0^gxtAG`s(|i=k z{*skuh{OT2Wwz0D(g|+;rfI`ejW6Z70H!jP{>vHMN3Y0CUp@S3(Fyvg$yyKQJt{4x z$S*M6o&mGj$M^mfy8hs-oFfW zek{uZCsqd6LSy&GG`e7_brAU!Wk_X9>FhZ^AI4kVoIg4M;Tip9SMI7OS*|{ zMz>Ls z-G(ytCB%?9`Q5tX^`Z@d5H1p@qk-e*yJClu7WGUrW6UEM{YVHLRTw9yj3T%Bt_A=s zz0eX%?)mzPU2z8$HPcBrqn>h{rDMz3aXMQmlv-Ux1a(oe2i8Z}BomRUHqnH*pd#+d zFHs8eKoo*wi)|8|i)qU_&7u#zR^sqjW5KgIuxpjeA4Xz~RtrWlu=0pgXw`jgX7R??SM3 zmPYty5-{X-MiV2AZE1z&m4&47V{l6zAx5uePGzhe@r;Z;d|;FA7r*Jm5*dxdt#5n0 z16$k^G6f_+bp91m>ckKYm$4Lqwi1X{0(`K%asJZ@DM$0|T z+O`n&axq+d@fb=8iNG4(3MnLHccNE0&3zO;inSeiB6>zy zzy*n70P5h<{nzi;uZ^1ntRfjh6Y`0h)vn>a`*MbNx@dw)X?|r5H1{+by=~_?UJOXC z7?Od>9ZhDpB(Q@6KU4%+MS3o&stmWkLJ79)Z>HdbC}kMb64+U7DQF*jgUB@#a@v*a zM~cib1}48U84;j*hMS|aqB_5w-r-KmN3sc2%%M*N%VPu5}B~qq_d`E|+~wE&Mt>8n2JgU@`Rm9sj

      9+SO!jHC!^?3KTjyuug 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 diff --git a/doc/libmusicxmlArchitecture/libmusicxmlArchitecture.png b/doc/libmusicxmlArchitecture/libmusicxmlArchitecture.png deleted file mode 100644 index 86673f94e00f1d820c1c7bec211b3792fd6057be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304877 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 z 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

      ZBzBIptFMcVH1HeQnY9`#7wfk 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 MusicXMLTree -\draw [<->,thick,{Stealth[length=10pt]}-{Stealth[length=10pt]}] (MusicXML) -- (MusicXMLTree); - -% MusicXMLTree -> MSR -\draw [->,thick,{Stealth[length=10pt,color=gray!50]}-{Stealth[length=10pt]}] (MusicXMLTree) -- (MSR); - -% MSR <-> LPSR -\draw [<-,thick,{Stealth[length=10pt]}-{Stealth[length=10pt]}] (MSR) -- (LPSR); - -% LPSR -> LilyPond -\draw [->,thick,-{Stealth[length=10pt]}] (LPSR) -- (LilyPond); - -% MSR <-> BSR -\draw [<-,thick,{Stealth[length=10pt]}-{Stealth[length=10pt]}] (MSR) -- (BSR); - -% BSR -> Braille music -\draw [->,thick,-{Stealth[length=10pt]}] (BSR) -- (Braille music); - -% MIDI -> MDSR -\draw [<->,very thick,{Stealth[length=10pt]}-{Stealth[length=10pt]},loosely dashed,color=gray!50] (MIDI) -- (MDSR); - -% MDSR -> MSR -\draw [<->,very thick,{Stealth[length=10pt]}-{Stealth[length=10pt]},loosely dashed,color=gray!50] (MDSR) -- (MSR); - - -% Draw the tools -% ------------------------------------------------ - -\filldraw [gray!30] - (\toolsStartAbs, \toolsStartOrd) circle [radius=0pt] - (\toolsInterAbs,\toolsInterOrd) circle [radius=0pt] - (\toolsEndAbs,\toolsEndOrd) circle [radius=0pt]; - -\draw [->,thick,red,-{Stealth[length=10pt]},anchor=center] - (\toolsStartAbs, \toolsStartOrd) - .. - node[above,pos=0.85,sloped] {tools} - controls (\toolsInterAbs,\toolsInterOrd) - .. - (\toolsEndAbs,\toolsEndOrd); - - -% Draw RandomMusic -% ------------------------------------------------ - -\filldraw [gray!30] - (\RandomMusicStartAbs, \RandomMusicStartOrd) circle [radius=1pt] - (\RandomMusicInterAbs,\RandomMusicInterOrd) circle [radius=0pt] - (\RandomMusicEndAbs,\RandomMusicEndOrd) circle [radius=0pt]; - -\draw [->,thick,red,-{Stealth[length=10pt]},anchor=center] - (\RandomMusicStartAbs, \RandomMusicStartOrd) - .. - node[above,pos=0.175,sloped] {\texttt{RandomMusic}} - controls (\RandomMusicInterAbs,\RandomMusicInterOrd) - .. - (\RandomMusicEndAbs,\RandomMusicEndOrd); - - -% Draw xml2guido -% ------------------------------------------------ - -\filldraw [gray!30] - (\xmlToGuidoStartAbs, \xmlToGuidoStartOrd) circle [radius=0pt] - (\xmlToGuidoInterAbs,\xmlToGuidoInterOrd) circle [radius=0pt] - (\xmlToGuidoEndAbs,\xmlToGuidoEndOrd) circle [radius=0pt]; - -\draw [->,thick,red,-{Stealth[length=10pt]},anchor=center] - (\xmlToGuidoStartAbs, \xmlToGuidoStartOrd) - .. - node[above,pos=0.815,sloped] {\texttt{xml2guido}} - controls (\xmlToGuidoInterAbs,\xmlToGuidoInterOrd) - .. - (\xmlToGuidoEndAbs,\xmlToGuidoEndOrd); - - -% Draw xml2ly -% ------------------------------------------------ - -\filldraw [gray!30] - (\xmlToLyStartAbs,\xmlToLyStartOrd) circle [radius=0pt] - (\xmlToLyInterIAbs,\xmlToLyInterIOrd) circle [radius=0pt] - (\xmlToLyInterIIAbs,\xmlToLyInterIIOrd) circle [radius=0pt] - (\xmlToLyEndAbs,\xmlToLyEndOrd) circle [radius=0pt]; - -\draw [->,thick,red,-{Stealth[length=10pt]},anchor=center] - (\xmlToLyStartAbs, \xmlToLyStartOrd) - .. - node[above,pos=0.685,sloped] {\texttt{xml2ly}} - controls - (\xmlToLyInterIAbs,\xmlToLyInterIOrd) - and - (\xmlToLyInterIIAbs,\xmlToLyInterIIOrd) - .. - (\xmlToLyEndAbs,\xmlToLyEndOrd); - - -% Draw xml2brl -% ------------------------------------------------ - -\filldraw [gray!30] - (\xmlToBrlStartAbs,\xmlToBrlStartOrd) circle [radius=0pt] - (\xmlToBrlInterIAbs,\xmlToBrlInterIOrd) circle [radius=0pt] - (\xmlToBrlInterIIAbs,\xmlToBrlInterIIOrd) circle [radius=0pt] - (\xmlToBrlEndAbs,\xmlToBrlEndOrd) circle [radius=0pt]; - -\draw [->,thick,red,-{Stealth[length=10pt]},anchor=center] - (\xmlToBrlStartAbs, \xmlToBrlStartOrd) - .. - node[above,pos=0.685,sloped] {\texttt{xml2brl}} - controls - (\xmlToBrlInterIAbs,\xmlToBrlInterIOrd) - and - (\xmlToBrlInterIIAbs,\xmlToBrlInterIIOrd) - .. - (\xmlToBrlEndAbs,\xmlToBrlEndOrd); - - -% Draw toBeWrittenCommon -% ------------------------------------------------ - -\filldraw [gray!30] - (\toBeWrittenCommonStartAbs,\toBeWrittenCommonStartOrd) circle [radius=1pt]; - -\draw [-,thick,red,loosely dashed,color=gray!50,anchor=center] - (\toBeWrittenCommonStartAbs, \toBeWrittenCommonStartOrd) - -- - (\toBeWrittenCommonEndAbs,\toBeWrittenCommonEndOrd) - node [sloped,midway,above] {\texttt{toBeWritten}}; - - -% Draw toBeWrittenToMusicXML -% ------------------------------------------------ - -\filldraw [gray!30] - (\toBeWrittenToMusicXMLStartAbs,\toBeWrittenToMusicXMLStartOrd) circle [radius=0pt] - (\toBeWrittenToMusicXMLInterIAbs,\toBeWrittenToMusicXMLInterIOrd) circle [radius=0pt] - (\toBeWrittenToMusicXMLInterIIAbs,\toBeWrittenToMusicXMLInterIIOrd) circle [radius=0pt] - (\toBeWrittenToMusicXMLEndAbs,\toBeWrittenToMusicXMLEndOrd) circle [radius=0pt]; - -\draw [-,thick,red,-{Stealth[length=10pt]},loosely dashed,color=gray!50,anchor=center] - (\toBeWrittenToMusicXMLStartAbs, \toBeWrittenToMusicXMLStartOrd) - .. - % node[above,pos=0.10,sloped] {toBeWritten} - controls - (\toBeWrittenToMusicXMLInterIAbs,\toBeWrittenToMusicXMLInterIOrd) - and - (\toBeWrittenToMusicXMLInterIIAbs,\toBeWrittenToMusicXMLInterIIOrd) - .. - (\toBeWrittenToMusicXMLEndAbs,\toBeWrittenToMusicXMLEndOrd); - - -% Draw toBeWrittenToLilyPond -% ------------------------------------------------ - -\filldraw [gray!30] - (\toBeWrittenToLilyPondStartAbs,\toBeWrittenToLilyPondStartOrd) circle [radius=0pt] - (\toBeWrittenToLilyPondInterIAbs,\toBeWrittenToLilyPondInterIOrd) circle [radius=0pt] - (\toBeWrittenToLilyPondInterIIAbs,\toBeWrittenToLilyPondInterIIOrd) circle [radius=0pt] - (\toBeWrittenToLilyPondEndAbs,\toBeWrittenToLilyPondEndOrd) circle [radius=0pt]; - -\draw [-,thick,red,-{Stealth[length=10pt]},loosely dashed,color=gray!50,anchor=center] - (\toBeWrittenToLilyPondStartAbs, \toBeWrittenToLilyPondStartOrd) - .. - controls - (\toBeWrittenToLilyPondInterIAbs,\toBeWrittenToLilyPondInterIOrd) - and - (\toBeWrittenToLilyPondInterIIAbs,\toBeWrittenToLilyPondInterIIOrd) - .. - (\toBeWrittenToLilyPondEndAbs,\toBeWrittenToLilyPondEndOrd); - - -% Draw toBeWrittenToBrailleMusic -% ------------------------------------------------ - -\filldraw [gray!30] - (\toBeWrittenToBrailleMusicStartAbs,\toBeWrittenToBrailleMusicStartOrd) circle [radius=0pt] - (\toBeWrittenToBrailleMusicInterIAbs,\toBeWrittenToBrailleMusicInterIOrd) circle [radius=0pt] - (\toBeWrittenToBrailleMusicInterIIAbs,\toBeWrittenToBrailleMusicInterIIOrd) circle [radius=0pt] - (\toBeWrittenToBrailleMusicEndAbs,\toBeWrittenToBrailleMusicEndOrd) circle [radius=0pt]; - -\draw [-,thick,red,-{Stealth[length=10pt]},loosely dashed,color=gray!50,anchor=center] - (\toBeWrittenToBrailleMusicStartAbs, \toBeWrittenToBrailleMusicStartOrd) - .. - controls - (\toBeWrittenToBrailleMusicInterIAbs,\toBeWrittenToBrailleMusicInterIOrd) - and - (\toBeWrittenToBrailleMusicInterIIAbs,\toBeWrittenToBrailleMusicInterIIOrd) - .. - (\toBeWrittenToBrailleMusicEndAbs,\toBeWrittenToBrailleMusicEndOrd); - - -% Draw the table -% ------------------------------------------------ - -\node[right,scale=1] (table) at (\legendAbs,\tableOrd) { -\def \contentsWidth{1.5\textwidth} -\def \arraystretch{1.3} -% -\begin{tabular}[t]{lp{\contentsWidth}} -{Entity} & {Description} \tabularnewline[0.5ex] -\hline\\[-3.0ex] -% -xmlelement tree & a tree representing the MusicXML markups such as {\tt }, {\tt

      -{ - \usepackage{fullpage} - \usepackage{pgf} - \usepackage{hyperref} - \setjobnamebeamerversion{vemus-smc07} -} - -\mode -{ - \usetheme{Frankfurt} - \setbeamercovered{transparent} - % or whatever (possibly just delete it) -} - -\usepackage[english]{babel} -\usepackage[latin1]{inputenc} -\usepackage{times} -\usepackage[T1]{fontenc} -\usepackage{listings} -% Or whatever. Note that the encoding and the font should match. If T1 -% does not look nice, try deleting the line with the fontenc. - - -\newcommand{\lcolorb}[1]{\color<#1>[rgb]{0,0,1}} -%\includeonlyframes{current} - -\title % (optional, use only with long paper titles) -{MusicXML Library Version 2}{ - -\subtitle -{A toolbox to support the MusicXML format.} - -\author[D.Fober] % (optional, use only with lots of authors) -{D.Fober, S.Letz, Y.Orlarey\\ -{\scriptsize \{fober, letz, orlarey\}@grame.fr}} - -\institute[Grame] % (optional, but mostly needed) -{ -Grame - Research Lab.\\ -Centre national de cration musicale\\ -FR - Lyon -} - -\date[May 2008] -{May 2008} - - -\begin{document} - -\begin{frame} - \titlepage -\end{frame} - - -\begin{frame}{Summary} - \tableofcontents -\end{frame} - - -%________________________________________________________________________ -\section{Introduction} -%________________________________________________________________________ -\subsection{The MusicXML format} -\begin{frame} - \frametitle{The MusicXML format} - The MusicXML format represents common Western musical notation from the 17th century onwards. - It is an xml format that organizes the music into a header followed by the core - music data. The core music data may be organized as \emph{partwise} or \emph{timewise} data: - \begin{itemize} - \item \emph{partwise} data are organized into parts containing measures, - \item \emph{timewise} data are organized into measures containing parts. - \end{itemize} - The music notation complexity is reflected by the significant number of MusicXML elements: - \alert{343} elements are defined by the version 2.0 of the format. - \begin{block}{} - {\small More details and DTDs on} \texttt{http://www.recordare.com/} - \end{block} -\end{frame} - - -%________________________________________________________________________ -\subsection{Issues in the library design} -\begin{frame} - \frametitle{Issues in the library design} - The main issues in designing a C++ library to support the format are related to the significant - the number of MusicXML elements. - \begin{enumerate} - \item cost of describing all the MusicXML element, - \item design of an adequate and efficient memory representation, - \item avoiding additional complexity to the MusicXML format, - \item easiness to maintain and to update to new versions of the format. - \end{enumerate} - - \begin{block}{} - The first version of the MusicXML library was quite good on points 2 and 3, but rather weak - on points 1 and 4. - \end{block} -\end{frame} - - -%________________________________________________________________________ -\section{Overview} -%________________________________________________________________________ -\subsection{Differences to version 1} -\begin{frame} - \frametitle{libmusicxml v.2: what's new?} - \begin{itemize} - \item supports the MusicXML format version 2, - \item easy to upgrade to new versions of the MusicXML format from the DTDs, - \item adheres strictly to the MusicXML DTDs: each element has a corresponding C++ class, - \item designed using a single homogeneous \texttt{xmlelement} class and automatic - typing using templates, - \item provides STL iterators to browse the memory representation, - \item is \alert{not compatible} with libmusicxml version 1.xx, - \end{itemize} - \begin{block}{} - The main point is the simplified design: 4 classes instead of 150 to build a MusicXML - memory representation. - \end{block} -\end{frame} - -%________________________________________________________________________ -\subsection{What remains unchanged?} -\begin{frame} - \frametitle{libmusicxml v.2: what remains unchanged?} - \begin{itemize} - \item automatic memory management using smart pointers, - \item support of the \texttt{visitor} mechanism, - \item provides rolled and unrolled browsing, - \item provides previous visitors (musicxml2guido, midivisitor, transposition...) - \end{itemize} -\end{frame} - - -%________________________________________________________________________ -\section{Inside the new library} -%________________________________________________________________________ -\subsection{Class design} -\begin{frame} - \frametitle{Memory representation} - \begin{columns} - \begin{column}[c]{7cm} - The MusicXML format is represented by: - {\small - \begin{itemize} - \item<1-> a single \texttt{xmlelement} class - \item<3-> simple methods to query an element - \item<5-> derived into as many types as MusicXML elements using templates - \item<7-> organized into a tree - \end{itemize}} - \end{column} - - \begin{column}[c]{5cm} - \begin{overlayarea}{\textwidth}{50mm} - {\small - \only<1>{\vspace{8mm} \includegraphics[width=50mm]{imgs/xmlelement.pdf}} - \only<2>{\vspace{8mm} \begin{block}{} - homogeneous design leads to simplicity. - \end{block}} - \only<3> {\vspace{9mm} \includegraphics[width=50mm]{imgs/methods.pdf}} - \only<4> {\vspace{9mm} \begin{block}{} - Makes the DTDs usable as the library documentation:\\ - e.g. {\tiny \texttt{measure->getAttributeValue("number")}} - \end{block}} - \only<5> {\vspace{12mm}\includegraphics[width=25mm]{imgs/musicxml.pdf}} - \only<6> {\vspace{22mm} \begin{block}{} - Allows the visitor mechanism to operate - \end{block}} - \only<7> {\vspace{12mm} \includegraphics[width=50mm]{imgs/ctree.pdf}} - \only<8> {\vspace{32mm} \begin{block}{} - support STL iterators - \end{block}} - } - \end{overlayarea} - \end{column} - \end{columns} -\end{frame} - -%________________________________________________________________________ -\subsection{DTDs as Documentation} -\begin{frame} - \frametitle{MusicXML DTDs as documentation} - \begin{columns} - \begin{column}[c]{55mm} - \begin{itemize} - \item<1-> types are consistently derived from the MusicXML element names - \item<2-> attributes can be retrieved using their MusicXML names - \item<3-> browsing the memory representation is like reading the MusicXML file - \end{itemize} - \end{column} - \begin{column}[c]{60mm} - \onslide<1->{ - \begin{block}{} - {\scriptsize \\ - \hspace{2mm} => class: \hspace{3mm} \alert{S\_part\_name} \\ - \hspace{2mm} => constant: \alert{k\_part\_name} } - \end{block}} - \onslide<2->{ - \begin{block}{} - {\scriptsize \alert{getAttributeValue("number")} - measure->\alert{getAttributeIntValue("number",default)}}} - \end{block}} - \onslide<3->{ - \begin{block}{} - {\scriptsize - \begin{itemize} - \item Element and attributes names and values are available as string - but support also automatic conversion to numeric types. - \item Supports xml comments and processing instruction as well. - \end{itemize} - } - \end{block}} - \end{column} - \end{columns} -\end{frame} - -%________________________________________________________________________ -\subsection{Browsing the memory representation} -\begin{frame}[fragile] - \frametitle{Browsing the memory representation} - \lstset{language=C++, basicstyle=\tiny, emph={countnotes}, emphstyle=\color{red}} - - \begin{columns} - \begin{column}[c]{50mm} - \begin{itemize} - \item<1-> supports the acyclic visitor pattern - \vspace{25mm} - \item<2-> supports STL iterators - \end{itemize} - \end{column} - - \begin{column}[c]{65mm} - \begin{block}<1->{Count using a visitor} -\begin{lstlisting} -class countnotes : public visitor -{ - public: - int fCount; - - countnotes() : fCount(0) {} - virtual ~countnotes() {} - void visitStart( S_note& elt ) { fCount++; } -}; -\end{lstlisting} - \end{block} - - \begin{block}<2->{Count using iterators and STL} -\begin{lstlisting} -struct countnotes { - bool operator () (const Sxmlelement elt) const - return elt->getType() == k_note; -}; - -countnotes p; -int count = count_if(elt->begin(), elt->end(), p); -\end{lstlisting} - \end{block} - \end{column} - \end{columns} -\end{frame} - -%________________________________________________________________________ -\subsection{Main files} -\begin{frame} - \frametitle{Main files} - - {\small - \begin{center} - \begin{tabular}{|r|l|} - \hline - \textbf{Files, folders} & \textbf{Purpose} \\ - \hline - \texttt{xml.h, types.h, ctree.h} & MusicXML memory representation \\ - \hline - \texttt{factory.h} & to generate MusicXML elements \\ - \hline - \texttt{typedefs.h, elements.h} & types and constant definitions \\ - \hline - \texttt{the visitors folder} & many visitors... \\ - & usable as sample code as well \\ - \hline - \end{tabular} - \end{center} - } - -\begin{block}<2->{\alert{\textsc{Warning!}}} -The following files are automatically generated by the DTDs analyser and should not be modified:\\ -\hspace{15mm} \texttt{elements.h, typedefs.h, factory.cpp} \\ -\end{block} -\end{frame} - - -%________________________________________________________________________ -\subsection{DTDs Analysis} -\begin{frame} - \frametitle{DTDs Analysis} - \framesubtitle{A fast way to update to new version of the MusicXML format.} - - The MusicXML DTDs are automatically analyzed to generate source code, types and constants. -\begin{block}{} -'-' are replaced with '\_' in MusicXML elements or attribute names to comply to the C/C++ -identifiers lexical definition. -\end{block} - - \begin{itemize} - \item a makefile and a shell script are used for analysis and generation - \item templates are provided in the \texttt{template} folder - \item generates types (\texttt{typedefs.h}), constants (\texttt{elements.h}) - and source code (\texttt{factory.cpp}) - \end{itemize} - - - -\end{frame} - - -%________________________________________________________________________ -\section{Bibliography} -%________________________________________________________________________ -\begin{frame} - \frametitle{For Further Reading} - -\begin{thebibliography}{Alexandrescu, 2001} - -{\scriptsize - -\bibitem[MusicXML]{MusicXML} -MusicXML -\newblock The MusicXML home page. -\newblock http://www.recordare.com/xml.html - -\bibitem[Good, 2001]{good01} -M.~Good. -\newblock The virtual score, MusicXML for notation and analysis. -\newblock In W.~B. Hewlett and E.~Selfridge-Field, editors, {\em Computing in - Musicology}, volume~12, pages 113--124. MIT Press, 2001. - -\bibitem[Alexandrescu, 2001]{Alex01} -A.~Alexandrescu. -\newblock {\em Modern C++ Design: Generic Programming and Design Patterns Applied}. -\newblock Addison-Wesley, 2001. - -\bibitem{DP95} -E.~Gamma, R.~Helm, R.~Johnson, and J.~Vlissides. -\newblock {\em Design Patterns: Elements of Reusable Object-Oriented Software}. -\newblock Addison-Wesley, 1995. - -} -\end{thebibliography} - -\end{frame} - - -\end{document} - - diff --git a/doc/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.pdf b/doc/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.pdf deleted file mode 100644 index 65cc1ec68f60bd0087ace350574de3202f577ac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145235 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 *O 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

      Z67;{0(jSu19 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 NV1Xkg6_pc%`wzL5GKv5I diff --git a/doc/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.tex b/doc/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.tex deleted file mode 100644 index 103b0adb2..000000000 --- a/doc/maintainerSGuideToXml2ly/MaintainerSGuideToXml2ly.tex +++ /dev/null @@ -1,212 +0,0 @@ -\documentclass[12pt,a4paper]{article} - - -% ------------------------------------------------------------------------- -% import common LaTeX settings -% ------------------------------------------------------------------------- - -\usepackage{import} - -\subimport{../}{CommonLaTeXSettings} - - -% ------------------------------------------------------------------------- -\begin{document} -% ------------------------------------------------------------------------- - -\title{ -Maintainer's guide to \xmlToLy\ \\[5pt] -} - -\author{ -Jacques Menu -} - -\date {\normalsize \today\ version} -%\date {} - -\maketitle -\thispagestyle{fancy} % right after \maketitle to apply it to the first page too - -\abstract { -This document presents the design principles and architecture os \xmlToLy, as well as information needed to maintain it. It is part of the \lib\ documentation, to be found at \url{https://github.com/grame-cncm/libmusicxml/tree/lilypond/doc}. \xmlToBrl\ is mentioned but not described in detail. - - -In the \lib\ library, the source code specific to \xmlToLy\ can be found at \url{https://github.com/grame-cncm/libmusicxml/tree/lilypond/src/lilypond} and \url{https://github.com/grame-cncm/libmusicxml/tree/lilypond/src/interface}. - -All the examples mentioned can be downloaded from \url{https://github.com/grame-cncm/libmusicxml/tree/lilypond/files/samples/musicxml}. They are grouped by subject in subdirectories, such as \mxmlfile{basic/HelloWorld.xml}. -} - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Acknowledgements} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -Many thanks to Dominique Fober, the designer and maintainer of the \lib\ library! - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Overview of \xmlToLy\ } -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -% ------------------------------------------------------------------------- -\subsection{Why \xmlToLy?} -% ------------------------------------------------------------------------- - -\mxml\ ({\it Music eXtended Markup Language}) is a specification language meant to represent music scores by texts, readable both by humans and computers. It has been designed by the W3C Music Notation Community Group (\url{https://www.w3.org/community/music-notation/}) to help sharing music score files between applications, through export and import mechanisms. - -The homepage to \mxml\ is \url{https://www.musicxml.com}. - -\mxml\ data contains very detailed information about the music score, and it is quite verbose by nature. This makes creating such data by hand quite difficult, and this is done by applications actually. - -% ------------------------------------------------------------------------- -\subsection{What \xmlToLy\ does} -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Prerequisites} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -In order to maintain \xmlToLy, one needs to do the following: -\begin{itemize} -\item obtain a working knowledge of C++ programming. The code base of \xmlToLy\ uses classes, simple and multiple inheritance, and templates; - -\item study \mxml, starting maybe from \docpdf{introductionToMusicXML}{IntroductionToMusicXML.tex}. A deep knowledge of that matter comes with experience; - -\item study the architecture of \lib, which can be seen at \docpdf{libmusicxmlArchitecture}{libmusicxmlArchitecture.pdf}, and is presented in figure \ref{libmusicxmlArchitecture}. -It shows the place of \xmlToLy\ in the whole. - -\item -\end{itemize} - -\begin{figure} -\caption{\lib\ architecture}\mylabel{libmusicxmlArchitecture} -\includegraphics[scale=0.8]{../libmusicxmlArchitecture/libmusicxmlArchitecture.pdf} -\end{figure} - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Programming style and conventions} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -% ------------------------------------------------------------------------- -\subsection{Source code presentation} -% ------------------------------------------------------------------------- - -The following text-editing conventions are used: -\begin{itemize} -\item tabs are not used before the first non-space character in a line, two spaces are used instead; - -\item the code is not tightly packed: declarations in classes have the members' names aligned vertically, with many spaces before them if needed, and empty lines are used to separate successive activities in methods. -\end{itemize} - -% ------------------------------------------------------------------------- -\subsection{File names} -% ------------------------------------------------------------------------- - -The name '{\tt lilypond}' was chosen by Dominique long before work started on \\xmlTobrl. - -There's a single '{\tt lilypond}' folder to contain MSR, LPSR, BSR, \xmlToLy\ and \xmlToBrl, even though BSR and braille music are a distinct branch. This has been preferred by Dominique as the manager of \lib. - -Most file names start with an identification of the context they belong to, such as '{\tt oah}', '{\tt mxmlTree}', '{\tt msr}', '{\tt lpsr}', '{\tt lilypond}', '{\tt bsr}', '{\tt braille}', '{\tt xml2ly}' and '{\tt xml2brl}'. - -The '{\tt *Oah.*}' files handle the options and help for the corresponding context, such as '{\tt xml2lyOah.h/.cpp}'. - -The '{\tt traceOah.h/.cpp}', '{\tt musicXMLOah.h/.cpp}', '{\tt extra}' and '{\tt general}' context are about the corresponding help groups. - -There are a couple of 'globlal' files not related to any particular context: '{\tt utilities.h/.cpp}', '{\tt messagesHandling.h/.cpp}' and '{\tt version.h/.cpp}'. - - -% ------------------------------------------------------------------------- -\subsection{Defensive programming} -% ------------------------------------------------------------------------- - -The code base of \xmlToLy\ is {\it defensive programming} oriented, which means that: -\begin{itemize} -\item identifiers are explicit and long if needed -- only very local ones are short, such as iteration loops indexes; - -\item the code is organized in sections, with an initial comment documenting what the code does; - -\item '{\tt msrAssert()}' is used to do sanity checks, such as detect a null pointer prior to using it; -\end{itemize} - -The \mxml\ data is not systematically checked for correctness. Checks are done, however, to ensure it won't crash due to missing values. - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{The two-phase visitors pattern} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -% ------------------------------------------------------------------------- -\subsection{Basic mechanism} -% ------------------------------------------------------------------------- - -% ------------------------------------------------------------------------- -\subsection{An example} -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Passes organization} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Translating \mxml\ data to an \mxmlt} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Translating an \mxmlt\ to an MSR} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Translating an an MSR to a LPSR} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Translating an an LPSR to a LilyPond code} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -% postamble -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -\pagebreak - -\lstlistoflistings - -\listoffigures - -\tableofcontents - - -% ------------------------------------------------------------------------- -\end{document} -% ------------------------------------------------------------------------- diff --git a/doc/userSGuideToXml2ly/userSGuideToXml2ly.pdf b/doc/userSGuideToXml2ly/userSGuideToXml2ly.pdf deleted file mode 100644 index 4978c1a0c16633462354113d28925dcd22e65b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192315 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%0Af*AFv)|Lc=TnQtLj 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

      6y; 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 xml2ly -about - -What xml2ly does: - - This multi-pass translator basically performs 5 passes: - Pass 1: reads the contents of MusicXMLFile or stdin ('-') - and converts it to a MusicXML tree; - Pass 2a: converts that MusicXML tree into to - a Music Score Representation (MSR) skeleton; - Pass 2b: converts that tree and the skeleton into a - Music Score Representation (MSR); - Pass 3: converts the MSR into a - LilyPond Score Representation (LPSR); - Pass 4: converts the LPSR to LilyPond source code - and writes it to standard output. - - Other passes are performed according to the options, such as - printing views of the internal data or printing a summary of the score. - - The activity log and warning/error messages go to standard error. -\end{lstlisting} - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Options and help} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -\xmlToLy\ is equipped with a full-fledged set of options with the corresponding help. Since there are many options and the translation work is done in successive passes, the help is organized in a hierarchy of groups, each containing sub-groups of individual options called '{\it atoms}'. - -% ------------------------------------------------------------------------- -\subsection{Basic principles} -% ------------------------------------------------------------------------- - -Options are introduced on the command line either by '{\tt -}' or '{\tt --}', which can be used at will. There no difference between the two. - -Each option has a short name and an optional long name. The latter is not needed if the short name is sufficiently explicit and not too long, such as '{\tt -jianpu}', '{\tt -cubase}', '{\tt -ambitus}' or '{\tt -custos}'. - -Some options have their usual meaning in open-source software, such as '{\tt -h}' (help), '{\tt -a}' (about), and '{\tt -o}' (output file name). - -Some options name, short or long, share a common prefix, which allows them to be contracted, as in '{\tt -h=msr,lily}', which is equivalent to '{\tt -msr, -lily}', and '{\tt -trace=voices,notes}', equivalent to '{\tt -trace-voices, -trace-notes}'. - -There are single-character options, which can be clustered: '{\tt -vac}' is equivalent to: '{\tt -v, -a, -c'}. - -% ------------------------------------------------------------------------- -\subsection{Introspection} -% ------------------------------------------------------------------------- - -One can obtain help on any specific group, sub-group or atom, such as: -\begin{lstlisting}[language=XML] -menu@macbookprojm > xml2ly -option-name-help ambitus - ---- Help for option 'ambitus' in subgroup "Engravers" of group "LilyPond" --- - -LilyPond (-hlily, -help-lilypond): - These lilypond control which LilyPond code is generated. - --------------------------- - Engravers (-hlpe, -help-lilypond-engravers): - - -ambitus - Generate an ambitus range at the beginning of the staves/voices. - -\end{lstlisting} - -Some options have an optional value such as '{\tt -option-name-help}', whose default value is\dots '{\tt option-name-help}': -\begin{lstlisting}[language=XML] -menu@macbookprojm > xml2ly -option-name-help - ---- Help for option 'onh' in subgroup "Options help" of group "Options and help" --- - -Options and help (-hoah, -help-options-and-help): --------------------------- - Options help (-hoh, -help-options-help): - - -onh, -option-name-help[=OPTION_NAME] - Print help about OPTION_NAME. - OPTION_NAME is optional, and the default value is 'onh'. -\end{lstlisting} - -% ------------------------------------------------------------------------- -\subsection{Trace options} -% ------------------------------------------------------------------------- - -\xmlToLy\ is equipped with a range of trace options, that are crucially needed by this author when testing and fine-tuning the code base. - -The bulk of these options is placed in a group that is hidden by default: -\begin{lstlisting}[language=XML] - Trace (-ht, -help-trace) (hidden by default) - -------------------------- -\end{lstlisting} - -The interested reader can see them with the '{\tt -help-trace}' group option: -\begin{lstlisting}[language=XML] -menu@macbookprojm > xml2ly -help=trace - ---- Help for group "Trace" --- - -Trace (-ht, -help-trace) (hidden by default) - There are trace options transversal to the successive passes, - showing what's going on in the various translation activities. - They're provided as a help to the maintainers, as well as for the curious. - The options in this group can be quite verbose, use them with small input data! - All of them imply '-tpasses, -trace-passes'. --------------------------- - Options handling trace (-htoh, -help-trace-options-handling): - -toah, -trace-oah - Write a trace of options and help handling to standard error. - This option should best appear first. - -toahd, -trace-oah-details - Write a trace of options and help handling with more details to standard error. - This option should best appear first. - Score to voices (-htstv, -help-trace-score-to-voices): - -t, -trace - Trace SHORT_NAME/LONG_NAME in score to voices. - The 9 known SHORT_NAMEs are: - score, pgroups, pgroupsd, parts, staves, st, schanges, voices and voicesd. - The 9 known LONG_NAMEs are: - -score, -part-groups, -part-groups-details, -parts, -staves. -... ... ... ... ... ... -\end{lstlisting} - -As can be seen, there are event options to trace the handling of options and help by \xmlToLy. - -The source code contains many instances of trace code, such as: -\begin{lstlisting}[language=C++] -#ifdef TRACE_OAH - if (gTraceOah->fTraceVoices) { - gLogOstream << - "Creating voice \"" << asString () << "\"" << - endl; - } -#endif -\end{lstlisting} - -Building \xmlToLy\ with tracing disabled only gains less than 5\% in speed, this is why tracing is available by default. - -% ------------------------------------------------------------------------- -\subsection{Non-musical options} -% ------------------------------------------------------------------------- - -% ------------------------------------------------------------------------- -\subsubsection{Timing measurements} -% ------------------------------------------------------------------------- - -There is a '{\tt -cpu}' option to see show much time is spent in the various translation activities: -\begin{lstlisting}[language=XML] -menu@macbookprojm > xml2ly -option-name-help cpu - ---- Help for option 'cpu' in subgroup "CPU usage" of group "General" --- - -General (-hg, -help-general): --------------------------- - CPU usage (-hgcpu, -help-general-cpu-usage): - - -cpu, -display-cpu-usage - Write information about CPU usage to standard error. -\end{lstlisting} - -In practise, most of the time is spent in passes 1 and 2b. The '{\tt time}' command is used to obtain the total run time, since \xmlToLy\ cannot account for input/output activities: -\begin{lstlisting}[language=XML] -menu@macbookprojm > time xml2ly -aofn -cpu xmlsamples3.1/ActorPreludeSample.xml -*** MusicXML warning *** xmlsamples3.1/ActorPreludeSample.xml:44: is not supported yet by xml2ly -... ... ... ... ... -*** MusicXML warning *** xmlsamples3.1/ActorPreludeSample.xml:27761: contains 2 markups -Warning message(s) were issued for input lines 44, 45, 46, 551, 584, 732, 1121, 1215, 4724, 27761 - -Timing information: - -Activity Description Kind CPU (sec) --------- ------------------------------- --------- --------- - -Pass 1 build xmlelement tree from file mandatory 0.268994 -Pass 2a build the MSR skeleton mandatory 0.076413 -Pass 2b build the MSR mandatory 0.276732 -Pass 3 translate MSR to LPSR mandatory 0.056381 -Pass 4 translate LPSR to LilyPond mandatory 0.082213 - -Total Mandatory Optional -------- --------- --------- -0.760733 0.760733 0 - - -real 0m0.814s -user 0m0.751s -sys 0m0.058s -\end{lstlisting} - -This compares favorably with \mxmlToLy\ measurements: -\begin{lstlisting}[language=XML] -menu@macbookprojm > time musicxml2ly xmlsamples3.1/ActorPreludeSample.xml -musicxml2ly: Reading MusicXML from xmlsamples3.1/ActorPreludeSample.xml ... -musicxml2ly: Converting to LilyPond expressions... -... ... ... ... ... -musicxml2ly: Converting to LilyPond expressions... -musicxml2ly: Output to `ActorPreludeSample.ly' -musicxml2ly: Converting to current version (2.19.83) notations ... - -real 0m4.113s -user 0m3.659s -sys 0m0.407s -\end{lstlisting} - -% ------------------------------------------------------------------------- -\subsubsection{Chords structure} -% ------------------------------------------------------------------------- - -In order to invert chords, as specified by the '{\tt }' element in \mxml\ data, \mxmlToLy\ knows the structure of many of them. This can be queried with the options in the '{\tt Extra}' group: -\begin{lstlisting}[language=XML] -menu@macbookprojm > xml2ly -help=extra - ---- Help for group "Extra" --- - -Extra (-he, -help-extra): - These extra provide features not related to translation from MusicXML to other formats. - In the text below: - - ROOT_DIATONIC_PITCH should belong to the names available in - the selected MSR pitches language, "nederlands" by default; - - other languages can be chosen with the '-mpl, -msrPitchesLanguage' option; - - HARMONY_NAME should be one of: - MusicXML chords: - "maj", "min", "aug", "dim", "dom", - "maj7", "min7", "dim7", "aug7", "halfdim", "minmaj7", - "maj6", "min6", "dom9", "maj9", "min9", "dom11", "maj11", "min11", - "dom13", "maj13", "min13", "sus2", "sus4", - "neapolitan", "italian", "french", "german" - Jazz-specific chords: - "pedal", "power", "tristan", "minmaj9", "domsus4", "domaug5", - "dommin9", "domaug9dim5", "domaug9aug5", "domaug11", "maj7aug11" - The single or double quotes are used to allow spaces in the names - and around the '=' sign, otherwise they can be dispensed with. --------------------------- - Chords structures (-hecs, -help-extra-chord-structures): - -scs, -show-chords-structures - Write all known chords structures to standard output. - Chords contents (-hecc, -help-extra-chords-contents): - -sacc, -show-all-chords-contents PITCH - Write all chords contents for the given diatonic (semitones) PITCH, - supplied in the current language to standard output. - Chord details (-hecd, -help-extra-chords-details): - -scd, -show-chord-details CHORD_SPEC - Write the details of the chord for the given diatonic (semitones) pitch - in the current language and the given harmony to standard output. - CHORD_SPEC can be: - 'ROOT_DIATONIC_PITCH HARMONY_NAME' - or - "ROOT_DIATONIC_PITCH = HARMONY_NAME" - Using double quotes allows for shell variables substitutions, as in: - HARMONY="maj7" - xml2ly -show-chord-details "bes ${HARMONY}" - Chord analysis (-heca, -help-extra-chords-analysis): - -sca, -show-chord-analysis CHORD_SPEC - Write an analysis of the chord for the given diatonic (semitones) pitch - in the current language and the given harmony to standard output. - CHORD_SPEC can be: - 'ROOT_DIATONIC_PITCH HARMONY_NAME INVERSION' - or - "ROOT_DIATONIC_PITCH = HARMONY_NAME INVERSION" - Using double quotes allows for shell variables substitutions, as in: - HARMONY="maj7" - INVERSION=2 - xml2ly -show-chord-analysis "bes ${HARMONY} ${INVERSION}" -\end{lstlisting} - -For example, one can obtain the structure of the B\Flat\ dominant minor ninth chord's second inversion this way: -\begin{lstlisting}[language=XML] -menu@macbookprojm > xml2ly -show-chord-analysis 'bes dommin9 2' -The analysis of chord 'bes dommin9' inversion 2 is: - - Chord 'bes dommin9' inversion 2 contents, 5 intervals: - d : majorThird - bes : perfectUnison - ces : minorNinth - aes : minorSeventh - f : perfectFifth - - Chord 'bes dommin9' inversion 2 inner intervals: - f -> aes : minorThird (perfectFifth -> minorSeventh) - f -> ces : diminishedFifth (perfectFifth -> minorNinth) - f -> bes : perfectFourth (perfectFifth -> perfectUnison) - f -> d : majorSixth (perfectFifth -> majorThird) - - aes -> ces : minorThird (minorSeventh -> minorNinth) - aes -> bes : majorSecond (minorSeventh -> perfectUnison) - aes -> d : augmentedFourth (minorSeventh -> majorThird) - - ces -> bes : majorSeventh (minorNinth -> perfectUnison) - ces -> d : augmentedSecond (minorNinth -> majorThird) - - bes -> d : majorThird (perfectUnison -> majorThird) - This chord contains 2 tritons -\end{lstlisting} - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{Building the xmlelement tree} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{The MSR graph} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{The LPSR graph} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -\section{LilyPond code generation} -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - - - -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- -% postamble -% ------------------------------------------------------------------------- -% ------------------------------------------------------------------------- - -\pagebreak - -\lstlistoflistings - -\listoffigures - -\tableofcontents - - -% ------------------------------------------------------------------------- -\end{document} -% -------------------------------------------------------------------------