From cc37d7ccad2f3abca35b92ff522a7ec8a6616b51 Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Tue, 7 Dec 2021 14:42:34 +0100 Subject: [PATCH] Fix #306189: Extend Tremolo palette to allow for "Divide measured tremolo by [2-4.6]", `tremoloDivisiDots[2-4,6]`, implemented as articulations, actually even as staccatos, but (currently) without any playback effect on tremolos (as 'normal' staccatos don't work on those either). Backport of #10000 --- fonttools/smufl2sym-in-trans.json | 4 ++++ importexport/musicxml/exportxml.cpp | 4 ++++ libmscore/articulation.cpp | 14 +++++++++++++- libmscore/sym.cpp | 8 ++++---- mscore/menus.cpp | 22 ++++++++++++++++------ 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/fonttools/smufl2sym-in-trans.json b/fonttools/smufl2sym-in-trans.json index 52a87f8c784d2..ea166db612394 100644 --- a/fonttools/smufl2sym-in-trans.json +++ b/fonttools/smufl2sym-in-trans.json @@ -353,6 +353,10 @@ "timeSigCut2": null, "timeSigCut3": null, "timeSigCutCommon": null, + "tremoloDivisiDots2": null, + "tremoloDivisiDots3": null, + "tremoloDivisiDots4": null, + "tremoloDivisiDots6": null, "wiggleSawtooth": null, "wiggleSawtoothWide": null, "wiggleVibratoLargeFaster": null, diff --git a/importexport/musicxml/exportxml.cpp b/importexport/musicxml/exportxml.cpp index 99695b802a07d..f77071bc6a4a6 100644 --- a/importexport/musicxml/exportxml.cpp +++ b/importexport/musicxml/exportxml.cpp @@ -2496,6 +2496,10 @@ static std::vector symIdToArtics(const SymId sid) case SymId::articStaccatoAbove: case SymId::articStaccatoBelow: + case SymId::tremoloDivisiDots2: + case SymId::tremoloDivisiDots3: + case SymId::tremoloDivisiDots4: + case SymId::tremoloDivisiDots6: return { "staccato" }; break; diff --git a/libmscore/articulation.cpp b/libmscore/articulation.cpp index 33d1ff700c05e..e59a74096e42e 100644 --- a/libmscore/articulation.cpp +++ b/libmscore/articulation.cpp @@ -434,6 +434,12 @@ Articulation::AnchorGroup Articulation::anchorGroup(SymId symId) case SymId::luteFingeringRHThird: return AnchorGroup::LUTE_FINGERING; + case SymId::tremoloDivisiDots2: + case SymId::tremoloDivisiDots3: + case SymId::tremoloDivisiDots4: + case SymId::tremoloDivisiDots6: + return AnchorGroup::ARTICULATION; + default: break; } @@ -457,6 +463,10 @@ const char* Articulation::symId2ArticulationName(SymId symId) case SymId::articStaccatoAbove: case SymId::articStaccatoBelow: + case SymId::tremoloDivisiDots2: + case SymId::tremoloDivisiDots3: + case SymId::tremoloDivisiDots4: + case SymId::tremoloDivisiDots6: return "staccato"; case SymId::articAccentStaccatoAbove: @@ -590,7 +600,9 @@ bool Articulation::isStaccato() const { return _symId == SymId::articStaccatoAbove || _symId == SymId::articStaccatoBelow || _symId == SymId::articMarcatoStaccatoAbove || _symId == SymId::articMarcatoStaccatoBelow - || _symId == SymId::articAccentStaccatoAbove || _symId == SymId::articAccentStaccatoBelow; + || _symId == SymId::articAccentStaccatoAbove || _symId == SymId::articAccentStaccatoBelow + || _symId == SymId::tremoloDivisiDots2 || _symId == SymId::tremoloDivisiDots3 + || _symId == SymId::tremoloDivisiDots4 || _symId == SymId::tremoloDivisiDots6; } bool Articulation::isAccent() const diff --git a/libmscore/sym.cpp b/libmscore/sym.cpp index 076d560e1c6bc..1b1a0373c774d 100644 --- a/libmscore/sym.cpp +++ b/libmscore/sym.cpp @@ -5824,10 +5824,10 @@ const std::array Sym::symUserNames = { { "Combining tremolo 3", "Combining tremolo 4", "Combining tremolo 5", - "Divide measured tremolo by 2", - "Divide measured tremolo by 3", - "Divide measured tremolo by 4", - "Divide measured tremolo by 6", + QT_TRANSLATE_NOOP("symUserNames", "Divide measured tremolo by 2"), + QT_TRANSLATE_NOOP("symUserNames", "Divide measured tremolo by 3"), + QT_TRANSLATE_NOOP("symUserNames", "Divide measured tremolo by 4"), + QT_TRANSLATE_NOOP("symUserNames", "Divide measured tremolo by 6"), "Fingered tremolo 1", "Fingered tremolo 2", "Fingered tremolo 3", diff --git a/mscore/menus.cpp b/mscore/menus.cpp index 0d42b13c1561b..2dca1f56ecc4f 100644 --- a/mscore/menus.cpp +++ b/mscore/menus.cpp @@ -856,6 +856,18 @@ PalettePanel* MuseScore::newTremoloPalettePanel() tremolo->setTremoloType(TremoloType(i)); sp->append(tremolo, tremolo->subtypeName()); } + + static const std::vector dots { + SymId::tremoloDivisiDots2, + SymId::tremoloDivisiDots3, + SymId::tremoloDivisiDots4, + SymId::tremoloDivisiDots6 + }; + // include additional symbol-based tremolo articulations implemented as articulations + for (auto i : dots) { + Articulation* s = new Articulation(i, gscore); + sp->append(s, s->userName()); + } return sp; } @@ -901,7 +913,6 @@ PalettePanel* MuseScore::newArticulationsPalettePanel() sp->setGrid(42, 25); sp->setDrawGrid(true); - // do not include additional symbol-based fingerings (temporarily?) implemented as articulations static const std::vector fermatas { SymId::fermataAbove, SymId::fermataShortAbove, @@ -915,6 +926,7 @@ PalettePanel* MuseScore::newArticulationsPalettePanel() Fermata* f = new Fermata(i, gscore); sp->append(f, f->userName()); } + // do not include additional symbol-based fingerings (temporarily?) implemented as articulations static const std::vector art { SymId::articAccentAbove, SymId::articStaccatoAbove, @@ -986,7 +998,6 @@ PalettePanel* MuseScore::newOrnamentsPalettePanel() sp->setGrid(42, 25); sp->setDrawGrid(true); - // do not include additional symbol-based fingerings (temporarily?) implemented as articulations static const std::vector art { SymId::ornamentTurnInverted, SymId::ornamentTurnSlash, @@ -1023,8 +1034,7 @@ PalettePanel* MuseScore::newAccordionPalettePanel() sp->setGrid(42, 25); sp->setDrawGrid(true); - // do not include additional symbol-based fingerings (temporarily?) implemented as articulations - static std::vector art { + static const std::vector art { SymId::accdnCombDot, SymId::accdnCombLH2RanksEmpty, SymId::accdnCombLH3RanksEmptySquare, @@ -1218,14 +1228,14 @@ PalettePanel* MuseScore::newClefsPalettePanel(bool defaultPalettePanel) sp->setGrid(35, 50); sp->setYOffset(1.0); - static std::vector clefsDefault { + static const std::vector clefsDefault { ClefType::G, ClefType::G8_VA, ClefType::G15_MA, ClefType::G8_VB, ClefType::G15_MB, ClefType::G8_VB_O, ClefType::G8_VB_P, ClefType::G_1, ClefType::C1, ClefType::C2, ClefType::C3, ClefType::C4, ClefType::C5, ClefType::F, ClefType::F_8VA, ClefType::F_15MA, ClefType::F8_VB, ClefType::F15_MB, ClefType::F_B, ClefType::F_C, ClefType::PERC, ClefType::PERC2, ClefType::TAB, ClefType::TAB4 }; - static std::vector clefsMaster { + static const std::vector clefsMaster { ClefType::G, ClefType::G8_VA, ClefType::G15_MA, ClefType::G8_VB, ClefType::G15_MB, ClefType::G8_VB_O, ClefType::G8_VB_P, ClefType::G_1, ClefType::C1, ClefType::C2, ClefType::C3, ClefType::C4, ClefType::C5, ClefType::C_19C, ClefType::C1_F18C, ClefType::C3_F18C, ClefType::C4_F18C, ClefType::C1_F20C, ClefType::C3_F20C, ClefType::C4_F20C,