Skip to content

Commit 58db3e2

Browse files
committed
Connect ties starting on grace notes in <=114 scores
1 parent 61ca60d commit 58db3e2

File tree

3 files changed

+56
-96
lines changed

3 files changed

+56
-96
lines changed

src/engraving/dom/score.cpp

Lines changed: 56 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5900,69 +5900,71 @@ void Score::connectTies(bool silent)
59005900
return;
59015901
}
59025902

5903-
SegmentType st = SegmentType::ChordRest;
5904-
for (Segment* s = m->first(st); s; s = s->next1(st)) {
5905-
for (track_idx_t i = 0; i < tracks; ++i) {
5906-
EngravingItem* e = s->element(i);
5907-
if (e == 0 || !e->isChord()) {
5903+
auto connectTiesForChord = [silent](Chord* c, Segment* s, track_idx_t track) -> void {
5904+
for (Note* n : c->notes()) {
5905+
if (n->laissezVib()) {
59085906
continue;
59095907
}
5910-
Chord* c = toChord(e);
5911-
for (Note* n : c->notes()) {
5912-
if (n->laissezVib()) {
5913-
continue;
5914-
}
5915-
// connect a tie without end note
5916-
Tie* tie = n->tieFor();
5917-
if (tie) {
5918-
tie->updatePossibleJumpPoints();
5919-
}
5920-
if (tie && !tie->isPartialTie() && !tie->endNote()) {
5921-
Note* nnote;
5922-
if (m_mscVersion <= 114) {
5923-
nnote = searchTieNote114(n);
5924-
} else {
5925-
nnote = searchTieNote(n);
5926-
}
5927-
if (nnote == 0) {
5928-
if (!silent) {
5929-
LOGD("next note at %d track %zu for tie not found (version %d)", s->tick().ticks(), i, m_mscVersion);
5930-
delete tie;
5931-
n->setTieFor(0);
5932-
}
5933-
} else {
5934-
tie->setEndNote(nnote);
5935-
nnote->setTieBack(tie);
5936-
}
5937-
}
5938-
// connect a glissando without initial note (old glissando format)
5939-
for (Spanner* spanner : n->spannerBack()) {
5940-
if (spanner->isGlissando() && !spanner->startElement()) {
5941-
Note* initialNote = Glissando::guessInitialNote(n->chord());
5942-
n->removeSpannerBack(spanner);
5943-
if (initialNote) {
5944-
spanner->setStartElement(initialNote);
5945-
spanner->setEndElement(n);
5946-
spanner->setTick(initialNote->chord()->tick());
5947-
spanner->setTick2(n->chord()->tick());
5948-
spanner->setTrack(n->track());
5949-
spanner->setTrack2(n->track());
5950-
spanner->setParent(initialNote);
5951-
initialNote->add(spanner);
5952-
} else {
5953-
delete spanner;
5954-
}
5908+
// connect a tie without end note
5909+
Tie* tie = n->tieFor();
5910+
if (tie) {
5911+
tie->updatePossibleJumpPoints();
5912+
}
5913+
if (tie && !tie->isPartialTie() && !tie->endNote()) {
5914+
Note* nnote;
5915+
nnote = searchTieNote(n);
5916+
if (nnote == 0) {
5917+
if (!silent) {
5918+
LOGD("next note at %d track %zu for tie not found", s->tick().ticks(), track);
5919+
delete tie;
5920+
n->setTieFor(0);
59555921
}
5922+
} else {
5923+
tie->setEndNote(nnote);
5924+
nnote->setTieBack(tie);
59565925
}
5957-
// spanner with no end element can happen during copy/paste
5958-
for (Spanner* spanner : n->spannerFor()) {
5959-
if (spanner->endElement() == nullptr) {
5960-
n->removeSpannerFor(spanner);
5926+
}
5927+
// connect a glissando without initial note (old glissando format)
5928+
for (Spanner* spanner : n->spannerBack()) {
5929+
if (spanner->isGlissando() && !spanner->startElement()) {
5930+
Note* initialNote = Glissando::guessInitialNote(n->chord());
5931+
n->removeSpannerBack(spanner);
5932+
if (initialNote) {
5933+
spanner->setStartElement(initialNote);
5934+
spanner->setEndElement(n);
5935+
spanner->setTick(initialNote->chord()->tick());
5936+
spanner->setTick2(n->chord()->tick());
5937+
spanner->setTrack(n->track());
5938+
spanner->setTrack2(n->track());
5939+
spanner->setParent(initialNote);
5940+
initialNote->add(spanner);
5941+
} else {
59615942
delete spanner;
59625943
}
59635944
}
59645945
}
5946+
// spanner with no end element can happen during copy/paste
5947+
for (Spanner* spanner : n->spannerFor()) {
5948+
if (spanner->endElement() == nullptr) {
5949+
n->removeSpannerFor(spanner);
5950+
delete spanner;
5951+
}
5952+
}
5953+
}
5954+
};
5955+
5956+
SegmentType st = SegmentType::ChordRest;
5957+
for (Segment* s = m->first(st); s; s = s->next1(st)) {
5958+
for (track_idx_t track = 0; track < tracks; ++track) {
5959+
EngravingItem* e = s->element(track);
5960+
if (e == 0 || !e->isChord()) {
5961+
continue;
5962+
}
5963+
Chord* c = toChord(e);
5964+
connectTiesForChord(c, s, track);
59655965
for (Chord* gc : c->graceNotes()) {
5966+
connectTiesForChord(gc, s, track);
5967+
59665968
for (Note* n : gc->notes()) {
59675969
// spanner with no end element apparently happens when reading some 206 files
59685970
// (and possibly in other situations too)

src/engraving/dom/utils.cpp

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -872,47 +872,6 @@ Note* searchTieNote(const Note* note, const Segment* nextSegment, const bool dis
872872
return note2;
873873
}
874874

875-
//---------------------------------------------------------
876-
// searchTieNote114
877-
// search Note to tie to "note", tie to next note in
878-
// same voice
879-
//---------------------------------------------------------
880-
881-
Note* searchTieNote114(Note* note)
882-
{
883-
Note* note2 = 0;
884-
Chord* chord = note->chord();
885-
Segment* seg = chord->segment();
886-
Part* part = chord->part();
887-
track_idx_t strack = part->staves().front()->idx() * VOICES;
888-
track_idx_t etrack = strack + part->staves().size() * VOICES;
889-
890-
while ((seg = seg->next1(SegmentType::ChordRest))) {
891-
for (track_idx_t track = strack; track < etrack; ++track) {
892-
EngravingItem* e = seg->element(track);
893-
if (e == 0 || (!e->isChord()) || (e->track() != chord->track())) {
894-
continue;
895-
}
896-
Chord* c = toChord(e);
897-
staff_idx_t staffIdx = c->staffIdx() + c->staffMove();
898-
if (staffIdx != chord->staffIdx() + chord->staffMove()) { // cannot happen?
899-
continue;
900-
}
901-
for (Note* n : c->notes()) {
902-
if (n->pitch() == note->pitch()) {
903-
if (note2 == 0 || c->track() == chord->track()) {
904-
note2 = n;
905-
}
906-
}
907-
}
908-
}
909-
if (note2) {
910-
break;
911-
}
912-
}
913-
return note2;
914-
}
915-
916875
//---------------------------------------------------------
917876
// absStep
918877
/// Compute absolute step.

src/engraving/dom/utils.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ extern Segment* nextSeg1(Segment* s);
7575
extern Segment* prevSeg1(Segment* seg);
7676

7777
extern Note* searchTieNote(const Note* note, const Segment* nextSegment = nullptr, const bool disableOverRepeats = true);
78-
extern Note* searchTieNote114(Note* note);
7978

8079
extern int absStep(int pitch);
8180
extern int absStep(int tpc, int pitch);

0 commit comments

Comments
 (0)