]> git.donarmstrong.com Git - lilypond.git/commitdiff
Grace notes: only shorten previous note if overlapping
authorDevon Schudy <dschudy@gmail.com>
Fri, 29 Nov 2013 03:05:13 +0000 (19:05 -0800)
committerKeith OHara <k-ohara5a5a@oco.net>
Fri, 29 Nov 2013 19:44:50 +0000 (11:44 -0800)
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 [new file with mode: 0644]
lily/note-performer.cc

diff --git a/input/regression/midi-grace-after-rest.ly b/input/regression/midi-grace-after-rest.ly
new file mode 100644 (file)
index 0000000..8a99cdd
--- /dev/null
@@ -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 { }
+}
index ddf9fe39213e0d74910ce75a268808ad254d424c..83ecb52d561439ac4157e5982d88ef9f7f8b9dec 100644 (file)
@@ -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;
                     }
                 }
             }