--- /dev/null
+\version "2.13.12"
+
+\header {
+ texidoc = "Cross-staff or -voice arpeggios which include single
+note heads as anchors do not collide with previous note heads or
+prefatory material."
+}
+ddddd = { d'16 d'16 d'16 d'16 d'4\arpeggio }
+sdf = { s4 <d' f'>4\arpeggio }
+\score {
+ \new PianoStaff <<
+ \new Staff {
+ \set PianoStaff.connectArpeggios = ##t
+ << \transpose c c'{ \ddddd \sdf } \\ { \sdf \ddddd } >>
+ << { a'1\arpeggio } \\ { f'2\arpeggio e' } >>
+ }
+ \new Staff {
+ R1
+ d'\arpeggio
+ }
+ >>
+ \layout {
+ line-width = 90\mm
+ }
+}
#include "stem.hh"
#include "warn.hh"
+static Stencil
+get_squiggle (Grob *me)
+{
+ Font_metric *fm = Font_interface::get_default_font (me);
+ Stencil squiggle = fm->find_by_name ("scripts.arpeggio");
+
+ return squiggle;
+}
+
Grob *
Arpeggio::get_common_y (Grob *me)
{
- my_y);
}
- heads *= 1/Staff_symbol_referencer::staff_space(me);
+ heads *= 1 / Staff_symbol_referencer::staff_space (me);
return ly_interval2scm (heads);
}
if (heads.is_empty () || heads.length () < 0.5)
{
- if (!to_boolean (me->get_property ("transparent")))
+ if (to_boolean (me->get_property ("transparent")))
+ {
+ /*
+ This is part of a cross-staff/-voice span-arpeggio,
+ so we need to ensure `heads' is large enough to encompass
+ a single trill-element since the span-arpeggio depends on
+ its children to prevent collisions.
+ */
+ heads.unite (get_squiggle (me).extent (Y_AXIS));
+ }
+ else
{
me->warning ("no heads for arpeggio found?");
me->suicide ();
+ return SCM_EOL;
}
- return SCM_EOL;
}
SCM ad = me->get_property ("arpeggio-direction");
dir = to_dir (ad);
Stencil mol;
- Font_metric *fm = Font_interface::get_default_font (me);
- Stencil squiggle = fm->find_by_name ("scripts.arpeggio");
+ Stencil squiggle (get_squiggle (me));
/*
Compensate for rounding error which may occur when a chord
Stencil arrow;
if (dir)
{
+ Font_metric *fm = Font_interface::get_default_font (me);
arrow = fm->find_by_name ("scripts.arpeggio.arrow." + to_string (dir));
heads[dir] -= dir * arrow.extent (Y_AXIS).length ();
}
Arpeggio::width (SCM smob)
{
Grob *me = unsmob_grob (smob);
- Stencil arpeggio = Font_interface::get_default_font (me)->find_by_name ("scripts.arpeggio");
-
- return ly_interval2scm (arpeggio.extent (X_AXIS));
+ return ly_interval2scm (get_squiggle (me).extent (X_AXIS));
}
MAKE_SCHEME_CALLBACK (Arpeggio, pure_height, 3);