From 537b014efbc0b8827aa8ece5859ec28938cbb654 Mon Sep 17 00:00:00 2001 From: James Mizen Date: Wed, 29 Nov 2023 15:52:25 +0100 Subject: [PATCH] Fix GH#9186: Prevent merging articulations on xml import Backport of #20248 --- importexport/musicxml/importmxmlpass2.cpp | 107 +--- importexport/musicxml/importmxmlpass2.h | 3 - .../io/testArticulationCombination.xml | 454 +++++++++++++++++ .../musicxml/io/testArticulationsCombined.pdf | Bin 29836 -> 0 bytes .../musicxml/io/testArticulationsCombined.xml | 467 ----------------- .../io/testArticulationsCombined_ref.mscx | 474 ------------------ mtest/musicxml/io/testNoteAttributes2_ref.xml | 3 +- 7 files changed, 467 insertions(+), 1041 deletions(-) create mode 100644 mtest/musicxml/io/testArticulationCombination.xml delete mode 100644 mtest/musicxml/io/testArticulationsCombined.pdf delete mode 100644 mtest/musicxml/io/testArticulationsCombined.xml delete mode 100644 mtest/musicxml/io/testArticulationsCombined_ref.mscx diff --git a/importexport/musicxml/importmxmlpass2.cpp b/importexport/musicxml/importmxmlpass2.cpp index 07effc8308c89..42ca952fc2cca 100644 --- a/importexport/musicxml/importmxmlpass2.cpp +++ b/importexport/musicxml/importmxmlpass2.cpp @@ -6839,9 +6839,17 @@ void MusicXMLParserNotations::articulations() while (_e.readNextStartElement()) { SymId id { SymId::noSym }; if (convertArticulationToSymId(_e.name().toString(), id)) { - Notation artic = Notation::notationWithAttributes(_e.name().toString(), - _e.attributes(), "articulations", id); - _notations.push_back(artic); + if (_e.name() == "detached-legato") { + _notations.push_back(Notation::notationWithAttributes("tenuto", + _e.attributes(), "articulations", SymId::articTenutoAbove)); + _notations.push_back(Notation::notationWithAttributes("staccato", + _e.attributes(), "articulations", SymId::articStaccatoAbove)); + } + else { + Notation artic = Notation::notationWithAttributes(_e.name().toString(), + _e.attributes(), "articulations", id); + _notations.push_back(artic); + } _e.skipCurrentElement(); // skip but don't log } else if (_e.name() == "breath-mark") { @@ -7334,35 +7342,6 @@ Notation Notation::notationWithAttributes(const QString& name, const QXmlStreamA return notation; } -//--------------------------------------------------------- -// mergeNotations -//--------------------------------------------------------- - -/** - Helper function to merge two Notations. Used to combine articulations in combineArticulations. - */ - -Notation Notation::mergeNotations(const Notation& n1, const Notation& n2, const SymId& symId) - { - // Sort and combine the names - std::vector names{ n1.name(), n2.name() }; - std::sort(names.begin(), names.end()); - QString name = names[0] + " " + names[1]; - - // Parents should match (and will both be "articulation") - Q_ASSERT(n1.parent() == n2.parent()); - QString parent = n1.parent(); - - Notation mergedNotation { name, parent, symId }; - for (const auto& attr : n1.attributes()) { - mergedNotation.addAttribute(attr.first, attr.second); - } - for (const auto& attr : n2.attributes()) { - mergedNotation.addAttribute(attr.first, attr.second); - } - return mergedNotation; - } - //--------------------------------------------------------- // addAttribute //--------------------------------------------------------- @@ -7454,69 +7433,6 @@ void MusicXMLParserNotations::skipLogCurrElem() _e.skipCurrentElement(); } -//--------------------------------------------------------- -// skipCombine -//--------------------------------------------------------- - -/** - Helper function to hold conditions under which a potential combine should be skipped. - */ - -bool MusicXMLParserNotations::skipCombine(const Notation& n1, const Notation& n2) - { - bool placementsSpecifiedAndDifferent = n1.attribute("placement") != "" && - n2.attribute("placement") != "" && - n1.attribute("placement") != n2.attribute("placement"); - bool upMarcatoDownOther = (n1.name() == "strong-accent" && n1.attribute("type") == "up" && - n2.attribute("placement") == "below") || - (n2.name() == "strong-accent" && n2.attribute("type") == "up" && - n1.attribute("placement") == "below"); - bool downMarcatoUpOther = (n1.name() == "strong-accent" && n1.attribute("type") == "down" && - n2.attribute("placement") == "above") || - (n2.name() == "strong-accent" && n2.attribute("type") == "down" && - n1.attribute("placement") == "above"); - bool slurEndpoint = _slurStart || _slurStop; - return placementsSpecifiedAndDifferent || upMarcatoDownOther || downMarcatoUpOther || slurEndpoint; - } - -//--------------------------------------------------------- -// combineArticulations -//--------------------------------------------------------- -/** - Combine any eligible articulations. - i.e. accent + staccato = staccato accent - */ - -void MusicXMLParserNotations::combineArticulations() - { - QMap, SymId> map; // map set of symbols to combined symbol - map[{ SymId::articAccentAbove, SymId::articStaccatoAbove }] = SymId::articAccentStaccatoAbove; - map[{ SymId::articMarcatoAbove, SymId::articStaccatoAbove }] = SymId::articMarcatoStaccatoAbove; - map[{ SymId::articMarcatoAbove, SymId::articTenutoAbove }] = SymId::articMarcatoTenutoAbove; - map[{ SymId::articAccentAbove, SymId::articTenutoAbove }] = SymId::articTenutoAccentAbove; - - // Iterate through each distinct pair (backwards, to allow for deletions) - for (std::vector::reverse_iterator n1 = _notations.rbegin(), n1Next = n1; n1 != _notations.rend(); n1 = n1Next) { - n1Next = std::next(n1); - if (n1->parent() != "articulations") - continue; - for (std::vector::reverse_iterator n2 = n1 + 1, n2Next = n1; n2 != _notations.rend(); n2 = n2Next) { - n2Next = std::next(n2); - if (n2->parent() != "articulations" || skipCombine(*n1, *n2)) - continue; - // Combine and remove articulations if present in map - std::set currentPair = { n1->symId(), n2->symId() }; - if (map.contains(currentPair)) { - Notation mergedNotation = Notation::mergeNotations(*n1, *n2, map.value(currentPair)); - n1Next = decltype(n1){ _notations.erase(std::next(n1).base()) }; - n2Next = decltype(n2){ _notations.erase(std::next(n2).base()) }; - _notations.push_back(mergedNotation); - } - } - } - } - - //--------------------------------------------------------- // parse //--------------------------------------------------------- @@ -7573,7 +7489,6 @@ void MusicXMLParserNotations::parse() qDebug("%s", qPrintable(notation.print())); } */ - combineArticulations(); addError(checkAtEndElement(_e, "notations")); } diff --git a/importexport/musicxml/importmxmlpass2.h b/importexport/musicxml/importmxmlpass2.h index b5713335b1bcb..23d8729c30878 100644 --- a/importexport/musicxml/importmxmlpass2.h +++ b/importexport/musicxml/importmxmlpass2.h @@ -162,7 +162,6 @@ class Notation { QString text() const { return _text; } static Notation notationWithAttributes(const QString& name, const QXmlStreamAttributes attributes, const QString& parent = "", const SymId& symId = SymId::noSym); - static Notation mergeNotations(const Notation& n1, const Notation& n2, const SymId& symId = SymId::noSym); private: QString _name; QString _parent; @@ -219,12 +218,10 @@ class MusicXMLParserNotations { QString tremoloType() const { return _tremoloType; } int tremoloNr() const { return _tremoloNr; } bool mustStopGraceAFter() const { return _slurStop || _wavyLineStop; } - bool skipCombine(const Notation& n1, const Notation& n2); private: void addError(const QString& error); ///< Add an error to be shown in the GUI void addNotation(const Notation& notation, ChordRest* const cr, Note* const note); void addTechnical(const Notation& notation, Note* note); - void combineArticulations(); void harmonic(); void articulations(); void dynamics(); diff --git a/mtest/musicxml/io/testArticulationCombination.xml b/mtest/musicxml/io/testArticulationCombination.xml new file mode 100644 index 0000000000000..2ef77d032a465 --- /dev/null +++ b/mtest/musicxml/io/testArticulationCombination.xml @@ -0,0 +1,454 @@ + + + + + Title + + + Composer + + MuseScore 0.7.0 + 2007-09-10 + + + + + + + + + + Piano + Pno. + + Piano + + + + 1 + 1 + 78.7402 + 0 + + + + + + + 1 + + 0 + + + + G + 2 + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + D + 5 + + 1 + 1 + quarter + down + + + + + + + + + + E + 5 + + 1 + 1 + quarter + down + + + + + + + + + + F + 5 + + 1 + 1 + quarter + down + + + + + + + + + + + + G + 5 + + 1 + 1 + quarter + down + + + + + + + + + F + 5 + + 1 + 1 + quarter + down + + + + + + + + + + E + 5 + + 1 + 1 + quarter + down + + + + + + + + + + D + 5 + + 1 + 1 + quarter + down + + + + + + + + + + + + + + A + 4 + + 1 + 1 + quarter + up + + + + + + + + + + G + 4 + + 1 + 1 + quarter + up + + + + + + + + + + F + 4 + + 1 + 1 + quarter + up + + + + + + + + + + E + 4 + + 1 + 1 + quarter + up + + + + + + + + + + + + D + 4 + + 1 + 1 + quarter + up + + + + + + + + + E + 4 + + 1 + 1 + quarter + up + + + + + + + + + + F + 4 + + 1 + 1 + quarter + up + + + + + + + + + + G + 4 + + 1 + 1 + quarter + up + + + + + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + + + + + + light-heavy + + + + diff --git a/mtest/musicxml/io/testArticulationsCombined.pdf b/mtest/musicxml/io/testArticulationsCombined.pdf deleted file mode 100644 index e12b9508b2393e0713fe662cda3ebf97003ab9a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29836 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

bQK_J9*D;(vxqPw?FBH_&=&2Ib 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 - - - - Test Combined Articulations - - - Henry Ives - - MuseScore 0.7.0 - 2007-09-10 - - - - - - - - - - 7 - 40 - - - 1697.14 - 1200 - - 85.7143 - 85.7143 - 85.7143 - 85.7143 - - - 85.7143 - 85.7143 - 85.7143 - 85.7143 - - - - - - - title - Test Combined Articulations - - - composer - Henry Ives - - - subtitle - Musescore Test Case - - - - brace - - - Piano - Pno. - - Piano - - - - 1 - 1 - 78.7402 - 0 - - - - - - - - - 50.00 - 0.00 - - 170.00 - - - - 2 - - 0 - - - - G - 2 - - - - - E - 4 - - 2 - 1 - quarter - up - - single - O'er - - - - - E - 4 - - 1 - 1 - eighth - up - begin - - - - - - - - - - - single - the - - - - - E - 4 - - 1 - 1 - eighth - up - end - - - - - - - - - - - begin - ram - - - - - - - E - 4 - - 2 - 1 - quarter - up - - - - - - - - - - - end - parts - - - - - E - 5 - - 2 - 1 - quarter - down - - - - - - - - single - we - - - - - - - E - 4 - - 2 - 1 - quarter - up - - single - watched - - - - - E - 4 - - 1 - 1 - eighth - up - begin - - single - were - - - - - E - 4 - - 1 - 1 - eighth - up - end - - single - so - - - - - - - E - 4 - - 2 - 1 - quarter - up - - - - - - - - - - begin - gal - - - - - E - 5 - - 2 - 1 - quarter - down - - - - - - - middle - lant - - - - - - - E - 4 - - 2 - 1 - quarter - up - - - - - - - - end - ly - - - - - - E - 4 - - 1 - 1 - eighth - up - begin - - - - F - 1 - 4 - - 1 - 1 - eighth - sharp - up - end - - - - - - - - begin - strea - - - - - - - G - 4 - - 2 - 1 - quarter - up - - end - ming? - - - - - G - 5 - - 2 - 1 - quarter - down - - - - - - - - single - and - - - - - - - G - 4 - - 2 - 1 - quarter - up - - single - the - - - - - G - 4 - - 1 - 1 - eighth - up - begin - - begin - roc - - - - - G - 4 - - 1 - 1 - eighth - up - end - - end - ket's - - - - - - - G - 4 - - 2 - 1 - quarter - up - - - - - - - - single - red - - - - - 2 - 1 - quarter - - - light-heavy - - - - diff --git a/mtest/musicxml/io/testArticulationsCombined_ref.mscx b/mtest/musicxml/io/testArticulationsCombined_ref.mscx deleted file mode 100644 index c7a3ad52a17bb..0000000000000 --- a/mtest/musicxml/io/testArticulationsCombined_ref.mscx +++ /dev/null @@ -1,474 +0,0 @@ - - - - - 0 - 480 - - 1 - 1 - 1 - 0 - - Henry Ives - - - - - - - - - Test Combined Articulations - - - - stdNormal - - 3 - - Piano - - Piano - Pno. - Piano - 21 - 108 - 21 - 108 - keyboard.piano - F - - 100 - 95 - - - 100 - 33 - - - 100 - 50 - - - 100 - 67 - - - 100 - 100 - - - 120 - 67 - - - 150 - 100 - - - 150 - 50 - - - 120 - 50 - - - 120 - 100 - - - - - - - - - - 12.5 - - - - Test Combined Articulations - - - - right,top - - Henry Ives - - - - - Musescore Test Case - - - - - - G - G - - - 2 - 4 - - - quarter - - O'er - - up - - 64 - 18 - - - - up - 4 - 4 - - - begin - eighth - - the - - - stringsUpBow - - - articAccentStaccatoBelow - - - 64 - 18 - - - - mid - eighth - - begin - ram - - - stringsUpBow - - - articAccentStaccatoBelow - - - 64 - 18 - - - - - - - - quarter - - end - parts - - - ornamentTremblement - - - articTenutoAccentBelow - - up - - 64 - 18 - - - - quarter - - we - - - articTenutoAccentAbove - - down - - 76 - 18 - - - - - - - - quarter - - watched - - up - - 64 - 18 - - - - up - 4 - 4 - - - begin - eighth - - were - - - 64 - 18 - - - - mid - eighth - - so - - - 64 - 18 - - - - - - - - quarter - - begin - gal - - - articTenutoStaccatoBelow - - - stringsDownBow - - up - - 64 - 18 - - - - quarter - - middle - lant - - - articTenutoStaccatoAbove - - down - - 76 - 18 - - - - - - - - quarter - - end - 480 - 2/8 - ly - - - articAccentStaccatoBelow - - up - - 64 - 18 - - - - up - 4 - 3 - - - begin - eighth - - 64 - 18 - - - - mid - eighth - - begin - strea - - - articStaccatoBelow - 4 - - - articMarcatoAbove - 3 - - - - accidentalSharp - - 66 - 20 - - - - - - - - quarter - - end - ming? - - up - - 67 - 15 - - - - quarter - - and - - - articAccentStaccatoAbove - - down - - 79 - 15 - - - - - - - - quarter - - the - - up - - 67 - 15 - - - - up - 0 - 0 - - - begin - eighth - - begin - roc - - - 67 - 15 - - - - mid - eighth - - end - ket's - - - 67 - 15 - - - - - - - - quarter - - red - - - articMarcatoTenutoAbove - 3 - - up - - 67 - 15 - - - - quarter - - - end - - - - - - diff --git a/mtest/musicxml/io/testNoteAttributes2_ref.xml b/mtest/musicxml/io/testNoteAttributes2_ref.xml index b2ec46a6823ac..3c04cc65c868f 100644 --- a/mtest/musicxml/io/testNoteAttributes2_ref.xml +++ b/mtest/musicxml/io/testNoteAttributes2_ref.xml @@ -448,7 +448,8 @@ up - + +