From 75a740cdbcbdc9a4f08731ab3d7a89c6498401b0 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 27 Nov 2023 18:06:51 +0100 Subject: [PATCH] Add support for the sostenuto pedal signs to MusicXML import/export Backport of #20219 --- importexport/musicxml/exportxml.cpp | 8 +- importexport/musicxml/importmxmlpass2.cpp | 15 +- mtest/musicxml/io/testDirections1.xml | 4 +- mtest/musicxml/io/testPedalChanges.xml | 55 +- mtest/musicxml/io/testPedalChanges_ref.mscx | 641 -------- mtest/musicxml/io/testPedalStyles.xml | 1555 +++++++++++++++++++ mtest/musicxml/io/tst_mxml_io.cpp | 3 +- 7 files changed, 1578 insertions(+), 703 deletions(-) delete mode 100644 mtest/musicxml/io/testPedalChanges_ref.mscx create mode 100644 mtest/musicxml/io/testPedalStyles.xml diff --git a/importexport/musicxml/exportxml.cpp b/importexport/musicxml/exportxml.cpp index 99380b77eb7f3..f23633a25358d 100644 --- a/importexport/musicxml/exportxml.cpp +++ b/importexport/musicxml/exportxml.cpp @@ -4671,14 +4671,16 @@ void ExportMusicXml::pedal(Pedal const* const pd, int staff, const Fraction& tic break; case HookType::NONE: if (pd->beginText() == "") { - pedalType = "resume"; + pedalType = pd->lineVisible() ? "resume" : "start"; break; } // FALLTHROUGH default: pedalType = "start"; } - signText = pd->beginText() == "" ? " sign=\"no\"" : " sign=\"yes\""; + signText = pd->beginText().isEmpty() ? " sign=\"no\"" : " sign=\"yes\""; + if (pd->beginText() == "keyboardPedalSost" || pd->beginText() == "keyboardPedalS") + pedalType = "sostenuto"; } else { if (!pd->endText().isEmpty() || pd->endHookType() == HookType::HOOK_90) @@ -4687,7 +4689,7 @@ void ExportMusicXml::pedal(Pedal const* const pd, int staff, const Fraction& tic pedalType = "discontinue"; // "change" type is handled only on the beginning of pedal lines - signText = pd->endText() == "" ? " sign=\"no\"" : " sign=\"yes\""; + signText = pd->endText().isEmpty() ? " sign=\"no\"" : " sign=\"yes\""; } pedalXml = QString("pedal type=\"%1\"").arg(pedalType); pedalXml += lineText; diff --git a/importexport/musicxml/importmxmlpass2.cpp b/importexport/musicxml/importmxmlpass2.cpp index 07effc8308c89..57a5d5ec9d6d4 100644 --- a/importexport/musicxml/importmxmlpass2.cpp +++ b/importexport/musicxml/importmxmlpass2.cpp @@ -4130,7 +4130,7 @@ void MusicXMLParserDirection::pedal(const QString& type, const int /* number */, sign = "no"; // MusicXML 2.0 compatibility } auto& spdesc = _pass2.getSpanner({ ElementType::PEDAL, number }); - if (type == "start" || type == "resume") { + if (type == "start" || type == "resume" || type == "sostenuto") { if (spdesc._isStarted && !spdesc._isStopped) { // Previous pedal unterminated—likely an unrecorded "discontinue", so delete the line. // TODO: if "change", create 0-length spanner rather than delete @@ -4144,10 +4144,15 @@ void MusicXMLParserDirection::pedal(const QString& type, const int /* number */, p->setLineVisible(false); if (!p->lineVisible() || sign == "yes") { p->setBeginText("keyboardPedalPed"); - p->setContinueText("(keyboardPedalPed)"); + p->setContinueText("keyboardPedalUp"); + if (type == "sostenuto") + p->setBeginText("keyboardPedalSost"); } - else + else { + p->setBeginText(""); + p->setContinueText(""); p->setBeginHookType(type == "resume" ? HookType::NONE : HookType::HOOK_90); + } p->setEndHookType(HookType::NONE); starts.append(MusicXmlSpannerDesc(p, ElementType::PEDAL, number)); } @@ -4185,6 +4190,10 @@ void MusicXMLParserDirection::pedal(const QString& type, const int /* number */, p->setLineVisible(true); else p->setLineVisible(false); + if (sign == "no") { + p->setBeginText(""); + p->setContinueText(""); + } starts.append(MusicXmlSpannerDesc(p, ElementType::PEDAL, number)); } else if (type == "continue") { diff --git a/mtest/musicxml/io/testDirections1.xml b/mtest/musicxml/io/testDirections1.xml index 2a7bc841db1d6..c3301d44606c3 100644 --- a/mtest/musicxml/io/testDirections1.xml +++ b/mtest/musicxml/io/testDirections1.xml @@ -102,7 +102,7 @@ - + @@ -132,7 +132,7 @@ - + diff --git a/mtest/musicxml/io/testPedalChanges.xml b/mtest/musicxml/io/testPedalChanges.xml index c127f52599a57..85ae25759fa43 100644 --- a/mtest/musicxml/io/testPedalChanges.xml +++ b/mtest/musicxml/io/testPedalChanges.xml @@ -1,5 +1,5 @@ - + Pedal Changes @@ -16,46 +16,7 @@ - - - 7 - 40 - - - 1697.14 - 1200 - - 85.7143 - 85.7143 - 85.7143 - 85.7143 - - - 85.7143 - 85.7143 - 85.7143 - 85.7143 - - - - - - - title - Pedal Changes - - - subtitle - MuseScore Testcase - - - composer - Henry Ives - - - none - Piano Pno. @@ -73,19 +34,7 @@ - - - - - 50.00 - 0.00 - - 170.00 - - - 65.00 - - + 1 diff --git a/mtest/musicxml/io/testPedalChanges_ref.mscx b/mtest/musicxml/io/testPedalChanges_ref.mscx deleted file mode 100644 index 293a159bf1cb3..0000000000000 --- a/mtest/musicxml/io/testPedalChanges_ref.mscx +++ /dev/null @@ -1,641 +0,0 @@ - - - - - 0 - 480 - - 1 - 1 - 1 - 0 - - Henry Ives - - - - - - - - - Pedal Changes - - - - stdNormal - - 3 - - 1 - - - - 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 - - - - Pedal Changes - - - - - MuseScore Testcase - - - - right,top - - Henry Ives - - - - - - G - G - - - 4 - 4 - - - quarter - up - - 60 - 14 - - - - quarter - up - - 62 - 16 - - - - quarter - up - - 64 - 18 - - - - quarter - up - - 65 - 13 - - - - - - - - quarter - up - - 67 - 15 - - - - quarter - up - - 69 - 17 - - - - quarter - down - - 71 - 19 - - - - quarter - down - - 72 - 14 - - - - - - - - quarter - down - - 74 - 16 - - - - quarter - down - - 76 - 18 - - - - quarter - down - - 77 - 13 - - - - quarter - down - - 79 - 15 - - - - - - - - quarter - down - - 81 - 17 - - - - quarter - down - - 83 - 19 - - - - quarter - down - - 81 - 17 - - - - - - 1 - -3/4 - - - - - quarter - down - - 79 - 15 - - - - - - - - quarter - down - - 77 - 13 - - - - - - 1 - -1 - 1/4 - - - - - quarter - down - - 76 - 18 - - - - quarter - down - - 74 - 16 - - - - quarter - down - - 72 - 14 - - - - - - - - quarter - down - - 71 - 19 - - - - quarter - up - - 69 - 17 - - - - quarter - up - - 67 - 15 - - - - quarter - up - - 65 - 13 - - - - - - - - whole - - 64 - 18 - - - - end - - - - - - - - - F - F - - - 4 - 4 - - - - 1 - <sym>keyboardPedalPed</sym> - (<sym>keyboardPedalPed</sym>) - - - - 1/2 - - - - - whole - - 45 - 17 - - - - -1/2 - - - - - -1/2 - - - - - - - half - down - - 53 - 13 - - - - half - down - - 55 - 15 - - - - - - - - whole - - 50 - 16 - - - - -1/2 - - - - 1 - <sym>keyboardPedalPed</sym> - (<sym>keyboardPedalPed</sym>) - - - - 1 - -1/2 - - - - - - - half - down - - 57 - 17 - - - - half - down - - 59 - 19 - - - - - - - - - - -1 - 1/2 - - - - - whole - - 48 - 14 - - - - - - - - - 2 - <sym>keyboardPedalPed</sym> - (<sym>keyboardPedalPed</sym>) - - - - -1 - 3/4 - - - - - whole - - 47 - 19 - - - - -1/2 - - - - 2 - 2 - - - - -1 - 1 - -1/4 - - - - - - - - - - 1 - 2 - - - - 1 - - - - - whole - - 45 - 17 - - - - - - - - - - -1 - - - - - whole - - 57 - 17 - - - - - - - - - 1 - <sym>keyboardPedalPed</sym> - (<sym>keyboardPedalPed</sym>) - - - - 1/1 - - - - - whole - - 55 - 15 - - - - end - - - - - -1/1 - - - - - - - - diff --git a/mtest/musicxml/io/testPedalStyles.xml b/mtest/musicxml/io/testPedalStyles.xml new file mode 100644 index 0000000000000..64e18be4d9223 --- /dev/null +++ b/mtest/musicxml/io/testPedalStyles.xml @@ -0,0 +1,1555 @@ + + + + + Pedal styles test + + + K. Rettinghaus + + MuseScore 0.7.0 + 2007-09-10 + + + + + + + + + + Piano + Pno. + + Piano + + + + 1 + 1 + 78.7402 + 0 + + + + + + + 1 + + 0 + + + 2 + + G + 2 + + + F + 4 + + + + + 1 + 1 + quarter + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + 3 + + + + + + 2 + + + + C + 2 + + 1 + 5 + quarter + up + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + 1 + 1 + quarter + 1 + + + 3 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + 1 + 5 + quarter + 2 + + + + + + 2 + + + + + + 1 + 1 + quarter + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + 3 + + + + + + 2 + + + + C + 2 + + 1 + 5 + quarter + up + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + 1 + 1 + quarter + 1 + + + 3 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + 1 + 5 + quarter + 2 + + + + + + 2 + + + + + + 1 + 1 + quarter + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + 3 + + + + + + 2 + + + + C + 2 + + 1 + 5 + quarter + up + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + 1 + 1 + quarter + 1 + + + 3 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + 1 + 5 + quarter + 2 + + + + + + 2 + + + + + + 1 + 1 + quarter + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + + A + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + F + 5 + + 1 + 1 + quarter + down + 1 + + + 3 + + + + + + 2 + + + + C + 2 + + 1 + 5 + quarter + up + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + A + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + F + 4 + + 1 + 5 + quarter + down + 2 + + + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + G + 4 + + 1 + 1 + quarter + down + 1 + + + + + + + + + + C + 5 + + 1 + 1 + quarter + down + 1 + + + + + E + 5 + + 1 + 1 + quarter + down + 1 + + + + 1 + 1 + quarter + 1 + + + 3 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + G + 3 + + 1 + 5 + quarter + down + 2 + + + + + + + + + + C + 4 + + 1 + 5 + quarter + down + 2 + + + + + E + 4 + + 1 + 5 + quarter + down + 2 + + + + 1 + 5 + quarter + 2 + + + + + + 2 + + + light-heavy + + + + diff --git a/mtest/musicxml/io/tst_mxml_io.cpp b/mtest/musicxml/io/tst_mxml_io.cpp index f4144c6e6052c..931eaaaeeeb9a 100644 --- a/mtest/musicxml/io/tst_mxml_io.cpp +++ b/mtest/musicxml/io/tst_mxml_io.cpp @@ -212,8 +212,9 @@ private slots: void numberedLyrics() { mxmlIoTestRef("testNumberedLyrics"); } void overlappingSpanners() { mxmlIoTest("testOverlappingSpanners"); } void partNames() { mxmlImportTestRef("testPartNames"); } - void pedalChanges() { mxmlImportTestRef("testPedalChanges"); } + void pedalChanges() { mxmlIoTest("testPedalChanges"); } void pedalChangesBroken() { mxmlImportTestRef("testPedalChangesBroken"); } + void pedalStyles() { mxmlIoTest("testPedalChanges"); } void placementDefaults() { mxmlImportTestRef("testPlacementDefaults"); } void printSpacingNo() { mxmlIoTestRef("testPrintSpacingNo"); } void repeatCounts() { mxmlIoTest("testRepeatCounts"); }