bool isTied(const Segment *seg, int strack, int voice, Ms::Tie*(Note::*tieFunc)() const) { ChordRest *cr = static_cast<ChordRest *>(seg->element(strack + voice)); if (cr && cr->isChord()) { Chord *chord = toChord(cr); const auto ¬es = chord->notes(); for (const Note *note: notes) { if ((note->*tieFunc)()) return true; } } return false; }
void TieStateMachine::addSeg(const Segment *seg, int strack) { bool isChord = false; for (int voice = 0; voice < VOICES; ++voice) { ChordRest *cr = static_cast<ChordRest *>(seg->element(strack + voice)); if (!cr || !cr->isChord()) continue; if (!isChord) isChord = true; bool tiedFor = isTiedFor(seg, strack, voice); bool tiedBack = isTiedBack(seg, strack, voice); if (tiedFor && !tiedBack) tiedVoices.insert(voice); else if (!tiedFor && tiedBack) tiedVoices.erase(voice); } if (!isChord) return; if (tiedVoices.empty() && (state_ == State::TIED_FOR || state_ == State::TIED_BOTH)) { state_ = State::TIED_BACK; } else if (tiedVoices.empty() && state_ == State::TIED_BACK) { state_ = State::UNTIED; } else if (!tiedVoices.empty() && (state_ == State::TIED_BACK || state_ == State::UNTIED)) { state_ = State::TIED_FOR; } else if (!tiedVoices.empty() && state_ == State::TIED_FOR) { state_ = State::TIED_BOTH; } }