From 1e45e3c5904f2eb7df2e0cbbd8d2b51b80bf282c Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 1 May 2008 18:52:39 -0300 Subject: [PATCH] Fix #455. Add a vertical slur arpeggio. Tuning / parameterizing the code is left as an excercise to the user. --- input/regression/arpeggio-parenthesis.ly | 17 +++++++++++++ lily/arpeggio.cc | 32 +++++++++++++++++++++--- lily/include/arpeggio.hh | 1 + 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 input/regression/arpeggio-parenthesis.ly diff --git a/input/regression/arpeggio-parenthesis.ly b/input/regression/arpeggio-parenthesis.ly new file mode 100644 index 0000000000..b6660153ed --- /dev/null +++ b/input/regression/arpeggio-parenthesis.ly @@ -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 + 2\arpeggio ~ c +} diff --git a/lily/arpeggio.cc b/lily/arpeggio.cc index fe7b116821..a5c070398e 100644 --- a/lily/arpeggio.cc +++ b/lily/arpeggio.cc @@ -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. diff --git a/lily/include/arpeggio.hh b/lily/include/arpeggio.hh index 7db201bb00..373045bfca 100644 --- a/lily/include/arpeggio.hh +++ b/lily/include/arpeggio.hh @@ -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)); -- 2.39.2