From: Han-Wen Nienhuys Date: Wed, 31 Jan 2007 21:31:03 +0000 (+0100) Subject: add get_event_length() that takes grace timing into account. X-Git-Tag: release/2.11.15-1~3 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=82ea2eb404974976ce5d9279c8e47e1cfa8369cc;p=lilypond.git add get_event_length() that takes grace timing into account. --- diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index 481625606f..a98b05f48d 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -388,7 +388,7 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info) durlog - 2); stems_->push_back (stem); last_add_mom_ = now; - extend_mom_ = max (extend_mom_, now) + get_event_length (ev); + extend_mom_ = max (extend_mom_, now) + get_event_length (ev, now); } void diff --git a/lily/bend-engraver.cc b/lily/bend-engraver.cc index 4287084c1e..4f243dfc73 100644 --- a/lily/bend-engraver.cc +++ b/lily/bend-engraver.cc @@ -79,7 +79,8 @@ Bend_engraver::acknowledge_note_head (Grob_info info) } note_head_ = info.grob (); - stop_moment_ = now_mom () + get_event_length (info.event_cause ()); + stop_moment_ = now_mom () + get_event_length (info.event_cause (), + now_mom ()); } Bend_engraver::Bend_engraver () diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc index cb44715286..f514f7d37f 100644 --- a/lily/completion-note-heads-engraver.cc +++ b/lily/completion-note-heads-engraver.cc @@ -85,14 +85,8 @@ Completion_heads_engraver::listen_note (Stream_event *ev) note_events_.push_back (ev); is_first_ = true; - Moment musiclen = get_event_length (ev); Moment now = now_mom (); - - if (now_mom ().grace_part_) - { - musiclen.grace_part_ = musiclen.main_part_; - musiclen.main_part_ = Rational (0, 1); - } + Moment musiclen = get_event_length (ev, now); note_end_mom_ = max (note_end_mom_, (now + musiclen)); do_nothing_until_ = Rational (0, 0); diff --git a/lily/context.cc b/lily/context.cc index 7e5ea8ae2a..da83c9a98c 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -710,7 +710,7 @@ melisma_busy (Context *tr) SCM melisma_properties = tr->get_property ("melismaBusyProperties"); bool busy = false; - for (; scm_is_pair (melisma_properties); + for (; !busy && scm_is_pair (melisma_properties); melisma_properties = scm_cdr (melisma_properties)) busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties))); diff --git a/lily/drum-note-performer.cc b/lily/drum-note-performer.cc index a4187c187c..bb55ac2ef6 100644 --- a/lily/drum-note-performer.cc +++ b/lily/drum-note-performer.cc @@ -64,13 +64,7 @@ Drum_note_performer::process_music () tie_event = ev; } - Moment len = get_event_length (n); - if (now_mom ().grace_part_) - { - len.grace_part_ = len.main_part_; - len.main_part_ = Rational (0); - } - + Moment len = get_event_length (n, now_mom ()); Audio_note *p = new Audio_note (*pit, len, tie_event, Pitch (0, 0, 0)); diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc index 29185bc2c8..a73cdf6bd8 100644 --- a/lily/figured-bass-engraver.cc +++ b/lily/figured-bass-engraver.cc @@ -156,7 +156,7 @@ void Figured_bass_engraver::listen_bass_figure (Stream_event *ev) { new_event_found_ = true; - Moment stop = now_mom () + get_event_length (ev); + Moment stop = now_mom () + get_event_length (ev, now_mom ()); stop_moment_ = max (stop_moment_, stop); if (to_boolean (get_property ("useBassFigureExtenders"))) diff --git a/lily/grob-pq-engraver.cc b/lily/grob-pq-engraver.cc index 7cb4afab87..563e7218c0 100644 --- a/lily/grob-pq-engraver.cc +++ b/lily/grob-pq-engraver.cc @@ -67,17 +67,11 @@ Grob_pq_engraver::acknowledge_grob (Grob_info gi) && !gi.grob ()->internal_has_interface (ly_symbol2scm ("multi-measure-interface"))) { Moment n = now_mom (); - Moment l = get_event_length (ev); + Moment l = get_event_length (ev, n); if (!l.to_bool ()) return; - if (n.grace_part_) - { - l.grace_part_ = l.main_part_; - l.main_part_ = 0; - } - Moment end = n + l; Grob_pq_entry e; diff --git a/lily/include/translator.hh b/lily/include/translator.hh index 6145cae052..33fafaea0e 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -141,6 +141,7 @@ protected: // should be private. void add_translator (Translator *trans); Translator *get_translator (SCM s); +Moment get_event_length (Stream_event *s, Moment now); Moment get_event_length (Stream_event *s); DECLARE_UNSMOB (Translator, translator); diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index ecb0d97a62..c8ea549701 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -69,7 +69,7 @@ Multi_measure_rest_engraver::listen_multi_measure_rest (Stream_event *ev) /* FIXME: Should use ASSIGN_EVENT_ONCE. Can't do that yet because of the kill-mm-rests hack in part-combine-iterator. */ rest_ev_ = ev; - stop_moment_ = now_mom () + get_event_length (rest_ev_); + stop_moment_ = now_mom () + get_event_length (rest_ev_, now_mom ()); /* if (ASSIGN_EVENT_ONCE (rest_ev_, ev)) stop_moment_ = now_mom () + get_event_length (rest_ev_); diff --git a/lily/note-performer.cc b/lily/note-performer.cc index d6554bbdc8..776061f6c6 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -67,12 +67,7 @@ Note_performer::process_music () tie_event = ev; } - Moment len = get_event_length (n); - if (now_mom ().grace_part_) - { - len.grace_part_ = len.main_part_; - len.main_part_ = Rational (0); - } + Moment len = get_event_length (n, now_mom ()); Audio_note *p = new Audio_note (*pitp, len, tie_event, transposing.negated ()); diff --git a/lily/slash-repeat-engraver.cc b/lily/slash-repeat-engraver.cc index 7d71b677a1..f772e876fb 100644 --- a/lily/slash-repeat-engraver.cc +++ b/lily/slash-repeat-engraver.cc @@ -50,7 +50,7 @@ Slash_repeat_engraver::listen_percent (Stream_event *ev) if (get_event_length (ev) < meas_length) ASSIGN_EVENT_ONCE (slash_, ev); - + /* don't warn if nothing happens: this can happen if there are whole measure repeats. diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc index ad49a345b6..fae9a120c7 100644 --- a/lily/spacing-engraver.cc +++ b/lily/spacing-engraver.cc @@ -174,7 +174,7 @@ Spacing_engraver::add_starter_duration (Grob_info i) Stream_event *r = i.event_cause (); if (r && r->in_event_class ("rhythmic-event")) { - Moment len = get_event_length (r); + Moment len = get_event_length (r, now_); Rhythmic_tuple t (i, now_mom () + len); now_durations_.push_back (t); } @@ -211,6 +211,7 @@ Spacing_engraver::stop_translation_timestep () Stream_event *ev = playing_durations_[i].info_.event_cause (); if (ev) { + Moment now = now_mom (); Moment m = get_event_length (ev); shortest_playing = min (shortest_playing, m); } diff --git a/lily/translator.cc b/lily/translator.cc index a6b4342de9..ae1dfbe7ff 100644 --- a/lily/translator.cc +++ b/lily/translator.cc @@ -295,6 +295,7 @@ generic_get_acknowledger (SCM sym, vector const *ack_ar return 0; } + Moment get_event_length (Stream_event *e) { @@ -305,6 +306,19 @@ get_event_length (Stream_event *e) return Moment (0); } +Moment +get_event_length (Stream_event *e, Moment now) +{ + Moment len = get_event_length (e); + + if (now.grace_part_) + { + len.grace_part_ = len.main_part_; + len.main_part_ = Rational (0); + } + return len; +} + /* Helper, used through ASSIGN_EVENT_ONCE to throw warnings for simultaneous events. The helper is only useful in listen_* methods