ChordRest* prevChordRest(ChordRest* cr) { if (!cr) return 0; if (cr->isGrace()) { // cr is a grace note Chord* c = static_cast<Chord*>(cr); Chord* pc = static_cast<Chord*>(cr->parent()); QList<Chord*> graceNotesBefore; QList<Chord*> graceNotesAfter; if(cr->isGraceBefore()){ pc->getGraceNotesBefore(&graceNotesBefore); auto i = std::find(graceNotesBefore.begin(),graceNotesBefore.end(), c); if (i == graceNotesBefore.end()) return 0; if (i == graceNotesBefore.begin()) cr = pc; else return *--i; } else { int n = pc->getGraceNotesAfter(&graceNotesAfter); for(int i = 0; i < n; i++){ if(c == graceNotesAfter[(i)]){ if(i > 0) return graceNotesAfter[i - 1]; else return 0; } } } } else { if (cr->type() == Element::CHORD) { Chord* c = static_cast<Chord*>(cr); if (!c->graceNotes().empty()) return c->graceNotes().back(); } } int track = cr->track(); Segment::SegmentTypes st = Segment::SegChordRest; for (Segment* seg = cr->segment()->prev1(st); seg; seg = seg->prev1(st)) { ChordRest* e = static_cast<ChordRest*>(seg->element(track)); if (e) return e; } return 0; }
ChordRest* nextChordRest(ChordRest* cr) { if (!cr) return 0; if (cr->isGrace()) { // // cr is a grace note Chord* c = static_cast<Chord*>(cr); Chord* pc = static_cast<Chord*>(cr->parent()); if (cr->isGraceBefore()) { QList<Chord*> graceNotesBefore; pc->getGraceNotesBefore(&graceNotesBefore); auto i = std::find(graceNotesBefore.begin(), graceNotesBefore.end(), c); if (i == graceNotesBefore.end()) return 0; // unable to find self? ++i; if (i != graceNotesBefore.end()) return *i; // if this was last grace note before, return parent return pc; } else { QList<Chord*> graceNotesAfter; pc->getGraceNotesAfter(&graceNotesAfter); auto i = std::find(graceNotesAfter.begin(), graceNotesAfter.end(), c); if (i == graceNotesAfter.end()) return 0; // unable to find self? ++i; if (i != graceNotesAfter.end()) return *i; // if this was last grace note after, fall through to find next main note cr = pc; } } else { // // cr is not a grace note if (cr->type() == Element::Type::CHORD) { Chord* c = static_cast<Chord*>(cr); if (!c->graceNotes().empty()) { QList<Chord*> graceNotesAfter; c->getGraceNotesAfter(&graceNotesAfter); if (!graceNotesAfter.isEmpty()) return graceNotesAfter.first(); } } } int track = cr->track(); Segment::Type st = Segment::Type::ChordRest; for (Segment* seg = cr->segment()->next1MM(st); seg; seg = seg->next1MM(st)) { ChordRest* e = static_cast<ChordRest*>(seg->element(track)); if (e) { if (e->type() == Element::Type::CHORD) { Chord* c = static_cast<Chord*>(e); if (!c->graceNotes().empty()) { QList<Chord*> graceNotesBefore; c->getGraceNotesBefore(&graceNotesBefore); if (!graceNotesBefore.isEmpty()) return graceNotesBefore.first(); } } return e; } } return 0; }