diff --git a/src/engraving/layout/v0/measurelayout.cpp b/src/engraving/layout/v0/measurelayout.cpp index db6d1a190abfc..bb8397ae34744 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) @@ -1777,31 +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()); + KeySig* keySig = nullptr; + EngravingItem* keySigElem = s->element(track); + if (keySigElem && keySigElem->isKeySig()) { + keySig = toKeySig(keySigElem); + } - if (!ks) { - ks = Factory::createKeySig(s); - ks->setTrack(track); - ks->setGenerated(true); - ks->setParent(s); - s->add(ks); + 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); } - //else if (!(ks->keySigEvent() == key2)) { - // score()->undo(new ChangeKeySig(ks, key2, ks->showCourtesy())); - // } - ks->setKeySigEvent(key2); - TLayout::layout(ks, ctx); + keySig->setKeySigEvent(key2); + TLayout::layout(keySig, ctx); //s->createShape(track / VOICES); s->setEnabled(true); - } else { /// !staffIsPitchedAtNextMeas - KeySig* keySig = nullptr; - EngravingItem* keySigElem = s->element(track); - if (keySigElem && keySigElem->isKeySig()) { - keySig = toKeySig(keySigElem); - } + } else { /// !staffIsPitchedAtNextMeas || !needsCourtesy if (keySig) { s->remove(keySig); } 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);