Merge pull request #568 from AntonioBL/gracenotesbeam
Beam mode for grace notes, based on the code for normal notes.
This commit is contained in:
commit
1cced6047e
3 changed files with 59 additions and 15 deletions
|
@ -1622,7 +1622,7 @@ void Beam::layout2(QList<ChordRest*>crl, SpannerSegmentType, int frag)
|
|||
;
|
||||
else if (c1 == n - 1) // last => point to left
|
||||
len = -len;
|
||||
else {
|
||||
else if (!(cr1->isGrace())) {
|
||||
// if inside group
|
||||
// PRO: this algorithm is simple(r) and finds the right direction in
|
||||
// the great majority of cases, without attempting to 'understand'
|
||||
|
|
|
@ -67,6 +67,8 @@ static std::vector<NoteGroup> noteGroups {
|
|||
|
||||
BeamMode Groups::endBeam(ChordRest* cr)
|
||||
{
|
||||
if (cr->isGrace())
|
||||
return cr->beamMode();
|
||||
if (cr->beamMode() != BeamMode::AUTO)
|
||||
return cr->beamMode();
|
||||
Q_ASSERT(cr->staff());
|
||||
|
|
|
@ -387,22 +387,64 @@ void Score::layoutChords1(QList<Note*>& notes, int voices, Staff* staff, Segment
|
|||
|
||||
void Score::beamGraceNotes(Chord* mainNote)
|
||||
{
|
||||
// TODO: support beam mode
|
||||
bool beam = false;
|
||||
ChordRest* a1 = 0; // start of (potential) beam
|
||||
Beam* beam = 0; // current beam
|
||||
BeamMode bm = BeamMode::AUTO;
|
||||
foreach (ChordRest* cr, mainNote->graceNotes()) {
|
||||
if (cr->durationType().hooks() > 0)
|
||||
beam = true;
|
||||
cr->removeDeleteBeam();
|
||||
bm = Groups::endBeam(cr);
|
||||
if ((cr->durationType().type() <= TDuration::V_QUARTER) || (bm == BeamMode::NONE)) {
|
||||
if (beam) {
|
||||
beam->layoutGraceNotes();
|
||||
beam = 0;
|
||||
}
|
||||
if (a1) {
|
||||
a1->removeDeleteBeam();
|
||||
a1 = 0;
|
||||
}
|
||||
cr->removeDeleteBeam();
|
||||
continue;
|
||||
}
|
||||
if (beam) {
|
||||
bool beamEnd = bm == BeamMode::BEGIN;
|
||||
if (!beamEnd) {
|
||||
cr->removeDeleteBeam(true);
|
||||
beam->add(cr);
|
||||
cr = 0;
|
||||
beamEnd = (bm == BeamMode::END);
|
||||
}
|
||||
if (beamEnd) {
|
||||
beam->layoutGraceNotes();
|
||||
beam = 0;
|
||||
}
|
||||
}
|
||||
if (!cr)
|
||||
continue;
|
||||
if (a1 == 0)
|
||||
a1 = cr;
|
||||
else {
|
||||
if (!beamModeMid(bm) && (bm == BeamMode::BEGIN)) {
|
||||
a1->removeDeleteBeam();
|
||||
a1 = cr;
|
||||
}
|
||||
else {
|
||||
beam = a1->beam();
|
||||
if (beam == 0 || beam->elements().front() != a1) {
|
||||
beam = new Beam(this);
|
||||
beam->setGenerated(true);
|
||||
beam->setTrack(mainNote->track());
|
||||
a1->removeDeleteBeam(true);
|
||||
beam->add(a1);
|
||||
}
|
||||
cr->removeDeleteBeam(true);
|
||||
beam->add(cr);
|
||||
a1 = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mainNote->graceNotes().size() < 2 || !beam)
|
||||
return;
|
||||
Beam* b = new Beam(this);
|
||||
b->setTrack(mainNote->track());
|
||||
b->setGenerated(true);
|
||||
foreach (ChordRest* cr, mainNote->graceNotes())
|
||||
b->add(cr);
|
||||
|
||||
b->layoutGraceNotes();
|
||||
if (beam)
|
||||
beam->layoutGraceNotes();
|
||||
else if (a1)
|
||||
a1->removeDeleteBeam();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
|
|
Loading…
Reference in a new issue