Exemplo n.º 1
0
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 &notes = chord->notes();
            for (const Note *note: notes) {
                  if ((note->*tieFunc)())
                        return true;
                  }
            }
      return false;
      }
Exemplo n.º 2
0
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;
            }
      }