From: Han-Wen Nienhuys Date: Sun, 16 Dec 2007 02:43:20 +0000 (-0200) Subject: Make chord tremolos obey stem direction. X-Git-Tag: release/2.11.37-1~34^2~1^2~4 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=161230bdbd28f6295b00051c38aca201e1b039c2;p=lilypond.git Make chord tremolos obey stem direction. --- diff --git a/input/regression/chord-tremolo-stem-direction.ly b/input/regression/chord-tremolo-stem-direction.ly new file mode 100644 index 0000000000..e1bcf9dcae --- /dev/null +++ b/input/regression/chord-tremolo-stem-direction.ly @@ -0,0 +1,16 @@ +\header { + + texidoc = "Stem directions influence positioning of whole note + tremolo beams." + +} + +\version "2.11.36" +\paper{ + ragged-right = ##t +} + +\relative { + \stemDown + \repeat tremolo 16 {d,32 a'32 } +} diff --git a/lily/beam-quanting.cc b/lily/beam-quanting.cc index ebda6eb256..17ad169a1f 100644 --- a/lily/beam-quanting.cc +++ b/lily/beam-quanting.cc @@ -37,8 +37,8 @@ Beam_quant_parameters::fill (Grob *him) { SCM details = him->get_property ("details"); - /* - TODO: put in define-grobs.scm + /* + TODO: The default values should be copied to define-grobs.scm. */ INTER_QUANT_PENALTY = get_detail (details, ly_symbol2scm ("inter-quant-penalty"), 1000.0); SECONDARY_BEAM_DEMERIT = get_detail (details, ly_symbol2scm ("secondary-beam-demerit"), 10.0); @@ -113,7 +113,6 @@ Beam::quanting (SCM smob, SCM posns) /* Calculations are relative to a unit-scaled staff, i.e. the quants are divided by the current staff_space. - */ Real ss = Staff_symbol_referencer::staff_space (me); Real thickness = Beam::get_thickness (me) / ss; @@ -134,7 +133,6 @@ Beam::quanting (SCM smob, SCM posns) going to REGION_SIZE == 2, yields another 0.6 second with wtk1-fugue2. - (result indexes between 70 and 575) ? --hwn. */ diff --git a/lily/beam.cc b/lily/beam.cc index f7cd01f4c9..c218fef2eb 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -167,9 +167,15 @@ Beam::calc_direction (SCM smob) Grob *stem = first_normal_stem (me); /* - ugh: stems[0] case happens for chord tremolo. + This happens for chord tremolos. */ - dir = to_dir ((stem ? stem : stems[0])->get_property ("default-direction")); + if (!stem) + stem = stems[0]; + + if (is_direction (stem->get_property_data ("direction"))) + dir = to_dir (stem->get_property_data ("direction")); + else + dir = to_dir (stem->get_property ("default-direction")); } } @@ -848,6 +854,28 @@ Beam::calc_stem_shorten (SCM smob) } +Interval +Beam::no_visible_stem_positions (Grob *me, Interval default_value) +{ + extract_grob_set (me, "stems", stems); + if (stems.empty ()) + return default_value; + + Interval head_positions; + Slice multiplicity; + for (vsize i = 0; i < stems.size(); i++) + { + head_positions.unite (Stem::head_positions (stems[i])); + multiplicity.unite (Stem::beam_multiplicity (stems[i])); + } + + Direction dir = get_grob_direction (me); + Real y = head_positions[dir] + + dir * get_beam_translation (me) * multiplicity.length () / 2; + + return Interval (y,y); +} + /* Compute a first approximation to the beam slope. @@ -863,7 +891,7 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) int count = normal_stem_count (me); Interval pos (0,0); if (count < 1) - return ly_interval2scm (pos); + return ly_interval2scm (no_visible_stem_positions (me, pos)); vector x_posns; extract_grob_set (me, "normal-stems", stems); @@ -1230,7 +1258,7 @@ Beam::set_stem_lengths (SCM smob) for normal beams, but for tremolo beams it looks silly otherwise. */ if (gap - && !Stem::is_invisible (s)) + && !Stem::is_invisible (s)) stem_y += thick * 0.5 * get_grob_direction (s); /* diff --git a/lily/include/beam.hh b/lily/include/beam.hh index fc3a722cac..3b61792aeb 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -83,6 +83,7 @@ public: static Real get_thickness (Grob *me); static void connect_beams (Grob *me); static vector get_beam_segments (Grob *me_grob, Grob **common); + static Interval no_visible_stem_positions (Grob *me, Interval default_value); DECLARE_SCHEME_CALLBACK (rest_collision_callback, (SCM element, SCM prev_off)); DECLARE_SCHEME_CALLBACK (print, (SCM));