2 arpeggio.cc -- implement Arpeggio
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2003 Jan Nieuwenhuizen <janneke@gnu.org>
10 #include "paper-def.hh"
11 #include "arpeggio.hh"
14 #include "staff-symbol-referencer.hh"
15 #include "staff-symbol.hh"
17 #include "font-interface.hh"
21 MAKE_SCHEME_CALLBACK (Arpeggio
, brew_molecule
, 1);
23 Arpeggio::brew_molecule (SCM smob
)
25 Grob
*me
= unsmob_grob (smob
);
28 for (SCM s
= me
->get_grob_property ("stems"); gh_pair_p (s
); s
= ly_cdr (s
))
30 Grob
* stem
= unsmob_grob (ly_car (s
));
31 common
= common
->common_refpoint (Staff_symbol_referencer::get_staff_symbol (stem
),
38 Using stems here is not very convenient; should store noteheads
39 instead, and also put them into the support. Now we will mess up
40 in vicinity of a collision.
44 Real my_y
= me
->relative_coordinate (common
, Y_AXIS
);
46 for (SCM s
= me
->get_grob_property ("stems"); gh_pair_p (s
); s
= ly_cdr (s
))
48 Grob
* stem
= unsmob_grob (ly_car (s
));
49 Grob
* ss
= Staff_symbol_referencer::get_staff_symbol (stem
);
50 Interval iv
=Stem::head_positions (stem
);
51 iv
*= Staff_symbol::staff_space (ss
)/2.0;
53 heads
.unite (iv
+ ss
->relative_coordinate (common
, Y_AXIS
)
59 programming_error ("Huh? Dumb blonde encountered?");
61 Nee Valerie, jij bent _niet_ dom.
66 Direction dir
= CENTER
;
67 if (ly_dir_p (me
->get_grob_property ("arpeggio-direction")))
69 dir
= to_dir (me
->get_grob_property ("arpeggio-direction"));
73 Font_metric
*fm
=Font_interface::get_default_font (me
);
74 Molecule squiggle
= fm
->find_by_name ("scripts-arpeggio");
76 Real arrow_space
= (dir
) ? Staff_symbol_referencer::staff_space (me
) : 0.0;
79 while (y
< heads
[RIGHT
] - arrow_space
)
81 mol
.add_at_edge (Y_AXIS
, UP
,squiggle
, 0.0, 0);
82 y
+= squiggle
. extent (Y_AXIS
).length ();
84 mol
.translate_axis (heads
[LEFT
], Y_AXIS
);
86 mol
.add_at_edge (Y_AXIS
, dir
,
87 fm
->find_by_name ("scripts-arpeggio-arrow-" + to_string (dir
)), 0.0, 0);
89 return mol
.smobbed_copy () ;
92 /* Draws a vertical bracket to the left of a chord
93 Chris Jackson <chris@fluffhouse.org.uk> */
95 MAKE_SCHEME_CALLBACK (Arpeggio
, brew_chord_bracket
, 1);
97 Arpeggio::brew_chord_bracket (SCM smob
)
99 Grob
*me
= unsmob_grob (smob
);
102 for (SCM s
= me
->get_grob_property ("stems"); gh_pair_p (s
); s
= ly_cdr (s
))
104 Grob
* stem
= unsmob_grob (ly_car (s
));
105 common
= common
->common_refpoint (Staff_symbol_referencer::get_staff_symbol (stem
),
110 Real my_y
= me
->relative_coordinate (common
, Y_AXIS
);
112 for (SCM s
= me
->get_grob_property ("stems"); gh_pair_p (s
); s
= ly_cdr (s
))
114 Grob
* stem
= unsmob_grob (ly_car (s
));
115 Grob
* ss
= Staff_symbol_referencer::get_staff_symbol (stem
);
116 Interval iv
= Stem::head_positions (stem
);
117 iv
*= Staff_symbol::staff_space (ss
)/2.0;
118 heads
.unite (iv
+ ss
->relative_coordinate (common
, Y_AXIS
) - my_y
);
121 Real lt
= me
->get_paper ()->get_var ("linethickness");
122 Real sp
= 1.5 * Staff_symbol_referencer::staff_space (me
);
123 Real dy
= heads
.length() + sp
;
126 Molecule l1
= Lookup::line (lt
, Offset(0, 0), Offset (0, dy
));
127 Molecule bottom
= Lookup::line (lt
, Offset(0, 0), Offset (x
, 0));
128 Molecule top
= Lookup::line (lt
, Offset(0, dy
), Offset (x
, dy
));
130 mol
.add_molecule (l1
);
131 mol
.add_molecule (bottom
);
132 mol
.add_molecule (top
);
133 mol
.translate_axis (heads
[LEFT
] - sp
/2.0, Y_AXIS
);
134 return mol
.smobbed_copy();
139 We have to do a callback, because brew_molecule () triggers a
140 vertical alignment if it is cross-staff.
141 This callback also adds padding.
143 MAKE_SCHEME_CALLBACK (Arpeggio
, width_callback
,2);
145 Arpeggio::width_callback (SCM smob
, SCM axis
)
147 Grob
* me
= unsmob_grob (smob
);
148 Axis a
= (Axis
)gh_scm2int (axis
);
149 assert (a
== X_AXIS
);
150 Molecule arpeggio
= Font_interface::get_default_font (me
)->find_by_name ("scripts-arpeggio");
152 return ly_interval2scm (arpeggio
.extent (X_AXIS
) * 1.5);
156 ADD_INTERFACE (Arpeggio
, "arpeggio-interface",
157 "Functions and settings for drawing an arpeggio symbol (a wavy line left to noteheads.",
158 "stems arpeggio-direction");