Fix skipping of rests in pickup measures

This commit is contained in:
Matthias Neeracher 2011-09-12 16:29:14 +02:00
parent 23ced3e860
commit 0cd0effb46
3 changed files with 21 additions and 2 deletions

View File

@ -50,8 +50,10 @@ void VLLilypondWriter::VisitMeasure(size_t m, VLProperties & p, VLMeasure & meas
measNo[0] = 0;
fUseSharps = p.fKey > 0;
if (fInPickup && !m && meas.NoChords())
fInPickup = fInPickup && !m && meas.NoChords();
if (fInPickup)
++fPrevBreak;
fInPickup = fInPickup && meas.CanSkipRests();
//
// Generate chords
@ -251,7 +253,7 @@ void VLLilypondWriter::VisitNote(VLLyricsNote & n)
for (int commas = -1-octave; commas>0; --commas)
nm += ',';
fInPickup = false;
} else if (fInPickup) {
} else if (fInPickup && n.fDuration.IsPowerOfTwo()) {
nm = "s";
}
const char * space = fAccum.size() ? " " : "";

View File

@ -222,6 +222,22 @@ bool VLMeasure::NoChords() const
&& fChords.front().fPitch == VLNote::kNoPitch;
}
bool VLMeasure::CanSkipRests() const
{
VLFraction restDur(0);
VLFraction totalDur(0);
bool initialRest = true;
for (VLNoteList::const_iterator n = fMelody.begin(); n != fMelody.end(); ++n) {
if (n->fPitch != VLNote::kNoPitch)
initialRest = false;
totalDur += n->fDuration;
if (initialRest)
restDur += n->fDuration;
}
return 2*restDur >= totalDur;
}
void VLMeasure::DecomposeNotes(const VLProperties & prop, VLNoteList & decomposed) const
{
decomposed.clear();

View File

@ -341,6 +341,7 @@ struct VLMeasure {
bool IsEmpty() const;
bool NoChords() const;
bool CanSkipRests() const;
void DecomposeNotes(const VLProperties & prop, VLNoteList & decomposed) const;
};