void MTrack::fillGapWithRests(Score* score, int voice, const Fraction &startChordTickFrac, const Fraction &restLength, int track) { Fraction startChordTick = startChordTickFrac; Fraction restLen = restLength; while (restLen > 0) { Fraction len = restLen; Measure* measure = score->tick2measure(startChordTick.ticks()); if (startChordTick >= Fraction::fromTicks(measure->tick() + measure->ticks())) { qDebug("tick2measure: %d end of score?", startChordTick.ticks()); startChordTick += restLen; restLen = Fraction(0); break; } len = splitDurationOnBarBoundary(len, startChordTick, measure); if (len >= Fraction::fromTicks(measure->ticks())) { // rest to the whole measure len = Fraction::fromTicks(measure->ticks()); if (voice == 0) { TDuration duration(TDuration::V_MEASURE); Rest* rest = new Rest(score, duration); rest->setDuration(measure->len()); rest->setTrack(track); Segment* s = measure->getSegment(rest, startChordTick.ticks()); s->add(rest); } restLen -= len; startChordTick += len; } else { auto dl = toDurationList(measure, voice, startChordTick, len, Meter::DurationType::REST); if (dl.isEmpty()) { qDebug("cannot create duration list for len %d", len.ticks()); restLen = Fraction(0); // fake break; } for (const auto &durationPair: dl) { const TDuration &duration = durationPair.second; const Fraction &tupletRatio = durationPair.first; len = duration.fraction() / tupletRatio; Rest* rest = new Rest(score, duration); rest->setDuration(duration.fraction()); rest->setTrack(track); Segment* s = measure->getSegment(Segment::SegChordRest, startChordTick.ticks()); s->add(rest); addElementToTuplet(voice, startChordTick, len, rest); restLen -= len; startChordTick += len; } } } }
void fillGapsWithRests(Score* score, int ctick, int restLen, int track) { bool useDots = preferences.midiImportOperations.currentTrackOperations().useDots; while (restLen > 0) { int len = restLen; Measure* measure = score->tick2measure(ctick); if (ctick >= measure->tick() + measure->ticks()) { qDebug("tick2measure: %d end of score?", ctick); ctick += restLen; restLen = 0; break; } // split rest on measure boundary if ((ctick + len) > measure->tick() + measure->ticks()) len = measure->tick() + measure->ticks() - ctick; if (len >= measure->ticks()) { len = measure->ticks(); TDuration d(TDuration::V_MEASURE); Rest* rest = new Rest(score, d); rest->setDuration(measure->len()); rest->setTrack(track); Segment* s = measure->getSegment(rest, ctick); s->add(rest); restLen -= len; ctick += len; } else { QList<TDuration> dl = Meter::toDurationList(ctick - measure->tick(), ctick + len - measure->tick(), measure->timesig(), Meter::DurationType::REST, useDots); if (dl.isEmpty()) { qDebug("cannot create duration list for len %d", len); restLen = 0; // fake break; } foreach (TDuration d, dl) { Rest* rest = new Rest(score, d); rest->setDuration(d.fraction()); rest->setTrack(track); Segment* s = measure->getSegment(Segment::SegChordRest, ctick); s->add(rest); restLen -= d.ticks(); ctick += d.ticks(); } } }
void TrackList::append(Element* e) { if (e->isDurationElement()) { Fraction d = static_cast<DurationElement*>(e)->duration(); _duration += d; bool accumulateRest = e->type() == Element::REST && !isEmpty() && back()->type() == Element::REST; Segment* s = accumulateRest ? static_cast<Rest*>(e)->segment() : 0; if (s && !s->score()->isSpannerStartEnd(s->tick(), e->track())) { // akkumulate rests Rest* rest = static_cast<Rest*>(back()); Fraction d = rest->duration(); d += static_cast<Rest*>(e)->duration(); rest->setDuration(d); } else { Element* element = e->clone(); QList<Element*>::append(element); if (e->type() == Element::TUPLET) { Tuplet* srcTuplet = static_cast<Tuplet*>(e); Tuplet* dstTuplet = static_cast<Tuplet*>(element); foreach(const DurationElement* de, srcTuplet->elements()) dstTuplet->add(de->clone()); } else {
bool MuseScore::importPdf(Score* score, const QString& path) { Omr* omr = new Omr(path, score); if (!omr->readPdf()) { delete omr; return false; } score->setOmr(omr); qreal sp = omr->spatiumMM(); if (sp == 0.0) sp = 1.5; score->setSpatium(sp * DPMM); score->style()->set(StyleVal(ST_pageFillLimit, 1.0)); score->style()->set(StyleVal(ST_lastSystemFillLimit, 0.0)); score->style()->set(StyleVal(ST_staffLowerBorder, 0.0)); score->style()->set(StyleVal(ST_measureSpacing, 1.0)); PageFormat pF(*score->pageFormat()); pF.setEvenLeftMargin(5.0 * DPMM / DPI); pF.setEvenTopMargin(0); pF.setEvenBottomMargin(0); pF.setOddLeftMargin(5.0 * DPMM / DPI); pF.setOddTopMargin(0); pF.setOddBottomMargin(0); score->setPageFormat(pF); score->style()->set(StyleVal(ST_systemDistance, Spatium(omr->systemDistance()))); score->style()->set(StyleVal(ST_akkoladeDistance, Spatium(omr->staffDistance()))); Part* part = new Part(score); Staff* staff = new Staff(score, part, 0); part->staves()->push_back(staff); score->staves().insert(0, staff); staff = new Staff(score, part, 1); part->staves()->push_back(staff); score->staves().insert(1, staff); part->staves()->front()->setBarLineSpan(part->nstaves()); score->insertPart(part, 0); TDuration d(TDuration::V_MEASURE); Measure* measure = 0; int tick = 0; foreach(const OmrPage* omrPage, omr->pages()) { int nsystems = omrPage->systems().size(); int n = nsystems == 0 ? 1 : nsystems; for (int k = 0; k < n; ++k) { int numMeasures = 1; if (k < nsystems) { const OmrSystem& omrSystem = omrPage->systems().at(k); numMeasures = omrSystem.barLines.size() - 1; if (numMeasures < 1) numMeasures = 1; else if (numMeasures > 50) // sanity check numMeasures = 50; } for (int i = 0; i < numMeasures; ++i) { measure = new Measure(score); measure->setTick(tick); Rest* rest = new Rest(score, d); rest->setDuration(Fraction(4,4)); rest->setTrack(0); Segment* s = measure->getSegment(SegChordRest, tick); s->add(rest); rest = new Rest(score, d); rest->setDuration(Fraction(4,4)); rest->setTrack(4); s->add(rest); score->measures()->add(measure); tick += MScore::division * 4; } if (k < (nsystems-1)) { LayoutBreak* b = new LayoutBreak(score); b->setSubtype(LAYOUT_BREAK_LINE); measure->add(b); } } if (measure) { LayoutBreak* b = new LayoutBreak(score); b->setSubtype(LAYOUT_BREAK_PAGE); measure->add(b); } } //---create bracket score->staff(0)->setBracket(0, BRACKET_AKKOLADE); score->staff(0)->setBracketSpan(0, 2); //---create clefs measure = score->firstMeasure(); if (measure) { Clef* clef = new Clef(score); clef->setClefType(CLEF_G); clef->setTrack(0); Segment* segment = measure->getSegment(SegClef, 0); segment->add(clef); clef = new Clef(score); clef->setClefType(CLEF_F); clef->setTrack(4); segment->add(clef); } score->setShowOmr(true); omr->page(0)->readHeader(score); score->rebuildMidiMapping(); return true; }