From cb0ea380d4ab5f8caa39fc21501149ddfd704f43 Mon Sep 17 00:00:00 2001 From: sammik Date: Tue, 27 Jun 2023 18:25:28 +0200 Subject: [PATCH 1/4] correct keysig presence check --- src/engraving/libmscore/instrchange.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engraving/libmscore/instrchange.cpp b/src/engraving/libmscore/instrchange.cpp index a4368483c83ac..dc5966ccc2d78 100644 --- a/src/engraving/libmscore/instrchange.cpp +++ b/src/engraving/libmscore/instrchange.cpp @@ -117,7 +117,7 @@ void InstrumentChange::setupInstrument(const Instrument* instrument) Segment* seg = segment()->prev1(SegmentType::KeySig); voice_idx_t voice = part->staff(i)->idx() * VOICES; KeySig* ksig = toKeySig(seg->element(voice)); - bool forInstChange = ksig && ksig->tick() != tickStart; + bool forInstChange = !(ksig && ksig->tick() == tickStart && !ksig->generated()); ks.setForInstrumentChange(forInstChange); Key cKey = part->staff(i)->concertKey(tickStart); ks.setConcertKey(cKey); From 785deb16cbce21f68db0e9cfd41479cef93bd2e9 Mon Sep 17 00:00:00 2001 From: sammik Date: Wed, 28 Jun 2023 18:29:04 +0200 Subject: [PATCH 2/4] remove "generated" key signatures --- src/engraving/layout/v0/measurelayout.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/engraving/layout/v0/measurelayout.cpp b/src/engraving/layout/v0/measurelayout.cpp index db6d1a190abfc..7de1c63ba4fe8 100644 --- a/src/engraving/layout/v0/measurelayout.cpp +++ b/src/engraving/layout/v0/measurelayout.cpp @@ -1694,6 +1694,21 @@ void MeasureLayout::removeSystemHeader(Measure* m) seg->setEnabled(false); } m->setHeader(false); + + // remove all "generated" key signatures + Segment* kSeg = m->findFirstR(SegmentType::KeySig, Fraction(0, 1)); + if (!kSeg) { + return; + } + for (EngravingItem* e : kSeg->elist()) { + if (e && e->generated()) { + kSeg->elist().at(e->track()) = 0; + } + } + kSeg->checkEmpty(); + if (kSeg->empty()) { + m->remove(kSeg); + } } void MeasureLayout::addSystemTrailer(Measure* m, Measure* nm, LayoutContext& ctx) From 4396a9eeebdd2eafcdce17122c6bfd589fbaf309 Mon Sep 17 00:00:00 2001 From: sammik Date: Thu, 29 Jun 2023 16:51:12 +0200 Subject: [PATCH 3/4] do not add unnecessary courtesy keysigs --- src/engraving/layout/v0/measurelayout.cpp | 32 ++++++++++++----------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/engraving/layout/v0/measurelayout.cpp b/src/engraving/layout/v0/measurelayout.cpp index 7de1c63ba4fe8..0be96d4093ed5 100644 --- a/src/engraving/layout/v0/measurelayout.cpp +++ b/src/engraving/layout/v0/measurelayout.cpp @@ -1795,22 +1795,24 @@ void MeasureLayout::addSystemTrailer(Measure* m, Measure* nm, LayoutContext& ctx if (staffIsPitchedAtNextMeas) { KeySig* ks = toKeySig(s->element(track)); KeySigEvent key2 = staff->keySigEvent(m->endTick()); - - if (!ks) { - ks = Factory::createKeySig(s); - ks->setTrack(track); - ks->setGenerated(true); - ks->setParent(s); - s->add(ks); - s->setTrailer(true); + bool needCourtesy = staff->key(m->tick()) != key2.key(); + + if (needCourtesy) { + if (!ks) { + ks = Factory::createKeySig(s); + ks->setTrack(track); + ks->setGenerated(true); + ks->setParent(s); + s->add(ks); + s->setTrailer(true); + } + ks->setKeySigEvent(key2); + TLayout::layout(ks, ctx); + //s->createShape(track / VOICES); + s->setEnabled(true); + } else if (ks) { + s->remove(ks); } - //else if (!(ks->keySigEvent() == key2)) { - // score()->undo(new ChangeKeySig(ks, key2, ks->showCourtesy())); - // } - ks->setKeySigEvent(key2); - TLayout::layout(ks, ctx); - //s->createShape(track / VOICES); - s->setEnabled(true); } else { /// !staffIsPitchedAtNextMeas KeySig* keySig = nullptr; EngravingItem* keySigElem = s->element(track); From cd7e8df95ec6e599d1b8f354e11f699c8a406d1e Mon Sep 17 00:00:00 2001 From: sammik Date: Fri, 30 Jun 2023 01:55:53 +0200 Subject: [PATCH 4/4] cleanup --- src/engraving/layout/v0/measurelayout.cpp | 48 +++++++++++------------ 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/engraving/layout/v0/measurelayout.cpp b/src/engraving/layout/v0/measurelayout.cpp index 0be96d4093ed5..bb8397ae34744 100644 --- a/src/engraving/layout/v0/measurelayout.cpp +++ b/src/engraving/layout/v0/measurelayout.cpp @@ -1792,33 +1792,29 @@ void MeasureLayout::addSystemTrailer(Measure* m, Measure* nm, LayoutContext& ctx m->add(s); } - if (staffIsPitchedAtNextMeas) { - KeySig* ks = toKeySig(s->element(track)); - KeySigEvent key2 = staff->keySigEvent(m->endTick()); - bool needCourtesy = staff->key(m->tick()) != key2.key(); - - if (needCourtesy) { - if (!ks) { - ks = Factory::createKeySig(s); - ks->setTrack(track); - ks->setGenerated(true); - ks->setParent(s); - s->add(ks); - s->setTrailer(true); - } - ks->setKeySigEvent(key2); - TLayout::layout(ks, ctx); - //s->createShape(track / VOICES); - s->setEnabled(true); - } else if (ks) { - s->remove(ks); - } - } else { /// !staffIsPitchedAtNextMeas - KeySig* keySig = nullptr; - EngravingItem* keySigElem = s->element(track); - if (keySigElem && keySigElem->isKeySig()) { - keySig = toKeySig(keySigElem); + KeySig* keySig = nullptr; + EngravingItem* keySigElem = s->element(track); + if (keySigElem && keySigElem->isKeySig()) { + keySig = toKeySig(keySigElem); + } + + KeySigEvent key2 = staff->keySigEvent(m->endTick()); + bool needsCourtesy = staff->key(m->tick()) != key2.key(); + + if (staffIsPitchedAtNextMeas && needsCourtesy) { + if (!keySig) { + keySig = Factory::createKeySig(s); + keySig->setTrack(track); + keySig->setGenerated(true); + keySig->setParent(s); + s->add(keySig); + s->setTrailer(true); } + keySig->setKeySigEvent(key2); + TLayout::layout(keySig, ctx); + //s->createShape(track / VOICES); + s->setEnabled(true); + } else { /// !staffIsPitchedAtNextMeas || !needsCourtesy if (keySig) { s->remove(keySig); }