]> git.donarmstrong.com Git - lilypond.git/commitdiff
More consistent performance of breath marks. (issue 3821)
authorDevon Schudy <dschudy@gmail.com>
Sun, 19 Jan 2014 04:41:28 +0000 (23:41 -0500)
committerJames Lowe <pkx166h@gmail.com>
Sat, 8 Feb 2014 09:55:14 +0000 (09:55 +0000)
After tied notes, breaths take time only from the last note of the tie, so
e.g. { c4 ~ c8 \breathe } performs as { c4 ~ c16 r }, not { c4 r8 }.
This is consistent with articulations, and with how humans interpret
breaths after ties. This makes it possible to align simultaneous
breaths in multiple parts with different note lengths.

Ignore grace time when calculating the length of the note before a breath —
subsequent grace notes take time from the breath, not the previous note.

lily/note-performer.cc
ly/music-functions-init.ly

index 771b52a9e0e131a2432311f5bb85f151bb553451..59ac69ac9842c895d9ceb8bd618cf0af4ffb3031 100644 (file)
@@ -142,12 +142,16 @@ Note_performer::listen_breathing (Stream_event *ev)
   if (ly_is_procedure (f))
     for (vsize i = 0; i < last_notes_.size (); i++)
       {
-        Audio_note *tie_head = last_notes_[i]->tie_head ();
-        //Give midi-length the available time since the note started,
-        //including rests. It returns how much is left for the note.
-        Moment available = now_mom () - tie_head->audio_column_->when ();
+        //Pass midi-length the available time since the last note started,
+        //including any intervening rests. It returns how much is left for the
+        //note.
+        Moment start = last_notes_[i]->audio_column_->when ();
+        Moment available = now_mom () - start;
         Moment len = robust_scm2moment (scm_call_2 (f, available.smobbed_copy (),
                                                     context ()->self_scm ()), available);
+        //Take time from the first note of the tie, since it has all the length.
+        Audio_note *tie_head = last_notes_[i]->tie_head ();
+        len += start - tie_head->audio_column_->when ();
         if (len < tie_head->length_mom_)
           tie_head->length_mom_ = len;
       }
index 0ef5b397e1da1257a84d63694b75c8a550b61562..e1f9cfd25d30798a403090cc1b1b83d627aa983a 100644 (file)
@@ -261,7 +261,7 @@ breathe =
                             (* (ly:moment-main len) 1/2)))
               (scale (inexact->exact (ceiling (/ (log desired) (log 1/2)))))
               (breath (ly:make-moment (expt 1/2 scale))))
-         (ly:moment-sub len breath)))))
+         (ly:moment-sub (ly:make-moment (ly:moment-main len)) breath)))))
 
 clef =
 #(define-music-function (parser location type) (string?)