From a32bd8c257007f81271de85862ea8bde6dd9402e Mon Sep 17 00:00:00 2001 From: Devon Schudy Date: Sat, 18 Jan 2014 23:41:28 -0500 Subject: [PATCH] More consistent performance of breath marks. (issue 3821) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 12 ++++++++---- ly/music-functions-init.ly | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lily/note-performer.cc b/lily/note-performer.cc index 771b52a9e0..59ac69ac98 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -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; } diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index 0ef5b397e1..e1f9cfd25d 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -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?) -- 2.39.5