Ejemplo n.º 1
0
Clef::Clef( ClefAttr *clefAttr ):
    LayerElement("clef-")
{
    Clef();
    this->SetShape(clefAttr->GetClefShape());
    this->SetLine(clefAttr->GetClefLine());
    this->SetDis(clefAttr->GetClefDis());
    this->SetDisPlace(clefAttr->GetClefDisPlace());
}
void
SegmentAutoSplitCommand::execute()
{
    if (m_newSegments.empty()) {

        std::vector<AutoSplitPoint> splitPoints;

        Clef clef;
        Key key;
        timeT segmentStart = m_segment->getStartTime();
        timeT lastSoundTime = segmentStart;
        timeT lastSplitTime = segmentStart - 1;

        for (Segment::iterator i = m_segment->begin();
                m_segment->isBeforeEndMarker(i); ++i) {

            timeT myTime = (*i)->getAbsoluteTime();
            int barNo = m_composition->getBarNumber(myTime);

            if ((*i)->isa(Clef::EventType)) {
                clef = Clef(**i);
            } else if ((*i)->isa(Key::EventType)) {
                key = Key(**i);
            }

            if (myTime <= lastSplitTime)
                continue;

            bool newTimeSig = false;
            TimeSignature tsig =
                m_composition->getTimeSignatureInBar(barNo, newTimeSig);

            if (newTimeSig) {

                // If there's a new time sig in this bar and we haven't
                // already made a split in this bar, make one

                if (splitPoints.empty() ||
                        m_composition->getBarNumber
                        (splitPoints[splitPoints.size() - 1].time) < barNo) {

                    splitPoints.push_back(AutoSplitPoint(myTime, lastSoundTime,
                                                         clef, key));
                    lastSoundTime = lastSplitTime = myTime;
                }

            } else if ((*i)->isa(Note::EventRestType)) {

                // Otherwise never start a subsegment on a rest

                continue;

            } else {

                // When we meet a non-rest event, start a new split
                // if an entire bar has passed since the last non-rest event

                int lastSoundBarNo = m_composition->getBarNumber(lastSoundTime);

                if (lastSoundBarNo < barNo - 1 ||
                        (lastSoundBarNo == barNo - 1 &&
                         m_composition->getBarStartForTime(lastSoundTime) ==
                         lastSoundTime &&
                         lastSoundTime > segmentStart)) {

                    splitPoints.push_back
                    (AutoSplitPoint
                     (m_composition->getBarStartForTime(myTime), lastSoundTime,
                      clef, key));
                    lastSplitTime = myTime;
                }
            }

            lastSoundTime = std::max(lastSoundTime, myTime + (*i)->getDuration());
        }

        for (size_t split = 0; split <= splitPoints.size(); ++split) {

            Segment *newSegment = new Segment();
            newSegment->setTrack(m_segment->getTrack());
            std::string label = m_segment->getLabel();
            newSegment->setLabel(appendLabel(label, qstrtostr(tr("(part %1)").arg(split + 1))));
            newSegment->setColourIndex(m_segment->getColourIndex());

            timeT startTime = segmentStart;
            if (split > 0) {

                RG_DEBUG << "Auto-split point " << split - 1 << ": time "
                << splitPoints[split - 1].time << ", lastSoundTime "
                << splitPoints[split - 1].lastSoundTime << endl;

                startTime = splitPoints[split - 1].time;
                newSegment->insert(splitPoints[split - 1].clef.getAsEvent(startTime));
                newSegment->insert(splitPoints[split - 1].key.getAsEvent(startTime));
            }

            Segment::iterator i = m_segment->findTime(startTime);

            // A segment has to contain at least one note to be a worthy
            // candidate for adding back into the composition
            bool haveNotes = false;

            while (m_segment->isBeforeEndMarker(i)) {
                timeT t = (*i)->getAbsoluteTime();
                if (split < splitPoints.size() &&
                        t >= splitPoints[split].lastSoundTime)
                    break;
                if ((*i)->isa(Note::EventType))
                    haveNotes = true;
                newSegment->insert(new Event(**i));
                ++i;
            }

            if (haveNotes)
                m_newSegments.push_back(newSegment);
            else
                delete newSegment;
        }
    }

    m_composition->detachSegment(m_segment);
    for (size_t i = 0; i < m_newSegments.size(); ++i) {
        m_composition->addSegment(m_newSegments[i]);
    }
    m_detached = true;
}
Ejemplo n.º 3
0
const Rosegarden::Clef clefIndexToClef(int index)
{
    Rosegarden::Clef clef;

    // insert an initial clef from track parameters
    switch (index) {
    case TrebleClef:
        clef = Clef(Clef::Treble);
        break;
    case BassClef:
        clef = Clef(Clef::Bass);
        break;
    case CrotalesClef:
        clef = Clef(Clef::Treble, 2);
        break;
    case XylophoneClef:
        clef = Clef(Clef::Treble, 1);
        break;
    case GuitarClef:
        clef = Clef(Clef::Treble, -1);
        break;
    case ContrabassClef:
        clef = Clef(Clef::Bass, -1);
        break;
    case CelestaClef:
        clef = Clef(Clef::Bass, 2);
        break;
    case OldCelestaClef:
        clef = Clef(Clef::Bass, 1);
        break;
    case FrenchClef:
        clef = Clef(Clef::French);
        break;
    case SopranoClef:
        clef = Clef(Clef::Soprano);
        break;
    case MezzosopranoClef:
        clef = Clef(Clef::Mezzosoprano);
        break;
    case AltoClef:
        clef = Clef(Clef::Alto);
        break;
    case TenorClef:
        clef = Clef(Clef::Tenor);
        break;
    case BaritoneClef:
        clef = Clef(Clef::Baritone);
        break;
    case VarbaritoneClef:
        clef = Clef(Clef::Varbaritone);
        break;
    case SubbassClef:
        clef = Clef(Clef::Subbass);
        break;
    default:
        clef = Clef(Clef::Treble);
        break;
    }
    return clef;
}