Skip to content

[MEI] improve import of brackets #28381

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 57 additions & 50 deletions src/importexport/mei/internal/meiconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -571,56 +571,6 @@ int Convert::breaksecToMEI(engraving::BeamMode beamMode)
return breaksec;
}

Convert::BracketStruct Convert::bracketFromMEI(const libmei::StaffGrp& meiStaffGrp)
{
Convert::BracketStruct bracketSt;

switch (meiStaffGrp.GetSymbol()) {
case (libmei::staffGroupingSym_SYMBOL_bracket): bracketSt.bracketType = engraving::BracketType::NORMAL;
break;
case (libmei::staffGroupingSym_SYMBOL_brace): bracketSt.bracketType = engraving::BracketType::BRACE;
break;
case (libmei::staffGroupingSym_SYMBOL_bracketsq): bracketSt.bracketType = engraving::BracketType::SQUARE;
break;
case (libmei::staffGroupingSym_SYMBOL_line): bracketSt.bracketType = engraving::BracketType::LINE;
break;
case (libmei::staffGroupingSym_SYMBOL_none): bracketSt.bracketType = engraving::BracketType::NO_BRACKET;
break;
default: break;
}

if (meiStaffGrp.HasBarThru() && meiStaffGrp.GetBarThru() == libmei::BOOLEAN_true) {
bracketSt.barLineSpan = 1;
}

return bracketSt;
}

libmei::StaffGrp Convert::bracketToMEI(const engraving::BracketType bracket, int barLineSpan)
{
libmei::StaffGrp meiStaffGrp;
// @symbol
switch (bracket) {
case (engraving::BracketType::NORMAL): meiStaffGrp.SetSymbol(libmei::staffGroupingSym_SYMBOL_bracket);
break;
case (engraving::BracketType::BRACE): meiStaffGrp.SetSymbol(libmei::staffGroupingSym_SYMBOL_brace);
break;
case (engraving::BracketType::SQUARE): meiStaffGrp.SetSymbol(libmei::staffGroupingSym_SYMBOL_bracketsq);
break;
case (engraving::BracketType::LINE): meiStaffGrp.SetSymbol(libmei::staffGroupingSym_SYMBOL_line);
break;
case (engraving::BracketType::NO_BRACKET): meiStaffGrp.SetSymbol(libmei::staffGroupingSym_SYMBOL_none);
break;
default: break;
}
// @bar.thru
if (barLineSpan > 0) {
meiStaffGrp.SetBarThru(libmei::BOOLEAN_true);
}

return meiStaffGrp;
}

void Convert::breathFromMEI(engraving::Breath* breath, const libmei::Breath& meiBreath, bool& warning)
{
warning = false;
Expand Down Expand Up @@ -2936,6 +2886,34 @@ libmei::StaffDef Convert::staffToMEI(const engraving::Staff* staff)
return meiStaffDef;
}

Convert::BracketStruct Convert::staffGrpFromMEI(const libmei::StaffGrp& meiStaffGrp)
{
Convert::BracketStruct bracketSt;

bracketSt.bracketType = symbolFromMEI(meiStaffGrp.GetSymbol());

if (meiStaffGrp.HasBarThru() && meiStaffGrp.GetBarThru() == libmei::BOOLEAN_true) {
bracketSt.barLineSpan = 1;
}

return bracketSt;
}

libmei::StaffGrp Convert::staffGrpToMEI(const engraving::BracketType bracket, int barLineSpan)
{
libmei::StaffGrp meiStaffGrp;

// @symbol
meiStaffGrp.SetSymbol(symbolToMEI(bracket));

// @bar.thru
if (barLineSpan > 0) {
meiStaffGrp.SetBarThru(libmei::BOOLEAN_true);
}

return meiStaffGrp;
}

std::pair<engraving::DirectionV, bool> Convert::stemFromMEI(const libmei::AttStems& meiStemsAtt, bool& warning)
{
warning = false;
Expand Down Expand Up @@ -3084,6 +3062,35 @@ libmei::Syl Convert::sylToMEI(const engraving::Lyrics* lyrics, ElisionType elisi
return meiSyl;
}

engraving::BracketType Convert::symbolFromMEI(const libmei::staffGroupingSym_SYMBOL meiGrpSym)
{
switch (meiGrpSym) {
case (libmei::staffGroupingSym_SYMBOL_bracket): return engraving::BracketType::NORMAL;
case (libmei::staffGroupingSym_SYMBOL_brace): return engraving::BracketType::BRACE;
case (libmei::staffGroupingSym_SYMBOL_bracketsq): return engraving::BracketType::SQUARE;
case (libmei::staffGroupingSym_SYMBOL_line): return engraving::BracketType::LINE;
case (libmei::staffGroupingSym_SYMBOL_none): return engraving::BracketType::NO_BRACKET;
default: return engraving::BracketType::NO_BRACKET;
}
}

libmei::staffGroupingSym_SYMBOL Convert::symbolToMEI(const engraving::BracketType bracket)
{
switch (bracket) {
case (engraving::BracketType::NORMAL): return libmei::staffGroupingSym_SYMBOL_bracket;
break;
case (engraving::BracketType::BRACE): return libmei::staffGroupingSym_SYMBOL_brace;
break;
case (engraving::BracketType::SQUARE): return libmei::staffGroupingSym_SYMBOL_bracketsq;
break;
case (engraving::BracketType::LINE): return libmei::staffGroupingSym_SYMBOL_line;
break;
case (engraving::BracketType::NO_BRACKET): return libmei::staffGroupingSym_SYMBOL_none;
break;
default: return libmei::staffGroupingSym_SYMBOL_NONE;
}
}

void Convert::tempoFromMEI(engraving::TempoText* tempoText, const StringList& meiLines, const libmei::Tempo& meiTempo, bool& warning)
{
IF_ASSERT_FAILED(tempoText) {
Expand Down
9 changes: 6 additions & 3 deletions src/importexport/mei/internal/meiconverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,6 @@ class Convert
static engraving::BeamMode breaksecFromMEI(int breaksec, bool& warning);
static int breaksecToMEI(engraving::BeamMode beamMode);

static BracketStruct bracketFromMEI(const libmei::StaffGrp& meiStaffGrp);
static libmei::StaffGrp bracketToMEI(const engraving::BracketType, int barLineSpan);

static void breathFromMEI(engraving::Breath* breath, const libmei::Breath& meiBreath, bool& warning);
static libmei::Breath breathToMEI(const engraving::Breath* breath);

Expand Down Expand Up @@ -297,6 +294,9 @@ class Convert
static StaffStruct staffFromMEI(const libmei::StaffDef& meiStaffDef, bool& warning);
static libmei::StaffDef staffToMEI(const engraving::Staff* staff);

static BracketStruct staffGrpFromMEI(const libmei::StaffGrp& meiStaffGrp);
static libmei::StaffGrp staffGrpToMEI(const engraving::BracketType, int barLineSpan);

static void staffIdentToMEI(const engraving::EngravingItem* item, libmei::Element& meiElement);

static std::pair<engraving::DirectionV, bool> stemFromMEI(const libmei::AttStems& meiStemsAtt, bool& warning);
Expand All @@ -308,6 +308,9 @@ class Convert
static void sylFromMEI(engraving::Lyrics* lyrics, const libmei::Syl& meiSyl, ElisionType elision, bool& warning);
static libmei::Syl sylToMEI(const engraving::Lyrics* lyrics, ElisionType elision);

static engraving::BracketType symbolFromMEI(const libmei::staffGroupingSym_SYMBOL meiGrpSym);
static libmei::staffGroupingSym_SYMBOL symbolToMEI(const engraving::BracketType bracket);

static void tempoFromMEI(engraving::TempoText* tempo, const muse::StringList& meiLines, const libmei::Tempo& meiTempo, bool& warning);
static libmei::Tempo tempoToMEI(const engraving::TempoText* tempoText, muse::StringList& meiLines);

Expand Down
2 changes: 1 addition & 1 deletion src/importexport/mei/internal/meiexporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,7 @@ bool MeiExporter::writeStaffGrpStart(const Staff* staff, std::vector<int>& ends,

for (size_t j = 0; j < staff->bracketLevels() + 1; j++) {
if (staff->bracketType(j) != BracketType::NO_BRACKET) {
libmei::StaffGrp meiStaffGrp = Convert::bracketToMEI(staff->bracketType(j), staff->barLineSpan());
libmei::StaffGrp meiStaffGrp = Convert::staffGrpToMEI(staff->bracketType(j), staff->barLineSpan());
// mark at which staff we will need to close the staffGrp
int end = static_cast<int>(staff->idx() + staff->bracketSpan(j)) - 1;
// Something is wrong, maybe a staff was delete in the MuseScore file?
Expand Down
8 changes: 7 additions & 1 deletion src/importexport/mei/internal/meiimporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1283,7 +1283,13 @@ bool MeiImporter::readStaffGrps(pugi::xml_node parentNode, int& staffSpan, int c
Staff* staff = m_score->staff(idx);
libmei::StaffGrp meiStaffGrp;
meiStaffGrp.Read(child.node());
Convert::BracketStruct bracketSt = Convert::bracketFromMEI(meiStaffGrp);
Convert::BracketStruct bracketSt = Convert::staffGrpFromMEI(meiStaffGrp);
if (!meiStaffGrp.HasSymbol()) {
bracketSt.bracketType = Convert::symbolFromMEI(
meiStaffGrp.AttStaffGroupingSym::StrToStaffGroupingSymSymbol(
child.node().child("grpSym").attribute("symbol").value()));
}

staff->setBracketType(column, bracketSt.bracketType);

int childStaffSpan = 0;
Expand Down
Loading