From f9e17f32c80c9d0cbbc54fe318c7708f62a3a93d Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Wed, 21 Dec 2011 08:57:53 +0100 Subject: [PATCH] Adds Beam_collision_engraver to the Score context. Modifies the engraver to handle all cross staff collisions and gets the coordinate for collision avoidance correct in beam-quanting.cc. --- input/regression/beam-collision-cross-staff2.ly | 15 +++++++++++++++ lily/beam-collision-engraver.cc | 11 +++++++++++ lily/beam-quanting.cc | 4 +++- ly/engraver-init.ly | 2 +- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 input/regression/beam-collision-cross-staff2.ly diff --git a/input/regression/beam-collision-cross-staff2.ly b/input/regression/beam-collision-cross-staff2.ly new file mode 100644 index 0000000000..7d147de4ce --- /dev/null +++ b/input/regression/beam-collision-cross-staff2.ly @@ -0,0 +1,15 @@ +\version "2.15.22" + +\header { + texidoc = "Cross staff beams do collision avoidance. +" +} + +\new PianoStaff << + \new Staff = up \relative c' { s2 } + \new Staff \relative c' { + \clef bass \time 2/4 + g,32 [ d' \change Staff = up d' + gis a c d g ] r4 | + } +>> diff --git a/lily/beam-collision-engraver.cc b/lily/beam-collision-engraver.cc index fa82932559..8e397508b7 100644 --- a/lily/beam-collision-engraver.cc +++ b/lily/beam-collision-engraver.cc @@ -77,6 +77,14 @@ Beam_collision_engraver::finalize () { Grob *beam_grob = beams_[i].grob (); + extract_grob_set (beam_grob, "normal-stems", stems); + Interval_t vertical_span; + for (vsize j = 0; j < stems.size (); j++) + { + int vag = Grob::get_vertical_axis_group_index (stems[j]); + if (vag >= 0) + vertical_span.add_point (vag); + } Context *beam_context = beams_[i].context (); Interval_t beam_spanned_rank_ = beam_grob->spanned_rank_interval (); @@ -88,6 +96,9 @@ Beam_collision_engraver::finalize () for (vsize j = start; j < covered_grobs_.size (); j++) { Grob *covered_grob = covered_grobs_[j].grob (); + int vag = Grob::get_vertical_axis_group_index (covered_grob); + if (!vertical_span.contains (vag)) + continue; Context *covered_grob_context = covered_grobs_[j].context (); Interval_t covered_grob_spanned_rank = covered_grob->spanned_rank_interval (); diff --git a/lily/beam-quanting.cc b/lily/beam-quanting.cc index e971d6ee9d..77dfc9ae0a 100644 --- a/lily/beam-quanting.cc +++ b/lily/beam-quanting.cc @@ -283,6 +283,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y base_lengths_.push_back (y / staff_space_); stem_xpositions_.push_back (s->relative_coordinate (common[X_AXIS], X_AXIS) - x_pos[LEFT] + x_span_); stem_ypositions_.push_back (s->relative_coordinate (common[Y_AXIS], Y_AXIS) - my_y); + if (is_normal_.back ()) { if (beam_width[LEFT] == -1.0) @@ -350,6 +351,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y continue; b[X_AXIS] += (x_span_ - x_pos[LEFT]); + b[Y_AXIS] -= my_y; Real width = b[X_AXIS].length (); Real width_factor = sqrt (width / staff_space_); @@ -374,7 +376,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y Interval y; y.set_full (); y[-stem_dir] = Stem::chord_start_y (*it) + (*it)->relative_coordinate (common[Y_AXIS], Y_AXIS) - - beams[i]->relative_coordinate (common[Y_AXIS], Y_AXIS); + - my_y; Real factor = parameters_.STEM_COLLISION_FACTOR; if (!unsmob_grob (s->get_object ("beam"))) diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 093b88e9b2..d1f43f79fe 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -71,7 +71,6 @@ \consists "Ledger_line_engraver" \consists "Staff_symbol_engraver" \consists "Collision_engraver" - \consists "Beam_collision_engraver" \consists "Grob_pq_engraver" \consists "Rest_collision_engraver" \consists "Accidental_engraver" @@ -539,6 +538,7 @@ automatically when an output definition (a @code{\score} or \consists "Bar_number_engraver" \consists "Parenthesis_engraver" \consists "Concurrent_hairpin_engraver" + \consists "Beam_collision_engraver" \defaultchild "Staff" -- 2.39.2