void TestBarline::barline02() { char msg[256]; Score* score = readScore(DIR + "barline02.mscx"); QVERIFY(score); Measure* msr = score->firstMeasure()->nextMeasure(); TimeSig* ts = new TimeSig(score); ts->setSig(Fraction(3, 4), TimeSigType::NORMAL); score->cmdAddTimeSig(msr, 0, ts, false); score->doLayout(); msr = score->firstMeasure(); int msrNo = 1; while ((msr = msr->nextMeasure())) { ++msrNo; Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); sprintf(msg, "No SegEndBarLine in measure %d.", msrNo); QVERIFY2(seg != nullptr, msg); BarLine* bar = static_cast<BarLine*>(seg->element(0)); sprintf(msg, "No barline in measure %d.", msrNo); QVERIFY2(bar != nullptr, msg); // bar line should be generated if NORMAL, except the END one at the end sprintf(msg, "Barline in measure %d changed into 'non-generated'.", msrNo); // ws: end barline is also generated // bool test = (bar->barLineType() == BarLineType::NORMAL) ? bar->generated() : !bar->generated(); bool test = bar->generated(); QVERIFY2(test, msg); } // QVERIFY(saveCompareScore(score, "barline02.mscx", DIR + "barline02-ref.mscx")); delete score; }
void TestTools::undoSlashFill() { QString readFile(DIR + "undoSlashFill.mscx"); QString writeFile1("undoSlashFill01-test.mscx"); QString reference1(DIR + "undoSlashFill01-ref.mscx"); QString writeFile2("undoSlashFill02-test.mscx"); QString reference2(DIR + "undoSlashFill02-ref.mscx"); Score* score = readScore(readFile); score->doLayout(); // select Segment* s = score->firstMeasure()->findSegment(Segment::Type::ChordRest, MScore::division * 2); score->selection().setRange(s, score->lastSegment(), 0, 2); // do score->startCmd(); score->cmdSlashFill(); score->endCmd(); QVERIFY(saveCompareScore(score, writeFile1, reference1)); // undo score->undo()->undo(); QVERIFY(saveCompareScore(score, writeFile2, reference2)); delete score; }
void TestBarline::barline04() { Score* score = readScore(DIR + "barline04.mscx"); QVERIFY(score); score->doLayout(); score->startCmd(); // 'go' to 5th measure Measure* msr = score->firstMeasure(); for (int i=0; i < 4; i++) msr = msr->nextMeasure(); // check span data of measure-initial start-repeat bar line Segment* seg = msr->findSegment(SegmentType::StartRepeatBarLine, msr->tick()); QVERIFY2(seg != nullptr, "No SegStartRepeatBarLine segment in measure 5."); BarLine* bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No start-repeat barline in measure 5."); bar->undoChangeProperty(Pid::BARLINE_SPAN, 2); bar->undoChangeProperty(Pid::BARLINE_SPAN_FROM, 2); bar->undoChangeProperty(Pid::BARLINE_SPAN_TO, 6); score->endCmd(); QVERIFY2(bar->spanStaff() && bar->spanFrom() == 2 && bar->spanTo() == 6, "Wrong span data in start-repeat barline of measure 5."); // check start-repeat bar ine in second staff is gone QVERIFY2(seg->element(1) == nullptr, "Extra start-repeat barline in 2nd staff of measure 5."); // QVERIFY(saveCompareScore(score, "barline04.mscx", DIR + "barline04-ref.mscx")); delete score; }
void MuseScore::oscSelectMeasure(int m) { qDebug("SelectMeasure %d", m); if (cv == 0) return; // cv->selectMeasure(m); Score* score = cv->score(); int i = 0; for (Measure* measure = score->firstMeasure(); measure; measure = measure->nextMeasure()) { if (++i < m) continue; score->selection().setState(SelState::RANGE); score->selection().setStartSegment(measure->first()); score->selection().setEndSegment(measure->last()); score->selection().setStaffStart(0); score->selection().setStaffEnd(score->nstaves()); score->selection().updateSelectedElements(); score->selection().setState(SelState::RANGE); score->addRefresh(measure->canvasBoundingRect()); cv->adjustCanvasPosition(measure, true); score->setUpdateAll(); score->update(); break; } }
void TestInstrumentChange::testDelete() { Score* score = test_pre("delete"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); score->deleteItem(ic); score->doLayout(); test_post(score, "delete"); }
void TestInstrumentChange::testAdd() { Score* score = test_pre("add"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = new InstrumentChange(score); ic->setParent(s); ic->setTrack(0); ic->setText("Instrument"); score->undoAddElement(ic); score->doLayout(); test_post(score, "add"); }
void TestNote::grace() { Score* score = readScore(DIR + "grace.mscx"); score->doLayout(); Chord* chord = score->firstMeasure()->findChord(0, 0); Note* note = chord->upNote(); // create score->setGraceNote(chord, note->pitch(), NoteType::APPOGGIATURA, MScore::division/2); Chord* gc = chord->graceNotes().first(); Note* gn = gc->notes().first(); // Note* n = static_cast<Note*>(writeReadElement(gn)); // QCOMPARE(n->noteType(), NoteType::APPOGGIATURA); // delete n; // tie score->startCmd(); score->select(gn); score->cmdAddTie(); score->endCmd(); // n = static_cast<Note*>(writeReadElement(gn)); // QVERIFY(n->tieFor() != 0); // delete n; // tremolo score->startCmd(); Tremolo* tr = new Tremolo(score); tr->setTremoloType(TremoloType::R16); tr->setParent(gc); tr->setTrack(gc->track()); score->undoAddElement(tr); score->endCmd(); // Chord* c = static_cast<Chord*>(writeReadElement(gc)); // QVERIFY(c->tremolo() != 0); // delete c; // articulation score->startCmd(); Articulation* ar = new Articulation(score); ar->setArticulationType(ArticulationType::Sforzatoaccent); ar->setParent(gc); ar->setTrack(gc->track()); score->undoAddElement(ar); score->endCmd(); // c = static_cast<Chord*>(writeReadElement(gc)); // QVERIFY(c->articulations().size() == 1); // delete c; QVERIFY(saveCompareScore(score, "grace-test.mscx", DIR + "grace-ref.mscx")); }
void TestMeasure::spanner_a() { Score* score = readScore(DIR + "measure-3.mscx"); score->doLayout(); foreach(Excerpt* e, score->excerpts()) e->score()->doLayout(); Measure* m = score->firstMeasure()->nextMeasure(); score->startCmd(); score->insertMeasure(Element::ElementType::MEASURE, m); score->endCmd(); QVERIFY(saveCompareScore(score, "measure-4.mscx", DIR + "measure-4-ref.mscx")); delete score; }
void TestTimesig::timesig03() { Score* score = readScore(DIR + "timesig-03.mscx"); QVERIFY(score); Measure* m = score->firstMeasure()->nextMeasure(); TimeSig* ts = new TimeSig(score); ts->setSig(Fraction(3, 4), TimeSigType::NORMAL); score->cmdAddTimeSig(m, 0, ts, false); score->doLayout(); QVERIFY(saveCompareScore(score, "timesig-03.mscx", DIR + "timesig-03-ref.mscx")); delete score; }
void TestMeasure::insertMeasureBegin() { Score* score = readScore(DIR + "measure01.mscx"); score->doLayout(); foreach(Excerpt* e, score->excerpts()) e->score()->doLayout(); Measure* m = score->firstMeasure(); score->startCmd(); score->insertMeasure(Element::MEASURE, m); score->endCmd(); QVERIFY(saveCompareScore(score, "measure01-2.mscx", DIR + "measure01-2-ref.mscx")); delete score; }
void TestClefCourtesy::clef_courtesy02() { Score* score = readScore(DIR + "clef_courtesy02.mscx"); score->doLayout(); // 'go' to 4th measure Measure* m1 = score->firstMeasure(); for (int i=0; i < 3; i++) m1 = m1->nextMeasure(); // make a clef-drop object and drop it to the measure Clef* clef = new Clef(score); // create a new element, as Measure::drop() will eventually delete it clef->setClefType(ClefType::G1); DropData dropData; dropData.pos = m1->pagePos(); dropData.element = clef; m1->drop(dropData); // 'go' to 7th measure Measure* m2 = m1; for (int i=0; i < 3; i++) m2 = m2->nextMeasure(); // make a clef-drop object and drop it to the measure clef = new Clef(score); // create a new element, as Measure::drop() will eventually delete it clef->setClefType(ClefType::G); dropData.pos = m2->pagePos(); dropData.element = clef; m2->drop(dropData); score->doLayout(); // check both clef elements are there, but none is shown Clef* clefCourt = nullptr; Measure* m = m1->prevMeasure(); Segment* seg = m->findSegment(SegmentType::Clef, m1->tick()); QVERIFY2(seg != nullptr, "No SegClef in measure 3."); clefCourt = static_cast<Clef*>(seg->element(0)); QVERIFY2(clefCourt != nullptr, "No courtesy clef element in measure 3."); QVERIFY2(clefCourt->bbox().width() == 0, "Courtesy clef in measure 3 is NOT hidden."); clefCourt = nullptr; m = m2->prevMeasure(); seg = m->findSegment(SegmentType::Clef, m2->tick()); QVERIFY2(seg != nullptr, "No SegClef in measure 6."); clefCourt = static_cast<Clef*>(seg->element(0)); QVERIFY2(clefCourt != nullptr, "No courtesy clef element in measure 6."); QVERIFY2(clefCourt->bbox().width() == 0, "Courtesy clef in measure 3 is NOT hidden."); QVERIFY(saveCompareScore(score, "clef_courtesy02.mscx", DIR + "clef_courtesy02-ref.mscx")); delete score; }
void TestInstrumentChange::testChange() { Score* score = test_pre("change"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); Instrument* ni = score->staff(1)->part()->instr(); ic->setInstrument(*ni); score->startCmd(); ic->setText("Instrument Oboe"); score->undo(new ChangeInstrument(ic, ic->instrument())); score->endCmd(); score->doLayout(); test_post(score, "change"); }
void TestMeasure::spanner_D() { Score* score = readScore(DIR + "measure-9.mscx"); score->doLayout(); foreach(Excerpt* e, score->excerpts()) e->score()->doLayout(); Measure* m = score->firstMeasure()->nextMeasure(); score->startCmd(); score->select(m); score->cmdDeleteSelectedMeasures(); score->endCmd(); QVERIFY(saveCompareScore(score, "measure-9.mscx", DIR + "measure-9-ref.mscx")); delete score; }
void TestClef::clef2() { Score* score = readScore(DIR + "clef-2.mscx"); Measure* m = score->firstMeasure(); m = m->nextMeasure(); m = m->nextMeasure(); TimeSig* ts = new TimeSig(score); ts->setSig(2, 4); qDebug("tick %d", m->tick()); score->cmdAddTimeSig(m, 0, ts, false); score->doLayout(); QVERIFY(saveCompareScore(score, "clef-2.mscx", DIR + "clef-2-ref.mscx")); delete score; }
void TestInstrumentChange::testCopy() { Score* score = test_pre("copy"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); m = m->nextMeasure(); s = m->first(Segment::Type::ChordRest); InstrumentChange* nic = new InstrumentChange(*ic); nic->setParent(s); nic->setTrack(4); score->undoAddElement(nic); score->doLayout(); test_post(score, "copy"); }
void TestMeasure::insertBfKeyChange() { Score* score = readScore(DIR + "measure-insert_bf_key.mscx"); score->doLayout(); // 4th measure Measure* m = score->firstMeasure()->nextMeasure(); m = m->nextMeasure()->nextMeasure(); score->startCmd(); score->insertMeasure(Element::MEASURE, m); score->endCmd(); QVERIFY(saveCompareScore(score, "measure-insert_bf_key.mscx", DIR + "measure-insert_bf_key-ref.mscx")); score->undo()->undo(); score->doLayout(); QVERIFY(saveCompareScore(score, "measure-insert_bf_key_undo.mscx", DIR + "measure-insert_bf_key.mscx")); delete score; }
void TestBarline::barline06() { char msg[256]; Score* score = readScore(DIR + "barline06.mscx"); QVERIFY(score); score->doLayout(); // scan each measure Measure* msr = score->firstMeasure(); int msrNo = 1; for (int i=0; i < 3; i++) { // check measure endbarline type sprintf(msg, "EndBarLineType not NORMAL in measure %d.", msrNo); //TODO QVERIFY2(msr->endBarLineType() == BarLineType::NORMAL, msg); // locate end-measure bar line segment Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); sprintf(msg, "No SegEndBarLine in measure %d.", msr->no()); QVERIFY2(seg != nullptr, msg); // check only i-th staff has custom bar line type for (int j=0; j < 3; j++) { BarLine* bar = static_cast<BarLine*>(seg->element(j*VOICES)); // if not the i-th staff, bar should be normal and not custom if (j != i) { sprintf(msg, "barline type NOT NORMAL or CUSTOM TYPE in staff %d of measure %d.", j+1, msrNo); QVERIFY2(bar->barLineType() == BarLineType::NORMAL, msg); // QVERIFY2(bar->customSubtype() == false, msg); } // in the i-th staff, the bar line should be of type DOUBLE and custom type should be true else { sprintf(msg, "No barline for staff %d in measure %d", j+1, msrNo); QVERIFY2(bar != nullptr, msg); sprintf(msg, "barline type NOT DOUBLE or NOT CUSTOM TYPE in staff %d of measure %d.", j+1, msrNo); QVERIFY2(bar->barLineType() == BarLineType::DOUBLE, msg); // QVERIFY2(bar->customSubtype() == true, msg); } } msr = msr->nextMeasure(); msrNo++; } // QVERIFY(saveCompareScore(score, "barline06.mscx", DIR + "barline06-ref.mscx")); delete score; }
void TestInstrumentChange::testMixer() { Score* score = test_pre("mixer"); Measure* m = score->firstMeasure()->nextMeasure(); Segment* s = m->first(Segment::Type::ChordRest); InstrumentChange* ic = static_cast<InstrumentChange*>(s->annotations()[0]); int idx = score->staff(0)->channel(s->tick(), 0); Channel* c = &score->staff(0)->part()->instr(s->tick())->channel(idx); MidiPatch* mp = new MidiPatch; mp->bank = 0; mp->drum = false; mp->name = "Viola"; mp->prog = 41; mp->synti = "Fluid"; score->startCmd(); ic->setText("Mixer Viola"); score->undo(new ChangePatch(c, mp)); score->endCmd(); score->doLayout(); test_post(score, "mixer"); }
void TestBarline::barline05() { Score* score = readScore(DIR + "barline05.mscx"); QVERIFY(score); score->doLayout(); // 'go' to 4th measure Measure* msr = score->firstMeasure(); for (int i=0; i < 3; i++) msr = msr->nextMeasure(); // create and add a LineBreak element LayoutBreak* lb = new LayoutBreak(score); lb->setLayoutBreakType(LayoutBreak::Type::LINE); lb->setTrack(-1); // system-level element lb->setParent(msr); score->undoAddElement(lb); score->doLayout(); // check an end-repeat bar line has been created at the end of this measure and it is generated Segment* seg = msr->findSegment(SegmentType::EndBarLine, msr->tick()+msr->ticks()); QVERIFY2(seg != nullptr, "No SegEndBarLine segment in measure 4."); BarLine* bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No end-repeat barline in measure 4."); QVERIFY2(bar->barLineType() == BarLineType::END_REPEAT, "Barline at measure 4 is not END-REPEAT"); QVERIFY2(bar->generated(), "End-repeat barline in measure 4 is non-generated."); // // check an end-repeat bar line has been created at the beginning of the next measure and it is not generated // check an end-repeat bar line has been created at the beginning of the next measure and it is generated msr = msr->nextMeasure(); seg = msr->findSegment(SegmentType::StartRepeatBarLine, msr->tick()); QVERIFY2(seg != nullptr, "No SegStartRepeatBarLine segment in measure 5."); bar = static_cast<BarLine*>(seg->element(0)); QVERIFY2(bar != nullptr, "No start-repeat barline in measure 5."); QVERIFY2(bar->generated(), "Start-reapeat barline in measure 5 is not generated."); // QVERIFY(saveCompareScore(score, "barline05.mscx", DIR + "barline05-ref.mscx")); delete score; }
void TestNote::tpcTranspose() { Score* score = readScore(DIR + "tpc-transpose.mscx"); score->doLayout(); score->startCmd(); Measure* m = score->firstMeasure(); score->select(m, SelectType::SINGLE, 0); score->changeAccidental(AccidentalType::FLAT); score->endCmd(); score->startCmd(); m = m->nextMeasure(); score->select(m, SelectType::SINGLE, 0); score->upDown(false, UpDownMode::CHROMATIC); score->endCmd(); score->startCmd(); score->cmdConcertPitchChanged(true, true); score->endCmd(); QVERIFY(saveCompareScore(score, "tpc-transpose-test.mscx", DIR + "tpc-transpose-ref.mscx")); }
void TestLinks::test3LinkedParts() { MCursor c; c.setTimeSig(Fraction(4,4)); c.createScore("test"); c.addPart("voice"); c.move(0, 0); // move to track 0 tick 0 c.addKeySig(Key(1)); c.addTimeSig(Fraction(4,4)); c.addChord(60, TDuration(TDuration::DurationType::V_WHOLE)); Score* score = c.score(); score->addText("title", "Title"); score->doLayout(); // delete chord Measure* m = score->firstMeasure(); Segment* s = m->first(Segment::Type::ChordRest); Element* e = s->element(0); QVERIFY(e->type() == Element::Type::CHORD); score->select(e); score->cmdDeleteSelection(); e = s->element(0); QVERIFY(e->type() == Element::Type::REST); QVERIFY(e->links() == nullptr); // create parts// score->startCmd(); QList<Part*> parts; parts.append(score->parts().at(0)); Score* nscore = new Score(score); Excerpt ex(score); ex.setPartScore(nscore); ex.setTitle("voice"); ex.setParts(parts); ::createExcerpt(&ex); QVERIFY(nscore); nscore->setName(parts.front()->partName()); score->undo(new AddExcerpt(nscore)); score->endCmd(); // add a linked staff score->startCmd(); Staff* oStaff = score->staff(0); Staff* staff = new Staff(score); staff->setPart(oStaff->part()); score->undoInsertStaff(staff, 1); cloneStaff(oStaff, staff); score->endCmd(); // we should have now 2 staves and 3 linked rests QVERIFY(score->staves().size() == 2); e = s->element(0); QVERIFY(e->type() == Element::Type::REST); QVERIFY(e->links()->size() == 3); e = s->element(4); QVERIFY(e->type() == Element::Type::REST); QVERIFY(e->links()->size() == 3); // delete part score->startCmd(); ::deleteExcerpt(&ex); score->undo(new RemoveExcerpt(nscore)); // we should have now 2 staves and *2* linked rests QVERIFY(score->staves().size() == 2); e = s->element(0); QVERIFY(e->type() == Element::Type::REST); QVERIFY(e->links()->size() == 2); e = s->element(4); QVERIFY(e->type() == Element::Type::REST); QVERIFY(e->links()->size() == 2); }
void TestBarline::barline179726() { Score* score = readScore(DIR + "barline179726.mscx"); QVERIFY(score); score->doLayout(); Measure* m = score->firstMeasure(); // drop NORMAL onto initial START_REPEAT barline will remove that START_REPEAT dropNormalBarline(m->findSegment(SegmentType::StartRepeatBarLine, m->tick())->elementAt(0)); QVERIFY(m->findSegment(SegmentType::StartRepeatBarLine, Fraction(0,1)) == NULL); // drop NORMAL onto END_START_REPEAT will turn into NORMAL dropNormalBarline(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0)); QVERIFY(static_cast<BarLine*>(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0))->barLineType() == BarLineType::NORMAL); m = m->nextMeasure(); // drop NORMAL onto the END_REPEAT part of an END_START_REPEAT straddling a newline will turn into NORMAL at the end of this meas dropNormalBarline(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0)); QVERIFY(static_cast<BarLine*>(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0))->barLineType() == BarLineType::NORMAL); m = m->nextMeasure(); // but leave START_REPEAT at the beginning of the newline QVERIFY(static_cast<BarLine*>(m->findSegment(SegmentType::StartRepeatBarLine, m->tick())->elementAt(0))); // drop NORMAL onto the meas ending with an END_START_REPEAT straddling a newline will turn into NORMAL at the end of this meas // but note I'm not verifying what happens to the START_REPEAT at the beginning of the newline...I'm not sure that behavior is well-defined yet dropNormalBarline(m); QVERIFY(static_cast<BarLine*>(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0))->barLineType() == BarLineType::NORMAL); m = m->nextMeasure(); m = m->nextMeasure(); // drop NORMAL onto the START_REPEAT part of an END_START_REPEAT straddling a newline will remove the START_REPEAT at the beginning of this measure dropNormalBarline(m->findSegment(SegmentType::StartRepeatBarLine, m->tick())->elementAt(0)); QVERIFY(m->findSegment(SegmentType::StartRepeatBarLine, m->tick()) == NULL); // but leave END_REPEAT at the end of previous line QVERIFY(static_cast<BarLine*>(m->prevMeasure()->findSegment(SegmentType::EndBarLine, m->tick())->elementAt(0))->barLineType() == BarLineType::END_REPEAT); for (int i = 0; i < 4; i++, m = m->nextMeasure()) { // drop NORMAL onto END_REPEAT, BROKEN, DOTTED, DOUBLE at the end of this meas will turn into NORMAL dropNormalBarline(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0)); QVERIFY(static_cast<BarLine*>(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0))->barLineType() == BarLineType::NORMAL); } m = m->nextMeasure(); // drop NORMAL onto a START_REPEAT in middle of a line will remove the START_REPEAT at the beginning of this measure dropNormalBarline(m->findSegment(SegmentType::StartRepeatBarLine, m->tick())->elementAt(0)); QVERIFY(m->findSegment(SegmentType::StartRepeatBarLine, m->tick()) == NULL); // drop NORMAL onto final END_REPEAT at end of score will turn into NORMAL dropNormalBarline(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0)); QVERIFY(static_cast<BarLine*>(m->findSegment(SegmentType::EndBarLine, m->endTick())->elementAt(0))->barLineType() == BarLineType::NORMAL); delete score; }