void Score::splitMeasure(Segment* segment) { if (segment->rtick() == 0) { MScore::setError(CANNOT_SPLIT_MEASURE_FIRST_BEAT); return; } if (segment->splitsTuplet()) { MScore::setError(CANNOT_SPLIT_MEASURE_TUPLET); return; } Measure* measure = segment->measure(); ScoreRange range; range.read(measure->first(), measure->last()); undoRemoveMeasures(measure, measure); undoInsertTime(measure->tick(), -measure->ticks()); // create empty measures: Measure* m2 = toMeasure(insertMeasure(Element::Type::MEASURE, measure->next(), true)); Measure* m1 = toMeasure(insertMeasure(Element::Type::MEASURE, m2, true)); int tick = segment->tick(); m1->setTick(measure->tick()); m2->setTick(tick); int ticks1 = segment->tick() - measure->tick(); int ticks2 = measure->ticks() - ticks1; m1->setTimesig(measure->timesig()); m2->setTimesig(measure->timesig()); m1->adjustToLen(Fraction::fromTicks(ticks1)); m2->adjustToLen(Fraction::fromTicks(ticks2)); range.write(this, m1->tick()); }
void Score::splitMeasure(ChordRest* cr) { Segment* segment = cr->segment(); Measure* measure = segment->measure(); ScoreRange range; range.read(measure->first(), measure->last()); undoRemoveMeasures(measure, measure); undoInsertTime(measure->tick(), -(measure->endTick() - measure->tick())); // create empty measures: Measure* m2 = toMeasure(insertMeasure(Element::Type::MEASURE, measure->next(), true)); Measure* m1 = toMeasure(insertMeasure(Element::Type::MEASURE, m2, true)); int tick = segment->tick(); m1->setTick(measure->tick()); m2->setTick(tick); int ticks1 = segment->tick() - measure->tick(); int ticks2 = measure->ticks() - ticks1; m1->setTimesig(measure->timesig()); m2->setTimesig(measure->timesig()); m1->adjustToLen(Fraction::fromTicks(ticks1)); m2->adjustToLen(Fraction::fromTicks(ticks2)); range.write(this, m1->tick()); }