summaryrefslogtreecommitdiff
path: root/lily/tie-engraver.cc
diff options
context:
space:
mode:
authorDavid Kastrup <dak@gnu.org>2014-10-18 13:53:50 +0200
committerDavid Kastrup <dak@gnu.org>2014-11-03 09:42:08 +0100
commit8e68e07fb060daf5e87ffbb51f081e720e42583c (patch)
treef89808a24a3fd12dd7e556de2fd5bfec4ba3c643 /lily/tie-engraver.cc
parent40b0982cb4f00317c3d50c7f1d4e26fde912f3cd (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.cc29
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 ());