diff --git a/src/engraving/api/v1/apitypes.h b/src/engraving/api/v1/apitypes.h index b02c90824ccf3..dc7381089aaf4 100644 --- a/src/engraving/api/v1/apitypes.h +++ b/src/engraving/api/v1/apitypes.h @@ -1070,6 +1070,13 @@ enum class ClefType { TAB4_SERIF = int(mu::engraving::ClefType::TAB4_SERIF), C4_8VB = int(mu::engraving::ClefType::C4_8VB), G8_VB_C = int(mu::engraving::ClefType::G8_VB_C), + G_R = int(mu::engraving::ClefType::G_R), + C1_R = int(mu::engraving::ClefType::C1_R), + C2_R = int(mu::engraving::ClefType::C2_R), + C3_R = int(mu::engraving::ClefType::C3_R), + C4_R = int(mu::engraving::ClefType::C4_R), + C5_R = int(mu::engraving::ClefType::C4_R), + F_R = int(mu::engraving::ClefType::F_R), MAX = int(mu::engraving::ClefType::MAX), }; Q_ENUM_NS(ClefType); diff --git a/src/engraving/dom/clef.cpp b/src/engraving/dom/clef.cpp index 85f71b21c1ff9..64143c7b0e987 100644 --- a/src/engraving/dom/clef.cpp +++ b/src/engraving/dom/clef.cpp @@ -89,6 +89,20 @@ const ClefInfo ClefInfo::clefTable[] = { { ClefType::C4_8VB, 4, 30, { 6, 2, 5, 1, 4, 0, 3, 3, 0, 4, 1, 5, 2, 6 }, SymId::cClef8vb, StaffGroup::STANDARD }, { ClefType::G8_VB_C, 2, 38, { 0, 3, -1, 2, 5, 1, 4, 4, 1, 5, 2, 6, 3, 7 }, SymId::gClef8vbCClef, StaffGroup::STANDARD }, + { ClefType::G_R, 2, 45, { 0, 3, -1, 2, 5, 1, 4, 4, 1, 5, 2, 6, 3, 7 }, SymId::mensuralGclefPetrucci, + StaffGroup::STANDARD }, + { ClefType::C1_R, 1, 43, { 5, 1, 4, 0, 3, -1, 2, 2, 6, 3, 7, 4, 8, 5 }, SymId::mensuralCclefPetrucciPosLowest, + StaffGroup::STANDARD }, + { ClefType::C2_R, 2, 41, { 3, 6, 2, 5, 1, 4, 0, 0, 4, 1, 5, 2, 6, 3 }, SymId::mensuralCclefPetrucciPosLow, + StaffGroup::STANDARD }, + { ClefType::C3_R, 3, 39, { 1, 4, 0, 3, 6, 2, 5, 5, 2, 6, 3, 7, 4, 8 }, SymId::mensuralCclefPetrucciPosMiddle, + StaffGroup::STANDARD }, + { ClefType::C4_R, 4, 37, { 6, 2, 5, 1, 4, 0, 3, 3, 0, 4, 1, 5, 2, 6 }, SymId::mensuralCclefPetrucciPosHigh, + StaffGroup::STANDARD }, + { ClefType::C5_R, 5, 35, { 4, 0, 3, -1, 2, 5, 1, 1, 5, 2, 6, 3, 7, 4 }, SymId::mensuralCclefPetrucciPosHighest, + StaffGroup::STANDARD }, + { ClefType::F_R, 4, 33, { 2, 5, 1, 4, 7, 3, 6, 6, 3, 7, 4, 8, 5, 9 }, SymId::mensuralFclefPetrucci, + StaffGroup::STANDARD }, }; //--------------------------------------------------------- diff --git a/src/engraving/types/types.h b/src/engraving/types/types.h index a41fce96111d5..5ca68785fb2f0 100644 --- a/src/engraving/types/types.h +++ b/src/engraving/types/types.h @@ -596,6 +596,13 @@ enum class ClefType : signed char { // new clefs to be added between here C4_8VB, G8_VB_C, + G_R, + C1_R, + C2_R, + C3_R, + C4_R, + C5_R, + F_R, // and here in oder to not break TAB clef style MAX }; diff --git a/src/engraving/types/typesconv.cpp b/src/engraving/types/typesconv.cpp index a42688064cc0c..2134057770079 100644 --- a/src/engraving/types/typesconv.cpp +++ b/src/engraving/types/typesconv.cpp @@ -1308,6 +1308,13 @@ static const std::vector > CLEF_TYPES = { { ClefType::C4_8VB, "C4_8VB", muse::TranslatableString("engraving/cleftype", "Tenor clef 8va bassa") }, { ClefType::G8_VB_C, "G8vbc", muse::TranslatableString("engraving/cleftype", "G clef ottava bassa with C clef") }, + { ClefType::G_R, "G_R", muse::TranslatableString("engraving/cleftype", "Treble clef (Renaissance)") }, + { ClefType::C1_R, "C1_R", muse::TranslatableString("engraving/cleftype", "Soprano clef (Renaissance)") }, + { ClefType::C2_R, "C2_R", muse::TranslatableString("engraving/cleftype", "Mezzo-soprano clef (Renaissance)") }, + { ClefType::C3_R, "C3_R", muse::TranslatableString("engraving/cleftype", "Alto clef (Renaissance)") }, + { ClefType::C4_R, "C4_R", muse::TranslatableString("engraving/cleftype", "Tenor clef (Renaissance)") }, + { ClefType::C5_R, "C5_R", muse::TranslatableString("engraving/cleftype", "Baritone clef (Renaissance)") }, + { ClefType::F_R, "F_R", muse::TranslatableString("engraving/cleftype", "Bass clef (Renaissance)") }, }; const muse::TranslatableString& TConv::userName(ClefType v) diff --git a/src/importexport/mei/internal/meiconverter.cpp b/src/importexport/mei/internal/meiconverter.cpp index 2ab7197360d48..9b370813659d9 100644 --- a/src/importexport/mei/internal/meiconverter.cpp +++ b/src/importexport/mei/internal/meiconverter.cpp @@ -797,6 +797,48 @@ engraving::ClefType Convert::clefFromMEI(const libmei::Clef& meiClef, bool& warn default: break; } + } else if (meiClef.GetGlyphName() == "mensuralGclefPetrucci") { + switch (meiClef.GetLine()) { + case 2: return engraving::ClefType::G_R; + default: + break; + } + } else if (meiClef.GetGlyphName() == "mensuralCclefPetrucciPosLowest") { + switch (meiClef.GetLine()) { + case 1: return engraving::ClefType::C1_R; + default: + break; + } + } else if (meiClef.GetGlyphName() == "mensuralCclefPetrucciPosLow") { + switch (meiClef.GetLine()) { + case 2: return engraving::ClefType::C2_R; + default: + break; + } + } else if (meiClef.GetGlyphName() == "mensuralCclefPetrucciPosMiddle") { + switch (meiClef.GetLine()) { + case 3: return engraving::ClefType::C3_R; + default: + break; + } + } else if (meiClef.GetGlyphName() == "mensuralCclefPetrucciPosHigh") { + switch (meiClef.GetLine()) { + case 4: return engraving::ClefType::C4_R; + default: + break; + } + } else if (meiClef.GetGlyphName() == "mensuralCclefPetrucciPosHigest") { + switch (meiClef.GetLine()) { + case 5: return engraving::ClefType::C5_R; + default: + break; + } + } else if (meiClef.GetGlyphName() == "mensuralFclefPetrucci") { + switch (meiClef.GetLine()) { + case 4: return engraving::ClefType::F_R; + default: + break; + } } else { LOGD() << "Unsupported clef@glyph.name"; // try to find a proper replacement from other attributes @@ -910,16 +952,23 @@ libmei::Clef Convert::clefToMEI(engraving::ClefType clef) break; default: AsciiStringView glyphName = engraving::SymNames::nameForSymId(engraving::ClefInfo::symId(clef)); - meiClef.SetGlyphName(glyphName.ascii()); + const char* glyphNameAscii = glyphName.ascii(); + meiClef.SetGlyphName(glyphNameAscii); meiClef.SetGlyphAuth(SMUFL_AUTH); - switch (glyphName.at(0).unicode()) { - case 'c': + char16_t clefType = glyphName.at(0).unicode(); + if (!strncmp(glyphNameAscii, "mensural", 8)) { // "mensural[CGF]clefPetrucciPos..." and "mensural[CGF]clef" + clefType = tolower(glyphName.at(8).unicode()); + } else if (!strncmp(glyphNameAscii, "chant", 5)) { // "chant[CF]clef" + clefType = tolower(glyphName.at(5).unicode()); + } + switch (clefType) { + case u'c': meiClef.SetShape(libmei::CLEFSHAPE_C); break; - case 'f': + case u'f': meiClef.SetShape(libmei::CLEFSHAPE_F); break; - case 'g': + case u'g': meiClef.SetShape(libmei::CLEFSHAPE_G); break; default: diff --git a/src/importexport/musicxml/internal/export/exportmusicxml.cpp b/src/importexport/musicxml/internal/export/exportmusicxml.cpp index 03b76f8ca6d86..4c4129facfeb5 100644 --- a/src/importexport/musicxml/internal/export/exportmusicxml.cpp +++ b/src/importexport/musicxml/internal/export/exportmusicxml.cpp @@ -2639,6 +2639,13 @@ static const std::vector CLEF_INFOS = { { ClefType::C4_8VB, "C", -1 }, { ClefType::G8_VB_C, "G", -1 }, + { ClefType::G_R, "G", -1 }, + { ClefType::C1_R, "C", -1 }, + { ClefType::C2_R, "C", -1 }, + { ClefType::C3_R, "C", -1 }, + { ClefType::C4_R, "C", -1 }, + { ClefType::C5_R, "C", -1 }, + { ClefType::F_R, "F", -1 }, }; static const MusicXmlClefInfo findClefInfoByType(const ClefType& v) diff --git a/src/palette/internal/palettecreator.cpp b/src/palette/internal/palettecreator.cpp index da30ca29a3197..2a6fb3d6144c0 100644 --- a/src/palette/internal/palettecreator.cpp +++ b/src/palette/internal/palettecreator.cpp @@ -1074,8 +1074,8 @@ PalettePtr PaletteCreator::newClefsPalette(bool defaultPalette) ClefType::C1_F20C, ClefType::C3_F20C, ClefType::C4_F20C, ClefType::F, ClefType::F_8VA, ClefType::F_15MA, ClefType::F8_VB, ClefType::F15_MB, ClefType::F_B, ClefType::F_C, ClefType::F_F18C, ClefType::F_19C, - ClefType::PERC, - ClefType::PERC2, ClefType::TAB, ClefType::TAB4, ClefType::TAB_SERIF, ClefType::TAB4_SERIF + ClefType::G_R, ClefType::C1_R, ClefType::C2_R, ClefType::C3_R, ClefType::C4_R, ClefType::C5_R, ClefType::F_R, + ClefType::PERC, ClefType::PERC2, ClefType::TAB, ClefType::TAB4, ClefType::TAB_SERIF, ClefType::TAB4_SERIF }; for (ClefType clefType : defaultPalette ? clefsDefault : clefsMaster) {