fix #278943: Can't copy tuplet to last beat of measure

This commit is contained in:
Matt McClinch 2018-11-28 08:23:05 -05:00
parent 1b1912d6ed
commit 7ff253cae0
16 changed files with 36 additions and 60 deletions

View file

@ -112,7 +112,7 @@ Fraction DurationElement::afrac() const
return f.reduced();
}
else
return Element::afrac();
return Fraction::fromTicks(tick());
}
//---------------------------------------------------------
@ -125,7 +125,7 @@ Fraction DurationElement::rfrac() const
if (Measure* m = measure())
return afrac() - m->afrac();
}
return Element::rfrac();
return Fraction::fromTicks(rtick());
}
//---------------------------------------------------------

View file

@ -1718,15 +1718,10 @@ int Element::rtick() const
Fraction Element::rfrac() const
{
const Element* e = this;
while (e) {
if (e->isSegment())
return toSegment(e)->rfrac();
else if (e->isMeasureBase())
return toMeasureBase(e)->rfrac();
e = e->parent();
}
return -1;
if (parent())
return parent()->rfrac();
else
return -1;
}
//---------------------------------------------------------
@ -1736,15 +1731,10 @@ Fraction Element::rfrac() const
Fraction Element::afrac() const
{
const Element* e = this;
while (e) {
if (e->isSegment())
return toSegment(e)->afrac();
else if (e->isMeasureBase())
return toMeasureBase(e)->afrac();
e = e->parent();
}
return -1;
if (parent())
return parent()->afrac();
else
return -1;
}
//---------------------------------------------------------

View file

@ -176,9 +176,7 @@ bool Score::pasteStaff(XmlReader& e, Segment* dst, int dstStaff)
Measure* measure = tick2measure(tick);
tuplet->setParent(measure);
tuplet->setTick(tick);
int ticks = tuplet->actualTicks();
int rticks = measure->endTick() - tick;
if (rticks < ticks) {
if (tuplet->rfrac() + tuplet->duration() > measure->len()) {
delete tuplet;
if (oldTuplet && oldTuplet->elements().empty())
delete oldTuplet;

View file

@ -951,27 +951,6 @@ void Tuplet::sortElements()
qSort(_elements.begin(), _elements.end(), tickGreater);
}
//---------------------------------------------------------
// afrac
//---------------------------------------------------------
Fraction Tuplet::afrac() const
{
return Fraction::fromTicks(tick());
}
//---------------------------------------------------------
// rfrac
//---------------------------------------------------------
Fraction Tuplet::rfrac() const
{
const Measure* m = measure();
if (m)
return Fraction::fromTicks(tick() - m->tick());
return afrac();
}
//---------------------------------------------------------
// elementsDuration
/// Get the sum of the element fraction in the tuplet,

View file

@ -119,8 +119,6 @@ class Tuplet final : public DurationElement {
Direction direction() const { return _direction; }
bool isUp() const { return _isUp; }
virtual int tick() const override { return _tick; }
virtual Fraction afrac() const override;
virtual Fraction rfrac() const override;
void setTick(int val) { _tick = val; }
Fraction elementsDuration();
void sortElements();

View file

@ -915,6 +915,7 @@ bool GuitarPro4::read(QFile* fp)
Tuplet* tuplet = tuplets[staffIdx];
if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) {
tuplet = new Tuplet(score);
tuplet->setTick(tick);
tuplet->setTrack(cr->track());
tuplets[staffIdx] = tuplet;
setTuplet(tuplet, tuple);

View file

@ -296,6 +296,7 @@ int GuitarPro5::readBeat(int tick, int voice, Measure* measure, int staffIdx, Tu
Tuplet* tuplet = tuplets[staffIdx * 2 + voice];
if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) {
tuplet = new Tuplet(score);
tuplet->setTick(tick);
// int track = staffIdx * 2 + voice;
tuplets[staffIdx * 2 + voice] = tuplet;
tuplet->setTrack(cr->track());

View file

@ -1653,6 +1653,7 @@ int GuitarPro6::readBeats(QString beats, GPPartInfo* partInfo, Measure* measure,
cr->setTrack(track);
if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) {
tuplet = new Tuplet(score);
tuplet->setTick(currentTick);
tuplets[staffIdx * VOICES + voiceNum] = tuplet;
tuplet->setParent(measure);
}

View file

@ -1210,6 +1210,7 @@ bool GuitarPro1::read(QFile* fp)
Tuplet* tuplet = tuplets[staffIdx];
if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) {
tuplet = new Tuplet(score);
tuplet->setTick(tick);
tuplet->setTrack(cr->track());
tuplets[staffIdx] = tuplet;
setTuplet(tuplet, tuple);
@ -1698,6 +1699,7 @@ bool GuitarPro2::read(QFile* fp)
Tuplet* tuplet = tuplets[staffIdx];
if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) {
tuplet = new Tuplet(score);
tuplet->setTick(tick);
tuplet->setTrack(cr->track());
tuplets[staffIdx] = tuplet;
setTuplet(tuplet, tuple);
@ -2413,6 +2415,7 @@ bool GuitarPro3::read(QFile* fp)
Tuplet* tuplet = tuplets[staffIdx];
if ((tuplet == 0) || (tuplet->elementsDuration() == tuplet->baseLen().fraction() * tuplet->ratio().numerator())) {
tuplet = new Tuplet(score);
tuplet->setTick(tick);
tuplet->setTrack(cr->track());
tuplets[staffIdx] = tuplet;
setTuplet(tuplet, tuple);

View file

@ -390,6 +390,7 @@
</Rest>
<Tuplet>
<linked>
<indexDiff>1</indexDiff>
</linked>
<normalNotes>2</normalNotes>
<actualNotes>3</actualNotes>
@ -405,11 +406,13 @@
</Beam>
<Chord>
<linked>
<indexDiff>1</indexDiff>
</linked>
<dots>1</dots>
<durationType>eighth</durationType>
<Note>
<linked>
<indexDiff>1</indexDiff>
</linked>
<pitch>71</pitch>
<tpc>19</tpc>

View file

@ -447,10 +447,12 @@
</Beam>
<Chord>
<linked>
<indexDiff>1</indexDiff>
</linked>
<durationType>16th</durationType>
<Note>
<linked>
<indexDiff>1</indexDiff>
</linked>
<Spanner type="Tie">
<Tie>

View file

@ -273,7 +273,7 @@ solo concert</text>
</Slur>
<next>
<location>
<fractions>-1/1</fractions>
<fractions>1/4</fractions>
</location>
</next>
</Spanner>
@ -313,7 +313,7 @@ solo concert</text>
<Spanner type="Slur">
<prev>
<location>
<fractions>1/1</fractions>
<fractions>-1/4</fractions>
</location>
</prev>
</Spanner>
@ -1036,7 +1036,7 @@ solo concert</text>
</Slur>
<next>
<location>
<fractions>-1/1</fractions>
<fractions>1/4</fractions>
</location>
</next>
</Spanner>
@ -1079,7 +1079,7 @@ solo concert</text>
<Spanner type="Slur">
<prev>
<location>
<fractions>1/1</fractions>
<fractions>-1/4</fractions>
</location>
</prev>
</Spanner>
@ -1710,7 +1710,7 @@ solo concert</text>
</Slur>
<next>
<location>
<fractions>-1/1</fractions>
<fractions>1/4</fractions>
</location>
</next>
</Spanner>
@ -1753,7 +1753,7 @@ solo concert</text>
<Spanner type="Slur">
<prev>
<location>
<fractions>1/1</fractions>
<fractions>-1/4</fractions>
</location>
</prev>
</Spanner>

View file

@ -155,7 +155,7 @@
<next>
<location>
<measures>1</measures>
<fractions>-1387/1920</fractions>
<fractions>-35/36</fractions>
</location>
</next>
</Spanner>
@ -198,7 +198,7 @@
<prev>
<location>
<measures>-1</measures>
<fractions>1387/1920</fractions>
<fractions>35/36</fractions>
</location>
</prev>
</Spanner>

View file

@ -166,7 +166,7 @@
<next>
<location>
<measures>1</measures>
<fractions>-2/3</fractions>
<fractions>-11/12</fractions>
</location>
</next>
</Spanner>
@ -195,7 +195,7 @@
<prev>
<location>
<measures>-1</measures>
<fractions>2/3</fractions>
<fractions>11/12</fractions>
</location>
</prev>
</Spanner>

View file

@ -135,7 +135,7 @@
<next>
<location>
<measures>1</measures>
<fractions>-2/3</fractions>
<fractions>-11/12</fractions>
</location>
</next>
</Spanner>
@ -168,7 +168,7 @@
<prev>
<location>
<measures>-1</measures>
<fractions>2/3</fractions>
<fractions>11/12</fractions>
</location>
</prev>
</Spanner>

View file

@ -174,7 +174,7 @@
<next>
<location>
<measures>1</measures>
<fractions>-237/320</fractions>
<fractions>-107/108</fractions>
</location>
</next>
</Spanner>
@ -227,7 +227,7 @@
<prev>
<location>
<measures>-1</measures>
<fractions>237/320</fractions>
<fractions>107/108</fractions>
</location>
</prev>
</Spanner>