]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-performer.cc
Grace notes: only shorten previous note if overlapping
[lilypond.git] / lily / note-performer.cc
index ce5c822fb43140b208c4b49d2a0ab98f99faa4f7..83ecb52d561439ac4157e5982d88ef9f7f8b9dec 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1996--2011 Jan Nieuwenhuizen <janneke@gnu.org>
+  Copyright (C) 1996--2012 Jan Nieuwenhuizen <janneke@gnu.org>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -80,21 +80,28 @@ Note_performer::process_music ()
           Moment len = get_event_length (n, now_mom ());
 
           Audio_note *p = new Audio_note (*pitp, len,
-                                          tie_event, transposing.negated ());
+                                          tie_event, transposing);
           Audio_element_info info (p, n);
           announce_element (info);
           notes_.push_back (p);
 
           /*
-            shorten previous note.
+            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_)
             {
               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 ();
+                      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;
+                    }
                 }
             }
         }