]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix #670: Chained trills
authorNeil Puttock <n.puttock@gmail.com>
Sat, 11 Apr 2009 12:15:08 +0000 (13:15 +0100)
committerPatrick McCarty <pnorcks@gmail.com>
Fri, 17 Jul 2009 08:02:03 +0000 (01:02 -0700)
- if trill spanner isn't stopped using \stopTrillSpan, make next
start-span right bound.

- for trill spans on last note of final system, don't end on final
musical column, since it will extend beyond the last breakable column.
(cherry picked from commit 3b6df457322096b87cf6af599cf2c6e04989e94d)

input/regression/trill-spanner-auto-stop.ly [new file with mode: 0644]
input/regression/trill-spanner-chained.ly [new file with mode: 0644]
lily/trill-spanner-engraver.cc

diff --git a/input/regression/trill-spanner-auto-stop.ly b/input/regression/trill-spanner-auto-stop.ly
new file mode 100644 (file)
index 0000000..cda0cc2
--- /dev/null
@@ -0,0 +1,15 @@
+\version "2.13.1"
+\header {
+  texidoc = "Consecutive trill spans work without explicit
+@code{\\stopTrillSpan} commands, since successive trill spanners
+will automatically become the right bound of the previous trill.
+"
+}
+
+\paper { ragged-right = ##f }
+
+\relative c'' {
+  c1\startTrillSpan
+  c1\startTrillSpan
+  c2\stopTrillSpan r
+}
diff --git a/input/regression/trill-spanner-chained.ly b/input/regression/trill-spanner-chained.ly
new file mode 100644 (file)
index 0000000..3e756ce
--- /dev/null
@@ -0,0 +1,20 @@
+\version "2.13.1"
+\header {
+  texidoc = "Chained trills end at the next trill or barline.
+Collisions can be prevented by overriding @code{bound-details}.
+"
+}
+
+\paper { ragged-right = ##f }
+
+\relative c'' {
+  g8 f\startTrillSpan ~
+  f8 g\stopTrillSpan \startTrillSpan ~
+  g8 r\stopTrillSpan r4
+  \once \override TrillSpanner #'to-barline = ##t
+  c1\startTrillSpan ~
+  c1
+  \once \override TrillSpanner #'(bound-details right padding) = #1.2
+  c1\stopTrillSpan \startTrillSpan
+  c1\stopTrillSpan\startTrillSpan
+}
index 513a2ae6050d558709f37b180f1330fa6a73d5bf..94554b790bf1eb90648e17a217bf128f69dc2d3b 100644 (file)
@@ -49,8 +49,7 @@ Trill_spanner_engraver::Trill_spanner_engraver ()
   finished_ = 0;
   current_event_ = 0;
   span_ = 0;
-  event_drul_[START] = 0;
-  event_drul_[STOP] = 0;
+  event_drul_.set (0, 0);
 }
 
 IMPLEMENT_TRANSLATOR_LISTENER (Trill_spanner_engraver, trill_span);
@@ -64,45 +63,43 @@ Trill_spanner_engraver::listen_trill_span (Stream_event *ev)
 void
 Trill_spanner_engraver::acknowledge_note_column (Grob_info info)
 {
-  if (span_) {
-    Pointer_group_interface::add_grob (span_,
-                                      ly_symbol2scm ("note-columns"),
-                                      info.grob());
-    add_bound_item (span_, info.grob ());
-  } else if (finished_) {
-    Pointer_group_interface::add_grob (finished_, ly_symbol2scm ("note-columns"),
-                                      info.grob());
-    add_bound_item (finished_, info.grob ());
-  }
+  if (span_)
+    {
+      Pointer_group_interface::add_grob (span_,
+                                        ly_symbol2scm ("note-columns"),
+                                        info.grob());
+      if (!span_->get_bound (LEFT))
+       add_bound_item (span_, info.grob ());
+    }
+  else if (finished_)
+    {
+      Pointer_group_interface::add_grob (finished_, ly_symbol2scm ("note-columns"),
+                                        info.grob());
+      if (!finished_->get_bound (RIGHT))
+       add_bound_item (finished_, info.grob ());
+    }
 }
 
 void
 Trill_spanner_engraver::process_music ()
 {
-  if (event_drul_[STOP])
+  if (span_
+      && (event_drul_[STOP] || event_drul_[START]))
     {
-      if (!span_)
-       event_drul_[STOP]->origin ()->warning (_ ("cannot find start of trill spanner"));
-      else
-       {
-         finished_ = span_;
-         announce_end_grob (finished_, SCM_EOL);
-         span_ = 0;
-         current_event_ = 0;
-       }
+      Stream_event *ender = event_drul_[STOP];
+      if (!ender)
+       ender = event_drul_[START];
+      finished_ = span_;
+      announce_end_grob (finished_, ender->self_scm ());
+      span_ = 0;
+      current_event_ = 0;
     }
 
   if (event_drul_[START])
     {
-      if (current_event_)
-       event_drul_[START]->origin ()->warning (_ ("already have a trill spanner"));
-      else
-       {
-         current_event_ = event_drul_[START];
-         span_ = make_spanner ("TrillSpanner", event_drul_[START]->self_scm ());
-         Side_position_interface::set_axis (span_, Y_AXIS);
-         event_drul_[START] = 0;
-       }
+      current_event_ = event_drul_[START];
+      span_ = make_spanner ("TrillSpanner", event_drul_[START]->self_scm ());
+      Side_position_interface::set_axis (span_, Y_AXIS);
     }
 }
 
@@ -130,8 +127,7 @@ Trill_spanner_engraver::stop_translation_timestep ()
     }
 
   typeset_all ();
-  event_drul_[START] = 0;
-  event_drul_[STOP] = 0;
+  event_drul_.set (0, 0);
 }
 
 void
@@ -140,8 +136,8 @@ Trill_spanner_engraver::finalize ()
   typeset_all ();
   if (span_)
     {
-      finished_ = span_;
-      typeset_all ();
+      Grob *e = unsmob_grob (get_property ("currentCommandColumn"));
+      span_->set_bound (RIGHT, e);
     }
 }
 
@@ -155,7 +151,8 @@ ADD_TRANSLATOR (Trill_spanner_engraver,
                "TrillSpanner ",
 
                /* read */
-               "",
+               "currentCommandColumn "
+               "currentMusicalColumn ",
 
                /* write */
                ""