From: Adam Spiers Date: Mon, 14 Jan 2013 00:21:45 +0000 (+0000) Subject: fix handling of grace notes to shorten preceding tied notes correctly X-Git-Tag: release/2.17.12-1~20^2 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f0fec10de9806000860febabccb9d9e66a4abf9b;p=lilypond.git fix handling of grace notes to shorten preceding tied notes correctly In Note_performer::process_music(), when a grace note was encountered, the immediately preceding Audio_note (or Audio_notes if the grace note followed a chord) was/were shortened, but it failed to check whether the Audio_note is part of a tie. Ensure that any note being shortened in this way is the head of a tie, if it is part of a tie. https://code.google.com/p/lilypond/issues/detail?id=3091 --- diff --git a/input/regression/midi-grace-after-tie.ly b/input/regression/midi-grace-after-tie.ly new file mode 100644 index 0000000000..6aca01bc1e --- /dev/null +++ b/input/regression/midi-grace-after-tie.ly @@ -0,0 +1,17 @@ +\header { + + texidoc = "Tied notes sound as one note in MIDI. Grace notes + following a tied note shorten the resulting single note in MIDI." + + % https://code.google.com/p/lilypond/issues/detail?id=3091 +} +\version "2.16.0" +\score { + \relative c' { + % This first b~ tie should be honoured in the MIDI output: + a2. b4~ + % i.e. this b8 must not be sounded: + | b8 \grace c16 d4 + } + \midi { } +} diff --git a/lily/note-performer.cc b/lily/note-performer.cc index 01086620ef..b0a81195c7 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -86,15 +86,18 @@ Note_performer::process_music () notes_.push_back (p); /* - shorten previous note. + Shorten previous note. If it was part of a tie, shorten + the first note in the tie. */ if (now_mom ().grace_part_) { if (last_start_.grace_part_ == Rational (0)) { for (vsize i = 0; i < last_notes_.size (); i++) - last_notes_[i]->length_mom_ += Moment (0, - now_mom ().grace_part_); + { + Audio_note *tie_head = last_notes_[i]->tie_head (); + tie_head->length_mom_ += Moment (0, now_mom ().grace_part_); + } } } }