diff --git a/src/engraving/dom/barline.h b/src/engraving/dom/barline.h index fc6b2f81b6026..a3cac986f92fc 100644 --- a/src/engraving/dom/barline.h +++ b/src/engraving/dom/barline.h @@ -104,11 +104,11 @@ class BarLine final : public EngravingItem Segment* segment() const { return toSegment(explicitParent()); } Measure* measure() const { return explicitParent() ? toMeasure(explicitParent()->explicitParent()) : nullptr; } - void setSpanStaff(int val) { m_spanStaff = val; } + void setSpanStaff(const bool val) { m_spanStaff = val; } void setSpanFrom(int val) { m_spanFrom = val; } void setSpanTo(int val) { m_spanTo = val; } void setShowTips(bool val); - int spanStaff() const { return m_spanStaff; } + bool spanStaff() const { return m_spanStaff; } int spanFrom() const { return m_spanFrom; } int spanTo() const { return m_spanTo; } bool showTips() const; @@ -176,7 +176,7 @@ class BarLine final : public EngravingItem BarLine(Segment* parent); BarLine(const BarLine&); - int m_spanStaff = 0; // span barline to next staff if true, values > 1 are used for importing from 2.x + bool m_spanStaff = false; // span barline to next staff if true int m_spanFrom = 0; // line number on start and end staves int m_spanTo = 0; BarLineType m_barLineType = BarLineType::NORMAL; diff --git a/src/engraving/dom/excerpt.cpp b/src/engraving/dom/excerpt.cpp index 9db0490f8ce9c..fb5c3d3cfcfa0 100644 --- a/src/engraving/dom/excerpt.cpp +++ b/src/engraving/dom/excerpt.cpp @@ -22,8 +22,6 @@ #include "excerpt.h" -#include - #include "containers.h" #include "dom/partialtie.h" @@ -36,7 +34,6 @@ #include "factory.h" #include "guitarbend.h" #include "harmony.h" -#include "laissezvib.h" #include "layoutbreak.h" #include "linkedobjects.h" #include "lyrics.h" @@ -49,7 +46,6 @@ #include "rest.h" #include "score.h" #include "segment.h" -#include "sig.h" #include "staff.h" #include "stafftype.h" #include "system.h" @@ -991,38 +987,6 @@ static MeasureBase* cloneMeasure(MeasureBase* mb, Score* score, const Score* osc } EngravingItem* oe = oseg->element(srcTrack); - int adjustedBarlineSpan = 0; - if (srcTrack % VOICES == 0 && oseg->segmentType() == SegmentType::BarLine) { - // mid-measure barline segment - // may need to clone barline from a previous staff and/or adjust span - int oIdx = static_cast(srcTrack / VOICES); - if (!oe) { - // no barline on this staff in original score, - // but check previous staves - for (int i = oIdx - 1; i >= 0; --i) { - oe = oseg->element(i * VOICES); - if (oe) { - break; - } - } - } - if (oe) { - // barline found, now check span - BarLine* bl = toBarLine(oe); - int oSpan1 = static_cast(bl->staff()->idx()); - int oSpan2 = static_cast(oSpan1 + bl->spanStaff()); - if (oSpan1 <= oIdx && oIdx <= oSpan2) { - // this staff is within span - // calculate adjusted span for excerpt - int oSpan = oSpan2 - oIdx; - adjustedBarlineSpan = std::min(oSpan, static_cast(score->nstaves())); - } else { - // this staff is not within span - oe = nullptr; - } - } - } - bool clone = oe && !oe->generated() && !oe->excludeFromOtherParts(); if (clone) { @@ -1036,12 +1000,7 @@ static MeasureBase* cloneMeasure(MeasureBase* mb, Score* score, const Score* osc } ne->setScore(score); - if (oe->isBarLine()) { - BarLine* nbl = toBarLine(ne); - if (adjustedBarlineSpan) { - nbl->setSpanStaff(adjustedBarlineSpan); - } - } else if (oe->isChordRest()) { + if (oe->isChordRest()) { ChordRest* ocr = toChordRest(oe); ChordRest* ncr = toChordRest(ne); diff --git a/src/engraving/dom/instrtemplate.cpp b/src/engraving/dom/instrtemplate.cpp index 77d740fbff0f7..9f131ff1f25ce 100644 --- a/src/engraving/dom/instrtemplate.cpp +++ b/src/engraving/dom/instrtemplate.cpp @@ -210,7 +210,6 @@ InstrumentTemplate::InstrumentTemplate() smallStaff[i] = false; bracket[i] = BracketType::NO_BRACKET; bracketSpan[i] = 0; - barlineSpan[i] = false; } transpose.diatonic = 0; transpose.chromatic = 0; @@ -255,6 +254,7 @@ void InstrumentTemplate::init(const InstrumentTemplate& t) trait = t.trait; groupId = t.groupId; glissandoStyle = t.glissandoStyle; + barlineSpan = t.barlineSpan; for (int i = 0; i < MAX_STAVES; ++i) { clefTypes[i] = t.clefTypes[i]; @@ -262,7 +262,6 @@ void InstrumentTemplate::init(const InstrumentTemplate& t) smallStaff[i] = t.smallStaff[i]; bracket[i] = t.bracket[i]; bracketSpan[i] = t.bracketSpan[i]; - barlineSpan[i] = t.barlineSpan[i]; } } @@ -356,10 +355,10 @@ void InstrumentTemplate::write(XmlWriter& xml) const } } if (barlineSpan[i]) { - if (i) { - xml.tag("barlineSpan", { { "staff", i + 1 } }, barlineSpan[i]); + if (i > 0) { + xml.tag("barlineSpan", { { "staff", i + 1 } }, int { barlineSpan[i] }); } else { - xml.tag("barlineSpan", barlineSpan[i]); + xml.tag("barlineSpan", int { barlineSpan[i] }); } } } diff --git a/src/engraving/dom/instrtemplate.h b/src/engraving/dom/instrtemplate.h index a93f9ef3b1ec3..a42634f3dfd60 100644 --- a/src/engraving/dom/instrtemplate.h +++ b/src/engraving/dom/instrtemplate.h @@ -19,10 +19,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#pragma once -#ifndef MU_ENGRAVING_INSTRTEMPLATE_H -#define MU_ENGRAVING_INSTRTEMPLATE_H - +#include #include #include "io/path.h" @@ -119,7 +118,7 @@ class InstrumentTemplate int staffLines[MAX_STAVES]; BracketType bracket[MAX_STAVES]; // bracket type (NO_BRACKET) int bracketSpan[MAX_STAVES]; - int barlineSpan[MAX_STAVES]; + std::array barlineSpan{}; bool smallStaff[MAX_STAVES]; bool extended = false; // belongs to extended instrument set if true @@ -193,4 +192,3 @@ extern void addTemplateToGroup(const InstrumentTemplate* templ, const String& gr extern ClefType defaultClef(int patch); } // namespace mu::engraving -#endif diff --git a/src/engraving/dom/score.cpp b/src/engraving/dom/score.cpp index cdf07ed490f6a..f047cf5e806fe 100644 --- a/src/engraving/dom/score.cpp +++ b/src/engraving/dom/score.cpp @@ -4043,9 +4043,7 @@ void Score::updateBracesAndBarlines(Part* part, size_t newIndex) auto updateBracketSpan = [this, part](size_t modIndex, size_t refIndex) { Staff* modStaff = staff(part->staves()[modIndex]->idx()); Staff* refStaff = staff(part->staves()[refIndex]->idx()); - if (modStaff->getProperty(Pid::STAFF_BARLINE_SPAN) != refStaff->getProperty(Pid::STAFF_BARLINE_SPAN)) { - modStaff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, refStaff->getProperty(Pid::STAFF_BARLINE_SPAN)); - } + modStaff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, refStaff->getProperty(Pid::STAFF_BARLINE_SPAN)); }; if (newIndex >= 2) { @@ -4055,8 +4053,9 @@ void Score::updateBracesAndBarlines(Part* part, size_t newIndex) if (part->nstaves() == 2) { const InstrumentTemplate* tp = searchTemplate(part->instrumentId()); if (tp) { - if (tp->barlineSpan[0] > 0) { - staff(part->staves()[0]->idx())->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, tp->barlineSpan[0]); + const bool firstStaffBarLineSpan = tp->barlineSpan[0]; + if (firstStaffBarLineSpan) { + staff(part->staff(0)->idx())->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, firstStaffBarLineSpan); } if (noBracesFound && (tp->bracket[0] != BracketType::NO_BRACKET)) { undoAddBracket(part->staves()[0], 0, tp->bracket[0], part->nstaves()); @@ -4145,8 +4144,8 @@ void Score::remapBracketsAndBarlines() // Look in the masterScore for all the staves spanned by a common barline. // If at least one of them is also in this score, then connect it through. bool extendBarline = false; - int span = masterStaff->barLineSpan(); - while (!extendBarline && span > 0 && masterStaff->idx() + 1 < master->nstaves()) { + bool span = masterStaff->barLineSpan(); + while (!extendBarline && span && masterStaff->idx() + 1 < master->nstaves()) { masterStaff = masterScore()->staff(masterStaff->idx() + 1); span = masterStaff->barLineSpan(); if (masterStaff->findLinkedInScore(this)) { @@ -4155,7 +4154,7 @@ void Score::remapBracketsAndBarlines() } } if (extendBarline) { - staff->setBarLineSpan(1); + staff->setBarLineSpan(true); } } } diff --git a/src/engraving/dom/scoreorder.cpp b/src/engraving/dom/scoreorder.cpp index aa6d71695b7f0..7aac987a307dd 100644 --- a/src/engraving/dom/scoreorder.cpp +++ b/src/engraving/dom/scoreorder.cpp @@ -423,7 +423,7 @@ void ScoreOrder::setBracketsAndBarlines(Score* score) } } if (!braceSpan) { - staff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, 0); + staff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, false); } else { --braceSpan; } @@ -462,11 +462,8 @@ void ScoreOrder::setBracketsAndBarlines(Score* score) thnBracketSpan += static_cast(part->nstaves()); } if (prvStaff) { - bool oldBarlineSpan = prvStaff->getProperty(Pid::STAFF_BARLINE_SPAN).toBool(); - bool newBarlineSpan = prvBarLineSpan && (!prvSection.isEmpty() && (sg.section == prvSection)); - if (oldBarlineSpan != newBarlineSpan) { - prvStaff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, newBarlineSpan); - } + const bool newBarlineSpan = prvBarLineSpan && (!prvSection.isEmpty() && (sg.section == prvSection)); + prvStaff->undoChangeProperty(Pid::STAFF_BARLINE_SPAN, newBarlineSpan); } prvStaff = staff; ++staffIdx; diff --git a/src/engraving/dom/staff.cpp b/src/engraving/dom/staff.cpp index 059d48a6f58e0..93eae54a485d7 100644 --- a/src/engraving/dom/staff.cpp +++ b/src/engraving/dom/staff.cpp @@ -1627,7 +1627,7 @@ bool Staff::setProperty(Pid id, const PropertyValue& v) setPlaybackVoice(3, v.toBool()); break; case Pid::STAFF_BARLINE_SPAN: { - setBarLineSpan(v.toInt()); + setBarLineSpan(v.toBool()); // update non-generated barlines track_idx_t track = idx() * VOICES; std::vector blList; @@ -1645,7 +1645,7 @@ bool Staff::setProperty(Pid id, const PropertyValue& v) } for (EngravingItem* e : blList) { if (e && e->isBarLine() && !e->generated()) { - toBarLine(e)->setSpanStaff(v.toInt()); + toBarLine(e)->setSpanStaff(barLineSpan()); } } } diff --git a/src/engraving/dom/staff.h b/src/engraving/dom/staff.h index f884c745e082a..38d71f1227f98 100644 --- a/src/engraving/dom/staff.h +++ b/src/engraving/dom/staff.h @@ -145,10 +145,10 @@ class Staff final : public EngravingItem void setMergeMatchingRests(AutoOnOff val) { m_mergeMatchingRests = val; } bool shouldMergeMatchingRests() const; - int barLineSpan() const { return m_barLineSpan; } + bool barLineSpan() const { return m_barLineSpan; } int barLineFrom() const { return m_barLineFrom; } int barLineTo() const { return m_barLineTo; } - void setBarLineSpan(int val) { m_barLineSpan = val; } + void setBarLineSpan(const bool val) { m_barLineSpan = val; } void setBarLineFrom(int val) { m_barLineFrom = val; } void setBarLineTo(int val) { m_barLineTo = val; } double staffHeight() const; @@ -293,7 +293,7 @@ class Staff final : public EngravingItem std::map m_timesigs; std::vector m_brackets; - int m_barLineSpan = false; // true - span barline to next staff + bool m_barLineSpan = false; // true - span barline to next staff int m_barLineFrom = 0; // line of start staff to draw the barline from (0 = staff top line, ...) int m_barLineTo = 0; // line of end staff to draw the bar line to (0= staff bottom line, ...) diff --git a/src/engraving/rendering/score/dynamicslayout.cpp b/src/engraving/rendering/score/dynamicslayout.cpp index 788d3883e9c48..9d6eaecc4c106 100644 --- a/src/engraving/rendering/score/dynamicslayout.cpp +++ b/src/engraving/rendering/score/dynamicslayout.cpp @@ -188,7 +188,7 @@ void DynamicsLayout::manageBarlineCollisions(const Dynamic* item, TextBase::Layo return; } - if (item->score()->staff(barLineStaff)->barLineSpan() < 1) { + if (!item->score()->staff(barLineStaff)->barLineSpan()) { return; // Barline doesn't extend through staves } diff --git a/src/engraving/rendering/score/horizontalspacing.cpp b/src/engraving/rendering/score/horizontalspacing.cpp index a8741cb7cbf0d..5015925754579 100644 --- a/src/engraving/rendering/score/horizontalspacing.cpp +++ b/src/engraving/rendering/score/horizontalspacing.cpp @@ -556,7 +556,7 @@ double HorizontalSpacing::spaceLyricsAgainstBarlines(Segment* firstSeg, Segment* } BarLine* barline = toBarLine(barlineSegment->element(staff2track(staffIdx))); - if (!barline || barline->spanStaff() == 0) { + if (!barline || !barline->spanStaff()) { continue; } diff --git a/src/engraving/rendering/score/masklayout.cpp b/src/engraving/rendering/score/masklayout.cpp index daf30f00d4e69..7096d43ece99d 100644 --- a/src/engraving/rendering/score/masklayout.cpp +++ b/src/engraving/rendering/score/masklayout.cpp @@ -84,7 +84,7 @@ void MaskLayout::computeBarlineMasks(const Segment* barlineSement, const System* continue; } BarLine* barline = toBarLine(barlineSement->element(staff2track(staffIdx))); - if (!barline || barline->spanStaff() == 0) { + if (!barline || !barline->spanStaff()) { continue; } maskBarlineForText(barline, allSystemText); diff --git a/src/engraving/rendering/score/measurenumberlayout.cpp b/src/engraving/rendering/score/measurenumberlayout.cpp index 2ee42a2ad3b22..1fccf45dc4aea 100644 --- a/src/engraving/rendering/score/measurenumberlayout.cpp +++ b/src/engraving/rendering/score/measurenumberlayout.cpp @@ -195,7 +195,7 @@ void MeasureNumberLayout::checkBarlineCollisions(const MeasureNumber* item, cons } const double minBarLineDistance = 0.25 * item->spatium(); - if (!barlineSeg || (barlineSeg->segmentType() != SegmentType::BeginBarLine && item->score()->staff(barlineStaff)->barLineSpan() < 1)) { + if (!barlineSeg || (barlineSeg->segmentType() != SegmentType::BeginBarLine && !item->score()->staff(barlineStaff)->barLineSpan())) { return; } diff --git a/src/engraving/rw/read114/read114.cpp b/src/engraving/rw/read114/read114.cpp index c78f0f54d8a71..1b7c4cc682404 100644 --- a/src/engraving/rw/read114/read114.cpp +++ b/src/engraving/rw/read114/read114.cpp @@ -1523,7 +1523,7 @@ static void readMeasure(Measure* m, int staffIdx, XmlReader& e, ReadContext& ctx } else if (tag == "BarLine") { BarLine* barLine = Factory::createBarLine(ctx.dummy()->segment()); barLine->setTrack(ctx.track()); - barLine->resetProperty(Pid::BARLINE_SPAN); + // initialize span properties with values from staff barLine->resetProperty(Pid::BARLINE_SPAN_FROM); barLine->resetProperty(Pid::BARLINE_SPAN_TO); @@ -2400,7 +2400,15 @@ static void readStaff(Staff* staff, XmlReader& e, ReadContext& ctx) staff->setBracketSpan(col, e.intAttribute("span", 0)); e.readNext(); } else if (tag == "barLineSpan") { - staff->setBarLineSpan(e.readInt()); + const int barLineSpan = e.readInt(); + if (barLineSpan > 0) { + ctx.setStaffBarLineSpan(staff->idx(), static_cast(barLineSpan - 1)); + } else { + if (barLineSpan < 0) { + LOGW() << "barLineSpan is negative: " << barLineSpan; + } + ctx.setStaffBarLineSpan(staff->idx(), 0); + } } else { e.unknown(); } @@ -2926,16 +2934,12 @@ muse::Ret Read114::readScoreFile(Score* score, XmlReader& e, ReadInOutData* out) return make_ret(Err::FileBadFormat, e.errorString()); } + setBarLineSpanToStaves(masterScore, ctx); + for (Staff* s : masterScore->staves()) { size_t idx = s->idx(); track_idx_t track = idx * VOICES; - // check barLineSpan - if (s->barLineSpan() > static_cast(masterScore->nstaves() - idx)) { - LOGD("read114: invalid barline span %d (max %zu)", - s->barLineSpan(), masterScore->nstaves() - idx); - s->setBarLineSpan(static_cast(masterScore->nstaves() - idx)); - } for (auto i : s->clefList()) { Fraction tick = Fraction::fromTicks(i.first); ClefType clefId = i.second.concertClef; @@ -3078,17 +3082,7 @@ muse::Ret Read114::readScoreFile(Score* score, XmlReader& e, ReadInOutData* out) masterScore->m_fileDivision = Constants::DIVISION; - // - // sanity check for barLineSpan and update ottavas - // for (Staff* staff : masterScore->staves()) { - int barLineSpan = staff->barLineSpan(); - staff_idx_t idx = staff->idx(); - size_t n = masterScore->nstaves(); - if (idx + barLineSpan > n) { - LOGD("bad span: idx %zu span %d staves %zu", idx, barLineSpan, n); - staff->setBarLineSpan(static_cast(n - idx)); - } staff->updateOttava(); } @@ -3198,6 +3192,32 @@ void Read114::readTremoloCompat(TremoloCompat*, XmlReader&) UNREACHABLE; } +// also propagates to non-generated bar lines +void Read114::setBarLineSpanToStaves(Score* score, const read400::ReadContext& ctx) +{ + const size_t numStaves = score->nstaves(); + size_t barLineSpan = 0; + for (Staff* s : score->staves()) { + const staff_idx_t staffIdx = s->idx(); + const size_t maxSpan = numStaves - staffIdx - 1; + + size_t staffBarLineSpan = ctx.getStaffBarLineSpan(staffIdx); + if (staffBarLineSpan > maxSpan) { + LOGW() << "invalid barline span " << staffBarLineSpan << " (max " << maxSpan << ")"; + staffBarLineSpan = maxSpan; + } + + barLineSpan = std::max(barLineSpan, staffBarLineSpan); + if (barLineSpan == 0) { + s->setProperty(Pid::STAFF_BARLINE_SPAN, false); + continue; + } + --barLineSpan; + + s->setProperty(Pid::STAFF_BARLINE_SPAN, true); + } +} + void Read114::doReadItem(EngravingItem*, XmlReader&) { UNREACHABLE; diff --git a/src/engraving/rw/read114/read114.h b/src/engraving/rw/read114/read114.h index 7f1b3ba42717a..c050cdc6e0c60 100644 --- a/src/engraving/rw/read114/read114.h +++ b/src/engraving/rw/read114/read114.h @@ -24,6 +24,10 @@ #include "../ireader.h" +namespace mu::engraving::read400 { +class ReadContext; +} + namespace mu::engraving::read114 { class Read114 : public rw::IReader { @@ -39,6 +43,8 @@ class Read114 : public rw::IReader void readTremoloCompat(compat::TremoloCompat* item, XmlReader& xml) override; + static void setBarLineSpanToStaves(Score*, const read400::ReadContext&); + private: void doReadItem(EngravingItem* item, XmlReader& xml) override; }; diff --git a/src/engraving/rw/read206/read206.cpp b/src/engraving/rw/read206/read206.cpp index 64d7eabb51434..07748c59f9aaf 100644 --- a/src/engraving/rw/read206/read206.cpp +++ b/src/engraving/rw/read206/read206.cpp @@ -105,7 +105,8 @@ #include "../compat/readchordlisthook.h" #include "../compat/readstyle.h" -#include "../read400/tread.h" +#include "engraving/rw/read114/read114.h" +#include "engraving/rw/read400/tread.h" #include "log.h" @@ -797,8 +798,15 @@ static void readStaff(Staff* staff, XmlReader& e, ReadContext& ctx) } else if (tag == "barLineSpan") { staff->setBarLineFrom(e.intAttribute("from", 0)); staff->setBarLineTo(e.intAttribute("to", 0)); - int span = e.readInt(); - staff->setBarLineSpan(span - 1); + const int barLineSpan = e.readInt(); + if (barLineSpan > 0) { + ctx.setStaffBarLineSpan(staff->idx(), static_cast(barLineSpan - 1)); + } else { + if (barLineSpan < 0) { + LOGW() << "barLineSpan is negative: " << barLineSpan; + } + ctx.setStaffBarLineSpan(staff->idx(), 0); + } } else if (tag == "distOffset") { staff->setUserDist(Spatium(e.readDouble())); } else if (tag == "mag") { @@ -2625,11 +2633,16 @@ static void readMeasure206(Measure* m, int staffIdx, XmlReader& e, ReadContext& } else if (t == "customSubtype") { // obsolete e.readInt(); } else if (t == "span") { - int span = e.readInt(); - if (span) { - span--; + const int span = e.readInt(); + if (span > 0) { + ctx.setBarLineSpan(bl, static_cast(span - 1)); + } else { + if (span < 0) { + LOGW() << "bar line span is negative: " << span; + } + + ctx.setBarLineSpan(bl, 0); } - bl->setSpanStaff(span); } else if (t == "spanFromOffset") { bl->setSpanFrom(e.readInt()); } else if (t == "spanToOffset") { @@ -2641,7 +2654,12 @@ static void readMeasure206(Measure* m, int staffIdx, XmlReader& e, ReadContext& fermataAbove = toFermata(el); } else { fermataBelow = toFermata(el); - fermataBelow->setTrack((bl->staffIdx() + bl->spanStaff()) * VOICES); + const std::optional barLineSpan = ctx.getBarLineSpan(bl); + if (barLineSpan) { + fermataBelow->setTrack(staff2track(bl->staffIdx() + *barLineSpan)); + } else { + fermataBelow->setTrack(staff2track(bl->staffIdx() + ctx.getStaffBarLineSpan(staffIdx))); + } } } else { bl->add(el); @@ -3556,41 +3574,60 @@ Ret Read206::readScoreFile(Score* score, XmlReader& e, ReadInOutData* out) s->updateOttava(); } - // fix segment span - SegmentType st = SegmentType::BarLineType; + // convert int bar line span to bool + + // also sets Pid::BARLINE_SPAN to non-generated and affected bar lines + read114::Read114::setBarLineSpanToStaves(score, ctx); + + // set local overrides to bar lines + constexpr auto st = SegmentType::BarLineType; + const size_t numStaves = score->nstaves(); for (Segment* s = score->firstSegment(st); s; s = s->next1(st)) { - for (size_t staffIdx = 0; staffIdx < score->nstaves(); ++staffIdx) { - BarLine* b = toBarLine(s->element(staffIdx * VOICES)); - if (!b) { - continue; + // optional local bar line span override of this segment + std::optional barLineSpan = std::nullopt; + for (staff_idx_t staffIdx = 0; staffIdx < numStaves; ++staffIdx) { + const size_t maxSpan = numStaves - staffIdx - 1; + const track_idx_t trackIdx = staff2track(staffIdx); + BarLine* barLine = toBarLine(s->element(trackIdx)); + if (barLine) { + if (const std::optional span = ctx.getBarLineSpan(barLine)) { + if (*span > maxSpan) { + LOGW() << "invalid bar line span " << *span << " (max " << maxSpan << ")"; + barLineSpan = maxSpan; + } else { + barLineSpan = std::max(barLineSpan.value_or(0), *span); + } + } } - int sp = b->spanStaff(); - if (sp <= 0) { + + if (!barLineSpan) { + // we don't have a local override. Keep the value from staff continue; } - for (int span = 1; span <= sp; ++span) { - BarLine* nb = toBarLine(s->element((staffIdx + span) * VOICES)); - if (!nb) { - nb = b->clone(); - nb->setTrack((staffIdx + span) * VOICES); - s->add(nb); + + const bool shouldBarLineSpan = *barLineSpan != 0; + const bool staffBarLineSpan = score->staff(staffIdx)->barLineSpan(); + if (shouldBarLineSpan != staffBarLineSpan) { + // bar line should have local override + if (!barLine) { + // clone previous bar line. This is safe because we always have a previous barline when + // barLineSpan != std::nullopt because it's either the one that was read or the one cloned + // in the previous iteration + barLine = toBarLine(s->element(staff2track(staffIdx - 1))) + ->clone(); + barLine->setTrack(trackIdx); + s->add(barLine); } - nb->setSpanStaff(sp - span); + + barLine->setSpanStaff(shouldBarLineSpan); + } + if (*barLineSpan == 0) { + // we're done applying the local override + barLineSpan.reset(); + } else { + --(*barLineSpan); } - staffIdx += sp; - } - } - for (size_t staffIdx = 0; staffIdx < score->nstaves(); ++staffIdx) { - Staff* s = score->staff(staffIdx); - int sp = s->barLineSpan(); - if (sp <= 0) { - continue; - } - for (int span = 1; span <= sp; ++span) { - Staff* ns = score->staff(staffIdx + span); - ns->setBarLineSpan(sp - span); } - staffIdx += sp; } compat::CompatUtils::doCompatibilityConversions(score->masterScore()); diff --git a/src/engraving/rw/read400/readcontext.cpp b/src/engraving/rw/read400/readcontext.cpp index 24283e5af6781..c50ec5a28c366 100644 --- a/src/engraving/rw/read400/readcontext.cpp +++ b/src/engraving/rw/read400/readcontext.cpp @@ -22,16 +22,18 @@ #include "readcontext.h" -#include "dom/beam.h" -#include "dom/linkedobjects.h" -#include "dom/score.h" -#include "dom/tuplet.h" -#include "dom/undo.h" +#include "global/containers.h" + +#include "engraving/dom/beam.h" +#include "engraving/dom/linkedobjects.h" +#include "engraving/dom/score.h" +#include "engraving/dom/tuplet.h" +#include "engraving/dom/undo.h" +#include "engraving/types/types.h" #include "connectorinforeader.h" #include "log.h" -#include "types/types.h" using namespace mu; using namespace mu::engraving; @@ -289,6 +291,32 @@ void ReadContext::setLocation(const Location& l) } } +size_t ReadContext::getStaffBarLineSpan(const staff_idx_t staffIdx) const +{ + return muse::value(m_staffBarLineSpanValues, staffIdx, 0); +} + +void ReadContext::setStaffBarLineSpan(const staff_idx_t staffIdx, const size_t barLineSpan) +{ + const auto [it, didInsert] = m_staffBarLineSpanValues.emplace(staffIdx, barLineSpan); + DO_ASSERT(didInsert) +} + +std::optional ReadContext::getBarLineSpan(const BarLine* barLine) +{ + if (!muse::contains(m_barLineSpanValues, barLine)) { + return std::nullopt; + } + + return muse::value(m_barLineSpanValues, barLine); +} + +void ReadContext::setBarLineSpan(const BarLine* barLine, const size_t barLineSpan) +{ + const auto [it, didInsert] = m_barLineSpanValues.emplace(barLine, barLineSpan); + DO_ASSERT(didInsert) +} + void ReadContext::addBeam(Beam* s) { _beams.insert_or_assign(s->id(), s); diff --git a/src/engraving/rw/read400/readcontext.h b/src/engraving/rw/read400/readcontext.h index 7a373ece0e293..5450ba9c534f3 100644 --- a/src/engraving/rw/read400/readcontext.h +++ b/src/engraving/rw/read400/readcontext.h @@ -23,6 +23,8 @@ #pragma once #include +#include +#include #include "global/modularity/ioc.h" #include "iengravingfontsprovider.h" @@ -40,6 +42,7 @@ #include "connectorinforeader.h" namespace mu::engraving { +class BarLine; class Beam; class EngravingObject; class LinkedObjects; @@ -166,6 +169,12 @@ class ReadContext : public muse::Injectable void fillLocation(Location&, bool forceAbsFrac = false) const; void setLocation(const Location&); // sets a new reading point, taking into account its type (absolute or relative). + size_t getStaffBarLineSpan(staff_idx_t) const; + void setStaffBarLineSpan(staff_idx_t, size_t barLineSpan); + + std::optional getBarLineSpan(const BarLine*); + void setBarLineSpan(const BarLine*, size_t barLineSpan); + rw::ReadLinks readLinks() const; void initLinks(const rw::ReadLinks& l); void addLink(Staff* staff, LinkedObjects* link, const Location& location); @@ -184,6 +193,9 @@ class ReadContext : public muse::Injectable bool _pasteMode = false; // modifies read behaviour on paste operation + std::unordered_map m_staffBarLineSpanValues; + std::unordered_map m_barLineSpanValues; + std::map > > m_staffLinkedElements; // one list per staff LinksIndexer m_linksIndexer; diff --git a/src/engraving/rw/read400/tread.cpp b/src/engraving/rw/read400/tread.cpp index 71a2c5b550697..31f28027e4122 100644 --- a/src/engraving/rw/read400/tread.cpp +++ b/src/engraving/rw/read400/tread.cpp @@ -1893,6 +1893,7 @@ void TRead::read(BagpipeEmbellishment* b, XmlReader& e, ReadContext&) void TRead::read(BarLine* b, XmlReader& e, ReadContext& ctx) { + // initialize span properties with staff values b->resetProperty(Pid::BARLINE_SPAN); b->resetProperty(Pid::BARLINE_SPAN_FROM); b->resetProperty(Pid::BARLINE_SPAN_TO); @@ -3857,7 +3858,16 @@ bool TRead::readProperties(Staff* s, XmlReader& e, ReadContext& ctx, StaffHideMo s->setBracketVisible(col, static_cast(e.intAttribute("visible", 1))); e.readNext(); } else if (tag == "barLineSpan") { - s->setBarLineSpan(e.readInt()); + const int barLineSpan = e.readInt(); + if (barLineSpan < 0) { + LOGW() << "barLineSpan is negative: " << barLineSpan; + s->setBarLineSpan(false); + } else if (barLineSpan > 1) { + LOGW() << "barLineSpan is > 1: " << barLineSpan; + s->setBarLineSpan(true); + } else { + s->setBarLineSpan(static_cast(barLineSpan)); + } } else if (tag == "barLineSpanFrom") { s->setBarLineFrom(e.readInt()); } else if (tag == "barLineSpanTo") { diff --git a/src/engraving/rw/read410/tread.cpp b/src/engraving/rw/read410/tread.cpp index 59bc5baf22388..a71e46428b7af 100644 --- a/src/engraving/rw/read410/tread.cpp +++ b/src/engraving/rw/read410/tread.cpp @@ -2041,6 +2041,7 @@ void TRead::read(BagpipeEmbellishment* b, XmlReader& e, ReadContext&) void TRead::read(BarLine* b, XmlReader& e, ReadContext& ctx) { + // initialize span properties with staff values b->resetProperty(Pid::BARLINE_SPAN); b->resetProperty(Pid::BARLINE_SPAN_FROM); b->resetProperty(Pid::BARLINE_SPAN_TO); @@ -4044,7 +4045,16 @@ bool TRead::readProperties(Staff* s, XmlReader& e, ReadContext& ctx, StaffHideMo s->setBracketVisible(col, static_cast(e.intAttribute("visible", 1))); e.readNext(); } else if (tag == "barLineSpan") { - s->setBarLineSpan(e.readInt()); + const int barLineSpan = e.readInt(); + if (barLineSpan < 0) { + LOGW() << "barLineSpan is negative: " << barLineSpan; + s->setBarLineSpan(false); + } else if (barLineSpan > 1) { + LOGW() << "barLineSpan is > 1: " << barLineSpan; + s->setBarLineSpan(true); + } else { + s->setBarLineSpan(static_cast(barLineSpan)); + } } else if (tag == "barLineSpanFrom") { s->setBarLineFrom(e.readInt()); } else if (tag == "barLineSpanTo") { diff --git a/src/engraving/rw/read460/tread.cpp b/src/engraving/rw/read460/tread.cpp index 0d7c446eede8b..da45bb7af5467 100644 --- a/src/engraving/rw/read460/tread.cpp +++ b/src/engraving/rw/read460/tread.cpp @@ -2009,6 +2009,7 @@ void TRead::read(BagpipeEmbellishment* b, XmlReader& e, ReadContext&) void TRead::read(BarLine* b, XmlReader& e, ReadContext& ctx) { + // initialize span properties with staff values b->resetProperty(Pid::BARLINE_SPAN); b->resetProperty(Pid::BARLINE_SPAN_FROM); b->resetProperty(Pid::BARLINE_SPAN_TO); @@ -3933,7 +3934,16 @@ bool TRead::readProperties(Staff* s, XmlReader& e, ReadContext& ctx) s->setBracketVisible(col, static_cast(e.intAttribute("visible", 1))); e.readNext(); } else if (tag == "barLineSpan") { - s->setBarLineSpan(e.readInt()); + const int barLineSpan = e.readInt(); + if (barLineSpan < 0) { + LOGW() << "barLineSpan is negative: " << barLineSpan; + s->setBarLineSpan(false); + } else if (barLineSpan > 1) { + LOGW() << "barLineSpan is > 1: " << barLineSpan; + s->setBarLineSpan(true); + } else { + s->setBarLineSpan(static_cast(barLineSpan)); + } } else if (tag == "barLineSpanFrom") { s->setBarLineFrom(e.readInt()); } else if (tag == "barLineSpanTo") { diff --git a/src/engraving/rw/xmlwriter.cpp b/src/engraving/rw/xmlwriter.cpp index 55608be3b431f..306f2ddee9ad0 100644 --- a/src/engraving/rw/xmlwriter.cpp +++ b/src/engraving/rw/xmlwriter.cpp @@ -123,10 +123,10 @@ void XmlWriter::tagProperty(Pid id, const PropertyValue& val, const PropertyValu propType = P_TYPE::SPATIUM; } - //! HACK Temporary hack. We have some kind of property with property type BOOL, + //! HACK Temporary hack. We used to have some kind of property with property type BOOL, //! but the used value type is INT (not just 1 and 0) - //! see STAFF_BARLINE_SPAN - if (propType == P_TYPE::BOOL && valType == P_TYPE::INT) { + //! TODO: remove if deemed safe + IF_ASSERT_FAILED(!(propType == P_TYPE::BOOL && valType == P_TYPE::INT)) { propType = P_TYPE::INT; } diff --git a/src/engraving/tests/all_elements_data/layout_elements.mscx b/src/engraving/tests/all_elements_data/layout_elements.mscx index 47a81fceb87e7..262d7a2ddb854 100644 --- a/src/engraving/tests/all_elements_data/layout_elements.mscx +++ b/src/engraving/tests/all_elements_data/layout_elements.mscx @@ -32,7 +32,7 @@ - 2 + 1 diff --git a/src/engraving/tests/all_elements_data/moonlight.mscx b/src/engraving/tests/all_elements_data/moonlight.mscx index 0a2b28e977077..d9ae3d03d5e51 100644 --- a/src/engraving/tests/all_elements_data/moonlight.mscx +++ b/src/engraving/tests/all_elements_data/moonlight.mscx @@ -32,7 +32,7 @@ - 2 + 1 diff --git a/src/engraving/tests/barline_tests.cpp b/src/engraving/tests/barline_tests.cpp index 72407ec267230..da3acb3d21771 100644 --- a/src/engraving/tests/barline_tests.cpp +++ b/src/engraving/tests/barline_tests.cpp @@ -155,7 +155,7 @@ TEST_F(Engraving_BarlineTests, barline03) EXPECT_TRUE(score); score->startCmd(TranslatableString::untranslatable("Engraving barline tests")); - score->undo(new ChangeProperty(score->staff(0), Pid::STAFF_BARLINE_SPAN, 1)); + score->undo(new ChangeProperty(score->staff(0), Pid::STAFF_BARLINE_SPAN, true)); score->undo(new ChangeProperty(score->staff(0), Pid::STAFF_BARLINE_SPAN_FROM, 2)); score->undo(new ChangeProperty(score->staff(0), Pid::STAFF_BARLINE_SPAN_TO, -2)); score->endCmd(); @@ -202,12 +202,12 @@ TEST_F(Engraving_BarlineTests, barline04) BarLine* bar = static_cast(seg->element(0)); EXPECT_TRUE(bar); - bar->undoChangeProperty(Pid::BARLINE_SPAN, 2); + bar->undoChangeProperty(Pid::BARLINE_SPAN, true); bar->undoChangeProperty(Pid::BARLINE_SPAN_FROM, 2); bar->undoChangeProperty(Pid::BARLINE_SPAN_TO, 6); score->endCmd(); - EXPECT_GT(bar->spanStaff(), 0); + EXPECT_TRUE(bar->spanStaff()); EXPECT_EQ(bar->spanFrom(), 2); EXPECT_EQ(bar->spanTo(), 6); diff --git a/src/engraving/tests/compat114_data/clef_missing_first-ref.mscx b/src/engraving/tests/compat114_data/clef_missing_first-ref.mscx index a5f084be2c368..c53078a219aaa 100644 --- a/src/engraving/tests/compat114_data/clef_missing_first-ref.mscx +++ b/src/engraving/tests/compat114_data/clef_missing_first-ref.mscx @@ -38,7 +38,7 @@ - 2 + 1 D_D @@ -130,7 +130,6 @@ O_O - 1 P_P @@ -178,7 +177,6 @@ end - 1 Z_Z diff --git a/src/engraving/tests/compat114_data/hairpin-ref.mscx b/src/engraving/tests/compat114_data/hairpin-ref.mscx index 1fccb5b2faccd..8c13840ff0770 100644 --- a/src/engraving/tests/compat114_data/hairpin-ref.mscx +++ b/src/engraving/tests/compat114_data/hairpin-ref.mscx @@ -38,7 +38,7 @@ - 2 + 1 D_D @@ -511,7 +511,6 @@ end - 1 ZB_ZB diff --git a/src/engraving/tests/compat114_data/ottava-ref.mscx b/src/engraving/tests/compat114_data/ottava-ref.mscx index bf51cdd5afc2e..46f2576ba217d 100644 --- a/src/engraving/tests/compat114_data/ottava-ref.mscx +++ b/src/engraving/tests/compat114_data/ottava-ref.mscx @@ -38,7 +38,7 @@ - 2 + 1 D_D @@ -159,7 +159,6 @@ end - 1 R_R diff --git a/src/engraving/tests/compat114_data/pedal-ref.mscx b/src/engraving/tests/compat114_data/pedal-ref.mscx index b94cf98f0cab5..13fca3c57126c 100644 --- a/src/engraving/tests/compat114_data/pedal-ref.mscx +++ b/src/engraving/tests/compat114_data/pedal-ref.mscx @@ -38,7 +38,7 @@ - 2 + 1 D_D @@ -155,7 +155,6 @@ end - 1 R_R diff --git a/src/engraving/tests/compat114_data/slurs-ref.mscx b/src/engraving/tests/compat114_data/slurs-ref.mscx index 230e3a0e23341..9fccb197f470e 100644 --- a/src/engraving/tests/compat114_data/slurs-ref.mscx +++ b/src/engraving/tests/compat114_data/slurs-ref.mscx @@ -38,7 +38,7 @@ - 2 + 1 D_D @@ -936,7 +936,6 @@ end - 1 WC_WC diff --git a/src/engraving/tests/compat114_data/textline-ref.mscx b/src/engraving/tests/compat114_data/textline-ref.mscx index 540e6c9ed01b8..581b916ea2d7c 100644 --- a/src/engraving/tests/compat114_data/textline-ref.mscx +++ b/src/engraving/tests/compat114_data/textline-ref.mscx @@ -38,7 +38,7 @@ - 2 + 1 D_D @@ -154,7 +154,6 @@ end - 1 R_R diff --git a/src/engraving/tests/compat114_data/title-ref.mscx b/src/engraving/tests/compat114_data/title-ref.mscx index f967f650c52f2..7cc45543dfd41 100644 --- a/src/engraving/tests/compat114_data/title-ref.mscx +++ b/src/engraving/tests/compat114_data/title-ref.mscx @@ -38,7 +38,7 @@ - 2 + 1 D_D @@ -440,7 +440,6 @@ end - 1 MB_MB diff --git a/src/engraving/tests/compat206_data/barlines-ref.mscx b/src/engraving/tests/compat206_data/barlines-ref.mscx index 9508062a2c37c..f84639d15056f 100644 --- a/src/engraving/tests/compat206_data/barlines-ref.mscx +++ b/src/engraving/tests/compat206_data/barlines-ref.mscx @@ -480,7 +480,7 @@ 4/4 - 2 + 1 U_U @@ -494,7 +494,7 @@ 4/4 - 3 + 1 X_X @@ -560,41 +560,38 @@ measure 4/4 - - j_j - - k_k + j_j measure 4/4 1 - l_l + k_k - m_m + l_l measure 4/4 - 2 - n_n + 1 + m_m - o_o + n_n measure 4/4 @@ -603,7 +600,7 @@ - p_p + o_o measure 4/4 @@ -612,13 +609,13 @@ - q_q + p_p measure 4/4 end - r_r + q_q @@ -627,16 +624,16 @@ - s_s + r_r 0 - t_t + s_s 4 4 - u_u + t_t measure 4/4 @@ -645,45 +642,42 @@ - v_v + u_u measure 4/4 1 - w_w + v_v - x_x + w_w measure 4/4 - - y_y - - z_z + x_x measure 4/4 1 - 0_0 + y_y - 1_1 + z_z measure 4/4 @@ -692,7 +686,7 @@ - 2_2 + 0_0 measure 4/4 @@ -701,13 +695,13 @@ - 3_3 + 1_1 measure 4/4 end - 4_4 + 2_2 @@ -716,16 +710,16 @@ - 5_5 + 3_3 0 - 6_6 + 4_4 4 4 - 7_7 + 5_5 measure 4/4 @@ -734,44 +728,38 @@ - 8_8 + 6_6 measure 4/4 - - 9_9 - - +_+ + 7_7 measure 4/4 - 2 - /_/ + 1 + 8_8 - AB_AB + 9_9 measure 4/4 - - BB_BB - - CB_CB + +_+ measure 4/4 @@ -780,7 +768,7 @@ - DB_DB + /_/ measure 4/4 @@ -789,13 +777,13 @@ - EB_EB + AB_AB measure 4/4 end - FB_FB + BB_BB @@ -804,16 +792,16 @@ - GB_GB + CB_CB 0 - HB_HB + DB_DB 4 4 - IB_IB + EB_EB measure 4/4 @@ -822,7 +810,7 @@ - JB_JB + FB_FB measure 4/4 @@ -831,33 +819,33 @@ - KB_KB + GB_GB measure 4/4 1 - LB_LB + HB_HB - MB_MB + IB_IB measure 4/4 - 3 - NB_NB + 1 + JB_JB - OB_OB + KB_KB measure 4/4 @@ -866,7 +854,7 @@ - PB_PB + LB_LB measure 4/4 @@ -875,13 +863,13 @@ - QB_QB + MB_MB measure 4/4 end - RB_RB + NB_NB @@ -890,16 +878,16 @@ - SB_SB + OB_OB 0 - TB_TB + PB_PB 4 4 - UB_UB + QB_QB measure 4/4 @@ -908,7 +896,7 @@ - VB_VB + RB_RB measure 4/4 @@ -917,32 +905,29 @@ - WB_WB + SB_SB measure 4/4 - - XB_XB - - YB_YB + TB_TB measure 4/4 - 2 - ZB_ZB + 1 + UB_UB - aB_aB + VB_VB measure 4/4 @@ -951,7 +936,7 @@ - bB_bB + WB_WB measure 4/4 @@ -960,13 +945,13 @@ - cB_cB + XB_XB measure 4/4 end - dB_dB + YB_YB @@ -975,16 +960,16 @@ - eB_eB + ZB_ZB 0 - fB_fB + aB_aB 4 4 - gB_gB + bB_bB measure 4/4 @@ -993,7 +978,7 @@ - hB_hB + cB_cB measure 4/4 @@ -1002,7 +987,7 @@ - iB_iB + dB_dB measure 4/4 @@ -1011,20 +996,20 @@ - jB_jB + eB_eB measure 4/4 1 - kB_kB + fB_fB - lB_lB + gB_gB measure 4/4 @@ -1033,7 +1018,7 @@ - mB_mB + hB_hB measure 4/4 @@ -1042,13 +1027,13 @@ - nB_nB + iB_iB measure 4/4 end - oB_oB + jB_jB @@ -1057,16 +1042,16 @@ - pB_pB + kB_kB 0 - qB_qB + lB_lB 4 4 - rB_rB + mB_mB measure 4/4 @@ -1075,7 +1060,7 @@ - sB_sB + nB_nB measure 4/4 @@ -1084,7 +1069,7 @@ - tB_tB + oB_oB measure 4/4 @@ -1093,19 +1078,16 @@ - uB_uB + pB_pB measure 4/4 - - vB_vB - - wB_wB + qB_qB measure 4/4 @@ -1114,7 +1096,7 @@ - xB_xB + rB_rB measure 4/4 @@ -1123,13 +1105,13 @@ - yB_yB + sB_sB measure 4/4 end - zB_zB + tB_tB diff --git a/src/engraving/tests/midi/midirenderer_data/hairpin_two_instruments.mscx b/src/engraving/tests/midi/midirenderer_data/hairpin_two_instruments.mscx index 3c59cc0c3e893..b18b74986d3ff 100755 --- a/src/engraving/tests/midi/midirenderer_data/hairpin_two_instruments.mscx +++ b/src/engraving/tests/midi/midirenderer_data/hairpin_two_instruments.mscx @@ -90,7 +90,7 @@ stdNormal - 2 + 1 diff --git a/src/engraving/tests/midi/midirenderer_data/same_string_diff_staves.mscx b/src/engraving/tests/midi/midirenderer_data/same_string_diff_staves.mscx index 44d2c6375245a..d276b7bd74927 100644 --- a/src/engraving/tests/midi/midirenderer_data/same_string_diff_staves.mscx +++ b/src/engraving/tests/midi/midirenderer_data/same_string_diff_staves.mscx @@ -29,7 +29,7 @@ stdNormal - 2 + 1 diff --git a/src/importexport/capella/internal/capella.cpp b/src/importexport/capella/internal/capella.cpp index 8331f4fdc0aff..8d89a030bfff0 100644 --- a/src/importexport/capella/internal/capella.cpp +++ b/src/importexport/capella/internal/capella.cpp @@ -1255,7 +1255,7 @@ void convertCapella(Score* score, Capella* cap, bool capxMode) // ClefType clefType = CapClef::clefType(cl->form, cl->line, cl->oct); // s->setClef(0, clefType); - s->setBarLineSpan(0); + s->setBarLineSpan(false); if (bstaff == 0) { bstaff = s; span = 0; diff --git a/src/importexport/guitarpro/internal/gtp/gpconverter.cpp b/src/importexport/guitarpro/internal/gtp/gpconverter.cpp index a8189f3a460e8..13b4bbd3ba9c6 100644 --- a/src/importexport/guitarpro/internal/gtp/gpconverter.cpp +++ b/src/importexport/guitarpro/internal/gtp/gpconverter.cpp @@ -1111,7 +1111,7 @@ void GPConverter::setUpTrack(const std::unique_ptr& tR) if (tR->staffCount() > 1) { part->staff(0)->addBracket(mu::engraving::Factory::createBracketItem(_score->dummy(), BracketType::BRACE, 2)); - part->staff(0)->setBarLineSpan(2); + part->staff(0)->setBarLineSpan(true); } part->setMidiProgram(programm); diff --git a/src/importexport/guitarpro/tests/data/chordnames_keyboard.gp-ref.mscx b/src/importexport/guitarpro/tests/data/chordnames_keyboard.gp-ref.mscx index 139ba1cb22b64..cbe4c5e9b6dab 100644 --- a/src/importexport/guitarpro/tests/data/chordnames_keyboard.gp-ref.mscx +++ b/src/importexport/guitarpro/tests/data/chordnames_keyboard.gp-ref.mscx @@ -24,7 +24,7 @@ stdNormal - 2 + 1 D_D @@ -105,7 +105,6 @@ - 1 M_M @@ -125,7 +124,6 @@ - 1 Q_Q @@ -145,7 +143,6 @@ - 1 U_U diff --git a/src/importexport/guitarpro/tests/data/chordnames_keyboard.gpx-ref.mscx b/src/importexport/guitarpro/tests/data/chordnames_keyboard.gpx-ref.mscx index bab87c7b1bba6..d227cac2df234 100644 --- a/src/importexport/guitarpro/tests/data/chordnames_keyboard.gpx-ref.mscx +++ b/src/importexport/guitarpro/tests/data/chordnames_keyboard.gpx-ref.mscx @@ -24,7 +24,7 @@ stdNormal - 2 + 1 D_D @@ -93,7 +93,6 @@ - 1 L_L @@ -113,7 +112,6 @@ - 1 P_P @@ -133,7 +131,6 @@ - 1 T_T diff --git a/src/importexport/guitarpro/tests/data/line_elements.gp-ref.mscx b/src/importexport/guitarpro/tests/data/line_elements.gp-ref.mscx index 557d097b32b58..4603351f9ed28 100644 --- a/src/importexport/guitarpro/tests/data/line_elements.gp-ref.mscx +++ b/src/importexport/guitarpro/tests/data/line_elements.gp-ref.mscx @@ -90,7 +90,7 @@ stdNormal - 2 + 1 F_F @@ -714,7 +714,6 @@ - 1 QB_QB @@ -826,7 +825,6 @@ half - 1 cB_cB diff --git a/src/importexport/mei/internal/meiconverter.cpp b/src/importexport/mei/internal/meiconverter.cpp index 7f7e5557d1d67..2ab7197360d48 100644 --- a/src/importexport/mei/internal/meiconverter.cpp +++ b/src/importexport/mei/internal/meiconverter.cpp @@ -3035,7 +3035,7 @@ Convert::BracketStruct Convert::staffGrpFromMEI(const libmei::StaffGrp& meiStaff return bracketSt; } -libmei::StaffGrp Convert::staffGrpToMEI(const engraving::BracketType bracket, int barLineSpan) +libmei::StaffGrp Convert::staffGrpToMEI(const engraving::BracketType bracket, const bool barLineSpan) { libmei::StaffGrp meiStaffGrp; @@ -3043,7 +3043,7 @@ libmei::StaffGrp Convert::staffGrpToMEI(const engraving::BracketType bracket, in meiStaffGrp.SetSymbol(symbolToMEI(bracket)); // @bar.thru - if (barLineSpan > 0) { + if (barLineSpan) { meiStaffGrp.SetBarThru(libmei::BOOLEAN_true); } diff --git a/src/importexport/mei/internal/meiconverter.h b/src/importexport/mei/internal/meiconverter.h index bdc117df4efb6..e533a32fcb92c 100644 --- a/src/importexport/mei/internal/meiconverter.h +++ b/src/importexport/mei/internal/meiconverter.h @@ -298,7 +298,7 @@ class Convert 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 libmei::StaffGrp staffGrpToMEI(const engraving::BracketType, bool barLineSpan); static void staffIdentToMEI(const engraving::EngravingItem* item, libmei::Element& meiElement); diff --git a/src/importexport/mei/internal/meiimporter.cpp b/src/importexport/mei/internal/meiimporter.cpp index 81e71bad0515d..a12ff588f803c 100644 --- a/src/importexport/mei/internal/meiimporter.cpp +++ b/src/importexport/mei/internal/meiimporter.cpp @@ -1309,7 +1309,7 @@ bool MeiImporter::readStaffGrps(pugi::xml_node parentNode, int& staffSpan, int c for (size_t staffIdx = staffIdxStart; staffIdx < staffIdxEnd; staffIdx++) { Staff* currentStaff = m_score->staff(staffIdx); if (currentStaff) { - currentStaff->setBarLineSpan(1); + currentStaff->setBarLineSpan(true); } } } diff --git a/src/importexport/musicxml/internal/musicxml/import/importmusicxmlpass2.cpp b/src/importexport/musicxml/internal/musicxml/import/importmusicxmlpass2.cpp index 527bec4041e51..02895d9f7190f 100644 --- a/src/importexport/musicxml/internal/musicxml/import/importmusicxmlpass2.cpp +++ b/src/importexport/musicxml/internal/musicxml/import/importmusicxmlpass2.cpp @@ -2023,7 +2023,7 @@ Err MusicXmlParserPass2::parse() */ static std::unique_ptr createBarline(const Score* score, const track_idx_t track, const BarLineType type, const bool visible, - const String& barStyle, int spanStaff) + const String& barStyle, const bool spanStaff) { std::unique_ptr barline(Factory::createBarLine(score->dummy()->segment())); barline->setTrack(track); @@ -5742,7 +5742,7 @@ void MusicXmlParserPass2::barline(const String& partId, Measure* measure, const staff_idx_t nstaves = part->nstaves(); for (staff_idx_t i = 0; i < nstaves; ++i) { const Staff* staff = part->staff(i); - bool spanStaff = nstaves > 1 ? i < nstaves - 1 : staff->barLineSpan(); + const bool spanStaff = nstaves > 1 ? i < nstaves - 1 : staff->barLineSpan(); track_idx_t currentTrack = track + (i * VOICES); auto b = createBarline(measure->score(), currentTrack, type, visible, barStyle, spanStaff); colorItem(b.get(), barlineColor); diff --git a/src/importexport/ove/internal/importove.cpp b/src/importexport/ove/internal/importove.cpp index 63ed35c911924..9a5325be4db09 100644 --- a/src/importexport/ove/internal/importove.cpp +++ b/src/importexport/ove/internal/importove.cpp @@ -432,7 +432,7 @@ void OveToMScore::convertGroups() if (j == 0 && partStaffCount == 2) { staff->setBracketType(0, BracketType::BRACE); staff->setBracketSpan(0, 2); - staff->setBarLineSpan(2); + staff->setBarLineSpan(true); } // bracket @@ -442,7 +442,7 @@ void OveToMScore::convertGroups() int endStaff = staffIndex + span; if (span > 0 && endStaff >= staffIndex && endStaff <= m_ove->getTrackCount()) { staff->addBracket(Factory::createBracketItem(staff->score()->dummy(), BracketType::NORMAL, span)); - staff->setBarLineSpan(span); + staff->setBarLineSpan(static_cast(span)); } } } diff --git a/src/notation/internal/instrumentsrepository.cpp b/src/notation/internal/instrumentsrepository.cpp index 81f89c24ba002..3f3b6085eabfc 100644 --- a/src/notation/internal/instrumentsrepository.cpp +++ b/src/notation/internal/instrumentsrepository.cpp @@ -290,7 +290,7 @@ void InstrumentsRepository::loadMuseInstruments(const InstrumentTemplateMap& sta if (instrument.staffType == musesampler::StaffType::Grand) { templ->bracketSpan[0] = static_cast(templ->staffCount); - templ->barlineSpan[0] = static_cast(templ->staffCount); + templ->barlineSpan[0] = true; for (size_t i = 0; i < templ->staffCount; ++i) { templ->bracket[i] = mu::engraving::BracketType::BRACE;