Skip to content

Commit 56d2034

Browse files
committed
Set up cross measure durations earlier
1 parent 83f5577 commit 56d2034

File tree

5 files changed

+38
-8
lines changed

5 files changed

+38
-8
lines changed

src/engraving/rendering/score/beamlayout.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,6 @@ void BeamLayout::beamGraceNotes(LayoutContext& ctx, Chord* mainNote, bool after)
644644

645645
void BeamLayout::createBeams(LayoutContext& ctx, Measure* measure)
646646
{
647-
bool crossMeasure = ctx.conf().styleB(Sid::crossMeasureValues);
648-
649647
for (track_idx_t track = 0; track < ctx.dom().ntracks(); ++track) {
650648
const Staff* stf = ctx.dom().staff(track2staff(track));
651649

@@ -738,17 +736,12 @@ void BeamLayout::createBeams(LayoutContext& ctx, Measure* measure)
738736
cr->removeDeleteBeam(false);
739737
}
740738

741-
// handle grace notes and cross-measure beaming
739+
// handle grace notes
742740
// (tied chords?)
743741
if (cr->isChord()) {
744742
Chord* chord = toChord(cr);
745743
beamGraceNotes(ctx, chord, false); // grace before
746744
beamGraceNotes(ctx, chord, true); // grace after
747-
// set up for cross-measure values as soon as possible
748-
// to have all computations (stems, hooks, ...) consistent with it
749-
if (!chord->isGrace()) {
750-
ChordLayout::crossMeasureSetup(chord, crossMeasure, ctx);
751-
}
752745
}
753746

754747
if (cr->isRest() && cr->beamMode() == BeamMode::AUTO) {

src/engraving/rendering/score/measurelayout.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,7 @@ void MeasureLayout::layoutMeasure(MeasureBase* currentMB, LayoutContext& ctx)
869869
checkStaffMoveValidity(measure, ctx);
870870

871871
// ---- Modify DOM ----
872+
ModifyDom::setCrossMeasure(measure, ctx);
872873
ModifyDom::connectTremolo(measure);
873874
ModifyDom::cmdUpdateNotes(measure, ctx.dom());
874875
ModifyDom::createStems(measure, ctx);

src/engraving/rendering/score/modifydom.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,44 @@
3232
#include "dom/keysig.h"
3333
#include "dom/hook.h"
3434
#include "dom/part.h"
35+
#include "rendering/score/chordlayout.h"
3536

3637
using namespace mu::engraving::rendering::score;
3738

39+
void ModifyDom::setCrossMeasure(const Measure* measure, LayoutContext& ctx)
40+
{
41+
bool crossMeasure = ctx.conf().styleB(Sid::crossMeasureValues);
42+
const DomAccessor& dom = ctx.dom();
43+
for (staff_idx_t staffIdx = 0; staffIdx < dom.nstaves(); ++staffIdx) {
44+
const Staff* staff = dom.staff(staffIdx);
45+
if (!staff->show()) {
46+
continue;
47+
}
48+
49+
track_idx_t startTrack = staffIdx * VOICES;
50+
track_idx_t endTrack = startTrack + VOICES;
51+
52+
for (const Segment& segment : measure->segments()) {
53+
if (!segment.isJustType(SegmentType::ChordRest)) {
54+
continue;
55+
}
56+
57+
for (track_idx_t t = startTrack; t < endTrack; ++t) {
58+
ChordRest* cr = segment.cr(t);
59+
if (!cr) {
60+
continue;
61+
}
62+
if (cr->isChord()) {
63+
Chord* chord = toChord(cr);
64+
if (!chord->isGrace()) {
65+
ChordLayout::crossMeasureSetup(chord, crossMeasure, ctx);
66+
}
67+
}
68+
}
69+
}
70+
}
71+
}
72+
3873
void ModifyDom::connectTremolo(Measure* m)
3974
{
4075
m->connectTremolo();

src/engraving/rendering/score/modifydom.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class ModifyDom
3636
{
3737
public:
3838

39+
static void setCrossMeasure(const Measure* measure, LayoutContext& ctx);
3940
static void connectTremolo(Measure* m);
4041
static void cmdUpdateNotes(const Measure* measure, const DomAccessor& dom);
4142
static void createStems(const Measure* measure, LayoutContext& ctx);

vtest/scores/cross-measure-1.mscz

17.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)