Skip to content

Commit

Permalink
Merge pull request musescore#18279 from sammik/instrumentchange-keysig
Browse files Browse the repository at this point in the history
fix musescore#18197 musescore#18212 correct instrument change and key signatures behaviour
  • Loading branch information
RomanPudashkin authored and mike-spa committed Jul 19, 2023
1 parent e8b56e1 commit 9d26cde
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 21 deletions.
53 changes: 33 additions & 20 deletions src/engraving/layout/v0/measurelayout.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion src/engraving/libmscore/instrchange.cpp
Expand Up @@ -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);
Expand Down

0 comments on commit 9d26cde

Please sign in to comment.