lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Let repeatTie work inside of event-chord (issue 335910043 by address@hid


From: thomasmorley65
Subject: Let repeatTie work inside of event-chord (issue 335910043 by address@hidden)
Date: Sat, 21 Oct 2017 09:24:37 -0700

Reviewers: ,

Message:
please review

Description:
Let repeatTie work inside of event-chord

The previous coding of repeat-tie-engraver.cc is replaced by the
renamed coding of the laissez-vibrer-engraver.

Please review this at https://codereview.appspot.com/335910043/

Affected files (+37, -21 lines):
  M lily/repeat-tie-engraver.cc


Index: lily/repeat-tie-engraver.cc
diff --git a/lily/repeat-tie-engraver.cc b/lily/repeat-tie-engraver.cc
index aebed3fdbab2db162214d758a497a80ab105a51e..8fbcf6958562aa68887db4c41f02494a2be4350c 100644
--- a/lily/repeat-tie-engraver.cc
+++ b/lily/repeat-tie-engraver.cc
@@ -28,13 +28,13 @@
 class Repeat_tie_engraver : public Engraver
 {
   Stream_event *event_;
-  Grob *semi_tie_column_;
-  vector<Grob *> semi_ties_;
+  Grob *rt_column_;
+  vector<Grob *> rt_ties_;

   void stop_translation_timestep ();
   void acknowledge_note_head (Grob_info);
+protected:
   void listen_repeat_tie (Stream_event *);
-
 public:
   TRANSLATOR_DECLARATIONS (Repeat_tie_engraver);
 };
@@ -43,15 +43,15 @@ Repeat_tie_engraver::Repeat_tie_engraver (Context *c)
   : Engraver (c)
 {
   event_ = 0;
-  semi_tie_column_ = 0;
+  rt_column_ = 0;
 }

 void
 Repeat_tie_engraver::stop_translation_timestep ()
 {
   event_ = 0;
-  semi_tie_column_ = 0;
-  semi_ties_.clear ();
+  rt_column_ = 0;
+  rt_ties_.clear ();
 }

 void
@@ -63,29 +63,45 @@ Repeat_tie_engraver::listen_repeat_tie (Stream_event *ev)
 void
 Repeat_tie_engraver::acknowledge_note_head (Grob_info inf)
 {
-  if (!event_)
-    return;
-
-  if (!semi_tie_column_)
+ /* use the heard event_ for all note heads, or an individual event for just
+   * a single note head (attached as an articulation inside a chord) */
+  Stream_event *tie_ev = event_;
+  Grob *head = inf.grob ();
+ Stream_event *note_ev = unsmob<Stream_event> (head->get_property ("cause"));
+  if (!tie_ev && note_ev && note_ev->in_event_class ("note-event"))
     {
-      semi_tie_column_ = make_item ("RepeatTieColumn", SCM_EOL);
+      SCM articulations = note_ev->get_property ("articulations");
+ for (SCM s = articulations; !tie_ev && scm_is_pair (s); s = scm_cdr (s))
+        {
+          Stream_event *ev = unsmob<Stream_event> (scm_car (s));
+          if (ev && ev->in_event_class ("repeat-tie-event"))
+            tie_ev = ev;
+        }
     }

-  SCM cause = event_->self_scm ();
-  Grob *semi_tie = make_item ("RepeatTie", cause);
-  semi_tie->set_object ("note-head", inf.grob ()->self_scm ());
+  if (!tie_ev)
+    return;
+
+  SCM cause = tie_ev->self_scm ();
+
+  if (!rt_column_)
+    rt_column_ = make_item ("RepeatTieColumn", cause);

- Pointer_group_interface::add_grob (semi_tie_column_, ly_symbol2scm ("ties"),
-                                     semi_tie);
-  semi_tie->set_parent (semi_tie_column_, Y_AXIS);
-  semi_ties_.push_back (semi_tie);
+  Grob *rt_tie = make_item ("RepeatTie", cause);
+  rt_tie->set_object ("note-head", head->self_scm ());
+
+  Pointer_group_interface::add_grob (rt_column_, ly_symbol2scm ("ties"),
+                                     rt_tie);

if (is_direction (unsmob<Stream_event> (cause)->get_property ("direction")))
     {
Direction d = to_dir (unsmob<Stream_event> (cause)->get_property ("direction"));
-      semi_tie->set_property ("direction", scm_from_int (d));
+      rt_tie->set_property ("direction", scm_from_int (d));
     }

+  rt_tie->set_parent (rt_column_, Y_AXIS);
+
+  rt_ties_.push_back (rt_tie);
 }

 void
@@ -97,7 +113,7 @@ Repeat_tie_engraver::boot ()

 ADD_TRANSLATOR (Repeat_tie_engraver,
                 /* doc */
-                "Create repeat ties.",
+                "Create repeat tie items.",

                 /* create */
                 "RepeatTie "
@@ -108,4 +124,4 @@ ADD_TRANSLATOR (Repeat_tie_engraver,

                 /* write */
                 ""
-               );
+               );
\ No newline at end of file





reply via email to

[Prev in Thread] Current Thread [Next in Thread]