void Cursor::rewind(RewindMode mode) { // // rewind to start of score // if (mode == SCORE_START) { _segment = nullptr; Ms::Measure* m = _score->firstMeasure(); if (m) { _segment = m->first(_filter); nextInTrack(); } } // // rewind to start of selection // else if (mode == SELECTION_START) { if (!_score->selection().isRange()) return; _segment = _score->selection().startSegment(); _track = _score->selection().staffStart() * VOICES; nextInTrack(); } // // rewind to end of selection // else if (mode == SELECTION_END) { if (!_score->selection().isRange()) return; _segment = _score->selection().endSegment(); _track = (_score->selection().staffEnd() * VOICES) - 1; // be sure _track exists } _score->inputState().setTrack(_track); _score->inputState().setSegment(_segment); }
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(); }
static void setTempo(Ms::Score* score, int tempo) { Ms::TempoText* tt = new Ms::TempoText(score); tt->setTempo(double(tempo)/60.0); tt->setTrack(0); QString tempoText = Ms::TempoText::duration2tempoTextString(Ms::TDuration::DurationType::V_QUARTER); tempoText += QString(" = %1").arg(tempo); tt->setPlainText(tempoText); Ms::Measure* measure = score->firstMeasure(); Ms::Segment* segment = measure->getSegment(Ms::Segment::Type::ChordRest, 0); segment->add(tt); }
bool Cursor::nextMeasure() { if (_segment == 0) return false; Ms::Measure* m = _segment->measure()->nextMeasure(); if (m == 0) { _segment = 0; return false; } _segment = m->first(_filter); nextInTrack(); return _segment != 0; }
static void setTempo(Ms::Score* score, int tempo) { Ms::TempoText* tt = new Ms::TempoText(score); tt->setTempo(double(tempo)/60.0); tt->setTrack(0); #if 0 // TODO WS Ms::QTextCursor* c = tt->startCursorEdit(); c->movePosition(QTextCursor::EndOfLine); addSymbolToText(SymCode(0xe105, 1), c); c->insertText(" = "); c->insertText(QString("%1").arg(tempo)); tt->endEdit(); #endif Ms::Measure* measure = score->firstMeasure(); Ms::Segment* segment = measure->getSegment(Ms::Segment::SegChordRest, 0); segment->add(tt); }
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\n"); if (ending == 1) lastVolta->setVoltaType(Ms::VoltaType::CLOSED); else lastVolta->setVoltaType(Ms::VoltaType::OPEN); lastVolta->setEndElement(currentMeasure); currentMeasure->addSpannerBack(lastVolta); lastVolta = 0; } else { qDebug("lastVolta == 0 on stop\n"); } } if (mef.lastOfSystem) { Ms::LayoutBreak* lb = new Ms::LayoutBreak(score); lb->setTrack(0); lb->setLayoutBreakType(Ms::LAYOUT_BREAK_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::endMeasure(const Bww::MeasureEndFlags mef) { qDebug() << "MsScWriter::endMeasure()"; if (mef.repeatEnd) currentMeasure->setRepeatEnd(true); if (mef.endingEnd) { if (lastVolta) { qDebug("adding volta"); if (ending == 1) lastVolta->setVoltaType(Ms::Volta::Type::CLOSED); else lastVolta->setVoltaType(Ms::Volta::Type::OPEN); lastVolta->setTick2(tick); 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::Type::LINE); currentMeasure->add(lb); } if (mef.lastOfPart && !mef.repeatEnd) { //TODO currentMeasure->setEndBarLineType(Ms::BarLineType::END, false, true); } else if (mef.doubleBarLine) { //TODO currentMeasure->setEndBarLineType(Ms::BarLineType::DOUBLE, false, true); } // BarLine* barLine = new BarLine(score); // bool visible = true; // barLine->setSubtype(BarLineType::NORMAL); // barLine->setTrack(0); // currentMeasure->setEndBarLineType(barLine->subtype(), false, visible); }
void MsScWriter::doTriplet(Ms::Chord* cr, StartStop triplet) { qDebug() << "MsScWriter::doTriplet(" << triplet << ")" ; if (triplet == ST_START) { tuplet = new Ms::Tuplet(score); tuplet->setTrack(0); tuplet->setRatio(Ms::Fraction(3, 2)); tuplet->setTick(tick); currentMeasure->add(tuplet); } else if (triplet == ST_STOP) { if (tuplet) { cr->setTuplet(tuplet); tuplet->add(cr); tuplet = 0; } else qDebug("BWW::import: triplet stop without triplet start"); } else if (triplet == ST_CONTINUE) { if (!tuplet) qDebug("BWW::import: triplet continue without triplet start"); } else if (triplet == ST_NONE) { if (tuplet) qDebug("BWW::import: triplet none inside triplet"); } else qDebug("unknown triplet type %d", triplet); if (tuplet) { cr->setTuplet(tuplet); tuplet->add(cr); } }
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); } }