From: Devon Schudy <dschudy@gmail.com> Date: Fri, 29 Nov 2013 03:05:13 +0000 (-0800) Subject: Grace notes: only shorten previous note if overlapping X-Git-Tag: release/2.19.0-1~119 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=ca313ffb0f6a3fe1dd5bcacfcabe2edd7a50697e;p=lilypond.git Grace notes: only shorten previous note if overlapping Previously a grace note after a rest shortened the last note before the rest. This patch shortens the previous note to the start of the grace note rather than by the length of the grace note, so notes before rests aren't affected unless the grace notes are longer than the rest. --- diff --git a/input/regression/midi-grace-after-rest.ly b/input/regression/midi-grace-after-rest.ly new file mode 100644 index 0000000000..8a99cddcfc --- /dev/null +++ b/input/regression/midi-grace-after-rest.ly @@ -0,0 +1,14 @@ +\header { + texidoc = "Grace notes shorten previous notes only if they'd overlap +them. The A should be a full quarter note, but the C should be shortened +to 1/4 - 9/40 * 1/8 = 71/320 (rounded down to 340/384 in MIDI)." +} +\version "2.18.0" +\score { + \relative c' { + a4 r + \grace b8 c8... r64 + \grace d8 e4 + } + \midi { } +} diff --git a/lily/note-performer.cc b/lily/note-performer.cc index ddf9fe3921..83ecb52d56 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -86,8 +86,8 @@ Note_performer::process_music () notes_.push_back (p); /* - Shorten previous note. If it was part of a tie, shorten - the first note in the tie. + Grace notes shorten the previous non-grace note. If it was + part of a tie, shorten the first note in the tie. */ if (now_mom ().grace_part_) { @@ -96,7 +96,11 @@ Note_performer::process_music () for (vsize i = 0; i < last_notes_.size (); i++) { Audio_note *tie_head = last_notes_[i]->tie_head (); - tie_head->length_mom_ += Moment (0, now_mom ().grace_part_); + Moment start = tie_head->audio_column_->when (); + //Shorten the note if it would overlap. It might + //not if there's a rest in between. + if (start + tie_head->length_mom_ > now_mom ()) + tie_head->length_mom_ = now_mom () - start; } } }