void Cursor::add(Element* wrapped) { Ms::Element* s = wrapped->element(); if (!_segment || !s) return; wrapped->setOwnership(Ownership::SCORE); s->setTrack(_track); s->setParent(_segment); if (s->isChordRest()) s->score()->undoAddCR(toChordRest(s), _segment->measure(), _segment->tick()); else if (s->type() == ElementType::KEYSIG) { Ms::Segment* ns = _segment->measure()->undoGetSegment(SegmentType::KeySig, _segment->tick()); s->setParent(ns); _score->undoAddElement(s); } else if (s->type() == ElementType::TIMESIG) { Ms::Measure* m = _segment->measure(); Fraction tick = m->tick(); _score->cmdAddTimeSig(m, _track, toTimeSig(s), false); m = _score->tick2measure(tick); _segment = m->first(_filter); nextInTrack(); } else if (s->type() == ElementType::LAYOUT_BREAK) { Ms::Measure* m = _segment->measure(); s->setParent(m); _score->undoAddElement(s); } else { _score->undoAddElement(s); } _score->setLayoutAll(); }
void MsScWriter::endMeasure(const Bww::MeasureEndFlags mef) { qDebug() << "MsScWriter::endMeasure()"; if (mef.repeatEnd) currentMeasure->setRepeatFlags(Ms::RepeatEnd); if (mef.endingEnd) { if (lastVolta) { qDebug("adding volta"); if (ending == 1) lastVolta->setVoltaType(Ms::VoltaType::CLOSED); else lastVolta->setVoltaType(Ms::VoltaType::OPEN); lastVolta->setTick2(currentMeasure->tick()); // currentMeasure->addSpannerBack(lastVolta); lastVolta = 0; } else { qDebug("lastVolta == 0 on stop"); } } if (mef.lastOfSystem) { Ms::LayoutBreak* lb = new Ms::LayoutBreak(score); lb->setTrack(0); lb->setLayoutBreakType(Ms::LayoutBreak::LINE); currentMeasure->add(lb); } if (mef.lastOfPart && !mef.repeatEnd) { currentMeasure->setEndBarLineType(Ms::END_BAR, false, true); } else if (mef.doubleBarLine) { currentMeasure->setEndBarLineType(Ms::DOUBLE_BAR, false, true); } // BarLine* barLine = new BarLine(score); // bool visible = true; // barLine->setSubtype(NORMAL_BAR); // barLine->setTrack(0); // currentMeasure->setEndBarLineType(barLine->subtype(), false, visible); }
void MsScWriter::note(const QString pitch, const QVector<Bww::BeamType> beamList, const QString type, const int dots, bool tieStart, bool /*TODO tieStop */, StartStop triplet, bool grace) { qDebug() << "MsScWriter::note()" << "type:" << type << "dots:" << dots << "grace" << grace ; if (!stepAlterOctMap.contains(pitch) || !typeMap.contains(type)) { // TODO: error message return; } StepAlterOct sao = stepAlterOctMap.value(pitch); int ticks = 4 * Ms::MScore::division / type.toInt(); if (dots) ticks = 3 * ticks / 2; qDebug() << "ticks:" << ticks; Ms::TDuration durationType(Ms::TDuration::DurationType::V_INVALID); durationType.setVal(ticks); qDebug() << "duration:" << durationType.name(); if (triplet != ST_NONE) ticks = 2 * ticks / 3; Ms::Beam::Mode bm = (beamList.at(0) == Bww::BM_BEGIN) ? Ms::Beam::Mode::BEGIN : Ms::Beam::Mode::AUTO; Ms::Direction sd = Ms::Direction::AUTO; // create chord Ms::Chord* cr = new Ms::Chord(score); //ws cr->setTick(tick); cr->setBeamMode(bm); cr->setTrack(0); if (grace) { cr->setNoteType(Ms::NoteType::GRACE32); cr->setDurationType(Ms::TDuration::DurationType::V_32ND); sd = Ms::Direction::UP; } else { if (durationType.type() == Ms::TDuration::DurationType::V_INVALID) durationType.setType(Ms::TDuration::DurationType::V_QUARTER); cr->setDurationType(durationType); sd = Ms::Direction::DOWN; } cr->setDuration(durationType.fraction()); cr->setDots(dots); cr->setStemDirection(sd); // add note to chord Ms::Note* note = new Ms::Note(score); note->setTrack(0); xmlSetPitch(note, sao.s.toLatin1(), sao.a, sao.o); if (tieStart) { Ms::Tie* tie = new Ms::Tie(score); note->setTieFor(tie); tie->setStartNote(note); tie->setTrack(0); } cr->add(note); // add chord to measure if (!grace) { Ms::Segment* s = currentMeasure->getSegment(cr, tick); s->add(cr); if (!currentGraceNotes.isEmpty()) { for (int i = currentGraceNotes.size() - 1; i >=0; i--) cr->add(currentGraceNotes.at(i)); currentGraceNotes.clear(); } doTriplet(cr, triplet); int tickBefore = tick; tick += ticks; Ms::Fraction nl(Ms::Fraction::fromTicks(tick - currentMeasure->tick())); currentMeasure->setLen(nl); qDebug() << "MsScWriter::note()" << "tickBefore:" << tickBefore << "tick:" << tick << "nl:" << nl.print() ; } else { currentGraceNotes.append(cr); } }
void MsScWriter::beginMeasure(const Bww::MeasureBeginFlags mbf) { qDebug() << "MsScWriter::beginMeasure()"; ++measureNumber; // create a new measure currentMeasure = new Ms::Measure(score); currentMeasure->setTick(tick); currentMeasure->setTimesig(Ms::Fraction(beats, beat)); currentMeasure->setNo(measureNumber); score->measures()->add(currentMeasure); if (mbf.repeatBegin) currentMeasure->setRepeatStart(true); if (mbf.irregular) currentMeasure->setIrregular(true); if (mbf.endingFirst || mbf.endingSecond) { Ms::Volta* volta = new Ms::Volta(score); volta->setTrack(0); volta->endings().clear(); if (mbf.endingFirst) { volta->setText("1"); volta->endings().append(1); ending = 1; } else { volta->setText("2"); volta->endings().append(2); ending = 2; } volta->setTick(currentMeasure->tick()); score->addElement(volta); lastVolta = volta; } // set clef, key and time signature in the first measure if (measureNumber == 1) { // clef Ms::Clef* clef = new Ms::Clef(score); clef->setClefType(Ms::ClefType::G); clef->setTrack(0); Ms::Segment* s = currentMeasure->getSegment(clef, tick); s->add(clef); // keysig Ms::KeySigEvent key; key.setKey(Ms::Key::D); Ms::KeySig* keysig = new Ms::KeySig(score); keysig->setKeySigEvent(key); keysig->setTrack(0); s = currentMeasure->getSegment(keysig, tick); s->add(keysig); // timesig Ms::TimeSig* timesig = new Ms::TimeSig(score); timesig->setSig(Ms::Fraction(beats, beat)); timesig->setTrack(0); s = currentMeasure->getSegment(timesig, tick); s->add(timesig); qDebug("tempo %d", tempo); } }