From d7962ee893d5b8bb800c4ad759a53049999225e4 Mon Sep 17 00:00:00 2001 From: iveshenry18 Date: Fri, 2 Jul 2021 17:08:23 -0600 Subject: [PATCH] ENG-60: Move and hide additional fermatas When a fermata in a secondary voice is read, this commit adds handling that moves it below the staff. Additionally, there is handling to hide it if the duration of both voices is the same, or if there is also already a fermata below the staff. Duplicate of #8509 --- importexport/musicxml/importmxmlpass2.cpp | 22 + mtest/musicxml/io/testAdditionalFermatas.xml | 742 ++++++++++++++++++ .../io/testAdditionalFermatas_ref.mscx | 559 +++++++++++++ mtest/musicxml/io/tst_mxml_io.cpp | 1 + 4 files changed, 1324 insertions(+) create mode 100644 mtest/musicxml/io/testAdditionalFermatas.xml create mode 100644 mtest/musicxml/io/testAdditionalFermatas_ref.mscx diff --git a/importexport/musicxml/importmxmlpass2.cpp b/importexport/musicxml/importmxmlpass2.cpp index eb2d73a75fa2b..f7351db941840 100644 --- a/importexport/musicxml/importmxmlpass2.cpp +++ b/importexport/musicxml/importmxmlpass2.cpp @@ -1029,6 +1029,28 @@ static void addFermataToChord(const Notation& notation, ChordRest* cr) cr->el().push_back(na); // store for later move to segment else cr->segment()->add(na); + + // Move or hide fermata based on existing fermatas. + bool alreadyAbove = false; + bool alreadyBelow = false; + for (Element* e: cr->segment()->annotations()) { + if (e->isFermata() && e != na + && e->staffIdx() == na->staffIdx() && e->track() != na->track()) { + Element* otherCr = cr->segment()->elist()[e->track()]; + if (toFermata(e)->placement() == Placement::BELOW) alreadyBelow = true; + if (toFermata(e)->placement() == Placement::ABOVE) alreadyAbove = true; + + if (direction.isEmpty() && alreadyAbove) + na->setPlacement(Placement::BELOW); + else if (direction.isEmpty() && alreadyBelow) + na->setPlacement(Placement::ABOVE); + + if ((otherCr->isChord() && cr->isChord() + && toChord(otherCr)->durationType() == toChord(cr)->durationType()) + || (alreadyAbove && alreadyBelow)) + na->setVisible(false); + } + } } //--------------------------------------------------------- diff --git a/mtest/musicxml/io/testAdditionalFermatas.xml b/mtest/musicxml/io/testAdditionalFermatas.xml new file mode 100644 index 0000000000000..e60189646947e --- /dev/null +++ b/mtest/musicxml/io/testAdditionalFermatas.xml @@ -0,0 +1,742 @@ + + + + + Additional Fermatas + + + 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 + Additional Fermatas + + + subtitle + MuseScore Testcase + + + composer + Henry Ives + + + + brace + + + Piano + Pno. + + Piano + + + + 1 + 1 + 78.7402 + 0 + + + + + + + + + 50.00 + 0.00 + + 175.57 + + + + 1 + + 0 + + + + G + 2 + + + + + A + 4 + + 1 + 1 + quarter + down + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + F + 5 + + 1 + 1 + quarter + down + + + + D + 5 + + 1 + 1 + quarter + down + + + + + E + 5 + + 1 + 1 + quarter + down + + + + + A + 5 + + 1 + 1 + quarter + down + + + + A + 4 + + 1 + 1 + quarter + down + + + + + B + 4 + + 1 + 1 + quarter + down + + + + + C + 5 + + 1 + 1 + quarter + down + + + + + A + 5 + + 1 + 1 + quarter + down + + + + B + 4 + + 1 + 1 + quarter + down + + + + + A + 5 + + 1 + 1 + quarter + down + + + + + C + 6 + + 1 + 1 + quarter + down + + + + + + F + 4 + + 1 + 1 + quarter + up + + + + + + + + A + 4 + + 1 + 1 + quarter + up + + + + B + 4 + + 1 + 1 + quarter + up + + + + + D + 5 + + 1 + 1 + quarter + up + + + + A + 4 + + 1 + 1 + quarter + up + + + + + A + 5 + + 1 + 1 + quarter + up + + + + F + 5 + + 1 + 1 + quarter + up + + + 4 + + + + C + 4 + + 4 + 2 + whole + + + + + + + + + B + 5 + + 1 + 1 + quarter + up + + + + + + + C + 5 + + 1 + 1 + quarter + up + + + + B + 5 + + 1 + 1 + quarter + up + + + + D + 5 + + 1 + 1 + quarter + up + + + 4 + + + + B + 4 + + 4 + 2 + whole + + + + + + 4 + + + + G + 4 + + 4 + 3 + whole + + + + + + + + + D + 5 + + 1 + 1 + quarter + up + + + + + + + + E + 5 + + 1 + 1 + quarter + up + + + + + F + 5 + + 1 + 1 + quarter + up + + + + G + 4 + + 1 + 1 + quarter + up + + + + G + 5 + + 1 + 1 + quarter + up + + + + F + 5 + + 1 + 1 + quarter + up + + + + + G + 5 + + 1 + 1 + quarter + up + + + 4 + + + + E + 4 + + 1 + 4 + quarter + down + + + + + + + 1 + 4 + quarter + + + + 2 + 4 + half + + + + + + A + 5 + + 1 + 1 + quarter + up + + + + D + 5 + + 1 + 1 + quarter + up + + + + + + + + F + 5 + + 1 + 1 + quarter + up + + + + + A + 5 + + 1 + 1 + quarter + up + + + + D + 4 + + 1 + 1 + quarter + up + + + + + D + 5 + + 1 + 1 + quarter + up + + + + + E + 5 + + 1 + 1 + quarter + up + + + + D + 5 + + 1 + 1 + quarter + up + + + 4 + + + + D + 5 + + 1 + 2 + quarter + down + + + + A + 4 + + 1 + 2 + quarter + down + + + + + + + 2 + 2 + half + + + + + + E + 5 + + 1 + 1 + quarter + down + + + + + B + 5 + + 1 + 1 + quarter + down + + + + 1 + 1 + quarter + + + + G + 4 + + 1 + 1 + quarter + down + + + + + F + 5 + + 1 + 1 + quarter + down + + + + F + 4 + + 1 + 1 + quarter + down + + + + + D + 5 + + 1 + 1 + quarter + down + + + + + F + 5 + + 1 + 1 + quarter + down + + + + + G + 5 + + 1 + 1 + quarter + down + + + + + A + 5 + + 1 + 1 + quarter + down + + + light-heavy + + + + diff --git a/mtest/musicxml/io/testAdditionalFermatas_ref.mscx b/mtest/musicxml/io/testAdditionalFermatas_ref.mscx new file mode 100644 index 0000000000000..a02c3f18637cc --- /dev/null +++ b/mtest/musicxml/io/testAdditionalFermatas_ref.mscx @@ -0,0 +1,559 @@ + + + + + 0 + 480 + + 1 + 1 + 1 + 0 + + Henry Ives + + + + + + + + + Additional Fermatas + + + + 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 + + + + Additional Fermatas + + + + + MuseScore Testcase + + + + right,top + + Henry Ives + + + + + + G + G + + + 4 + 4 + + + quarter + down + + 69 + 17 + + + 72 + 14 + + + 77 + 13 + + + + quarter + down + + 74 + 16 + + + 76 + 18 + + + 81 + 17 + + + + quarter + down + + 69 + 17 + + + 71 + 19 + + + 72 + 14 + + + 81 + 17 + + + + quarter + down + + 71 + 19 + + + 81 + 17 + + + 84 + 14 + + + + + + + + fermataAbove + + + quarter + up + + 65 + 13 + + + 69 + 17 + + + + quarter + up + + 71 + 19 + + + 74 + 16 + + + + quarter + up + + 69 + 17 + + + 81 + 17 + + + + quarter + up + + 77 + 13 + + + + + + fermataBelow + + + whole + + 60 + 14 + + + + + + + + fermataAbove + + + quarter + up + + 83 + 19 + + + + quarter + up + + 72 + 14 + + + + quarter + up + + 83 + 19 + + + + quarter + up + + 74 + 16 + + + + + + fermataBelow + + + whole + + 71 + 19 + + + + + + fermataBelow + 0 + below + + + whole + + 67 + 15 + + + + + + + + fermataAbove + + + quarter + up + + 74 + 16 + + + 76 + 18 + + + 77 + 13 + + + + quarter + up + + 67 + 15 + + + + quarter + up + + 79 + 15 + + + + quarter + up + + 77 + 13 + + + 79 + 15 + + + + + + + + fermataBelow + 0 + + + quarter + down + + 64 + 18 + + + + quarter + + + half + + + + + + + quarter + up + + 81 + 17 + + + + fermataAbove + + + quarter + up + + 74 + 16 + + + 77 + 13 + + + 81 + 17 + + + + quarter + up + + 62 + 16 + + + 74 + 16 + + + 76 + 18 + + + + quarter + up + + 74 + 16 + + + + + + quarter + down + + 74 + 16 + + + + fermataBelow + 0 + + + quarter + down + + 69 + 17 + + + + half + + + + + + + quarter + down + + 76 + 18 + + + 83 + 19 + + + + quarter + + + quarter + down + + 67 + 15 + + + 77 + 13 + + + + quarter + down + + 65 + 13 + + + 74 + 16 + + + 77 + 13 + + + 79 + 15 + + + 81 + 17 + + + + end + + + + + + diff --git a/mtest/musicxml/io/tst_mxml_io.cpp b/mtest/musicxml/io/tst_mxml_io.cpp index db75baf679287..c76ec05289ba9 100644 --- a/mtest/musicxml/io/tst_mxml_io.cpp +++ b/mtest/musicxml/io/tst_mxml_io.cpp @@ -58,6 +58,7 @@ private slots: void accidentals1() { mxmlIoTest("testAccidentals1"); } void accidentals2() { mxmlIoTest("testAccidentals2"); } void accidentals3() { mxmlIoTest("testAccidentals3"); } + void additionalFermatas() { mxmlImportTestRef("testAdditionalFermatas"); } void arpGliss1() { mxmlIoTest("testArpGliss1"); } void arpGliss2() { mxmlIoTest("testArpGliss2"); } void arpGliss3() { mxmlIoTest("testArpGliss3"); }