From ca313ffb0f6a3fe1dd5bcacfcabe2edd7a50697e Mon Sep 17 00:00:00 2001 From: Devon Schudy Date: Thu, 28 Nov 2013 19:05:13 -0800 Subject: [PATCH] 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. --- input/regression/midi-grace-after-rest.ly | 14 ++++++++++++++ lily/note-performer.cc | 10 +++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 input/regression/midi-grace-after-rest.ly 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; } } } -- 2.39.2