diff options
author | David Kastrup <dak@gnu.org> | 2014-10-18 13:53:50 +0200 |
---|---|---|
committer | David Kastrup <dak@gnu.org> | 2014-11-03 09:42:08 +0100 |
commit | 8e68e07fb060daf5e87ffbb51f081e720e42583c (patch) | |
tree | f89808a24a3fd12dd7e556de2fd5bfec4ba3c643 /lily/tie-engraver.cc | |
parent | 40b0982cb4f00317c3d50c7f1d4e26fde912f3cd (diff) |
Issue 461: LilyPond should accept a tie between notes which are enharmonically identical
This patch connects the respective notes in Tie_engraver and
Tie_performer as a fallback after exhausting regular tie associations.
It also keeps the accidental engraver from applying its special rules
for tied notes that don't have exactly matching pitches.
No attempt is made to adjust the visuals of the ties: they will remain
horizontal, focused on the left note head.
Diffstat (limited to 'lily/tie-engraver.cc')
-rw-r--r-- | lily/tie-engraver.cc | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index 73fd6bfc91..4f72920eff 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -23,6 +23,7 @@ #include "international.hh" #include "item.hh" #include "note-head.hh" +#include "pitch.hh" #include "protected-scm.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" @@ -77,6 +78,7 @@ class Tie_engraver : public Engraver vector<Grob *> ties_; Spanner *tie_column_; + bool tie_notehead (Grob *h, bool enharmonic); protected: void process_acknowledged (); @@ -145,12 +147,11 @@ Tie_engraver::process_music () context ()->set_property ("tieMelismaBusy", SCM_BOOL_T); } -void -Tie_engraver::acknowledge_note_head (Grob_info i) +bool +Tie_engraver::tie_notehead (Grob *h, bool enharmonic) { - Grob *h = i.grob (); + bool found = false; - now_heads_.push_back (h); for (vsize i = 0; i < heads_to_tie_.size (); i++) { Grob *th = heads_to_tie_[i].head_; @@ -167,7 +168,12 @@ Tie_engraver::acknowledge_note_head (Grob_info i) Make a tie only if pitches are equal or if event end was not generated by Completion_heads_engraver. */ - if (ly_is_equal (right_ev->get_property ("pitch"), left_ev->get_property ("pitch")) + SCM p1 = left_ev->get_property ("pitch"); + SCM p2 = right_ev->get_property ("pitch"); + if ((enharmonic + ? (Pitch::is_smob (p1) && Pitch::is_smob (p2) && + Pitch::unsmob (p1)->tone_pitch () == Pitch::unsmob (p2)->tone_pitch ()) + : ly_is_equal (p1, p2)) && (!Tie_engraver::has_autosplit_end (left_ev))) { Grob *p = heads_to_tie_[i].tie_; @@ -191,6 +197,7 @@ Tie_engraver::acknowledge_note_head (Grob_info i) ties_.push_back (p); heads_to_tie_.erase (heads_to_tie_.begin () + i); + found = true; /* Prevent all other tied notes ending at the same moment (assume implicitly the notes have also started at the same moment!) @@ -205,6 +212,18 @@ Tie_engraver::acknowledge_note_head (Grob_info i) break; } } + return found; +} + +void +Tie_engraver::acknowledge_note_head (Grob_info i) +{ + Grob *h = i.grob (); + + now_heads_.push_back (h); + + if (!tie_notehead (h, false)) + tie_notehead (h, true); if (ties_.size () && ! tie_column_) tie_column_ = make_spanner ("TieColumn", ties_[0]->self_scm ()); |