diff --git a/libmscore/groups.cpp b/libmscore/groups.cpp index 859cc6067ed47..4c42d3bf9626c 100644 --- a/libmscore/groups.cpp +++ b/libmscore/groups.cpp @@ -72,14 +72,6 @@ Beam::Mode Groups::endBeam(ChordRest* cr) return cr->beamMode(); Q_ASSERT(cr->staff()); - if (cr->tuplet() && !cr->tuplet()->elements().isEmpty()) { - if (cr->tuplet()->elements().front() == cr) // end beam at new tuplet - return Beam::Mode::BEGIN; - if (cr->tuplet()->elements().back() == cr) // end beam at tuplet end - return Beam::Mode::END; - return Beam::Mode::AUTO; - } - TDuration d = cr->durationType(); const Groups& g = cr->staff()->group(cr->tick()); Fraction stretch = cr->staff()->timeStretch(cr->tick()); diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index 1e8a228d297a8..25c06556aaf03 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -1164,6 +1164,7 @@ void Score::layoutStage2() Beam::Mode bm = Beam::Mode::AUTO; Segment::Type st = Segment::Type::ChordRest; + ChordRest* prev = 0; for (Segment* segment = firstSegment(st); segment; segment = segment->next1(st)) { ChordRest* cr = static_cast(segment->element(track)); if (cr == 0) @@ -1180,6 +1181,17 @@ void Score::layoutStage2() bm = Groups::endBeam(cr); + // end beam at new tuplet or end tuplet, if the next/prev duration type is different + if (cr->tuplet() + && !cr->tuplet()->elements().isEmpty() + && cr->tuplet()->elements().front() == cr + && prev && prev->durationType() == cr->durationType()) + bm = Beam::Mode::BEGIN; + else if (prev && prev->tuplet() && !prev->tuplet()->elements().isEmpty() + && prev->tuplet()->elements().last() == prev && prev->durationType() == cr->durationType()) + bm = Beam::Mode::BEGIN; + prev = cr; + // if chord has hooks and is 2nd element of a cross-measure value // set beam mode to NONE (do not combine with following chord beam/hook, if any) @@ -1216,7 +1228,7 @@ void Score::layoutStage2() } if (beam) { - bool beamEnd = bm == Beam::Mode::BEGIN; + bool beamEnd = (bm == Beam::Mode::BEGIN); if (!beamEnd) { cr->removeDeleteBeam(true); beam->add(cr); diff --git a/vtest/beams-3-ref.png b/vtest/beams-3-ref.png new file mode 100644 index 0000000000000..5b6be80c33ed7 Binary files /dev/null and b/vtest/beams-3-ref.png differ diff --git a/vtest/beams-3.mscz b/vtest/beams-3.mscz new file mode 100644 index 0000000000000..7114befb1fb9c Binary files /dev/null and b/vtest/beams-3.mscz differ diff --git a/vtest/gen b/vtest/gen index b9b90ab4bdaff..c6c737b43be5e 100755 --- a/vtest/gen +++ b/vtest/gen @@ -38,7 +38,8 @@ else chord-layout-11 chord-layout-12 chord-layout-13 chord-layout-14 cross-1\ accidental-1 accidental-2 accidental-3 accidental-4 accidental-5\ accidental-6 accidental-7 accidental-8 accidental-9\ - tie-1 tie-2 tie-3 grace-1 grace-2 grace-3 harmony-1 harmony-2 harmony-3 harmony-4 beams-1 beams-2\ + tie-1 tie-2 tie-3 grace-1 grace-2 grace-3 harmony-1 harmony-2 harmony-3 harmony-4\ + beams-1 beams-2 beams-3\ user-offset-1 user-offset-2 chord-space-1 tablature-1 image-1\ lyrics-1 lyrics-2 lyrics-3 voice-1" fi diff --git a/vtest/gen.bat b/vtest/gen.bat index dabd311601ff9..3453ebedf7f13 100644 --- a/vtest/gen.bat +++ b/vtest/gen.bat @@ -19,7 +19,8 @@ set SRC=mmrest-1,bravura-mmrest,gonville-mmrest,mmrest-2,mmrest-4,mmrest-5,mmres chord-layout-11,chord-layout-12,chord-layout-13,chord-layout-14,cross-1, ^ accidental-1,accidental-2,accidental-3,accidental-4,accidental-5, ^ accidental-6,accidental-7,accidental-8,accidental-9, ^ - tie-1,tie-2,tie-3,grace-1,grace-2,grace-3,harmony-1,harmony-2,harmony-3,harmony-4,beams-1,beams-2, ^ + tie-1,tie-2,tie-3,grace-1,grace-2,grace-3,harmony-1,harmony-2,harmony-3,harmony-4, ^ + beams-1,beams-2,beams-3, ^ user-offset-1,user-offset-2,chord-space-1,tablature-1,image-1, ^ lyrics-1,lyrics-2,lyrics-3,voice-1