]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix #455.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 1 May 2008 21:52:39 +0000 (18:52 -0300)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 1 May 2008 21:52:39 +0000 (18:52 -0300)
Add a vertical slur arpeggio.

Tuning / parameterizing the code is left as an excercise to the user.

input/regression/arpeggio-parenthesis.ly [new file with mode: 0644]
lily/arpeggio.cc
lily/include/arpeggio.hh

diff --git a/input/regression/arpeggio-parenthesis.ly b/input/regression/arpeggio-parenthesis.ly
new file mode 100644 (file)
index 0000000..b666015
--- /dev/null
@@ -0,0 +1,17 @@
+
+\header {
+
+  texidoc = "There is a variant of the arpeggio sign that uses a
+  `vertical slur' instead of the wiggle."
+
+}
+
+\version "2.11.46"
+
+\relative c' {
+  \override Arpeggio #'stencil = #ly:arpeggio::brew-chord-slur
+
+  % Note: does not work for cross staff arpeggios.
+  \override Arpeggio #'X-extent = #ly:grob::stencil-width
+  <c g' c>2\arpeggio ~ c
+}
index fe7b116821778f883f5b028d9a3717d50dbdf35f..a5c070398e53149b4560753a20626c7cce99665c 100644 (file)
@@ -8,15 +8,16 @@
 
 #include "arpeggio.hh"
 
+#include "bezier.hh"
+#include "font-interface.hh"
 #include "grob.hh"
+#include "lookup.hh"
 #include "output-def.hh"
-#include "stem.hh"
+#include "pointer-group-interface.hh"
 #include "staff-symbol-referencer.hh"
 #include "staff-symbol.hh"
+#include "stem.hh"
 #include "warn.hh"
-#include "font-interface.hh"
-#include "lookup.hh"
-#include "pointer-group-interface.hh"
 
 Grob *
 Arpeggio::get_common_y (Grob *me)
@@ -136,6 +137,29 @@ Arpeggio::brew_chord_bracket (SCM smob)
   return mol.smobbed_copy ();
 }
 
+MAKE_SCHEME_CALLBACK (Arpeggio, brew_chord_slur, 1);
+SCM
+Arpeggio::brew_chord_slur (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+  Interval heads = robust_scm2interval (me->get_property ("positions"),
+                                       Interval())
+    * Staff_symbol_referencer::staff_space (me);
+
+  Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
+  Real sp = 1.5 * Staff_symbol_referencer::staff_space (me);
+  Real dy = heads.length ();
+
+  Real height_limit = 1.5;
+  Real ratio = .33;
+  Bezier curve = slur_shape (dy, height_limit, ratio);
+  curve.rotate (M_PI / 2);
+
+  Stencil mol (Lookup::slur (curve, lt, lt));
+  mol.translate_axis (heads[LEFT], Y_AXIS);
+  return mol.smobbed_copy ();
+}
+
 /*
   We have to do a callback, because print () triggers a
   vertical alignment if it is cross-staff.
index 7db201bb0004f5fba9b6e7373a2125a04036d82c..373045bfca740cbf80023aad6c64a5a55e4e59f6 100644 (file)
@@ -20,6 +20,7 @@ public:
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_positions, (SCM));
   DECLARE_SCHEME_CALLBACK (brew_chord_bracket, (SCM));
+  DECLARE_SCHEME_CALLBACK (brew_chord_slur, (SCM));
   DECLARE_SCHEME_CALLBACK (width, (SCM));
   DECLARE_SCHEME_CALLBACK (height, (SCM));
   DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM));