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 Lilypond::addRest() { createMeasure(); Segment* segment = new Segment(measure); segment->setSubtype(SegChordRest); segment->setTick(tick); segment->setParent(measure); measure->add(segment); Rest* rest = new Rest(score); rest->setTrack(staff->idx() * VOICES); rest->setParent(segment); Duration d; d.setVal(curLen); rest->setDurationType(d); segment->add(rest); tick += curLen; }
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; }